From 3da7c7a83d9bb3ece0c56f930bbaaca3f9693936 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 11:47:26 +0200 Subject: [PATCH 01/49] init BE --- wien_talks_be/.gitignore | 3 + wien_talks_be/CHANGELOG.md | 3 + wien_talks_be/README.md | 2 + wien_talks_be/analysis_options.yaml | 30 ++ wien_talks_be/bin/wien_talks_be.dart | 5 + wien_talks_be/lib/wien_talks_be.dart | 3 + wien_talks_be/pubspec.lock | 397 +++++++++++++++++++++ wien_talks_be/pubspec.yaml | 15 + wien_talks_be/test/wien_talks_be_test.dart | 8 + 9 files changed, 466 insertions(+) create mode 100644 wien_talks_be/.gitignore create mode 100644 wien_talks_be/CHANGELOG.md create mode 100644 wien_talks_be/README.md create mode 100644 wien_talks_be/analysis_options.yaml create mode 100644 wien_talks_be/bin/wien_talks_be.dart create mode 100644 wien_talks_be/lib/wien_talks_be.dart create mode 100644 wien_talks_be/pubspec.lock create mode 100644 wien_talks_be/pubspec.yaml create mode 100644 wien_talks_be/test/wien_talks_be_test.dart diff --git a/wien_talks_be/.gitignore b/wien_talks_be/.gitignore new file mode 100644 index 0000000..3a85790 --- /dev/null +++ b/wien_talks_be/.gitignore @@ -0,0 +1,3 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ diff --git a/wien_talks_be/CHANGELOG.md b/wien_talks_be/CHANGELOG.md new file mode 100644 index 0000000..effe43c --- /dev/null +++ b/wien_talks_be/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial version. diff --git a/wien_talks_be/README.md b/wien_talks_be/README.md new file mode 100644 index 0000000..3816eca --- /dev/null +++ b/wien_talks_be/README.md @@ -0,0 +1,2 @@ +A sample command-line application with an entrypoint in `bin/`, library code +in `lib/`, and example unit test in `test/`. diff --git a/wien_talks_be/analysis_options.yaml b/wien_talks_be/analysis_options.yaml new file mode 100644 index 0000000..dee8927 --- /dev/null +++ b/wien_talks_be/analysis_options.yaml @@ -0,0 +1,30 @@ +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +# linter: +# rules: +# - camel_case_types + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/wien_talks_be/bin/wien_talks_be.dart b/wien_talks_be/bin/wien_talks_be.dart new file mode 100644 index 0000000..bada568 --- /dev/null +++ b/wien_talks_be/bin/wien_talks_be.dart @@ -0,0 +1,5 @@ +import 'package:wien_talks_be/wien_talks_be.dart' as wien_talks_be; + +void main(List arguments) { + print('Hello world: ${wien_talks_be.calculate()}!'); +} diff --git a/wien_talks_be/lib/wien_talks_be.dart b/wien_talks_be/lib/wien_talks_be.dart new file mode 100644 index 0000000..f64ad72 --- /dev/null +++ b/wien_talks_be/lib/wien_talks_be.dart @@ -0,0 +1,3 @@ +int calculate() { + return 6 * 7; +} diff --git a/wien_talks_be/pubspec.lock b/wien_talks_be/pubspec.lock new file mode 100644 index 0000000..690612c --- /dev/null +++ b/wien_talks_be/pubspec.lock @@ -0,0 +1,397 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: f0bb5d1648339c8308cc0b9838d8456b3cfe5c91f9dc1a735b4d003269e5da9a + url: "https://pub.dev" + source: hosted + version: "88.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "0b7b9c329d2879f8f05d6c05b32ee9ec025f39b077864bdb5ac9a7b63418a98f" + url: "https://pub.dev" + source: hosted + version: "8.1.1" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + coverage: + dependency: transitive + description: + name: coverage + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" + url: "https://pub.dev" + source: hosted + version: "1.15.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + js: + dependency: transitive + description: + name: js + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + lints: + dependency: "direct dev" + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" + source: hosted + version: "0.10.13" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test: + dependency: "direct dev" + description: + name: test + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + url: "https://pub.dev" + source: hosted + version: "1.26.3" + test_api: + dependency: transitive + description: + name: test_api + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + url: "https://pub.dev" + source: hosted + version: "0.7.7" + test_core: + dependency: transitive + description: + name: test_core + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" + url: "https://pub.dev" + source: hosted + version: "0.6.12" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" + watcher: + dependency: transitive + description: + name: watcher + sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.8.1 <4.0.0" diff --git a/wien_talks_be/pubspec.yaml b/wien_talks_be/pubspec.yaml new file mode 100644 index 0000000..60ed050 --- /dev/null +++ b/wien_talks_be/pubspec.yaml @@ -0,0 +1,15 @@ +name: wien_talks_be +description: A sample command-line application. +version: 1.0.0 +# repository: https://github.com/my_org/my_repo + +environment: + sdk: ^3.8.1 + +# Add regular dependencies here. +dependencies: + # path: ^1.8.0 + +dev_dependencies: + lints: ^5.0.0 + test: ^1.24.0 diff --git a/wien_talks_be/test/wien_talks_be_test.dart b/wien_talks_be/test/wien_talks_be_test.dart new file mode 100644 index 0000000..8db0a6f --- /dev/null +++ b/wien_talks_be/test/wien_talks_be_test.dart @@ -0,0 +1,8 @@ +import 'package:wien_talks_be/wien_talks_be.dart'; +import 'package:test/test.dart'; + +void main() { + test('calculate', () { + expect(calculate(), 42); + }); +} From 89696dcd9b1dd2397cb1cc561d6af69dc53aa893 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 11:58:34 +0200 Subject: [PATCH 02/49] reinit as serverpod project --- .../.github/workflows/deployment-aws.yml | 75 ++ .../.github/workflows/deployment-gcp.yml | 99 ++ wien_talks/README.md | 16 - wien_talks/lib/main.dart | 122 -- wien_talks/test/widget_test.dart | 30 - wien_talks/wien_talks_client/.gitignore | 13 + wien_talks/wien_talks_client/CHANGELOG.md | 3 + wien_talks/wien_talks_client/README.md | 5 + .../wien_talks_client/analysis_options.yaml | 13 + .../wien_talks_client/dartdoc_options.yaml | 5 + wien_talks/wien_talks_client/doc/endpoint.md | 15 + .../lib/src/protocol/client.dart | 71 + .../lib/src/protocol/greeting.dart | 95 ++ .../lib/src/protocol/protocol.dart | 60 + .../lib/wien_talks_client.dart | 2 + wien_talks/wien_talks_client/pubspec.yaml | 8 + .../{ => wien_talks_flutter}/.gitignore | 10 +- wien_talks/{ => wien_talks_flutter}/.metadata | 0 wien_talks/wien_talks_flutter/README.md | 15 + .../analysis_options.yaml | 4 +- .../android/.gitignore | 0 .../android/app/build.gradle.kts | 4 +- .../android/app/src/debug/AndroidManifest.xml | 0 .../android/app/src/main/AndroidManifest.xml | 2 +- .../wien_talks_flutter}/MainActivity.kt | 2 +- .../res/drawable-v21/launch_background.xml | 0 .../main/res/drawable/launch_background.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../app/src/main/res/values-night/styles.xml | 0 .../app/src/main/res/values/styles.xml | 0 .../app/src/profile/AndroidManifest.xml | 0 .../android/build.gradle.kts | 0 .../android/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../android/settings.gradle.kts | 0 .../{ => wien_talks_flutter}/ios/.gitignore | 0 .../ios/Flutter/AppFrameworkInfo.plist | 0 .../ios/Flutter/Debug.xcconfig | 0 .../ios/Flutter/Release.xcconfig | 0 .../ios/Runner.xcodeproj/project.pbxproj | 12 +- .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../ios/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../Icon-App-1024x1024@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../LaunchImage.imageset/README.md | 0 .../Runner/Base.lproj/LaunchScreen.storyboard | 0 .../ios/Runner/Base.lproj/Main.storyboard | 0 .../ios/Runner/Info.plist | 4 +- .../ios/Runner/Runner-Bridging-Header.h | 0 .../ios/RunnerTests/RunnerTests.swift | 0 wien_talks/wien_talks_flutter/lib/main.dart | 145 ++ .../{ => wien_talks_flutter}/linux/.gitignore | 0 .../linux/CMakeLists.txt | 4 +- .../linux/flutter/CMakeLists.txt | 0 .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../linux/runner/CMakeLists.txt | 0 .../linux/runner/main.cc | 0 .../linux/runner/my_application.cc | 4 +- .../linux/runner/my_application.h | 0 .../{ => wien_talks_flutter}/macos/.gitignore | 0 .../macos/Flutter/Flutter-Debug.xcconfig | 0 .../macos/Flutter/Flutter-Release.xcconfig | 0 .../Flutter/GeneratedPluginRegistrant.swift | 12 + .../macos/Runner.xcodeproj/project.pbxproj | 18 +- .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../macos/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/app_icon_1024.png | Bin .../AppIcon.appiconset/app_icon_128.png | Bin .../AppIcon.appiconset/app_icon_16.png | Bin .../AppIcon.appiconset/app_icon_256.png | Bin .../AppIcon.appiconset/app_icon_32.png | Bin .../AppIcon.appiconset/app_icon_512.png | Bin .../AppIcon.appiconset/app_icon_64.png | Bin .../macos/Runner/Base.lproj/MainMenu.xib | 0 .../macos/Runner/Configs/AppInfo.xcconfig | 4 +- .../macos/Runner/Configs/Debug.xcconfig | 0 .../macos/Runner/Configs/Release.xcconfig | 0 .../macos/Runner/Configs/Warnings.xcconfig | 0 .../macos/Runner/DebugProfile.entitlements | 2 + .../macos/Runner/Info.plist | 0 .../macos/Runner/MainFlutterWindow.swift | 0 .../macos/Runner/Release.entitlements | 2 + .../macos/RunnerTests/RunnerTests.swift | 0 wien_talks/wien_talks_flutter/pubspec.lock | 409 ++++++ .../{ => wien_talks_flutter}/pubspec.yaml | 42 +- .../wien_talks_flutter/test/widget_test.dart | 15 + .../{ => wien_talks_flutter}/web/favicon.png | Bin .../web/icons/Icon-192.png | Bin .../web/icons/Icon-512.png | Bin .../web/icons/Icon-maskable-192.png | Bin .../web/icons/Icon-maskable-512.png | Bin .../{ => wien_talks_flutter}/web/index.html | 4 +- .../web/manifest.json | 4 +- .../windows/.gitignore | 0 .../windows/CMakeLists.txt | 4 +- .../windows/flutter/CMakeLists.txt | 0 .../flutter/generated_plugin_registrant.cc | 14 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 24 + .../windows/runner/CMakeLists.txt | 0 .../windows/runner/Runner.rc | 8 +- .../windows/runner/flutter_window.cpp | 0 .../windows/runner/flutter_window.h | 0 .../windows/runner/main.cpp | 2 +- .../windows/runner/resource.h | 0 .../windows/runner/resources/app_icon.ico | Bin .../windows/runner/runner.exe.manifest | 0 .../windows/runner/utils.cpp | 0 .../windows/runner/utils.h | 0 .../windows/runner/win32_window.cpp | 0 .../windows/runner/win32_window.h | 0 wien_talks/wien_talks_server/.gcloudignore | 9 + wien_talks/wien_talks_server/.gitignore | 15 + wien_talks/wien_talks_server/CHANGELOG.md | 3 + wien_talks/wien_talks_server/Dockerfile | 39 + wien_talks/wien_talks_server/README.md | 15 + .../wien_talks_server}/analysis_options.yaml | 15 +- wien_talks/wien_talks_server/bin/main.dart | 7 + .../wien_talks_server/config/development.yaml | 58 + .../wien_talks_server/config/generator.yaml | 4 + .../wien_talks_server/config/production.yaml | 62 + .../wien_talks_server/config/staging.yaml | 66 + wien_talks/wien_talks_server/config/test.yaml | 55 + wien_talks/wien_talks_server/dart_test.yaml | 2 + .../deploy/aws/scripts/appspec.yml | 16 + .../deploy/aws/scripts/install_dependencies | 47 + .../deploy/aws/scripts/run_serverpod | 5 + .../deploy/aws/scripts/start_server | 19 + .../deploy/aws/terraform/balancers-staging.tf | 143 ++ .../deploy/aws/terraform/balancers.tf | 148 +++ .../aws/terraform/cloudfront-web-staging.tf | 65 + .../deploy/aws/terraform/cloudfront-web.tf | 73 + .../deploy/aws/terraform/code-deploy.tf | 98 ++ .../deploy/aws/terraform/config.auto.tfvars | 88 ++ .../deploy/aws/terraform/database.tf | 65 + .../deploy/aws/terraform/init-script.sh | 24 + .../deploy/aws/terraform/instances.tf | 102 ++ .../deploy/aws/terraform/main.tf | 17 + .../deploy/aws/terraform/redis.tf | 70 + .../deploy/aws/terraform/staging.tf | 57 + .../deploy/aws/terraform/storage.tf | 94 ++ .../deploy/aws/terraform/variables.tf | 198 +++ .../deploy/aws/terraform/vpc.tf | 18 + .../gcp/console_gcr/cloud-run-deploy.sh | 50 + .../gcp/terraform_gce/config.auto.tfvars | 23 + .../deploy/gcp/terraform_gce/main.tf | 95 ++ .../deploy/gcp/terraform_gce/variables.tf | 39 + .../wien_talks_server/docker-compose.yaml | 44 + wien_talks/wien_talks_server/lib/server.dart | 60 + .../lib/src/birthday_reminder.dart | 18 + .../lib/src/generated/endpoints.dart | 51 + .../lib/src/generated/greeting.dart | 105 ++ .../lib/src/generated/protocol.dart | 93 ++ .../lib/src/generated/protocol.yaml | 2 + .../lib/src/greeting.spy.yaml | 24 + .../lib/src/greeting_endpoint.dart | 34 + .../lib/src/web/routes/root.dart | 11 + .../widgets/built_with_serverpod_page.dart | 11 + .../20250816095813247/definition.json | 1153 ++++++++++++++++ .../20250816095813247/definition.sql | 257 ++++ .../20250816095813247/definition_project.json | 11 + .../20250816095813247/migration.json | 1182 +++++++++++++++++ .../20250816095813247/migration.sql | 257 ++++ .../migrations/migration_registry.txt | 7 + .../wien_talks_server}/pubspec.lock | 182 ++- wien_talks/wien_talks_server/pubspec.yaml | 16 + .../integration/greeting_endpoint_test.dart | 24 + .../test_tools/serverpod_test_tools.dart | 159 +++ .../web/static/css/style.css | 76 ++ .../web/static/images/background.svg | 25 + .../web/static/images/serverpod-logo.svg | 34 + .../web/templates/built_with_serverpod.html | 29 + wien_talks_be/.gitignore | 3 - wien_talks_be/CHANGELOG.md | 3 - wien_talks_be/README.md | 2 - wien_talks_be/bin/wien_talks_be.dart | 5 - wien_talks_be/lib/wien_talks_be.dart | 3 - wien_talks_be/pubspec.yaml | 15 - wien_talks_be/test/wien_talks_be_test.dart | 8 - 213 files changed, 6992 insertions(+), 290 deletions(-) create mode 100644 wien_talks/.github/workflows/deployment-aws.yml create mode 100644 wien_talks/.github/workflows/deployment-gcp.yml delete mode 100644 wien_talks/README.md delete mode 100644 wien_talks/lib/main.dart delete mode 100644 wien_talks/test/widget_test.dart create mode 100644 wien_talks/wien_talks_client/.gitignore create mode 100644 wien_talks/wien_talks_client/CHANGELOG.md create mode 100644 wien_talks/wien_talks_client/README.md create mode 100644 wien_talks/wien_talks_client/analysis_options.yaml create mode 100644 wien_talks/wien_talks_client/dartdoc_options.yaml create mode 100644 wien_talks/wien_talks_client/doc/endpoint.md create mode 100644 wien_talks/wien_talks_client/lib/src/protocol/client.dart create mode 100644 wien_talks/wien_talks_client/lib/src/protocol/greeting.dart create mode 100644 wien_talks/wien_talks_client/lib/src/protocol/protocol.dart create mode 100644 wien_talks/wien_talks_client/lib/wien_talks_client.dart create mode 100644 wien_talks/wien_talks_client/pubspec.yaml rename wien_talks/{ => wien_talks_flutter}/.gitignore (88%) rename wien_talks/{ => wien_talks_flutter}/.metadata (100%) create mode 100644 wien_talks/wien_talks_flutter/README.md rename wien_talks/{ => wien_talks_flutter}/analysis_options.yaml (93%) rename wien_talks/{ => wien_talks_flutter}/android/.gitignore (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/build.gradle.kts (92%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/debug/AndroidManifest.xml (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/main/AndroidManifest.xml (98%) rename wien_talks/{android/app/src/main/kotlin/com/example/wien_talks => wien_talks_flutter/android/app/src/main/kotlin/com/example/wien_talks_flutter}/MainActivity.kt (70%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/main/res/drawable-v21/launch_background.xml (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/main/res/drawable/launch_background.xml (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/main/res/values-night/styles.xml (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/main/res/values/styles.xml (100%) rename wien_talks/{ => wien_talks_flutter}/android/app/src/profile/AndroidManifest.xml (100%) rename wien_talks/{ => wien_talks_flutter}/android/build.gradle.kts (100%) rename wien_talks/{ => wien_talks_flutter}/android/gradle.properties (100%) rename wien_talks/{ => wien_talks_flutter}/android/gradle/wrapper/gradle-wrapper.properties (100%) rename wien_talks/{ => wien_talks_flutter}/android/settings.gradle.kts (100%) rename wien_talks/{ => wien_talks_flutter}/ios/.gitignore (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Flutter/AppFrameworkInfo.plist (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Flutter/Debug.xcconfig (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Flutter/Release.xcconfig (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner.xcodeproj/project.pbxproj (98%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner.xcworkspace/contents.xcworkspacedata (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/AppDelegate.swift (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Base.lproj/LaunchScreen.storyboard (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Base.lproj/Main.storyboard (100%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Info.plist (95%) rename wien_talks/{ => wien_talks_flutter}/ios/Runner/Runner-Bridging-Header.h (100%) rename wien_talks/{ => wien_talks_flutter}/ios/RunnerTests/RunnerTests.swift (100%) create mode 100644 wien_talks/wien_talks_flutter/lib/main.dart rename wien_talks/{ => wien_talks_flutter}/linux/.gitignore (100%) rename wien_talks/{ => wien_talks_flutter}/linux/CMakeLists.txt (98%) rename wien_talks/{ => wien_talks_flutter}/linux/flutter/CMakeLists.txt (100%) create mode 100644 wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc create mode 100644 wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.h create mode 100644 wien_talks/wien_talks_flutter/linux/flutter/generated_plugins.cmake rename wien_talks/{ => wien_talks_flutter}/linux/runner/CMakeLists.txt (100%) rename wien_talks/{ => wien_talks_flutter}/linux/runner/main.cc (100%) rename wien_talks/{ => wien_talks_flutter}/linux/runner/my_application.cc (97%) rename wien_talks/{ => wien_talks_flutter}/linux/runner/my_application.h (100%) rename wien_talks/{ => wien_talks_flutter}/macos/.gitignore (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Flutter/Flutter-Debug.xcconfig (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Flutter/Flutter-Release.xcconfig (100%) create mode 100644 wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift rename wien_talks/{ => wien_talks_flutter}/macos/Runner.xcodeproj/project.pbxproj (96%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (94%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner.xcworkspace/contents.xcworkspacedata (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/AppDelegate.swift (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Base.lproj/MainMenu.xib (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Configs/AppInfo.xcconfig (85%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Configs/Debug.xcconfig (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Configs/Release.xcconfig (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Configs/Warnings.xcconfig (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/DebugProfile.entitlements (86%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Info.plist (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/MainFlutterWindow.swift (100%) rename wien_talks/{ => wien_talks_flutter}/macos/Runner/Release.entitlements (81%) rename wien_talks/{ => wien_talks_flutter}/macos/RunnerTests/RunnerTests.swift (100%) create mode 100644 wien_talks/wien_talks_flutter/pubspec.lock rename wien_talks/{ => wien_talks_flutter}/pubspec.yaml (63%) create mode 100644 wien_talks/wien_talks_flutter/test/widget_test.dart rename wien_talks/{ => wien_talks_flutter}/web/favicon.png (100%) rename wien_talks/{ => wien_talks_flutter}/web/icons/Icon-192.png (100%) rename wien_talks/{ => wien_talks_flutter}/web/icons/Icon-512.png (100%) rename wien_talks/{ => wien_talks_flutter}/web/icons/Icon-maskable-192.png (100%) rename wien_talks/{ => wien_talks_flutter}/web/icons/Icon-maskable-512.png (100%) rename wien_talks/{ => wien_talks_flutter}/web/index.html (91%) rename wien_talks/{ => wien_talks_flutter}/web/manifest.json (92%) rename wien_talks/{ => wien_talks_flutter}/windows/.gitignore (100%) rename wien_talks/{ => wien_talks_flutter}/windows/CMakeLists.txt (98%) rename wien_talks/{ => wien_talks_flutter}/windows/flutter/CMakeLists.txt (100%) create mode 100644 wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc create mode 100644 wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.h create mode 100644 wien_talks/wien_talks_flutter/windows/flutter/generated_plugins.cmake rename wien_talks/{ => wien_talks_flutter}/windows/runner/CMakeLists.txt (100%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/Runner.rc (91%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/flutter_window.cpp (100%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/flutter_window.h (100%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/main.cpp (95%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/resource.h (100%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/resources/app_icon.ico (100%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/runner.exe.manifest (100%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/utils.cpp (100%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/utils.h (100%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/win32_window.cpp (100%) rename wien_talks/{ => wien_talks_flutter}/windows/runner/win32_window.h (100%) create mode 100644 wien_talks/wien_talks_server/.gcloudignore create mode 100644 wien_talks/wien_talks_server/.gitignore create mode 100644 wien_talks/wien_talks_server/CHANGELOG.md create mode 100644 wien_talks/wien_talks_server/Dockerfile create mode 100644 wien_talks/wien_talks_server/README.md rename {wien_talks_be => wien_talks/wien_talks_server}/analysis_options.yaml (84%) create mode 100644 wien_talks/wien_talks_server/bin/main.dart create mode 100644 wien_talks/wien_talks_server/config/development.yaml create mode 100644 wien_talks/wien_talks_server/config/generator.yaml create mode 100644 wien_talks/wien_talks_server/config/production.yaml create mode 100644 wien_talks/wien_talks_server/config/staging.yaml create mode 100644 wien_talks/wien_talks_server/config/test.yaml create mode 100644 wien_talks/wien_talks_server/dart_test.yaml create mode 100644 wien_talks/wien_talks_server/deploy/aws/scripts/appspec.yml create mode 100644 wien_talks/wien_talks_server/deploy/aws/scripts/install_dependencies create mode 100644 wien_talks/wien_talks_server/deploy/aws/scripts/run_serverpod create mode 100644 wien_talks/wien_talks_server/deploy/aws/scripts/start_server create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/balancers-staging.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/balancers.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web-staging.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/code-deploy.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/config.auto.tfvars create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/database.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/init-script.sh create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/instances.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/main.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/redis.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/staging.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/storage.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/variables.tf create mode 100644 wien_talks/wien_talks_server/deploy/aws/terraform/vpc.tf create mode 100644 wien_talks/wien_talks_server/deploy/gcp/console_gcr/cloud-run-deploy.sh create mode 100644 wien_talks/wien_talks_server/deploy/gcp/terraform_gce/config.auto.tfvars create mode 100644 wien_talks/wien_talks_server/deploy/gcp/terraform_gce/main.tf create mode 100644 wien_talks/wien_talks_server/deploy/gcp/terraform_gce/variables.tf create mode 100644 wien_talks/wien_talks_server/docker-compose.yaml create mode 100644 wien_talks/wien_talks_server/lib/server.dart create mode 100644 wien_talks/wien_talks_server/lib/src/birthday_reminder.dart create mode 100644 wien_talks/wien_talks_server/lib/src/generated/endpoints.dart create mode 100644 wien_talks/wien_talks_server/lib/src/generated/greeting.dart create mode 100644 wien_talks/wien_talks_server/lib/src/generated/protocol.dart create mode 100644 wien_talks/wien_talks_server/lib/src/generated/protocol.yaml create mode 100644 wien_talks/wien_talks_server/lib/src/greeting.spy.yaml create mode 100644 wien_talks/wien_talks_server/lib/src/greeting_endpoint.dart create mode 100644 wien_talks/wien_talks_server/lib/src/web/routes/root.dart create mode 100644 wien_talks/wien_talks_server/lib/src/web/widgets/built_with_serverpod_page.dart create mode 100644 wien_talks/wien_talks_server/migrations/20250816095813247/definition.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816095813247/definition.sql create mode 100644 wien_talks/wien_talks_server/migrations/20250816095813247/definition_project.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816095813247/migration.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816095813247/migration.sql create mode 100644 wien_talks/wien_talks_server/migrations/migration_registry.txt rename {wien_talks_be => wien_talks/wien_talks_server}/pubspec.lock (68%) create mode 100644 wien_talks/wien_talks_server/pubspec.yaml create mode 100644 wien_talks/wien_talks_server/test/integration/greeting_endpoint_test.dart create mode 100644 wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart create mode 100644 wien_talks/wien_talks_server/web/static/css/style.css create mode 100644 wien_talks/wien_talks_server/web/static/images/background.svg create mode 100644 wien_talks/wien_talks_server/web/static/images/serverpod-logo.svg create mode 100644 wien_talks/wien_talks_server/web/templates/built_with_serverpod.html delete mode 100644 wien_talks_be/.gitignore delete mode 100644 wien_talks_be/CHANGELOG.md delete mode 100644 wien_talks_be/README.md delete mode 100644 wien_talks_be/bin/wien_talks_be.dart delete mode 100644 wien_talks_be/lib/wien_talks_be.dart delete mode 100644 wien_talks_be/pubspec.yaml delete mode 100644 wien_talks_be/test/wien_talks_be_test.dart diff --git a/wien_talks/.github/workflows/deployment-aws.yml b/wien_talks/.github/workflows/deployment-aws.yml new file mode 100644 index 0000000..ea95cd7 --- /dev/null +++ b/wien_talks/.github/workflows/deployment-aws.yml @@ -0,0 +1,75 @@ +name: Deploy to AWS +on: + push: + branches: [ deployment-aws-production, deployment-aws-staging ] + workflow_dispatch: + inputs: + target: + description: 'Target' + required: true + default: 'production' + type: choice + options: + - 'staging' + - 'production' +jobs: + deploy: + name: Deploy to AWS + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + submodules: recursive + + - name: Setup Dart SDK + uses: dart-lang/setup-dart@v1.6.5 + with: + sdk: 3.5 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-west-2 + + - name: Create passwords file + working-directory: wien_talks_server + shell: bash + env: + SERVERPOD_PASSWORDS: ${{ secrets.SERVERPOD_PASSWORDS }} + run: | + pwd + echo "$SERVERPOD_PASSWORDS" > config/passwords.yaml + ls config/ + + - name: Get Dart packages + working-directory: wien_talks_server + run: dart pub get + + - name: Compile server + working-directory: wien_talks_server + run: dart compile kernel bin/main.dart + + - name: Create CodeDeploy Deployment + id: deploy + env: + PROJECT_NAME: wien_talks + AWS_NAME: wien-talks + DEPLOYMENT_BUCKET: wien-talks-deployment-6559518 + TARGET: ${{ github.event.inputs.target }} + run: | + # Deploy server to AWS + TARGET="${TARGET:=${GITHUB_REF##*-}}" + echo "Deploying to target: $TARGET" + mkdir -p vendor + cp "${PROJECT_NAME}_server/deploy/aws/scripts/appspec.yml" appspec.yml + zip -r deployment.zip . + aws s3 cp deployment.zip "s3://${DEPLOYMENT_BUCKET}/deployment.zip" + aws deploy create-deployment \ + --application-name "${AWS_NAME}-app" \ + --deployment-group-name "${AWS_NAME}-${TARGET}-group" \ + --deployment-config-name CodeDeployDefault.OneAtATime \ + --s3-location "bucket=${DEPLOYMENT_BUCKET},key=deployment.zip,bundleType=zip" diff --git a/wien_talks/.github/workflows/deployment-gcp.yml b/wien_talks/.github/workflows/deployment-gcp.yml new file mode 100644 index 0000000..6ceedf2 --- /dev/null +++ b/wien_talks/.github/workflows/deployment-gcp.yml @@ -0,0 +1,99 @@ +name: Deploy to GCP +on: + push: + branches: [ deployment-gcp-production, deployment-gcp-staging ] + workflow_dispatch: + inputs: + target: + description: 'Target' + required: true + default: 'production' + type: choice + options: + - 'staging' + - 'production' + +env: + # TODO: Update with your Google Cloud project id. If you have changed the + # region and zone in your Terraform configuration, you will need to change + # it here too. + PROJECT: "" + REGION: us-central1 + ZONE: us-central1-c + +jobs: + deploy: + name: Deploy to Google Cloud Run + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Setting Target Mode from Input + if: ${{ github.event.inputs.target != '' }} + run: echo "TARGET=${{ github.event.inputs.target }}" >> $GITHUB_ENV + + - name: Setting Target mode based on branch + if: ${{ github.event.inputs.target == '' }} + run: echo "TARGET=${GITHUB_REF##*-}" >> $GITHUB_ENV + + - name: Set repository + run: echo "REPOSITORY=serverpod-${{ env.TARGET }}-container" >> $GITHUB_ENV + + - name: Set Image Name + run: echo "IMAGE_NAME=serverpod" >> $GITHUB_ENV + + - name: Set Service Name + run: echo "SERVICE_NAME=$(echo $IMAGE_NAME | sed 's/[^a-zA-Z0-9]/-/g')" >> $GITHUB_ENV + + - name: Test + run: echo $SERVICE_NAME + + + - id: "auth" + name: "Authenticate to Google Cloud" + uses: "google-github-actions/auth@v1" + with: + credentials_json: "${{ secrets.GOOGLE_CREDENTIALS }}" + + - name: Create passwords file + working-directory: wien_talks_server + shell: bash + env: + SERVERPOD_PASSWORDS: ${{ secrets.SERVERPOD_PASSWORDS }} + run: | + pwd + echo "$SERVERPOD_PASSWORDS" > config/passwords.yaml + ls config/ + + - name: Configure Docker + working-directory: wien_talks_server + run: gcloud auth configure-docker ${{ env.REGION }}-docker.pkg.dev + + - name: Build the Docker image + working-directory: wien_talks_server + run: "docker build -t $IMAGE_NAME ." + + - name: Tag the Docker image + working-directory: wien_talks_server + run: docker tag $IMAGE_NAME ${{ env.REGION }}-docker.pkg.dev/${{ env.PROJECT }}/${{ env.REPOSITORY }}/$IMAGE_NAME + + - name: Push Docker image + working-directory: wien_talks_server + run: docker push ${{ env.REGION }}-docker.pkg.dev/${{ env.PROJECT }}/${{ env.REPOSITORY }}/$IMAGE_NAME + + # Uncomment the following code to automatically restart the servers in the + # instance group when you push a new version of your code. Before doing + # this, make sure that you have successfully deployed a first version. + # + # - name: Restart servers in instance group + # run: | + # gcloud compute instance-groups managed rolling-action replace serverpod-${{ env.TARGET }}-group \ + # --project=${{ env.PROJECT }} \ + # --replacement-method='substitute' \ + # --max-surge=1 \ + # --max-unavailable=1 \ + # --zone=${{ env.ZONE }} diff --git a/wien_talks/README.md b/wien_talks/README.md deleted file mode 100644 index a9ed39d..0000000 --- a/wien_talks/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# wien_talks - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/wien_talks/lib/main.dart b/wien_talks/lib/main.dart deleted file mode 100644 index 7b7f5b6..0000000 --- a/wien_talks/lib/main.dart +++ /dev/null @@ -1,122 +0,0 @@ -import 'package:flutter/material.dart'; - -void main() { - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - // This widget is the root of your application. - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text('You have pushed the button this many times:'), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. - ); - } -} diff --git a/wien_talks/test/widget_test.dart b/wien_talks/test/widget_test.dart deleted file mode 100644 index a94c8c6..0000000 --- a/wien_talks/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:wien_talks/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} diff --git a/wien_talks/wien_talks_client/.gitignore b/wien_talks/wien_talks_client/.gitignore new file mode 100644 index 0000000..a375a6b --- /dev/null +++ b/wien_talks/wien_talks_client/.gitignore @@ -0,0 +1,13 @@ +# Files and directories created by pub +.dart_tool/ +.packages + +# Omit committing pubspec.lock for library packages: +# https://dart.dev/guides/libraries/private-files#pubspeclock +pubspec.lock + +# Conventional directory for build outputs +build/ + +# Directory created by dartdoc +doc/api/ diff --git a/wien_talks/wien_talks_client/CHANGELOG.md b/wien_talks/wien_talks_client/CHANGELOG.md new file mode 100644 index 0000000..687440b --- /dev/null +++ b/wien_talks/wien_talks_client/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial version, created by Stagehand diff --git a/wien_talks/wien_talks_client/README.md b/wien_talks/wien_talks_client/README.md new file mode 100644 index 0000000..37150ed --- /dev/null +++ b/wien_talks/wien_talks_client/README.md @@ -0,0 +1,5 @@ +# wien_talks_client + +This is your Serverpod client. The code in here is mostly generated by +Serverpod, but you may want to make changes if you are adding modules to your +project. diff --git a/wien_talks/wien_talks_client/analysis_options.yaml b/wien_talks/wien_talks_client/analysis_options.yaml new file mode 100644 index 0000000..8d78563 --- /dev/null +++ b/wien_talks/wien_talks_client/analysis_options.yaml @@ -0,0 +1,13 @@ +# Defines a default set of lint rules enforced for +# projects at Google. For details and rationale, +# see https://github.com/dart-lang/pedantic#enabled-lints. + +# For lint rules and documentation, see http://dart-lang.github.io/linter/lints. +# Uncomment to specify additional rules. +# linter: +# rules: +# - camel_case_types + +analyzer: + exclude: + - lib/src/protocol/** diff --git a/wien_talks/wien_talks_client/dartdoc_options.yaml b/wien_talks/wien_talks_client/dartdoc_options.yaml new file mode 100644 index 0000000..035db99 --- /dev/null +++ b/wien_talks/wien_talks_client/dartdoc_options.yaml @@ -0,0 +1,5 @@ +dartdoc: + categories: + "Endpoint": + markdown: doc/endpoint.md + name: Endpoint \ No newline at end of file diff --git a/wien_talks/wien_talks_client/doc/endpoint.md b/wien_talks/wien_talks_client/doc/endpoint.md new file mode 100644 index 0000000..8582b12 --- /dev/null +++ b/wien_talks/wien_talks_client/doc/endpoint.md @@ -0,0 +1,15 @@ +# Callable endpoints + +Each class contains callable methods that will call a method on the server side. These are normally defined in the `endpoint` directory in your server project. This client sends requests to these endpoints and returns the result. + +Example usage: + +```dart +// How to use GreetingEndpoint. +client.greeting.hello("world!"); + +// Generic format. +client..(...); +``` + +Please see the full official documentation [here](https://docs.serverpod.dev) diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart new file mode 100644 index 0000000..7fa2180 --- /dev/null +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -0,0 +1,71 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod_client/serverpod_client.dart' as _i1; +import 'dart:async' as _i2; +import 'package:wien_talks_client/src/protocol/greeting.dart' as _i3; +import 'protocol.dart' as _i4; + +/// This is an example endpoint that returns a greeting message through +/// its [hello] method. +/// {@category Endpoint} +class EndpointGreeting extends _i1.EndpointRef { + EndpointGreeting(_i1.EndpointCaller caller) : super(caller); + + @override + String get name => 'greeting'; + + /// Returns a personalized greeting message: "Hello {name}". + _i2.Future<_i3.Greeting> hello(String name) => + caller.callServerEndpoint<_i3.Greeting>( + 'greeting', + 'hello', + {'name': name}, + ); +} + +class Client extends _i1.ServerpodClientShared { + Client( + String host, { + dynamic securityContext, + _i1.AuthenticationKeyManager? authenticationKeyManager, + Duration? streamingConnectionTimeout, + Duration? connectionTimeout, + Function( + _i1.MethodCallContext, + Object, + StackTrace, + )? onFailedCall, + Function(_i1.MethodCallContext)? onSucceededCall, + bool? disconnectStreamsOnLostInternetConnection, + }) : super( + host, + _i4.Protocol(), + securityContext: securityContext, + authenticationKeyManager: authenticationKeyManager, + streamingConnectionTimeout: streamingConnectionTimeout, + connectionTimeout: connectionTimeout, + onFailedCall: onFailedCall, + onSucceededCall: onSucceededCall, + disconnectStreamsOnLostInternetConnection: + disconnectStreamsOnLostInternetConnection, + ) { + greeting = EndpointGreeting(this); + } + + late final EndpointGreeting greeting; + + @override + Map get endpointRefLookup => {'greeting': greeting}; + + @override + Map get moduleLookup => {}; +} diff --git a/wien_talks/wien_talks_client/lib/src/protocol/greeting.dart b/wien_talks/wien_talks_client/lib/src/protocol/greeting.dart new file mode 100644 index 0000000..bb85a81 --- /dev/null +++ b/wien_talks/wien_talks_client/lib/src/protocol/greeting.dart @@ -0,0 +1,95 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod_client/serverpod_client.dart' as _i1; + +/// A greeting message which can be sent to or from the server. +abstract class Greeting implements _i1.SerializableModel { + Greeting._({ + required this.message, + required this.author, + required this.timestamp, + }); + + factory Greeting({ + required String message, + required String author, + required DateTime timestamp, + }) = _GreetingImpl; + + factory Greeting.fromJson(Map jsonSerialization) { + return Greeting( + message: jsonSerialization['message'] as String, + author: jsonSerialization['author'] as String, + timestamp: + _i1.DateTimeJsonExtension.fromJson(jsonSerialization['timestamp']), + ); + } + + /// The greeting message. + String message; + + /// The author of the greeting message. + String author; + + /// The time when the message was created. + DateTime timestamp; + + /// Returns a shallow copy of this [Greeting] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + Greeting copyWith({ + String? message, + String? author, + DateTime? timestamp, + }); + @override + Map toJson() { + return { + 'message': message, + 'author': author, + 'timestamp': timestamp.toJson(), + }; + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _GreetingImpl extends Greeting { + _GreetingImpl({ + required String message, + required String author, + required DateTime timestamp, + }) : super._( + message: message, + author: author, + timestamp: timestamp, + ); + + /// Returns a shallow copy of this [Greeting] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + Greeting copyWith({ + String? message, + String? author, + DateTime? timestamp, + }) { + return Greeting( + message: message ?? this.message, + author: author ?? this.author, + timestamp: timestamp ?? this.timestamp, + ); + } +} diff --git a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart new file mode 100644 index 0000000..92603c6 --- /dev/null +++ b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart @@ -0,0 +1,60 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod_client/serverpod_client.dart' as _i1; +import 'greeting.dart' as _i2; +export 'greeting.dart'; +export 'client.dart'; + +class Protocol extends _i1.SerializationManager { + Protocol._(); + + factory Protocol() => _instance; + + static final Protocol _instance = Protocol._(); + + @override + T deserialize( + dynamic data, [ + Type? t, + ]) { + t ??= T; + if (t == _i2.Greeting) { + return _i2.Greeting.fromJson(data) as T; + } + if (t == _i1.getType<_i2.Greeting?>()) { + return (data != null ? _i2.Greeting.fromJson(data) : null) as T; + } + return super.deserialize(data, t); + } + + @override + String? getClassNameForObject(Object? data) { + String? className = super.getClassNameForObject(data); + if (className != null) return className; + if (data is _i2.Greeting) { + return 'Greeting'; + } + return null; + } + + @override + dynamic deserializeByClassName(Map data) { + var dataClassName = data['className']; + if (dataClassName is! String) { + return super.deserializeByClassName(data); + } + if (dataClassName == 'Greeting') { + return deserialize<_i2.Greeting>(data['data']); + } + return super.deserializeByClassName(data); + } +} diff --git a/wien_talks/wien_talks_client/lib/wien_talks_client.dart b/wien_talks/wien_talks_client/lib/wien_talks_client.dart new file mode 100644 index 0000000..d81f69b --- /dev/null +++ b/wien_talks/wien_talks_client/lib/wien_talks_client.dart @@ -0,0 +1,2 @@ +export 'src/protocol/protocol.dart'; +export 'package:serverpod_client/serverpod_client.dart'; diff --git a/wien_talks/wien_talks_client/pubspec.yaml b/wien_talks/wien_talks_client/pubspec.yaml new file mode 100644 index 0000000..223e12d --- /dev/null +++ b/wien_talks/wien_talks_client/pubspec.yaml @@ -0,0 +1,8 @@ +name: wien_talks_client +description: Starting point for a Serverpod client. + +environment: + sdk: '>=3.5.0 <4.0.0' + +dependencies: + serverpod_client: 2.9.1 diff --git a/wien_talks/.gitignore b/wien_talks/wien_talks_flutter/.gitignore similarity index 88% rename from wien_talks/.gitignore rename to wien_talks/wien_talks_flutter/.gitignore index 79c113f..22546e2 100644 --- a/wien_talks/.gitignore +++ b/wien_talks/wien_talks_flutter/.gitignore @@ -5,12 +5,9 @@ *.swp .DS_Store .atom/ -.build/ .buildlog/ .history .svn/ -.swiftpm/ -migrate_working_dir/ # IntelliJ related *.iml @@ -29,11 +26,15 @@ migrate_working_dir/ .dart_tool/ .flutter-plugins .flutter-plugins-dependencies +.packages .pub-cache/ .pub/ /build/ -# Symbolication related +# Web related +lib/generated_plugin_registrant.dart + +# Symbolization related app.*.symbols # Obfuscation related @@ -43,3 +44,4 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release + diff --git a/wien_talks/.metadata b/wien_talks/wien_talks_flutter/.metadata similarity index 100% rename from wien_talks/.metadata rename to wien_talks/wien_talks_flutter/.metadata diff --git a/wien_talks/wien_talks_flutter/README.md b/wien_talks/wien_talks_flutter/README.md new file mode 100644 index 0000000..0a3aefb --- /dev/null +++ b/wien_talks/wien_talks_flutter/README.md @@ -0,0 +1,15 @@ +# wien_talks_flutter + +A new Flutter project with Serverpod. + +## Getting Started + +This project is a starting point for a Flutter application that is using +Serverpod. + +A great starting point for learning Serverpod is our documentation site at: +[https://docs.serverpod.dev](https://docs.serverpod.dev). + +To run the project, first make sure that the server is running, then do: + + flutter run diff --git a/wien_talks/analysis_options.yaml b/wien_talks/wien_talks_flutter/analysis_options.yaml similarity index 93% rename from wien_talks/analysis_options.yaml rename to wien_talks/wien_talks_flutter/analysis_options.yaml index 0d29021..fd16f92 100644 --- a/wien_talks/analysis_options.yaml +++ b/wien_talks/wien_talks_flutter/analysis_options.yaml @@ -13,7 +13,8 @@ linter: # The lint rules applied to this project can be customized in the # section below to disable rules from the `package:flutter_lints/flutter.yaml` # included above or to enable additional rules. A list of all available lints - # and their documentation is published at https://dart.dev/lints. + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. # # Instead of disabling a lint rule for the entire project in the # section below, it can also be suppressed for a single line of code @@ -23,6 +24,5 @@ linter: rules: # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options diff --git a/wien_talks/android/.gitignore b/wien_talks/wien_talks_flutter/android/.gitignore similarity index 100% rename from wien_talks/android/.gitignore rename to wien_talks/wien_talks_flutter/android/.gitignore diff --git a/wien_talks/android/app/build.gradle.kts b/wien_talks/wien_talks_flutter/android/app/build.gradle.kts similarity index 92% rename from wien_talks/android/app/build.gradle.kts rename to wien_talks/wien_talks_flutter/android/app/build.gradle.kts index 5fcf9da..c5d9579 100644 --- a/wien_talks/android/app/build.gradle.kts +++ b/wien_talks/wien_talks_flutter/android/app/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } android { - namespace = "com.example.wien_talks" + namespace = "com.example.wien_talks_flutter" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion @@ -21,7 +21,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.wien_talks" + applicationId = "com.example.wien_talks_flutter" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion diff --git a/wien_talks/android/app/src/debug/AndroidManifest.xml b/wien_talks/wien_talks_flutter/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from wien_talks/android/app/src/debug/AndroidManifest.xml rename to wien_talks/wien_talks_flutter/android/app/src/debug/AndroidManifest.xml diff --git a/wien_talks/android/app/src/main/AndroidManifest.xml b/wien_talks/wien_talks_flutter/android/app/src/main/AndroidManifest.xml similarity index 98% rename from wien_talks/android/app/src/main/AndroidManifest.xml rename to wien_talks/wien_talks_flutter/android/app/src/main/AndroidManifest.xml index d468ac2..8d61822 100644 --- a/wien_talks/android/app/src/main/AndroidManifest.xml +++ b/wien_talks/wien_talks_flutter/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Wien Talks + Wien Talks Flutter CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -13,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - wien_talks + wien_talks_flutter CFBundlePackageType APPL CFBundleShortVersionString diff --git a/wien_talks/ios/Runner/Runner-Bridging-Header.h b/wien_talks/wien_talks_flutter/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from wien_talks/ios/Runner/Runner-Bridging-Header.h rename to wien_talks/wien_talks_flutter/ios/Runner/Runner-Bridging-Header.h diff --git a/wien_talks/ios/RunnerTests/RunnerTests.swift b/wien_talks/wien_talks_flutter/ios/RunnerTests/RunnerTests.swift similarity index 100% rename from wien_talks/ios/RunnerTests/RunnerTests.swift rename to wien_talks/wien_talks_flutter/ios/RunnerTests/RunnerTests.swift diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart new file mode 100644 index 0000000..69c728d --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -0,0 +1,145 @@ +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:flutter/material.dart'; +import 'package:serverpod_flutter/serverpod_flutter.dart'; + +/// Sets up a global client object that can be used to talk to the server from +/// anywhere in our app. The client is generated from your server code +/// and is set up to connect to a Serverpod running on a local server on +/// the default port. You will need to modify this to connect to staging or +/// production servers. +/// In a larger app, you may want to use the dependency injection of your choice +/// instead of using a global client object. This is just a simple example. +late final Client client; + +late String serverUrl; + +void main() { + // When you are running the app on a physical device, you need to set the + // server URL to the IP address of your computer. You can find the IP + // address by running `ipconfig` on Windows or `ifconfig` on Mac/Linux. + // You can set the variable when running or building your app like this: + // E.g. `flutter run --dart-define=SERVER_URL=https://api.example.com/` + const serverUrlFromEnv = String.fromEnvironment('SERVER_URL'); + final serverUrl = + serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; + + client = Client(serverUrl) + ..connectivityMonitor = FlutterConnectivityMonitor(); + + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Serverpod Demo', + theme: ThemeData(primarySwatch: Colors.blue), + home: const MyHomePage(title: 'Serverpod Example'), + ); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({super.key, required this.title}); + + final String title; + + @override + MyHomePageState createState() => MyHomePageState(); +} + +class MyHomePageState extends State { + /// Holds the last result or null if no result exists yet. + String? _resultMessage; + + /// Holds the last error message that we've received from the server or null + /// if no error exists yet. + String? _errorMessage; + + final _textEditingController = TextEditingController(); + + /// Calls the `hello` method of the `greeting` endpoint. Will set either the + /// `_resultMessage` or `_errorMessage` field, depending on if the call + /// is successful. + void _callHello() async { + try { + final result = await client.greeting.hello(_textEditingController.text); + setState(() { + _errorMessage = null; + _resultMessage = result.message; + }); + } catch (e) { + setState(() { + _errorMessage = '$e'; + }); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text(widget.title)), + body: Padding( + padding: const EdgeInsets.all(16), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: TextField( + controller: _textEditingController, + decoration: const InputDecoration(hintText: 'Enter your name'), + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: ElevatedButton( + onPressed: _callHello, + child: const Text('Send to Server'), + ), + ), + ResultDisplay( + resultMessage: _resultMessage, + errorMessage: _errorMessage, + ), + ], + ), + ), + ); + } +} + +/// ResultDisplays shows the result of the call. Either the returned result +/// from the `example.greeting` endpoint method or an error message. +class ResultDisplay extends StatelessWidget { + final String? resultMessage; + final String? errorMessage; + + const ResultDisplay({super.key, this.resultMessage, this.errorMessage}); + + @override + Widget build(BuildContext context) { + String text; + Color backgroundColor; + if (errorMessage != null) { + backgroundColor = Colors.red[300]!; + text = errorMessage!; + } else if (resultMessage != null) { + backgroundColor = Colors.green[300]!; + text = resultMessage!; + } else { + backgroundColor = Colors.grey[300]!; + text = 'No server response yet.'; + } + + return ConstrainedBox( + constraints: const BoxConstraints(minHeight: 50), + child: Container( + color: backgroundColor, + child: Center(child: Text(text)), + ), + ); + } +} diff --git a/wien_talks/linux/.gitignore b/wien_talks/wien_talks_flutter/linux/.gitignore similarity index 100% rename from wien_talks/linux/.gitignore rename to wien_talks/wien_talks_flutter/linux/.gitignore diff --git a/wien_talks/linux/CMakeLists.txt b/wien_talks/wien_talks_flutter/linux/CMakeLists.txt similarity index 98% rename from wien_talks/linux/CMakeLists.txt rename to wien_talks/wien_talks_flutter/linux/CMakeLists.txt index 5783f68..e745e52 100644 --- a/wien_talks/linux/CMakeLists.txt +++ b/wien_talks/wien_talks_flutter/linux/CMakeLists.txt @@ -4,10 +4,10 @@ project(runner LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. -set(BINARY_NAME "wien_talks") +set(BINARY_NAME "wien_talks_flutter") # The unique GTK application identifier for this application. See: # https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.example.wien_talks") +set(APPLICATION_ID "com.example.wien_talks_flutter") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/wien_talks/linux/flutter/CMakeLists.txt b/wien_talks/wien_talks_flutter/linux/flutter/CMakeLists.txt similarity index 100% rename from wien_talks/linux/flutter/CMakeLists.txt rename to wien_talks/wien_talks_flutter/linux/flutter/CMakeLists.txt diff --git a/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc b/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..e71a16d --- /dev/null +++ b/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.h b/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/wien_talks/wien_talks_flutter/linux/flutter/generated_plugins.cmake b/wien_talks/wien_talks_flutter/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..2e1de87 --- /dev/null +++ b/wien_talks/wien_talks_flutter/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/wien_talks/linux/runner/CMakeLists.txt b/wien_talks/wien_talks_flutter/linux/runner/CMakeLists.txt similarity index 100% rename from wien_talks/linux/runner/CMakeLists.txt rename to wien_talks/wien_talks_flutter/linux/runner/CMakeLists.txt diff --git a/wien_talks/linux/runner/main.cc b/wien_talks/wien_talks_flutter/linux/runner/main.cc similarity index 100% rename from wien_talks/linux/runner/main.cc rename to wien_talks/wien_talks_flutter/linux/runner/main.cc diff --git a/wien_talks/linux/runner/my_application.cc b/wien_talks/wien_talks_flutter/linux/runner/my_application.cc similarity index 97% rename from wien_talks/linux/runner/my_application.cc rename to wien_talks/wien_talks_flutter/linux/runner/my_application.cc index 5f266bf..cf9f64d 100644 --- a/wien_talks/linux/runner/my_application.cc +++ b/wien_talks/wien_talks_flutter/linux/runner/my_application.cc @@ -40,11 +40,11 @@ static void my_application_activate(GApplication* application) { if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "wien_talks"); + gtk_header_bar_set_title(header_bar, "wien_talks_flutter"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { - gtk_window_set_title(window, "wien_talks"); + gtk_window_set_title(window, "wien_talks_flutter"); } gtk_window_set_default_size(window, 1280, 720); diff --git a/wien_talks/linux/runner/my_application.h b/wien_talks/wien_talks_flutter/linux/runner/my_application.h similarity index 100% rename from wien_talks/linux/runner/my_application.h rename to wien_talks/wien_talks_flutter/linux/runner/my_application.h diff --git a/wien_talks/macos/.gitignore b/wien_talks/wien_talks_flutter/macos/.gitignore similarity index 100% rename from wien_talks/macos/.gitignore rename to wien_talks/wien_talks_flutter/macos/.gitignore diff --git a/wien_talks/macos/Flutter/Flutter-Debug.xcconfig b/wien_talks/wien_talks_flutter/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from wien_talks/macos/Flutter/Flutter-Debug.xcconfig rename to wien_talks/wien_talks_flutter/macos/Flutter/Flutter-Debug.xcconfig diff --git a/wien_talks/macos/Flutter/Flutter-Release.xcconfig b/wien_talks/wien_talks_flutter/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from wien_talks/macos/Flutter/Flutter-Release.xcconfig rename to wien_talks/wien_talks_flutter/macos/Flutter/Flutter-Release.xcconfig diff --git a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..ad535f5 --- /dev/null +++ b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,12 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import connectivity_plus + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) +} diff --git a/wien_talks/macos/Runner.xcodeproj/project.pbxproj b/wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/project.pbxproj similarity index 96% rename from wien_talks/macos/Runner.xcodeproj/project.pbxproj rename to wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/project.pbxproj index 660f9ea..3ad623d 100644 --- a/wien_talks/macos/Runner.xcodeproj/project.pbxproj +++ b/wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/project.pbxproj @@ -64,7 +64,7 @@ 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* wien_talks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "wien_talks.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* wien_talks_flutter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "wien_talks_flutter.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -131,7 +131,7 @@ 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* wien_talks.app */, + 33CC10ED2044A3C60003C045 /* wien_talks_flutter.app */, 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, ); name = Products; @@ -217,7 +217,7 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* wien_talks.app */; + productReference = 33CC10ED2044A3C60003C045 /* wien_talks_flutter.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -385,10 +385,10 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.wienTalks.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.wienTalksFlutter.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/wien_talks.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/wien_talks"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/wien_talks_flutter.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/wien_talks_flutter"; }; name = Debug; }; @@ -399,10 +399,10 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.wienTalks.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.wienTalksFlutter.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/wien_talks.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/wien_talks"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/wien_talks_flutter.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/wien_talks_flutter"; }; name = Release; }; @@ -413,10 +413,10 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.wienTalks.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.wienTalksFlutter.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/wien_talks.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/wien_talks"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/wien_talks_flutter.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/wien_talks_flutter"; }; name = Profile; }; diff --git a/wien_talks/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from wien_talks/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/wien_talks/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 94% rename from wien_talks/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 944b61b..d6b3630 100644 --- a/wien_talks/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/wien_talks/wien_talks_flutter/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -15,7 +15,7 @@ @@ -31,7 +31,7 @@ @@ -66,7 +66,7 @@ @@ -83,7 +83,7 @@ diff --git a/wien_talks/macos/Runner.xcworkspace/contents.xcworkspacedata b/wien_talks/wien_talks_flutter/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from wien_talks/macos/Runner.xcworkspace/contents.xcworkspacedata rename to wien_talks/wien_talks_flutter/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/wien_talks/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/wien_talks/wien_talks_flutter/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from wien_talks/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to wien_talks/wien_talks_flutter/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/wien_talks/macos/Runner/AppDelegate.swift b/wien_talks/wien_talks_flutter/macos/Runner/AppDelegate.swift similarity index 100% rename from wien_talks/macos/Runner/AppDelegate.swift rename to wien_talks/wien_talks_flutter/macos/Runner/AppDelegate.swift diff --git a/wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from wien_talks/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to wien_talks/wien_talks_flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/wien_talks/macos/Runner/Base.lproj/MainMenu.xib b/wien_talks/wien_talks_flutter/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from wien_talks/macos/Runner/Base.lproj/MainMenu.xib rename to wien_talks/wien_talks_flutter/macos/Runner/Base.lproj/MainMenu.xib diff --git a/wien_talks/macos/Runner/Configs/AppInfo.xcconfig b/wien_talks/wien_talks_flutter/macos/Runner/Configs/AppInfo.xcconfig similarity index 85% rename from wien_talks/macos/Runner/Configs/AppInfo.xcconfig rename to wien_talks/wien_talks_flutter/macos/Runner/Configs/AppInfo.xcconfig index b757dda..8e125d2 100644 --- a/wien_talks/macos/Runner/Configs/AppInfo.xcconfig +++ b/wien_talks/wien_talks_flutter/macos/Runner/Configs/AppInfo.xcconfig @@ -5,10 +5,10 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = wien_talks +PRODUCT_NAME = wien_talks_flutter // The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.example.wienTalks +PRODUCT_BUNDLE_IDENTIFIER = com.example.wienTalksFlutter // The copyright displayed in application information PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/wien_talks/macos/Runner/Configs/Debug.xcconfig b/wien_talks/wien_talks_flutter/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from wien_talks/macos/Runner/Configs/Debug.xcconfig rename to wien_talks/wien_talks_flutter/macos/Runner/Configs/Debug.xcconfig diff --git a/wien_talks/macos/Runner/Configs/Release.xcconfig b/wien_talks/wien_talks_flutter/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from wien_talks/macos/Runner/Configs/Release.xcconfig rename to wien_talks/wien_talks_flutter/macos/Runner/Configs/Release.xcconfig diff --git a/wien_talks/macos/Runner/Configs/Warnings.xcconfig b/wien_talks/wien_talks_flutter/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from wien_talks/macos/Runner/Configs/Warnings.xcconfig rename to wien_talks/wien_talks_flutter/macos/Runner/Configs/Warnings.xcconfig diff --git a/wien_talks/macos/Runner/DebugProfile.entitlements b/wien_talks/wien_talks_flutter/macos/Runner/DebugProfile.entitlements similarity index 86% rename from wien_talks/macos/Runner/DebugProfile.entitlements rename to wien_talks/wien_talks_flutter/macos/Runner/DebugProfile.entitlements index dddb8a3..3ba6c12 100644 --- a/wien_talks/macos/Runner/DebugProfile.entitlements +++ b/wien_talks/wien_talks_flutter/macos/Runner/DebugProfile.entitlements @@ -6,6 +6,8 @@ com.apple.security.cs.allow-jit + com.apple.security.network.client + com.apple.security.network.server diff --git a/wien_talks/macos/Runner/Info.plist b/wien_talks/wien_talks_flutter/macos/Runner/Info.plist similarity index 100% rename from wien_talks/macos/Runner/Info.plist rename to wien_talks/wien_talks_flutter/macos/Runner/Info.plist diff --git a/wien_talks/macos/Runner/MainFlutterWindow.swift b/wien_talks/wien_talks_flutter/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from wien_talks/macos/Runner/MainFlutterWindow.swift rename to wien_talks/wien_talks_flutter/macos/Runner/MainFlutterWindow.swift diff --git a/wien_talks/macos/Runner/Release.entitlements b/wien_talks/wien_talks_flutter/macos/Runner/Release.entitlements similarity index 81% rename from wien_talks/macos/Runner/Release.entitlements rename to wien_talks/wien_talks_flutter/macos/Runner/Release.entitlements index 852fa1a..ee95ab7 100644 --- a/wien_talks/macos/Runner/Release.entitlements +++ b/wien_talks/wien_talks_flutter/macos/Runner/Release.entitlements @@ -4,5 +4,7 @@ com.apple.security.app-sandbox + com.apple.security.network.client + diff --git a/wien_talks/macos/RunnerTests/RunnerTests.swift b/wien_talks/wien_talks_flutter/macos/RunnerTests/RunnerTests.swift similarity index 100% rename from wien_talks/macos/RunnerTests/RunnerTests.swift rename to wien_talks/wien_talks_flutter/macos/RunnerTests/RunnerTests.swift diff --git a/wien_talks/wien_talks_flutter/pubspec.lock b/wien_talks/wien_talks_flutter/pubspec.lock new file mode 100644 index 0000000..f06f119 --- /dev/null +++ b/wien_talks/wien_talks_flutter/pubspec.lock @@ -0,0 +1,409 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + connectivity_plus: + dependency: transitive + description: + name: connectivity_plus + sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec + url: "https://pub.dev" + source: hosted + version: "6.1.5" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dbus: + dependency: transitive + description: + name: dbus + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + url: "https://pub.dev" + source: hosted + version: "0.7.11" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + http: + dependency: transitive + description: + name: http + sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 + url: "https://pub.dev" + source: hosted + version: "1.5.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + url: "https://pub.dev" + source: hosted + version: "10.0.9" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.dev" + source: hosted + version: "3.0.9" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 + url: "https://pub.dev" + source: hosted + version: "6.0.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + nm: + dependency: transitive + description: + name: nm + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + serverpod_client: + dependency: transitive + description: + name: serverpod_client + sha256: "04cb6d36730c8c24c067cde6e41551ad2dd7ae3725bbaa2756e82d2f5b345f54" + url: "https://pub.dev" + source: hosted + version: "2.9.1" + serverpod_flutter: + dependency: "direct main" + description: + name: serverpod_flutter + sha256: "1d9c2cb511581a7fdc1fc81ac5475ef75c0cf0a1c9181308e956db4818759bb7" + url: "https://pub.dev" + source: hosted + version: "2.9.1" + serverpod_serialization: + dependency: transitive + description: + name: serverpod_serialization + sha256: c301a5e45610c062e51e1ba580f51f3257c3404ce2dd2f7e216dccbd93869502 + url: "https://pub.dev" + source: hosted + version: "2.9.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" + source: hosted + version: "0.7.4" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.dev" + source: hosted + version: "15.0.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + wien_talks_client: + dependency: "direct main" + description: + path: "../wien_talks_client" + relative: true + source: path + version: "0.0.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.8.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/wien_talks/pubspec.yaml b/wien_talks/wien_talks_flutter/pubspec.yaml similarity index 63% rename from wien_talks/pubspec.yaml rename to wien_talks/wien_talks_flutter/pubspec.yaml index 63ea52d..3f0110a 100644 --- a/wien_talks/pubspec.yaml +++ b/wien_talks/wien_talks_flutter/pubspec.yaml @@ -1,7 +1,8 @@ -name: wien_talks -description: "A new Flutter project." +name: wien_talks_flutter +description: A new Flutter project with Serverpod. + # The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. +# pub.dev using `pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev # The following defines the version and build number for your application. @@ -11,45 +12,36 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # build by specifying --build-name and --build-number, respectively. # In Android, build-name is used as versionName while build-number used as versionCode. # Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. version: 1.0.0+1 environment: - sdk: ^3.8.1 + sdk: '>=3.5.0 <4.0.0' + flutter: '>=3.24.0' -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter + serverpod_flutter: 2.9.1 + wien_talks_client: + path: ../wien_talks_client + # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.5 dev_dependencies: + flutter_lints: '>=3.0.0 <7.0.0' flutter_test: sdk: flutter - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. - flutter_lints: ^5.0.0 - # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec -# The following section is specific to Flutter packages. +# The following section is specific to Flutter. flutter: # The following line ensures that the Material Icons font is @@ -63,10 +55,10 @@ flutter: # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/to/resolution-aware-images + # https://flutter.dev/assets-and-images/#resolution-aware. # For details regarding adding assets from package dependencies, see - # https://flutter.dev/to/asset-from-package + # https://flutter.dev/assets-and-images/#from-packages # To add custom fonts to your application, add a fonts section here, # in this "flutter" section. Each entry in this list should have a @@ -86,4 +78,4 @@ flutter: # weight: 700 # # For details regarding fonts from package dependencies, - # see https://flutter.dev/to/font-from-package + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/wien_talks/wien_talks_flutter/test/widget_test.dart b/wien_talks/wien_talks_flutter/test/widget_test.dart new file mode 100644 index 0000000..ac1458c --- /dev/null +++ b/wien_talks/wien_talks_flutter/test/widget_test.dart @@ -0,0 +1,15 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +// import 'package:flutter/material.dart'; +// import 'package:flutter_test/flutter_test.dart'; +// +// import 'package:PROJECTNAME_flutter/main.dart'; + +void main() { + // Add your app tests here +} diff --git a/wien_talks/web/favicon.png b/wien_talks/wien_talks_flutter/web/favicon.png similarity index 100% rename from wien_talks/web/favicon.png rename to wien_talks/wien_talks_flutter/web/favicon.png diff --git a/wien_talks/web/icons/Icon-192.png b/wien_talks/wien_talks_flutter/web/icons/Icon-192.png similarity index 100% rename from wien_talks/web/icons/Icon-192.png rename to wien_talks/wien_talks_flutter/web/icons/Icon-192.png diff --git a/wien_talks/web/icons/Icon-512.png b/wien_talks/wien_talks_flutter/web/icons/Icon-512.png similarity index 100% rename from wien_talks/web/icons/Icon-512.png rename to wien_talks/wien_talks_flutter/web/icons/Icon-512.png diff --git a/wien_talks/web/icons/Icon-maskable-192.png b/wien_talks/wien_talks_flutter/web/icons/Icon-maskable-192.png similarity index 100% rename from wien_talks/web/icons/Icon-maskable-192.png rename to wien_talks/wien_talks_flutter/web/icons/Icon-maskable-192.png diff --git a/wien_talks/web/icons/Icon-maskable-512.png b/wien_talks/wien_talks_flutter/web/icons/Icon-maskable-512.png similarity index 100% rename from wien_talks/web/icons/Icon-maskable-512.png rename to wien_talks/wien_talks_flutter/web/icons/Icon-maskable-512.png diff --git a/wien_talks/web/index.html b/wien_talks/wien_talks_flutter/web/index.html similarity index 91% rename from wien_talks/web/index.html rename to wien_talks/wien_talks_flutter/web/index.html index ade8429..29b4e1a 100644 --- a/wien_talks/web/index.html +++ b/wien_talks/wien_talks_flutter/web/index.html @@ -23,13 +23,13 @@ - + - wien_talks + wien_talks_flutter diff --git a/wien_talks/web/manifest.json b/wien_talks/wien_talks_flutter/web/manifest.json similarity index 92% rename from wien_talks/web/manifest.json rename to wien_talks/wien_talks_flutter/web/manifest.json index b8b6ffb..66c2000 100644 --- a/wien_talks/web/manifest.json +++ b/wien_talks/wien_talks_flutter/web/manifest.json @@ -1,6 +1,6 @@ { - "name": "wien_talks", - "short_name": "wien_talks", + "name": "wien_talks_flutter", + "short_name": "wien_talks_flutter", "start_url": ".", "display": "standalone", "background_color": "#0175C2", diff --git a/wien_talks/windows/.gitignore b/wien_talks/wien_talks_flutter/windows/.gitignore similarity index 100% rename from wien_talks/windows/.gitignore rename to wien_talks/wien_talks_flutter/windows/.gitignore diff --git a/wien_talks/windows/CMakeLists.txt b/wien_talks/wien_talks_flutter/windows/CMakeLists.txt similarity index 98% rename from wien_talks/windows/CMakeLists.txt rename to wien_talks/wien_talks_flutter/windows/CMakeLists.txt index 77c88ba..78f6d56 100644 --- a/wien_talks/windows/CMakeLists.txt +++ b/wien_talks/wien_talks_flutter/windows/CMakeLists.txt @@ -1,10 +1,10 @@ # Project-level configuration. cmake_minimum_required(VERSION 3.14) -project(wien_talks LANGUAGES CXX) +project(wien_talks_flutter LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. -set(BINARY_NAME "wien_talks") +set(BINARY_NAME "wien_talks_flutter") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/wien_talks/windows/flutter/CMakeLists.txt b/wien_talks/wien_talks_flutter/windows/flutter/CMakeLists.txt similarity index 100% rename from wien_talks/windows/flutter/CMakeLists.txt rename to wien_talks/wien_talks_flutter/windows/flutter/CMakeLists.txt diff --git a/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc b/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..8777c93 --- /dev/null +++ b/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + ConnectivityPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); +} diff --git a/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.h b/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/wien_talks/wien_talks_flutter/windows/flutter/generated_plugins.cmake b/wien_talks/wien_talks_flutter/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..cc1361d --- /dev/null +++ b/wien_talks/wien_talks_flutter/windows/flutter/generated_plugins.cmake @@ -0,0 +1,24 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + connectivity_plus +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/wien_talks/windows/runner/CMakeLists.txt b/wien_talks/wien_talks_flutter/windows/runner/CMakeLists.txt similarity index 100% rename from wien_talks/windows/runner/CMakeLists.txt rename to wien_talks/wien_talks_flutter/windows/runner/CMakeLists.txt diff --git a/wien_talks/windows/runner/Runner.rc b/wien_talks/wien_talks_flutter/windows/runner/Runner.rc similarity index 91% rename from wien_talks/windows/runner/Runner.rc rename to wien_talks/wien_talks_flutter/windows/runner/Runner.rc index e2a0e65..059c599 100644 --- a/wien_talks/windows/runner/Runner.rc +++ b/wien_talks/wien_talks_flutter/windows/runner/Runner.rc @@ -90,12 +90,12 @@ BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "com.example" "\0" - VALUE "FileDescription", "wien_talks" "\0" + VALUE "FileDescription", "wien_talks_flutter" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "wien_talks" "\0" + VALUE "InternalName", "wien_talks_flutter" "\0" VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" - VALUE "OriginalFilename", "wien_talks.exe" "\0" - VALUE "ProductName", "wien_talks" "\0" + VALUE "OriginalFilename", "wien_talks_flutter.exe" "\0" + VALUE "ProductName", "wien_talks_flutter" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END diff --git a/wien_talks/windows/runner/flutter_window.cpp b/wien_talks/wien_talks_flutter/windows/runner/flutter_window.cpp similarity index 100% rename from wien_talks/windows/runner/flutter_window.cpp rename to wien_talks/wien_talks_flutter/windows/runner/flutter_window.cpp diff --git a/wien_talks/windows/runner/flutter_window.h b/wien_talks/wien_talks_flutter/windows/runner/flutter_window.h similarity index 100% rename from wien_talks/windows/runner/flutter_window.h rename to wien_talks/wien_talks_flutter/windows/runner/flutter_window.h diff --git a/wien_talks/windows/runner/main.cpp b/wien_talks/wien_talks_flutter/windows/runner/main.cpp similarity index 95% rename from wien_talks/windows/runner/main.cpp rename to wien_talks/wien_talks_flutter/windows/runner/main.cpp index 61843e4..04a2d6a 100644 --- a/wien_talks/windows/runner/main.cpp +++ b/wien_talks/wien_talks_flutter/windows/runner/main.cpp @@ -27,7 +27,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); - if (!window.Create(L"wien_talks", origin, size)) { + if (!window.Create(L"wien_talks_flutter", origin, size)) { return EXIT_FAILURE; } window.SetQuitOnClose(true); diff --git a/wien_talks/windows/runner/resource.h b/wien_talks/wien_talks_flutter/windows/runner/resource.h similarity index 100% rename from wien_talks/windows/runner/resource.h rename to wien_talks/wien_talks_flutter/windows/runner/resource.h diff --git a/wien_talks/windows/runner/resources/app_icon.ico b/wien_talks/wien_talks_flutter/windows/runner/resources/app_icon.ico similarity index 100% rename from wien_talks/windows/runner/resources/app_icon.ico rename to wien_talks/wien_talks_flutter/windows/runner/resources/app_icon.ico diff --git a/wien_talks/windows/runner/runner.exe.manifest b/wien_talks/wien_talks_flutter/windows/runner/runner.exe.manifest similarity index 100% rename from wien_talks/windows/runner/runner.exe.manifest rename to wien_talks/wien_talks_flutter/windows/runner/runner.exe.manifest diff --git a/wien_talks/windows/runner/utils.cpp b/wien_talks/wien_talks_flutter/windows/runner/utils.cpp similarity index 100% rename from wien_talks/windows/runner/utils.cpp rename to wien_talks/wien_talks_flutter/windows/runner/utils.cpp diff --git a/wien_talks/windows/runner/utils.h b/wien_talks/wien_talks_flutter/windows/runner/utils.h similarity index 100% rename from wien_talks/windows/runner/utils.h rename to wien_talks/wien_talks_flutter/windows/runner/utils.h diff --git a/wien_talks/windows/runner/win32_window.cpp b/wien_talks/wien_talks_flutter/windows/runner/win32_window.cpp similarity index 100% rename from wien_talks/windows/runner/win32_window.cpp rename to wien_talks/wien_talks_flutter/windows/runner/win32_window.cpp diff --git a/wien_talks/windows/runner/win32_window.h b/wien_talks/wien_talks_flutter/windows/runner/win32_window.h similarity index 100% rename from wien_talks/windows/runner/win32_window.h rename to wien_talks/wien_talks_flutter/windows/runner/win32_window.h diff --git a/wien_talks/wien_talks_server/.gcloudignore b/wien_talks/wien_talks_server/.gcloudignore new file mode 100644 index 0000000..3d64647 --- /dev/null +++ b/wien_talks/wien_talks_server/.gcloudignore @@ -0,0 +1,9 @@ +# Files and directories created by pub +.dart_tool/ +.packages + +# Conventional directory for build outputs +build/ + +# Directory created by dartdoc +doc/api/ diff --git a/wien_talks/wien_talks_server/.gitignore b/wien_talks/wien_talks_server/.gitignore new file mode 100644 index 0000000..e36bb12 --- /dev/null +++ b/wien_talks/wien_talks_server/.gitignore @@ -0,0 +1,15 @@ +# Files and directories created by pub +.dart_tool/ +.packages + +# Conventional directory for build outputs +build/ + +# Directory created by dartdoc +doc/api/ + +# Passwords file +config/passwords.yaml + +# Firebase service account key for Firebase auth +config/firebase_service_account_key.json diff --git a/wien_talks/wien_talks_server/CHANGELOG.md b/wien_talks/wien_talks_server/CHANGELOG.md new file mode 100644 index 0000000..687440b --- /dev/null +++ b/wien_talks/wien_talks_server/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial version, created by Stagehand diff --git a/wien_talks/wien_talks_server/Dockerfile b/wien_talks/wien_talks_server/Dockerfile new file mode 100644 index 0000000..1496f72 --- /dev/null +++ b/wien_talks/wien_talks_server/Dockerfile @@ -0,0 +1,39 @@ +# Build stage +FROM dart:3.5.0 AS build +WORKDIR /app +COPY . . + +# Install dependencies and compile the server executable +RUN dart pub get +RUN dart compile exe bin/main.dart -o bin/server + +# Final stage +FROM alpine:latest + +# Environment variables +ENV runmode=production +ENV serverid=default +ENV logging=normal +ENV role=monolith + +# Copy runtime dependencies +COPY --from=build /runtime/ / + +# Copy compiled server executable +COPY --from=build /app/bin/server server + +# Copy configuration files and resources +COPY --from=build /app/config/ config/ +COPY --from=build /app/web/ web/ +COPY --from=build /app/migrations/ migrations/ + +# This file is required to enable the endpoint log filter in Insights. +COPY --from=build /app/lib/src/generated/protocol.yaml lib/src/generated/protocol.yaml + +# Expose ports +EXPOSE 8080 +EXPOSE 8081 +EXPOSE 8082 + +# Define the entrypoint command +ENTRYPOINT ./server --mode=$runmode --server-id=$serverid --logging=$logging --role=$role diff --git a/wien_talks/wien_talks_server/README.md b/wien_talks/wien_talks_server/README.md new file mode 100644 index 0000000..f730d7e --- /dev/null +++ b/wien_talks/wien_talks_server/README.md @@ -0,0 +1,15 @@ +# wien_talks_server + +This is the starting point for your Serverpod server. + +To run your server, you first need to start Postgres and Redis. It's easiest to do with Docker. + + docker compose up --build --detach + +Then you can start the Serverpod server. + + dart bin/main.dart + +When you are finished, you can shut down Serverpod with `Ctrl-C`, then stop Postgres and Redis. + + docker compose stop diff --git a/wien_talks_be/analysis_options.yaml b/wien_talks/wien_talks_server/analysis_options.yaml similarity index 84% rename from wien_talks_be/analysis_options.yaml rename to wien_talks/wien_talks_server/analysis_options.yaml index dee8927..8847d6e 100644 --- a/wien_talks_be/analysis_options.yaml +++ b/wien_talks/wien_talks_server/analysis_options.yaml @@ -15,14 +15,15 @@ include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. -# linter: -# rules: -# - camel_case_types - -# analyzer: -# exclude: -# - path/to/excluded/files/** +linter: + rules: + unawaited_futures: true + avoid_print: true +analyzer: + exclude: + - lib/src/generated/** + - test/integration/test_tools/serverpod_test_tools.dart # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints diff --git a/wien_talks/wien_talks_server/bin/main.dart b/wien_talks/wien_talks_server/bin/main.dart new file mode 100644 index 0000000..8b08e8e --- /dev/null +++ b/wien_talks/wien_talks_server/bin/main.dart @@ -0,0 +1,7 @@ +import 'package:wien_talks_server/server.dart'; + +/// This is the starting point for your Serverpod server. Typically, there is +/// no need to modify this file. +void main(List args) { + run(args); +} diff --git a/wien_talks/wien_talks_server/config/development.yaml b/wien_talks/wien_talks_server/config/development.yaml new file mode 100644 index 0000000..4ae91a9 --- /dev/null +++ b/wien_talks/wien_talks_server/config/development.yaml @@ -0,0 +1,58 @@ +# This is the configuration file for your local development environment. By +# default, it runs a single server on port 8080. To set up your server, you will +# need to add the name of the database you are connecting to and the user name. +# The password for the database is stored in the config/passwords.yaml. +# +# When running your server locally, the server ports are the same as the public +# facing ports. + +# Configuration for the main API server. +apiServer: + port: 8080 + publicHost: localhost + publicPort: 8080 + publicScheme: http + +# Configuration for the Insights server. +insightsServer: + port: 8081 + publicHost: localhost + publicPort: 8081 + publicScheme: http + +# Configuration for the web server. +webServer: + port: 8082 + publicHost: localhost + publicPort: 8082 + publicScheme: http + +# This is the database setup for your server. +database: + host: localhost + port: 8090 + name: wien_talks + user: postgres + #requireSsl: true # defaults to false + #isUnixSocket: true # defaults to false + +# This is the setup for Redis. +redis: + enabled: false + host: localhost + port: 8091 + #user: # defaults to empty + #requireSsl: true # defaults to false + +maxRequestSize: 524288 # The maximum size of requests allowed in bytes + +sessionLogs: + persistentEnabled: true + consoleEnabled: true + consoleLogFormat: text # Defaults to "json", options are "text" or "json" + +# futureCallExecutionEnabled: true # Defaults to true + +#futureCall: +# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit +# scanInterval: 5000 # Unit in milliseconds, defaults to 5000 diff --git a/wien_talks/wien_talks_server/config/generator.yaml b/wien_talks/wien_talks_server/config/generator.yaml new file mode 100644 index 0000000..74d9772 --- /dev/null +++ b/wien_talks/wien_talks_server/config/generator.yaml @@ -0,0 +1,4 @@ +type: server + +client_package_path: ../wien_talks_client +server_test_tools_path: test/integration/test_tools diff --git a/wien_talks/wien_talks_server/config/production.yaml b/wien_talks/wien_talks_server/config/production.yaml new file mode 100644 index 0000000..036949f --- /dev/null +++ b/wien_talks/wien_talks_server/config/production.yaml @@ -0,0 +1,62 @@ +# This is the configuration file for your production environment. +# Typically, you will want to route the traffic through a load balancer +# which adds SSL security through https. If you use Serverpod's standard +# Terraform scripts to deploy your server, all you need to change in +# this file is the examplepod.com domain name. + +# Configuration for the main API server. +apiServer: + port: 8080 + publicHost: api.examplepod.com + publicPort: 443 + publicScheme: https + +# Configuration for the Insights server. +insightsServer: + port: 8081 + publicHost: insights.examplepod.com + publicPort: 443 + publicScheme: https + +# Configuration for the web server. +webServer: + port: 8082 + publicHost: app.examplepod.com + publicPort: 443 + publicScheme: https + +# This is the database setup for your servers. The default for the Google Cloud +# Engine Terraform configuration is to connect on a private IP address. +# If you are connecting on a public IP (e.g. on AWS or Google Cloud Run), you +# connect on the public IP of the database e.g. database.examplepod.com. +database: + host: database.private-production.examplepod.com + port: 5432 + name: serverpod + user: postgres + requireSsl: true + #isUnixSocket: true # defaults to false + +# This is the setup for Redis. The default for the Google Cloud Engine Terraform +# configuration is to connect on a private IP address. +# If you are connecting on a public IP (e.g. on AWS or Google Cloud Run), you +# connect on the public IP of the database e.g. redis.examplepod.com. +redis: + enabled: false + host: redis.private-production.examplepod.com + port: 6379 + #user: # defaults to empty + #requireSsl: true # defaults to false + +maxRequestSize: 524288 # The maximum size of requests allowed in bytes + +sessionLogs: + consoleEnabled: false +# persistentEnabled: true +# consoleLogFormat: json # Defaults to "json", options are "text" or "json" + +# futureCallExecutionEnabled: true # Defaults to true + +#futureCall: +# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit +# scanInterval: 5000 # Unit in milliseconds, defaults to 5000 diff --git a/wien_talks/wien_talks_server/config/staging.yaml b/wien_talks/wien_talks_server/config/staging.yaml new file mode 100644 index 0000000..1c731b2 --- /dev/null +++ b/wien_talks/wien_talks_server/config/staging.yaml @@ -0,0 +1,66 @@ +# This is the configuration file for your staging environment. The staging +# environment is meant to resemble the production environment as much as +# possible and may connect to production databases services and data. You use it +# for final testing before deploying the production server. +# +# Typically, you will want to route the traffic through a load balancer +# which adds SSL security through https. If you use Serverpod's standard +# Terraform scripts to deploy your server, all you need to change in +# this file is the examplepod.com domain name. + +# Configuration for the main API server. +apiServer: + port: 8080 + publicHost: api-staging.examplepod.com + publicPort: 443 + publicScheme: https + +# Configuration for the Insights server. +insightsServer: + port: 8081 + publicHost: insights-staging.examplepod.com + publicPort: 443 + publicScheme: https + +# Configuration for the web server. +webServer: + port: 8082 + publicHost: app-staging.examplepod.com + publicPort: 443 + publicScheme: https + +# This is the database setup for your servers. The default for the Google Cloud +# Engine Terraform configuration is to connect on a private IP address. +# If you are connecting on a public IP (e.g. on AWS or Google Cloud Run), you +# connect on the public IP of the database e.g. database-staging.examplepod.com. +database: + host: database.private-staging.examplepod.com + port: 5432 + name: serverpod + user: postgres + requireSsl: true + #isUnixSocket: true # defaults to false + +# This is the setup for Redis. The default for the Google Cloud Engine Terraform +# configuration is to connect on a private IP address. +# If you are connecting on a public IP (e.g. on AWS or Google Cloud Run), you +# connect on the public IP of the database e.g. redis-staging.examplepod.com. +redis: + enabled: false + host: redis.private-staging.examplepod.com + port: 6379 + #user: # defaults to empty + #requireSsl: true # defaults to false + +maxRequestSize: 524288 # The maximum size of requests allowed in bytes + +sessionLogs: +# persistentEnabled: true +# consoleEnabled: true +# consoleLogFormat: json # Defaults to "json", options are "text" or "json" + +# futureCallExecutionEnabled: true # Defaults to true + +#futureCall: +# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit +# scanInterval: 5000 # Unit in milliseconds, defaults to 5000 diff --git a/wien_talks/wien_talks_server/config/test.yaml b/wien_talks/wien_talks_server/config/test.yaml new file mode 100644 index 0000000..1ee6c12 --- /dev/null +++ b/wien_talks/wien_talks_server/config/test.yaml @@ -0,0 +1,55 @@ +# This is the configuration file for your test environment. +# All ports are set to zero in this file which makes the server find the next available port. +# This is needed to enable running tests concurrently. To set up your server, you will +# need to add the name of the database you are connecting to and the user name. +# The password for the database is stored in the config/passwords.yaml. +# +# When running your server locally, the server ports are the same as the public +# facing ports. + +# Configuration for the main API test server. +apiServer: + port: 0 + publicHost: localhost + publicPort: 0 + publicScheme: http + +# Configuration for the Insights test server. +insightsServer: + port: 0 + publicHost: localhost + publicPort: 0 + publicScheme: http + +# Configuration for the web test server. +webServer: + port: 0 + publicHost: localhost + publicPort: 0 + publicScheme: http + +# This is the database setup for your test server. +database: + host: localhost + port: 9090 + name: wien_talks_test + user: postgres + +# This is the setup for your Redis test instance. +redis: + enabled: false + host: localhost + port: 9091 + #user: # defaults to empty + #requireSsl: true # defaults to false + +sessionLogs: + persistentEnabled: true + consoleEnabled: true +# consoleLogFormat: json # Defaults to "json", options are "text" or "json" + +# futureCallExecutionEnabled: true # Defaults to true + +#futureCall: +# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit +# scanInterval: 5000 # Unit in milliseconds, defaults to 5000 diff --git a/wien_talks/wien_talks_server/dart_test.yaml b/wien_talks/wien_talks_server/dart_test.yaml new file mode 100644 index 0000000..2b60c7d --- /dev/null +++ b/wien_talks/wien_talks_server/dart_test.yaml @@ -0,0 +1,2 @@ +tags: + integration: {} diff --git a/wien_talks/wien_talks_server/deploy/aws/scripts/appspec.yml b/wien_talks/wien_talks_server/deploy/aws/scripts/appspec.yml new file mode 100644 index 0000000..582cb3c --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/scripts/appspec.yml @@ -0,0 +1,16 @@ +version: 0.0 +os: linux +files: + - source: /vendor/ + destination: /home/ec2-user/serverpod/upload/vendor/ + - source: /wien_talks_server/ + destination: /home/ec2-user/serverpod/upload/wien_talks_server/ +hooks: + BeforeInstall: + - location: wien_talks_server/deploy/aws/scripts/install_dependencies + timeout: 300 + runas: root + ApplicationStart: + - location: wien_talks_server/deploy/aws/scripts/start_server + timeout: 300 + runas: root diff --git a/wien_talks/wien_talks_server/deploy/aws/scripts/install_dependencies b/wien_talks/wien_talks_server/deploy/aws/scripts/install_dependencies new file mode 100644 index 0000000..041de4c --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/scripts/install_dependencies @@ -0,0 +1,47 @@ +#!/bin/bash +set -e # Exit on any error + +# Variables for configuration +DART_VERSION=3.5.1 +USERNAME=ec2-user +WORKDIR=/home/$USERNAME +DART_INSTALL_DIR="/usr/lib/dart$DART_VERSION" + +# Uncomment the following lines if migrating from an older serverpod CLI version +# if [ -f "/etc/profile.d/script.sh" ]; then +# sudo rm /etc/profile.d/script.sh +# fi + +# Install the specified Dart version if not already installed +if [ ! -d "$DART_INSTALL_DIR" ]; then + echo "Installing Dart $DART_VERSION..." + wget -q https://storage.googleapis.com/dart-archive/channels/stable/release/$DART_VERSION/sdk/dartsdk-linux-x64-release.zip -P /tmp + cd /tmp || exit + unzip -q dartsdk-linux-x64-release.zip + sudo mv dart-sdk/ "$DART_INSTALL_DIR" + sudo chmod -R 755 "$DART_INSTALL_DIR" + rm -rf dartsdk-linux-x64-release.zip +fi + +# Make symlink for Dart binaries +sudo ln -sf "$DART_INSTALL_DIR/bin/dart" /usr/local/bin/dart + +# Write the systemd unit file +cat > /lib/systemd/system/serverpod.service << EOF +[Unit] +Description=Serverpod server +After=network.target +Wants=network-online.target + +[Service] +User=$USERNAME +WorkingDirectory=$WORKDIR +ExecStart=$WORKDIR/serverpod/active/wien_talks_server/deploy/aws/scripts/run_serverpod +Restart=always + +[Install] +WantedBy=multi-user.target +EOF + +# Reload systemd configuration +systemctl daemon-reload diff --git a/wien_talks/wien_talks_server/deploy/aws/scripts/run_serverpod b/wien_talks/wien_talks_server/deploy/aws/scripts/run_serverpod new file mode 100644 index 0000000..455383d --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/scripts/run_serverpod @@ -0,0 +1,5 @@ +#!/bin/bash +RUNMODE=$(cat /home/ec2-user/runmode) +SERVER_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) +cd /home/ec2-user/serverpod/active/wien_talks_server +dart --old_gen_heap_size=0 run bin/main.dill --mode $RUNMODE --server-id $SERVER_ID > /home/ec2-user/serverpod.log 2> /home/ec2-user/serverpod.err diff --git a/wien_talks/wien_talks_server/deploy/aws/scripts/start_server b/wien_talks/wien_talks_server/deploy/aws/scripts/start_server new file mode 100644 index 0000000..517a411 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/scripts/start_server @@ -0,0 +1,19 @@ +#!/bin/bash + +# Make sure permissions are correct for the serverpod directory +chown -R ec2-user:ec2-user /home/ec2-user/serverpod + +# Run pub get as ec2-user +cd /home/ec2-user/serverpod/upload/wien_talks_server/ +sudo -u ec2-user dart pub get + +# Set correct permissions for start script +chmod 755 deploy/aws/scripts/run_serverpod + +# Stop the server if it's running, copy files, and restart +systemctl stop serverpod + +rm -rf /home/ec2-user/serverpod/active/ +cp -rp /home/ec2-user/serverpod/upload/ /home/ec2-user/serverpod/active/ + +systemctl start serverpod diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/balancers-staging.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/balancers-staging.tf new file mode 100644 index 0000000..ac78a84 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/balancers-staging.tf @@ -0,0 +1,143 @@ +# API load balancer setup + +resource "aws_lb" "serverpod_staging" { + count = var.enable_staging_server ? 1 : 0 + + name = "${var.project_name}-serverpod-staging" + internal = false + load_balancer_type = "application" + security_groups = [aws_security_group.api.id] + subnets = module.vpc.public_subnets +} + +resource "aws_lb_listener" "api_staging" { + count = var.enable_staging_server ? 1 : 0 + + load_balancer_arn = aws_lb.serverpod_staging[0].arn + port = "443" + protocol = "HTTPS" + certificate_arn = var.certificate_arn + + default_action { + type = "forward" + target_group_arn = aws_lb_target_group.api_staging[0].arn + } +} + +resource "aws_lb_target_group" "api_staging" { + count = var.enable_staging_server ? 1 : 0 + + name = "${var.project_name}-api-staging" + port = 8080 + protocol = "HTTP" + vpc_id = module.vpc.vpc_id +} + +resource "aws_lb_listener_rule" "api_staging" { + count = var.enable_staging_server ? 1 : 0 + + listener_arn = aws_lb_listener.api_staging[0].arn + priority = 100 + + action { + type = "forward" + target_group_arn = aws_lb_target_group.api_staging[0].arn + } + + condition { + host_header { + values = ["${var.subdomain_api_staging}.${var.top_domain}"] + } + } +} + +resource "aws_autoscaling_attachment" "api_staging" { + count = var.enable_staging_server ? 1 : 0 + + autoscaling_group_name = aws_autoscaling_group.staging[0].id + lb_target_group_arn = aws_lb_target_group.api_staging[0].arn +} + +resource "aws_route53_record" "api_staging" { + count = var.enable_staging_server ? 1 : 0 + + zone_id = var.hosted_zone_id + name = "${var.subdomain_api_staging}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_lb.serverpod_staging[0].dns_name}"] +} + +resource "aws_lb_target_group" "insights_staging" { + count = var.enable_staging_server ? 1 : 0 + + name = "${var.project_name}-insights-staging" + port = 8081 + protocol = "HTTP" + vpc_id = module.vpc.vpc_id +} + +resource "aws_autoscaling_attachment" "insights_staging" { + count = var.enable_staging_server ? 1 : 0 + + autoscaling_group_name = aws_autoscaling_group.staging[0].id + lb_target_group_arn = aws_lb_target_group.insights_staging[0].arn +} + +resource "aws_lb_listener_rule" "insights_staging" { + count = var.enable_staging_server ? 1 : 0 + + listener_arn = aws_lb_listener.api_staging[0].arn + priority = 99 + + action { + type = "forward" + target_group_arn = aws_lb_target_group.insights_staging[0].arn + } + + condition { + host_header { + values = ["${var.subdomain_insights_staging}.${var.top_domain}"] + } + } +} + +resource "aws_route53_record" "insights_staging" { + count = var.enable_staging_server ? 1 : 0 + + zone_id = var.hosted_zone_id + name = "${var.subdomain_insights_staging}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_lb.serverpod_staging[0].dns_name}"] +} + +resource "aws_lb_target_group" "web_staging" { + count = var.enable_staging_server ? 1 : 0 + + name = "${var.project_name}-web-staging" + port = 8082 + protocol = "HTTP" + vpc_id = module.vpc.vpc_id +} + +resource "aws_autoscaling_attachment" "web_staging" { + count = var.enable_staging_server ? 1 : 0 + + autoscaling_group_name = aws_autoscaling_group.staging[0].id + lb_target_group_arn = aws_lb_target_group.web_staging[0].arn +} + + +resource "aws_lb_listener" "web_staging" { + count = var.enable_staging_server ? 1 : 0 + + load_balancer_arn = aws_lb.serverpod_staging[0].arn + port = "80" + protocol = "HTTP" + + default_action { + type = "forward" + target_group_arn = aws_lb_target_group.web_staging[0].arn + } +} diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/balancers.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/balancers.tf new file mode 100644 index 0000000..774bab0 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/balancers.tf @@ -0,0 +1,148 @@ +# API load balancer setup + +resource "aws_lb" "serverpod" { + name = "${var.project_name}-serverpod" + internal = false + load_balancer_type = "application" + security_groups = [aws_security_group.api.id] + subnets = module.vpc.public_subnets +} + +resource "aws_security_group" "api" { + name = "${var.project_name}-api" + ingress { + from_port = 443 + to_port = 443 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + + vpc_id = module.vpc.vpc_id +} + +resource "aws_lb_listener" "api" { + load_balancer_arn = aws_lb.serverpod.arn + port = "443" + protocol = "HTTPS" + certificate_arn = var.certificate_arn + + default_action { + type = "forward" + target_group_arn = aws_lb_target_group.api.arn + } +} + +resource "aws_lb_target_group" "api" { + name = "${var.project_name}-api" + port = 8080 + protocol = "HTTP" + vpc_id = module.vpc.vpc_id +} + +resource "aws_lb_listener_rule" "api" { + listener_arn = aws_lb_listener.api.arn + priority = 100 + + action { + type = "forward" + target_group_arn = aws_lb_target_group.api.arn + } + + condition { + host_header { + values = ["${var.subdomain_api}.${var.top_domain}"] + } + } +} + +resource "aws_autoscaling_attachment" "api" { + autoscaling_group_name = aws_autoscaling_group.serverpod.id + lb_target_group_arn = aws_lb_target_group.api.arn +} + +resource "aws_route53_record" "api" { + zone_id = var.hosted_zone_id + name = "${var.subdomain_api}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_lb.serverpod.dns_name}"] +} + +# Insights load balancer rules + +resource "aws_lb_target_group" "insights" { + name = "${var.project_name}-insights" + port = 8081 + protocol = "HTTP" + vpc_id = module.vpc.vpc_id +} + +resource "aws_autoscaling_attachment" "insights" { + autoscaling_group_name = aws_autoscaling_group.serverpod.id + lb_target_group_arn = aws_lb_target_group.insights.arn +} + +resource "aws_lb_listener_rule" "insights" { + listener_arn = aws_lb_listener.api.arn + priority = 99 + + action { + type = "forward" + target_group_arn = aws_lb_target_group.insights.arn + } + + condition { + host_header { + values = ["${var.subdomain_insights}.${var.top_domain}"] + } + } +} + +resource "aws_route53_record" "insights" { + zone_id = var.hosted_zone_id + name = "${var.subdomain_insights}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_lb.serverpod.dns_name}"] +} + +# Web server load balancer rules + +resource "aws_lb_target_group" "web" { + name = "${var.project_name}-web" + port = 8082 + protocol = "HTTP" + vpc_id = module.vpc.vpc_id +} + +resource "aws_autoscaling_attachment" "web" { + autoscaling_group_name = aws_autoscaling_group.serverpod.id + lb_target_group_arn = aws_lb_target_group.web.arn +} + +resource "aws_lb_listener" "web" { + load_balancer_arn = aws_lb.serverpod.arn + port = "80" + protocol = "HTTP" + # certificate_arn = var.certificate_arn + + default_action { + type = "forward" + target_group_arn = aws_lb_target_group.web.arn + } +} + diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web-staging.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web-staging.tf new file mode 100644 index 0000000..d746378 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web-staging.tf @@ -0,0 +1,65 @@ +locals { + alb_origin_id_staging = "${var.project_name}-web-staging" +} + +resource "aws_cloudfront_distribution" "web_staging" { + count = var.enable_staging_server ? 1 : 0 + + origin { + origin_id = local.alb_origin_id_staging + domain_name = aws_lb.serverpod_staging[0].dns_name + custom_origin_config { + http_port = 80 + https_port = 443 + origin_protocol_policy = "http-only" + origin_ssl_protocols = ["SSLv3"] + } + } + enabled = true + + aliases = ["${var.subdomain_web_staging}.${var.top_domain}"] + + default_cache_behavior { + allowed_methods = ["HEAD", "DELETE", "POST", "GET", "OPTIONS", "PUT", "PATCH"] + cached_methods = ["HEAD", "GET"] + target_origin_id = local.alb_origin_id_staging + + forwarded_values { + query_string = true + + cookies { + forward = "all" + } + + headers = ["*"] + } + + viewer_protocol_policy = "redirect-to-https" + min_ttl = 0 + default_ttl = 0 + max_ttl = 0 + } + + price_class = "PriceClass_100" + + viewer_certificate { + acm_certificate_arn = var.cloudfront_certificate_arn + ssl_support_method = "sni-only" + } + + restrictions { + geo_restriction { + restriction_type = "none" + } + } +} + +resource "aws_route53_record" "web_staging" { + count = var.enable_staging_server ? 1 : 0 + + zone_id = var.hosted_zone_id + name = "${var.subdomain_web_staging}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_cloudfront_distribution.web_staging[0].domain_name}"] +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web.tf new file mode 100644 index 0000000..340685a --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/cloudfront-web.tf @@ -0,0 +1,73 @@ +locals { + alb_origin_id = "${var.project_name}-web" +} + +resource "aws_cloudfront_distribution" "web" { + origin { + origin_id = local.alb_origin_id + domain_name = aws_lb.serverpod.dns_name + custom_origin_config { + http_port = 80 + https_port = 443 + origin_protocol_policy = "http-only" + origin_ssl_protocols = ["SSLv3"] + } + } + enabled = true + + aliases = ["${var.subdomain_web}.${var.top_domain}", "${var.top_domain}"] + + default_cache_behavior { + allowed_methods = ["HEAD", "DELETE", "POST", "GET", "OPTIONS", "PUT", "PATCH"] + cached_methods = ["HEAD", "GET"] + target_origin_id = local.alb_origin_id + + forwarded_values { + query_string = true + + cookies { + forward = "all" + } + + headers = ["*"] + } + + viewer_protocol_policy = "redirect-to-https" + min_ttl = 0 + default_ttl = 0 + max_ttl = 0 + } + + price_class = "PriceClass_100" + + viewer_certificate { + acm_certificate_arn = var.cloudfront_certificate_arn + ssl_support_method = "sni-only" + } + + restrictions { + geo_restriction { + restriction_type = "none" + } + } +} + +resource "aws_route53_record" "web" { + zone_id = var.hosted_zone_id + name = "${var.subdomain_web}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_cloudfront_distribution.web.domain_name}"] +} + +resource "aws_route53_record" "web_top_domain" { + count = var.use_top_domain_for_web ? 1 : 0 + zone_id = var.hosted_zone_id + name = var.top_domain + type = "A" + alias { + name = aws_cloudfront_distribution.web.domain_name + zone_id = aws_cloudfront_distribution.web.hosted_zone_id + evaluate_target_health = false + } +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/code-deploy.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/code-deploy.tf new file mode 100644 index 0000000..2216a42 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/code-deploy.tf @@ -0,0 +1,98 @@ + +# Code deploy setup + +resource "aws_iam_instance_profile" "codedeploy_profile" { + name = "${var.project_name}-codedeploy-profile" + role = aws_iam_role.codedeploy_role.name +} + +resource "aws_iam_role" "codedeploy_role" { + name = "${var.project_name}-codedeploy-role" + + assume_role_policy = < AMI Catalog in your AWS console.) +# Note: For some regions the t2.micro is not available. If so, consult the AWS +# documentation to find another instance type that suits your needs. +instance_type = "t2.micro" +instance_ami = "ami-0ca285d4c2cda3300" +autoscaling_min_size = 1 +autoscaling_max_size = 1 +autoscaling_desired_capacity = 1 + + +# Setup an additional server cluster and associated load balancers for staging. +# By default, the staging server uses the same database and Redis setup as the +# production server. If you want to change this behavior you will need add +# and edit the Terraform files. +# Note: By turning this feature on, the server setup will no longer fit within +# the AWS free tier as it will use multiple server instances and load balancers. +enable_staging_server = false + +staging_instance_type = "t2.micro" +staging_autoscaling_min_size = 1 +staging_autoscaling_max_size = 1 +staging_autoscaling_desired_capacity = 1 + +# The deployment bucket name needs to be unique and can only contain lower case +# letters and dashes (no underscored allowed). +deployment_bucket_name = "wien-talks-deployment-6559518" +public_storage_bucket_name = "wien-talks-public-storage-6559518" +private_storage_bucket_name = "wien-talks-private-storage-6559518" +public_storage_bucket_name_staging = "wien-talks-public-storage-staging-6559518" +private_storage_bucket_name_staging = "wien-talks-private-storage-staging-6559518" \ No newline at end of file diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/database.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/database.tf new file mode 100644 index 0000000..07db31b --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/database.tf @@ -0,0 +1,65 @@ +resource "aws_db_instance" "postgres" { + identifier = var.project_name + allocated_storage = 10 + engine = "postgres" + engine_version = "16.3" + instance_class = "db.t3.micro" + db_name = "serverpod" + username = "postgres" + password = var.DATABASE_PASSWORD_PRODUCTION + skip_final_snapshot = true + vpc_security_group_ids = [ + aws_security_group.database.id + ] + publicly_accessible = true + db_subnet_group_name = module.vpc.database_subnet_group_name +} + +resource "aws_route53_record" "database" { + zone_id = var.hosted_zone_id + name = "${var.subdomain_database}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_db_instance.postgres.address}"] +} + +# Makes the database accessible from anywhere. +resource "aws_security_group" "database" { + name = "${var.project_name}-database" + ingress { + from_port = 5432 + to_port = 5432 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } +} + +# Staging +resource "aws_db_instance" "postgres_staging" { + count = var.enable_staging_server ? 1 : 0 + + identifier = "${var.project_name}-staging" + allocated_storage = 10 + engine = "postgres" + engine_version = "16.3" + instance_class = "db.t3.micro" + db_name = "serverpod" + username = "postgres" + password = var.DATABASE_PASSWORD_STAGING + skip_final_snapshot = true + vpc_security_group_ids = [ + aws_security_group.database.id + ] + publicly_accessible = true + db_subnet_group_name = module.vpc.database_subnet_group_name +} + +resource "aws_route53_record" "database_staging" { + count = var.enable_staging_server ? 1 : 0 + + zone_id = var.hosted_zone_id + name = "${var.subdomain_database_staging}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_db_instance.postgres_staging[0].address}"] +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/init-script.sh b/wien_talks/wien_talks_server/deploy/aws/terraform/init-script.sh new file mode 100644 index 0000000..139eabc --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/init-script.sh @@ -0,0 +1,24 @@ +#!/bin/bash +echo "Update yum packages" +yum update -y + +# Install yum packages +echo "Installing ruby" +yum install ruby -y +echo "Installing wget" +yum install wget -y + +# Install CodeDeploy agent +echo "Installing CodeDeploy agent" +cd /home/ec2-user +wget https://aws-codedeploy-us-west-2.s3.us-west-2.amazonaws.com/latest/install +chmod +x ./install +./install auto +rm install + +# Set runmode +echo "Setting runmode" +echo ${runmode} > /home/ec2-user/runmode +chown ec2-user:ec2-user /home/ec2-user/runmode + +echo "Setup done" diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/instances.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/instances.tf new file mode 100644 index 0000000..59bdd1c --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/instances.tf @@ -0,0 +1,102 @@ + +# EC2 auto scaling cluster and security groups + +data "aws_availability_zones" "available" { + state = "available" +} + +# TODO: Fix? +data "aws_ami" "amazon-linux" { + most_recent = true + owners = ["amazon"] + + filter { + name = "name" + values = ["amzn-ami-hvm-*-x86_64-ebs"] + } +} + +resource "aws_launch_configuration" "serverpod" { + name_prefix = "${var.project_name}-" + image_id = var.instance_ami + # image_id = data.aws_ami.amazon-linux.id + instance_type = var.instance_type + user_data = templatefile("init-script.sh", { runmode = "production" }) + + security_groups = [ + aws_security_group.serverpod.id, + aws_security_group.ssh.id + ] + + iam_instance_profile = aws_iam_instance_profile.codedeploy_profile.name + + lifecycle { + create_before_destroy = true + } +} + +resource "aws_autoscaling_group" "serverpod" { + min_size = var.autoscaling_min_size + max_size = var.autoscaling_max_size + desired_capacity = var.autoscaling_desired_capacity + launch_configuration = aws_launch_configuration.serverpod.name + vpc_zone_identifier = module.vpc.public_subnets + + target_group_arns = [ + aws_lb_target_group.api.arn, + aws_lb_target_group.insights.arn, + aws_lb_target_group.web.arn + ] + + tag { + key = "Name" + value = "${var.project_name}-serverpod" + propagate_at_launch = true + } + + tag { + key = "CodeDeploy" + value = var.project_name + propagate_at_launch = true + } +} + +resource "aws_security_group" "serverpod" { + name = "${var.project_name}-serverpod" + + ingress { + from_port = 8080 + to_port = 8082 + protocol = "tcp" + security_groups = [aws_security_group.api.id] + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + + vpc_id = module.vpc.vpc_id +} + +resource "aws_security_group" "ssh" { + name = "${var.project_name}-ssh" + + ingress { + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + + vpc_id = module.vpc.vpc_id +} diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/main.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/main.tf new file mode 100644 index 0000000..224e436 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/main.tf @@ -0,0 +1,17 @@ +# Terraform and AWS setup + +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 4.13" + } + } + + required_version = ">= 1.1.9" +} + +provider "aws" { + # profile = "default" + region = var.aws_region +} diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/redis.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/redis.tf new file mode 100644 index 0000000..7c10d27 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/redis.tf @@ -0,0 +1,70 @@ +resource "aws_elasticache_cluster" "redis" { + count = var.enable_redis ? 1 : 0 + + cluster_id = var.project_name + engine = "redis" + node_type = "cache.t4g.micro" + num_cache_nodes = 1 + engine_version = "6.x" + port = 6379 + apply_immediately = true + security_group_ids = [aws_security_group.redis[0].id] + subnet_group_name = aws_elasticache_subnet_group.redis[0].name +} + +resource "aws_route53_record" "redis" { + count = var.enable_redis ? 1 : 0 + + zone_id = var.hosted_zone_id + name = "${var.subdomain_redis}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_elasticache_cluster.redis[0].cache_nodes[0].address}"] +} + +# Makes Redis accessible from the serverpod only. +resource "aws_security_group" "redis" { + count = var.enable_redis ? 1 : 0 + + name = "${var.project_name}-redis" + ingress { + from_port = 6379 + to_port = 6379 + protocol = "tcp" + security_groups = [aws_security_group.serverpod.id] + } + + vpc_id = module.vpc.vpc_id +} + +resource "aws_elasticache_subnet_group" "redis" { + count = var.enable_redis ? 1 : 0 + + name = "${var.project_name}-subnet" + subnet_ids = module.vpc.public_subnets +} + +# Staging +resource "aws_elasticache_cluster" "redis_staging" { + count = var.enable_redis && var.enable_staging_server ? 1 : 0 + + cluster_id = var.project_name + engine = "redis" + node_type = "cache.t4g.micro" + num_cache_nodes = 1 + engine_version = "6.x" + port = 6379 + apply_immediately = true + security_group_ids = [aws_security_group.redis[0].id] + subnet_group_name = aws_elasticache_subnet_group.redis[0].name +} + +resource "aws_route53_record" "redis_staging" { + count = var.enable_redis && var.enable_staging_server ? 1 : 0 + + zone_id = var.hosted_zone_id + name = "${var.subdomain_redis_staging}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_elasticache_cluster.redis_staging[0].cache_nodes[0].address}"] +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/staging.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/staging.tf new file mode 100644 index 0000000..11d0db2 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/staging.tf @@ -0,0 +1,57 @@ +resource "aws_launch_configuration" "staging" { + count = var.enable_staging_server ? 1 : 0 + + name_prefix = "${var.project_name}-staging-" + image_id = var.instance_ami + # image_id = data.aws_ami.amazon-linux.id + instance_type = var.staging_instance_type + user_data = templatefile("init-script.sh", { runmode = "staging" }) + + security_groups = [ + aws_security_group.serverpod.id, + aws_security_group.ssh.id + ] + + iam_instance_profile = aws_iam_instance_profile.codedeploy_profile.name + + lifecycle { + create_before_destroy = true + } +} + +resource "aws_autoscaling_group" "staging" { + count = var.enable_staging_server ? 1 : 0 + + min_size = var.staging_autoscaling_min_size + max_size = var.staging_autoscaling_max_size + desired_capacity = var.staging_autoscaling_desired_capacity + launch_configuration = aws_launch_configuration.staging[0].name + vpc_zone_identifier = module.vpc.public_subnets + + target_group_arns = [ + aws_lb_target_group.api_staging[0].arn, + aws_lb_target_group.insights_staging[0].arn, + aws_lb_target_group.web_staging[0].arn + ] + + tag { + key = "Name" + value = "${var.project_name}-serverpod-staging" + propagate_at_launch = true + } + + tag { + key = "CodeDeploy" + value = "${var.project_name}-staging" + propagate_at_launch = true + } +} + +resource "aws_codedeploy_deployment_group" "staging" { + count = var.enable_staging_server ? 1 : 0 + + app_name = aws_codedeploy_app.serverpod.name + deployment_group_name = "${var.project_name}-staging-group" + service_role_arn = aws_iam_role.codedeploy_role.arn + autoscaling_groups = [aws_autoscaling_group.staging[0].id] +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/storage.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/storage.tf new file mode 100644 index 0000000..6f122c3 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/storage.tf @@ -0,0 +1,94 @@ +# S3 buckets +resource "aws_s3_bucket" "public_storage" { + bucket = var.public_storage_bucket_name + force_destroy = true + + tags = { + Name = "${var.project_name} public storage" + } +} + +resource "aws_s3_bucket_acl" "public_storage" { + bucket = aws_s3_bucket.public_storage.id + acl = "private" +} + +resource "aws_s3_bucket_ownership_controls" "public_storage" { + bucket = aws_s3_bucket.public_storage.id + rule { + object_ownership = "ObjectWriter" + } +} + +resource "aws_s3_bucket" "private_storage" { + bucket = var.private_storage_bucket_name + force_destroy = true + + tags = { + Name = "${var.project_name} private storage" + } +} + +resource "aws_s3_bucket_acl" "private_storage" { + bucket = aws_s3_bucket.private_storage.id + acl = "private" +} + +resource "aws_s3_bucket_ownership_controls" "private_storage" { + bucket = aws_s3_bucket.private_storage.id + rule { + object_ownership = "ObjectWriter" + } +} + +locals { + s3_origin_id = "${var.project_name}-storage" +} + +resource "aws_cloudfront_distribution" "public_storage" { + origin { + origin_id = local.s3_origin_id + domain_name = aws_s3_bucket.public_storage.bucket_regional_domain_name + } + enabled = true + + aliases = ["${var.subdomain_storage}.${var.top_domain}"] + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = local.s3_origin_id + + forwarded_values { + query_string = false + cookies { + forward = "none" + } + } + viewer_protocol_policy = "redirect-to-https" + min_ttl = 0 + default_ttl = 3600 + max_ttl = 86400 + } + + price_class = "PriceClass_100" + + viewer_certificate { + acm_certificate_arn = var.cloudfront_certificate_arn + ssl_support_method = "sni-only" + } + + restrictions { + geo_restriction { + restriction_type = "none" + } + } +} + +resource "aws_route53_record" "public_storage" { + zone_id = var.hosted_zone_id + name = "${var.subdomain_storage}.${var.top_domain}" + type = "CNAME" + ttl = "300" + records = ["${aws_cloudfront_distribution.public_storage.domain_name}"] +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/variables.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/variables.tf new file mode 100644 index 0000000..545649f --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/variables.tf @@ -0,0 +1,198 @@ +# Project setup + +variable "project_name" { + description = "Name of your project" + type = string +} + +variable "aws_region" { + description = "The region to deploy the configuration to" + type = string +} + +variable "enable_redis" { + description = "Deploy a managed Redis server" + type = bool +} + +variable "enable_staging_server" { + description = "Deploy a staging server" + type = bool +} + +# Instance setup + +variable "instance_ami" { + description = "The ami used for the instance" + type = string +} + +variable "instance_type" { + description = "The type used for the instance" + type = string +} + +variable "autoscaling_min_size" { + description = "Minimum size for the autoscaling pool" + type = number +} + +variable "autoscaling_max_size" { + description = "Maximum size for the autoscaling pool" + type = number +} + +variable "autoscaling_desired_capacity" { + description = "Desired size for the autoscaling pool" + type = number +} + +# Staging instance setup + +variable "staging_instance_type" { + description = "The type used for the instance" + type = string +} + +variable "staging_autoscaling_min_size" { + description = "Minimum size for the autoscaling pool" + type = number +} + +variable "staging_autoscaling_max_size" { + description = "Maximum size for the autoscaling pool" + type = number +} + +variable "staging_autoscaling_desired_capacity" { + description = "Desired size for the autoscaling pool" + type = number +} + +# Deployment + +variable "deployment_bucket_name" { + description = "Name of S3 bucket used for deployments" + type = string +} + +# Domains and certificates + +variable "hosted_zone_id" { + description = "The id of your hosted zone in Route 53" + type = string +} + +variable "certificate_arn" { + description = "Wildcard certificate for the top domain" + type = string +} + +variable "cloudfront_certificate_arn" { + description = "Certificate for use with Cloudfront, must be in us-east-1 region." + type = string +} + +variable "top_domain" { + description = "The domain name for use with Insights api" + type = string +} + +variable "subdomain_database" { + description = "The domain name for use with the database" + type = string +} + +variable "subdomain_redis" { + description = "The domain name for use with Redis" + type = string +} + +variable "subdomain_api" { + description = "The domain name for use with api" + type = string +} + +variable "subdomain_insights" { + description = "The domain name for use with Insights api" + type = string +} + +variable "subdomain_web" { + description = "The domain name for use with the web server" + type = string +} + +variable "subdomain_storage" { + description = "The domain name for use with public storage" + type = string +} + +variable "subdomain_database_staging" { + description = "The domain name for use with the database" + type = string +} + +variable "subdomain_redis_staging" { + description = "The domain name for use with Redis" + type = string +} + +variable "subdomain_api_staging" { + description = "The domain name for use by api staging" + type = string +} + +variable "subdomain_insights_staging" { + description = "The domain name for use by insights staging" + type = string +} + +variable "subdomain_web_staging" { + description = "The domain name for use by web server staging" + type = string +} + +variable "subdomain_storage_staging" { + description = "The domain name for use with public storage" + type = string +} + +variable "use_top_domain_for_web" { + description = "Set to true if you want to point the top domain to the web server" + type = bool +} + +# Storage + +variable "public_storage_bucket_name" { + description = "Name of S3 bucket used for public storage" + type = string +} + +variable "private_storage_bucket_name" { + description = "Name of S3 bucket used for private storage" + type = string +} + +variable "public_storage_bucket_name_staging" { + description = "Name of S3 bucket used for public storage" + type = string +} + +variable "private_storage_bucket_name_staging" { + description = "Name of S3 bucket used for private storage" + type = string +} + +# Database + +variable "DATABASE_PASSWORD_PRODUCTION" { + description = "The production database password, you can find it in the config/passwords.yaml file." + type = string +} + +variable "DATABASE_PASSWORD_STAGING" { + description = "The staging database password, you can find it in the config/passwords.yaml file (no need to specify if you aren't deploying a staging environment)." + type = string +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/deploy/aws/terraform/vpc.tf b/wien_talks/wien_talks_server/deploy/aws/terraform/vpc.tf new file mode 100644 index 0000000..b6855ca --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/aws/terraform/vpc.tf @@ -0,0 +1,18 @@ +module "vpc" { + source = "terraform-aws-modules/vpc/aws" + version = "2.77.0" + + name = "${var.project_name}-vpc" + cidr = "10.0.0.0/16" + + azs = data.aws_availability_zones.available.names + public_subnets = ["10.0.4.0/24", "10.0.5.0/24", "10.0.6.0/24"] + enable_dns_hostnames = true + enable_dns_support = true + + # create_database_subnet_group = true + # create_database_subnet_route_table = true + # create_database_internet_gateway_route = true + + # create_elasticache_subnet_group = true +} diff --git a/wien_talks/wien_talks_server/deploy/gcp/console_gcr/cloud-run-deploy.sh b/wien_talks/wien_talks_server/deploy/gcp/console_gcr/cloud-run-deploy.sh new file mode 100644 index 0000000..3ea6078 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/gcp/console_gcr/cloud-run-deploy.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# These are the variables that need to be set to be able to deploy to cloud run. +# You can find the values in the Google Cloud Console. +DATABASE_INSTANCE_CONNECTION_NAME="" +SERVICE_ACCOUNT="" + +# Optionally configure the region and runmode (staging is also viable). +REGION="us-central1" +RUNMODE="production" + + +# Check that we are running the script from the correct directory. +if [ ! -f config/production.yaml ]; then + echo "Run this script from the root of your server directory (e.g., mypod/mypod_server)." + exit 1 +fi + + +# Deploy the API server. +echo "Deploying API server..." + +gcloud run deploy serverpod-api \ + --source=. \ + --region=$REGION \ + --platform=managed \ + --service-account=$SERVICE_ACCOUNT \ + --port=8080 \ + --set-cloudsql-instances=$DATABASE_INSTANCE_CONNECTION_NAME \ + --execution-environment=gen2 \ + --set-env-vars="runmode=$RUNMODE" \ + --set-env-vars="role=serverless" \ + --allow-unauthenticated + + +# Deploy the Insights server. This is used by the Serverpod Insights app. It +# can provide run time information and logs from the API server. +echo "Deploying Insights server..." + +gcloud run deploy serverpod-insights \ + --source=. \ + --region=$REGION \ + --platform=managed \ + --service-account=$SERVICE_ACCOUNT \ + --port=8081 \ + --set-cloudsql-instances=$DATABASE_INSTANCE_CONNECTION_NAME \ + --execution-environment=gen2 \ + --set-env-vars="runmode=$RUNMODE" \ + --set-env-vars="role=serverless" \ + --allow-unauthenticated diff --git a/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/config.auto.tfvars b/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/config.auto.tfvars new file mode 100644 index 0000000..dc2b0e1 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/config.auto.tfvars @@ -0,0 +1,23 @@ +# This is the main configuration file. You can deploy your Serverpod by only +# doing changes to this file. Serverpod uses a minimal setup by default, but +# you can edit the main.tf file to choose higher tiers for database and your +# managed instances or enable additional services like Redis. +# +# You can find complete setup instructions at: +# https://docs.serverpod.dev/ + +# The Project ID from the Google Cloud Console. +project = "" + +# The service account email address authorized by your Google Cloud Console. +service_account_email = "" + +# The name of your DNS zone. +dns_managed_zone = "" + +# The top domain of your DNS zone. e.g. "examplepod.com" +top_domain = "" + +# The region and zone to use for the deployment. Default values work. +region = "us-central1" +zone = "us-central1-c" diff --git a/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/main.tf b/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/main.tf new file mode 100644 index 0000000..34f1928 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/main.tf @@ -0,0 +1,95 @@ +# Set up and configure Terraform and the Google Cloud provider. +terraform { + required_providers { + google = { + source = "hashicorp/google" + version = "4.51.0" + } + } +} + +provider "google" { + credentials = file("credentials.json") + + project = var.project + region = var.region + zone = var.zone +} + +# Add a Serverpod module configured for production. Full documentation on all +# options is available at: +# https://github.com/serverpod/terraform-google-serverpod-cloud-engine + +module "serverpod_production" { + # References the Serverpod module from GitHub. + source = "github.com/serverpod/terraform-google-serverpod-cloud-engine?ref=stable-1.1" + + # Required parameters. + project = var.project + service_account_email = var.service_account_email + + runmode = "production" + + region = var.region + zone = var.zone + + dns_managed_zone = var.dns_managed_zone + top_domain = var.top_domain + + # Size of the auto scaling group. + autoscaling_min_size = 1 + autoscaling_max_size = 2 + + # Password for the production database. + database_password = var.DATABASE_PASSWORD_PRODUCTION + + # Adds Cloud Storage buckets for file uploads. + enable_storage = true + + # Adds Redis for caching and communication between servers. + enable_redis = false + + # Makes it possible to SSH into the individual server instances. + enable_ssh = true +} + + +# If you want to set up a staging environment, you can add a second module +# configured for staging. Just uncomment the following code and change the +# parameters as needed (default options should work too). + +# module "serverpod_staging" { +# # References the Serverpod module from GitHub. +# source = "github.com/serverpod/terraform-google-serverpod-cloud-engine?ref=stable-1.1" + +# # Required parameters. +# project = var.project +# service_account_email = var.service_account_email + +# runmode = "staging" + +# region = var.region +# zone = var.zone + +# dns_managed_zone = var.dns_managed_zone +# top_domain = var.top_domain + +# # Prefix for the staging, added to all subdomains. +# subdomain_prefix = "staging-" + +# # Size of the auto scaling group. +# autoscaling_min_size = 1 +# autoscaling_max_size = 2 + +# # Password for the production database. +# database_password = var.DATABASE_PASSWORD_STAGING + +# # Adds Cloud Storage buckets for file uploads. +# enable_storage = true + +# # Adds Redis for caching and communication between servers. +# enable_redis = false + +# # Makes it possible to SSH into the individual server instances. +# enable_ssh = true +# } diff --git a/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/variables.tf b/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/variables.tf new file mode 100644 index 0000000..85d5075 --- /dev/null +++ b/wien_talks/wien_talks_server/deploy/gcp/terraform_gce/variables.tf @@ -0,0 +1,39 @@ +# Project setup. + +variable "project" { + type = string +} + +variable "service_account_email" { + type = string +} + +variable "dns_managed_zone" { + type = string +} + +variable "top_domain" { + type = string +} + +variable "region" { + type = string + default = "us-central1" +} + +variable "zone" { + type = string + default = "us-central1-c" +} + +# Database + +variable "DATABASE_PASSWORD_PRODUCTION" { + description = "The production database password, you can find it in the config/passwords.yaml file." + type = string +} + +variable "DATABASE_PASSWORD_STAGING" { + description = "The staging database password, you can find it in the config/passwords.yaml file (no need to specify if you aren't deploying a staging environment)." + type = string +} diff --git a/wien_talks/wien_talks_server/docker-compose.yaml b/wien_talks/wien_talks_server/docker-compose.yaml new file mode 100644 index 0000000..ac81e06 --- /dev/null +++ b/wien_talks/wien_talks_server/docker-compose.yaml @@ -0,0 +1,44 @@ +services: + # Development services + postgres: + image: pgvector/pgvector:pg16 + ports: + - "8090:5432" + environment: + POSTGRES_USER: postgres + POSTGRES_DB: wien_talks + POSTGRES_PASSWORD: "xiooSw3_x3i8ckjeCzqFHeKKjuv0Wxsv" + volumes: + - wien_talks_data:/var/lib/postgresql/data + + redis: + image: redis:6.2.6 + ports: + - "8091:6379" + command: redis-server --requirepass "9vM2BNozAdWSFBvhxbh32kIzfXhQpQ-9" + environment: + - REDIS_REPLICATION_MODE=master + + # Test services + postgres_test: + image: pgvector/pgvector:pg16 + ports: + - "9090:5432" + environment: + POSTGRES_USER: postgres + POSTGRES_DB: wien_talks_test + POSTGRES_PASSWORD: "ZjZXx6_kky5qtz6Uf6X54KvgsjBzanGF" + volumes: + - wien_talks_test_data:/var/lib/postgresql/data + + redis_test: + image: redis:6.2.6 + ports: + - "9091:6379" + command: redis-server --requirepass "oNl0yIsZCylx162cRkzP3046JbIaycuZ" + environment: + - REDIS_REPLICATION_MODE=master + +volumes: + wien_talks_data: + wien_talks_test_data: diff --git a/wien_talks/wien_talks_server/lib/server.dart b/wien_talks/wien_talks_server/lib/server.dart new file mode 100644 index 0000000..f69fa35 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/server.dart @@ -0,0 +1,60 @@ +import 'package:wien_talks_server/src/birthday_reminder.dart'; +import 'package:serverpod/serverpod.dart'; + +import 'package:wien_talks_server/src/web/routes/root.dart'; + +import 'src/generated/protocol.dart'; +import 'src/generated/endpoints.dart'; + +// This is the starting point of your Serverpod server. In most cases, you will +// only need to make additions to this file if you add future calls, are +// configuring Relic (Serverpod's web-server), or need custom setup work. + +void run(List args) async { + // Initialize Serverpod and connect it with your generated code. + final pod = Serverpod(args, Protocol(), Endpoints()); + + // Setup a default page at the web root. + pod.webServer.addRoute(RouteRoot(), '/'); + pod.webServer.addRoute(RouteRoot(), '/index.html'); + // Serve all files in the /static directory. + pod.webServer.addRoute( + RouteStaticDirectory(serverDirectory: 'static', basePath: '/'), + '/*', + ); + + // Start the server. + await pod.start(); + + // After starting the server, you can register future calls. Future calls are + // tasks that need to happen in the future, or independently of the request/ + // response cycle. For example, you can use future calls to send emails, or to + // schedule tasks to be executed at a later time. Future calls are executed in + // the background. Their schedule is persisted to the database, so you will + // not lose them if the server is restarted. + + pod.registerFutureCall( + BirthdayReminder(), + FutureCallNames.birthdayReminder.name, + ); + + // You can schedule future calls for a later time during startup. But you can + // also schedule them in any endpoint or webroute through the session object. + // there is also [futureCallAtTime] if you want to schedule a future call at a + // specific time. + await pod.futureCallWithDelay( + FutureCallNames.birthdayReminder.name, + Greeting( + message: 'Hello!', + author: 'Serverpod Server', + timestamp: DateTime.now(), + ), + Duration(seconds: 5), + ); +} + +/// Names of all future calls in the server. +/// +/// This is better than using a string literal, as it will reduce the risk of +/// typos and make it easier to refactor the code. +enum FutureCallNames { birthdayReminder } diff --git a/wien_talks/wien_talks_server/lib/src/birthday_reminder.dart b/wien_talks/wien_talks_server/lib/src/birthday_reminder.dart new file mode 100644 index 0000000..ef3d8cb --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/birthday_reminder.dart @@ -0,0 +1,18 @@ +import 'package:wien_talks_server/src/generated/protocol.dart'; +import 'package:serverpod/serverpod.dart'; + +/// This is a simple example of a future call that logs a birthday reminder. +/// +/// In a real-world application, you would implement the logic to send a +/// an email or a push notification to the user. +class BirthdayReminder extends FutureCall { + @override + Future invoke(Session session, Greeting? object) async { + // This is where you would implement the logic to send a birthday reminder. + // For example, you could send an email or a notification to the user. + // You can access the user information from the `object` parameter if + // needed. + + session.log('${object?.message} Remember to send a birthday card!'); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart new file mode 100644 index 0000000..25c4573 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -0,0 +1,51 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod/serverpod.dart' as _i1; +import '../greeting_endpoint.dart' as _i2; + +class Endpoints extends _i1.EndpointDispatch { + @override + void initializeEndpoints(_i1.Server server) { + var endpoints = { + 'greeting': _i2.GreetingEndpoint() + ..initialize( + server, + 'greeting', + null, + ) + }; + connectors['greeting'] = _i1.EndpointConnector( + name: 'greeting', + endpoint: endpoints['greeting']!, + methodConnectors: { + 'hello': _i1.MethodConnector( + name: 'hello', + params: { + 'name': _i1.ParameterDescription( + name: 'name', + type: _i1.getType(), + nullable: false, + ) + }, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['greeting'] as _i2.GreetingEndpoint).hello( + session, + params['name'], + ), + ) + }, + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/generated/greeting.dart b/wien_talks/wien_talks_server/lib/src/generated/greeting.dart new file mode 100644 index 0000000..005a7be --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/generated/greeting.dart @@ -0,0 +1,105 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod/serverpod.dart' as _i1; + +/// A greeting message which can be sent to or from the server. +abstract class Greeting + implements _i1.SerializableModel, _i1.ProtocolSerialization { + Greeting._({ + required this.message, + required this.author, + required this.timestamp, + }); + + factory Greeting({ + required String message, + required String author, + required DateTime timestamp, + }) = _GreetingImpl; + + factory Greeting.fromJson(Map jsonSerialization) { + return Greeting( + message: jsonSerialization['message'] as String, + author: jsonSerialization['author'] as String, + timestamp: + _i1.DateTimeJsonExtension.fromJson(jsonSerialization['timestamp']), + ); + } + + /// The greeting message. + String message; + + /// The author of the greeting message. + String author; + + /// The time when the message was created. + DateTime timestamp; + + /// Returns a shallow copy of this [Greeting] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + Greeting copyWith({ + String? message, + String? author, + DateTime? timestamp, + }); + @override + Map toJson() { + return { + 'message': message, + 'author': author, + 'timestamp': timestamp.toJson(), + }; + } + + @override + Map toJsonForProtocol() { + return { + 'message': message, + 'author': author, + 'timestamp': timestamp.toJson(), + }; + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _GreetingImpl extends Greeting { + _GreetingImpl({ + required String message, + required String author, + required DateTime timestamp, + }) : super._( + message: message, + author: author, + timestamp: timestamp, + ); + + /// Returns a shallow copy of this [Greeting] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + Greeting copyWith({ + String? message, + String? author, + DateTime? timestamp, + }) { + return Greeting( + message: message ?? this.message, + author: author ?? this.author, + timestamp: timestamp ?? this.timestamp, + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart new file mode 100644 index 0000000..1bd69cc --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart @@ -0,0 +1,93 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod/serverpod.dart' as _i1; +import 'package:serverpod/protocol.dart' as _i2; +import 'greeting.dart' as _i3; +export 'greeting.dart'; + +class Protocol extends _i1.SerializationManagerServer { + Protocol._(); + + factory Protocol() => _instance; + + static final Protocol _instance = Protocol._(); + + static final List<_i2.TableDefinition> targetTableDefinitions = [ + ..._i2.Protocol.targetTableDefinitions + ]; + + @override + T deserialize( + dynamic data, [ + Type? t, + ]) { + t ??= T; + if (t == _i3.Greeting) { + return _i3.Greeting.fromJson(data) as T; + } + if (t == _i1.getType<_i3.Greeting?>()) { + return (data != null ? _i3.Greeting.fromJson(data) : null) as T; + } + try { + return _i2.Protocol().deserialize(data, t); + } on _i1.DeserializationTypeNotFoundException catch (_) {} + return super.deserialize(data, t); + } + + @override + String? getClassNameForObject(Object? data) { + String? className = super.getClassNameForObject(data); + if (className != null) return className; + if (data is _i3.Greeting) { + return 'Greeting'; + } + className = _i2.Protocol().getClassNameForObject(data); + if (className != null) { + return 'serverpod.$className'; + } + return null; + } + + @override + dynamic deserializeByClassName(Map data) { + var dataClassName = data['className']; + if (dataClassName is! String) { + return super.deserializeByClassName(data); + } + if (dataClassName == 'Greeting') { + return deserialize<_i3.Greeting>(data['data']); + } + if (dataClassName.startsWith('serverpod.')) { + data['className'] = dataClassName.substring(10); + return _i2.Protocol().deserializeByClassName(data); + } + return super.deserializeByClassName(data); + } + + @override + _i1.Table? getTableForType(Type t) { + { + var table = _i2.Protocol().getTableForType(t); + if (table != null) { + return table; + } + } + return null; + } + + @override + List<_i2.TableDefinition> getTargetTableDefinitions() => + targetTableDefinitions; + + @override + String getModuleName() => 'wien_talks'; +} diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml new file mode 100644 index 0000000..9a4113d --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml @@ -0,0 +1,2 @@ +greeting: + - hello: diff --git a/wien_talks/wien_talks_server/lib/src/greeting.spy.yaml b/wien_talks/wien_talks_server/lib/src/greeting.spy.yaml new file mode 100644 index 0000000..3d08c8b --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/greeting.spy.yaml @@ -0,0 +1,24 @@ +# Yaml-files in the `models` directory specify which serializable objects +# should be generated. When you add or modify a file, you will need to run +# `serverpod generate` to make the generated classes available in the server and +# client. +# +# Please consult the documentation for more information on what you can add to +# your yaml-files. + +### A greeting message which can be sent to or from the server. +class: Greeting + +# Add the table key, if this class represents a row in the database. +#table: greeting + +# The fields (and columns if connected to the database) of the class. +# For a list of supported types, please see the documentation. +# https://docs.serverpod.dev/concepts/working-with-endpoints +fields: + ### The greeting message. + message: String + ### The author of the greeting message. + author: String + ### The time when the message was created. + timestamp: DateTime diff --git a/wien_talks/wien_talks_server/lib/src/greeting_endpoint.dart b/wien_talks/wien_talks_server/lib/src/greeting_endpoint.dart new file mode 100644 index 0000000..9faab19 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/greeting_endpoint.dart @@ -0,0 +1,34 @@ +import 'generated/protocol.dart'; +import 'package:serverpod/serverpod.dart'; + +// This is an example endpoint of your server. It's best practice to use the +// `Endpoint` ending of the class name, but it will be removed when accessing +// the endpoint from the client. I.e., this endpoint can be accessed through +// `client.greeting` on the client side. + +// After adding or modifying an endpoint, you will need to run +// `serverpod generate` to update the server and client code. + +/// This is an example endpoint that returns a greeting message through +/// its [hello] method. +class GreetingEndpoint extends Endpoint { + // This method is called when the client calls the `hello` method on the + // `greeting` endpoint. + // + // The `Session` parameter contains the context of the client request. + // It provides access to the database and other server-side resources like + // secrets from your password file, the cache, storage, and server-event + // messaging. + // + // You can use any serializable type as a parameter or return type, read more + // in the [docs](https://docs.serverpod.dev/concepts/working-with-endpoints). + + /// Returns a personalized greeting message: "Hello {name}". + Future hello(Session session, String name) async { + return Greeting( + message: 'Hello $name', + author: 'Serverpod', + timestamp: DateTime.now(), + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/web/routes/root.dart b/wien_talks/wien_talks_server/lib/src/web/routes/root.dart new file mode 100644 index 0000000..7c4a02e --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/web/routes/root.dart @@ -0,0 +1,11 @@ +import 'dart:io'; + +import 'package:wien_talks_server/src/web/widgets/built_with_serverpod_page.dart'; +import 'package:serverpod/serverpod.dart'; + +class RouteRoot extends WidgetRoute { + @override + Future build(Session session, HttpRequest request) async { + return BuiltWithServerpodPage(); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/web/widgets/built_with_serverpod_page.dart b/wien_talks/wien_talks_server/lib/src/web/widgets/built_with_serverpod_page.dart new file mode 100644 index 0000000..233327c --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/web/widgets/built_with_serverpod_page.dart @@ -0,0 +1,11 @@ +import 'package:serverpod/serverpod.dart'; + +/// A widget that displays the Serverpod version and the current run mode. +/// It uses the built_with_serverpod.html template to render the page. +/// The [name] of the template should correspond to a template file in your +/// server's web/templates directory. +class BuiltWithServerpodPage extends Widget { + BuiltWithServerpodPage() : super(name: 'built_with_serverpod') { + values = {'served': DateTime.now(), 'runmode': Serverpod.instance.runMode}; + } +} diff --git a/wien_talks/wien_talks_server/migrations/20250816095813247/definition.json b/wien_talks/wien_talks_server/migrations/20250816095813247/definition.json new file mode 100644 index 0000000..47337a1 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816095813247/definition.json @@ -0,0 +1,1153 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "serverpod_cloud_storage", + "dartName": "CloudStorageEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "addedTime", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + }, + { + "name": "byteData", + "columnType": 5, + "isNullable": false, + "dartType": "dart:typed_data:ByteData" + }, + { + "name": "verified", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_path_idx", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_cloud_storage_expiration", + "elements": [ + { + "type": 0, + "definition": "expiration" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage_direct_upload", + "dartName": "CloudStorageDirectUploadEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_direct_upload_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "authKey", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_direct_upload_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_direct_upload_storage_path", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_future_call", + "dartName": "FutureCallEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_future_call_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "serializedObject", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "identifier", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_future_call_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_future_call_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_serverId_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_identifier_idx", + "elements": [ + { + "type": 0, + "definition": "identifier" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_connection_info", + "dartName": "ServerHealthConnectionInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_connection_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "active", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "closing", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "idle", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_connection_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_connection_info_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_metric", + "dartName": "ServerHealthMetric", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_metric_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "isHealthy", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "value", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_metric_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_metric_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "name" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_log", + "dartName": "LogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "reference", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "logLevel", + "columnType": 6, + "isNullable": false, + "dartType": "protocol:LogLevel" + }, + { + "name": "message", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_message_log", + "dartName": "MessageLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_message_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_message_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_message_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_method", + "dartName": "MethodInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_method_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_method_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_method_endpoint_method_idx", + "elements": [ + { + "type": 0, + "definition": "endpoint" + }, + { + "type": 0, + "definition": "method" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_migrations", + "dartName": "DatabaseMigrationVersion", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_migrations_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "module", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "version", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_migrations_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_migrations_ids", + "elements": [ + { + "type": 0, + "definition": "module" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_query_log", + "dartName": "QueryLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_query_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "query", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "numRows", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_query_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_query_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_query_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_readwrite_test", + "dartName": "ReadWriteTestEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_readwrite_test_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "number", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_readwrite_test_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_runtime_settings", + "dartName": "RuntimeSettings", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_runtime_settings_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "logSettings", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:LogSettings" + }, + { + "name": "logSettingsOverrides", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "logServiceCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "logMalformedCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_runtime_settings_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_session_log", + "dartName": "SessionLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_session_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "module", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "method", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": true, + "dartType": "double?" + }, + { + "name": "numQueries", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "authenticatedUserId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "isOpen", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "touched", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_session_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_session_log_serverid_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_touched_idx", + "elements": [ + { + "type": 0, + "definition": "touched" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_isopen_idx", + "elements": [ + { + "type": 0, + "definition": "isOpen" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "wien_talks", + "version": "20250816095813247" + }, + { + "module": "serverpod", + "version": "20240516151843329" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816095813247/definition.sql b/wien_talks/wien_talks_server/migrations/20250816095813247/definition.sql new file mode 100644 index 0000000..a5506ab --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816095813247/definition.sql @@ -0,0 +1,257 @@ +BEGIN; + +-- +-- Class CloudStorageEntry as table serverpod_cloud_storage +-- +CREATE TABLE "serverpod_cloud_storage" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "addedTime" timestamp without time zone NOT NULL, + "expiration" timestamp without time zone, + "byteData" bytea NOT NULL, + "verified" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_path_idx" ON "serverpod_cloud_storage" USING btree ("storageId", "path"); +CREATE INDEX "serverpod_cloud_storage_expiration" ON "serverpod_cloud_storage" USING btree ("expiration"); + +-- +-- Class CloudStorageDirectUploadEntry as table serverpod_cloud_storage_direct_upload +-- +CREATE TABLE "serverpod_cloud_storage_direct_upload" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "expiration" timestamp without time zone NOT NULL, + "authKey" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_direct_upload_storage_path" ON "serverpod_cloud_storage_direct_upload" USING btree ("storageId", "path"); + +-- +-- Class FutureCallEntry as table serverpod_future_call +-- +CREATE TABLE "serverpod_future_call" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "serializedObject" text, + "serverId" text NOT NULL, + "identifier" text +); + +-- Indexes +CREATE INDEX "serverpod_future_call_time_idx" ON "serverpod_future_call" USING btree ("time"); +CREATE INDEX "serverpod_future_call_serverId_idx" ON "serverpod_future_call" USING btree ("serverId"); +CREATE INDEX "serverpod_future_call_identifier_idx" ON "serverpod_future_call" USING btree ("identifier"); + +-- +-- Class ServerHealthConnectionInfo as table serverpod_health_connection_info +-- +CREATE TABLE "serverpod_health_connection_info" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "active" bigint NOT NULL, + "closing" bigint NOT NULL, + "idle" bigint NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_connection_info_timestamp_idx" ON "serverpod_health_connection_info" USING btree ("timestamp", "serverId", "granularity"); + +-- +-- Class ServerHealthMetric as table serverpod_health_metric +-- +CREATE TABLE "serverpod_health_metric" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "isHealthy" boolean NOT NULL, + "value" double precision NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_metric_timestamp_idx" ON "serverpod_health_metric" USING btree ("timestamp", "serverId", "name", "granularity"); + +-- +-- Class LogEntry as table serverpod_log +-- +CREATE TABLE "serverpod_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "reference" text, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "logLevel" bigint NOT NULL, + "message" text NOT NULL, + "error" text, + "stackTrace" text, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_log_sessionLogId_idx" ON "serverpod_log" USING btree ("sessionLogId"); + +-- +-- Class MessageLogEntry as table serverpod_message_log +-- +CREATE TABLE "serverpod_message_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "serverId" text NOT NULL, + "messageId" bigint NOT NULL, + "endpoint" text NOT NULL, + "messageName" text NOT NULL, + "duration" double precision NOT NULL, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- +-- Class MethodInfo as table serverpod_method +-- +CREATE TABLE "serverpod_method" ( + "id" bigserial PRIMARY KEY, + "endpoint" text NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_method_endpoint_method_idx" ON "serverpod_method" USING btree ("endpoint", "method"); + +-- +-- Class DatabaseMigrationVersion as table serverpod_migrations +-- +CREATE TABLE "serverpod_migrations" ( + "id" bigserial PRIMARY KEY, + "module" text NOT NULL, + "version" text NOT NULL, + "timestamp" timestamp without time zone +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_migrations_ids" ON "serverpod_migrations" USING btree ("module"); + +-- +-- Class QueryLogEntry as table serverpod_query_log +-- +CREATE TABLE "serverpod_query_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "query" text NOT NULL, + "duration" double precision NOT NULL, + "numRows" bigint, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_query_log_sessionLogId_idx" ON "serverpod_query_log" USING btree ("sessionLogId"); + +-- +-- Class ReadWriteTestEntry as table serverpod_readwrite_test +-- +CREATE TABLE "serverpod_readwrite_test" ( + "id" bigserial PRIMARY KEY, + "number" bigint NOT NULL +); + +-- +-- Class RuntimeSettings as table serverpod_runtime_settings +-- +CREATE TABLE "serverpod_runtime_settings" ( + "id" bigserial PRIMARY KEY, + "logSettings" json NOT NULL, + "logSettingsOverrides" json NOT NULL, + "logServiceCalls" boolean NOT NULL, + "logMalformedCalls" boolean NOT NULL +); + +-- +-- Class SessionLogEntry as table serverpod_session_log +-- +CREATE TABLE "serverpod_session_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "module" text, + "endpoint" text, + "method" text, + "duration" double precision, + "numQueries" bigint, + "slow" boolean, + "error" text, + "stackTrace" text, + "authenticatedUserId" bigint, + "isOpen" boolean, + "touched" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USING btree ("serverId"); +CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); +CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); + +-- +-- Foreign relations for "serverpod_log" table +-- +ALTER TABLE ONLY "serverpod_log" + ADD CONSTRAINT "serverpod_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_message_log" table +-- +ALTER TABLE ONLY "serverpod_message_log" + ADD CONSTRAINT "serverpod_message_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_query_log" table +-- +ALTER TABLE ONLY "serverpod_query_log" + ADD CONSTRAINT "serverpod_query_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816095813247', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816095813247', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816095813247/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816095813247/definition_project.json new file mode 100644 index 0000000..e5cbb31 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816095813247/definition_project.json @@ -0,0 +1,11 @@ +{ + "moduleName": "wien_talks", + "tables": [], + "installedModules": [ + { + "module": "serverpod", + "version": "20240516151843329" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816095813247/migration.json b/wien_talks/wien_talks_server/migrations/20250816095813247/migration.json new file mode 100644 index 0000000..9e98e44 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816095813247/migration.json @@ -0,0 +1,1182 @@ +{ + "actions": [ + { + "type": "createTable", + "createTable": { + "name": "serverpod_cloud_storage", + "dartName": "CloudStorageEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "addedTime", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + }, + { + "name": "byteData", + "columnType": 5, + "isNullable": false, + "dartType": "dart:typed_data:ByteData" + }, + { + "name": "verified", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_path_idx", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_cloud_storage_expiration", + "elements": [ + { + "type": 0, + "definition": "expiration" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_cloud_storage_direct_upload", + "dartName": "CloudStorageDirectUploadEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_direct_upload_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "authKey", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_direct_upload_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_direct_upload_storage_path", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_future_call", + "dartName": "FutureCallEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_future_call_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "serializedObject", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "identifier", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_future_call_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_future_call_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_serverId_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_identifier_idx", + "elements": [ + { + "type": 0, + "definition": "identifier" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_health_connection_info", + "dartName": "ServerHealthConnectionInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_connection_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "active", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "closing", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "idle", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_connection_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_connection_info_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_health_metric", + "dartName": "ServerHealthMetric", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_metric_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "isHealthy", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "value", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_metric_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_metric_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "name" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_log", + "dartName": "LogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "reference", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "logLevel", + "columnType": 6, + "isNullable": false, + "dartType": "protocol:LogLevel" + }, + { + "name": "message", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_message_log", + "dartName": "MessageLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_message_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_message_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_message_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_method", + "dartName": "MethodInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_method_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_method_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_method_endpoint_method_idx", + "elements": [ + { + "type": 0, + "definition": "endpoint" + }, + { + "type": 0, + "definition": "method" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_migrations", + "dartName": "DatabaseMigrationVersion", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_migrations_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "module", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "version", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_migrations_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_migrations_ids", + "elements": [ + { + "type": 0, + "definition": "module" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_query_log", + "dartName": "QueryLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_query_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "query", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "numRows", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_query_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_query_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_query_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_readwrite_test", + "dartName": "ReadWriteTestEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_readwrite_test_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "number", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_readwrite_test_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_runtime_settings", + "dartName": "RuntimeSettings", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_runtime_settings_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "logSettings", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:LogSettings" + }, + { + "name": "logSettingsOverrides", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "logServiceCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "logMalformedCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_runtime_settings_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_session_log", + "dartName": "SessionLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_session_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "module", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "method", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": true, + "dartType": "double?" + }, + { + "name": "numQueries", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "authenticatedUserId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "isOpen", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "touched", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_session_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_session_log_serverid_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_touched_idx", + "elements": [ + { + "type": 0, + "definition": "touched" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_isopen_idx", + "elements": [ + { + "type": 0, + "definition": "isOpen" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + } + ], + "warnings": [], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816095813247/migration.sql b/wien_talks/wien_talks_server/migrations/20250816095813247/migration.sql new file mode 100644 index 0000000..47258dd --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816095813247/migration.sql @@ -0,0 +1,257 @@ +BEGIN; + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_cloud_storage" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "addedTime" timestamp without time zone NOT NULL, + "expiration" timestamp without time zone, + "byteData" bytea NOT NULL, + "verified" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_path_idx" ON "serverpod_cloud_storage" USING btree ("storageId", "path"); +CREATE INDEX "serverpod_cloud_storage_expiration" ON "serverpod_cloud_storage" USING btree ("expiration"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_cloud_storage_direct_upload" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "expiration" timestamp without time zone NOT NULL, + "authKey" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_direct_upload_storage_path" ON "serverpod_cloud_storage_direct_upload" USING btree ("storageId", "path"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_future_call" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "serializedObject" text, + "serverId" text NOT NULL, + "identifier" text +); + +-- Indexes +CREATE INDEX "serverpod_future_call_time_idx" ON "serverpod_future_call" USING btree ("time"); +CREATE INDEX "serverpod_future_call_serverId_idx" ON "serverpod_future_call" USING btree ("serverId"); +CREATE INDEX "serverpod_future_call_identifier_idx" ON "serverpod_future_call" USING btree ("identifier"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_health_connection_info" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "active" bigint NOT NULL, + "closing" bigint NOT NULL, + "idle" bigint NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_connection_info_timestamp_idx" ON "serverpod_health_connection_info" USING btree ("timestamp", "serverId", "granularity"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_health_metric" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "isHealthy" boolean NOT NULL, + "value" double precision NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_metric_timestamp_idx" ON "serverpod_health_metric" USING btree ("timestamp", "serverId", "name", "granularity"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "reference" text, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "logLevel" bigint NOT NULL, + "message" text NOT NULL, + "error" text, + "stackTrace" text, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_log_sessionLogId_idx" ON "serverpod_log" USING btree ("sessionLogId"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_message_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "serverId" text NOT NULL, + "messageId" bigint NOT NULL, + "endpoint" text NOT NULL, + "messageName" text NOT NULL, + "duration" double precision NOT NULL, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_method" ( + "id" bigserial PRIMARY KEY, + "endpoint" text NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_method_endpoint_method_idx" ON "serverpod_method" USING btree ("endpoint", "method"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_migrations" ( + "id" bigserial PRIMARY KEY, + "module" text NOT NULL, + "version" text NOT NULL, + "timestamp" timestamp without time zone +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_migrations_ids" ON "serverpod_migrations" USING btree ("module"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_query_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "query" text NOT NULL, + "duration" double precision NOT NULL, + "numRows" bigint, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_query_log_sessionLogId_idx" ON "serverpod_query_log" USING btree ("sessionLogId"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_readwrite_test" ( + "id" bigserial PRIMARY KEY, + "number" bigint NOT NULL +); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_runtime_settings" ( + "id" bigserial PRIMARY KEY, + "logSettings" json NOT NULL, + "logSettingsOverrides" json NOT NULL, + "logServiceCalls" boolean NOT NULL, + "logMalformedCalls" boolean NOT NULL +); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_session_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "module" text, + "endpoint" text, + "method" text, + "duration" double precision, + "numQueries" bigint, + "slow" boolean, + "error" text, + "stackTrace" text, + "authenticatedUserId" bigint, + "isOpen" boolean, + "touched" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USING btree ("serverId"); +CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); +CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); + +-- +-- ACTION CREATE FOREIGN KEY +-- +ALTER TABLE ONLY "serverpod_log" + ADD CONSTRAINT "serverpod_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- ACTION CREATE FOREIGN KEY +-- +ALTER TABLE ONLY "serverpod_message_log" + ADD CONSTRAINT "serverpod_message_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- ACTION CREATE FOREIGN KEY +-- +ALTER TABLE ONLY "serverpod_query_log" + ADD CONSTRAINT "serverpod_query_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816095813247', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816095813247', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/migration_registry.txt b/wien_talks/wien_talks_server/migrations/migration_registry.txt new file mode 100644 index 0000000..a0ec0ac --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/migration_registry.txt @@ -0,0 +1,7 @@ +### AUTOMATICALLY GENERATED DO NOT MODIFY +### +### This file is generated by Serverpod when creating a migration, do not modify it +### manually. If a collision is detected in this file when doing a code merge, resolve +### the conflict by removing and recreating the conflicting migration. + +20250816095813247 diff --git a/wien_talks_be/pubspec.lock b/wien_talks/wien_talks_server/pubspec.lock similarity index 68% rename from wien_talks_be/pubspec.lock rename to wien_talks/wien_talks_server/pubspec.lock index 690612c..3112221 100644 --- a/wien_talks_be/pubspec.lock +++ b/wien_talks/wien_talks_server/pubspec.lock @@ -41,6 +41,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + buffer: + dependency: transitive + description: + name: buffer + sha256: "389da2ec2c16283c8787e0adaede82b1842102f8c8aae2f49003a766c5c6b3d1" + url: "https://pub.dev" + source: hosted + version: "1.2.3" + charcode: + dependency: transitive + description: + name: charcode + sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a + url: "https://pub.dev" + source: hosted + version: "1.4.0" cli_config: dependency: transitive description: @@ -89,6 +105,22 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter_lints: + dependency: transitive + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" frontend_server_client: dependency: transitive description: @@ -105,6 +137,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.3" + http: + dependency: transitive + description: + name: http + sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 + url: "https://pub.dev" + source: hosted + version: "1.5.0" http_multi_server: dependency: transitive description: @@ -141,10 +181,10 @@ packages: dependency: "direct dev" description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.0.0" logging: dependency: transitive description: @@ -177,6 +217,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + mustache_template: + dependency: transitive + description: + name: mustache_template + sha256: a46e26f91445bfb0b60519be280555b06792460b27b19e2b19ad5b9740df5d1c + url: "https://pub.dev" + source: hosted + version: "2.0.0" node_preamble: dependency: transitive description: @@ -209,6 +257,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + postgres: + dependency: transitive + description: + name: postgres + sha256: "9aaa6f4872956adef653535a4e2133b167465c1a68c22b9bd0744ef1244e9393" + url: "https://pub.dev" + source: hosted + version: "3.5.6" pub_semver: dependency: transitive description: @@ -217,6 +273,78 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + redis: + dependency: transitive + description: + name: redis + sha256: "4a8218ef7b0642ff499147c7a105591208259e2f55f07db0101ace7f82f66cf9" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + retry: + dependency: transitive + description: + name: retry + sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc" + url: "https://pub.dev" + source: hosted + version: "3.1.2" + sasl_scram: + dependency: transitive + description: + name: sasl_scram + sha256: a47207a436eb650f8fdcf54a2e2587b850dc3caef9973ce01f332b07a6fc9cb9 + url: "https://pub.dev" + source: hosted + version: "0.1.1" + saslprep: + dependency: transitive + description: + name: saslprep + sha256: "3d421d10be9513bf4459c17c5e70e7b8bc718c9fc5ad4ba5eb4f5fd27396f740" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + serverpod: + dependency: "direct main" + description: + name: serverpod + sha256: ffb358e9ff84bf546ee612b4b5a5f5556bd9840e4a8f06d825efb77a4dd3009e + url: "https://pub.dev" + source: hosted + version: "2.9.1" + serverpod_lints: + dependency: transitive + description: + name: serverpod_lints + sha256: dc6f9c52fbbb39ca6b8f4a3dbdfaceb17c30fd5299a1a9bbd05da942d8bc2fd8 + url: "https://pub.dev" + source: hosted + version: "2.9.1" + serverpod_serialization: + dependency: transitive + description: + name: serverpod_serialization + sha256: c301a5e45610c062e51e1ba580f51f3257c3404ce2dd2f7e216dccbd93869502 + url: "https://pub.dev" + source: hosted + version: "2.9.1" + serverpod_shared: + dependency: transitive + description: + name: serverpod_shared + sha256: "4c88ca57d90138a01d70a5e28f206c86f9ec43a9215de06ee6a5d0c95049d519" + url: "https://pub.dev" + source: hosted + version: "2.9.1" + serverpod_test: + dependency: "direct dev" + description: + name: serverpod_test + sha256: c0ad3a29f9b60dbf3e47cd313cf48a0d87d4db2f26e21a14e44734146dc5a22b + url: "https://pub.dev" + source: hosted + version: "2.9.1" shelf: dependency: transitive description: @@ -273,6 +401,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -297,6 +433,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + super_string: + dependency: transitive + description: + name: super_string + sha256: ba41acf9fbb318b3fc0d57c9235779100394d85d83f45ab533615df1f3146ea7 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 + url: "https://pub.dev" + source: hosted + version: "3.4.0" + system_resources: + dependency: transitive + description: + name: system_resources + sha256: "7e78cf8ef224c1e0b6bf4462322b6739fea2274fef928cbcbf21ae5e5a8272d8" + url: "https://pub.dev" + source: hosted + version: "1.6.0" term_glyph: dependency: transitive description: @@ -337,6 +497,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + unorm_dart: + dependency: transitive + description: + name: unorm_dart + sha256: "8e3870a1caa60bde8352f9597dd3535d8068613269444f8e35ea8925ec84c1f5" + url: "https://pub.dev" + source: hosted + version: "0.3.1+1" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" vm_service: dependency: transitive description: @@ -394,4 +570,4 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.8.1 <4.0.0" + dart: ">=3.8.0 <4.0.0" diff --git a/wien_talks/wien_talks_server/pubspec.yaml b/wien_talks/wien_talks_server/pubspec.yaml new file mode 100644 index 0000000..bebc275 --- /dev/null +++ b/wien_talks/wien_talks_server/pubspec.yaml @@ -0,0 +1,16 @@ +name: wien_talks_server +description: Starting point for a Serverpod server. +# version: 1.0.0 +# homepage: https://www.example.com + +environment: + sdk: '>=3.5.0 <4.0.0' + +dependencies: + serverpod: 2.9.1 + +dev_dependencies: + lints: '>=3.0.0 <7.0.0' + test: '^1.24.2' + serverpod_test: 2.9.1 + diff --git a/wien_talks/wien_talks_server/test/integration/greeting_endpoint_test.dart b/wien_talks/wien_talks_server/test/integration/greeting_endpoint_test.dart new file mode 100644 index 0000000..5049049 --- /dev/null +++ b/wien_talks/wien_talks_server/test/integration/greeting_endpoint_test.dart @@ -0,0 +1,24 @@ +import 'package:test/test.dart'; + +// Import the generated test helper file, it contains everything you need. +import 'test_tools/serverpod_test_tools.dart'; + +void main() { + // This is an example test that uses the `withServerpod` test helper. + // `withServerpod` enables you to call your endpoints directly from the test like regular functions. + // Note that after adding or modifying an endpoint, you will need to run + // `serverpod generate` to update the test tools code. + // Refer to the docs for more information on how to use the test helper. + withServerpod('Given Greeting endpoint', (sessionBuilder, endpoints) { + test( + 'when calling `hello` with name then returned greeting includes name', + () async { + // Call the endpoint method by using the `endpoints` parameter and + // pass `sessionBuilder` as a first argument. Refer to the docs on + // how to use the `sessionBuilder` to set up different test scenarios. + final greeting = await endpoints.greeting.hello(sessionBuilder, 'Bob'); + expect(greeting.message, 'Hello Bob'); + }, + ); + }); +} diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart new file mode 100644 index 0000000..d9ec37d --- /dev/null +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -0,0 +1,159 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_local_identifiers + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod_test/serverpod_test.dart' as _i1; +import 'package:serverpod/serverpod.dart' as _i2; +import 'dart:async' as _i3; +import 'package:wien_talks_server/src/generated/greeting.dart' as _i4; +import 'package:wien_talks_server/src/generated/protocol.dart'; +import 'package:wien_talks_server/src/generated/endpoints.dart'; +export 'package:serverpod_test/serverpod_test_public_exports.dart'; + +/// Creates a new test group that takes a callback that can be used to write tests. +/// The callback has two parameters: `sessionBuilder` and `endpoints`. +/// `sessionBuilder` is used to build a `Session` object that represents the server state during an endpoint call and is used to set up scenarios. +/// `endpoints` contains all your Serverpod endpoints and lets you call them: +/// ```dart +/// withServerpod('Given Example endpoint', (sessionBuilder, endpoints) { +/// test('when calling `hello` then should return greeting', () async { +/// final greeting = await endpoints.example.hello(sessionBuilder, 'Michael'); +/// expect(greeting, 'Hello Michael'); +/// }); +/// }); +/// ``` +/// +/// **Configuration options** +/// +/// [applyMigrations] Whether pending migrations should be applied when starting Serverpod. Defaults to `true` +/// +/// [enableSessionLogging] Whether session logging should be enabled. Defaults to `false` +/// +/// [rollbackDatabase] Options for when to rollback the database during the test lifecycle. +/// By default `withServerpod` does all database operations inside a transaction that is rolled back after each `test` case. +/// Just like the following enum describes, the behavior of the automatic rollbacks can be configured: +/// ```dart +/// /// Options for when to rollback the database during the test lifecycle. +/// enum RollbackDatabase { +/// /// After each test. This is the default. +/// afterEach, +/// +/// /// After all tests. +/// afterAll, +/// +/// /// Disable rolling back the database. +/// disabled, +/// } +/// ``` +/// +/// [runMode] The run mode that Serverpod should be running in. Defaults to `test`. +/// +/// [serverpodLoggingMode] The logging mode used when creating Serverpod. Defaults to `ServerpodLoggingMode.normal` +/// +/// [serverpodStartTimeout] The timeout to use when starting Serverpod, which connects to the database among other things. Defaults to `Duration(seconds: 30)`. +/// +/// [testGroupTagsOverride] By default Serverpod test tools tags the `withServerpod` test group with `"integration"`. +/// This is to provide a simple way to only run unit or integration tests. +/// This property allows this tag to be overridden to something else. Defaults to `['integration']`. +/// +/// [experimentalFeatures] Optionally specify experimental features. See [Serverpod] for more information. +@_i1.isTestGroup +void withServerpod( + String testGroupName, + _i1.TestClosure testClosure, { + bool? applyMigrations, + bool? enableSessionLogging, + _i2.ExperimentalFeatures? experimentalFeatures, + _i1.RollbackDatabase? rollbackDatabase, + String? runMode, + _i2.RuntimeParametersListBuilder? runtimeParametersBuilder, + _i2.ServerpodLoggingMode? serverpodLoggingMode, + Duration? serverpodStartTimeout, + List? testGroupTagsOverride, +}) { + _i1.buildWithServerpod<_InternalTestEndpoints>( + testGroupName, + _i1.TestServerpod( + testEndpoints: _InternalTestEndpoints(), + endpoints: Endpoints(), + serializationManager: Protocol(), + runMode: runMode, + applyMigrations: applyMigrations, + isDatabaseEnabled: true, + serverpodLoggingMode: serverpodLoggingMode, + experimentalFeatures: experimentalFeatures, + runtimeParametersBuilder: runtimeParametersBuilder, + ), + maybeRollbackDatabase: rollbackDatabase, + maybeEnableSessionLogging: enableSessionLogging, + maybeTestGroupTagsOverride: testGroupTagsOverride, + maybeServerpodStartTimeout: serverpodStartTimeout, + )(testClosure); +} + +class TestEndpoints { + late final _GreetingEndpoint greeting; +} + +class _InternalTestEndpoints extends TestEndpoints + implements _i1.InternalTestEndpoints { + @override + void initialize( + _i2.SerializationManager serializationManager, + _i2.EndpointDispatch endpoints, + ) { + greeting = _GreetingEndpoint( + endpoints, + serializationManager, + ); + } +} + +class _GreetingEndpoint { + _GreetingEndpoint( + this._endpointDispatch, + this._serializationManager, + ); + + final _i2.EndpointDispatch _endpointDispatch; + + final _i2.SerializationManager _serializationManager; + + _i3.Future<_i4.Greeting> hello( + _i1.TestSessionBuilder sessionBuilder, + String name, + ) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'greeting', + method: 'hello', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'greeting', + methodName: 'hello', + parameters: _i1.testObjectToJson({'name': name}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future<_i4.Greeting>); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } +} diff --git a/wien_talks/wien_talks_server/web/static/css/style.css b/wien_talks/wien_talks_server/web/static/css/style.css new file mode 100644 index 0000000..2cea817 --- /dev/null +++ b/wien_talks/wien_talks_server/web/static/css/style.css @@ -0,0 +1,76 @@ +html { + box-sizing: border-box; + font-size: 14px; + font-family: Arial, Helvetica, sans-serif; + background: url('/images/background.svg') no-repeat center center fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} + +*, *:before, *:after { + box-sizing: inherit; +} + +body, h1, h2, h3, h4, h5, h6, p, ol, ul { + margin: 0; + padding: 0; + font-weight: normal; +} + +ol, ul { + list-style: none; +} + +img { + max-width: 100%; + height: auto; +} + +body { + padding: 16px; +} + +hr { + margin-top: 16px; margin-bottom: 16px; + border: 0; + height: 1px; + background: #999; +} + +.content { + min-width: 300px; + position: absolute; + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + background-color: white; + border-radius: 8px; + padding: 16px; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +.logo-box a { + text-decoration: none; + font-weight: bold; + color: #666; +} + +.logo-box { + text-align: center; +} + +.info-box p { + margin-top: 2px; +} + +.link-box { + text-align: center; + color: #999; +} + +.link-box a { + text-decoration: none; +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/web/static/images/background.svg b/wien_talks/wien_talks_server/web/static/images/background.svg new file mode 100644 index 0000000..45ce11d --- /dev/null +++ b/wien_talks/wien_talks_server/web/static/images/background.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/wien_talks/wien_talks_server/web/static/images/serverpod-logo.svg b/wien_talks/wien_talks_server/web/static/images/serverpod-logo.svg new file mode 100644 index 0000000..1872447 --- /dev/null +++ b/wien_talks/wien_talks_server/web/static/images/serverpod-logo.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wien_talks/wien_talks_server/web/templates/built_with_serverpod.html b/wien_talks/wien_talks_server/web/templates/built_with_serverpod.html new file mode 100644 index 0000000..b7a43f5 --- /dev/null +++ b/wien_talks/wien_talks_server/web/templates/built_with_serverpod.html @@ -0,0 +1,29 @@ + + + + + Built with Serverpod + + + +
+ +
+
+

Served at: {{served}}

+

Run mode: {{runmode}}

+
+
+ +
+ + \ No newline at end of file diff --git a/wien_talks_be/.gitignore b/wien_talks_be/.gitignore deleted file mode 100644 index 3a85790..0000000 --- a/wien_talks_be/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# https://dart.dev/guides/libraries/private-files -# Created by `dart pub` -.dart_tool/ diff --git a/wien_talks_be/CHANGELOG.md b/wien_talks_be/CHANGELOG.md deleted file mode 100644 index effe43c..0000000 --- a/wien_talks_be/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.0 - -- Initial version. diff --git a/wien_talks_be/README.md b/wien_talks_be/README.md deleted file mode 100644 index 3816eca..0000000 --- a/wien_talks_be/README.md +++ /dev/null @@ -1,2 +0,0 @@ -A sample command-line application with an entrypoint in `bin/`, library code -in `lib/`, and example unit test in `test/`. diff --git a/wien_talks_be/bin/wien_talks_be.dart b/wien_talks_be/bin/wien_talks_be.dart deleted file mode 100644 index bada568..0000000 --- a/wien_talks_be/bin/wien_talks_be.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:wien_talks_be/wien_talks_be.dart' as wien_talks_be; - -void main(List arguments) { - print('Hello world: ${wien_talks_be.calculate()}!'); -} diff --git a/wien_talks_be/lib/wien_talks_be.dart b/wien_talks_be/lib/wien_talks_be.dart deleted file mode 100644 index f64ad72..0000000 --- a/wien_talks_be/lib/wien_talks_be.dart +++ /dev/null @@ -1,3 +0,0 @@ -int calculate() { - return 6 * 7; -} diff --git a/wien_talks_be/pubspec.yaml b/wien_talks_be/pubspec.yaml deleted file mode 100644 index 60ed050..0000000 --- a/wien_talks_be/pubspec.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: wien_talks_be -description: A sample command-line application. -version: 1.0.0 -# repository: https://github.com/my_org/my_repo - -environment: - sdk: ^3.8.1 - -# Add regular dependencies here. -dependencies: - # path: ^1.8.0 - -dev_dependencies: - lints: ^5.0.0 - test: ^1.24.0 diff --git a/wien_talks_be/test/wien_talks_be_test.dart b/wien_talks_be/test/wien_talks_be_test.dart deleted file mode 100644 index 8db0a6f..0000000 --- a/wien_talks_be/test/wien_talks_be_test.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:wien_talks_be/wien_talks_be.dart'; -import 'package:test/test.dart'; - -void main() { - test('calculate', () { - expect(calculate(), 42); - }); -} From 6fd404fc88307091071ac07a1ad3b9f2d477b2d4 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 12:06:10 +0200 Subject: [PATCH 03/49] rm env and redis --- wien_talks/wien_talks_server/.gitignore | 2 ++ .../wien_talks_server/docker-compose.yaml | 34 ++----------------- 2 files changed, 5 insertions(+), 31 deletions(-) diff --git a/wien_talks/wien_talks_server/.gitignore b/wien_talks/wien_talks_server/.gitignore index e36bb12..ee19b5d 100644 --- a/wien_talks/wien_talks_server/.gitignore +++ b/wien_talks/wien_talks_server/.gitignore @@ -13,3 +13,5 @@ config/passwords.yaml # Firebase service account key for Firebase auth config/firebase_service_account_key.json + +.env \ No newline at end of file diff --git a/wien_talks/wien_talks_server/docker-compose.yaml b/wien_talks/wien_talks_server/docker-compose.yaml index ac81e06..09621fa 100644 --- a/wien_talks/wien_talks_server/docker-compose.yaml +++ b/wien_talks/wien_talks_server/docker-compose.yaml @@ -5,40 +5,12 @@ services: ports: - "8090:5432" environment: - POSTGRES_USER: postgres - POSTGRES_DB: wien_talks - POSTGRES_PASSWORD: "xiooSw3_x3i8ckjeCzqFHeKKjuv0Wxsv" + POSTGRES_USER: + POSTGRES_DB: + POSTGRES_PASSWORD: volumes: - wien_talks_data:/var/lib/postgresql/data - redis: - image: redis:6.2.6 - ports: - - "8091:6379" - command: redis-server --requirepass "9vM2BNozAdWSFBvhxbh32kIzfXhQpQ-9" - environment: - - REDIS_REPLICATION_MODE=master - - # Test services - postgres_test: - image: pgvector/pgvector:pg16 - ports: - - "9090:5432" - environment: - POSTGRES_USER: postgres - POSTGRES_DB: wien_talks_test - POSTGRES_PASSWORD: "ZjZXx6_kky5qtz6Uf6X54KvgsjBzanGF" - volumes: - - wien_talks_test_data:/var/lib/postgresql/data - - redis_test: - image: redis:6.2.6 - ports: - - "9091:6379" - command: redis-server --requirepass "oNl0yIsZCylx162cRkzP3046JbIaycuZ" - environment: - - REDIS_REPLICATION_MODE=master - volumes: wien_talks_data: wien_talks_test_data: From 6e78ac26658469b6395b116ba22eacb17b95f48c Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 13:08:10 +0200 Subject: [PATCH 04/49] introduce quote models --- .../lib/src/protocol/client.dart | 23 +- .../lib/src/protocol/protocol.dart | 38 ++++ .../lib/src/protocol/quotes/create_quote.dart | 116 ++++++++++ .../lib/src/protocol/quotes/quote.dart | 194 ++++++++++++++++ .../lib/src/generated/endpoints.dart | 33 ++- .../lib/src/generated/protocol.dart | 38 ++++ .../lib/src/generated/protocol.yaml | 2 + .../src/generated/quotes/create_quote.dart | 128 +++++++++++ .../lib/src/generated/quotes/quote.dart | 213 ++++++++++++++++++ .../lib/src/quotes/create_quote.spy.yaml | 7 + .../lib/src/quotes/location_endpoint.dart | 12 + .../lib/src/quotes/quote.spy.yaml | 14 ++ .../test_tools/serverpod_test_tools.dart | 46 ++++ 13 files changed, 862 insertions(+), 2 deletions(-) create mode 100644 wien_talks/wien_talks_client/lib/src/protocol/quotes/create_quote.dart create mode 100644 wien_talks/wien_talks_client/lib/src/protocol/quotes/quote.dart create mode 100644 wien_talks/wien_talks_server/lib/src/generated/quotes/create_quote.dart create mode 100644 wien_talks/wien_talks_server/lib/src/generated/quotes/quote.dart create mode 100644 wien_talks/wien_talks_server/lib/src/quotes/create_quote.spy.yaml create mode 100644 wien_talks/wien_talks_server/lib/src/quotes/location_endpoint.dart create mode 100644 wien_talks/wien_talks_server/lib/src/quotes/quote.spy.yaml diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index 7fa2180..de9b4df 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -32,6 +32,21 @@ class EndpointGreeting extends _i1.EndpointRef { ); } +/// {@category Endpoint} +class EndpointRecipe extends _i1.EndpointRef { + EndpointRecipe(_i1.EndpointCaller caller) : super(caller); + + @override + String get name => 'recipe'; + + _i2.Future postQuote(String quote) => + caller.callServerEndpoint( + 'recipe', + 'postQuote', + {'quote': quote}, + ); +} + class Client extends _i1.ServerpodClientShared { Client( String host, { @@ -59,12 +74,18 @@ class Client extends _i1.ServerpodClientShared { disconnectStreamsOnLostInternetConnection, ) { greeting = EndpointGreeting(this); + recipe = EndpointRecipe(this); } late final EndpointGreeting greeting; + late final EndpointRecipe recipe; + @override - Map get endpointRefLookup => {'greeting': greeting}; + Map get endpointRefLookup => { + 'greeting': greeting, + 'recipe': recipe, + }; @override Map get moduleLookup => {}; diff --git a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart index 92603c6..5719c72 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart @@ -11,7 +11,11 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod_client/serverpod_client.dart' as _i1; import 'greeting.dart' as _i2; +import 'quotes/create_quote.dart' as _i3; +import 'quotes/quote.dart' as _i4; export 'greeting.dart'; +export 'quotes/create_quote.dart'; +export 'quotes/quote.dart'; export 'client.dart'; class Protocol extends _i1.SerializationManager { @@ -30,9 +34,31 @@ class Protocol extends _i1.SerializationManager { if (t == _i2.Greeting) { return _i2.Greeting.fromJson(data) as T; } + if (t == _i3.CreateQuoteRequest) { + return _i3.CreateQuoteRequest.fromJson(data) as T; + } + if (t == _i4.Quote) { + return _i4.Quote.fromJson(data) as T; + } if (t == _i1.getType<_i2.Greeting?>()) { return (data != null ? _i2.Greeting.fromJson(data) : null) as T; } + if (t == _i1.getType<_i3.CreateQuoteRequest?>()) { + return (data != null ? _i3.CreateQuoteRequest.fromJson(data) : null) as T; + } + if (t == _i1.getType<_i4.Quote?>()) { + return (data != null ? _i4.Quote.fromJson(data) : null) as T; + } + if (t == _i1.getType?>()) { + return (data != null + ? (data as List).map((e) => deserialize(e)).toList() + : null) as T; + } + if (t == _i1.getType?>()) { + return (data != null + ? (data as List).map((e) => deserialize(e)).toList() + : null) as T; + } return super.deserialize(data, t); } @@ -43,6 +69,12 @@ class Protocol extends _i1.SerializationManager { if (data is _i2.Greeting) { return 'Greeting'; } + if (data is _i3.CreateQuoteRequest) { + return 'CreateQuoteRequest'; + } + if (data is _i4.Quote) { + return 'Quote'; + } return null; } @@ -55,6 +87,12 @@ class Protocol extends _i1.SerializationManager { if (dataClassName == 'Greeting') { return deserialize<_i2.Greeting>(data['data']); } + if (dataClassName == 'CreateQuoteRequest') { + return deserialize<_i3.CreateQuoteRequest>(data['data']); + } + if (dataClassName == 'Quote') { + return deserialize<_i4.Quote>(data['data']); + } return super.deserializeByClassName(data); } } diff --git a/wien_talks/wien_talks_client/lib/src/protocol/quotes/create_quote.dart b/wien_talks/wien_talks_client/lib/src/protocol/quotes/create_quote.dart new file mode 100644 index 0000000..8331a85 --- /dev/null +++ b/wien_talks/wien_talks_client/lib/src/protocol/quotes/create_quote.dart @@ -0,0 +1,116 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod_client/serverpod_client.dart' as _i1; + +abstract class CreateQuoteRequest implements _i1.SerializableModel { + CreateQuoteRequest._({ + required this.text, + this.authorName, + required this.lat, + required this.lng, + this.tags, + }); + + factory CreateQuoteRequest({ + required String text, + String? authorName, + required double lat, + required double lng, + List? tags, + }) = _CreateQuoteRequestImpl; + + factory CreateQuoteRequest.fromJson(Map jsonSerialization) { + return CreateQuoteRequest( + text: jsonSerialization['text'] as String, + authorName: jsonSerialization['authorName'] as String?, + lat: (jsonSerialization['lat'] as num).toDouble(), + lng: (jsonSerialization['lng'] as num).toDouble(), + tags: (jsonSerialization['tags'] as List?) + ?.map((e) => e as String) + .toList(), + ); + } + + String text; + + String? authorName; + + double lat; + + double lng; + + List? tags; + + /// Returns a shallow copy of this [CreateQuoteRequest] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + CreateQuoteRequest copyWith({ + String? text, + String? authorName, + double? lat, + double? lng, + List? tags, + }); + @override + Map toJson() { + return { + 'text': text, + if (authorName != null) 'authorName': authorName, + 'lat': lat, + 'lng': lng, + if (tags != null) 'tags': tags?.toJson(), + }; + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _Undefined {} + +class _CreateQuoteRequestImpl extends CreateQuoteRequest { + _CreateQuoteRequestImpl({ + required String text, + String? authorName, + required double lat, + required double lng, + List? tags, + }) : super._( + text: text, + authorName: authorName, + lat: lat, + lng: lng, + tags: tags, + ); + + /// Returns a shallow copy of this [CreateQuoteRequest] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + CreateQuoteRequest copyWith({ + String? text, + Object? authorName = _Undefined, + double? lat, + double? lng, + Object? tags = _Undefined, + }) { + return CreateQuoteRequest( + text: text ?? this.text, + authorName: authorName is String? ? authorName : this.authorName, + lat: lat ?? this.lat, + lng: lng ?? this.lng, + tags: tags is List? ? tags : this.tags?.map((e0) => e0).toList(), + ); + } +} diff --git a/wien_talks/wien_talks_client/lib/src/protocol/quotes/quote.dart b/wien_talks/wien_talks_client/lib/src/protocol/quotes/quote.dart new file mode 100644 index 0000000..20d381a --- /dev/null +++ b/wien_talks/wien_talks_client/lib/src/protocol/quotes/quote.dart @@ -0,0 +1,194 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod_client/serverpod_client.dart' as _i1; + +abstract class Quote implements _i1.SerializableModel { + Quote._({ + required this.id, + required this.userId, + required this.text, + this.authorName, + required this.lat, + required this.lng, + required this.geohash, + required this.createdAt, + required this.visibility, + required this.upvotes, + required this.downvotes, + this.tags, + }); + + factory Quote({ + required int id, + required int userId, + required String text, + String? authorName, + required double lat, + required double lng, + required String geohash, + required DateTime createdAt, + required int visibility, + required int upvotes, + required int downvotes, + List? tags, + }) = _QuoteImpl; + + factory Quote.fromJson(Map jsonSerialization) { + return Quote( + id: jsonSerialization['id'] as int, + userId: jsonSerialization['userId'] as int, + text: jsonSerialization['text'] as String, + authorName: jsonSerialization['authorName'] as String?, + lat: (jsonSerialization['lat'] as num).toDouble(), + lng: (jsonSerialization['lng'] as num).toDouble(), + geohash: jsonSerialization['geohash'] as String, + createdAt: + _i1.DateTimeJsonExtension.fromJson(jsonSerialization['createdAt']), + visibility: jsonSerialization['visibility'] as int, + upvotes: jsonSerialization['upvotes'] as int, + downvotes: jsonSerialization['downvotes'] as int, + tags: (jsonSerialization['tags'] as List?) + ?.map((e) => e as String) + .toList(), + ); + } + + int id; + + int userId; + + String text; + + String? authorName; + + double lat; + + double lng; + + String geohash; + + DateTime createdAt; + + int visibility; + + int upvotes; + + int downvotes; + + List? tags; + + /// Returns a shallow copy of this [Quote] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + Quote copyWith({ + int? id, + int? userId, + String? text, + String? authorName, + double? lat, + double? lng, + String? geohash, + DateTime? createdAt, + int? visibility, + int? upvotes, + int? downvotes, + List? tags, + }); + @override + Map toJson() { + return { + 'id': id, + 'userId': userId, + 'text': text, + if (authorName != null) 'authorName': authorName, + 'lat': lat, + 'lng': lng, + 'geohash': geohash, + 'createdAt': createdAt.toJson(), + 'visibility': visibility, + 'upvotes': upvotes, + 'downvotes': downvotes, + if (tags != null) 'tags': tags?.toJson(), + }; + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _Undefined {} + +class _QuoteImpl extends Quote { + _QuoteImpl({ + required int id, + required int userId, + required String text, + String? authorName, + required double lat, + required double lng, + required String geohash, + required DateTime createdAt, + required int visibility, + required int upvotes, + required int downvotes, + List? tags, + }) : super._( + id: id, + userId: userId, + text: text, + authorName: authorName, + lat: lat, + lng: lng, + geohash: geohash, + createdAt: createdAt, + visibility: visibility, + upvotes: upvotes, + downvotes: downvotes, + tags: tags, + ); + + /// Returns a shallow copy of this [Quote] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + Quote copyWith({ + int? id, + int? userId, + String? text, + Object? authorName = _Undefined, + double? lat, + double? lng, + String? geohash, + DateTime? createdAt, + int? visibility, + int? upvotes, + int? downvotes, + Object? tags = _Undefined, + }) { + return Quote( + id: id ?? this.id, + userId: userId ?? this.userId, + text: text ?? this.text, + authorName: authorName is String? ? authorName : this.authorName, + lat: lat ?? this.lat, + lng: lng ?? this.lng, + geohash: geohash ?? this.geohash, + createdAt: createdAt ?? this.createdAt, + visibility: visibility ?? this.visibility, + upvotes: upvotes ?? this.upvotes, + downvotes: downvotes ?? this.downvotes, + tags: tags is List? ? tags : this.tags?.map((e0) => e0).toList(), + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index 25c4573..399a21e 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -11,6 +11,7 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; import '../greeting_endpoint.dart' as _i2; +import '../quotes/location_endpoint.dart' as _i3; class Endpoints extends _i1.EndpointDispatch { @override @@ -21,7 +22,13 @@ class Endpoints extends _i1.EndpointDispatch { server, 'greeting', null, - ) + ), + 'recipe': _i3.RecipeEndpoint() + ..initialize( + server, + 'recipe', + null, + ), }; connectors['greeting'] = _i1.EndpointConnector( name: 'greeting', @@ -47,5 +54,29 @@ class Endpoints extends _i1.EndpointDispatch { ) }, ); + connectors['recipe'] = _i1.EndpointConnector( + name: 'recipe', + endpoint: endpoints['recipe']!, + methodConnectors: { + 'postQuote': _i1.MethodConnector( + name: 'postQuote', + params: { + 'quote': _i1.ParameterDescription( + name: 'quote', + type: _i1.getType(), + nullable: false, + ) + }, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['recipe'] as _i3.RecipeEndpoint).postQuote( + session, + params['quote'], + ), + ) + }, + ); } } diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart index 1bd69cc..7187a0b 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart @@ -12,7 +12,11 @@ import 'package:serverpod/serverpod.dart' as _i1; import 'package:serverpod/protocol.dart' as _i2; import 'greeting.dart' as _i3; +import 'quotes/create_quote.dart' as _i4; +import 'quotes/quote.dart' as _i5; export 'greeting.dart'; +export 'quotes/create_quote.dart'; +export 'quotes/quote.dart'; class Protocol extends _i1.SerializationManagerServer { Protocol._(); @@ -34,9 +38,31 @@ class Protocol extends _i1.SerializationManagerServer { if (t == _i3.Greeting) { return _i3.Greeting.fromJson(data) as T; } + if (t == _i4.CreateQuoteRequest) { + return _i4.CreateQuoteRequest.fromJson(data) as T; + } + if (t == _i5.Quote) { + return _i5.Quote.fromJson(data) as T; + } if (t == _i1.getType<_i3.Greeting?>()) { return (data != null ? _i3.Greeting.fromJson(data) : null) as T; } + if (t == _i1.getType<_i4.CreateQuoteRequest?>()) { + return (data != null ? _i4.CreateQuoteRequest.fromJson(data) : null) as T; + } + if (t == _i1.getType<_i5.Quote?>()) { + return (data != null ? _i5.Quote.fromJson(data) : null) as T; + } + if (t == _i1.getType?>()) { + return (data != null + ? (data as List).map((e) => deserialize(e)).toList() + : null) as T; + } + if (t == _i1.getType?>()) { + return (data != null + ? (data as List).map((e) => deserialize(e)).toList() + : null) as T; + } try { return _i2.Protocol().deserialize(data, t); } on _i1.DeserializationTypeNotFoundException catch (_) {} @@ -50,6 +76,12 @@ class Protocol extends _i1.SerializationManagerServer { if (data is _i3.Greeting) { return 'Greeting'; } + if (data is _i4.CreateQuoteRequest) { + return 'CreateQuoteRequest'; + } + if (data is _i5.Quote) { + return 'Quote'; + } className = _i2.Protocol().getClassNameForObject(data); if (className != null) { return 'serverpod.$className'; @@ -66,6 +98,12 @@ class Protocol extends _i1.SerializationManagerServer { if (dataClassName == 'Greeting') { return deserialize<_i3.Greeting>(data['data']); } + if (dataClassName == 'CreateQuoteRequest') { + return deserialize<_i4.CreateQuoteRequest>(data['data']); + } + if (dataClassName == 'Quote') { + return deserialize<_i5.Quote>(data['data']); + } if (dataClassName.startsWith('serverpod.')) { data['className'] = dataClassName.substring(10); return _i2.Protocol().deserializeByClassName(data); diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml index 9a4113d..2f46503 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml @@ -1,2 +1,4 @@ greeting: - hello: +recipe: + - postQuote: diff --git a/wien_talks/wien_talks_server/lib/src/generated/quotes/create_quote.dart b/wien_talks/wien_talks_server/lib/src/generated/quotes/create_quote.dart new file mode 100644 index 0000000..8b4a986 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/generated/quotes/create_quote.dart @@ -0,0 +1,128 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod/serverpod.dart' as _i1; + +abstract class CreateQuoteRequest + implements _i1.SerializableModel, _i1.ProtocolSerialization { + CreateQuoteRequest._({ + required this.text, + this.authorName, + required this.lat, + required this.lng, + this.tags, + }); + + factory CreateQuoteRequest({ + required String text, + String? authorName, + required double lat, + required double lng, + List? tags, + }) = _CreateQuoteRequestImpl; + + factory CreateQuoteRequest.fromJson(Map jsonSerialization) { + return CreateQuoteRequest( + text: jsonSerialization['text'] as String, + authorName: jsonSerialization['authorName'] as String?, + lat: (jsonSerialization['lat'] as num).toDouble(), + lng: (jsonSerialization['lng'] as num).toDouble(), + tags: (jsonSerialization['tags'] as List?) + ?.map((e) => e as String) + .toList(), + ); + } + + String text; + + String? authorName; + + double lat; + + double lng; + + List? tags; + + /// Returns a shallow copy of this [CreateQuoteRequest] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + CreateQuoteRequest copyWith({ + String? text, + String? authorName, + double? lat, + double? lng, + List? tags, + }); + @override + Map toJson() { + return { + 'text': text, + if (authorName != null) 'authorName': authorName, + 'lat': lat, + 'lng': lng, + if (tags != null) 'tags': tags?.toJson(), + }; + } + + @override + Map toJsonForProtocol() { + return { + 'text': text, + if (authorName != null) 'authorName': authorName, + 'lat': lat, + 'lng': lng, + if (tags != null) 'tags': tags?.toJson(), + }; + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _Undefined {} + +class _CreateQuoteRequestImpl extends CreateQuoteRequest { + _CreateQuoteRequestImpl({ + required String text, + String? authorName, + required double lat, + required double lng, + List? tags, + }) : super._( + text: text, + authorName: authorName, + lat: lat, + lng: lng, + tags: tags, + ); + + /// Returns a shallow copy of this [CreateQuoteRequest] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + CreateQuoteRequest copyWith({ + String? text, + Object? authorName = _Undefined, + double? lat, + double? lng, + Object? tags = _Undefined, + }) { + return CreateQuoteRequest( + text: text ?? this.text, + authorName: authorName is String? ? authorName : this.authorName, + lat: lat ?? this.lat, + lng: lng ?? this.lng, + tags: tags is List? ? tags : this.tags?.map((e0) => e0).toList(), + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/generated/quotes/quote.dart b/wien_talks/wien_talks_server/lib/src/generated/quotes/quote.dart new file mode 100644 index 0000000..8e1ee3a --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/generated/quotes/quote.dart @@ -0,0 +1,213 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod/serverpod.dart' as _i1; + +abstract class Quote + implements _i1.SerializableModel, _i1.ProtocolSerialization { + Quote._({ + required this.id, + required this.userId, + required this.text, + this.authorName, + required this.lat, + required this.lng, + required this.geohash, + required this.createdAt, + required this.visibility, + required this.upvotes, + required this.downvotes, + this.tags, + }); + + factory Quote({ + required int id, + required int userId, + required String text, + String? authorName, + required double lat, + required double lng, + required String geohash, + required DateTime createdAt, + required int visibility, + required int upvotes, + required int downvotes, + List? tags, + }) = _QuoteImpl; + + factory Quote.fromJson(Map jsonSerialization) { + return Quote( + id: jsonSerialization['id'] as int, + userId: jsonSerialization['userId'] as int, + text: jsonSerialization['text'] as String, + authorName: jsonSerialization['authorName'] as String?, + lat: (jsonSerialization['lat'] as num).toDouble(), + lng: (jsonSerialization['lng'] as num).toDouble(), + geohash: jsonSerialization['geohash'] as String, + createdAt: + _i1.DateTimeJsonExtension.fromJson(jsonSerialization['createdAt']), + visibility: jsonSerialization['visibility'] as int, + upvotes: jsonSerialization['upvotes'] as int, + downvotes: jsonSerialization['downvotes'] as int, + tags: (jsonSerialization['tags'] as List?) + ?.map((e) => e as String) + .toList(), + ); + } + + int id; + + int userId; + + String text; + + String? authorName; + + double lat; + + double lng; + + String geohash; + + DateTime createdAt; + + int visibility; + + int upvotes; + + int downvotes; + + List? tags; + + /// Returns a shallow copy of this [Quote] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + Quote copyWith({ + int? id, + int? userId, + String? text, + String? authorName, + double? lat, + double? lng, + String? geohash, + DateTime? createdAt, + int? visibility, + int? upvotes, + int? downvotes, + List? tags, + }); + @override + Map toJson() { + return { + 'id': id, + 'userId': userId, + 'text': text, + if (authorName != null) 'authorName': authorName, + 'lat': lat, + 'lng': lng, + 'geohash': geohash, + 'createdAt': createdAt.toJson(), + 'visibility': visibility, + 'upvotes': upvotes, + 'downvotes': downvotes, + if (tags != null) 'tags': tags?.toJson(), + }; + } + + @override + Map toJsonForProtocol() { + return { + 'id': id, + 'userId': userId, + 'text': text, + if (authorName != null) 'authorName': authorName, + 'lat': lat, + 'lng': lng, + 'geohash': geohash, + 'createdAt': createdAt.toJson(), + 'visibility': visibility, + 'upvotes': upvotes, + 'downvotes': downvotes, + if (tags != null) 'tags': tags?.toJson(), + }; + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _Undefined {} + +class _QuoteImpl extends Quote { + _QuoteImpl({ + required int id, + required int userId, + required String text, + String? authorName, + required double lat, + required double lng, + required String geohash, + required DateTime createdAt, + required int visibility, + required int upvotes, + required int downvotes, + List? tags, + }) : super._( + id: id, + userId: userId, + text: text, + authorName: authorName, + lat: lat, + lng: lng, + geohash: geohash, + createdAt: createdAt, + visibility: visibility, + upvotes: upvotes, + downvotes: downvotes, + tags: tags, + ); + + /// Returns a shallow copy of this [Quote] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + Quote copyWith({ + int? id, + int? userId, + String? text, + Object? authorName = _Undefined, + double? lat, + double? lng, + String? geohash, + DateTime? createdAt, + int? visibility, + int? upvotes, + int? downvotes, + Object? tags = _Undefined, + }) { + return Quote( + id: id ?? this.id, + userId: userId ?? this.userId, + text: text ?? this.text, + authorName: authorName is String? ? authorName : this.authorName, + lat: lat ?? this.lat, + lng: lng ?? this.lng, + geohash: geohash ?? this.geohash, + createdAt: createdAt ?? this.createdAt, + visibility: visibility ?? this.visibility, + upvotes: upvotes ?? this.upvotes, + downvotes: downvotes ?? this.downvotes, + tags: tags is List? ? tags : this.tags?.map((e0) => e0).toList(), + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/quotes/create_quote.spy.yaml b/wien_talks/wien_talks_server/lib/src/quotes/create_quote.spy.yaml new file mode 100644 index 0000000..799ba9d --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/quotes/create_quote.spy.yaml @@ -0,0 +1,7 @@ + class: CreateQuoteRequest + fields: + text: String + authorName: String? + lat: double + lng: double + tags: List? diff --git a/wien_talks/wien_talks_server/lib/src/quotes/location_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/location_endpoint.dart new file mode 100644 index 0000000..406eb7d --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/quotes/location_endpoint.dart @@ -0,0 +1,12 @@ +import 'dart:async'; + +import 'package:serverpod/serverpod.dart'; + +class RecipeEndpoint extends Endpoint { + Future postQuote(Session session, String quote) async { + // validate content + + // persist quote + return Future.value('none'); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quote.spy.yaml b/wien_talks/wien_talks_server/lib/src/quotes/quote.spy.yaml new file mode 100644 index 0000000..f84c340 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/quotes/quote.spy.yaml @@ -0,0 +1,14 @@ +class: Quote +fields: + id: int + userId: int + text: String + authorName: String? + lat: double + lng: double + geohash: String + createdAt: DateTime + visibility: int + upvotes: int + downvotes: int + tags: List? diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index d9ec37d..02dbd91 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -102,6 +102,8 @@ void withServerpod( class TestEndpoints { late final _GreetingEndpoint greeting; + + late final _RecipeEndpoint recipe; } class _InternalTestEndpoints extends TestEndpoints @@ -115,6 +117,10 @@ class _InternalTestEndpoints extends TestEndpoints endpoints, serializationManager, ); + recipe = _RecipeEndpoint( + endpoints, + serializationManager, + ); } } @@ -157,3 +163,43 @@ class _GreetingEndpoint { }); } } + +class _RecipeEndpoint { + _RecipeEndpoint( + this._endpointDispatch, + this._serializationManager, + ); + + final _i2.EndpointDispatch _endpointDispatch; + + final _i2.SerializationManager _serializationManager; + + _i3.Future postQuote( + _i1.TestSessionBuilder sessionBuilder, + String quote, + ) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'recipe', + method: 'postQuote', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'recipe', + methodName: 'postQuote', + parameters: _i1.testObjectToJson({'quote': quote}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } +} From 1f9af9183e8a9378378064d84cdcaf97113ac7db Mon Sep 17 00:00:00 2001 From: mikes222 Date: Sat, 16 Aug 2025 13:04:13 +0200 Subject: [PATCH 05/49] Prepare for location-implementation --- wien_talks/wien_talks_client/.idea/.gitignore | 3 + .../.idea/caches/deviceStreaming.xml | 835 ++++++++++++++++++ wien_talks/wien_talks_client/.idea/misc.xml | 6 + .../wien_talks_client/.idea/modules.xml | 8 + wien_talks/wien_talks_client/.idea/vcs.xml | 6 + .../.idea/wien_talks_client.iml | 13 + wien_talks/wien_talks_client/pubspec.yaml | 2 + .../android/app/src/main/AndroidManifest.xml | 3 + .../lib/create_event_screen.dart | 18 + .../lib/get_location_widget.dart | 32 + .../wien_talks_flutter/lib/go_router.dart | 13 + .../wien_talks_flutter/lib/location_mgr.dart | 39 + wien_talks/wien_talks_flutter/lib/main.dart | 15 +- .../wien_talks_flutter/lib/news_screen.dart | 33 + .../lib/widgets/heading_text.dart | 18 + .../lib/widgets/screen_widget.dart | 21 + .../Flutter/GeneratedPluginRegistrant.swift | 2 + wien_talks/wien_talks_flutter/pubspec.lock | 42 +- wien_talks/wien_talks_flutter/pubspec.yaml | 7 +- 19 files changed, 1107 insertions(+), 9 deletions(-) create mode 100644 wien_talks/wien_talks_client/.idea/.gitignore create mode 100644 wien_talks/wien_talks_client/.idea/caches/deviceStreaming.xml create mode 100644 wien_talks/wien_talks_client/.idea/misc.xml create mode 100644 wien_talks/wien_talks_client/.idea/modules.xml create mode 100644 wien_talks/wien_talks_client/.idea/vcs.xml create mode 100644 wien_talks/wien_talks_client/.idea/wien_talks_client.iml create mode 100644 wien_talks/wien_talks_flutter/lib/create_event_screen.dart create mode 100644 wien_talks/wien_talks_flutter/lib/get_location_widget.dart create mode 100644 wien_talks/wien_talks_flutter/lib/go_router.dart create mode 100644 wien_talks/wien_talks_flutter/lib/location_mgr.dart create mode 100644 wien_talks/wien_talks_flutter/lib/news_screen.dart create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/heading_text.dart create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart diff --git a/wien_talks/wien_talks_client/.idea/.gitignore b/wien_talks/wien_talks_client/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/wien_talks/wien_talks_client/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/wien_talks/wien_talks_client/.idea/caches/deviceStreaming.xml b/wien_talks/wien_talks_client/.idea/caches/deviceStreaming.xml new file mode 100644 index 0000000..9aaec77 --- /dev/null +++ b/wien_talks/wien_talks_client/.idea/caches/deviceStreaming.xml @@ -0,0 +1,835 @@ + + + + + + \ No newline at end of file diff --git a/wien_talks/wien_talks_client/.idea/misc.xml b/wien_talks/wien_talks_client/.idea/misc.xml new file mode 100644 index 0000000..1945ce5 --- /dev/null +++ b/wien_talks/wien_talks_client/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/wien_talks/wien_talks_client/.idea/modules.xml b/wien_talks/wien_talks_client/.idea/modules.xml new file mode 100644 index 0000000..317fd21 --- /dev/null +++ b/wien_talks/wien_talks_client/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/wien_talks/wien_talks_client/.idea/vcs.xml b/wien_talks/wien_talks_client/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/wien_talks/wien_talks_client/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/wien_talks/wien_talks_client/.idea/wien_talks_client.iml b/wien_talks/wien_talks_client/.idea/wien_talks_client.iml new file mode 100644 index 0000000..0cf94bd --- /dev/null +++ b/wien_talks/wien_talks_client/.idea/wien_talks_client.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/wien_talks/wien_talks_client/pubspec.yaml b/wien_talks/wien_talks_client/pubspec.yaml index 223e12d..2e6dc95 100644 --- a/wien_talks/wien_talks_client/pubspec.yaml +++ b/wien_talks/wien_talks_client/pubspec.yaml @@ -5,4 +5,6 @@ environment: sdk: '>=3.5.0 <4.0.0' dependencies: + serverpod_client: 2.9.1 + diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/AndroidManifest.xml b/wien_talks/wien_talks_flutter/android/app/src/main/AndroidManifest.xml index 8d61822..fd81ced 100644 --- a/wien_talks/wien_talks_flutter/android/app/src/main/AndroidManifest.xml +++ b/wien_talks/wien_talks_flutter/android/app/src/main/AndroidManifest.xml @@ -42,4 +42,7 @@ + + +
diff --git a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart b/wien_talks/wien_talks_flutter/lib/create_event_screen.dart new file mode 100644 index 0000000..00c755a --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/create_event_screen.dart @@ -0,0 +1,18 @@ +import 'package:flutter/cupertino.dart'; +import 'package:wien_talks_flutter/get_location_widget.dart'; +import 'package:wien_talks_flutter/widgets/screen_widget.dart'; + +class CreateEventScreen extends StatelessWidget { + const CreateEventScreen({super.key}); + + @override + Widget build(BuildContext context) { + return ScreenWidget( + child: Column( + children: [ + Text("hello"), + GetLocationWidget(), + ], + )); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/get_location_widget.dart b/wien_talks/wien_talks_flutter/lib/get_location_widget.dart new file mode 100644 index 0000000..f0c0d0d --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/get_location_widget.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:wien_talks_flutter/location_mgr.dart'; + +class GetLocationWidget extends StatelessWidget { + const GetLocationWidget({super.key}); + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: LocationMgr().startup(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.waiting: + return CircularProgressIndicator(); + case ConnectionState.done: + { + if (snapshot.hasData) { + // Error occured + return Text(snapshot.data.toString()); + } else { + return Text("No data -> OK"); + } + } + default: + if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } + return Text("OK"); + } + }); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/go_router.dart b/wien_talks/wien_talks_flutter/lib/go_router.dart new file mode 100644 index 0000000..40fb9e9 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/go_router.dart @@ -0,0 +1,13 @@ +import 'package:go_router/go_router.dart'; +import 'package:wien_talks_flutter/create_event_screen.dart'; +import 'package:wien_talks_flutter/news_screen.dart'; + +final router = GoRouter( + routes: [ + GoRoute( + path: '/', + builder: (context, state) => NewsScreen(), + ), + GoRoute(path: '/create_event', name: 'create_event', builder: (context, state) => CreateEventScreen()), + ], +); diff --git a/wien_talks/wien_talks_flutter/lib/location_mgr.dart b/wien_talks/wien_talks_flutter/lib/location_mgr.dart new file mode 100644 index 0000000..c2f7509 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/location_mgr.dart @@ -0,0 +1,39 @@ +import 'package:location/location.dart'; + +class LocationMgr { + Location location = Location(); + + bool serviceEnabled = false; + + PermissionStatus permissionGranted = PermissionStatus.denied; + + LocationData? locationData; + + static LocationMgr? _instance; + + factory LocationMgr() { + _instance ??= LocationMgr._(); + return _instance!; + } + + LocationMgr._(); + + Future startup() async { + serviceEnabled = await location.serviceEnabled(); + if (!serviceEnabled) { + serviceEnabled = await location.requestService(); + if (!serviceEnabled) { + return "Service is not enabled"; + } + } + + permissionGranted = await location.hasPermission(); + if (permissionGranted == PermissionStatus.denied) { + permissionGranted = await location.requestPermission(); + if (permissionGranted != PermissionStatus.granted) { + return "No permissions granted"; + } + } + return null; + } +} diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index 69c728d..b1326db 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -1,6 +1,7 @@ -import 'package:wien_talks_client/wien_talks_client.dart'; import 'package:flutter/material.dart'; import 'package:serverpod_flutter/serverpod_flutter.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/go_router.dart'; /// Sets up a global client object that can be used to talk to the server from /// anywhere in our app. The client is generated from your server code @@ -20,11 +21,9 @@ void main() { // You can set the variable when running or building your app like this: // E.g. `flutter run --dart-define=SERVER_URL=https://api.example.com/` const serverUrlFromEnv = String.fromEnvironment('SERVER_URL'); - final serverUrl = - serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; + final serverUrl = serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; - client = Client(serverUrl) - ..connectivityMonitor = FlutterConnectivityMonitor(); + client = Client(serverUrl)..connectivityMonitor = FlutterConnectivityMonitor(); runApp(const MyApp()); } @@ -34,10 +33,12 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( + return MaterialApp.router( title: 'Serverpod Demo', theme: ThemeData(primarySwatch: Colors.blue), - home: const MyHomePage(title: 'Serverpod Example'), + routerConfig: router, + //home: NewsScreen(), + //home: const MyHomePage(title: 'Serverpod Example'), ); } } diff --git a/wien_talks/wien_talks_flutter/lib/news_screen.dart b/wien_talks/wien_talks_flutter/lib/news_screen.dart new file mode 100644 index 0000000..5cdd782 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/news_screen.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:wien_talks_flutter/widgets/heading_text.dart'; +import 'package:wien_talks_flutter/widgets/screen_widget.dart'; + +class NewsScreen extends StatelessWidget { + const NewsScreen({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return ScreenWidget( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + HeadingText(text: "Latest news"), + ...[Text("News 1"), Text("News 2")], + SizedBox( + height: 30, + ), + OutlinedButton( + onPressed: () { + context.pushNamed("create_event"); + }, + child: Text("Submit your own event")), + ], + ), + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/heading_text.dart b/wien_talks/wien_talks_flutter/lib/widgets/heading_text.dart new file mode 100644 index 0000000..9aeb9f8 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/heading_text.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; + +class HeadingText extends StatelessWidget { + final String text; + + const HeadingText({super.key, required this.text}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 20, bottom: 10), + child: Text( + text, + style: Theme.of(context).textTheme.headlineLarge, + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart new file mode 100644 index 0000000..26638d4 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class ScreenWidget extends StatelessWidget { + final Widget child; + + const ScreenWidget({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('News'), + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: child, + )), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift index ad535f5..67b21c7 100644 --- a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,7 +6,9 @@ import FlutterMacOS import Foundation import connectivity_plus +import location func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) + LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) } diff --git a/wien_talks/wien_talks_flutter/pubspec.lock b/wien_talks/wien_talks_flutter/pubspec.lock index f06f119..0558773 100644 --- a/wien_talks/wien_talks_flutter/pubspec.lock +++ b/wien_talks/wien_talks_flutter/pubspec.lock @@ -136,6 +136,14 @@ packages: description: flutter source: sdk version: "0.0.0" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: "8b1f37dfaf6e958c6b872322db06f946509433bec3de753c3491a42ae9ec2b48" + url: "https://pub.dev" + source: hosted + version: "16.1.0" http: dependency: transitive description: @@ -184,6 +192,38 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.0" + location: + dependency: "direct main" + description: + name: location + sha256: b080053c181c7d152c43dd576eec6436c40e25f326933051c330da563ddd5333 + url: "https://pub.dev" + source: hosted + version: "8.0.1" + location_platform_interface: + dependency: transitive + description: + name: location_platform_interface + sha256: ca8700bb3f6b1e8b2afbd86bd78b2280d116c613ca7bfa1d4d7b64eba357d749 + url: "https://pub.dev" + source: hosted + version: "6.0.1" + location_web: + dependency: transitive + description: + name: location_web + sha256: b8e3add5efe0d65c5e692b7a135d80a4015c580d3ea646fa71973e97668dd868 + url: "https://pub.dev" + source: hosted + version: "6.0.1" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" matcher: dependency: transitive description: @@ -406,4 +446,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.8.0 <4.0.0" - flutter: ">=3.24.0" + flutter: ">=3.27.0" diff --git a/wien_talks/wien_talks_flutter/pubspec.yaml b/wien_talks/wien_talks_flutter/pubspec.yaml index 3f0110a..5490c5a 100644 --- a/wien_talks/wien_talks_flutter/pubspec.yaml +++ b/wien_talks/wien_talks_flutter/pubspec.yaml @@ -24,11 +24,16 @@ environment: dependencies: flutter: sdk: flutter + + go_router: ^16.1.0 + + location: ^8.0.1 + serverpod_flutter: 2.9.1 + wien_talks_client: path: ../wien_talks_client - # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.5 From b89bfd7bdc32f774391fb13cd7ab9565ba65e935 Mon Sep 17 00:00:00 2001 From: mikes222 Date: Sat, 16 Aug 2025 13:54:50 +0200 Subject: [PATCH 06/49] Input form created, location now working --- .gitignore | 1 + .../lib/create_event_screen.dart | 2 + .../lib/get_location_widget.dart | 48 +- .../wien_talks_flutter/lib/location_mgr.dart | 22 +- .../lib/models/news_event_model.dart | 34 ++ .../lib/news_input_form.dart | 71 +++ wien_talks/wien_talks_flutter/pubspec.lock | 449 ------------------ wien_talks/wien_talks_flutter/pubspec.yaml | 4 +- 8 files changed, 159 insertions(+), 472 deletions(-) create mode 100644 .gitignore create mode 100644 wien_talks/wien_talks_flutter/lib/models/news_event_model.dart create mode 100644 wien_talks/wien_talks_flutter/lib/news_input_form.dart delete mode 100644 wien_talks/wien_talks_flutter/pubspec.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc57b2b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +wien_talks/wien_talks_flutter/pubspec.lock diff --git a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart b/wien_talks/wien_talks_flutter/lib/create_event_screen.dart index 00c755a..bc50467 100644 --- a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/create_event_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:wien_talks_flutter/get_location_widget.dart'; +import 'package:wien_talks_flutter/news_input_form.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; class CreateEventScreen extends StatelessWidget { @@ -12,6 +13,7 @@ class CreateEventScreen extends StatelessWidget { children: [ Text("hello"), GetLocationWidget(), + NewsInputForm(onSubmit: (newsEventModel) {}), ], )); } diff --git a/wien_talks/wien_talks_flutter/lib/get_location_widget.dart b/wien_talks/wien_talks_flutter/lib/get_location_widget.dart index f0c0d0d..4fad495 100644 --- a/wien_talks/wien_talks_flutter/lib/get_location_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/get_location_widget.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:location/location.dart'; import 'package:wien_talks_flutter/location_mgr.dart'; class GetLocationWidget extends StatelessWidget { @@ -6,27 +7,32 @@ class GetLocationWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return FutureBuilder( - future: LocationMgr().startup(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - switch (snapshot.connectionState) { - case ConnectionState.waiting: - return CircularProgressIndicator(); - case ConnectionState.done: - { - if (snapshot.hasData) { - // Error occured - return Text(snapshot.data.toString()); - } else { - return Text("No data -> OK"); - } + return Column( + children: [ + FutureBuilder( + future: LocationMgr().startup(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.waiting: + return CircularProgressIndicator(); + case ConnectionState.done: + { + if (snapshot.hasData) { + // Error occured + return Text(snapshot.data.toString()); + } else { + return Text("No data -> OK"); + } + } + default: + if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } + return Text("OK"); } - default: - if (snapshot.hasError) { - return Text('Error: ${snapshot.error}'); - } - return Text("OK"); - } - }); + }), + StreamBuilder(stream: LocationMgr().stream, builder: (BuildContext context, AsyncSnapshot snapshot) => Text(snapshot.data.toString())), + ], + ); } } diff --git a/wien_talks/wien_talks_flutter/lib/location_mgr.dart b/wien_talks/wien_talks_flutter/lib/location_mgr.dart index c2f7509..1ab24b9 100644 --- a/wien_talks/wien_talks_flutter/lib/location_mgr.dart +++ b/wien_talks/wien_talks_flutter/lib/location_mgr.dart @@ -1,4 +1,7 @@ +import 'dart:async'; + import 'package:location/location.dart'; +import 'package:rxdart/rxdart.dart'; class LocationMgr { Location location = Location(); @@ -7,10 +10,14 @@ class LocationMgr { PermissionStatus permissionGranted = PermissionStatus.denied; - LocationData? locationData; + LocationData? _lastLocationData; static LocationMgr? _instance; + final Subject _subject = PublishSubject(); + + StreamSubscription? _subscription; + factory LocationMgr() { _instance ??= LocationMgr._(); return _instance!; @@ -34,6 +41,19 @@ class LocationMgr { return "No permissions granted"; } } + _subscription = location.onLocationChanged.listen((LocationData currentLocation) { + _lastLocationData = currentLocation; + _subject.add(currentLocation); + }); return null; } + + void shutdown() { + _subscription?.cancel(); + _subscription = null; + } + + Stream get stream => _subject.stream; + + LocationData? get lastLocation => _lastLocationData; } diff --git a/wien_talks/wien_talks_flutter/lib/models/news_event_model.dart b/wien_talks/wien_talks_flutter/lib/models/news_event_model.dart new file mode 100644 index 0000000..d1fce39 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/models/news_event_model.dart @@ -0,0 +1,34 @@ +class NewsEventModel { + final String content; + + final DateTime timestamp; + + final double latitude; + + final double longitude; + + NewsEventModel({ + required this.content, + required this.timestamp, + required this.latitude, + required this.longitude, + }); + +// Convert NewsData to a Map + Map toJson() { + return { + 'content': content, + 'timestamp': timestamp.toIso8601String(), + }; + } + +// Create NewsData from a Map + factory NewsEventModel.fromJson(Map json) { + return NewsEventModel( + content: json['content'] as String, + timestamp: DateTime.parse(json['timestamp'] as String), + latitude: json['latitude'] as double, + longitude: json['longitude'] as double, + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/news_input_form.dart b/wien_talks/wien_talks_flutter/lib/news_input_form.dart new file mode 100644 index 0000000..0a99302 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/news_input_form.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:wien_talks_flutter/models/news_event_model.dart'; + +class NewsInputForm extends StatefulWidget { + final Function(NewsEventModel) onSubmit; + + const NewsInputForm({Key? key, required this.onSubmit}) : super(key: key); + + @override + _NewsInputFormState createState() => _NewsInputFormState(); +} + +class _NewsInputFormState extends State { + final _formKey = GlobalKey(); + final TextEditingController _newsController = TextEditingController(); + + @override + void dispose() { + _newsController.dispose(); + super.dispose(); + } + + void _submitForm() { + if (_formKey.currentState!.validate()) { + final newsData = NewsEventModel( + content: _newsController.text.trim(), + timestamp: DateTime.now(), + latitude: 0.0, + longitude: 0.0, + ); + widget.onSubmit(newsData); + _newsController.clear(); + } + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(16.0), + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + TextFormField( + controller: _newsController, + maxLines: 4, + decoration: const InputDecoration( + labelText: 'News', + hintText: 'Enter your news here...', + border: OutlineInputBorder(), + ), + validator: (value) { + if (value == null || value.trim().isEmpty) { + return 'Please enter some text'; + } + return null; + }, + ), + const SizedBox(height: 16.0), + ElevatedButton( + onPressed: _submitForm, + child: const Text('Submit News'), + ), + ], + ), + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/pubspec.lock b/wien_talks/wien_talks_flutter/pubspec.lock deleted file mode 100644 index 0558773..0000000 --- a/wien_talks/wien_talks_flutter/pubspec.lock +++ /dev/null @@ -1,449 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" - async: - dependency: transitive - description: - name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.dev" - source: hosted - version: "2.13.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - characters: - dependency: transitive - description: - name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - connectivity_plus: - dependency: transitive - description: - name: connectivity_plus - sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec - url: "https://pub.dev" - source: hosted - version: "6.1.5" - connectivity_plus_platform_interface: - dependency: transitive - description: - name: connectivity_plus_platform_interface - sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" - url: "https://pub.dev" - source: hosted - version: "2.0.1" - crypto: - dependency: transitive - description: - name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.dev" - source: hosted - version: "3.0.6" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" - source: hosted - version: "1.0.8" - dbus: - dependency: transitive - description: - name: dbus - sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.dev" - source: hosted - version: "0.7.11" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - ffi: - dependency: transitive - description: - name: ffi - sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" - source: hosted - version: "1.1.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - go_router: - dependency: "direct main" - description: - name: go_router - sha256: "8b1f37dfaf6e958c6b872322db06f946509433bec3de753c3491a42ae9ec2b48" - url: "https://pub.dev" - source: hosted - version: "16.1.0" - http: - dependency: transitive - description: - name: http - sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 - url: "https://pub.dev" - source: hosted - version: "1.5.0" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" - source: hosted - version: "4.1.2" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" - url: "https://pub.dev" - source: hosted - version: "10.0.9" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 - url: "https://pub.dev" - source: hosted - version: "3.0.9" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev" - source: hosted - version: "3.0.1" - lints: - dependency: transitive - description: - name: lints - sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 - url: "https://pub.dev" - source: hosted - version: "6.0.0" - location: - dependency: "direct main" - description: - name: location - sha256: b080053c181c7d152c43dd576eec6436c40e25f326933051c330da563ddd5333 - url: "https://pub.dev" - source: hosted - version: "8.0.1" - location_platform_interface: - dependency: transitive - description: - name: location_platform_interface - sha256: ca8700bb3f6b1e8b2afbd86bd78b2280d116c613ca7bfa1d4d7b64eba357d749 - url: "https://pub.dev" - source: hosted - version: "6.0.1" - location_web: - dependency: transitive - description: - name: location_web - sha256: b8e3add5efe0d65c5e692b7a135d80a4015c580d3ea646fa71973e97668dd868 - url: "https://pub.dev" - source: hosted - version: "6.0.1" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.dev" - source: hosted - version: "0.12.17" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" - source: hosted - version: "0.11.1" - meta: - dependency: transitive - description: - name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.dev" - source: hosted - version: "1.16.0" - nm: - dependency: transitive - description: - name: nm - sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" - url: "https://pub.dev" - source: hosted - version: "0.5.0" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - serverpod_client: - dependency: transitive - description: - name: serverpod_client - sha256: "04cb6d36730c8c24c067cde6e41551ad2dd7ae3725bbaa2756e82d2f5b345f54" - url: "https://pub.dev" - source: hosted - version: "2.9.1" - serverpod_flutter: - dependency: "direct main" - description: - name: serverpod_flutter - sha256: "1d9c2cb511581a7fdc1fc81ac5475ef75c0cf0a1c9181308e956db4818759bb7" - url: "https://pub.dev" - source: hosted - version: "2.9.1" - serverpod_serialization: - dependency: transitive - description: - name: serverpod_serialization - sha256: c301a5e45610c062e51e1ba580f51f3257c3404ce2dd2f7e216dccbd93869502 - url: "https://pub.dev" - source: hosted - version: "2.9.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - source_span: - dependency: transitive - description: - name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.dev" - source: hosted - version: "1.10.1" - sprintf: - dependency: transitive - description: - name: sprintf - sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd - url: "https://pub.dev" - source: hosted - version: "0.7.4" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - uuid: - dependency: transitive - description: - name: uuid - sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff - url: "https://pub.dev" - source: hosted - version: "4.5.1" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 - url: "https://pub.dev" - source: hosted - version: "15.0.0" - web: - dependency: transitive - description: - name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - web_socket: - dependency: transitive - description: - name: web_socket - sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 - url: "https://pub.dev" - source: hosted - version: "3.0.3" - wien_talks_client: - dependency: "direct main" - description: - path: "../wien_talks_client" - relative: true - source: path - version: "0.0.0" - xml: - dependency: transitive - description: - name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" - source: hosted - version: "6.5.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" - source: hosted - version: "3.1.3" -sdks: - dart: ">=3.8.0 <4.0.0" - flutter: ">=3.27.0" diff --git a/wien_talks/wien_talks_flutter/pubspec.yaml b/wien_talks/wien_talks_flutter/pubspec.yaml index 5490c5a..f0706d2 100644 --- a/wien_talks/wien_talks_flutter/pubspec.yaml +++ b/wien_talks/wien_talks_flutter/pubspec.yaml @@ -29,6 +29,8 @@ dependencies: location: ^8.0.1 + rxdart: ^0.28.0 + serverpod_flutter: 2.9.1 wien_talks_client: @@ -36,7 +38,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.5 + cupertino_icons: ^1.0.8 dev_dependencies: flutter_lints: '>=3.0.0 <7.0.0' From c952f17e3003e56a51738c26d3bc1c8c919a70e1 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 14:04:53 +0200 Subject: [PATCH 07/49] add auth module --- .../lib/src/protocol/client.dart | 34 ++-- .../lib/src/protocol/protocol.dart | 12 ++ wien_talks/wien_talks_server/lib/server.dart | 13 +- .../lib/src/generated/protocol.yaml | 2 - wien_talks/wien_talks_server/pubspec.lock | 160 ++++++++++++++++++ wien_talks/wien_talks_server/pubspec.yaml | 1 + .../test_tools/serverpod_test_tools.dart | 46 ----- 7 files changed, 195 insertions(+), 73 deletions(-) diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index de9b4df..99e1b50 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -12,7 +12,8 @@ import 'package:serverpod_client/serverpod_client.dart' as _i1; import 'dart:async' as _i2; import 'package:wien_talks_client/src/protocol/greeting.dart' as _i3; -import 'protocol.dart' as _i4; +import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i4; +import 'protocol.dart' as _i5; /// This is an example endpoint that returns a greeting message through /// its [hello] method. @@ -32,19 +33,12 @@ class EndpointGreeting extends _i1.EndpointRef { ); } -/// {@category Endpoint} -class EndpointRecipe extends _i1.EndpointRef { - EndpointRecipe(_i1.EndpointCaller caller) : super(caller); +class Modules { + Modules(Client client) { + auth = _i4.Caller(client); + } - @override - String get name => 'recipe'; - - _i2.Future postQuote(String quote) => - caller.callServerEndpoint( - 'recipe', - 'postQuote', - {'quote': quote}, - ); + late final _i4.Caller auth; } class Client extends _i1.ServerpodClientShared { @@ -63,7 +57,7 @@ class Client extends _i1.ServerpodClientShared { bool? disconnectStreamsOnLostInternetConnection, }) : super( host, - _i4.Protocol(), + _i5.Protocol(), securityContext: securityContext, authenticationKeyManager: authenticationKeyManager, streamingConnectionTimeout: streamingConnectionTimeout, @@ -74,19 +68,17 @@ class Client extends _i1.ServerpodClientShared { disconnectStreamsOnLostInternetConnection, ) { greeting = EndpointGreeting(this); - recipe = EndpointRecipe(this); + modules = Modules(this); } late final EndpointGreeting greeting; - late final EndpointRecipe recipe; + late final Modules modules; @override - Map get endpointRefLookup => { - 'greeting': greeting, - 'recipe': recipe, - }; + Map get endpointRefLookup => {'greeting': greeting}; @override - Map get moduleLookup => {}; + Map get moduleLookup => + {'auth': modules.auth}; } diff --git a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart index 5719c72..88a112d 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart @@ -13,6 +13,7 @@ import 'package:serverpod_client/serverpod_client.dart' as _i1; import 'greeting.dart' as _i2; import 'quotes/create_quote.dart' as _i3; import 'quotes/quote.dart' as _i4; +import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i5; export 'greeting.dart'; export 'quotes/create_quote.dart'; export 'quotes/quote.dart'; @@ -59,6 +60,9 @@ class Protocol extends _i1.SerializationManager { ? (data as List).map((e) => deserialize(e)).toList() : null) as T; } + try { + return _i5.Protocol().deserialize(data, t); + } on _i1.DeserializationTypeNotFoundException catch (_) {} return super.deserialize(data, t); } @@ -75,6 +79,10 @@ class Protocol extends _i1.SerializationManager { if (data is _i4.Quote) { return 'Quote'; } + className = _i5.Protocol().getClassNameForObject(data); + if (className != null) { + return 'serverpod_auth.$className'; + } return null; } @@ -93,6 +101,10 @@ class Protocol extends _i1.SerializationManager { if (dataClassName == 'Quote') { return deserialize<_i4.Quote>(data['data']); } + if (dataClassName.startsWith('serverpod_auth.')) { + data['className'] = dataClassName.substring(15); + return _i5.Protocol().deserializeByClassName(data); + } return super.deserializeByClassName(data); } } diff --git a/wien_talks/wien_talks_server/lib/server.dart b/wien_talks/wien_talks_server/lib/server.dart index f69fa35..ed0e06c 100644 --- a/wien_talks/wien_talks_server/lib/server.dart +++ b/wien_talks/wien_talks_server/lib/server.dart @@ -1,10 +1,10 @@ -import 'package:wien_talks_server/src/birthday_reminder.dart'; import 'package:serverpod/serverpod.dart'; - +import 'package:serverpod_auth_server/serverpod_auth_server.dart' as auth; +import 'package:wien_talks_server/src/birthday_reminder.dart'; import 'package:wien_talks_server/src/web/routes/root.dart'; -import 'src/generated/protocol.dart'; import 'src/generated/endpoints.dart'; +import 'src/generated/protocol.dart'; // This is the starting point of your Serverpod server. In most cases, you will // only need to make additions to this file if you add future calls, are @@ -12,7 +12,12 @@ import 'src/generated/endpoints.dart'; void run(List args) async { // Initialize Serverpod and connect it with your generated code. - final pod = Serverpod(args, Protocol(), Endpoints()); + final pod = Serverpod( + args, + Protocol(), + Endpoints(), + authenticationHandler: auth.authenticationHandler, + ); // Setup a default page at the web root. pod.webServer.addRoute(RouteRoot(), '/'); diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml index 2f46503..9a4113d 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml @@ -1,4 +1,2 @@ greeting: - hello: -recipe: - - postQuote: diff --git a/wien_talks/wien_talks_server/pubspec.lock b/wien_talks/wien_talks_server/pubspec.lock index 3112221..8cadb10 100644 --- a/wien_talks/wien_talks_server/pubspec.lock +++ b/wien_talks/wien_talks_server/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _discoveryapis_commons: + dependency: transitive + description: + name: _discoveryapis_commons + sha256: "113c4100b90a5b70a983541782431b82168b3cae166ab130649c36eb3559d498" + url: "https://pub.dev" + source: hosted + version: "1.0.7" _fe_analyzer_shared: dependency: transitive description: @@ -17,6 +25,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.1.1" + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" args: dependency: transitive description: @@ -25,6 +41,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.7.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" + url: "https://pub.dev" + source: hosted + version: "1.6.5" async: dependency: transitive description: @@ -65,6 +89,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" collection: dependency: transitive description: @@ -97,6 +129,30 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.6" + crypto_keys: + dependency: transitive + description: + name: crypto_keys + sha256: acc19abf34623d990a0e8aec69463d74a824c31f137128f42e2810befc509ad0 + url: "https://pub.dev" + source: hosted + version: "0.3.0+1" + email_validator: + dependency: transitive + description: + name: email_validator + sha256: b19aa5d92fdd76fbc65112060c94d45ba855105a28bb6e462de7ff03b12fa1fb + url: "https://pub.dev" + source: hosted + version: "3.0.0" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" file: dependency: transitive description: @@ -137,6 +193,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.3" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5d187c46dc59e02646e10fe82665fc3884a9b71bc1c90c2b8b749316d33ee454" + url: "https://pub.dev" + source: hosted + version: "0.3.3+1" + googleapis: + dependency: transitive + description: + name: googleapis + sha256: "5c9e0f25be1dec13d8d2158263141104c51b5ba83487537c17a2330581e505ee" + url: "https://pub.dev" + source: hosted + version: "14.0.0" + googleapis_auth: + dependency: transitive + description: + name: googleapis_auth + sha256: b81fe352cc4a330b3710d2b7ad258d9bcef6f909bb759b306bf42973a7d046db + url: "https://pub.dev" + source: hosted + version: "2.0.0" http: dependency: transitive description: @@ -161,6 +241,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" + url: "https://pub.dev" + source: hosted + version: "4.5.4" io: dependency: transitive description: @@ -169,6 +257,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + jose: + dependency: transitive + description: + name: jose + sha256: "7955ec5d131960104e81fbf151abacb9d835c16c9e793ed394b2809f28b2198d" + url: "https://pub.dev" + source: hosted + version: "0.3.4" js: dependency: transitive description: @@ -233,6 +329,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" + openid_client: + dependency: transitive + description: + name: openid_client + sha256: "1d39a829dc770947bf8ec8684a3456743ef0205a777371efe16773a44163eb6a" + url: "https://pub.dev" + source: hosted + version: "0.4.9" package_config: dependency: transitive description: @@ -249,6 +353,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" + url: "https://pub.dev" + source: hosted + version: "7.0.1" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" pool: dependency: transitive description: @@ -257,6 +377,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + posix: + dependency: transitive + description: + name: posix + sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" + url: "https://pub.dev" + source: hosted + version: "6.0.3" postgres: dependency: transitive description: @@ -273,6 +401,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + quiver: + dependency: transitive + description: + name: quiver + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 + url: "https://pub.dev" + source: hosted + version: "3.2.2" redis: dependency: transitive description: @@ -313,6 +449,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.9.1" + serverpod_auth_server: + dependency: "direct main" + description: + name: serverpod_auth_server + sha256: ad393f09b5ed82b624c9d299b61d945fb07729a0a704faa67795588200168369 + url: "https://pub.dev" + source: hosted + version: "2.9.1" serverpod_lints: dependency: transitive description: @@ -561,6 +705,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" + x509: + dependency: transitive + description: + name: x509 + sha256: cbd1a63846884afd273cda247b0365284c8d85a365ca98e110413f93d105b935 + url: "https://pub.dev" + source: hosted + version: "0.2.4+3" + xml: + dependency: transitive + description: + name: xml + sha256: "3202a47961c1a0af6097c9f8c1b492d705248ba309e6f7a72410422c05046851" + url: "https://pub.dev" + source: hosted + version: "6.6.0" yaml: dependency: transitive description: diff --git a/wien_talks/wien_talks_server/pubspec.yaml b/wien_talks/wien_talks_server/pubspec.yaml index bebc275..9df0369 100644 --- a/wien_talks/wien_talks_server/pubspec.yaml +++ b/wien_talks/wien_talks_server/pubspec.yaml @@ -8,6 +8,7 @@ environment: dependencies: serverpod: 2.9.1 + serverpod_auth_server: ^2.9.1 dev_dependencies: lints: '>=3.0.0 <7.0.0' diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index 02dbd91..d9ec37d 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -102,8 +102,6 @@ void withServerpod( class TestEndpoints { late final _GreetingEndpoint greeting; - - late final _RecipeEndpoint recipe; } class _InternalTestEndpoints extends TestEndpoints @@ -117,10 +115,6 @@ class _InternalTestEndpoints extends TestEndpoints endpoints, serializationManager, ); - recipe = _RecipeEndpoint( - endpoints, - serializationManager, - ); } } @@ -163,43 +157,3 @@ class _GreetingEndpoint { }); } } - -class _RecipeEndpoint { - _RecipeEndpoint( - this._endpointDispatch, - this._serializationManager, - ); - - final _i2.EndpointDispatch _endpointDispatch; - - final _i2.SerializationManager _serializationManager; - - _i3.Future postQuote( - _i1.TestSessionBuilder sessionBuilder, - String quote, - ) async { - return _i1.callAwaitableFunctionAndHandleExceptions(() async { - var _localUniqueSession = - (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'recipe', - method: 'postQuote', - ); - try { - var _localCallContext = await _endpointDispatch.getMethodCallContext( - createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'recipe', - methodName: 'postQuote', - parameters: _i1.testObjectToJson({'quote': quote}), - serializationManager: _serializationManager, - ); - var _localReturnValue = await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) as _i3.Future); - return _localReturnValue; - } finally { - await _localUniqueSession.close(); - } - }); - } -} From ff8de67cbb0571a89c615c338f2368c1c6eb8ef0 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 14:15:21 +0200 Subject: [PATCH 08/49] define quote endpoint --- .../lib/src/protocol/quotes/quote.dart | 50 +-- wien_talks/wien_talks_client/pubspec.yaml | 1 + wien_talks/wien_talks_flutter/pubspec.yaml | 2 + .../lib/src/generated/endpoints.dart | 35 +- .../lib/src/generated/protocol.dart | 159 ++++++- .../lib/src/generated/quotes/quote.dart | 410 ++++++++++++++++-- .../lib/src/quotes/location_endpoint.dart | 12 - .../lib/src/quotes/quote.spy.yaml | 6 +- .../lib/src/quotes/quote_controller.dart | 28 ++ .../lib/src/quotes/quotes_endpoint.dart | 43 ++ 10 files changed, 614 insertions(+), 132 deletions(-) delete mode 100644 wien_talks/wien_talks_server/lib/src/quotes/location_endpoint.dart create mode 100644 wien_talks/wien_talks_server/lib/src/quotes/quote_controller.dart create mode 100644 wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart diff --git a/wien_talks/wien_talks_client/lib/src/protocol/quotes/quote.dart b/wien_talks/wien_talks_client/lib/src/protocol/quotes/quote.dart index 20d381a..099720f 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/quotes/quote.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/quotes/quote.dart @@ -13,13 +13,12 @@ import 'package:serverpod_client/serverpod_client.dart' as _i1; abstract class Quote implements _i1.SerializableModel { Quote._({ - required this.id, + this.id, required this.userId, required this.text, this.authorName, required this.lat, - required this.lng, - required this.geohash, + required this.long, required this.createdAt, required this.visibility, required this.upvotes, @@ -28,13 +27,12 @@ abstract class Quote implements _i1.SerializableModel { }); factory Quote({ - required int id, + int? id, required int userId, required String text, String? authorName, required double lat, - required double lng, - required String geohash, + required double long, required DateTime createdAt, required int visibility, required int upvotes, @@ -44,13 +42,12 @@ abstract class Quote implements _i1.SerializableModel { factory Quote.fromJson(Map jsonSerialization) { return Quote( - id: jsonSerialization['id'] as int, + id: jsonSerialization['id'] as int?, userId: jsonSerialization['userId'] as int, text: jsonSerialization['text'] as String, authorName: jsonSerialization['authorName'] as String?, lat: (jsonSerialization['lat'] as num).toDouble(), - lng: (jsonSerialization['lng'] as num).toDouble(), - geohash: jsonSerialization['geohash'] as String, + long: (jsonSerialization['long'] as num).toDouble(), createdAt: _i1.DateTimeJsonExtension.fromJson(jsonSerialization['createdAt']), visibility: jsonSerialization['visibility'] as int, @@ -62,7 +59,10 @@ abstract class Quote implements _i1.SerializableModel { ); } - int id; + /// The database id, set if the object has been inserted into the + /// database or if it has been fetched from the database. Otherwise, + /// the id will be null. + int? id; int userId; @@ -72,9 +72,7 @@ abstract class Quote implements _i1.SerializableModel { double lat; - double lng; - - String geohash; + double long; DateTime createdAt; @@ -95,8 +93,7 @@ abstract class Quote implements _i1.SerializableModel { String? text, String? authorName, double? lat, - double? lng, - String? geohash, + double? long, DateTime? createdAt, int? visibility, int? upvotes, @@ -106,13 +103,12 @@ abstract class Quote implements _i1.SerializableModel { @override Map toJson() { return { - 'id': id, + if (id != null) 'id': id, 'userId': userId, 'text': text, if (authorName != null) 'authorName': authorName, 'lat': lat, - 'lng': lng, - 'geohash': geohash, + 'long': long, 'createdAt': createdAt.toJson(), 'visibility': visibility, 'upvotes': upvotes, @@ -131,13 +127,12 @@ class _Undefined {} class _QuoteImpl extends Quote { _QuoteImpl({ - required int id, + int? id, required int userId, required String text, String? authorName, required double lat, - required double lng, - required String geohash, + required double long, required DateTime createdAt, required int visibility, required int upvotes, @@ -149,8 +144,7 @@ class _QuoteImpl extends Quote { text: text, authorName: authorName, lat: lat, - lng: lng, - geohash: geohash, + long: long, createdAt: createdAt, visibility: visibility, upvotes: upvotes, @@ -163,13 +157,12 @@ class _QuoteImpl extends Quote { @_i1.useResult @override Quote copyWith({ - int? id, + Object? id = _Undefined, int? userId, String? text, Object? authorName = _Undefined, double? lat, - double? lng, - String? geohash, + double? long, DateTime? createdAt, int? visibility, int? upvotes, @@ -177,13 +170,12 @@ class _QuoteImpl extends Quote { Object? tags = _Undefined, }) { return Quote( - id: id ?? this.id, + id: id is int? ? id : this.id, userId: userId ?? this.userId, text: text ?? this.text, authorName: authorName is String? ? authorName : this.authorName, lat: lat ?? this.lat, - lng: lng ?? this.lng, - geohash: geohash ?? this.geohash, + long: long ?? this.long, createdAt: createdAt ?? this.createdAt, visibility: visibility ?? this.visibility, upvotes: upvotes ?? this.upvotes, diff --git a/wien_talks/wien_talks_client/pubspec.yaml b/wien_talks/wien_talks_client/pubspec.yaml index 223e12d..a438c4f 100644 --- a/wien_talks/wien_talks_client/pubspec.yaml +++ b/wien_talks/wien_talks_client/pubspec.yaml @@ -6,3 +6,4 @@ environment: dependencies: serverpod_client: 2.9.1 + serverpod_auth_server: ^2.9.1 diff --git a/wien_talks/wien_talks_flutter/pubspec.yaml b/wien_talks/wien_talks_flutter/pubspec.yaml index 3f0110a..9e35577 100644 --- a/wien_talks/wien_talks_flutter/pubspec.yaml +++ b/wien_talks/wien_talks_flutter/pubspec.yaml @@ -27,6 +27,8 @@ dependencies: serverpod_flutter: 2.9.1 wien_talks_client: path: ../wien_talks_client + serverpod_auth_shared_flutter: ^2.9.1 + # The following adds the Cupertino Icons font to your application. diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index 399a21e..fba3ffe 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -11,7 +11,7 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; import '../greeting_endpoint.dart' as _i2; -import '../quotes/location_endpoint.dart' as _i3; +import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i3; class Endpoints extends _i1.EndpointDispatch { @override @@ -22,13 +22,7 @@ class Endpoints extends _i1.EndpointDispatch { server, 'greeting', null, - ), - 'recipe': _i3.RecipeEndpoint() - ..initialize( - server, - 'recipe', - null, - ), + ) }; connectors['greeting'] = _i1.EndpointConnector( name: 'greeting', @@ -54,29 +48,6 @@ class Endpoints extends _i1.EndpointDispatch { ) }, ); - connectors['recipe'] = _i1.EndpointConnector( - name: 'recipe', - endpoint: endpoints['recipe']!, - methodConnectors: { - 'postQuote': _i1.MethodConnector( - name: 'postQuote', - params: { - 'quote': _i1.ParameterDescription( - name: 'quote', - type: _i1.getType(), - nullable: false, - ) - }, - call: ( - _i1.Session session, - Map params, - ) async => - (endpoints['recipe'] as _i3.RecipeEndpoint).postQuote( - session, - params['quote'], - ), - ) - }, - ); + modules['serverpod_auth'] = _i3.Endpoints()..initializeEndpoints(server); } } diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart index 7187a0b..74b47bc 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart @@ -11,9 +11,10 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; import 'package:serverpod/protocol.dart' as _i2; -import 'greeting.dart' as _i3; -import 'quotes/create_quote.dart' as _i4; -import 'quotes/quote.dart' as _i5; +import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i3; +import 'greeting.dart' as _i4; +import 'quotes/create_quote.dart' as _i5; +import 'quotes/quote.dart' as _i6; export 'greeting.dart'; export 'quotes/create_quote.dart'; export 'quotes/quote.dart'; @@ -26,7 +27,100 @@ class Protocol extends _i1.SerializationManagerServer { static final Protocol _instance = Protocol._(); static final List<_i2.TableDefinition> targetTableDefinitions = [ - ..._i2.Protocol.targetTableDefinitions + _i2.TableDefinition( + name: 'quote', + dartName: 'Quote', + schema: 'public', + module: 'wien_talks', + columns: [ + _i2.ColumnDefinition( + name: 'id', + columnType: _i2.ColumnType.bigint, + isNullable: false, + dartType: 'int?', + columnDefault: 'nextval(\'quote_id_seq\'::regclass)', + ), + _i2.ColumnDefinition( + name: 'userId', + columnType: _i2.ColumnType.bigint, + isNullable: false, + dartType: 'int', + ), + _i2.ColumnDefinition( + name: 'text', + columnType: _i2.ColumnType.text, + isNullable: false, + dartType: 'String', + ), + _i2.ColumnDefinition( + name: 'authorName', + columnType: _i2.ColumnType.text, + isNullable: true, + dartType: 'String?', + ), + _i2.ColumnDefinition( + name: 'lat', + columnType: _i2.ColumnType.doublePrecision, + isNullable: false, + dartType: 'double', + ), + _i2.ColumnDefinition( + name: 'long', + columnType: _i2.ColumnType.doublePrecision, + isNullable: false, + dartType: 'double', + ), + _i2.ColumnDefinition( + name: 'createdAt', + columnType: _i2.ColumnType.timestampWithoutTimeZone, + isNullable: false, + dartType: 'DateTime', + ), + _i2.ColumnDefinition( + name: 'visibility', + columnType: _i2.ColumnType.bigint, + isNullable: false, + dartType: 'int', + ), + _i2.ColumnDefinition( + name: 'upvotes', + columnType: _i2.ColumnType.bigint, + isNullable: false, + dartType: 'int', + ), + _i2.ColumnDefinition( + name: 'downvotes', + columnType: _i2.ColumnType.bigint, + isNullable: false, + dartType: 'int', + ), + _i2.ColumnDefinition( + name: 'tags', + columnType: _i2.ColumnType.json, + isNullable: true, + dartType: 'List?', + ), + ], + foreignKeys: [], + indexes: [ + _i2.IndexDefinition( + indexName: 'quote_pkey', + tableSpace: null, + elements: [ + _i2.IndexElementDefinition( + type: _i2.IndexElementDefinitionType.column, + definition: 'id', + ) + ], + type: 'btree', + isUnique: true, + isPrimary: true, + ) + ], + managed: true, + ), + ..._i3.Protocol.targetTableDefinitions, + ..._i2.Protocol.targetTableDefinitions, ]; @override @@ -35,23 +129,23 @@ class Protocol extends _i1.SerializationManagerServer { Type? t, ]) { t ??= T; - if (t == _i3.Greeting) { - return _i3.Greeting.fromJson(data) as T; + if (t == _i4.Greeting) { + return _i4.Greeting.fromJson(data) as T; } - if (t == _i4.CreateQuoteRequest) { - return _i4.CreateQuoteRequest.fromJson(data) as T; + if (t == _i5.CreateQuoteRequest) { + return _i5.CreateQuoteRequest.fromJson(data) as T; } - if (t == _i5.Quote) { - return _i5.Quote.fromJson(data) as T; + if (t == _i6.Quote) { + return _i6.Quote.fromJson(data) as T; } - if (t == _i1.getType<_i3.Greeting?>()) { - return (data != null ? _i3.Greeting.fromJson(data) : null) as T; + if (t == _i1.getType<_i4.Greeting?>()) { + return (data != null ? _i4.Greeting.fromJson(data) : null) as T; } - if (t == _i1.getType<_i4.CreateQuoteRequest?>()) { - return (data != null ? _i4.CreateQuoteRequest.fromJson(data) : null) as T; + if (t == _i1.getType<_i5.CreateQuoteRequest?>()) { + return (data != null ? _i5.CreateQuoteRequest.fromJson(data) : null) as T; } - if (t == _i1.getType<_i5.Quote?>()) { - return (data != null ? _i5.Quote.fromJson(data) : null) as T; + if (t == _i1.getType<_i6.Quote?>()) { + return (data != null ? _i6.Quote.fromJson(data) : null) as T; } if (t == _i1.getType?>()) { return (data != null @@ -63,6 +157,9 @@ class Protocol extends _i1.SerializationManagerServer { ? (data as List).map((e) => deserialize(e)).toList() : null) as T; } + try { + return _i3.Protocol().deserialize(data, t); + } on _i1.DeserializationTypeNotFoundException catch (_) {} try { return _i2.Protocol().deserialize(data, t); } on _i1.DeserializationTypeNotFoundException catch (_) {} @@ -73,19 +170,23 @@ class Protocol extends _i1.SerializationManagerServer { String? getClassNameForObject(Object? data) { String? className = super.getClassNameForObject(data); if (className != null) return className; - if (data is _i3.Greeting) { + if (data is _i4.Greeting) { return 'Greeting'; } - if (data is _i4.CreateQuoteRequest) { + if (data is _i5.CreateQuoteRequest) { return 'CreateQuoteRequest'; } - if (data is _i5.Quote) { + if (data is _i6.Quote) { return 'Quote'; } className = _i2.Protocol().getClassNameForObject(data); if (className != null) { return 'serverpod.$className'; } + className = _i3.Protocol().getClassNameForObject(data); + if (className != null) { + return 'serverpod_auth.$className'; + } return null; } @@ -96,29 +197,43 @@ class Protocol extends _i1.SerializationManagerServer { return super.deserializeByClassName(data); } if (dataClassName == 'Greeting') { - return deserialize<_i3.Greeting>(data['data']); + return deserialize<_i4.Greeting>(data['data']); } if (dataClassName == 'CreateQuoteRequest') { - return deserialize<_i4.CreateQuoteRequest>(data['data']); + return deserialize<_i5.CreateQuoteRequest>(data['data']); } if (dataClassName == 'Quote') { - return deserialize<_i5.Quote>(data['data']); + return deserialize<_i6.Quote>(data['data']); } if (dataClassName.startsWith('serverpod.')) { data['className'] = dataClassName.substring(10); return _i2.Protocol().deserializeByClassName(data); } + if (dataClassName.startsWith('serverpod_auth.')) { + data['className'] = dataClassName.substring(15); + return _i3.Protocol().deserializeByClassName(data); + } return super.deserializeByClassName(data); } @override _i1.Table? getTableForType(Type t) { + { + var table = _i3.Protocol().getTableForType(t); + if (table != null) { + return table; + } + } { var table = _i2.Protocol().getTableForType(t); if (table != null) { return table; } } + switch (t) { + case _i6.Quote: + return _i6.Quote.t; + } return null; } diff --git a/wien_talks/wien_talks_server/lib/src/generated/quotes/quote.dart b/wien_talks/wien_talks_server/lib/src/generated/quotes/quote.dart index 8e1ee3a..f0f5606 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/quotes/quote.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/quotes/quote.dart @@ -11,16 +11,14 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; -abstract class Quote - implements _i1.SerializableModel, _i1.ProtocolSerialization { +abstract class Quote implements _i1.TableRow, _i1.ProtocolSerialization { Quote._({ - required this.id, + this.id, required this.userId, required this.text, this.authorName, required this.lat, - required this.lng, - required this.geohash, + required this.long, required this.createdAt, required this.visibility, required this.upvotes, @@ -29,13 +27,12 @@ abstract class Quote }); factory Quote({ - required int id, + int? id, required int userId, required String text, String? authorName, required double lat, - required double lng, - required String geohash, + required double long, required DateTime createdAt, required int visibility, required int upvotes, @@ -45,13 +42,12 @@ abstract class Quote factory Quote.fromJson(Map jsonSerialization) { return Quote( - id: jsonSerialization['id'] as int, + id: jsonSerialization['id'] as int?, userId: jsonSerialization['userId'] as int, text: jsonSerialization['text'] as String, authorName: jsonSerialization['authorName'] as String?, lat: (jsonSerialization['lat'] as num).toDouble(), - lng: (jsonSerialization['lng'] as num).toDouble(), - geohash: jsonSerialization['geohash'] as String, + long: (jsonSerialization['long'] as num).toDouble(), createdAt: _i1.DateTimeJsonExtension.fromJson(jsonSerialization['createdAt']), visibility: jsonSerialization['visibility'] as int, @@ -63,7 +59,12 @@ abstract class Quote ); } - int id; + static final t = QuoteTable(); + + static const db = QuoteRepository._(); + + @override + int? id; int userId; @@ -73,9 +74,7 @@ abstract class Quote double lat; - double lng; - - String geohash; + double long; DateTime createdAt; @@ -87,6 +86,9 @@ abstract class Quote List? tags; + @override + _i1.Table get table => t; + /// Returns a shallow copy of this [Quote] /// with some or all fields replaced by the given arguments. @_i1.useResult @@ -96,8 +98,7 @@ abstract class Quote String? text, String? authorName, double? lat, - double? lng, - String? geohash, + double? long, DateTime? createdAt, int? visibility, int? upvotes, @@ -107,13 +108,12 @@ abstract class Quote @override Map toJson() { return { - 'id': id, + if (id != null) 'id': id, 'userId': userId, 'text': text, if (authorName != null) 'authorName': authorName, 'lat': lat, - 'lng': lng, - 'geohash': geohash, + 'long': long, 'createdAt': createdAt.toJson(), 'visibility': visibility, 'upvotes': upvotes, @@ -125,13 +125,12 @@ abstract class Quote @override Map toJsonForProtocol() { return { - 'id': id, + if (id != null) 'id': id, 'userId': userId, 'text': text, if (authorName != null) 'authorName': authorName, 'lat': lat, - 'lng': lng, - 'geohash': geohash, + 'long': long, 'createdAt': createdAt.toJson(), 'visibility': visibility, 'upvotes': upvotes, @@ -140,6 +139,30 @@ abstract class Quote }; } + static QuoteInclude include() { + return QuoteInclude._(); + } + + static QuoteIncludeList includeList({ + _i1.WhereExpressionBuilder? where, + int? limit, + int? offset, + _i1.OrderByBuilder? orderBy, + bool orderDescending = false, + _i1.OrderByListBuilder? orderByList, + QuoteInclude? include, + }) { + return QuoteIncludeList._( + where: where, + limit: limit, + offset: offset, + orderBy: orderBy?.call(Quote.t), + orderDescending: orderDescending, + orderByList: orderByList?.call(Quote.t), + include: include, + ); + } + @override String toString() { return _i1.SerializationManager.encode(this); @@ -150,13 +173,12 @@ class _Undefined {} class _QuoteImpl extends Quote { _QuoteImpl({ - required int id, + int? id, required int userId, required String text, String? authorName, required double lat, - required double lng, - required String geohash, + required double long, required DateTime createdAt, required int visibility, required int upvotes, @@ -168,8 +190,7 @@ class _QuoteImpl extends Quote { text: text, authorName: authorName, lat: lat, - lng: lng, - geohash: geohash, + long: long, createdAt: createdAt, visibility: visibility, upvotes: upvotes, @@ -182,13 +203,12 @@ class _QuoteImpl extends Quote { @_i1.useResult @override Quote copyWith({ - int? id, + Object? id = _Undefined, int? userId, String? text, Object? authorName = _Undefined, double? lat, - double? lng, - String? geohash, + double? long, DateTime? createdAt, int? visibility, int? upvotes, @@ -196,13 +216,12 @@ class _QuoteImpl extends Quote { Object? tags = _Undefined, }) { return Quote( - id: id ?? this.id, + id: id is int? ? id : this.id, userId: userId ?? this.userId, text: text ?? this.text, authorName: authorName is String? ? authorName : this.authorName, lat: lat ?? this.lat, - lng: lng ?? this.lng, - geohash: geohash ?? this.geohash, + long: long ?? this.long, createdAt: createdAt ?? this.createdAt, visibility: visibility ?? this.visibility, upvotes: upvotes ?? this.upvotes, @@ -211,3 +230,326 @@ class _QuoteImpl extends Quote { ); } } + +class QuoteTable extends _i1.Table { + QuoteTable({super.tableRelation}) : super(tableName: 'quote') { + userId = _i1.ColumnInt( + 'userId', + this, + ); + text = _i1.ColumnString( + 'text', + this, + ); + authorName = _i1.ColumnString( + 'authorName', + this, + ); + lat = _i1.ColumnDouble( + 'lat', + this, + ); + long = _i1.ColumnDouble( + 'long', + this, + ); + createdAt = _i1.ColumnDateTime( + 'createdAt', + this, + ); + visibility = _i1.ColumnInt( + 'visibility', + this, + ); + upvotes = _i1.ColumnInt( + 'upvotes', + this, + ); + downvotes = _i1.ColumnInt( + 'downvotes', + this, + ); + tags = _i1.ColumnSerializable( + 'tags', + this, + ); + } + + late final _i1.ColumnInt userId; + + late final _i1.ColumnString text; + + late final _i1.ColumnString authorName; + + late final _i1.ColumnDouble lat; + + late final _i1.ColumnDouble long; + + late final _i1.ColumnDateTime createdAt; + + late final _i1.ColumnInt visibility; + + late final _i1.ColumnInt upvotes; + + late final _i1.ColumnInt downvotes; + + late final _i1.ColumnSerializable tags; + + @override + List<_i1.Column> get columns => [ + id, + userId, + text, + authorName, + lat, + long, + createdAt, + visibility, + upvotes, + downvotes, + tags, + ]; +} + +class QuoteInclude extends _i1.IncludeObject { + QuoteInclude._(); + + @override + Map get includes => {}; + + @override + _i1.Table get table => Quote.t; +} + +class QuoteIncludeList extends _i1.IncludeList { + QuoteIncludeList._({ + _i1.WhereExpressionBuilder? where, + super.limit, + super.offset, + super.orderBy, + super.orderDescending, + super.orderByList, + super.include, + }) { + super.where = where?.call(Quote.t); + } + + @override + Map get includes => include?.includes ?? {}; + + @override + _i1.Table get table => Quote.t; +} + +class QuoteRepository { + const QuoteRepository._(); + + /// Returns a list of [Quote]s matching the given query parameters. + /// + /// Use [where] to specify which items to include in the return value. + /// If none is specified, all items will be returned. + /// + /// To specify the order of the items use [orderBy] or [orderByList] + /// when sorting by multiple columns. + /// + /// The maximum number of items can be set by [limit]. If no limit is set, + /// all items matching the query will be returned. + /// + /// [offset] defines how many items to skip, after which [limit] (or all) + /// items are read from the database. + /// + /// ```dart + /// var persons = await Persons.db.find( + /// session, + /// where: (t) => t.lastName.equals('Jones'), + /// orderBy: (t) => t.firstName, + /// limit: 100, + /// ); + /// ``` + Future> find( + _i1.Session session, { + _i1.WhereExpressionBuilder? where, + int? limit, + int? offset, + _i1.OrderByBuilder? orderBy, + bool orderDescending = false, + _i1.OrderByListBuilder? orderByList, + _i1.Transaction? transaction, + }) async { + return session.db.find( + where: where?.call(Quote.t), + orderBy: orderBy?.call(Quote.t), + orderByList: orderByList?.call(Quote.t), + orderDescending: orderDescending, + limit: limit, + offset: offset, + transaction: transaction, + ); + } + + /// Returns the first matching [Quote] matching the given query parameters. + /// + /// Use [where] to specify which items to include in the return value. + /// If none is specified, all items will be returned. + /// + /// To specify the order use [orderBy] or [orderByList] + /// when sorting by multiple columns. + /// + /// [offset] defines how many items to skip, after which the next one will be picked. + /// + /// ```dart + /// var youngestPerson = await Persons.db.findFirstRow( + /// session, + /// where: (t) => t.lastName.equals('Jones'), + /// orderBy: (t) => t.age, + /// ); + /// ``` + Future findFirstRow( + _i1.Session session, { + _i1.WhereExpressionBuilder? where, + int? offset, + _i1.OrderByBuilder? orderBy, + bool orderDescending = false, + _i1.OrderByListBuilder? orderByList, + _i1.Transaction? transaction, + }) async { + return session.db.findFirstRow( + where: where?.call(Quote.t), + orderBy: orderBy?.call(Quote.t), + orderByList: orderByList?.call(Quote.t), + orderDescending: orderDescending, + offset: offset, + transaction: transaction, + ); + } + + /// Finds a single [Quote] by its [id] or null if no such row exists. + Future findById( + _i1.Session session, + int id, { + _i1.Transaction? transaction, + }) async { + return session.db.findById( + id, + transaction: transaction, + ); + } + + /// Inserts all [Quote]s in the list and returns the inserted rows. + /// + /// The returned [Quote]s will have their `id` fields set. + /// + /// This is an atomic operation, meaning that if one of the rows fails to + /// insert, none of the rows will be inserted. + Future> insert( + _i1.Session session, + List rows, { + _i1.Transaction? transaction, + }) async { + return session.db.insert( + rows, + transaction: transaction, + ); + } + + /// Inserts a single [Quote] and returns the inserted row. + /// + /// The returned [Quote] will have its `id` field set. + Future insertRow( + _i1.Session session, + Quote row, { + _i1.Transaction? transaction, + }) async { + return session.db.insertRow( + row, + transaction: transaction, + ); + } + + /// Updates all [Quote]s in the list and returns the updated rows. If + /// [columns] is provided, only those columns will be updated. Defaults to + /// all columns. + /// This is an atomic operation, meaning that if one of the rows fails to + /// update, none of the rows will be updated. + Future> update( + _i1.Session session, + List rows, { + _i1.ColumnSelections? columns, + _i1.Transaction? transaction, + }) async { + return session.db.update( + rows, + columns: columns?.call(Quote.t), + transaction: transaction, + ); + } + + /// Updates a single [Quote]. The row needs to have its id set. + /// Optionally, a list of [columns] can be provided to only update those + /// columns. Defaults to all columns. + Future updateRow( + _i1.Session session, + Quote row, { + _i1.ColumnSelections? columns, + _i1.Transaction? transaction, + }) async { + return session.db.updateRow( + row, + columns: columns?.call(Quote.t), + transaction: transaction, + ); + } + + /// Deletes all [Quote]s in the list and returns the deleted rows. + /// This is an atomic operation, meaning that if one of the rows fail to + /// be deleted, none of the rows will be deleted. + Future> delete( + _i1.Session session, + List rows, { + _i1.Transaction? transaction, + }) async { + return session.db.delete( + rows, + transaction: transaction, + ); + } + + /// Deletes a single [Quote]. + Future deleteRow( + _i1.Session session, + Quote row, { + _i1.Transaction? transaction, + }) async { + return session.db.deleteRow( + row, + transaction: transaction, + ); + } + + /// Deletes all rows matching the [where] expression. + Future> deleteWhere( + _i1.Session session, { + required _i1.WhereExpressionBuilder where, + _i1.Transaction? transaction, + }) async { + return session.db.deleteWhere( + where: where(Quote.t), + transaction: transaction, + ); + } + + /// Counts the number of rows matching the [where] expression. If omitted, + /// will return the count of all rows in the table. + Future count( + _i1.Session session, { + _i1.WhereExpressionBuilder? where, + int? limit, + _i1.Transaction? transaction, + }) async { + return session.db.count( + where: where?.call(Quote.t), + limit: limit, + transaction: transaction, + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/quotes/location_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/location_endpoint.dart deleted file mode 100644 index 406eb7d..0000000 --- a/wien_talks/wien_talks_server/lib/src/quotes/location_endpoint.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'dart:async'; - -import 'package:serverpod/serverpod.dart'; - -class RecipeEndpoint extends Endpoint { - Future postQuote(Session session, String quote) async { - // validate content - - // persist quote - return Future.value('none'); - } -} diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quote.spy.yaml b/wien_talks/wien_talks_server/lib/src/quotes/quote.spy.yaml index f84c340..3a734d5 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quote.spy.yaml +++ b/wien_talks/wien_talks_server/lib/src/quotes/quote.spy.yaml @@ -1,12 +1,12 @@ class: Quote +table: quote fields: - id: int + id: int? userId: int text: String authorName: String? lat: double - lng: double - geohash: String + long: double createdAt: DateTime visibility: int upvotes: int diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quote_controller.dart b/wien_talks/wien_talks_server/lib/src/quotes/quote_controller.dart new file mode 100644 index 0000000..533ee21 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/quotes/quote_controller.dart @@ -0,0 +1,28 @@ +import 'package:serverpod/serverpod.dart'; +import 'package:wien_talks_server/src/generated/protocol.dart'; + +String validateQuote(CreateQuoteRequest req) { + final text = req.text.trim(); + if (text.isEmpty || text.length > 500) { + throw FormatException('Text must be 1..500 chars'); + } + if (req.lat.isNaN || req.lng.isNaN) { + throw FormatException('Invalid coordinates'); + } + if (req.lat < -90 || req.lat > 90 || req.lng < -180 || req.lng > 180) { + throw FormatException('Coordinates out of bounds'); + } + return text; +} + +Future> listNearby( + Session session, { + required double lat, + required double lng, + int radiusMeters = 1500, + int limit = 50, +}) async { + throw UnimplementedError(); +} + +enum Visibility { public, private, locallyPublic } diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart new file mode 100644 index 0000000..9fc7ded --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -0,0 +1,43 @@ +import 'package:serverpod/serverpod.dart'; +import 'package:wien_talks_server/src/generated/protocol.dart'; +import 'package:wien_talks_server/src/quotes/quote_controller.dart'; + +class QuoteEndpoint extends Endpoint { + Future create(Session session, CreateQuoteRequest req) async { + final authInfo = await session.authenticated; + final userId = authInfo?.userId; + + if (userId == null) { + throw Exception('Not signed in'); + } + + String text = validateQuote(req); + + final quote = Quote( + id: 0, + userId: userId, + text: text, + authorName: req.authorName?.trim().isEmpty == true + ? null + : req.authorName!.trim(), + lat: req.lat, + long: req.lng, + createdAt: DateTime.now().toUtc(), + visibility: 0, + upvotes: 0, + downvotes: 0, + ); + + final inserted = await session.db.insertRow(quote); + return inserted; + } + + Future getQuoteById(Session session, int id) async { + final quote = await Quote.db.findById(session, id); + if (quote != null) { + return quote; + } + + throw Exception('Quote not found'); + } +} From 6f75132073d6c6ed8df1e7f856175b143a50cebf Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 14:28:40 +0200 Subject: [PATCH 09/49] migrate db --- .../lib/src/protocol/client.dart | 49 +- .../lib/src/protocol/protocol.dart | 12 +- .../flutter/generated_plugin_registrant.cc | 4 + .../linux/flutter/generated_plugins.cmake | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../flutter/generated_plugin_registrant.cc | 3 + .../windows/flutter/generated_plugins.cmake | 1 + .../lib/src/generated/endpoints.dart | 66 +- .../lib/src/generated/protocol.dart | 4 + .../lib/src/generated/protocol.yaml | 4 + .../lib/src/quotes/quotes_endpoint.dart | 21 +- .../20250816122625449/definition.json | 1800 +++++++++++++++++ .../20250816122625449/definition.sql | 394 ++++ .../20250816122625449/definition_project.json | 107 + .../20250816122625449/migration.json | 676 +++++++ .../20250816122625449/migration.sql | 158 ++ .../migrations/migration_registry.txt | 1 + .../test_tools/serverpod_test_tools.dart | 105 + 18 files changed, 3402 insertions(+), 14 deletions(-) create mode 100644 wien_talks/wien_talks_server/migrations/20250816122625449/definition.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816122625449/definition.sql create mode 100644 wien_talks/wien_talks_server/migrations/20250816122625449/definition_project.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816122625449/migration.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816122625449/migration.sql diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index 99e1b50..3440443 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -12,8 +12,10 @@ import 'package:serverpod_client/serverpod_client.dart' as _i1; import 'dart:async' as _i2; import 'package:wien_talks_client/src/protocol/greeting.dart' as _i3; -import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i4; -import 'protocol.dart' as _i5; +import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i4; +import 'package:wien_talks_client/src/protocol/quotes/create_quote.dart' as _i5; +import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i6; +import 'protocol.dart' as _i7; /// This is an example endpoint that returns a greeting message through /// its [hello] method. @@ -33,12 +35,41 @@ class EndpointGreeting extends _i1.EndpointRef { ); } +/// {@category Endpoint} +class EndpointQuote extends _i1.EndpointRef { + EndpointQuote(_i1.EndpointCaller caller) : super(caller); + + @override + String get name => 'quote'; + + _i2.Future<_i4.Quote> createQuote(_i5.CreateQuoteRequest req) => + caller.callServerEndpoint<_i4.Quote>( + 'quote', + 'createQuote', + {'req': req}, + ); + + _i2.Future<_i4.Quote> getQuoteById(int id) => + caller.callServerEndpoint<_i4.Quote>( + 'quote', + 'getQuoteById', + {'id': id}, + ); + + _i2.Future> getAllQuotes() => + caller.callServerEndpoint>( + 'quote', + 'getAllQuotes', + {}, + ); +} + class Modules { Modules(Client client) { - auth = _i4.Caller(client); + auth = _i6.Caller(client); } - late final _i4.Caller auth; + late final _i6.Caller auth; } class Client extends _i1.ServerpodClientShared { @@ -57,7 +88,7 @@ class Client extends _i1.ServerpodClientShared { bool? disconnectStreamsOnLostInternetConnection, }) : super( host, - _i5.Protocol(), + _i7.Protocol(), securityContext: securityContext, authenticationKeyManager: authenticationKeyManager, streamingConnectionTimeout: streamingConnectionTimeout, @@ -68,15 +99,21 @@ class Client extends _i1.ServerpodClientShared { disconnectStreamsOnLostInternetConnection, ) { greeting = EndpointGreeting(this); + quote = EndpointQuote(this); modules = Modules(this); } late final EndpointGreeting greeting; + late final EndpointQuote quote; + late final Modules modules; @override - Map get endpointRefLookup => {'greeting': greeting}; + Map get endpointRefLookup => { + 'greeting': greeting, + 'quote': quote, + }; @override Map get moduleLookup => diff --git a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart index 88a112d..f03d13d 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart @@ -13,7 +13,8 @@ import 'package:serverpod_client/serverpod_client.dart' as _i1; import 'greeting.dart' as _i2; import 'quotes/create_quote.dart' as _i3; import 'quotes/quote.dart' as _i4; -import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i5; +import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i5; +import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i6; export 'greeting.dart'; export 'quotes/create_quote.dart'; export 'quotes/quote.dart'; @@ -60,8 +61,11 @@ class Protocol extends _i1.SerializationManager { ? (data as List).map((e) => deserialize(e)).toList() : null) as T; } + if (t == List<_i5.Quote>) { + return (data as List).map((e) => deserialize<_i5.Quote>(e)).toList() as T; + } try { - return _i5.Protocol().deserialize(data, t); + return _i6.Protocol().deserialize(data, t); } on _i1.DeserializationTypeNotFoundException catch (_) {} return super.deserialize(data, t); } @@ -79,7 +83,7 @@ class Protocol extends _i1.SerializationManager { if (data is _i4.Quote) { return 'Quote'; } - className = _i5.Protocol().getClassNameForObject(data); + className = _i6.Protocol().getClassNameForObject(data); if (className != null) { return 'serverpod_auth.$className'; } @@ -103,7 +107,7 @@ class Protocol extends _i1.SerializationManager { } if (dataClassName.startsWith('serverpod_auth.')) { data['className'] = dataClassName.substring(15); - return _i5.Protocol().deserializeByClassName(data); + return _i6.Protocol().deserializeByClassName(data); } return super.deserializeByClassName(data); } diff --git a/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc b/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc index e71a16d..64a0ece 100644 --- a/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc +++ b/wien_talks/wien_talks_flutter/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); } diff --git a/wien_talks/wien_talks_flutter/linux/flutter/generated_plugins.cmake b/wien_talks/wien_talks_flutter/linux/flutter/generated_plugins.cmake index 2e1de87..2db3c22 100644 --- a/wien_talks/wien_talks_flutter/linux/flutter/generated_plugins.cmake +++ b/wien_talks/wien_talks_flutter/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift index 67b21c7..407ec0f 100644 --- a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,9 +6,19 @@ import FlutterMacOS import Foundation import connectivity_plus +import file_picker +import file_selector_macos import location +import path_provider_foundation +import shared_preferences_foundation +import sqflite_darwin func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc b/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc index 8777c93..e6c6668 100644 --- a/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc +++ b/wien_talks/wien_talks_flutter/windows/flutter/generated_plugin_registrant.cc @@ -7,8 +7,11 @@ #include "generated_plugin_registrant.h" #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { ConnectivityPlusWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); } diff --git a/wien_talks/wien_talks_flutter/windows/flutter/generated_plugins.cmake b/wien_talks/wien_talks_flutter/windows/flutter/generated_plugins.cmake index cc1361d..d62d824 100644 --- a/wien_talks/wien_talks_flutter/windows/flutter/generated_plugins.cmake +++ b/wien_talks/wien_talks_flutter/windows/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST connectivity_plus + file_selector_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index fba3ffe..13b7730 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -11,7 +11,10 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; import '../greeting_endpoint.dart' as _i2; -import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i3; +import '../quotes/quotes_endpoint.dart' as _i3; +import 'package:wien_talks_server/src/generated/quotes/create_quote.dart' + as _i4; +import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i5; class Endpoints extends _i1.EndpointDispatch { @override @@ -22,7 +25,13 @@ class Endpoints extends _i1.EndpointDispatch { server, 'greeting', null, - ) + ), + 'quote': _i3.QuoteEndpoint() + ..initialize( + server, + 'quote', + null, + ), }; connectors['greeting'] = _i1.EndpointConnector( name: 'greeting', @@ -48,6 +57,57 @@ class Endpoints extends _i1.EndpointDispatch { ) }, ); - modules['serverpod_auth'] = _i3.Endpoints()..initializeEndpoints(server); + connectors['quote'] = _i1.EndpointConnector( + name: 'quote', + endpoint: endpoints['quote']!, + methodConnectors: { + 'createQuote': _i1.MethodConnector( + name: 'createQuote', + params: { + 'req': _i1.ParameterDescription( + name: 'req', + type: _i1.getType<_i4.CreateQuoteRequest>(), + nullable: false, + ) + }, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['quote'] as _i3.QuoteEndpoint).createQuote( + session, + params['req'], + ), + ), + 'getQuoteById': _i1.MethodConnector( + name: 'getQuoteById', + params: { + 'id': _i1.ParameterDescription( + name: 'id', + type: _i1.getType(), + nullable: false, + ) + }, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['quote'] as _i3.QuoteEndpoint).getQuoteById( + session, + params['id'], + ), + ), + 'getAllQuotes': _i1.MethodConnector( + name: 'getAllQuotes', + params: {}, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['quote'] as _i3.QuoteEndpoint).getAllQuotes(session), + ), + }, + ); + modules['serverpod_auth'] = _i5.Endpoints()..initializeEndpoints(server); } } diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart index 74b47bc..8a3b130 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart @@ -15,6 +15,7 @@ import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i3; import 'greeting.dart' as _i4; import 'quotes/create_quote.dart' as _i5; import 'quotes/quote.dart' as _i6; +import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i7; export 'greeting.dart'; export 'quotes/create_quote.dart'; export 'quotes/quote.dart'; @@ -157,6 +158,9 @@ class Protocol extends _i1.SerializationManagerServer { ? (data as List).map((e) => deserialize(e)).toList() : null) as T; } + if (t == List<_i7.Quote>) { + return (data as List).map((e) => deserialize<_i7.Quote>(e)).toList() as T; + } try { return _i3.Protocol().deserialize(data, t); } on _i1.DeserializationTypeNotFoundException catch (_) {} diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml index 9a4113d..5c2d35a 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml @@ -1,2 +1,6 @@ greeting: - hello: +quote: + - createQuote: + - getQuoteById: + - getAllQuotes: diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart index 9fc7ded..532d6fc 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -3,7 +3,7 @@ import 'package:wien_talks_server/src/generated/protocol.dart'; import 'package:wien_talks_server/src/quotes/quote_controller.dart'; class QuoteEndpoint extends Endpoint { - Future create(Session session, CreateQuoteRequest req) async { + Future createQuote(Session session, CreateQuoteRequest req) async { final authInfo = await session.authenticated; final userId = authInfo?.userId; @@ -40,4 +40,23 @@ class QuoteEndpoint extends Endpoint { throw Exception('Quote not found'); } + +// Only for dev + Future> getAllQuotes(Session session) async { + final quotes = await Quote.db.find(session); + return quotes; + } + + Stream streamAllQuotes( + StreamingSession session, { + int limit = 200, + }) async* { + if (limit <= 0 || limit > 500) limit = 200; + + final quoteStream = session.messages.createStream('quotes'); + + await for (final Quote quote in quoteStream) { + yield quote; + } + } } diff --git a/wien_talks/wien_talks_server/migrations/20250816122625449/definition.json b/wien_talks/wien_talks_server/migrations/20250816122625449/definition.json new file mode 100644 index 0000000..025915f --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816122625449/definition.json @@ -0,0 +1,1800 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage", + "dartName": "CloudStorageEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "addedTime", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + }, + { + "name": "byteData", + "columnType": 5, + "isNullable": false, + "dartType": "dart:typed_data:ByteData" + }, + { + "name": "verified", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_path_idx", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_cloud_storage_expiration", + "elements": [ + { + "type": 0, + "definition": "expiration" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage_direct_upload", + "dartName": "CloudStorageDirectUploadEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_direct_upload_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "authKey", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_direct_upload_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_direct_upload_storage_path", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_future_call", + "dartName": "FutureCallEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_future_call_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "serializedObject", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "identifier", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_future_call_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_future_call_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_serverId_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_identifier_idx", + "elements": [ + { + "type": 0, + "definition": "identifier" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_connection_info", + "dartName": "ServerHealthConnectionInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_connection_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "active", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "closing", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "idle", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_connection_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_connection_info_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_metric", + "dartName": "ServerHealthMetric", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_metric_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "isHealthy", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "value", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_metric_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_metric_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "name" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_log", + "dartName": "LogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "reference", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "logLevel", + "columnType": 6, + "isNullable": false, + "dartType": "protocol:LogLevel" + }, + { + "name": "message", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_message_log", + "dartName": "MessageLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_message_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_message_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_message_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_method", + "dartName": "MethodInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_method_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_method_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_method_endpoint_method_idx", + "elements": [ + { + "type": 0, + "definition": "endpoint" + }, + { + "type": 0, + "definition": "method" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_migrations", + "dartName": "DatabaseMigrationVersion", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_migrations_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "module", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "version", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_migrations_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_migrations_ids", + "elements": [ + { + "type": 0, + "definition": "module" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_query_log", + "dartName": "QueryLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_query_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "query", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "numRows", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_query_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_query_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_query_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_readwrite_test", + "dartName": "ReadWriteTestEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_readwrite_test_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "number", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_readwrite_test_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_runtime_settings", + "dartName": "RuntimeSettings", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_runtime_settings_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "logSettings", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:LogSettings" + }, + { + "name": "logSettingsOverrides", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "logServiceCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "logMalformedCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_runtime_settings_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_session_log", + "dartName": "SessionLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_session_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "module", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "method", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": true, + "dartType": "double?" + }, + { + "name": "numQueries", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "authenticatedUserId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "isOpen", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "touched", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_session_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_session_log_serverid_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_touched_idx", + "elements": [ + { + "type": 0, + "definition": "touched" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_isopen_idx", + "elements": [ + { + "type": 0, + "definition": "isOpen" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_auth", + "dartName": "EmailAuth", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_auth_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_auth_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_create_request", + "dartName": "EmailCreateAccountRequest", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_create_request_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_create_request_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_create_account_request_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_failed_sign_in", + "dartName": "EmailFailedSignIn", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_failed_sign_in_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "ipAddress", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_failed_sign_in_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_failed_sign_in_email_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_email_failed_sign_in_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_reset", + "dartName": "EmailReset", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_reset_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_reset_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_reset_verification_idx", + "elements": [ + { + "type": 0, + "definition": "verificationCode" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_google_refresh_token", + "dartName": "GoogleRefreshToken", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_google_refresh_token_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "refreshToken", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_google_refresh_token_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_google_refresh_token_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_image", + "dartName": "UserImage", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_image_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "version", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "url", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_image_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_image_user_id", + "elements": [ + { + "type": 0, + "definition": "userId" + }, + { + "type": 0, + "definition": "version" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_info", + "dartName": "UserInfo", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userIdentifier", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "fullName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "created", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "imageUrl", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "blocked", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_info_user_identifier", + "elements": [ + { + "type": 0, + "definition": "userIdentifier" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_user_info_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "wien_talks", + "version": "20250816122625449" + }, + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816122625449/definition.sql b/wien_talks/wien_talks_server/migrations/20250816122625449/definition.sql new file mode 100644 index 0000000..93fb32c --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816122625449/definition.sql @@ -0,0 +1,394 @@ +BEGIN; + +-- +-- Class Quote as table quote +-- +CREATE TABLE "quote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "text" text NOT NULL, + "authorName" text, + "lat" double precision NOT NULL, + "long" double precision NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "visibility" bigint NOT NULL, + "upvotes" bigint NOT NULL, + "downvotes" bigint NOT NULL, + "tags" json +); + +-- +-- Class CloudStorageEntry as table serverpod_cloud_storage +-- +CREATE TABLE "serverpod_cloud_storage" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "addedTime" timestamp without time zone NOT NULL, + "expiration" timestamp without time zone, + "byteData" bytea NOT NULL, + "verified" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_path_idx" ON "serverpod_cloud_storage" USING btree ("storageId", "path"); +CREATE INDEX "serverpod_cloud_storage_expiration" ON "serverpod_cloud_storage" USING btree ("expiration"); + +-- +-- Class CloudStorageDirectUploadEntry as table serverpod_cloud_storage_direct_upload +-- +CREATE TABLE "serverpod_cloud_storage_direct_upload" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "expiration" timestamp without time zone NOT NULL, + "authKey" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_direct_upload_storage_path" ON "serverpod_cloud_storage_direct_upload" USING btree ("storageId", "path"); + +-- +-- Class FutureCallEntry as table serverpod_future_call +-- +CREATE TABLE "serverpod_future_call" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "serializedObject" text, + "serverId" text NOT NULL, + "identifier" text +); + +-- Indexes +CREATE INDEX "serverpod_future_call_time_idx" ON "serverpod_future_call" USING btree ("time"); +CREATE INDEX "serverpod_future_call_serverId_idx" ON "serverpod_future_call" USING btree ("serverId"); +CREATE INDEX "serverpod_future_call_identifier_idx" ON "serverpod_future_call" USING btree ("identifier"); + +-- +-- Class ServerHealthConnectionInfo as table serverpod_health_connection_info +-- +CREATE TABLE "serverpod_health_connection_info" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "active" bigint NOT NULL, + "closing" bigint NOT NULL, + "idle" bigint NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_connection_info_timestamp_idx" ON "serverpod_health_connection_info" USING btree ("timestamp", "serverId", "granularity"); + +-- +-- Class ServerHealthMetric as table serverpod_health_metric +-- +CREATE TABLE "serverpod_health_metric" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "isHealthy" boolean NOT NULL, + "value" double precision NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_metric_timestamp_idx" ON "serverpod_health_metric" USING btree ("timestamp", "serverId", "name", "granularity"); + +-- +-- Class LogEntry as table serverpod_log +-- +CREATE TABLE "serverpod_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "reference" text, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "logLevel" bigint NOT NULL, + "message" text NOT NULL, + "error" text, + "stackTrace" text, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_log_sessionLogId_idx" ON "serverpod_log" USING btree ("sessionLogId"); + +-- +-- Class MessageLogEntry as table serverpod_message_log +-- +CREATE TABLE "serverpod_message_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "serverId" text NOT NULL, + "messageId" bigint NOT NULL, + "endpoint" text NOT NULL, + "messageName" text NOT NULL, + "duration" double precision NOT NULL, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- +-- Class MethodInfo as table serverpod_method +-- +CREATE TABLE "serverpod_method" ( + "id" bigserial PRIMARY KEY, + "endpoint" text NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_method_endpoint_method_idx" ON "serverpod_method" USING btree ("endpoint", "method"); + +-- +-- Class DatabaseMigrationVersion as table serverpod_migrations +-- +CREATE TABLE "serverpod_migrations" ( + "id" bigserial PRIMARY KEY, + "module" text NOT NULL, + "version" text NOT NULL, + "timestamp" timestamp without time zone +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_migrations_ids" ON "serverpod_migrations" USING btree ("module"); + +-- +-- Class QueryLogEntry as table serverpod_query_log +-- +CREATE TABLE "serverpod_query_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "query" text NOT NULL, + "duration" double precision NOT NULL, + "numRows" bigint, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_query_log_sessionLogId_idx" ON "serverpod_query_log" USING btree ("sessionLogId"); + +-- +-- Class ReadWriteTestEntry as table serverpod_readwrite_test +-- +CREATE TABLE "serverpod_readwrite_test" ( + "id" bigserial PRIMARY KEY, + "number" bigint NOT NULL +); + +-- +-- Class RuntimeSettings as table serverpod_runtime_settings +-- +CREATE TABLE "serverpod_runtime_settings" ( + "id" bigserial PRIMARY KEY, + "logSettings" json NOT NULL, + "logSettingsOverrides" json NOT NULL, + "logServiceCalls" boolean NOT NULL, + "logMalformedCalls" boolean NOT NULL +); + +-- +-- Class SessionLogEntry as table serverpod_session_log +-- +CREATE TABLE "serverpod_session_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "module" text, + "endpoint" text, + "method" text, + "duration" double precision, + "numQueries" bigint, + "slow" boolean, + "error" text, + "stackTrace" text, + "authenticatedUserId" bigint, + "isOpen" boolean, + "touched" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USING btree ("serverId"); +CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); +CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); + +-- +-- Class AuthKey as table serverpod_auth_key +-- +CREATE TABLE "serverpod_auth_key" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- Class EmailAuth as table serverpod_email_auth +-- +CREATE TABLE "serverpod_email_auth" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_email" ON "serverpod_email_auth" USING btree ("email"); + +-- +-- Class EmailCreateAccountRequest as table serverpod_email_create_request +-- +CREATE TABLE "serverpod_email_create_request" ( + "id" bigserial PRIMARY KEY, + "userName" text NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL, + "verificationCode" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_create_account_request_idx" ON "serverpod_email_create_request" USING btree ("email"); + +-- +-- Class EmailFailedSignIn as table serverpod_email_failed_sign_in +-- +CREATE TABLE "serverpod_email_failed_sign_in" ( + "id" bigserial PRIMARY KEY, + "email" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "ipAddress" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_email_failed_sign_in_email_idx" ON "serverpod_email_failed_sign_in" USING btree ("email"); +CREATE INDEX "serverpod_email_failed_sign_in_time_idx" ON "serverpod_email_failed_sign_in" USING btree ("time"); + +-- +-- Class EmailReset as table serverpod_email_reset +-- +CREATE TABLE "serverpod_email_reset" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "verificationCode" text NOT NULL, + "expiration" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_reset_verification_idx" ON "serverpod_email_reset" USING btree ("verificationCode"); + +-- +-- Class GoogleRefreshToken as table serverpod_google_refresh_token +-- +CREATE TABLE "serverpod_google_refresh_token" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "refreshToken" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_google_refresh_token_userId_idx" ON "serverpod_google_refresh_token" USING btree ("userId"); + +-- +-- Class UserImage as table serverpod_user_image +-- +CREATE TABLE "serverpod_user_image" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "version" bigint NOT NULL, + "url" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_user_image_user_id" ON "serverpod_user_image" USING btree ("userId", "version"); + +-- +-- Class UserInfo as table serverpod_user_info +-- +CREATE TABLE "serverpod_user_info" ( + "id" bigserial PRIMARY KEY, + "userIdentifier" text NOT NULL, + "userName" text, + "fullName" text, + "email" text, + "created" timestamp without time zone NOT NULL, + "imageUrl" text, + "scopeNames" json NOT NULL, + "blocked" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_user_info_user_identifier" ON "serverpod_user_info" USING btree ("userIdentifier"); +CREATE INDEX "serverpod_user_info_email" ON "serverpod_user_info" USING btree ("email"); + +-- +-- Foreign relations for "serverpod_log" table +-- +ALTER TABLE ONLY "serverpod_log" + ADD CONSTRAINT "serverpod_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_message_log" table +-- +ALTER TABLE ONLY "serverpod_message_log" + ADD CONSTRAINT "serverpod_message_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_query_log" table +-- +ALTER TABLE ONLY "serverpod_query_log" + ADD CONSTRAINT "serverpod_query_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816122625449', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816122625449', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816122625449/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816122625449/definition_project.json new file mode 100644 index 0000000..d649d10 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816122625449/definition_project.json @@ -0,0 +1,107 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816122625449/migration.json b/wien_talks/wien_talks_server/migrations/20250816122625449/migration.json new file mode 100644 index 0000000..c35478a --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816122625449/migration.json @@ -0,0 +1,676 @@ +{ + "actions": [ + { + "type": "createTable", + "createTable": { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_email_auth", + "dartName": "EmailAuth", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_auth_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_auth_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_email_create_request", + "dartName": "EmailCreateAccountRequest", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_create_request_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_create_request_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_create_account_request_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_email_failed_sign_in", + "dartName": "EmailFailedSignIn", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_failed_sign_in_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "ipAddress", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_failed_sign_in_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_failed_sign_in_email_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_email_failed_sign_in_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_email_reset", + "dartName": "EmailReset", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_reset_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_reset_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_reset_verification_idx", + "elements": [ + { + "type": 0, + "definition": "verificationCode" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_google_refresh_token", + "dartName": "GoogleRefreshToken", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_google_refresh_token_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "refreshToken", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_google_refresh_token_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_google_refresh_token_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_user_image", + "dartName": "UserImage", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_image_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "version", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "url", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_image_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_image_user_id", + "elements": [ + { + "type": 0, + "definition": "userId" + }, + { + "type": 0, + "definition": "version" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_user_info", + "dartName": "UserInfo", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userIdentifier", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "fullName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "created", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "imageUrl", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "blocked", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_info_user_identifier", + "elements": [ + { + "type": 0, + "definition": "userIdentifier" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_user_info_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + } + ], + "warnings": [], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816122625449/migration.sql b/wien_talks/wien_talks_server/migrations/20250816122625449/migration.sql new file mode 100644 index 0000000..a0392e6 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816122625449/migration.sql @@ -0,0 +1,158 @@ +BEGIN; + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "quote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "text" text NOT NULL, + "authorName" text, + "lat" double precision NOT NULL, + "long" double precision NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "visibility" bigint NOT NULL, + "upvotes" bigint NOT NULL, + "downvotes" bigint NOT NULL, + "tags" json +); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_auth_key" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_email_auth" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_email" ON "serverpod_email_auth" USING btree ("email"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_email_create_request" ( + "id" bigserial PRIMARY KEY, + "userName" text NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL, + "verificationCode" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_create_account_request_idx" ON "serverpod_email_create_request" USING btree ("email"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_email_failed_sign_in" ( + "id" bigserial PRIMARY KEY, + "email" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "ipAddress" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_email_failed_sign_in_email_idx" ON "serverpod_email_failed_sign_in" USING btree ("email"); +CREATE INDEX "serverpod_email_failed_sign_in_time_idx" ON "serverpod_email_failed_sign_in" USING btree ("time"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_email_reset" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "verificationCode" text NOT NULL, + "expiration" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_reset_verification_idx" ON "serverpod_email_reset" USING btree ("verificationCode"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_google_refresh_token" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "refreshToken" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_google_refresh_token_userId_idx" ON "serverpod_google_refresh_token" USING btree ("userId"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_user_image" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "version" bigint NOT NULL, + "url" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_user_image_user_id" ON "serverpod_user_image" USING btree ("userId", "version"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_user_info" ( + "id" bigserial PRIMARY KEY, + "userIdentifier" text NOT NULL, + "userName" text, + "fullName" text, + "email" text, + "created" timestamp without time zone NOT NULL, + "imageUrl" text, + "scopeNames" json NOT NULL, + "blocked" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_user_info_user_identifier" ON "serverpod_user_info" USING btree ("userIdentifier"); +CREATE INDEX "serverpod_user_info_email" ON "serverpod_user_info" USING btree ("email"); + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816122625449', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816122625449', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/migration_registry.txt b/wien_talks/wien_talks_server/migrations/migration_registry.txt index a0ec0ac..26980aa 100644 --- a/wien_talks/wien_talks_server/migrations/migration_registry.txt +++ b/wien_talks/wien_talks_server/migrations/migration_registry.txt @@ -5,3 +5,4 @@ ### the conflict by removing and recreating the conflicting migration. 20250816095813247 +20250816122625449 diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index d9ec37d..e06e769 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -15,6 +15,9 @@ import 'package:serverpod_test/serverpod_test.dart' as _i1; import 'package:serverpod/serverpod.dart' as _i2; import 'dart:async' as _i3; import 'package:wien_talks_server/src/generated/greeting.dart' as _i4; +import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i5; +import 'package:wien_talks_server/src/generated/quotes/create_quote.dart' + as _i6; import 'package:wien_talks_server/src/generated/protocol.dart'; import 'package:wien_talks_server/src/generated/endpoints.dart'; export 'package:serverpod_test/serverpod_test_public_exports.dart'; @@ -102,6 +105,8 @@ void withServerpod( class TestEndpoints { late final _GreetingEndpoint greeting; + + late final _QuoteEndpoint quote; } class _InternalTestEndpoints extends TestEndpoints @@ -115,6 +120,10 @@ class _InternalTestEndpoints extends TestEndpoints endpoints, serializationManager, ); + quote = _QuoteEndpoint( + endpoints, + serializationManager, + ); } } @@ -157,3 +166,99 @@ class _GreetingEndpoint { }); } } + +class _QuoteEndpoint { + _QuoteEndpoint( + this._endpointDispatch, + this._serializationManager, + ); + + final _i2.EndpointDispatch _endpointDispatch; + + final _i2.SerializationManager _serializationManager; + + _i3.Future<_i5.Quote> createQuote( + _i1.TestSessionBuilder sessionBuilder, + _i6.CreateQuoteRequest req, + ) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'quote', + method: 'createQuote', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'quote', + methodName: 'createQuote', + parameters: _i1.testObjectToJson({'req': req}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future<_i5.Quote>); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } + + _i3.Future<_i5.Quote> getQuoteById( + _i1.TestSessionBuilder sessionBuilder, + int id, + ) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'quote', + method: 'getQuoteById', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'quote', + methodName: 'getQuoteById', + parameters: _i1.testObjectToJson({'id': id}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future<_i5.Quote>); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } + + _i3.Future> getAllQuotes( + _i1.TestSessionBuilder sessionBuilder) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'quote', + method: 'getAllQuotes', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'quote', + methodName: 'getAllQuotes', + parameters: _i1.testObjectToJson({}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future>); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } +} From 75724e4043b5bb98399ed7040416b57a7585b5ab Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 14:43:05 +0200 Subject: [PATCH 10/49] yield quote updates --- .../lib/src/quotes/quotes_endpoint.dart | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart index 532d6fc..5cfe820 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -3,6 +3,22 @@ import 'package:wien_talks_server/src/generated/protocol.dart'; import 'package:wien_talks_server/src/quotes/quote_controller.dart'; class QuoteEndpoint extends Endpoint { + static const _channelQuoteUpdates = 'quote-updates'; + + Future updateQuote(Session session, Quote quote) async { + await Quote.db.updateRow(session, quote); + await session.messages.postMessage(_channelQuoteUpdates, quote); + } + + Stream quoteUpdates(Session session) async* { + var updateStream = + session.messages.createStream(_channelQuoteUpdates); + + await for (var quote in updateStream) { + yield quote; + } + } + Future createQuote(Session session, CreateQuoteRequest req) async { final authInfo = await session.authenticated; final userId = authInfo?.userId; @@ -29,6 +45,8 @@ class QuoteEndpoint extends Endpoint { ); final inserted = await session.db.insertRow(quote); + await session.messages.postMessage(_channelQuoteUpdates, quote); + return inserted; } From 4a7b426729934228a2b22b04262eb29a72c50a95 Mon Sep 17 00:00:00 2001 From: mikes222 Date: Sat, 16 Aug 2025 14:46:06 +0200 Subject: [PATCH 11/49] Location now working with map --- .../assets/render_themes/defaultrender.xml | 1507 +++++++++++++++++ .../lib/create_event_screen.dart | 12 +- .../lib/get_location_widget.dart | 62 +- .../wien_talks_flutter/lib/location_mgr.dart | 46 +- .../lib/mapfile_widget.dart | 26 + .../Flutter/GeneratedPluginRegistrant.swift | 6 + wien_talks/wien_talks_flutter/pubspec.yaml | 202 ++- 7 files changed, 1800 insertions(+), 61 deletions(-) create mode 100644 wien_talks/wien_talks_flutter/assets/render_themes/defaultrender.xml create mode 100644 wien_talks/wien_talks_flutter/lib/mapfile_widget.dart diff --git a/wien_talks/wien_talks_flutter/assets/render_themes/defaultrender.xml b/wien_talks/wien_talks_flutter/assets/render_themes/defaultrender.xml new file mode 100644 index 0000000..a82424f --- /dev/null +++ b/wien_talks/wien_talks_flutter/assets/render_themes/defaultrender.xml @@ -0,0 +1,1507 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart b/wien_talks/wien_talks_flutter/lib/create_event_screen.dart index bc50467..58f2947 100644 --- a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/create_event_screen.dart @@ -1,8 +1,12 @@ import 'package:flutter/cupertino.dart'; +import 'package:location/location.dart'; import 'package:wien_talks_flutter/get_location_widget.dart'; +import 'package:wien_talks_flutter/mapfile_widget.dart'; import 'package:wien_talks_flutter/news_input_form.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; +import 'location_mgr.dart'; + class CreateEventScreen extends StatelessWidget { const CreateEventScreen({super.key}); @@ -11,9 +15,13 @@ class CreateEventScreen extends StatelessWidget { return ScreenWidget( child: Column( children: [ - Text("hello"), - GetLocationWidget(), NewsInputForm(onSubmit: (newsEventModel) {}), + StreamBuilder(stream: LocationMgr().stream, builder: (BuildContext context, AsyncSnapshot snapshot) => Text(snapshot.data.toString())), + Expanded( + child: GetLocationWidget( + child: MapfileWidget(), + ), + ), ], )); } diff --git a/wien_talks/wien_talks_flutter/lib/get_location_widget.dart b/wien_talks/wien_talks_flutter/lib/get_location_widget.dart index 4fad495..3c190e2 100644 --- a/wien_talks/wien_talks_flutter/lib/get_location_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/get_location_widget.dart @@ -1,38 +1,42 @@ import 'package:flutter/material.dart'; -import 'package:location/location.dart'; import 'package:wien_talks_flutter/location_mgr.dart'; -class GetLocationWidget extends StatelessWidget { - const GetLocationWidget({super.key}); +class GetLocationWidget extends StatefulWidget { + final Widget child; + + const GetLocationWidget({super.key, required this.child}); + + @override + State createState() => _GetLocationWidgetState(); +} + +class _GetLocationWidgetState extends State { + @override + void dispose() { + LocationMgr().shutdown(); + super.dispose(); + } @override Widget build(BuildContext context) { - return Column( - children: [ - FutureBuilder( - future: LocationMgr().startup(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - switch (snapshot.connectionState) { - case ConnectionState.waiting: - return CircularProgressIndicator(); - case ConnectionState.done: - { - if (snapshot.hasData) { - // Error occured - return Text(snapshot.data.toString()); - } else { - return Text("No data -> OK"); - } - } - default: - if (snapshot.hasError) { - return Text('Error: ${snapshot.error}'); - } - return Text("OK"); + return FutureBuilder( + future: LocationMgr().startup(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.none: + case ConnectionState.waiting: + return CircularProgressIndicator(); + case ConnectionState.active: + case ConnectionState.done: + { + if (snapshot.hasData) { + // Error occured + return Text(snapshot.data.toString(), style: TextStyle(color: Colors.red)); + } else { + return widget.child; + } } - }), - StreamBuilder(stream: LocationMgr().stream, builder: (BuildContext context, AsyncSnapshot snapshot) => Text(snapshot.data.toString())), - ], - ); + } + }); } } diff --git a/wien_talks/wien_talks_flutter/lib/location_mgr.dart b/wien_talks/wien_talks_flutter/lib/location_mgr.dart index 1ab24b9..c43dab0 100644 --- a/wien_talks/wien_talks_flutter/lib/location_mgr.dart +++ b/wien_talks/wien_talks_flutter/lib/location_mgr.dart @@ -1,10 +1,14 @@ import 'dart:async'; +import 'package:flutter/material.dart'; import 'package:location/location.dart'; +import 'package:mapsforge_flutter/core.dart'; +import 'package:mapsforge_flutter/maps.dart'; +import 'package:mapsforge_flutter/marker.dart'; import 'package:rxdart/rxdart.dart'; class LocationMgr { - Location location = Location(); + final Location location = Location(); bool serviceEnabled = false; @@ -16,14 +20,35 @@ class LocationMgr { final Subject _subject = PublishSubject(); + final TileBitmapCache bitmapCache = MemoryTileBitmapCache.create(); + StreamSubscription? _subscription; + ViewModel? viewModel; + + late MapModel mapModel; + + IconMarker? iconMarker; + + final DisplayModel displayModel = DisplayModel(maxZoomLevel: 20); + + final SymbolCache symbolCache = FileSymbolCache(); + + final JobRenderer jobRenderer = MapOnlineRenderer(); + factory LocationMgr() { _instance ??= LocationMgr._(); return _instance!; } - LocationMgr._(); + LocationMgr._() { + mapModel = MapModel( + displayModel: displayModel, + renderer: jobRenderer, + symbolCache: symbolCache, + tileBitmapCache: bitmapCache, + ); + } Future startup() async { serviceEnabled = await location.serviceEnabled(); @@ -41,8 +66,21 @@ class LocationMgr { return "No permissions granted"; } } + viewModel = ViewModel(displayModel: displayModel); _subscription = location.onLocationChanged.listen((LocationData currentLocation) { _lastLocationData = currentLocation; + if (currentLocation.latitude != null && currentLocation.longitude != null) { + viewModel?.setMapViewPosition(currentLocation.latitude!, currentLocation.longitude!); + if (iconMarker == null) { + iconMarker ??= IconMarker( + fontSize: 30, + icon: Icons.gps_fixed, + color: Colors.red, + center: LatLong(currentLocation.latitude!, currentLocation.longitude!), + displayModel: displayModel); + mapModel.markerDataStores.add(MarkerDataStore()..addMarker(iconMarker!)); + } + } _subject.add(currentLocation); }); return null; @@ -51,6 +89,10 @@ class LocationMgr { void shutdown() { _subscription?.cancel(); _subscription = null; + mapModel.markerDataStores.clear(); + iconMarker = null; + viewModel?.dispose(); + viewModel = null; } Stream get stream => _subject.stream; diff --git a/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart b/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart new file mode 100644 index 0000000..8134338 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart @@ -0,0 +1,26 @@ +import 'package:flutter/cupertino.dart'; +import 'package:mapsforge_flutter/core.dart'; +import 'package:wien_talks_flutter/location_mgr.dart'; + +class MapfileWidget extends StatefulWidget { + const MapfileWidget({super.key}); + + @override + State createState() => _MapfileWidgetState(); +} + +////////////////////////////////////////////////////////////////////////////// + +class _MapfileWidgetState extends State { + @override + Widget build(BuildContext context) { + return MapviewWidget( + displayModel: LocationMgr().displayModel, + createMapModel: () async { + return LocationMgr().mapModel; + }, + createViewModel: () async { + return LocationMgr().viewModel!; + }); + } +} diff --git a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift index 407ec0f..09409a5 100644 --- a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift @@ -10,8 +10,11 @@ import file_picker import file_selector_macos import location import path_provider_foundation +<<<<<<< Updated upstream import shared_preferences_foundation import sqflite_darwin +======= +>>>>>>> Stashed changes func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) @@ -19,6 +22,9 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) +<<<<<<< Updated upstream SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) +======= +>>>>>>> Stashed changes } diff --git a/wien_talks/wien_talks_flutter/pubspec.yaml b/wien_talks/wien_talks_flutter/pubspec.yaml index 80b3751..d32cc2e 100644 --- a/wien_talks/wien_talks_flutter/pubspec.yaml +++ b/wien_talks/wien_talks_flutter/pubspec.yaml @@ -29,6 +29,8 @@ dependencies: location: ^8.0.1 + mapsforge_flutter: ^3.0.2 + rxdart: ^0.28.0 serverpod_flutter: 2.9.1 @@ -59,32 +61,176 @@ flutter: uses-material-design: true # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg + assets: + - assets/render_themes/ + - packages/mapsforge_flutter/assets/patterns/dark_farmland.svg + - packages/mapsforge_flutter/assets/patterns/dark_military.png + - packages/mapsforge_flutter/assets/patterns/coniferous.svg + - packages/mapsforge_flutter/assets/patterns/coniferous_and_deciduous.svg + - packages/mapsforge_flutter/assets/patterns/deciduous.svg + - packages/mapsforge_flutter/assets/patterns/farmland.svg + - packages/mapsforge_flutter/assets/patterns/grass.svg + - packages/mapsforge_flutter/assets/patterns/hills.svg + - packages/mapsforge_flutter/assets/patterns/quarry.svg + - packages/mapsforge_flutter/assets/patterns/scrub.svg + - packages/mapsforge_flutter/assets/patterns/swamp.svg + - packages/mapsforge_flutter/assets/patterns/access-destination.png + - packages/mapsforge_flutter/assets/patterns/access-private.png + - packages/mapsforge_flutter/assets/patterns/arrow.png + - packages/mapsforge_flutter/assets/patterns/cemetery.png + - packages/mapsforge_flutter/assets/patterns/deciduous.svg + - packages/mapsforge_flutter/assets/patterns/dot.png + - packages/mapsforge_flutter/assets/patterns/farmland.svg + - packages/mapsforge_flutter/assets/patterns/grass.svg + - packages/mapsforge_flutter/assets/patterns/hills.svg + - packages/mapsforge_flutter/assets/patterns/marsh.png + - packages/mapsforge_flutter/assets/patterns/military.png + - packages/mapsforge_flutter/assets/patterns/nature-reserve.png + - packages/mapsforge_flutter/assets/patterns/pike.png + - packages/mapsforge_flutter/assets/patterns/quarry.svg + - packages/mapsforge_flutter/assets/patterns/rail.png + - packages/mapsforge_flutter/assets/patterns/scrub.svg + - packages/mapsforge_flutter/assets/patterns/swamp.svg + - packages/mapsforge_flutter/assets/patterns/wood-coniferous.png + - packages/mapsforge_flutter/assets/patterns/wood-deciduous.png + - packages/mapsforge_flutter/assets/patterns/wood-mixed.png + - packages/mapsforge_flutter/assets/symbols/bench.svg + - packages/mapsforge_flutter/assets/symbols/cable_car.svg + - packages/mapsforge_flutter/assets/symbols/chair_lift.svg + - packages/mapsforge_flutter/assets/symbols/dot_black.svg + - packages/mapsforge_flutter/assets/symbols/dot_blue.svg + - packages/mapsforge_flutter/assets/symbols/dot_blue_dark.svg + - packages/mapsforge_flutter/assets/symbols/dot_magenta.svg + - packages/mapsforge_flutter/assets/symbols/dot_white.svg + - packages/mapsforge_flutter/assets/symbols/gondola.svg + - packages/mapsforge_flutter/assets/symbols/oneway.svg + - packages/mapsforge_flutter/assets/symbols/peak.svg + - packages/mapsforge_flutter/assets/symbols/railway-crossing-small.svg + - packages/mapsforge_flutter/assets/symbols/railway-crossing.svg + - packages/mapsforge_flutter/assets/symbols/traffic_signal.svg + - packages/mapsforge_flutter/assets/symbols/volcano.svg + - packages/mapsforge_flutter/assets/symbols/accommodation/alpinehut.svg + - packages/mapsforge_flutter/assets/symbols/accommodation/camping.svg + - packages/mapsforge_flutter/assets/symbols/accommodation/caravan_park.svg + - packages/mapsforge_flutter/assets/symbols/accommodation/chalet.svg + - packages/mapsforge_flutter/assets/symbols/accommodation/hostel.svg + - packages/mapsforge_flutter/assets/symbols/accommodation/hotel2.svg + - packages/mapsforge_flutter/assets/symbols/accommodation/shelter2.svg + - packages/mapsforge_flutter/assets/symbols/amenity/firestation3.svg + - packages/mapsforge_flutter/assets/symbols/amenity/fountain2.svg + - packages/mapsforge_flutter/assets/symbols/amenity/library.svg + - packages/mapsforge_flutter/assets/symbols/amenity/playground.svg + - packages/mapsforge_flutter/assets/symbols/amenity/police2.svg + - packages/mapsforge_flutter/assets/symbols/amenity/post_box.svg + - packages/mapsforge_flutter/assets/symbols/amenity/post_office.svg + - packages/mapsforge_flutter/assets/symbols/amenity/recycling.svg + - packages/mapsforge_flutter/assets/symbols/amenity/telephone.svg + - packages/mapsforge_flutter/assets/symbols/amenity/toilets.svg + - packages/mapsforge_flutter/assets/symbols/barrier/blocks.svg + - packages/mapsforge_flutter/assets/symbols/barrier/bollard.svg + - packages/mapsforge_flutter/assets/symbols/barrier/cycle_barrier.svg + - packages/mapsforge_flutter/assets/symbols/barrier/gate.svg + - packages/mapsforge_flutter/assets/symbols/barrier/lift_gate.svg + - packages/mapsforge_flutter/assets/symbols/barrier/stile.svg + - packages/mapsforge_flutter/assets/symbols/custom/amenity/fountain2.svg + - packages/mapsforge_flutter/assets/symbols/custom/amenity/library.svg + - packages/mapsforge_flutter/assets/symbols/custom/amenity/toilets.svg + - packages/mapsforge_flutter/assets/symbols/custom/money/atm2.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/archaeological2.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/attraction.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/castle2.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/cinema2.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/information.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/memorial.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/monument.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/museum.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/ruin.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/theatre.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/view_point.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/windmill.svg + - packages/mapsforge_flutter/assets/symbols/custom/tourist/zoo.svg + - packages/mapsforge_flutter/assets/symbols/education/nursery3.svg + - packages/mapsforge_flutter/assets/symbols/education/school.svg + - packages/mapsforge_flutter/assets/symbols/education/university.svg + - packages/mapsforge_flutter/assets/symbols/food/bar.svg + - packages/mapsforge_flutter/assets/symbols/food/biergarten.svg + - packages/mapsforge_flutter/assets/symbols/food/cafe.svg + - packages/mapsforge_flutter/assets/symbols/food/drinkingtap.svg + - packages/mapsforge_flutter/assets/symbols/food/fastfood.svg + - packages/mapsforge_flutter/assets/symbols/food/pub.svg + - packages/mapsforge_flutter/assets/symbols/food/restaurant.svg + - packages/mapsforge_flutter/assets/symbols/health/doctors2.svg + - packages/mapsforge_flutter/assets/symbols/health/hospital.svg + - packages/mapsforge_flutter/assets/symbols/health/pharmacy.svg + - packages/mapsforge_flutter/assets/symbols/money/atm2.svg + - packages/mapsforge_flutter/assets/symbols/money/bank2.svg + - packages/mapsforge_flutter/assets/symbols/place_of_worship/buddhist.svg + - packages/mapsforge_flutter/assets/symbols/place_of_worship/christian.svg + - packages/mapsforge_flutter/assets/symbols/place_of_worship/hindu.svg + - packages/mapsforge_flutter/assets/symbols/place_of_worship/islamic.svg + - packages/mapsforge_flutter/assets/symbols/place_of_worship/jewish.svg + - packages/mapsforge_flutter/assets/symbols/place_of_worship/shinto.svg + - packages/mapsforge_flutter/assets/symbols/place_of_worship/unknown.svg + - packages/mapsforge_flutter/assets/symbols/poi/cave.svg + - packages/mapsforge_flutter/assets/symbols/poi/embassy2.svg + - packages/mapsforge_flutter/assets/symbols/poi/mountain_pass.svg + - packages/mapsforge_flutter/assets/symbols/shopping/alcohol.svg + - packages/mapsforge_flutter/assets/symbols/shopping/bakery.svg + - packages/mapsforge_flutter/assets/symbols/shopping/bicycle.svg + - packages/mapsforge_flutter/assets/symbols/shopping/book.svg + - packages/mapsforge_flutter/assets/symbols/shopping/butcher.svg + - packages/mapsforge_flutter/assets/symbols/shopping/car_repair.svg + - packages/mapsforge_flutter/assets/symbols/shopping/convenience.svg + - packages/mapsforge_flutter/assets/symbols/shopping/diy.svg + - packages/mapsforge_flutter/assets/symbols/shopping/greengrocer.svg + - packages/mapsforge_flutter/assets/symbols/shopping/laundrette.svg + - packages/mapsforge_flutter/assets/symbols/shopping/marketplace.svg + - packages/mapsforge_flutter/assets/symbols/shopping/supermarket.svg + - packages/mapsforge_flutter/assets/symbols/sport/golf.svg + - packages/mapsforge_flutter/assets/symbols/sport/shooting.svg + - packages/mapsforge_flutter/assets/symbols/sport/soccer.svg + - packages/mapsforge_flutter/assets/symbols/sport/stadium.svg + - packages/mapsforge_flutter/assets/symbols/sport/swimming_outdoor.svg + - packages/mapsforge_flutter/assets/symbols/sport/tennis.svg + - packages/mapsforge_flutter/assets/symbols/tourist/archaeological2.svg + - packages/mapsforge_flutter/assets/symbols/tourist/attraction.svg + - packages/mapsforge_flutter/assets/symbols/tourist/castle2.svg + - packages/mapsforge_flutter/assets/symbols/tourist/cinema2.svg + - packages/mapsforge_flutter/assets/symbols/tourist/information.svg + - packages/mapsforge_flutter/assets/symbols/tourist/memorial.svg + - packages/mapsforge_flutter/assets/symbols/tourist/monument.svg + - packages/mapsforge_flutter/assets/symbols/tourist/museum.svg + - packages/mapsforge_flutter/assets/symbols/tourist/picnic.svg + - packages/mapsforge_flutter/assets/symbols/tourist/ruin.svg + - packages/mapsforge_flutter/assets/symbols/tourist/theatre.svg + - packages/mapsforge_flutter/assets/symbols/tourist/view_point.svg + - packages/mapsforge_flutter/assets/symbols/tourist/windmill.svg + - packages/mapsforge_flutter/assets/symbols/tourist/zoo.svg + - packages/mapsforge_flutter/assets/symbols/transport/airport2.svg + - packages/mapsforge_flutter/assets/symbols/transport/bus_station.svg + - packages/mapsforge_flutter/assets/symbols/transport/bus_stop.svg + - packages/mapsforge_flutter/assets/symbols/transport/fuel.svg + - packages/mapsforge_flutter/assets/symbols/transport/helicopter.svg + - packages/mapsforge_flutter/assets/symbols/transport/lighthouse.svg + - packages/mapsforge_flutter/assets/symbols/transport/parking.svg + - packages/mapsforge_flutter/assets/symbols/transport/parking_private.svg + - packages/mapsforge_flutter/assets/symbols/transport/rental_bicycle.svg + - packages/mapsforge_flutter/assets/symbols/transport/slipway.svg + - packages/mapsforge_flutter/assets/symbols/transport/traffic_lights.svg + - packages/mapsforge_flutter/assets/symbols/transport/train_station2.svg + - packages/mapsforge_flutter/assets/symbols/transport/tram_stop.svg + - packages/mapsforge_flutter/assets/symbols/water/weir.svg + - packages/mapsforge_flutter/assets/symbols/windsock.svg + - packages/mapsforge_flutter/assets/symbols/viewpoint.svg - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware. - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/assets-and-images/#from-packages - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages + fonts: + - family: serif + fonts: + - asset: packages/mapsforge_flutter/assets/fonts/FreeSerif.otf + - asset: packages/mapsforge_flutter/assets/fonts/FreeSerifBold.otf + weight: 700 + - asset: packages/mapsforge_flutter/assets/fonts/FreeSerifBoldItalic.otf + style: italic + weight: 700 + - asset: packages/mapsforge_flutter/assets/fonts/FreeSerifItalic.otf + style: italic From 3684a0944ebae7eb5071438f353dfb21c8495c64 Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 12:21:28 +0200 Subject: [PATCH 12/49] dockerfile: pin alpine image version to 3.22 Signed-off-by: Max R. Carrara --- wien_talks/wien_talks_server/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wien_talks/wien_talks_server/Dockerfile b/wien_talks/wien_talks_server/Dockerfile index 1496f72..33ec119 100644 --- a/wien_talks/wien_talks_server/Dockerfile +++ b/wien_talks/wien_talks_server/Dockerfile @@ -8,7 +8,7 @@ RUN dart pub get RUN dart compile exe bin/main.dart -o bin/server # Final stage -FROM alpine:latest +FROM alpine:3.22 # Environment variables ENV runmode=production From 82fcb683ba49cf1d64ec4305f4326f63d48bd97c Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 14:45:35 +0200 Subject: [PATCH 13/49] make: add compose file and make targets for local dev container Signed-off-by: Max R. Carrara --- wien_talks/wien_talks_server/.env.template | 3 +++ wien_talks/wien_talks_server/.gitignore | 3 ++- wien_talks/wien_talks_server/Makefile | 25 +++++++++++++++++++ wien_talks/wien_talks_server/README.md | 14 +++++++++++ .../docker-compose.local.yaml | 16 ++++++++++++ .../wien_talks_server/docker-compose.yaml | 16 ------------ 6 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 wien_talks/wien_talks_server/.env.template create mode 100644 wien_talks/wien_talks_server/Makefile create mode 100644 wien_talks/wien_talks_server/docker-compose.local.yaml delete mode 100644 wien_talks/wien_talks_server/docker-compose.yaml diff --git a/wien_talks/wien_talks_server/.env.template b/wien_talks/wien_talks_server/.env.template new file mode 100644 index 0000000..f44571b --- /dev/null +++ b/wien_talks/wien_talks_server/.env.template @@ -0,0 +1,3 @@ +POSTGRES_USER=postgres +POSTGRES_DB=wien_talks +POSTGRES_PASSWORD=sergtsop diff --git a/wien_talks/wien_talks_server/.gitignore b/wien_talks/wien_talks_server/.gitignore index ee19b5d..c4bbf42 100644 --- a/wien_talks/wien_talks_server/.gitignore +++ b/wien_talks/wien_talks_server/.gitignore @@ -14,4 +14,5 @@ config/passwords.yaml # Firebase service account key for Firebase auth config/firebase_service_account_key.json -.env \ No newline at end of file +.env +*.env diff --git a/wien_talks/wien_talks_server/Makefile b/wien_talks/wien_talks_server/Makefile new file mode 100644 index 0000000..8f54d82 --- /dev/null +++ b/wien_talks/wien_talks_server/Makefile @@ -0,0 +1,25 @@ +include ../defines.mk + +COMPOSE_FILE_LOCAL = docker-compose.local.yaml +COMPOSE_FILE_DEPLOY = docker-compose.deploy.yaml + +# Basically the current directory's name, so wien_talks_server +COMPOSE_PROJECT := $(shell basename $(shell pwd)) + +.env: .env.template + cp -a .env.template .env + +.PHONY := local local-stop local-down local-clean +local: .env + docker compose -f $(COMPOSE_FILE_LOCAL) up -d + +local-stop: + docker compose -f $(COMPOSE_FILE_LOCAL) stop + +local-down: + docker compose -f $(COMPOSE_FILE_LOCAL) down + +local-clean: local-down + for VOLUME in $(shell docker compose -f $(COMPOSE_FILE_LOCAL) volumes -q); \ + do docker volume rm "$$VOLUME"; done + diff --git a/wien_talks/wien_talks_server/README.md b/wien_talks/wien_talks_server/README.md index f730d7e..daddc21 100644 --- a/wien_talks/wien_talks_server/README.md +++ b/wien_talks/wien_talks_server/README.md @@ -13,3 +13,17 @@ Then you can start the Serverpod server. When you are finished, you can shut down Serverpod with `Ctrl-C`, then stop Postgres and Redis. docker compose stop + +## Environments & Passwords + +Note that the password used in your environment files (`.env` for local +development and `env.d/postgres.env.template` for deployment) must correspond to +the password in `config/passwords.yaml`. + +The `config/passwords.yaml` file must be created manually, for example: + +```yaml +development: + database: your-password-here +``` + diff --git a/wien_talks/wien_talks_server/docker-compose.local.yaml b/wien_talks/wien_talks_server/docker-compose.local.yaml new file mode 100644 index 0000000..730d41c --- /dev/null +++ b/wien_talks/wien_talks_server/docker-compose.local.yaml @@ -0,0 +1,16 @@ +services: + postgres: + image: postgres:16-trixie + container_name: postgres-dev + environment: + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_DB=${POSTGRES_DB} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + volumes: + - db-local:/var/lib/postgresql/data + restart: unless-stopped + ports: + - "8090:5432" + +volumes: + db-local: diff --git a/wien_talks/wien_talks_server/docker-compose.yaml b/wien_talks/wien_talks_server/docker-compose.yaml deleted file mode 100644 index 09621fa..0000000 --- a/wien_talks/wien_talks_server/docker-compose.yaml +++ /dev/null @@ -1,16 +0,0 @@ -services: - # Development services - postgres: - image: pgvector/pgvector:pg16 - ports: - - "8090:5432" - environment: - POSTGRES_USER: - POSTGRES_DB: - POSTGRES_PASSWORD: - volumes: - - wien_talks_data:/var/lib/postgresql/data - -volumes: - wien_talks_data: - wien_talks_test_data: From 2dd01b94a05e0999fc51ccf5afec57095eacc1e0 Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 14:50:05 +0200 Subject: [PATCH 14/49] make: add top-level Makefile and defines.mk Signed-off-by: Max R. Carrara --- wien_talks/Makefile | 7 +++++++ wien_talks/defines.mk | 0 2 files changed, 7 insertions(+) create mode 100644 wien_talks/Makefile create mode 100644 wien_talks/defines.mk diff --git a/wien_talks/Makefile b/wien_talks/Makefile new file mode 100644 index 0000000..a92bbf1 --- /dev/null +++ b/wien_talks/Makefile @@ -0,0 +1,7 @@ +include defines.mk + + +.PHONY := local +local: + $(MAKE) -C wien_talks_server local + diff --git a/wien_talks/defines.mk b/wien_talks/defines.mk new file mode 100644 index 0000000..e69de29 From 68e940986d94aa882dd27820deef19a9c3f1a79d Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 15:04:06 +0200 Subject: [PATCH 15/49] readme: update readme Signed-off-by: Max R. Carrara --- wien_talks/wien_talks_server/README.md | 38 ++++++++++++++++++-------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/wien_talks/wien_talks_server/README.md b/wien_talks/wien_talks_server/README.md index daddc21..e4d5962 100644 --- a/wien_talks/wien_talks_server/README.md +++ b/wien_talks/wien_talks_server/README.md @@ -1,29 +1,43 @@ # wien_talks_server -This is the starting point for your Serverpod server. +## Local Development Environment -To run your server, you first need to start Postgres and Redis. It's easiest to do with Docker. +Setting up a local postgres container, run the following: - docker compose up --build --detach +```bash +make local +``` -Then you can start the Serverpod server. +This will first create an `.env` file with default values and then launch the +container. - dart bin/main.dart +You can then launch the Serverpod server like so: -When you are finished, you can shut down Serverpod with `Ctrl-C`, then stop Postgres and Redis. +```bash +dart bin/main.dart +``` - docker compose stop +If your database schema isn't initialized yet, you will have to run the +following: -## Environments & Passwords +```bash +dart bin/main.dart --apply-migrations +``` -Note that the password used in your environment files (`.env` for local -development and `env.d/postgres.env.template` for deployment) must correspond to -the password in `config/passwords.yaml`. +See the `Makefile` for all targets. -The `config/passwords.yaml` file must be created manually, for example: +## Passwords + +The password used in your environment files (`.env` for local development and +`env.d/postgres.env.template` for deployment) must correspond to the password in +`config/passwords.yaml`. + +The `config/passwords.yaml` file must be created manually at the moment; for +example: ```yaml development: database: your-password-here ``` + From aa20d32c27c9d333fa8e88a728f1a3ea7d021f2d Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 15:26:02 +0200 Subject: [PATCH 16/49] server: make: add local-env target for convenience Signed-off-by: Max R. Carrara --- wien_talks/wien_talks_server/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wien_talks/wien_talks_server/Makefile b/wien_talks/wien_talks_server/Makefile index 8f54d82..70f2ff5 100644 --- a/wien_talks/wien_talks_server/Makefile +++ b/wien_talks/wien_talks_server/Makefile @@ -9,10 +9,12 @@ COMPOSE_PROJECT := $(shell basename $(shell pwd)) .env: .env.template cp -a .env.template .env -.PHONY := local local-stop local-down local-clean +.PHONY := local local-env local-stop local-down local-clean local: .env docker compose -f $(COMPOSE_FILE_LOCAL) up -d +local-env: .env + local-stop: docker compose -f $(COMPOSE_FILE_LOCAL) stop From 707dfbd76c38c52eca4246f82fa662d668533edf Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 15:04:09 +0200 Subject: [PATCH 17/49] add sample http client call logic --- .../lib/src/protocol/client.dart | 15 +++++ wien_talks/wien_talks_flutter/lib/main.dart | 8 ++- .../wien_talks_flutter/lib/news_screen.dart | 41 ++++++++----- .../lib/widgets/add-quote-fab.dart | 17 ++++++ .../lib/widgets/screen_widget.dart | 2 + .../Flutter/GeneratedPluginRegistrant.swift | 6 -- .../lib/src/generated/endpoints.dart | 39 +++++++++++-- .../lib/src/generated/protocol.yaml | 2 + ...{quote_controller.dart => quote_util.dart} | 0 .../lib/src/quotes/quotes_endpoint.dart | 2 +- .../test_tools/serverpod_test_tools.dart | 58 +++++++++++++++++++ 11 files changed, 161 insertions(+), 29 deletions(-) create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart rename wien_talks/wien_talks_server/lib/src/quotes/{quote_controller.dart => quote_util.dart} (100%) diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index 3440443..0d92249 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -42,6 +42,21 @@ class EndpointQuote extends _i1.EndpointRef { @override String get name => 'quote'; + _i2.Future updateQuote(_i4.Quote quote) => + caller.callServerEndpoint( + 'quote', + 'updateQuote', + {'quote': quote}, + ); + + _i2.Stream<_i4.Quote> quoteUpdates() => + caller.callStreamingServerEndpoint<_i2.Stream<_i4.Quote>, _i4.Quote>( + 'quote', + 'quoteUpdates', + {}, + {}, + ); + _i2.Future<_i4.Quote> createQuote(_i5.CreateQuoteRequest req) => caller.callServerEndpoint<_i4.Quote>( 'quote', diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index b1326db..d39a4a8 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -21,9 +21,13 @@ void main() { // You can set the variable when running or building your app like this: // E.g. `flutter run --dart-define=SERVER_URL=https://api.example.com/` const serverUrlFromEnv = String.fromEnvironment('SERVER_URL'); - final serverUrl = serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; + final serverUrl = + serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; - client = Client(serverUrl)..connectivityMonitor = FlutterConnectivityMonitor(); + client = Client(serverUrl) + ..connectivityMonitor = FlutterConnectivityMonitor(); + + client.openStreamingConnection(); runApp(const MyApp()); } diff --git a/wien_talks/wien_talks_flutter/lib/news_screen.dart b/wien_talks/wien_talks_flutter/lib/news_screen.dart index 5cdd782..4fcb635 100644 --- a/wien_talks/wien_talks_flutter/lib/news_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/news_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:wien_talks_flutter/main.dart'; import 'package:wien_talks_flutter/widgets/heading_text.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; @@ -10,24 +11,32 @@ class NewsScreen extends StatelessWidget { @override Widget build(BuildContext context) { + var column = Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + HeadingText(text: "Latest news"), + ...[Text("News 1"), Text("News 2")], + SizedBox( + height: 30, + ), + OutlinedButton( + onPressed: () { + context.pushNamed("create_event"); + }, + child: Text("Submit your own event")), + ], + ); return ScreenWidget( child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - HeadingText(text: "Latest news"), - ...[Text("News 1"), Text("News 2")], - SizedBox( - height: 30, - ), - OutlinedButton( - onPressed: () { - context.pushNamed("create_event"); - }, - child: Text("Submit your own event")), - ], - ), - ), + child: StreamBuilder( + stream: client.quote.quoteUpdates(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.active) { + return Text(snapshot.data?.text ?? 'Empty Text'); + } + + return Text('Empty or Error'); + })), ); } } diff --git a/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart b/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart new file mode 100644 index 0000000..31750ef --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/main.dart'; + +class AddQuoteFab extends StatelessWidget { + const AddQuoteFab({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return FloatingActionButton(onPressed: () { + client.quote.createQuote( + CreateQuoteRequest(text: 'Quote Text', lat: 22, lng: 140)); + }); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart index 26638d4..3237ce3 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:wien_talks_flutter/widgets/add-quote-fab.dart'; class ScreenWidget extends StatelessWidget { final Widget child; @@ -11,6 +12,7 @@ class ScreenWidget extends StatelessWidget { appBar: AppBar( title: const Text('News'), ), + floatingActionButton: AddQuoteFab(), body: SafeArea( child: Padding( padding: const EdgeInsets.all(8.0), diff --git a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift index 09409a5..407ec0f 100644 --- a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift @@ -10,11 +10,8 @@ import file_picker import file_selector_macos import location import path_provider_foundation -<<<<<<< Updated upstream import shared_preferences_foundation import sqflite_darwin -======= ->>>>>>> Stashed changes func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) @@ -22,9 +19,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) -<<<<<<< Updated upstream SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) -======= ->>>>>>> Stashed changes } diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index 13b7730..b616e1a 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -12,9 +12,10 @@ import 'package:serverpod/serverpod.dart' as _i1; import '../greeting_endpoint.dart' as _i2; import '../quotes/quotes_endpoint.dart' as _i3; +import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i4; import 'package:wien_talks_server/src/generated/quotes/create_quote.dart' - as _i4; -import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i5; + as _i5; +import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i6; class Endpoints extends _i1.EndpointDispatch { @override @@ -61,12 +62,30 @@ class Endpoints extends _i1.EndpointDispatch { name: 'quote', endpoint: endpoints['quote']!, methodConnectors: { + 'updateQuote': _i1.MethodConnector( + name: 'updateQuote', + params: { + 'quote': _i1.ParameterDescription( + name: 'quote', + type: _i1.getType<_i4.Quote>(), + nullable: false, + ) + }, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['quote'] as _i3.QuoteEndpoint).updateQuote( + session, + params['quote'], + ), + ), 'createQuote': _i1.MethodConnector( name: 'createQuote', params: { 'req': _i1.ParameterDescription( name: 'req', - type: _i1.getType<_i4.CreateQuoteRequest>(), + type: _i1.getType<_i5.CreateQuoteRequest>(), nullable: false, ) }, @@ -106,8 +125,20 @@ class Endpoints extends _i1.EndpointDispatch { ) async => (endpoints['quote'] as _i3.QuoteEndpoint).getAllQuotes(session), ), + 'quoteUpdates': _i1.MethodStreamConnector( + name: 'quoteUpdates', + params: {}, + streamParams: {}, + returnType: _i1.MethodStreamReturnType.streamType, + call: ( + _i1.Session session, + Map params, + Map streamParams, + ) => + (endpoints['quote'] as _i3.QuoteEndpoint).quoteUpdates(session), + ), }, ); - modules['serverpod_auth'] = _i5.Endpoints()..initializeEndpoints(server); + modules['serverpod_auth'] = _i6.Endpoints()..initializeEndpoints(server); } } diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml index 5c2d35a..160b550 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml @@ -1,6 +1,8 @@ greeting: - hello: quote: + - updateQuote: + - quoteUpdates: - createQuote: - getQuoteById: - getAllQuotes: diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quote_controller.dart b/wien_talks/wien_talks_server/lib/src/quotes/quote_util.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/quotes/quote_controller.dart rename to wien_talks/wien_talks_server/lib/src/quotes/quote_util.dart diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart index 5cfe820..6108211 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -1,6 +1,6 @@ import 'package:serverpod/serverpod.dart'; import 'package:wien_talks_server/src/generated/protocol.dart'; -import 'package:wien_talks_server/src/quotes/quote_controller.dart'; +import 'package:wien_talks_server/src/quotes/quote_util.dart'; class QuoteEndpoint extends Endpoint { static const _channelQuoteUpdates = 'quote-updates'; diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index e06e769..6c77e53 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -177,6 +177,64 @@ class _QuoteEndpoint { final _i2.SerializationManager _serializationManager; + _i3.Future updateQuote( + _i1.TestSessionBuilder sessionBuilder, + _i5.Quote quote, + ) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'quote', + method: 'updateQuote', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'quote', + methodName: 'updateQuote', + parameters: _i1.testObjectToJson({'quote': quote}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } + + _i3.Stream<_i5.Quote> quoteUpdates(_i1.TestSessionBuilder sessionBuilder) { + var _localTestStreamManager = _i1.TestStreamManager<_i5.Quote>(); + _i1.callStreamFunctionAndHandleExceptions( + () async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'quote', + method: 'quoteUpdates', + ); + var _localCallContext = + await _endpointDispatch.getMethodStreamCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'quote', + methodName: 'quoteUpdates', + arguments: {}, + requestedInputStreams: [], + serializationManager: _serializationManager, + ); + await _localTestStreamManager.callStreamMethod( + _localCallContext, + _localUniqueSession, + {}, + ); + }, + _localTestStreamManager.outputStreamController, + ); + return _localTestStreamManager.outputStreamController.stream; + } + _i3.Future<_i5.Quote> createQuote( _i1.TestSessionBuilder sessionBuilder, _i6.CreateQuoteRequest req, From b427b44e4c09783202a85391af2afd60dc2bfa58 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 15:47:46 +0200 Subject: [PATCH 18/49] rename android pkg, ignore client secrets --- wien_talks/wien_talks_flutter/android/app/build.gradle.kts | 4 ++-- .../kotlin/com/example/wien_talks_flutter/MainActivity.kt | 2 +- wien_talks/wien_talks_flutter/linux/CMakeLists.txt | 2 +- wien_talks/wien_talks_server/.gitignore | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/wien_talks/wien_talks_flutter/android/app/build.gradle.kts b/wien_talks/wien_talks_flutter/android/app/build.gradle.kts index c5d9579..c8f71fe 100644 --- a/wien_talks/wien_talks_flutter/android/app/build.gradle.kts +++ b/wien_talks/wien_talks_flutter/android/app/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } android { - namespace = "com.example.wien_talks_flutter" + namespace = "com.wien_talks" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion @@ -21,7 +21,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.wien_talks_flutter" + applicationId = "com.wien_talks" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion diff --git a/wien_talks/wien_talks_flutter/android/app/src/main/kotlin/com/example/wien_talks_flutter/MainActivity.kt b/wien_talks/wien_talks_flutter/android/app/src/main/kotlin/com/example/wien_talks_flutter/MainActivity.kt index 0f59ec8..e7875b1 100644 --- a/wien_talks/wien_talks_flutter/android/app/src/main/kotlin/com/example/wien_talks_flutter/MainActivity.kt +++ b/wien_talks/wien_talks_flutter/android/app/src/main/kotlin/com/example/wien_talks_flutter/MainActivity.kt @@ -1,4 +1,4 @@ -package com.example.wien_talks_flutter +package com.wien_talks import io.flutter.embedding.android.FlutterActivity diff --git a/wien_talks/wien_talks_flutter/linux/CMakeLists.txt b/wien_talks/wien_talks_flutter/linux/CMakeLists.txt index e745e52..6fff101 100644 --- a/wien_talks/wien_talks_flutter/linux/CMakeLists.txt +++ b/wien_talks/wien_talks_flutter/linux/CMakeLists.txt @@ -7,7 +7,7 @@ project(runner LANGUAGES CXX) set(BINARY_NAME "wien_talks_flutter") # The unique GTK application identifier for this application. See: # https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.example.wien_talks_flutter") +set(APPLICATION_ID "com.wien_talks") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/wien_talks/wien_talks_server/.gitignore b/wien_talks/wien_talks_server/.gitignore index c4bbf42..b6ab210 100644 --- a/wien_talks/wien_talks_server/.gitignore +++ b/wien_talks/wien_talks_server/.gitignore @@ -16,3 +16,4 @@ config/firebase_service_account_key.json .env *.env +config/ \ No newline at end of file From c36081eddfe449bf717a01c8e7f8f26ae06f3640 Mon Sep 17 00:00:00 2001 From: mikes222 Date: Sat, 16 Aug 2025 15:54:36 +0200 Subject: [PATCH 19/49] Stub for creating and queriing from server implemented --- .../lib/create_event_screen.dart | 2 +- .../lib/{ => helper}/go_router.dart | 0 .../wien_talks_flutter/lib/location_mgr.dart | 1 + wien_talks/wien_talks_flutter/lib/main.dart | 4 +- .../lib/news_input_form.dart | 42 +++++++++++++------ .../wien_talks_flutter/lib/news_screen.dart | 27 +++++++----- .../lib/show_latest_news_widget.dart | 19 +++++++++ .../lib/widgets/error_snackbar.dart | 12 ++++++ .../lib/widgets/screen_widget.dart | 6 +-- wien_talks/wien_talks_flutter/pubspec.yaml | 2 + 10 files changed, 86 insertions(+), 29 deletions(-) rename wien_talks/wien_talks_flutter/lib/{ => helper}/go_router.dart (100%) create mode 100644 wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/error_snackbar.dart diff --git a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart b/wien_talks/wien_talks_flutter/lib/create_event_screen.dart index 58f2947..b08093c 100644 --- a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/create_event_screen.dart @@ -15,7 +15,7 @@ class CreateEventScreen extends StatelessWidget { return ScreenWidget( child: Column( children: [ - NewsInputForm(onSubmit: (newsEventModel) {}), + NewsInputForm(), StreamBuilder(stream: LocationMgr().stream, builder: (BuildContext context, AsyncSnapshot snapshot) => Text(snapshot.data.toString())), Expanded( child: GetLocationWidget( diff --git a/wien_talks/wien_talks_flutter/lib/go_router.dart b/wien_talks/wien_talks_flutter/lib/helper/go_router.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/go_router.dart rename to wien_talks/wien_talks_flutter/lib/helper/go_router.dart diff --git a/wien_talks/wien_talks_flutter/lib/location_mgr.dart b/wien_talks/wien_talks_flutter/lib/location_mgr.dart index c43dab0..21d3289 100644 --- a/wien_talks/wien_talks_flutter/lib/location_mgr.dart +++ b/wien_talks/wien_talks_flutter/lib/location_mgr.dart @@ -93,6 +93,7 @@ class LocationMgr { iconMarker = null; viewModel?.dispose(); viewModel = null; + _lastLocationData = null; } Stream get stream => _subject.stream; diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index d39a4a8..e898d02 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:serverpod_flutter/serverpod_flutter.dart'; import 'package:wien_talks_client/wien_talks_client.dart'; -import 'package:wien_talks_flutter/go_router.dart'; +import 'package:wien_talks_flutter/helper/go_router.dart'; /// Sets up a global client object that can be used to talk to the server from /// anywhere in our app. The client is generated from your server code @@ -38,7 +38,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp.router( - title: 'Serverpod Demo', + title: 'Wien Talks', theme: ThemeData(primarySwatch: Colors.blue), routerConfig: router, //home: NewsScreen(), diff --git a/wien_talks/wien_talks_flutter/lib/news_input_form.dart b/wien_talks/wien_talks_flutter/lib/news_input_form.dart index 0a99302..ed48bb7 100644 --- a/wien_talks/wien_talks_flutter/lib/news_input_form.dart +++ b/wien_talks/wien_talks_flutter/lib/news_input_form.dart @@ -1,10 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:wien_talks_flutter/models/news_event_model.dart'; +import 'package:loader_overlay/loader_overlay.dart'; +import 'package:location/location.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/location_mgr.dart'; +import 'package:wien_talks_flutter/main.dart'; +import 'package:wien_talks_flutter/widgets/error_snackbar.dart'; class NewsInputForm extends StatefulWidget { - final Function(NewsEventModel) onSubmit; - - const NewsInputForm({Key? key, required this.onSubmit}) : super(key: key); + const NewsInputForm({super.key}); @override _NewsInputFormState createState() => _NewsInputFormState(); @@ -20,16 +23,29 @@ class _NewsInputFormState extends State { super.dispose(); } - void _submitForm() { + void _submitForm() async { + LocationData? locationData = LocationMgr().lastLocation; + if (locationData == null || locationData.latitude == null || locationData.longitude == null) { + ErrorSnackbar().show(context, "No location available, please retry later"); + return; + } if (_formKey.currentState!.validate()) { - final newsData = NewsEventModel( - content: _newsController.text.trim(), - timestamp: DateTime.now(), - latitude: 0.0, - longitude: 0.0, - ); - widget.onSubmit(newsData); - _newsController.clear(); + var handler = context.loaderOverlay..show(); + try { + final newsData = CreateQuoteRequest( + text: _newsController.text.trim(), + lat: LocationMgr().lastLocation!.latitude!, + lng: LocationMgr().lastLocation!.longitude!, + ); + await client.quote.createQuote(newsData); + _newsController.clear(); + } catch (error) { + if (mounted) { + ErrorSnackbar().show(context, error.toString()); + } + } finally { + handler.hide(); + } } } diff --git a/wien_talks/wien_talks_flutter/lib/news_screen.dart b/wien_talks/wien_talks_flutter/lib/news_screen.dart index 4fcb635..93dad3b 100644 --- a/wien_talks/wien_talks_flutter/lib/news_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/news_screen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:wien_talks_flutter/main.dart'; +import 'package:wien_talks_flutter/show_latest_news_widget.dart'; import 'package:wien_talks_flutter/widgets/heading_text.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; @@ -28,15 +28,22 @@ class NewsScreen extends StatelessWidget { ); return ScreenWidget( child: SingleChildScrollView( - child: StreamBuilder( - stream: client.quote.quoteUpdates(), - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.active) { - return Text(snapshot.data?.text ?? 'Empty Text'); - } - - return Text('Empty or Error'); - })), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + HeadingText(text: "Latest news"), + ShowLatestNewsWidget(), + SizedBox( + height: 30, + ), + ElevatedButton( + onPressed: () { + context.pushNamed("create_event"); + }, + child: Text("Submit your own event")), + ], + ), + ), ); } } diff --git a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart new file mode 100644 index 0000000..1b99ebe --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:wien_talks_flutter/main.dart'; + +class ShowLatestNewsWidget extends StatelessWidget { + const ShowLatestNewsWidget({super.key}); + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: client.quote.stream, + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } + return Text(snapshot.data ?? "Be the first to submit amazing news!", style: TextStyle(fontSize: 20, color: Theme.of(context).colorScheme.error)); + return Placeholder(); + }); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/error_snackbar.dart b/wien_talks/wien_talks_flutter/lib/widgets/error_snackbar.dart new file mode 100644 index 0000000..3529899 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/error_snackbar.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class ErrorSnackbar { + void show(BuildContext context, String message) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(message, style: TextStyle(color: Theme.of(context).colorScheme.onError)), + showCloseIcon: true, + duration: Duration(seconds: 30), + backgroundColor: Theme.of(context).colorScheme.error, + )); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart index 3237ce3..4750baa 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:wien_talks_flutter/widgets/add-quote-fab.dart'; +import 'package:loader_overlay/loader_overlay.dart'; class ScreenWidget extends StatelessWidget { final Widget child; @@ -12,11 +12,11 @@ class ScreenWidget extends StatelessWidget { appBar: AppBar( title: const Text('News'), ), - floatingActionButton: AddQuoteFab(), +// floatingActionButton: AddQuoteFab(), body: SafeArea( child: Padding( padding: const EdgeInsets.all(8.0), - child: child, + child: LoaderOverlay(child: child), )), ); } diff --git a/wien_talks/wien_talks_flutter/pubspec.yaml b/wien_talks/wien_talks_flutter/pubspec.yaml index d32cc2e..81a1e48 100644 --- a/wien_talks/wien_talks_flutter/pubspec.yaml +++ b/wien_talks/wien_talks_flutter/pubspec.yaml @@ -27,6 +27,8 @@ dependencies: go_router: ^16.1.0 + loader_overlay: ^5.0.0 + location: ^8.0.1 mapsforge_flutter: ^3.0.2 From fb8ba7e6d1198796ef8552594b12d5a621b93ca2 Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 16:11:43 +0200 Subject: [PATCH 20/49] make: fix PHONY target declarations Signed-off-by: Max R. Carrara --- wien_talks/Makefile | 2 +- wien_talks/wien_talks_server/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wien_talks/Makefile b/wien_talks/Makefile index a92bbf1..828334e 100644 --- a/wien_talks/Makefile +++ b/wien_talks/Makefile @@ -1,7 +1,7 @@ include defines.mk -.PHONY := local +.PHONY: local local: $(MAKE) -C wien_talks_server local diff --git a/wien_talks/wien_talks_server/Makefile b/wien_talks/wien_talks_server/Makefile index 70f2ff5..ec6f31d 100644 --- a/wien_talks/wien_talks_server/Makefile +++ b/wien_talks/wien_talks_server/Makefile @@ -9,7 +9,7 @@ COMPOSE_PROJECT := $(shell basename $(shell pwd)) .env: .env.template cp -a .env.template .env -.PHONY := local local-env local-stop local-down local-clean +.PHONY: local local-env local-stop local-down local-clean local: .env docker compose -f $(COMPOSE_FILE_LOCAL) up -d From 07870891dadc211308de927f04f9fbe8cbd8762d Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 16:13:11 +0200 Subject: [PATCH 21/49] rm serverpod templates --- .gitignore | 1 + .../lib/src/protocol/client.dart | 59 +++------- .../lib/src/protocol/greeting.dart | 95 ---------------- .../lib/src/protocol/protocol.dart | 56 ++++------ wien_talks/wien_talks_flutter/lib/main.dart | 69 ------------ .../wien_talks_flutter/lib/news_screen.dart | 15 --- .../Flutter/GeneratedPluginRegistrant.swift | 2 + wien_talks/wien_talks_flutter/pubspec.yaml | 1 + wien_talks/wien_talks_server/lib/server.dart | 24 +--- .../lib/src/birthday_reminder.dart | 18 --- .../lib/src/generated/endpoints.dart | 59 +++------- .../lib/src/generated/greeting.dart | 105 ------------------ .../lib/src/generated/protocol.dart | 52 ++++----- .../lib/src/generated/protocol.yaml | 2 - .../lib/src/greeting.spy.yaml | 24 ---- .../lib/src/greeting_endpoint.dart | 34 ------ .../lib/src/quotes/quotes_endpoint.dart | 13 +-- .../integration/greeting_endpoint_test.dart | 24 ---- .../test_tools/serverpod_test_tools.dart | 71 ++---------- 19 files changed, 92 insertions(+), 632 deletions(-) delete mode 100644 wien_talks/wien_talks_client/lib/src/protocol/greeting.dart delete mode 100644 wien_talks/wien_talks_server/lib/src/birthday_reminder.dart delete mode 100644 wien_talks/wien_talks_server/lib/src/generated/greeting.dart delete mode 100644 wien_talks/wien_talks_server/lib/src/greeting.spy.yaml delete mode 100644 wien_talks/wien_talks_server/lib/src/greeting_endpoint.dart delete mode 100644 wien_talks/wien_talks_server/test/integration/greeting_endpoint_test.dart diff --git a/.gitignore b/.gitignore index fc57b2b..2b377da 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ wien_talks/wien_talks_flutter/pubspec.lock +wien_talks/wien_talks_flutter/android/app/google-services.json diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index 0d92249..3d49693 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -11,29 +11,10 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod_client/serverpod_client.dart' as _i1; import 'dart:async' as _i2; -import 'package:wien_talks_client/src/protocol/greeting.dart' as _i3; -import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i4; -import 'package:wien_talks_client/src/protocol/quotes/create_quote.dart' as _i5; -import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i6; -import 'protocol.dart' as _i7; - -/// This is an example endpoint that returns a greeting message through -/// its [hello] method. -/// {@category Endpoint} -class EndpointGreeting extends _i1.EndpointRef { - EndpointGreeting(_i1.EndpointCaller caller) : super(caller); - - @override - String get name => 'greeting'; - - /// Returns a personalized greeting message: "Hello {name}". - _i2.Future<_i3.Greeting> hello(String name) => - caller.callServerEndpoint<_i3.Greeting>( - 'greeting', - 'hello', - {'name': name}, - ); -} +import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i3; +import 'package:wien_talks_client/src/protocol/quotes/create_quote.dart' as _i4; +import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i5; +import 'protocol.dart' as _i6; /// {@category Endpoint} class EndpointQuote extends _i1.EndpointRef { @@ -42,37 +23,37 @@ class EndpointQuote extends _i1.EndpointRef { @override String get name => 'quote'; - _i2.Future updateQuote(_i4.Quote quote) => + _i2.Future updateQuote(_i3.Quote quote) => caller.callServerEndpoint( 'quote', 'updateQuote', {'quote': quote}, ); - _i2.Stream<_i4.Quote> quoteUpdates() => - caller.callStreamingServerEndpoint<_i2.Stream<_i4.Quote>, _i4.Quote>( + _i2.Stream<_i3.Quote> quoteUpdates() => + caller.callStreamingServerEndpoint<_i2.Stream<_i3.Quote>, _i3.Quote>( 'quote', 'quoteUpdates', {}, {}, ); - _i2.Future<_i4.Quote> createQuote(_i5.CreateQuoteRequest req) => - caller.callServerEndpoint<_i4.Quote>( + _i2.Future<_i3.Quote> createQuote(_i4.CreateQuoteRequest req) => + caller.callServerEndpoint<_i3.Quote>( 'quote', 'createQuote', {'req': req}, ); - _i2.Future<_i4.Quote> getQuoteById(int id) => - caller.callServerEndpoint<_i4.Quote>( + _i2.Future<_i3.Quote> getQuoteById(int id) => + caller.callServerEndpoint<_i3.Quote>( 'quote', 'getQuoteById', {'id': id}, ); - _i2.Future> getAllQuotes() => - caller.callServerEndpoint>( + _i2.Future> getAllQuotes() => + caller.callServerEndpoint>( 'quote', 'getAllQuotes', {}, @@ -81,10 +62,10 @@ class EndpointQuote extends _i1.EndpointRef { class Modules { Modules(Client client) { - auth = _i6.Caller(client); + auth = _i5.Caller(client); } - late final _i6.Caller auth; + late final _i5.Caller auth; } class Client extends _i1.ServerpodClientShared { @@ -103,7 +84,7 @@ class Client extends _i1.ServerpodClientShared { bool? disconnectStreamsOnLostInternetConnection, }) : super( host, - _i7.Protocol(), + _i6.Protocol(), securityContext: securityContext, authenticationKeyManager: authenticationKeyManager, streamingConnectionTimeout: streamingConnectionTimeout, @@ -113,22 +94,16 @@ class Client extends _i1.ServerpodClientShared { disconnectStreamsOnLostInternetConnection: disconnectStreamsOnLostInternetConnection, ) { - greeting = EndpointGreeting(this); quote = EndpointQuote(this); modules = Modules(this); } - late final EndpointGreeting greeting; - late final EndpointQuote quote; late final Modules modules; @override - Map get endpointRefLookup => { - 'greeting': greeting, - 'quote': quote, - }; + Map get endpointRefLookup => {'quote': quote}; @override Map get moduleLookup => diff --git a/wien_talks/wien_talks_client/lib/src/protocol/greeting.dart b/wien_talks/wien_talks_client/lib/src/protocol/greeting.dart deleted file mode 100644 index bb85a81..0000000 --- a/wien_talks/wien_talks_client/lib/src/protocol/greeting.dart +++ /dev/null @@ -1,95 +0,0 @@ -/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ -/* To generate run: "serverpod generate" */ - -// ignore_for_file: implementation_imports -// ignore_for_file: library_private_types_in_public_api -// ignore_for_file: non_constant_identifier_names -// ignore_for_file: public_member_api_docs -// ignore_for_file: type_literal_in_constant_pattern -// ignore_for_file: use_super_parameters - -// ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:serverpod_client/serverpod_client.dart' as _i1; - -/// A greeting message which can be sent to or from the server. -abstract class Greeting implements _i1.SerializableModel { - Greeting._({ - required this.message, - required this.author, - required this.timestamp, - }); - - factory Greeting({ - required String message, - required String author, - required DateTime timestamp, - }) = _GreetingImpl; - - factory Greeting.fromJson(Map jsonSerialization) { - return Greeting( - message: jsonSerialization['message'] as String, - author: jsonSerialization['author'] as String, - timestamp: - _i1.DateTimeJsonExtension.fromJson(jsonSerialization['timestamp']), - ); - } - - /// The greeting message. - String message; - - /// The author of the greeting message. - String author; - - /// The time when the message was created. - DateTime timestamp; - - /// Returns a shallow copy of this [Greeting] - /// with some or all fields replaced by the given arguments. - @_i1.useResult - Greeting copyWith({ - String? message, - String? author, - DateTime? timestamp, - }); - @override - Map toJson() { - return { - 'message': message, - 'author': author, - 'timestamp': timestamp.toJson(), - }; - } - - @override - String toString() { - return _i1.SerializationManager.encode(this); - } -} - -class _GreetingImpl extends Greeting { - _GreetingImpl({ - required String message, - required String author, - required DateTime timestamp, - }) : super._( - message: message, - author: author, - timestamp: timestamp, - ); - - /// Returns a shallow copy of this [Greeting] - /// with some or all fields replaced by the given arguments. - @_i1.useResult - @override - Greeting copyWith({ - String? message, - String? author, - DateTime? timestamp, - }) { - return Greeting( - message: message ?? this.message, - author: author ?? this.author, - timestamp: timestamp ?? this.timestamp, - ); - } -} diff --git a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart index f03d13d..9af404c 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart @@ -10,12 +10,10 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod_client/serverpod_client.dart' as _i1; -import 'greeting.dart' as _i2; -import 'quotes/create_quote.dart' as _i3; -import 'quotes/quote.dart' as _i4; -import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i5; -import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i6; -export 'greeting.dart'; +import 'quotes/create_quote.dart' as _i2; +import 'quotes/quote.dart' as _i3; +import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i4; +import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i5; export 'quotes/create_quote.dart'; export 'quotes/quote.dart'; export 'client.dart'; @@ -33,23 +31,17 @@ class Protocol extends _i1.SerializationManager { Type? t, ]) { t ??= T; - if (t == _i2.Greeting) { - return _i2.Greeting.fromJson(data) as T; + if (t == _i2.CreateQuoteRequest) { + return _i2.CreateQuoteRequest.fromJson(data) as T; } - if (t == _i3.CreateQuoteRequest) { - return _i3.CreateQuoteRequest.fromJson(data) as T; + if (t == _i3.Quote) { + return _i3.Quote.fromJson(data) as T; } - if (t == _i4.Quote) { - return _i4.Quote.fromJson(data) as T; + if (t == _i1.getType<_i2.CreateQuoteRequest?>()) { + return (data != null ? _i2.CreateQuoteRequest.fromJson(data) : null) as T; } - if (t == _i1.getType<_i2.Greeting?>()) { - return (data != null ? _i2.Greeting.fromJson(data) : null) as T; - } - if (t == _i1.getType<_i3.CreateQuoteRequest?>()) { - return (data != null ? _i3.CreateQuoteRequest.fromJson(data) : null) as T; - } - if (t == _i1.getType<_i4.Quote?>()) { - return (data != null ? _i4.Quote.fromJson(data) : null) as T; + if (t == _i1.getType<_i3.Quote?>()) { + return (data != null ? _i3.Quote.fromJson(data) : null) as T; } if (t == _i1.getType?>()) { return (data != null @@ -61,11 +53,11 @@ class Protocol extends _i1.SerializationManager { ? (data as List).map((e) => deserialize(e)).toList() : null) as T; } - if (t == List<_i5.Quote>) { - return (data as List).map((e) => deserialize<_i5.Quote>(e)).toList() as T; + if (t == List<_i4.Quote>) { + return (data as List).map((e) => deserialize<_i4.Quote>(e)).toList() as T; } try { - return _i6.Protocol().deserialize(data, t); + return _i5.Protocol().deserialize(data, t); } on _i1.DeserializationTypeNotFoundException catch (_) {} return super.deserialize(data, t); } @@ -74,16 +66,13 @@ class Protocol extends _i1.SerializationManager { String? getClassNameForObject(Object? data) { String? className = super.getClassNameForObject(data); if (className != null) return className; - if (data is _i2.Greeting) { - return 'Greeting'; - } - if (data is _i3.CreateQuoteRequest) { + if (data is _i2.CreateQuoteRequest) { return 'CreateQuoteRequest'; } - if (data is _i4.Quote) { + if (data is _i3.Quote) { return 'Quote'; } - className = _i6.Protocol().getClassNameForObject(data); + className = _i5.Protocol().getClassNameForObject(data); if (className != null) { return 'serverpod_auth.$className'; } @@ -96,18 +85,15 @@ class Protocol extends _i1.SerializationManager { if (dataClassName is! String) { return super.deserializeByClassName(data); } - if (dataClassName == 'Greeting') { - return deserialize<_i2.Greeting>(data['data']); - } if (dataClassName == 'CreateQuoteRequest') { - return deserialize<_i3.CreateQuoteRequest>(data['data']); + return deserialize<_i2.CreateQuoteRequest>(data['data']); } if (dataClassName == 'Quote') { - return deserialize<_i4.Quote>(data['data']); + return deserialize<_i3.Quote>(data['data']); } if (dataClassName.startsWith('serverpod_auth.')) { data['className'] = dataClassName.substring(15); - return _i6.Protocol().deserializeByClassName(data); + return _i5.Protocol().deserializeByClassName(data); } return super.deserializeByClassName(data); } diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index e898d02..f5a22f0 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -47,75 +47,6 @@ class MyApp extends StatelessWidget { } } -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - final String title; - - @override - MyHomePageState createState() => MyHomePageState(); -} - -class MyHomePageState extends State { - /// Holds the last result or null if no result exists yet. - String? _resultMessage; - - /// Holds the last error message that we've received from the server or null - /// if no error exists yet. - String? _errorMessage; - - final _textEditingController = TextEditingController(); - - /// Calls the `hello` method of the `greeting` endpoint. Will set either the - /// `_resultMessage` or `_errorMessage` field, depending on if the call - /// is successful. - void _callHello() async { - try { - final result = await client.greeting.hello(_textEditingController.text); - setState(() { - _errorMessage = null; - _resultMessage = result.message; - }); - } catch (e) { - setState(() { - _errorMessage = '$e'; - }); - } - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text(widget.title)), - body: Padding( - padding: const EdgeInsets.all(16), - child: Column( - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 16.0), - child: TextField( - controller: _textEditingController, - decoration: const InputDecoration(hintText: 'Enter your name'), - ), - ), - Padding( - padding: const EdgeInsets.only(bottom: 16.0), - child: ElevatedButton( - onPressed: _callHello, - child: const Text('Send to Server'), - ), - ), - ResultDisplay( - resultMessage: _resultMessage, - errorMessage: _errorMessage, - ), - ], - ), - ), - ); - } -} - /// ResultDisplays shows the result of the call. Either the returned result /// from the `example.greeting` endpoint method or an error message. class ResultDisplay extends StatelessWidget { diff --git a/wien_talks/wien_talks_flutter/lib/news_screen.dart b/wien_talks/wien_talks_flutter/lib/news_screen.dart index 93dad3b..84507cb 100644 --- a/wien_talks/wien_talks_flutter/lib/news_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/news_screen.dart @@ -11,21 +11,6 @@ class NewsScreen extends StatelessWidget { @override Widget build(BuildContext context) { - var column = Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - HeadingText(text: "Latest news"), - ...[Text("News 1"), Text("News 2")], - SizedBox( - height: 30, - ), - OutlinedButton( - onPressed: () { - context.pushNamed("create_event"); - }, - child: Text("Submit your own event")), - ], - ); return ScreenWidget( child: SingleChildScrollView( child: Column( diff --git a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift index 407ec0f..19702fe 100644 --- a/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/wien_talks/wien_talks_flutter/macos/Flutter/GeneratedPluginRegistrant.swift @@ -8,6 +8,7 @@ import Foundation import connectivity_plus import file_picker import file_selector_macos +import google_sign_in_ios import location import path_provider_foundation import shared_preferences_foundation @@ -17,6 +18,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) diff --git a/wien_talks/wien_talks_flutter/pubspec.yaml b/wien_talks/wien_talks_flutter/pubspec.yaml index 81a1e48..79bdab6 100644 --- a/wien_talks/wien_talks_flutter/pubspec.yaml +++ b/wien_talks/wien_talks_flutter/pubspec.yaml @@ -45,6 +45,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 + google_sign_in: ^7.1.1 dev_dependencies: flutter_lints: '>=3.0.0 <7.0.0' diff --git a/wien_talks/wien_talks_server/lib/server.dart b/wien_talks/wien_talks_server/lib/server.dart index ed0e06c..e79820c 100644 --- a/wien_talks/wien_talks_server/lib/server.dart +++ b/wien_talks/wien_talks_server/lib/server.dart @@ -1,10 +1,8 @@ import 'package:serverpod/serverpod.dart'; import 'package:serverpod_auth_server/serverpod_auth_server.dart' as auth; -import 'package:wien_talks_server/src/birthday_reminder.dart'; import 'package:wien_talks_server/src/web/routes/root.dart'; import 'src/generated/endpoints.dart'; -import 'src/generated/protocol.dart'; // This is the starting point of your Serverpod server. In most cases, you will // only need to make additions to this file if you add future calls, are @@ -14,7 +12,7 @@ void run(List args) async { // Initialize Serverpod and connect it with your generated code. final pod = Serverpod( args, - Protocol(), + auth.Protocol(), Endpoints(), authenticationHandler: auth.authenticationHandler, ); @@ -38,28 +36,8 @@ void run(List args) async { // the background. Their schedule is persisted to the database, so you will // not lose them if the server is restarted. - pod.registerFutureCall( - BirthdayReminder(), - FutureCallNames.birthdayReminder.name, - ); - // You can schedule future calls for a later time during startup. But you can // also schedule them in any endpoint or webroute through the session object. // there is also [futureCallAtTime] if you want to schedule a future call at a // specific time. - await pod.futureCallWithDelay( - FutureCallNames.birthdayReminder.name, - Greeting( - message: 'Hello!', - author: 'Serverpod Server', - timestamp: DateTime.now(), - ), - Duration(seconds: 5), - ); } - -/// Names of all future calls in the server. -/// -/// This is better than using a string literal, as it will reduce the risk of -/// typos and make it easier to refactor the code. -enum FutureCallNames { birthdayReminder } diff --git a/wien_talks/wien_talks_server/lib/src/birthday_reminder.dart b/wien_talks/wien_talks_server/lib/src/birthday_reminder.dart deleted file mode 100644 index ef3d8cb..0000000 --- a/wien_talks/wien_talks_server/lib/src/birthday_reminder.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:wien_talks_server/src/generated/protocol.dart'; -import 'package:serverpod/serverpod.dart'; - -/// This is a simple example of a future call that logs a birthday reminder. -/// -/// In a real-world application, you would implement the logic to send a -/// an email or a push notification to the user. -class BirthdayReminder extends FutureCall { - @override - Future invoke(Session session, Greeting? object) async { - // This is where you would implement the logic to send a birthday reminder. - // For example, you could send an email or a notification to the user. - // You can access the user information from the `object` parameter if - // needed. - - session.log('${object?.message} Remember to send a birthday card!'); - } -} diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index b616e1a..a9cb545 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -10,54 +10,23 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; -import '../greeting_endpoint.dart' as _i2; -import '../quotes/quotes_endpoint.dart' as _i3; -import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i4; +import '../quotes/quotes_endpoint.dart' as _i2; +import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i3; import 'package:wien_talks_server/src/generated/quotes/create_quote.dart' - as _i5; -import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i6; + as _i4; +import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i5; class Endpoints extends _i1.EndpointDispatch { @override void initializeEndpoints(_i1.Server server) { var endpoints = { - 'greeting': _i2.GreetingEndpoint() - ..initialize( - server, - 'greeting', - null, - ), - 'quote': _i3.QuoteEndpoint() + 'quote': _i2.QuoteEndpoint() ..initialize( server, 'quote', null, - ), - }; - connectors['greeting'] = _i1.EndpointConnector( - name: 'greeting', - endpoint: endpoints['greeting']!, - methodConnectors: { - 'hello': _i1.MethodConnector( - name: 'hello', - params: { - 'name': _i1.ParameterDescription( - name: 'name', - type: _i1.getType(), - nullable: false, - ) - }, - call: ( - _i1.Session session, - Map params, - ) async => - (endpoints['greeting'] as _i2.GreetingEndpoint).hello( - session, - params['name'], - ), ) - }, - ); + }; connectors['quote'] = _i1.EndpointConnector( name: 'quote', endpoint: endpoints['quote']!, @@ -67,7 +36,7 @@ class Endpoints extends _i1.EndpointDispatch { params: { 'quote': _i1.ParameterDescription( name: 'quote', - type: _i1.getType<_i4.Quote>(), + type: _i1.getType<_i3.Quote>(), nullable: false, ) }, @@ -75,7 +44,7 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i3.QuoteEndpoint).updateQuote( + (endpoints['quote'] as _i2.QuoteEndpoint).updateQuote( session, params['quote'], ), @@ -85,7 +54,7 @@ class Endpoints extends _i1.EndpointDispatch { params: { 'req': _i1.ParameterDescription( name: 'req', - type: _i1.getType<_i5.CreateQuoteRequest>(), + type: _i1.getType<_i4.CreateQuoteRequest>(), nullable: false, ) }, @@ -93,7 +62,7 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i3.QuoteEndpoint).createQuote( + (endpoints['quote'] as _i2.QuoteEndpoint).createQuote( session, params['req'], ), @@ -111,7 +80,7 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i3.QuoteEndpoint).getQuoteById( + (endpoints['quote'] as _i2.QuoteEndpoint).getQuoteById( session, params['id'], ), @@ -123,7 +92,7 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i3.QuoteEndpoint).getAllQuotes(session), + (endpoints['quote'] as _i2.QuoteEndpoint).getAllQuotes(session), ), 'quoteUpdates': _i1.MethodStreamConnector( name: 'quoteUpdates', @@ -135,10 +104,10 @@ class Endpoints extends _i1.EndpointDispatch { Map params, Map streamParams, ) => - (endpoints['quote'] as _i3.QuoteEndpoint).quoteUpdates(session), + (endpoints['quote'] as _i2.QuoteEndpoint).quoteUpdates(session), ), }, ); - modules['serverpod_auth'] = _i6.Endpoints()..initializeEndpoints(server); + modules['serverpod_auth'] = _i5.Endpoints()..initializeEndpoints(server); } } diff --git a/wien_talks/wien_talks_server/lib/src/generated/greeting.dart b/wien_talks/wien_talks_server/lib/src/generated/greeting.dart deleted file mode 100644 index 005a7be..0000000 --- a/wien_talks/wien_talks_server/lib/src/generated/greeting.dart +++ /dev/null @@ -1,105 +0,0 @@ -/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ -/* To generate run: "serverpod generate" */ - -// ignore_for_file: implementation_imports -// ignore_for_file: library_private_types_in_public_api -// ignore_for_file: non_constant_identifier_names -// ignore_for_file: public_member_api_docs -// ignore_for_file: type_literal_in_constant_pattern -// ignore_for_file: use_super_parameters - -// ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:serverpod/serverpod.dart' as _i1; - -/// A greeting message which can be sent to or from the server. -abstract class Greeting - implements _i1.SerializableModel, _i1.ProtocolSerialization { - Greeting._({ - required this.message, - required this.author, - required this.timestamp, - }); - - factory Greeting({ - required String message, - required String author, - required DateTime timestamp, - }) = _GreetingImpl; - - factory Greeting.fromJson(Map jsonSerialization) { - return Greeting( - message: jsonSerialization['message'] as String, - author: jsonSerialization['author'] as String, - timestamp: - _i1.DateTimeJsonExtension.fromJson(jsonSerialization['timestamp']), - ); - } - - /// The greeting message. - String message; - - /// The author of the greeting message. - String author; - - /// The time when the message was created. - DateTime timestamp; - - /// Returns a shallow copy of this [Greeting] - /// with some or all fields replaced by the given arguments. - @_i1.useResult - Greeting copyWith({ - String? message, - String? author, - DateTime? timestamp, - }); - @override - Map toJson() { - return { - 'message': message, - 'author': author, - 'timestamp': timestamp.toJson(), - }; - } - - @override - Map toJsonForProtocol() { - return { - 'message': message, - 'author': author, - 'timestamp': timestamp.toJson(), - }; - } - - @override - String toString() { - return _i1.SerializationManager.encode(this); - } -} - -class _GreetingImpl extends Greeting { - _GreetingImpl({ - required String message, - required String author, - required DateTime timestamp, - }) : super._( - message: message, - author: author, - timestamp: timestamp, - ); - - /// Returns a shallow copy of this [Greeting] - /// with some or all fields replaced by the given arguments. - @_i1.useResult - @override - Greeting copyWith({ - String? message, - String? author, - DateTime? timestamp, - }) { - return Greeting( - message: message ?? this.message, - author: author ?? this.author, - timestamp: timestamp ?? this.timestamp, - ); - } -} diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart index 8a3b130..681724b 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart @@ -12,11 +12,9 @@ import 'package:serverpod/serverpod.dart' as _i1; import 'package:serverpod/protocol.dart' as _i2; import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i3; -import 'greeting.dart' as _i4; -import 'quotes/create_quote.dart' as _i5; -import 'quotes/quote.dart' as _i6; -import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i7; -export 'greeting.dart'; +import 'quotes/create_quote.dart' as _i4; +import 'quotes/quote.dart' as _i5; +import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i6; export 'quotes/create_quote.dart'; export 'quotes/quote.dart'; @@ -130,23 +128,17 @@ class Protocol extends _i1.SerializationManagerServer { Type? t, ]) { t ??= T; - if (t == _i4.Greeting) { - return _i4.Greeting.fromJson(data) as T; + if (t == _i4.CreateQuoteRequest) { + return _i4.CreateQuoteRequest.fromJson(data) as T; } - if (t == _i5.CreateQuoteRequest) { - return _i5.CreateQuoteRequest.fromJson(data) as T; + if (t == _i5.Quote) { + return _i5.Quote.fromJson(data) as T; } - if (t == _i6.Quote) { - return _i6.Quote.fromJson(data) as T; + if (t == _i1.getType<_i4.CreateQuoteRequest?>()) { + return (data != null ? _i4.CreateQuoteRequest.fromJson(data) : null) as T; } - if (t == _i1.getType<_i4.Greeting?>()) { - return (data != null ? _i4.Greeting.fromJson(data) : null) as T; - } - if (t == _i1.getType<_i5.CreateQuoteRequest?>()) { - return (data != null ? _i5.CreateQuoteRequest.fromJson(data) : null) as T; - } - if (t == _i1.getType<_i6.Quote?>()) { - return (data != null ? _i6.Quote.fromJson(data) : null) as T; + if (t == _i1.getType<_i5.Quote?>()) { + return (data != null ? _i5.Quote.fromJson(data) : null) as T; } if (t == _i1.getType?>()) { return (data != null @@ -158,8 +150,8 @@ class Protocol extends _i1.SerializationManagerServer { ? (data as List).map((e) => deserialize(e)).toList() : null) as T; } - if (t == List<_i7.Quote>) { - return (data as List).map((e) => deserialize<_i7.Quote>(e)).toList() as T; + if (t == List<_i6.Quote>) { + return (data as List).map((e) => deserialize<_i6.Quote>(e)).toList() as T; } try { return _i3.Protocol().deserialize(data, t); @@ -174,13 +166,10 @@ class Protocol extends _i1.SerializationManagerServer { String? getClassNameForObject(Object? data) { String? className = super.getClassNameForObject(data); if (className != null) return className; - if (data is _i4.Greeting) { - return 'Greeting'; - } - if (data is _i5.CreateQuoteRequest) { + if (data is _i4.CreateQuoteRequest) { return 'CreateQuoteRequest'; } - if (data is _i6.Quote) { + if (data is _i5.Quote) { return 'Quote'; } className = _i2.Protocol().getClassNameForObject(data); @@ -200,14 +189,11 @@ class Protocol extends _i1.SerializationManagerServer { if (dataClassName is! String) { return super.deserializeByClassName(data); } - if (dataClassName == 'Greeting') { - return deserialize<_i4.Greeting>(data['data']); - } if (dataClassName == 'CreateQuoteRequest') { - return deserialize<_i5.CreateQuoteRequest>(data['data']); + return deserialize<_i4.CreateQuoteRequest>(data['data']); } if (dataClassName == 'Quote') { - return deserialize<_i6.Quote>(data['data']); + return deserialize<_i5.Quote>(data['data']); } if (dataClassName.startsWith('serverpod.')) { data['className'] = dataClassName.substring(10); @@ -235,8 +221,8 @@ class Protocol extends _i1.SerializationManagerServer { } } switch (t) { - case _i6.Quote: - return _i6.Quote.t; + case _i5.Quote: + return _i5.Quote.t; } return null; } diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml index 160b550..fd8118a 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml @@ -1,5 +1,3 @@ -greeting: - - hello: quote: - updateQuote: - quoteUpdates: diff --git a/wien_talks/wien_talks_server/lib/src/greeting.spy.yaml b/wien_talks/wien_talks_server/lib/src/greeting.spy.yaml deleted file mode 100644 index 3d08c8b..0000000 --- a/wien_talks/wien_talks_server/lib/src/greeting.spy.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# Yaml-files in the `models` directory specify which serializable objects -# should be generated. When you add or modify a file, you will need to run -# `serverpod generate` to make the generated classes available in the server and -# client. -# -# Please consult the documentation for more information on what you can add to -# your yaml-files. - -### A greeting message which can be sent to or from the server. -class: Greeting - -# Add the table key, if this class represents a row in the database. -#table: greeting - -# The fields (and columns if connected to the database) of the class. -# For a list of supported types, please see the documentation. -# https://docs.serverpod.dev/concepts/working-with-endpoints -fields: - ### The greeting message. - message: String - ### The author of the greeting message. - author: String - ### The time when the message was created. - timestamp: DateTime diff --git a/wien_talks/wien_talks_server/lib/src/greeting_endpoint.dart b/wien_talks/wien_talks_server/lib/src/greeting_endpoint.dart deleted file mode 100644 index 9faab19..0000000 --- a/wien_talks/wien_talks_server/lib/src/greeting_endpoint.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'generated/protocol.dart'; -import 'package:serverpod/serverpod.dart'; - -// This is an example endpoint of your server. It's best practice to use the -// `Endpoint` ending of the class name, but it will be removed when accessing -// the endpoint from the client. I.e., this endpoint can be accessed through -// `client.greeting` on the client side. - -// After adding or modifying an endpoint, you will need to run -// `serverpod generate` to update the server and client code. - -/// This is an example endpoint that returns a greeting message through -/// its [hello] method. -class GreetingEndpoint extends Endpoint { - // This method is called when the client calls the `hello` method on the - // `greeting` endpoint. - // - // The `Session` parameter contains the context of the client request. - // It provides access to the database and other server-side resources like - // secrets from your password file, the cache, storage, and server-event - // messaging. - // - // You can use any serializable type as a parameter or return type, read more - // in the [docs](https://docs.serverpod.dev/concepts/working-with-endpoints). - - /// Returns a personalized greeting message: "Hello {name}". - Future hello(Session session, String name) async { - return Greeting( - message: 'Hello $name', - author: 'Serverpod', - timestamp: DateTime.now(), - ); - } -} diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart index 6108211..d45d704 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:serverpod/serverpod.dart'; import 'package:wien_talks_server/src/generated/protocol.dart'; import 'package:wien_talks_server/src/quotes/quote_util.dart'; @@ -21,21 +23,14 @@ class QuoteEndpoint extends Endpoint { Future createQuote(Session session, CreateQuoteRequest req) async { final authInfo = await session.authenticated; - final userId = authInfo?.userId; - - if (userId == null) { - throw Exception('Not signed in'); - } + final userId = Random().nextInt(100); String text = validateQuote(req); final quote = Quote( - id: 0, userId: userId, text: text, - authorName: req.authorName?.trim().isEmpty == true - ? null - : req.authorName!.trim(), + authorName: req.authorName, lat: req.lat, long: req.lng, createdAt: DateTime.now().toUtc(), diff --git a/wien_talks/wien_talks_server/test/integration/greeting_endpoint_test.dart b/wien_talks/wien_talks_server/test/integration/greeting_endpoint_test.dart deleted file mode 100644 index 5049049..0000000 --- a/wien_talks/wien_talks_server/test/integration/greeting_endpoint_test.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:test/test.dart'; - -// Import the generated test helper file, it contains everything you need. -import 'test_tools/serverpod_test_tools.dart'; - -void main() { - // This is an example test that uses the `withServerpod` test helper. - // `withServerpod` enables you to call your endpoints directly from the test like regular functions. - // Note that after adding or modifying an endpoint, you will need to run - // `serverpod generate` to update the test tools code. - // Refer to the docs for more information on how to use the test helper. - withServerpod('Given Greeting endpoint', (sessionBuilder, endpoints) { - test( - 'when calling `hello` with name then returned greeting includes name', - () async { - // Call the endpoint method by using the `endpoints` parameter and - // pass `sessionBuilder` as a first argument. Refer to the docs on - // how to use the `sessionBuilder` to set up different test scenarios. - final greeting = await endpoints.greeting.hello(sessionBuilder, 'Bob'); - expect(greeting.message, 'Hello Bob'); - }, - ); - }); -} diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index 6c77e53..aa1b0e9 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -14,10 +14,9 @@ import 'package:serverpod_test/serverpod_test.dart' as _i1; import 'package:serverpod/serverpod.dart' as _i2; import 'dart:async' as _i3; -import 'package:wien_talks_server/src/generated/greeting.dart' as _i4; -import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i5; +import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i4; import 'package:wien_talks_server/src/generated/quotes/create_quote.dart' - as _i6; + as _i5; import 'package:wien_talks_server/src/generated/protocol.dart'; import 'package:wien_talks_server/src/generated/endpoints.dart'; export 'package:serverpod_test/serverpod_test_public_exports.dart'; @@ -104,8 +103,6 @@ void withServerpod( } class TestEndpoints { - late final _GreetingEndpoint greeting; - late final _QuoteEndpoint quote; } @@ -116,10 +113,6 @@ class _InternalTestEndpoints extends TestEndpoints _i2.SerializationManager serializationManager, _i2.EndpointDispatch endpoints, ) { - greeting = _GreetingEndpoint( - endpoints, - serializationManager, - ); quote = _QuoteEndpoint( endpoints, serializationManager, @@ -127,46 +120,6 @@ class _InternalTestEndpoints extends TestEndpoints } } -class _GreetingEndpoint { - _GreetingEndpoint( - this._endpointDispatch, - this._serializationManager, - ); - - final _i2.EndpointDispatch _endpointDispatch; - - final _i2.SerializationManager _serializationManager; - - _i3.Future<_i4.Greeting> hello( - _i1.TestSessionBuilder sessionBuilder, - String name, - ) async { - return _i1.callAwaitableFunctionAndHandleExceptions(() async { - var _localUniqueSession = - (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'greeting', - method: 'hello', - ); - try { - var _localCallContext = await _endpointDispatch.getMethodCallContext( - createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'greeting', - methodName: 'hello', - parameters: _i1.testObjectToJson({'name': name}), - serializationManager: _serializationManager, - ); - var _localReturnValue = await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) as _i3.Future<_i4.Greeting>); - return _localReturnValue; - } finally { - await _localUniqueSession.close(); - } - }); - } -} - class _QuoteEndpoint { _QuoteEndpoint( this._endpointDispatch, @@ -179,7 +132,7 @@ class _QuoteEndpoint { _i3.Future updateQuote( _i1.TestSessionBuilder sessionBuilder, - _i5.Quote quote, + _i4.Quote quote, ) async { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = @@ -206,8 +159,8 @@ class _QuoteEndpoint { }); } - _i3.Stream<_i5.Quote> quoteUpdates(_i1.TestSessionBuilder sessionBuilder) { - var _localTestStreamManager = _i1.TestStreamManager<_i5.Quote>(); + _i3.Stream<_i4.Quote> quoteUpdates(_i1.TestSessionBuilder sessionBuilder) { + var _localTestStreamManager = _i1.TestStreamManager<_i4.Quote>(); _i1.callStreamFunctionAndHandleExceptions( () async { var _localUniqueSession = @@ -235,9 +188,9 @@ class _QuoteEndpoint { return _localTestStreamManager.outputStreamController.stream; } - _i3.Future<_i5.Quote> createQuote( + _i3.Future<_i4.Quote> createQuote( _i1.TestSessionBuilder sessionBuilder, - _i6.CreateQuoteRequest req, + _i5.CreateQuoteRequest req, ) async { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = @@ -256,7 +209,7 @@ class _QuoteEndpoint { var _localReturnValue = await (_localCallContext.method.call( _localUniqueSession, _localCallContext.arguments, - ) as _i3.Future<_i5.Quote>); + ) as _i3.Future<_i4.Quote>); return _localReturnValue; } finally { await _localUniqueSession.close(); @@ -264,7 +217,7 @@ class _QuoteEndpoint { }); } - _i3.Future<_i5.Quote> getQuoteById( + _i3.Future<_i4.Quote> getQuoteById( _i1.TestSessionBuilder sessionBuilder, int id, ) async { @@ -285,7 +238,7 @@ class _QuoteEndpoint { var _localReturnValue = await (_localCallContext.method.call( _localUniqueSession, _localCallContext.arguments, - ) as _i3.Future<_i5.Quote>); + ) as _i3.Future<_i4.Quote>); return _localReturnValue; } finally { await _localUniqueSession.close(); @@ -293,7 +246,7 @@ class _QuoteEndpoint { }); } - _i3.Future> getAllQuotes( + _i3.Future> getAllQuotes( _i1.TestSessionBuilder sessionBuilder) async { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = @@ -312,7 +265,7 @@ class _QuoteEndpoint { var _localReturnValue = await (_localCallContext.method.call( _localUniqueSession, _localCallContext.arguments, - ) as _i3.Future>); + ) as _i3.Future>); return _localReturnValue; } finally { await _localUniqueSession.close(); From 5f686b7b962bdcc95e3b974b4da784e906a1956a Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 16:58:47 +0200 Subject: [PATCH 22/49] increase client timeout --- wien_talks/wien_talks_flutter/lib/main.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index f5a22f0..2611534 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -24,7 +24,7 @@ void main() { final serverUrl = serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; - client = Client(serverUrl) + client = Client(serverUrl, connectionTimeout: const Duration(seconds: 5)) ..connectivityMonitor = FlutterConnectivityMonitor(); client.openStreamingConnection(); From 35edff13efc35c9b254d3d0e0a5c035426a75219 Mon Sep 17 00:00:00 2001 From: mikes222 Date: Sat, 16 Aug 2025 17:06:04 +0200 Subject: [PATCH 23/49] A little polishing --- .../lib/helper/funmap_mgr.dart | 30 +++++++++ wien_talks/wien_talks_flutter/lib/main.dart | 64 +------------------ .../lib/news_input_form.dart | 4 +- .../wien_talks_flutter/lib/news_screen.dart | 4 +- .../lib/show_latest_news_widget.dart | 19 ++++-- .../lib/widgets/add-quote-fab.dart | 5 +- .../lib/widgets/intro_text_widget.dart | 59 +++++++++++++++++ .../lib/widgets/screen_widget.dart | 36 ++++++++++- wien_talks/wien_talks_flutter/pubspec.yaml | 4 ++ 9 files changed, 146 insertions(+), 79 deletions(-) create mode 100644 wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/intro_text_widget.dart diff --git a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart b/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart new file mode 100644 index 0000000..31a211c --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart @@ -0,0 +1,30 @@ +import 'package:serverpod_flutter/serverpod_flutter.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; + +class FunmapMgr { + static FunmapMgr? _instance; + + FunmapMgr._() { + configure(); + } + + late Client client; + + factory FunmapMgr() { + if (_instance != null) return _instance!; + _instance = FunmapMgr._(); + return _instance!; + } + + void configure() { + // When you are running the app on a physical device, you need to set the + // server URL to the IP address of your computer. You can find the IP + // address by running `ipconfig` on Windows or `ifconfig` on Mac/Linux. + // You can set the variable when running or building your app like this: + // E.g. `flutter run --dart-define=SERVER_URL=https://api.example.com/` + const serverUrlFromEnv = String.fromEnvironment('SERVER_URL'); + final serverUrl = serverUrlFromEnv.isEmpty ? 'http://localhost:8080/' : serverUrlFromEnv; + + client = Client(serverUrl, connectionTimeout: const Duration(seconds: 5))..connectivityMonitor = FlutterConnectivityMonitor(); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index 2611534..4438c2a 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -1,34 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:serverpod_flutter/serverpod_flutter.dart'; -import 'package:wien_talks_client/wien_talks_client.dart'; import 'package:wien_talks_flutter/helper/go_router.dart'; -/// Sets up a global client object that can be used to talk to the server from -/// anywhere in our app. The client is generated from your server code -/// and is set up to connect to a Serverpod running on a local server on -/// the default port. You will need to modify this to connect to staging or -/// production servers. -/// In a larger app, you may want to use the dependency injection of your choice -/// instead of using a global client object. This is just a simple example. -late final Client client; - -late String serverUrl; - void main() { - // When you are running the app on a physical device, you need to set the - // server URL to the IP address of your computer. You can find the IP - // address by running `ipconfig` on Windows or `ifconfig` on Mac/Linux. - // You can set the variable when running or building your app like this: - // E.g. `flutter run --dart-define=SERVER_URL=https://api.example.com/` - const serverUrlFromEnv = String.fromEnvironment('SERVER_URL'); - final serverUrl = - serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; - - client = Client(serverUrl, connectionTimeout: const Duration(seconds: 5)) - ..connectivityMonitor = FlutterConnectivityMonitor(); - - client.openStreamingConnection(); - runApp(const MyApp()); } @@ -38,44 +11,9 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp.router( - title: 'Wien Talks', + title: 'Wien Talks FunMap', theme: ThemeData(primarySwatch: Colors.blue), routerConfig: router, - //home: NewsScreen(), - //home: const MyHomePage(title: 'Serverpod Example'), - ); - } -} - -/// ResultDisplays shows the result of the call. Either the returned result -/// from the `example.greeting` endpoint method or an error message. -class ResultDisplay extends StatelessWidget { - final String? resultMessage; - final String? errorMessage; - - const ResultDisplay({super.key, this.resultMessage, this.errorMessage}); - - @override - Widget build(BuildContext context) { - String text; - Color backgroundColor; - if (errorMessage != null) { - backgroundColor = Colors.red[300]!; - text = errorMessage!; - } else if (resultMessage != null) { - backgroundColor = Colors.green[300]!; - text = resultMessage!; - } else { - backgroundColor = Colors.grey[300]!; - text = 'No server response yet.'; - } - - return ConstrainedBox( - constraints: const BoxConstraints(minHeight: 50), - child: Container( - color: backgroundColor, - child: Center(child: Text(text)), - ), ); } } diff --git a/wien_talks/wien_talks_flutter/lib/news_input_form.dart b/wien_talks/wien_talks_flutter/lib/news_input_form.dart index ed48bb7..50d6dd9 100644 --- a/wien_talks/wien_talks_flutter/lib/news_input_form.dart +++ b/wien_talks/wien_talks_flutter/lib/news_input_form.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:location/location.dart'; import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; import 'package:wien_talks_flutter/location_mgr.dart'; -import 'package:wien_talks_flutter/main.dart'; import 'package:wien_talks_flutter/widgets/error_snackbar.dart'; class NewsInputForm extends StatefulWidget { @@ -37,7 +37,7 @@ class _NewsInputFormState extends State { lat: LocationMgr().lastLocation!.latitude!, lng: LocationMgr().lastLocation!.longitude!, ); - await client.quote.createQuote(newsData); + await FunmapMgr().client.quote.createQuote(newsData); _newsController.clear(); } catch (error) { if (mounted) { diff --git a/wien_talks/wien_talks_flutter/lib/news_screen.dart b/wien_talks/wien_talks_flutter/lib/news_screen.dart index 84507cb..75f1dc9 100644 --- a/wien_talks/wien_talks_flutter/lib/news_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/news_screen.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:wien_talks_flutter/show_latest_news_widget.dart'; -import 'package:wien_talks_flutter/widgets/heading_text.dart'; +import 'package:wien_talks_flutter/widgets/intro_text_widget.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; class NewsScreen extends StatelessWidget { @@ -16,7 +16,7 @@ class NewsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - HeadingText(text: "Latest news"), + IntroTextWidget(), ShowLatestNewsWidget(), SizedBox( height: 30, diff --git a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart index 1b99ebe..38dd823 100644 --- a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:wien_talks_flutter/main.dart'; +import 'package:wien_talks_flutter/widgets/heading_text.dart'; + +import 'helper/funmap_mgr.dart'; class ShowLatestNewsWidget extends StatelessWidget { const ShowLatestNewsWidget({super.key}); @@ -7,13 +9,16 @@ class ShowLatestNewsWidget extends StatelessWidget { @override Widget build(BuildContext context) { return StreamBuilder( - stream: client.quote.stream, + stream: FunmapMgr().client.quote.stream, builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasError) { - return Text('Error: ${snapshot.error}'); - } - return Text(snapshot.data ?? "Be the first to submit amazing news!", style: TextStyle(fontSize: 20, color: Theme.of(context).colorScheme.error)); - return Placeholder(); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + HeadingText(text: "Latest news"), + if (snapshot.hasError) Text('Error: ${snapshot.error}'), + Text(snapshot.data ?? "Be the first to submit amazing news!", style: TextStyle(fontSize: 20, color: Theme.of(context).colorScheme.error)), + ], + ); }); } } diff --git a/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart b/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart index 31750ef..1c58ee1 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:wien_talks_client/wien_talks_client.dart'; -import 'package:wien_talks_flutter/main.dart'; +import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; class AddQuoteFab extends StatelessWidget { const AddQuoteFab({ @@ -10,8 +10,7 @@ class AddQuoteFab extends StatelessWidget { @override Widget build(BuildContext context) { return FloatingActionButton(onPressed: () { - client.quote.createQuote( - CreateQuoteRequest(text: 'Quote Text', lat: 22, lng: 140)); + FunmapMgr().client.quote.createQuote(CreateQuoteRequest(text: 'Quote Text', lat: 22, lng: 140)); }); } } diff --git a/wien_talks/wien_talks_flutter/lib/widgets/intro_text_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/intro_text_widget.dart new file mode 100644 index 0000000..5a6bcd6 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/intro_text_widget.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class IntroTextWidget extends StatelessWidget { + const IntroTextWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Card( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Welcome to FunMap!", + style: GoogleFonts.poppins( + fontSize: 26, + fontWeight: FontWeight.bold, + color: Theme.of(context).primaryColor, + ), + ), + const SizedBox(height: 20), + Text( + "Ever experienced something funny, weird, or just too good not to share? " + "With FunMap, you can pin your funniest moments and strange encounters right on the map! 🗺️😂", + style: GoogleFonts.roboto(fontSize: 16, height: 1.5), + ), + const SizedBox(height: 16), + Text( + "Share hilarious events from your daily life, discover what others nearby have spotted, " + "and explore a world full of smiles and surprises. Whether it’s a quirky street performer, " + "an awkward sign, or a random act of comedy — every little story has its place here.", + style: GoogleFonts.roboto(fontSize: 16, height: 1.5), + ), + const SizedBox(height: 16), + Text( + "👉 Add your event, mark the spot, and let the community enjoy the laughter with you.", + style: GoogleFonts.roboto( + fontSize: 16, + fontWeight: FontWeight.w600, + height: 1.5, + ), + ), + const SizedBox(height: 16), + Text( + "Because the world’s a lot more fun when we laugh together. 🌍✨", + style: GoogleFonts.roboto( + fontSize: 16, + fontStyle: FontStyle.italic, + height: 1.5, + ), + ), + ], + ), + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart index 4750baa..49613cd 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart @@ -1,4 +1,7 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:loader_overlay/loader_overlay.dart'; class ScreenWidget extends StatelessWidget { @@ -10,13 +13,42 @@ class ScreenWidget extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('News'), + title: const Text('FunMap'), ), // floatingActionButton: AddQuoteFab(), body: SafeArea( child: Padding( padding: const EdgeInsets.all(8.0), - child: LoaderOverlay(child: child), + child: LoaderOverlay( + overlayWidgetBuilder: (_) { + switch (Random().nextInt(5)) { + case 0: + return Center( + child: CircularProgressIndicator(), + ); + case 1: + return Center( + child: SpinKitCubeGrid(size: 50, color: Theme.of(context).primaryColor), + ); + case 2: + return Center( + child: SpinKitWave(color: Theme.of(context).primaryColor), + ); + case 3: + return Center( + child: SpinKitHourGlass(color: Theme.of(context).primaryColor), + ); + case 4: + return Center( + child: SpinKitFadingCircle(color: Theme.of(context).primaryColor), + ); + default: + return Center( + child: SpinKitPulsingGrid(color: Theme.of(context).primaryColor), + ); + } + }, + child: child), )), ); } diff --git a/wien_talks/wien_talks_flutter/pubspec.yaml b/wien_talks/wien_talks_flutter/pubspec.yaml index 79bdab6..2f75789 100644 --- a/wien_talks/wien_talks_flutter/pubspec.yaml +++ b/wien_talks/wien_talks_flutter/pubspec.yaml @@ -25,6 +25,10 @@ dependencies: flutter: sdk: flutter + flutter_spinkit: ^5.2.2 + + google_fonts: ^6.3.0 + go_router: ^16.1.0 loader_overlay: ^5.0.0 From 8967b1698e55aa8e992c4fbc13d6eb80aad46552 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 17:13:49 +0200 Subject: [PATCH 24/49] move client instantiation into main --- .../wien_talks_flutter/lib/helper/funmap_mgr.dart | 11 ++++++++--- wien_talks/wien_talks_flutter/lib/main.dart | 2 ++ .../wien_talks_flutter/lib/widgets/add-quote-fab.dart | 3 ++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart b/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart index 31a211c..9ed543c 100644 --- a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart +++ b/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart @@ -22,9 +22,14 @@ class FunmapMgr { // address by running `ipconfig` on Windows or `ifconfig` on Mac/Linux. // You can set the variable when running or building your app like this: // E.g. `flutter run --dart-define=SERVER_URL=https://api.example.com/` - const serverUrlFromEnv = String.fromEnvironment('SERVER_URL'); - final serverUrl = serverUrlFromEnv.isEmpty ? 'http://localhost:8080/' : serverUrlFromEnv; - client = Client(serverUrl, connectionTimeout: const Duration(seconds: 5))..connectivityMonitor = FlutterConnectivityMonitor(); + const serverUrlFromEnv = String.fromEnvironment('SERVER_URL'); + final serverUrl = + serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; + + client = Client(serverUrl, connectionTimeout: const Duration(seconds: 5)) + ..connectivityMonitor = FlutterConnectivityMonitor(); + + client.openStreamingConnection(); } } diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index 4438c2a..9e7d98f 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; import 'package:wien_talks_flutter/helper/go_router.dart'; void main() { + FunmapMgr(); runApp(const MyApp()); } diff --git a/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart b/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart index 1c58ee1..054493b 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart @@ -10,7 +10,8 @@ class AddQuoteFab extends StatelessWidget { @override Widget build(BuildContext context) { return FloatingActionButton(onPressed: () { - FunmapMgr().client.quote.createQuote(CreateQuoteRequest(text: 'Quote Text', lat: 22, lng: 140)); + FunmapMgr().client.quote.createQuote( + CreateQuoteRequest(text: 'Quote Text', lat: 22, lng: 140)); }); } } From 642dddaaa3051fcb14bf6f41a0bf52c20e72c63b Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 17:18:01 +0200 Subject: [PATCH 25/49] type quote stream --- .../wien_talks_server/lib/src/quotes/quotes_endpoint.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart index d45d704..4ad4f31 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -54,7 +54,6 @@ class QuoteEndpoint extends Endpoint { throw Exception('Quote not found'); } -// Only for dev Future> getAllQuotes(Session session) async { final quotes = await Quote.db.find(session); return quotes; @@ -66,7 +65,7 @@ class QuoteEndpoint extends Endpoint { }) async* { if (limit <= 0 || limit > 500) limit = 200; - final quoteStream = session.messages.createStream('quotes'); + final quoteStream = session.messages.createStream('quotes'); await for (final Quote quote in quoteStream) { yield quote; From 1ef6e06329581097b9888c377d599aa61f250697 Mon Sep 17 00:00:00 2001 From: mikes222 Date: Sat, 16 Aug 2025 17:55:23 +0200 Subject: [PATCH 26/49] carousel implemented --- .../assets/funny_images/falco.jpg | Bin 0 -> 3472 bytes .../assets/funny_images/fiaker.jpg | Bin 0 -> 8531 bytes .../assets/funny_images/houses.jpg | Bin 0 -> 13488 bytes .../assets/funny_images/kangaroos.jpg | Bin 0 -> 8605 bytes .../assets/funny_images/sightseeing.jpg | Bin 0 -> 9142 bytes .../assets/funny_images/tram.jpg | Bin 0 -> 12098 bytes .../assets/funny_images/wastebin.jpg | Bin 0 -> 10565 bytes .../lib/carousel_widget.dart | 26 ++++++++++++++++++ .../lib/create_event_screen.dart | 12 ++++++-- .../lib/helper/go_router.dart | 4 +-- .../{news_screen.dart => home_screen.dart} | 26 +++++++++++++----- wien_talks/wien_talks_flutter/lib/main.dart | 2 +- .../lib/news_input_form.dart | 22 ++++++++------- wien_talks/wien_talks_flutter/pubspec.yaml | 3 ++ 14 files changed, 73 insertions(+), 22 deletions(-) create mode 100644 wien_talks/wien_talks_flutter/assets/funny_images/falco.jpg create mode 100644 wien_talks/wien_talks_flutter/assets/funny_images/fiaker.jpg create mode 100644 wien_talks/wien_talks_flutter/assets/funny_images/houses.jpg create mode 100644 wien_talks/wien_talks_flutter/assets/funny_images/kangaroos.jpg create mode 100644 wien_talks/wien_talks_flutter/assets/funny_images/sightseeing.jpg create mode 100644 wien_talks/wien_talks_flutter/assets/funny_images/tram.jpg create mode 100644 wien_talks/wien_talks_flutter/assets/funny_images/wastebin.jpg create mode 100644 wien_talks/wien_talks_flutter/lib/carousel_widget.dart rename wien_talks/wien_talks_flutter/lib/{news_screen.dart => home_screen.dart} (56%) diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/falco.jpg b/wien_talks/wien_talks_flutter/assets/funny_images/falco.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0d214f46f97ce1fe6c86fd0b62690d6a20daddc GIT binary patch literal 3472 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 JiQU&<{|kp?2nGNE literal 0 HcmV?d00001 diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/kangaroos.jpg b/wien_talks/wien_talks_flutter/assets/funny_images/kangaroos.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9418789515b4f1a8a811afcc015d66d8a034121b GIT binary patch literal 8605 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 YBd~L28u^urTU-RfspZQA;=C>Y4*@75uK)l5 literal 0 HcmV?d00001 diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/sightseeing.jpg b/wien_talks/wien_talks_flutter/assets/funny_images/sightseeing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff94183bffc4d24c01a659d04ed287d42c7aa812 GIT binary patch literal 9142 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 literal 0 HcmV?d00001 diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/tram.jpg b/wien_talks/wien_talks_flutter/assets/funny_images/tram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9c4d3c1c81a12bd831845815f5bf0100bfa752e GIT binary patch literal 12098 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 S4DXnhyT7Fee5+x7U;ZBh4)MkS literal 0 HcmV?d00001 diff --git a/wien_talks/wien_talks_flutter/assets/funny_images/wastebin.jpg b/wien_talks/wien_talks_flutter/assets/funny_images/wastebin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96cdc27752ff0e8a8ea09ce4b0abb2b4b744fb69 GIT binary patch literal 10565 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%0D1jupiMsU>uS$)gDYD=pBNF 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 literal 0 HcmV?d00001 diff --git a/wien_talks/wien_talks_flutter/lib/carousel_widget.dart b/wien_talks/wien_talks_flutter/lib/carousel_widget.dart new file mode 100644 index 0000000..087b75d --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/carousel_widget.dart @@ -0,0 +1,26 @@ +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:flutter/material.dart'; + +class CarouselWidget extends StatelessWidget { + const CarouselWidget({super.key}); + + @override + Widget build(BuildContext context) { + return IgnorePointer( + child: CarouselSlider( + options: CarouselOptions(height: 300.0, autoPlay: true), + items: ["houses.jpg", "kangaroos.jpg", "sightseeing.jpg", "tram.jpg", "fiaker.jpg", "falco.jpg", "wastebin.jpg"].map((i) { + return Builder( + builder: (BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width, + margin: EdgeInsets.symmetric(horizontal: 5.0), + //decoration: BoxDecoration(color: Colors.amber), + child: Image(image: AssetImage("assets/funny_images/$i"))); + }, + ); + }).toList(), + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart b/wien_talks/wien_talks_flutter/lib/create_event_screen.dart index b08093c..8aa88ab 100644 --- a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/create_event_screen.dart @@ -1,6 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:location/location.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; import 'package:wien_talks_flutter/get_location_widget.dart'; +import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; import 'package:wien_talks_flutter/mapfile_widget.dart'; import 'package:wien_talks_flutter/news_input_form.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; @@ -15,8 +17,14 @@ class CreateEventScreen extends StatelessWidget { return ScreenWidget( child: Column( children: [ - NewsInputForm(), - StreamBuilder(stream: LocationMgr().stream, builder: (BuildContext context, AsyncSnapshot snapshot) => Text(snapshot.data.toString())), + NewsInputForm( + onSubmit: (CreateQuoteRequest request) async { + await FunmapMgr().client.quote.createQuote(request); + }, + ), + StreamBuilder( + stream: LocationMgr().stream, + builder: (BuildContext context, AsyncSnapshot snapshot) => snapshot.data != null ? Text(snapshot.data.toString()) : SizedBox()), Expanded( child: GetLocationWidget( child: MapfileWidget(), diff --git a/wien_talks/wien_talks_flutter/lib/helper/go_router.dart b/wien_talks/wien_talks_flutter/lib/helper/go_router.dart index 40fb9e9..bdc24c1 100644 --- a/wien_talks/wien_talks_flutter/lib/helper/go_router.dart +++ b/wien_talks/wien_talks_flutter/lib/helper/go_router.dart @@ -1,12 +1,12 @@ import 'package:go_router/go_router.dart'; import 'package:wien_talks_flutter/create_event_screen.dart'; -import 'package:wien_talks_flutter/news_screen.dart'; +import 'package:wien_talks_flutter/home_screen.dart'; final router = GoRouter( routes: [ GoRoute( path: '/', - builder: (context, state) => NewsScreen(), + builder: (context, state) => HomeScreen(), ), GoRoute(path: '/create_event', name: 'create_event', builder: (context, state) => CreateEventScreen()), ], diff --git a/wien_talks/wien_talks_flutter/lib/news_screen.dart b/wien_talks/wien_talks_flutter/lib/home_screen.dart similarity index 56% rename from wien_talks/wien_talks_flutter/lib/news_screen.dart rename to wien_talks/wien_talks_flutter/lib/home_screen.dart index 75f1dc9..888e927 100644 --- a/wien_talks/wien_talks_flutter/lib/news_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/home_screen.dart @@ -4,8 +4,10 @@ import 'package:wien_talks_flutter/show_latest_news_widget.dart'; import 'package:wien_talks_flutter/widgets/intro_text_widget.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; -class NewsScreen extends StatelessWidget { - const NewsScreen({ +import 'carousel_widget.dart'; + +class HomeScreen extends StatelessWidget { + const HomeScreen({ super.key, }); @@ -21,11 +23,21 @@ class NewsScreen extends StatelessWidget { SizedBox( height: 30, ), - ElevatedButton( - onPressed: () { - context.pushNamed("create_event"); - }, - child: Text("Submit your own event")), + Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: () { + context.pushNamed("create_event"); + }, + child: Text("Submit your own event")), + ), + ], + ), + SizedBox( + height: 30, + ), + CarouselWidget(), ], ), ), diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index 9e7d98f..e0494e0 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -14,7 +14,7 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp.router( title: 'Wien Talks FunMap', - theme: ThemeData(primarySwatch: Colors.blue), + theme: ThemeData(primarySwatch: Colors.green), routerConfig: router, ); } diff --git a/wien_talks/wien_talks_flutter/lib/news_input_form.dart b/wien_talks/wien_talks_flutter/lib/news_input_form.dart index 50d6dd9..21abde7 100644 --- a/wien_talks/wien_talks_flutter/lib/news_input_form.dart +++ b/wien_talks/wien_talks_flutter/lib/news_input_form.dart @@ -2,12 +2,15 @@ import 'package:flutter/material.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:location/location.dart'; import 'package:wien_talks_client/wien_talks_client.dart'; -import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; import 'package:wien_talks_flutter/location_mgr.dart'; import 'package:wien_talks_flutter/widgets/error_snackbar.dart'; +typedef OnSubmit = Future Function(CreateQuoteRequest request); + class NewsInputForm extends StatefulWidget { - const NewsInputForm({super.key}); + final OnSubmit onSubmit; + + const NewsInputForm({super.key, required this.onSubmit}); @override _NewsInputFormState createState() => _NewsInputFormState(); @@ -30,17 +33,16 @@ class _NewsInputFormState extends State { return; } if (_formKey.currentState!.validate()) { + final newsData = CreateQuoteRequest( + text: _newsController.text.trim(), + lat: LocationMgr().lastLocation!.latitude!, + lng: LocationMgr().lastLocation!.longitude!, + ); var handler = context.loaderOverlay..show(); try { - final newsData = CreateQuoteRequest( - text: _newsController.text.trim(), - lat: LocationMgr().lastLocation!.latitude!, - lng: LocationMgr().lastLocation!.longitude!, - ); - await FunmapMgr().client.quote.createQuote(newsData); - _newsController.clear(); + await widget.onSubmit(newsData); } catch (error) { - if (mounted) { + if (context.mounted) { ErrorSnackbar().show(context, error.toString()); } } finally { diff --git a/wien_talks/wien_talks_flutter/pubspec.yaml b/wien_talks/wien_talks_flutter/pubspec.yaml index 2f75789..3d8952c 100644 --- a/wien_talks/wien_talks_flutter/pubspec.yaml +++ b/wien_talks/wien_talks_flutter/pubspec.yaml @@ -25,6 +25,8 @@ dependencies: flutter: sdk: flutter + carousel_slider: ^5.1.1 + flutter_spinkit: ^5.2.2 google_fonts: ^6.3.0 @@ -69,6 +71,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: + - assets/funny_images/ - assets/render_themes/ - packages/mapsforge_flutter/assets/patterns/dark_farmland.svg - packages/mapsforge_flutter/assets/patterns/dark_military.png From 9de633feb9a8bbedd7b584ababcb22ae5623eee6 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 18:10:28 +0200 Subject: [PATCH 27/49] merge frontend changes --- .../wien_talks_flutter/lib/news_screen.dart | 34 +++++++++++++++++++ .../lib/show_latest_news_widget.dart | 5 ++- .../lib/src/quotes/quotes_endpoint.dart | 2 +- 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 wien_talks/wien_talks_flutter/lib/news_screen.dart diff --git a/wien_talks/wien_talks_flutter/lib/news_screen.dart b/wien_talks/wien_talks_flutter/lib/news_screen.dart new file mode 100644 index 0000000..0463223 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/news_screen.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:wien_talks_flutter/show_latest_news_widget.dart'; +import 'package:wien_talks_flutter/widgets/heading_text.dart'; +import 'package:wien_talks_flutter/widgets/screen_widget.dart'; + +class NewsScreen extends StatelessWidget { + const NewsScreen({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return ScreenWidget( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + HeadingText(text: "Latest news"), + QuoteList(), + SizedBox( + height: 30, + ), + ElevatedButton( + onPressed: () { + context.pushNamed("create_event"); + }, + child: Text("Submit your own event")), + ], + ), + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart index 38dd823..0f50d2c 100644 --- a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart @@ -16,7 +16,10 @@ class ShowLatestNewsWidget extends StatelessWidget { children: [ HeadingText(text: "Latest news"), if (snapshot.hasError) Text('Error: ${snapshot.error}'), - Text(snapshot.data ?? "Be the first to submit amazing news!", style: TextStyle(fontSize: 20, color: Theme.of(context).colorScheme.error)), + Text(snapshot.data ?? "Be the first to submit amazing news!", + style: TextStyle( + fontSize: 20, + color: Theme.of(context).colorScheme.error)), ], ); }); diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart index 4ad4f31..f57732e 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -40,7 +40,7 @@ class QuoteEndpoint extends Endpoint { ); final inserted = await session.db.insertRow(quote); - await session.messages.postMessage(_channelQuoteUpdates, quote); + await session.messages.postMessage(_channelQuoteUpdates, inserted); return inserted; } From 33c98019bbab9987df5c2864ca130752ee1a14a4 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 18:39:33 +0200 Subject: [PATCH 28/49] regenerate stream endpoints --- .../lib/src/protocol/client.dart | 27 ++---- wien_talks/wien_talks_flutter/lib/main.dart | 2 +- .../wien_talks_flutter/lib/news_screen.dart | 2 +- .../lib/show_latest_news_widget.dart | 96 +++++++++++++++---- ...{add-quote-fab.dart => add_quote_fab.dart} | 0 .../lib/src/generated/endpoints.dart | 75 ++++++--------- .../lib/src/generated/protocol.yaml | 4 +- .../lib/src/quotes/quotes_endpoint.dart | 93 ++++++++++-------- .../test_tools/serverpod_test_tools.dart | 76 ++------------- 9 files changed, 177 insertions(+), 198 deletions(-) rename wien_talks/wien_talks_flutter/lib/widgets/{add-quote-fab.dart => add_quote_fab.dart} (100%) diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index 3d49693..a580f14 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -23,21 +23,6 @@ class EndpointQuote extends _i1.EndpointRef { @override String get name => 'quote'; - _i2.Future updateQuote(_i3.Quote quote) => - caller.callServerEndpoint( - 'quote', - 'updateQuote', - {'quote': quote}, - ); - - _i2.Stream<_i3.Quote> quoteUpdates() => - caller.callStreamingServerEndpoint<_i2.Stream<_i3.Quote>, _i3.Quote>( - 'quote', - 'quoteUpdates', - {}, - {}, - ); - _i2.Future<_i3.Quote> createQuote(_i4.CreateQuoteRequest req) => caller.callServerEndpoint<_i3.Quote>( 'quote', @@ -45,18 +30,18 @@ class EndpointQuote extends _i1.EndpointRef { {'req': req}, ); - _i2.Future<_i3.Quote> getQuoteById(int id) => - caller.callServerEndpoint<_i3.Quote>( + _i2.Future updateQuote(_i3.Quote quote) => + caller.callServerEndpoint( 'quote', - 'getQuoteById', - {'id': id}, + 'updateQuote', + {'quote': quote}, ); - _i2.Future> getAllQuotes() => + _i2.Future> getAllQuotes({required int limit}) => caller.callServerEndpoint>( 'quote', 'getAllQuotes', - {}, + {'limit': limit}, ); } diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index e0494e0..0ced7fe 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -3,7 +3,7 @@ import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; import 'package:wien_talks_flutter/helper/go_router.dart'; void main() { - FunmapMgr(); + FunmapMgr().configure(); runApp(const MyApp()); } diff --git a/wien_talks/wien_talks_flutter/lib/news_screen.dart b/wien_talks/wien_talks_flutter/lib/news_screen.dart index 0463223..84507cb 100644 --- a/wien_talks/wien_talks_flutter/lib/news_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/news_screen.dart @@ -17,7 +17,7 @@ class NewsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ HeadingText(text: "Latest news"), - QuoteList(), + ShowLatestNewsWidget(), SizedBox( height: 30, ), diff --git a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart index 0f50d2c..4dcf12b 100644 --- a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart @@ -1,27 +1,87 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; -import 'package:wien_talks_flutter/widgets/heading_text.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; -import 'helper/funmap_mgr.dart'; - -class ShowLatestNewsWidget extends StatelessWidget { +class ShowLatestNewsWidget extends StatefulWidget { const ShowLatestNewsWidget({super.key}); + @override + State createState() => _ShowLatestNewsWidgetState(); +} + +class _ShowLatestNewsWidgetState extends State { + final _controller = StreamController>.broadcast(); + Timer? _timer; + + @override + void initState() { + super.initState(); + _reload(); + _timer = Timer.periodic(const Duration(seconds: 30), (_) => _reload()); + } + + Future _reload() async { + try { + final quotes = await FunmapMgr().client.quote.getAllQuotes(limit: 200); + _controller.add(quotes); + } catch (e, st) { + _controller.addError(e, st); + } + } + + @override + void dispose() { + _timer?.cancel(); + _controller.close(); + super.dispose(); + } @override Widget build(BuildContext context) { - return StreamBuilder( - stream: FunmapMgr().client.quote.stream, - builder: (BuildContext context, AsyncSnapshot snapshot) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - HeadingText(text: "Latest news"), - if (snapshot.hasError) Text('Error: ${snapshot.error}'), - Text(snapshot.data ?? "Be the first to submit amazing news!", - style: TextStyle( - fontSize: 20, - color: Theme.of(context).colorScheme.error)), - ], + return RefreshIndicator( + onRefresh: _reload, + child: StreamBuilder>( + stream: _controller.stream, + initialData: const [], + builder: (context, snap) { + if (snap.hasError) { + return ListView( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Text('Error: ${snap.error}'), + ), + ], + ); + } + final quotes = snap.data ?? const []; + if (quotes.isEmpty) { + return ListView( + children: const [ + Padding( + padding: EdgeInsets.all(16), + child: Text('No quotes yet. Pull to refresh.'), + ), + ], + ); + } + return ListView.separated( + itemCount: quotes.length, + separatorBuilder: (_, __) => const Divider(height: 1), + itemBuilder: (context, i) { + final q = quotes[i]; + return ListTile( + title: Text(q.text), + subtitle: Text([ + if ((q.authorName ?? '').isNotEmpty) q.authorName!, + q.createdAt.toLocal().toString(), + ].where((e) => e.isNotEmpty).join(' · ')), + ); + }, ); - }); + }, + ), + ); } } diff --git a/wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart b/wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/widgets/add-quote-fab.dart rename to wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index a9cb545..2054dea 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -11,9 +11,9 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; import '../quotes/quotes_endpoint.dart' as _i2; -import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i3; import 'package:wien_talks_server/src/generated/quotes/create_quote.dart' - as _i4; + as _i3; +import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i4; import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i5; class Endpoints extends _i1.EndpointDispatch { @@ -31,30 +31,12 @@ class Endpoints extends _i1.EndpointDispatch { name: 'quote', endpoint: endpoints['quote']!, methodConnectors: { - 'updateQuote': _i1.MethodConnector( - name: 'updateQuote', - params: { - 'quote': _i1.ParameterDescription( - name: 'quote', - type: _i1.getType<_i3.Quote>(), - nullable: false, - ) - }, - call: ( - _i1.Session session, - Map params, - ) async => - (endpoints['quote'] as _i2.QuoteEndpoint).updateQuote( - session, - params['quote'], - ), - ), 'createQuote': _i1.MethodConnector( name: 'createQuote', params: { 'req': _i1.ParameterDescription( name: 'req', - type: _i1.getType<_i4.CreateQuoteRequest>(), + type: _i1.getType<_i3.CreateQuoteRequest>(), nullable: false, ) }, @@ -67,11 +49,29 @@ class Endpoints extends _i1.EndpointDispatch { params['req'], ), ), - 'getQuoteById': _i1.MethodConnector( - name: 'getQuoteById', + 'updateQuote': _i1.MethodConnector( + name: 'updateQuote', params: { - 'id': _i1.ParameterDescription( - name: 'id', + 'quote': _i1.ParameterDescription( + name: 'quote', + type: _i1.getType<_i4.Quote>(), + nullable: false, + ) + }, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['quote'] as _i2.QuoteEndpoint).updateQuote( + session, + params['quote'], + ), + ), + 'getAllQuotes': _i1.MethodConnector( + name: 'getAllQuotes', + params: { + 'limit': _i1.ParameterDescription( + name: 'limit', type: _i1.getType(), nullable: false, ) @@ -80,32 +80,11 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i2.QuoteEndpoint).getQuoteById( + (endpoints['quote'] as _i2.QuoteEndpoint).getAllQuotes( session, - params['id'], + limit: params['limit'], ), ), - 'getAllQuotes': _i1.MethodConnector( - name: 'getAllQuotes', - params: {}, - call: ( - _i1.Session session, - Map params, - ) async => - (endpoints['quote'] as _i2.QuoteEndpoint).getAllQuotes(session), - ), - 'quoteUpdates': _i1.MethodStreamConnector( - name: 'quoteUpdates', - params: {}, - streamParams: {}, - returnType: _i1.MethodStreamReturnType.streamType, - call: ( - _i1.Session session, - Map params, - Map streamParams, - ) => - (endpoints['quote'] as _i2.QuoteEndpoint).quoteUpdates(session), - ), }, ); modules['serverpod_auth'] = _i5.Endpoints()..initializeEndpoints(server); diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml index fd8118a..c4c3b61 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml @@ -1,6 +1,4 @@ quote: - - updateQuote: - - quoteUpdates: - createQuote: - - getQuoteById: + - updateQuote: - getAllQuotes: diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart index f57732e..2da2850 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -1,34 +1,22 @@ -import 'dart:math'; +// lib/src/endpoints/quote_endpoint.dart +import 'dart:async'; import 'package:serverpod/serverpod.dart'; import 'package:wien_talks_server/src/generated/protocol.dart'; import 'package:wien_talks_server/src/quotes/quote_util.dart'; -class QuoteEndpoint extends Endpoint { +class ShowLatestNewsWidget extends Endpoint { static const _channelQuoteUpdates = 'quote-updates'; - Future updateQuote(Session session, Quote quote) async { - await Quote.db.updateRow(session, quote); - await session.messages.postMessage(_channelQuoteUpdates, quote); - } - - Stream quoteUpdates(Session session) async* { - var updateStream = - session.messages.createStream(_channelQuoteUpdates); - - await for (var quote in updateStream) { - yield quote; - } - } - Future createQuote(Session session, CreateQuoteRequest req) async { final authInfo = await session.authenticated; - final userId = Random().nextInt(100); + final userId = authInfo?.userId; - String text = validateQuote(req); + final text = validateQuote(req); - final quote = Quote( - userId: userId, + final toInsert = Quote( + id: 0, + userId: userId ?? 12, text: text, authorName: req.authorName, lat: req.lat, @@ -39,36 +27,61 @@ class QuoteEndpoint extends Endpoint { downvotes: 0, ); - final inserted = await session.db.insertRow(quote); + final inserted = await session.db.insertRow(toInsert); await session.messages.postMessage(_channelQuoteUpdates, inserted); - return inserted; } - Future getQuoteById(Session session, int id) async { - final quote = await Quote.db.findById(session, id); - if (quote != null) { - return quote; - } - - throw Exception('Quote not found'); + Future updateQuote(Session session, Quote quote) async { + await Quote.db.updateRow(session, quote); + await session.messages.postMessage(_channelQuoteUpdates, quote); } - Future> getAllQuotes(Session session) async { - final quotes = await Quote.db.find(session); - return quotes; + Future> getAllQuotes(Session session, {int limit = 200}) async { + final quoteList = await Quote.db.find(session); + return quoteList; } - Stream streamAllQuotes( - StreamingSession session, { - int limit = 200, - }) async* { + Future> streamAllQuotes(StreamingSession session, + {int limit = 200}) async { if (limit <= 0 || limit > 500) limit = 200; - final quoteStream = session.messages.createStream('quotes'); + final controller = StreamController(); + final live = session.messages.createStream(_channelQuoteUpdates); + final liveSub = live.listen( + (q) { + if (q.visibility == 0) controller.add(q); + }, + onError: controller.addError, + onDone: () { + if (!controller.isClosed) controller.close(); + }, + cancelOnError: false, + ); - await for (final Quote quote in quoteStream) { - yield quote; - } + () async* { + try { + final snapshot = await Quote.db.find( + session, + where: (t) => t.visibility.equals(0), + orderBy: (t) => t.createdAt, + orderDescending: true, + limit: limit, + ); + + for (final q in snapshot.reversed) { + controller.add(q); + } + } catch (e, st) { + controller.addError(e, st); + } + }(); + + await session.close().then((_) async { + await liveSub.cancel(); + await controller.close(); + }); + + return controller.stream; } } diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index aa1b0e9..87bbd13 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -130,64 +130,6 @@ class _QuoteEndpoint { final _i2.SerializationManager _serializationManager; - _i3.Future updateQuote( - _i1.TestSessionBuilder sessionBuilder, - _i4.Quote quote, - ) async { - return _i1.callAwaitableFunctionAndHandleExceptions(() async { - var _localUniqueSession = - (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'quote', - method: 'updateQuote', - ); - try { - var _localCallContext = await _endpointDispatch.getMethodCallContext( - createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'quote', - methodName: 'updateQuote', - parameters: _i1.testObjectToJson({'quote': quote}), - serializationManager: _serializationManager, - ); - var _localReturnValue = await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) as _i3.Future); - return _localReturnValue; - } finally { - await _localUniqueSession.close(); - } - }); - } - - _i3.Stream<_i4.Quote> quoteUpdates(_i1.TestSessionBuilder sessionBuilder) { - var _localTestStreamManager = _i1.TestStreamManager<_i4.Quote>(); - _i1.callStreamFunctionAndHandleExceptions( - () async { - var _localUniqueSession = - (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'quote', - method: 'quoteUpdates', - ); - var _localCallContext = - await _endpointDispatch.getMethodStreamCallContext( - createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'quote', - methodName: 'quoteUpdates', - arguments: {}, - requestedInputStreams: [], - serializationManager: _serializationManager, - ); - await _localTestStreamManager.callStreamMethod( - _localCallContext, - _localUniqueSession, - {}, - ); - }, - _localTestStreamManager.outputStreamController, - ); - return _localTestStreamManager.outputStreamController.stream; - } - _i3.Future<_i4.Quote> createQuote( _i1.TestSessionBuilder sessionBuilder, _i5.CreateQuoteRequest req, @@ -217,28 +159,28 @@ class _QuoteEndpoint { }); } - _i3.Future<_i4.Quote> getQuoteById( + _i3.Future updateQuote( _i1.TestSessionBuilder sessionBuilder, - int id, + _i4.Quote quote, ) async { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( endpoint: 'quote', - method: 'getQuoteById', + method: 'updateQuote', ); try { var _localCallContext = await _endpointDispatch.getMethodCallContext( createSessionCallback: (_) => _localUniqueSession, endpointPath: 'quote', - methodName: 'getQuoteById', - parameters: _i1.testObjectToJson({'id': id}), + methodName: 'updateQuote', + parameters: _i1.testObjectToJson({'quote': quote}), serializationManager: _serializationManager, ); var _localReturnValue = await (_localCallContext.method.call( _localUniqueSession, _localCallContext.arguments, - ) as _i3.Future<_i4.Quote>); + ) as _i3.Future); return _localReturnValue; } finally { await _localUniqueSession.close(); @@ -247,7 +189,9 @@ class _QuoteEndpoint { } _i3.Future> getAllQuotes( - _i1.TestSessionBuilder sessionBuilder) async { + _i1.TestSessionBuilder sessionBuilder, { + required int limit, + }) async { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( @@ -259,7 +203,7 @@ class _QuoteEndpoint { createSessionCallback: (_) => _localUniqueSession, endpointPath: 'quote', methodName: 'getAllQuotes', - parameters: _i1.testObjectToJson({}), + parameters: _i1.testObjectToJson({'limit': limit}), serializationManager: _serializationManager, ); var _localReturnValue = await (_localCallContext.method.call( From 5b8b317e8950a1d0f6466a4715cead37af7621f7 Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 18:40:14 +0200 Subject: [PATCH 29/49] server: dockerfile: add todos for improvements Signed-off-by: Max R. Carrara --- wien_talks/wien_talks_server/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wien_talks/wien_talks_server/Dockerfile b/wien_talks/wien_talks_server/Dockerfile index 33ec119..0607bb4 100644 --- a/wien_talks/wien_talks_server/Dockerfile +++ b/wien_talks/wien_talks_server/Dockerfile @@ -1,6 +1,7 @@ # Build stage FROM dart:3.5.0 AS build WORKDIR /app +# TODO: more fine-grained building COPY . . # Install dependencies and compile the server executable @@ -23,6 +24,7 @@ COPY --from=build /runtime/ / COPY --from=build /app/bin/server server # Copy configuration files and resources +# TODO: don't copy entire config dir, only what's needed COPY --from=build /app/config/ config/ COPY --from=build /app/web/ web/ COPY --from=build /app/migrations/ migrations/ From 6786def06310e51c1de408c06d4232cd3da1ad87 Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 18:40:32 +0200 Subject: [PATCH 30/49] server: dockerfile: fix broken ENTRYPOINT from generated project This cost me an entire afternoon. I don't know whose bright idea it was to just slap all arguments into the ENTRYPOINT, but here we are. ENTRYPOINT now just runs the `server` executable, while COMMAND is used to pass arguments / flags to it. This is useful for e.g. passing `--apply-migrations` for deployments. Signed-off-by: Max R. Carrara --- wien_talks/wien_talks_server/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wien_talks/wien_talks_server/Dockerfile b/wien_talks/wien_talks_server/Dockerfile index 0607bb4..8c71ffc 100644 --- a/wien_talks/wien_talks_server/Dockerfile +++ b/wien_talks/wien_talks_server/Dockerfile @@ -37,5 +37,5 @@ EXPOSE 8080 EXPOSE 8081 EXPOSE 8082 -# Define the entrypoint command -ENTRYPOINT ./server --mode=$runmode --server-id=$serverid --logging=$logging --role=$role +ENTRYPOINT ["/server"] +CMD ["--mode", "production", "--server-id", "default", "--logging", "normal", "--role", "monolith"] From f87843785a5acbf7a0226f6603c20ecd3fd8d9df Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 18:45:55 +0200 Subject: [PATCH 31/49] server: make/docker: add deployment procedures Signed-off-by: Max R. Carrara --- wien_talks/wien_talks_server/Makefile | 41 ++++++++++ .../docker-compose.deploy.yaml | 75 +++++++++++++++++++ .../env.d/postgres.env.template | 3 + .../env.d/server.env.template | 20 +++++ 4 files changed, 139 insertions(+) create mode 100644 wien_talks/wien_talks_server/docker-compose.deploy.yaml create mode 100644 wien_talks/wien_talks_server/env.d/postgres.env.template create mode 100644 wien_talks/wien_talks_server/env.d/server.env.template diff --git a/wien_talks/wien_talks_server/Makefile b/wien_talks/wien_talks_server/Makefile index ec6f31d..ab420e8 100644 --- a/wien_talks/wien_talks_server/Makefile +++ b/wien_talks/wien_talks_server/Makefile @@ -3,9 +3,20 @@ include ../defines.mk COMPOSE_FILE_LOCAL = docker-compose.local.yaml COMPOSE_FILE_DEPLOY = docker-compose.deploy.yaml +# NOTE: the --env-file flags are necessary because the env_file directive +# in the docker-compose.yaml doesn't work for env vars that are used inside the +# compose file itself. +# This is jank, but it is what it is <.< +COMPOSE_COMMON_ARGS_DEPLOY = -f $(COMPOSE_FILE_DEPLOY) \ + --env-file env.d/postgres.env \ + --env-file env.d/server.env \ + + # Basically the current directory's name, so wien_talks_server COMPOSE_PROJECT := $(shell basename $(shell pwd)) +DEPLOY_NETWORK = docker-net + .env: .env.template cp -a .env.template .env @@ -25,3 +36,33 @@ local-clean: local-down for VOLUME in $(shell docker compose -f $(COMPOSE_FILE_LOCAL) volumes -q); \ do docker volume rm "$$VOLUME"; done +.PHONY: deploy deploy-env deploy-build deploy-stop deploy-down +deploy: + if test -z "$$(docker network ls -q --filter name=$(DEPLOY_NETWORK))"; then \ + docker network create --driver bridge $(DEPLOY_NETWORK); fi + docker compose $(COMPOSE_COMMON_ARGS_DEPLOY) up -d + +# TODO: parameterize .env files +deploy-env: env.d/postgres.env.template env.d/server.env.template + if test -e env.d/postgres.env; then echo "env.d/postgres.env already exists"; exit 1; fi + if test -e env.d/server.env; then echo "env.d/server.env already exists"; exit 1; fi + cp -a env.d/postgres.env.template env.d/postgres.env + cp -a env.d/server.env.template env.d/server.env + @echo -e "\n!!! Environment files for deployment initialized !!!\n\nDon't forget to edit them!" + +deploy-build: + docker compose $(COMPOSE_COMMON_ARGS_DEPLOY) build --no-cache + +deploy-stop: + if test -n "$$(docker network ls -q --filter name=$(DEPLOY_NETWORK))"; then \ + docker compose $(COMPOSE_COMMON_ARGS_DEPLOY) stop; fi + +deploy-down: + if test -n "$$(docker network ls -q --filter name=$(DEPLOY_NETWORK))"; then \ + docker compose $(COMPOSE_COMMON_ARGS_DEPLOY) down; fi + +# Note: Doesn't clean up DB for safety reasons! +deploy-clean: deploy-down + if test -n "$$(docker network ls -q --filter name=$(DEPLOY_NETWORK))"; then \ + docker network rm $(DEPLOY_NETWORK) > /dev/null; fi + diff --git a/wien_talks/wien_talks_server/docker-compose.deploy.yaml b/wien_talks/wien_talks_server/docker-compose.deploy.yaml new file mode 100644 index 0000000..fdfd549 --- /dev/null +++ b/wien_talks/wien_talks_server/docker-compose.deploy.yaml @@ -0,0 +1,75 @@ +networks: + docker-net: + name: docker-net + external: true + backend: + name: backend + driver: bridge + external: false + +services: + postgres: + image: postgres:16-trixie + container_name: postgres + env_file: + - path: env.d/postgres.env + required: true + volumes: + - db:/var/lib/postgresql/data + restart: always + networks: + - backend + ports: + - "127.0.0.1:5432:5432" + + server: + depends_on: + - postgres + build: + context: ./ + image: wien-talks + command: [ + "--mode", + "production", + "--server-id", + "default", + "--logging", + "normal", + "--role", + "monolith", + "--apply-migrations", + ] + env_file: + - path: env.d/server.env + required: true + restart: always + networks: + - docker-net + - backend + labels: + - "traefik.enable=true" + - "traefik.http.routers.wien-talks-api.rule=Host(`${SERVERPOD_API_SERVER_PUBLIC_HOST}`)" + - "traefik.http.routers.wien-talks-api.entrypoints=secure" + - "traefik.http.routers.wien-talks-api.service=wien-talks-api-service" + - "traefik.http.services.wien-talks-api-service.loadbalancer.server.port=${SERVERPOD_API_SERVER_PORT}" + + - "traefik.http.routers.wien-talks-insights.rule=Host(`${SERVERPOD_INSIGHTS_SERVER_PUBLIC_HOST}`)" + - "traefik.http.routers.wien-talks-insights.entrypoints=secure" + - "traefik.http.routers.wien-talks-insights.service=wien-talks-insights-service" + - "traefik.http.services.wien-talks-insights-service.loadbalancer.server.port=${SERVERPOD_INSIGHTS_SERVER_PORT}" + + - "traefik.http.routers.wien-talks-web.rule=Host(`${SERVERPOD_WEB_SERVER_PUBLIC_HOST}`)" + - "traefik.http.routers.wien-talks-web.entrypoints=secure" + - "traefik.http.routers.wien-talks-web.service=wien-talks-web-service" + - "traefik.http.services.wien-talks-web-service.loadbalancer.server.port=${SERVERPOD_WEB_SERVER_PORT}" + + debug: + container_name: debug + image: debian:13 + networks: + - docker-net + - backend + +volumes: + db: + diff --git a/wien_talks/wien_talks_server/env.d/postgres.env.template b/wien_talks/wien_talks_server/env.d/postgres.env.template new file mode 100644 index 0000000..500b878 --- /dev/null +++ b/wien_talks/wien_talks_server/env.d/postgres.env.template @@ -0,0 +1,3 @@ +POSTGRES_USER=postgres +POSTGRES_PASSWORD=sergtsop +POSTGRES_DB=wien_talks diff --git a/wien_talks/wien_talks_server/env.d/server.env.template b/wien_talks/wien_talks_server/env.d/server.env.template new file mode 100644 index 0000000..f2f644d --- /dev/null +++ b/wien_talks/wien_talks_server/env.d/server.env.template @@ -0,0 +1,20 @@ +SERVERPOD_API_SERVER_PORT=8080 +SERVERPOD_API_SERVER_PUBLIC_HOST=localhost +SERVERPOD_API_SERVER_PUBLIC_PORT +SERVERPOD_API_SERVER_PUBLIC_SCHEME +SERVERPOD_DATABASE_HOST=postgres +SERVERPOD_DATABASE_IS_UNIX_SOCKET +SERVERPOD_DATABASE_NAME=wien_talks +SERVERPOD_DATABASE_PASSWORD=${POSTGRES_PASSWORD} +SERVERPOD_DATABASE_PORT=5432 +SERVERPOD_DATABASE_REQUIRE_SSL=false +SERVERPOD_DATABASE_USER=postgres +SERVERPOD_INSIGHTS_SERVER_PORT=8081 +SERVERPOD_INSIGHTS_SERVER_PUBLIC_HOST=localhost +SERVERPOD_INSIGHTS_SERVER_PUBLIC_SCHEME +SERVERPOD_MAX_REQUEST_SIZE +SERVERPOD_SERVICE_SECRET +SERVERPOD_WEB_SERVER_PORT=8082 +SERVERPOD_WEB_SERVER_PUBLIC_HOST=localhost +SERVERPOD_WEB_SERVER_PUBLIC_PORT +SERVERPOD_WEB_SERVER_PUBLIC_SCHEME From 7631cfd326fa6fae158a8c1f0c83c5cf9aff7071 Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 18:48:06 +0200 Subject: [PATCH 32/49] server: docker: remove debug container from compose file Signed-off-by: Max R. Carrara --- wien_talks/wien_talks_server/docker-compose.deploy.yaml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/wien_talks/wien_talks_server/docker-compose.deploy.yaml b/wien_talks/wien_talks_server/docker-compose.deploy.yaml index fdfd549..1028fcd 100644 --- a/wien_talks/wien_talks_server/docker-compose.deploy.yaml +++ b/wien_talks/wien_talks_server/docker-compose.deploy.yaml @@ -63,13 +63,6 @@ services: - "traefik.http.routers.wien-talks-web.service=wien-talks-web-service" - "traefik.http.services.wien-talks-web-service.loadbalancer.server.port=${SERVERPOD_WEB_SERVER_PORT}" - debug: - container_name: debug - image: debian:13 - networks: - - docker-net - - backend - volumes: db: From 5a8c072d6478e92f8c749fb395a3de5488a9868d Mon Sep 17 00:00:00 2001 From: mikes222 Date: Sat, 16 Aug 2025 18:58:17 +0200 Subject: [PATCH 33/49] A little refreshing ui change :-) --- wien_talks/wien_talks_flutter/README.md | 12 +++++++++ .../lib/helper/funmap_mgr.dart | 8 +++--- .../wien_talks_flutter/lib/home_screen.dart | 12 ++++++++- .../wien_talks_flutter/lib/location_mgr.dart | 27 ++++++++++--------- wien_talks/wien_talks_flutter/lib/main.dart | 2 -- .../lib/mapfile_widget.dart | 2 +- .../lib/news_input_form.dart | 3 +++ .../lib/widgets/error_snackbar.dart | 6 ++++- .../lib/widgets/intro_text_widget.dart | 14 +++++----- 9 files changed, 58 insertions(+), 28 deletions(-) diff --git a/wien_talks/wien_talks_flutter/README.md b/wien_talks/wien_talks_flutter/README.md index 0a3aefb..4d25881 100644 --- a/wien_talks/wien_talks_flutter/README.md +++ b/wien_talks/wien_talks_flutter/README.md @@ -13,3 +13,15 @@ A great starting point for learning Serverpod is our documentation site at: To run the project, first make sure that the server is running, then do: flutter run + +## Flutter start: + +add environment variable in the Additional arguments field in Android Studio: + +--dart-define=SERVER_URL=http://localhost:5432/ + +Note: Host MUST end with a slash + +## docker start: + +wien_talks_server>docker compose -f docker-compose.local.yaml up -d \ No newline at end of file diff --git a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart b/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart index 9ed543c..e213c4e 100644 --- a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart +++ b/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart @@ -10,6 +10,8 @@ class FunmapMgr { late Client client; + late final serverUrl; + factory FunmapMgr() { if (_instance != null) return _instance!; _instance = FunmapMgr._(); @@ -24,11 +26,9 @@ class FunmapMgr { // E.g. `flutter run --dart-define=SERVER_URL=https://api.example.com/` const serverUrlFromEnv = String.fromEnvironment('SERVER_URL'); - final serverUrl = - serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; + serverUrl = serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; - client = Client(serverUrl, connectionTimeout: const Duration(seconds: 5)) - ..connectivityMonitor = FlutterConnectivityMonitor(); + client = Client(serverUrl, connectionTimeout: const Duration(seconds: 5))..connectivityMonitor = FlutterConnectivityMonitor(); client.openStreamingConnection(); } diff --git a/wien_talks/wien_talks_flutter/lib/home_screen.dart b/wien_talks/wien_talks_flutter/lib/home_screen.dart index 888e927..ac051f4 100644 --- a/wien_talks/wien_talks_flutter/lib/home_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/home_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; import 'package:wien_talks_flutter/show_latest_news_widget.dart'; import 'package:wien_talks_flutter/widgets/intro_text_widget.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; @@ -19,7 +20,7 @@ class HomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ IntroTextWidget(), - ShowLatestNewsWidget(), + SizedBox(height: 200, child: ShowLatestNewsWidget()), SizedBox( height: 30, ), @@ -27,6 +28,9 @@ class HomeScreen extends StatelessWidget { children: [ Expanded( child: ElevatedButton( + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(Theme.of(context).primaryColor), + foregroundColor: WidgetStateProperty.all(Theme.of(context).colorScheme.onPrimary)), onPressed: () { context.pushNamed("create_event"); }, @@ -38,6 +42,12 @@ class HomeScreen extends StatelessWidget { height: 30, ), CarouselWidget(), + Row( + children: [ + Spacer(), + Text(FunmapMgr().serverUrl, style: Theme.of(context).textTheme.bodySmall), + ], + ) ], ), ), diff --git a/wien_talks/wien_talks_flutter/lib/location_mgr.dart b/wien_talks/wien_talks_flutter/lib/location_mgr.dart index 21d3289..451870c 100644 --- a/wien_talks/wien_talks_flutter/lib/location_mgr.dart +++ b/wien_talks/wien_talks_flutter/lib/location_mgr.dart @@ -26,29 +26,24 @@ class LocationMgr { ViewModel? viewModel; - late MapModel mapModel; + MapModel? mapModel; IconMarker? iconMarker; - final DisplayModel displayModel = DisplayModel(maxZoomLevel: 20); + final DisplayModel displayModel = DisplayModel(maxZoomLevel: 18); final SymbolCache symbolCache = FileSymbolCache(); final JobRenderer jobRenderer = MapOnlineRenderer(); + final MarkerByItemDataStore markerDataStore = MarkerByItemDataStore(); + factory LocationMgr() { _instance ??= LocationMgr._(); return _instance!; } - LocationMgr._() { - mapModel = MapModel( - displayModel: displayModel, - renderer: jobRenderer, - symbolCache: symbolCache, - tileBitmapCache: bitmapCache, - ); - } + LocationMgr._() {} Future startup() async { serviceEnabled = await location.serviceEnabled(); @@ -66,6 +61,13 @@ class LocationMgr { return "No permissions granted"; } } + mapModel = MapModel( + displayModel: displayModel, + renderer: jobRenderer, + symbolCache: symbolCache, + tileBitmapCache: bitmapCache, + ); + mapModel?.markerDataStores.add(markerDataStore); viewModel = ViewModel(displayModel: displayModel); _subscription = location.onLocationChanged.listen((LocationData currentLocation) { _lastLocationData = currentLocation; @@ -78,7 +80,7 @@ class LocationMgr { color: Colors.red, center: LatLong(currentLocation.latitude!, currentLocation.longitude!), displayModel: displayModel); - mapModel.markerDataStores.add(MarkerDataStore()..addMarker(iconMarker!)); + mapModel?.markerDataStores.add(MarkerDataStore()..addMarker(iconMarker!)); } } _subject.add(currentLocation); @@ -89,7 +91,8 @@ class LocationMgr { void shutdown() { _subscription?.cancel(); _subscription = null; - mapModel.markerDataStores.clear(); + mapModel?.dispose(); + mapModel = null; iconMarker = null; viewModel?.dispose(); viewModel = null; diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index 0ced7fe..0842ce8 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -1,9 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; import 'package:wien_talks_flutter/helper/go_router.dart'; void main() { - FunmapMgr().configure(); runApp(const MyApp()); } diff --git a/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart b/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart index 8134338..477e2a5 100644 --- a/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart @@ -17,7 +17,7 @@ class _MapfileWidgetState extends State { return MapviewWidget( displayModel: LocationMgr().displayModel, createMapModel: () async { - return LocationMgr().mapModel; + return LocationMgr().mapModel!; }, createViewModel: () async { return LocationMgr().viewModel!; diff --git a/wien_talks/wien_talks_flutter/lib/news_input_form.dart b/wien_talks/wien_talks_flutter/lib/news_input_form.dart index 21abde7..3e63217 100644 --- a/wien_talks/wien_talks_flutter/lib/news_input_form.dart +++ b/wien_talks/wien_talks_flutter/lib/news_input_form.dart @@ -78,6 +78,9 @@ class _NewsInputFormState extends State { ), const SizedBox(height: 16.0), ElevatedButton( + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(Theme.of(context).primaryColor), + foregroundColor: WidgetStateProperty.all(Theme.of(context).colorScheme.onPrimary)), onPressed: _submitForm, child: const Text('Submit News'), ), diff --git a/wien_talks/wien_talks_flutter/lib/widgets/error_snackbar.dart b/wien_talks/wien_talks_flutter/lib/widgets/error_snackbar.dart index 3529899..d527a95 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/error_snackbar.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/error_snackbar.dart @@ -3,7 +3,11 @@ import 'package:flutter/material.dart'; class ErrorSnackbar { void show(BuildContext context, String message) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(message, style: TextStyle(color: Theme.of(context).colorScheme.onError)), + content: Text( + message, + style: TextStyle(color: Theme.of(context).colorScheme.onError), + maxLines: 3, + ), showCloseIcon: true, duration: Duration(seconds: 30), backgroundColor: Theme.of(context).colorScheme.error, diff --git a/wien_talks/wien_talks_flutter/lib/widgets/intro_text_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/intro_text_widget.dart index 5a6bcd6..4ed73d1 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/intro_text_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/intro_text_widget.dart @@ -6,9 +6,9 @@ class IntroTextWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: Card( + return Card( + child: Padding( + padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -23,7 +23,7 @@ class IntroTextWidget extends StatelessWidget { const SizedBox(height: 20), Text( "Ever experienced something funny, weird, or just too good not to share? " - "With FunMap, you can pin your funniest moments and strange encounters right on the map! 🗺️😂", + "With FunMap, you can pin your funniest moments and strange encounters right on the map! 😂", style: GoogleFonts.roboto(fontSize: 16, height: 1.5), ), const SizedBox(height: 16), @@ -38,16 +38,16 @@ class IntroTextWidget extends StatelessWidget { "👉 Add your event, mark the spot, and let the community enjoy the laughter with you.", style: GoogleFonts.roboto( fontSize: 16, - fontWeight: FontWeight.w600, + fontStyle: FontStyle.italic, height: 1.5, ), ), const SizedBox(height: 16), Text( - "Because the world’s a lot more fun when we laugh together. 🌍✨", + "Because the world’s a lot more fun when we laugh together.", style: GoogleFonts.roboto( fontSize: 16, - fontStyle: FontStyle.italic, + fontWeight: FontWeight.w600, height: 1.5, ), ), From c64fa677ac86e05ce5a03cbc9e6f0aee77e1e75b Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 19:23:11 +0200 Subject: [PATCH 34/49] tree-wide: run `serverpod generate` Signed-off-by: Max R. Carrara --- .../lib/src/protocol/client.dart | 19 +++++++++--------- .../lib/src/generated/endpoints.dart | 19 ++++++++++-------- .../test_tools/serverpod_test_tools.dart | 20 +++++++++---------- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index a580f14..581c172 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -17,29 +17,29 @@ import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i5; import 'protocol.dart' as _i6; /// {@category Endpoint} -class EndpointQuote extends _i1.EndpointRef { - EndpointQuote(_i1.EndpointCaller caller) : super(caller); +class EndpointShowLatestNewsWidget extends _i1.EndpointRef { + EndpointShowLatestNewsWidget(_i1.EndpointCaller caller) : super(caller); @override - String get name => 'quote'; + String get name => 'showLatestNewsWidget'; _i2.Future<_i3.Quote> createQuote(_i4.CreateQuoteRequest req) => caller.callServerEndpoint<_i3.Quote>( - 'quote', + 'showLatestNewsWidget', 'createQuote', {'req': req}, ); _i2.Future updateQuote(_i3.Quote quote) => caller.callServerEndpoint( - 'quote', + 'showLatestNewsWidget', 'updateQuote', {'quote': quote}, ); _i2.Future> getAllQuotes({required int limit}) => caller.callServerEndpoint>( - 'quote', + 'showLatestNewsWidget', 'getAllQuotes', {'limit': limit}, ); @@ -79,16 +79,17 @@ class Client extends _i1.ServerpodClientShared { disconnectStreamsOnLostInternetConnection: disconnectStreamsOnLostInternetConnection, ) { - quote = EndpointQuote(this); + showLatestNewsWidget = EndpointShowLatestNewsWidget(this); modules = Modules(this); } - late final EndpointQuote quote; + late final EndpointShowLatestNewsWidget showLatestNewsWidget; late final Modules modules; @override - Map get endpointRefLookup => {'quote': quote}; + Map get endpointRefLookup => + {'showLatestNewsWidget': showLatestNewsWidget}; @override Map get moduleLookup => diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index 2054dea..438f1d1 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -20,16 +20,16 @@ class Endpoints extends _i1.EndpointDispatch { @override void initializeEndpoints(_i1.Server server) { var endpoints = { - 'quote': _i2.QuoteEndpoint() + 'showLatestNewsWidget': _i2.ShowLatestNewsWidget() ..initialize( server, - 'quote', + 'showLatestNewsWidget', null, ) }; - connectors['quote'] = _i1.EndpointConnector( - name: 'quote', - endpoint: endpoints['quote']!, + connectors['showLatestNewsWidget'] = _i1.EndpointConnector( + name: 'showLatestNewsWidget', + endpoint: endpoints['showLatestNewsWidget']!, methodConnectors: { 'createQuote': _i1.MethodConnector( name: 'createQuote', @@ -44,7 +44,8 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i2.QuoteEndpoint).createQuote( + (endpoints['showLatestNewsWidget'] as _i2.ShowLatestNewsWidget) + .createQuote( session, params['req'], ), @@ -62,7 +63,8 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i2.QuoteEndpoint).updateQuote( + (endpoints['showLatestNewsWidget'] as _i2.ShowLatestNewsWidget) + .updateQuote( session, params['quote'], ), @@ -80,7 +82,8 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i2.QuoteEndpoint).getAllQuotes( + (endpoints['showLatestNewsWidget'] as _i2.ShowLatestNewsWidget) + .getAllQuotes( session, limit: params['limit'], ), diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index 87bbd13..c5a1587 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -103,7 +103,7 @@ void withServerpod( } class TestEndpoints { - late final _QuoteEndpoint quote; + late final _ShowLatestNewsWidget showLatestNewsWidget; } class _InternalTestEndpoints extends TestEndpoints @@ -113,15 +113,15 @@ class _InternalTestEndpoints extends TestEndpoints _i2.SerializationManager serializationManager, _i2.EndpointDispatch endpoints, ) { - quote = _QuoteEndpoint( + showLatestNewsWidget = _ShowLatestNewsWidget( endpoints, serializationManager, ); } } -class _QuoteEndpoint { - _QuoteEndpoint( +class _ShowLatestNewsWidget { + _ShowLatestNewsWidget( this._endpointDispatch, this._serializationManager, ); @@ -137,13 +137,13 @@ class _QuoteEndpoint { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'quote', + endpoint: 'showLatestNewsWidget', method: 'createQuote', ); try { var _localCallContext = await _endpointDispatch.getMethodCallContext( createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'quote', + endpointPath: 'showLatestNewsWidget', methodName: 'createQuote', parameters: _i1.testObjectToJson({'req': req}), serializationManager: _serializationManager, @@ -166,13 +166,13 @@ class _QuoteEndpoint { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'quote', + endpoint: 'showLatestNewsWidget', method: 'updateQuote', ); try { var _localCallContext = await _endpointDispatch.getMethodCallContext( createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'quote', + endpointPath: 'showLatestNewsWidget', methodName: 'updateQuote', parameters: _i1.testObjectToJson({'quote': quote}), serializationManager: _serializationManager, @@ -195,13 +195,13 @@ class _QuoteEndpoint { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'quote', + endpoint: 'showLatestNewsWidget', method: 'getAllQuotes', ); try { var _localCallContext = await _endpointDispatch.getMethodCallContext( createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'quote', + endpointPath: 'showLatestNewsWidget', methodName: 'getAllQuotes', parameters: _i1.testObjectToJson({'limit': limit}), serializationManager: _serializationManager, From be2a58cbd9a640945c0b66b92c3bf3565d724e57 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 19:35:56 +0200 Subject: [PATCH 35/49] merge generated jank --- .../lib/src/protocol/client.dart | 40 ++++- .../lib/src/protocol/protocol.dart | 46 +++++- .../lib/show_latest_news_widget.dart | 112 +++++-------- .../lib/src/generated/endpoints.dart | 46 ++++-- .../lib/src/generated/protocol.dart | 148 +++++++++++++++++- .../lib/src/generated/protocol.yaml | 3 + .../lib/src/quotes/quotes_endpoint.dart | 25 ++- .../migrations/migration_registry.txt | 1 + .../test_tools/serverpod_test_tools.dart | 55 ++++--- 9 files changed, 347 insertions(+), 129 deletions(-) diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index 581c172..eed83e0 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -13,8 +13,10 @@ import 'package:serverpod_client/serverpod_client.dart' as _i1; import 'dart:async' as _i2; import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i3; import 'package:wien_talks_client/src/protocol/quotes/create_quote.dart' as _i4; -import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i5; -import 'protocol.dart' as _i6; +import 'package:wien_talks_client/src/protocol/votes/vote.dart' as _i5; +import 'package:wien_talks_client/src/protocol/votes/vote_request.dart' as _i6; +import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i7; +import 'protocol.dart' as _i8; /// {@category Endpoint} class EndpointShowLatestNewsWidget extends _i1.EndpointRef { @@ -37,20 +39,42 @@ class EndpointShowLatestNewsWidget extends _i1.EndpointRef { {'quote': quote}, ); - _i2.Future> getAllQuotes({required int limit}) => + _i2.Future> getAllQuotes() => caller.callServerEndpoint>( 'showLatestNewsWidget', 'getAllQuotes', - {'limit': limit}, + {}, + ); +} + +/// {@category Endpoint} +class EndpointVotes extends _i1.EndpointRef { + EndpointVotes(_i1.EndpointCaller caller) : super(caller); + + @override + String get name => 'votes'; + + _i2.Future<_i5.Vote> postVote(_i6.VoteRequest voteRequest) => + caller.callServerEndpoint<_i5.Vote>( + 'votes', + 'postVote', + {'voteRequest': voteRequest}, + ); + + _i2.Future> getAllVotes() => + caller.callServerEndpoint>( + 'votes', + 'getAllVotes', + {}, ); } class Modules { Modules(Client client) { - auth = _i5.Caller(client); + auth = _i7.Caller(client); } - late final _i5.Caller auth; + late final _i7.Caller auth; } class Client extends _i1.ServerpodClientShared { @@ -69,7 +93,7 @@ class Client extends _i1.ServerpodClientShared { bool? disconnectStreamsOnLostInternetConnection, }) : super( host, - _i6.Protocol(), + _i8.Protocol(), securityContext: securityContext, authenticationKeyManager: authenticationKeyManager, streamingConnectionTimeout: streamingConnectionTimeout, @@ -85,6 +109,8 @@ class Client extends _i1.ServerpodClientShared { late final EndpointShowLatestNewsWidget showLatestNewsWidget; + late final EndpointVotes votes; + late final Modules modules; @override diff --git a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart index 9af404c..b709655 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart @@ -12,10 +12,15 @@ import 'package:serverpod_client/serverpod_client.dart' as _i1; import 'quotes/create_quote.dart' as _i2; import 'quotes/quote.dart' as _i3; -import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i4; -import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i5; +import 'votes/vote.dart' as _i4; +import 'votes/vote_request.dart' as _i5; +import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i6; +import 'package:wien_talks_client/src/protocol/votes/vote.dart' as _i7; +import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i8; export 'quotes/create_quote.dart'; export 'quotes/quote.dart'; +export 'votes/vote.dart'; +export 'votes/vote_request.dart'; export 'client.dart'; class Protocol extends _i1.SerializationManager { @@ -37,12 +42,24 @@ class Protocol extends _i1.SerializationManager { if (t == _i3.Quote) { return _i3.Quote.fromJson(data) as T; } + if (t == _i4.Vote) { + return _i4.Vote.fromJson(data) as T; + } + if (t == _i5.VoteRequest) { + return _i5.VoteRequest.fromJson(data) as T; + } if (t == _i1.getType<_i2.CreateQuoteRequest?>()) { return (data != null ? _i2.CreateQuoteRequest.fromJson(data) : null) as T; } if (t == _i1.getType<_i3.Quote?>()) { return (data != null ? _i3.Quote.fromJson(data) : null) as T; } + if (t == _i1.getType<_i4.Vote?>()) { + return (data != null ? _i4.Vote.fromJson(data) : null) as T; + } + if (t == _i1.getType<_i5.VoteRequest?>()) { + return (data != null ? _i5.VoteRequest.fromJson(data) : null) as T; + } if (t == _i1.getType?>()) { return (data != null ? (data as List).map((e) => deserialize(e)).toList() @@ -53,11 +70,14 @@ class Protocol extends _i1.SerializationManager { ? (data as List).map((e) => deserialize(e)).toList() : null) as T; } - if (t == List<_i4.Quote>) { - return (data as List).map((e) => deserialize<_i4.Quote>(e)).toList() as T; + if (t == List<_i6.Quote>) { + return (data as List).map((e) => deserialize<_i6.Quote>(e)).toList() as T; + } + if (t == List<_i7.Vote>) { + return (data as List).map((e) => deserialize<_i7.Vote>(e)).toList() as T; } try { - return _i5.Protocol().deserialize(data, t); + return _i8.Protocol().deserialize(data, t); } on _i1.DeserializationTypeNotFoundException catch (_) {} return super.deserialize(data, t); } @@ -72,7 +92,13 @@ class Protocol extends _i1.SerializationManager { if (data is _i3.Quote) { return 'Quote'; } - className = _i5.Protocol().getClassNameForObject(data); + if (data is _i4.Vote) { + return 'Vote'; + } + if (data is _i5.VoteRequest) { + return 'VoteRequest'; + } + className = _i8.Protocol().getClassNameForObject(data); if (className != null) { return 'serverpod_auth.$className'; } @@ -91,9 +117,15 @@ class Protocol extends _i1.SerializationManager { if (dataClassName == 'Quote') { return deserialize<_i3.Quote>(data['data']); } + if (dataClassName == 'Vote') { + return deserialize<_i4.Vote>(data['data']); + } + if (dataClassName == 'VoteRequest') { + return deserialize<_i5.VoteRequest>(data['data']); + } if (dataClassName.startsWith('serverpod_auth.')) { data['className'] = dataClassName.substring(15); - return _i5.Protocol().deserializeByClassName(data); + return _i8.Protocol().deserializeByClassName(data); } return super.deserializeByClassName(data); } diff --git a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart index 4dcf12b..9938649 100644 --- a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart @@ -4,84 +4,54 @@ import 'package:flutter/material.dart'; import 'package:wien_talks_client/wien_talks_client.dart'; import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; -class ShowLatestNewsWidget extends StatefulWidget { +class ShowLatestNewsWidget extends StatelessWidget { const ShowLatestNewsWidget({super.key}); - @override - State createState() => _ShowLatestNewsWidgetState(); -} -class _ShowLatestNewsWidgetState extends State { - final _controller = StreamController>.broadcast(); - Timer? _timer; - - @override - void initState() { - super.initState(); - _reload(); - _timer = Timer.periodic(const Duration(seconds: 30), (_) => _reload()); - } - - Future _reload() async { - try { - final quotes = await FunmapMgr().client.quote.getAllQuotes(limit: 200); - _controller.add(quotes); - } catch (e, st) { - _controller.addError(e, st); - } - } - - @override - void dispose() { - _timer?.cancel(); - _controller.close(); - super.dispose(); + Future> _load() async { + final list = await FunmapMgr().client.quote.getAllQuotes(); + return list.whereType().toList(growable: false); } @override Widget build(BuildContext context) { - return RefreshIndicator( - onRefresh: _reload, - child: StreamBuilder>( - stream: _controller.stream, - initialData: const [], - builder: (context, snap) { - if (snap.hasError) { - return ListView( - children: [ - Padding( - padding: const EdgeInsets.all(16), - child: Text('Error: ${snap.error}'), - ), - ], - ); - } - final quotes = snap.data ?? const []; - if (quotes.isEmpty) { - return ListView( - children: const [ - Padding( - padding: EdgeInsets.all(16), - child: Text('No quotes yet. Pull to refresh.'), - ), - ], - ); - } - return ListView.separated( - itemCount: quotes.length, - separatorBuilder: (_, __) => const Divider(height: 1), - itemBuilder: (context, i) { - final q = quotes[i]; - return ListTile( - title: Text(q.text), - subtitle: Text([ - if ((q.authorName ?? '').isNotEmpty) q.authorName!, - q.createdAt.toLocal().toString(), - ].where((e) => e.isNotEmpty).join(' · ')), - ); - }, + return FutureBuilder>( + future: _load(), + builder: (context, snap) { + if (snap.connectionState != ConnectionState.done) { + return const Center(child: CircularProgressIndicator()); + } + if (snap.hasError) { + return Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text('Error: ${snap.error}'), + ), ); - }, - ), + } + final quotes = snap.data ?? const []; + if (quotes.isEmpty) { + return const Center(child: Text('No quotes yet.')); + } + + return ListView.separated( + itemCount: quotes.length, + separatorBuilder: (_, __) => const Divider(height: 1), + itemBuilder: (context, i) { + final q = quotes[i]; + final author = (q.authorName ?? '').trim(); + final when = (q.createdAt ?? DateTime.fromMillisecondsSinceEpoch(0)) + .toLocal() + .toString(); + return ListTile( + title: Text(q.text), + subtitle: Text([ + if (author.isNotEmpty) author, + when, + ].join(' · ')), + ); + }, + ); + }, ); } } diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index 438f1d1..187dc65 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -11,10 +11,12 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; import '../quotes/quotes_endpoint.dart' as _i2; +import '../votes/votes_endpoint.dart' as _i3; import 'package:wien_talks_server/src/generated/quotes/create_quote.dart' - as _i3; -import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i4; -import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i5; + as _i4; +import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i5; +import 'package:wien_talks_server/src/generated/votes/vote_request.dart' as _i6; +import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i7; class Endpoints extends _i1.EndpointDispatch { @override @@ -36,7 +38,7 @@ class Endpoints extends _i1.EndpointDispatch { params: { 'req': _i1.ParameterDescription( name: 'req', - type: _i1.getType<_i3.CreateQuoteRequest>(), + type: _i1.getType<_i4.CreateQuoteRequest>(), nullable: false, ) }, @@ -55,7 +57,7 @@ class Endpoints extends _i1.EndpointDispatch { params: { 'quote': _i1.ParameterDescription( name: 'quote', - type: _i1.getType<_i4.Quote>(), + type: _i1.getType<_i5.Quote>(), nullable: false, ) }, @@ -71,10 +73,25 @@ class Endpoints extends _i1.EndpointDispatch { ), 'getAllQuotes': _i1.MethodConnector( name: 'getAllQuotes', + params: {}, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['quote'] as _i2.QuoteEndpoint).getAllQuotes(session), + ), + }, + ); + connectors['votes'] = _i1.EndpointConnector( + name: 'votes', + endpoint: endpoints['votes']!, + methodConnectors: { + 'postVote': _i1.MethodConnector( + name: 'postVote', params: { - 'limit': _i1.ParameterDescription( - name: 'limit', - type: _i1.getType(), + 'voteRequest': _i1.ParameterDescription( + name: 'voteRequest', + type: _i1.getType<_i6.VoteRequest>(), nullable: false, ) }, @@ -85,11 +102,20 @@ class Endpoints extends _i1.EndpointDispatch { (endpoints['showLatestNewsWidget'] as _i2.ShowLatestNewsWidget) .getAllQuotes( session, - limit: params['limit'], + params['voteRequest'], ), ), + 'getAllVotes': _i1.MethodConnector( + name: 'getAllVotes', + params: {}, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['votes'] as _i3.VotesEndpoint).getAllVotes(session), + ), }, ); - modules['serverpod_auth'] = _i5.Endpoints()..initializeEndpoints(server); + modules['serverpod_auth'] = _i7.Endpoints()..initializeEndpoints(server); } } diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart index 681724b..b3ad4db 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart @@ -14,9 +14,14 @@ import 'package:serverpod/protocol.dart' as _i2; import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i3; import 'quotes/create_quote.dart' as _i4; import 'quotes/quote.dart' as _i5; -import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i6; +import 'votes/vote.dart' as _i6; +import 'votes/vote_request.dart' as _i7; +import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i8; +import 'package:wien_talks_server/src/generated/votes/vote.dart' as _i9; export 'quotes/create_quote.dart'; export 'quotes/quote.dart'; +export 'votes/vote.dart'; +export 'votes/vote_request.dart'; class Protocol extends _i1.SerializationManagerServer { Protocol._(); @@ -118,6 +123,112 @@ class Protocol extends _i1.SerializationManagerServer { ], managed: true, ), + _i2.TableDefinition( + name: 'vote', + dartName: 'Vote', + schema: 'public', + module: 'wien_talks', + columns: [ + _i2.ColumnDefinition( + name: 'id', + columnType: _i2.ColumnType.bigint, + isNullable: false, + dartType: 'int?', + columnDefault: 'nextval(\'vote_id_seq\'::regclass)', + ), + _i2.ColumnDefinition( + name: 'userId', + columnType: _i2.ColumnType.bigint, + isNullable: false, + dartType: 'int', + ), + _i2.ColumnDefinition( + name: 'createdAt', + columnType: _i2.ColumnType.timestampWithoutTimeZone, + isNullable: false, + dartType: 'DateTime', + ), + _i2.ColumnDefinition( + name: 'quote', + columnType: _i2.ColumnType.json, + isNullable: false, + dartType: 'protocol:Quote', + ), + _i2.ColumnDefinition( + name: 'upvote', + columnType: _i2.ColumnType.boolean, + isNullable: false, + dartType: 'bool', + ), + ], + foreignKeys: [], + indexes: [ + _i2.IndexDefinition( + indexName: 'vote_pkey', + tableSpace: null, + elements: [ + _i2.IndexElementDefinition( + type: _i2.IndexElementDefinitionType.column, + definition: 'id', + ) + ], + type: 'btree', + isUnique: true, + isPrimary: true, + ) + ], + managed: true, + ), + _i2.TableDefinition( + name: 'vote_request', + dartName: 'VoteRequest', + schema: 'public', + module: 'wien_talks', + columns: [ + _i2.ColumnDefinition( + name: 'id', + columnType: _i2.ColumnType.bigint, + isNullable: false, + dartType: 'int?', + columnDefault: 'nextval(\'vote_request_id_seq\'::regclass)', + ), + _i2.ColumnDefinition( + name: 'userId', + columnType: _i2.ColumnType.bigint, + isNullable: false, + dartType: 'int', + ), + _i2.ColumnDefinition( + name: 'quote', + columnType: _i2.ColumnType.json, + isNullable: false, + dartType: 'protocol:Quote', + ), + _i2.ColumnDefinition( + name: 'upvote', + columnType: _i2.ColumnType.boolean, + isNullable: false, + dartType: 'bool', + ), + ], + foreignKeys: [], + indexes: [ + _i2.IndexDefinition( + indexName: 'vote_request_pkey', + tableSpace: null, + elements: [ + _i2.IndexElementDefinition( + type: _i2.IndexElementDefinitionType.column, + definition: 'id', + ) + ], + type: 'btree', + isUnique: true, + isPrimary: true, + ) + ], + managed: true, + ), ..._i3.Protocol.targetTableDefinitions, ..._i2.Protocol.targetTableDefinitions, ]; @@ -134,12 +245,24 @@ class Protocol extends _i1.SerializationManagerServer { if (t == _i5.Quote) { return _i5.Quote.fromJson(data) as T; } + if (t == _i6.Vote) { + return _i6.Vote.fromJson(data) as T; + } + if (t == _i7.VoteRequest) { + return _i7.VoteRequest.fromJson(data) as T; + } if (t == _i1.getType<_i4.CreateQuoteRequest?>()) { return (data != null ? _i4.CreateQuoteRequest.fromJson(data) : null) as T; } if (t == _i1.getType<_i5.Quote?>()) { return (data != null ? _i5.Quote.fromJson(data) : null) as T; } + if (t == _i1.getType<_i6.Vote?>()) { + return (data != null ? _i6.Vote.fromJson(data) : null) as T; + } + if (t == _i1.getType<_i7.VoteRequest?>()) { + return (data != null ? _i7.VoteRequest.fromJson(data) : null) as T; + } if (t == _i1.getType?>()) { return (data != null ? (data as List).map((e) => deserialize(e)).toList() @@ -150,8 +273,11 @@ class Protocol extends _i1.SerializationManagerServer { ? (data as List).map((e) => deserialize(e)).toList() : null) as T; } - if (t == List<_i6.Quote>) { - return (data as List).map((e) => deserialize<_i6.Quote>(e)).toList() as T; + if (t == List<_i8.Quote>) { + return (data as List).map((e) => deserialize<_i8.Quote>(e)).toList() as T; + } + if (t == List<_i9.Vote>) { + return (data as List).map((e) => deserialize<_i9.Vote>(e)).toList() as T; } try { return _i3.Protocol().deserialize(data, t); @@ -172,6 +298,12 @@ class Protocol extends _i1.SerializationManagerServer { if (data is _i5.Quote) { return 'Quote'; } + if (data is _i6.Vote) { + return 'Vote'; + } + if (data is _i7.VoteRequest) { + return 'VoteRequest'; + } className = _i2.Protocol().getClassNameForObject(data); if (className != null) { return 'serverpod.$className'; @@ -195,6 +327,12 @@ class Protocol extends _i1.SerializationManagerServer { if (dataClassName == 'Quote') { return deserialize<_i5.Quote>(data['data']); } + if (dataClassName == 'Vote') { + return deserialize<_i6.Vote>(data['data']); + } + if (dataClassName == 'VoteRequest') { + return deserialize<_i7.VoteRequest>(data['data']); + } if (dataClassName.startsWith('serverpod.')) { data['className'] = dataClassName.substring(10); return _i2.Protocol().deserializeByClassName(data); @@ -223,6 +361,10 @@ class Protocol extends _i1.SerializationManagerServer { switch (t) { case _i5.Quote: return _i5.Quote.t; + case _i6.Vote: + return _i6.Vote.t; + case _i7.VoteRequest: + return _i7.VoteRequest.t; } return null; } diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml index c4c3b61..4628fc9 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml @@ -2,3 +2,6 @@ quote: - createQuote: - updateQuote: - getAllQuotes: +votes: + - postVote: + - getAllVotes: diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart index 2da2850..f242d1c 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -1,11 +1,11 @@ -// lib/src/endpoints/quote_endpoint.dart import 'dart:async'; +import 'dart:math'; import 'package:serverpod/serverpod.dart'; import 'package:wien_talks_server/src/generated/protocol.dart'; import 'package:wien_talks_server/src/quotes/quote_util.dart'; -class ShowLatestNewsWidget extends Endpoint { +class QuoteEndpoint extends Endpoint { static const _channelQuoteUpdates = 'quote-updates'; Future createQuote(Session session, CreateQuoteRequest req) async { @@ -15,8 +15,7 @@ class ShowLatestNewsWidget extends Endpoint { final text = validateQuote(req); final toInsert = Quote( - id: 0, - userId: userId ?? 12, + userId: userId ?? Random().nextInt(1200), text: text, authorName: req.authorName, lat: req.lat, @@ -37,8 +36,22 @@ class ShowLatestNewsWidget extends Endpoint { await session.messages.postMessage(_channelQuoteUpdates, quote); } - Future> getAllQuotes(Session session, {int limit = 200}) async { - final quoteList = await Quote.db.find(session); + Future> getAllQuotes( + Session session, + ) async { + session.log('$session'); + + final quoteList = await Quote.db.find( + session, + // where: (t) => t.visibility.equals(0), + // orderBy: (t) => t.createdAt, + // orderDescending: true, + ); + + for (var element in quoteList) { + session.log(element.text); + } + return quoteList; } diff --git a/wien_talks/wien_talks_server/migrations/migration_registry.txt b/wien_talks/wien_talks_server/migrations/migration_registry.txt index 26980aa..106c539 100644 --- a/wien_talks/wien_talks_server/migrations/migration_registry.txt +++ b/wien_talks/wien_talks_server/migrations/migration_registry.txt @@ -6,3 +6,4 @@ 20250816095813247 20250816122625449 +20250816171653001 diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index c5a1587..58e233c 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -17,6 +17,8 @@ import 'dart:async' as _i3; import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i4; import 'package:wien_talks_server/src/generated/quotes/create_quote.dart' as _i5; +import 'package:wien_talks_server/src/generated/votes/vote.dart' as _i6; +import 'package:wien_talks_server/src/generated/votes/vote_request.dart' as _i7; import 'package:wien_talks_server/src/generated/protocol.dart'; import 'package:wien_talks_server/src/generated/endpoints.dart'; export 'package:serverpod_test/serverpod_test_public_exports.dart'; @@ -121,10 +123,7 @@ class _InternalTestEndpoints extends TestEndpoints } class _ShowLatestNewsWidget { - _ShowLatestNewsWidget( - this._endpointDispatch, - this._serializationManager, - ); + _ShowLatestNewsWidget(this._endpointDispatch, this._serializationManager); final _i2.EndpointDispatch _endpointDispatch; @@ -137,9 +136,9 @@ class _ShowLatestNewsWidget { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'showLatestNewsWidget', - method: 'createQuote', - ); + endpoint: 'showLatestNewsWidget', + method: 'createQuote', + ); try { var _localCallContext = await _endpointDispatch.getMethodCallContext( createSessionCallback: (_) => _localUniqueSession, @@ -148,10 +147,12 @@ class _ShowLatestNewsWidget { parameters: _i1.testObjectToJson({'req': req}), serializationManager: _serializationManager, ); - var _localReturnValue = await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) as _i3.Future<_i4.Quote>); + var _localReturnValue = + await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) + as _i3.Future<_i4.Quote>); return _localReturnValue; } finally { await _localUniqueSession.close(); @@ -166,9 +167,9 @@ class _ShowLatestNewsWidget { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'showLatestNewsWidget', - method: 'updateQuote', - ); + endpoint: 'showLatestNewsWidget', + method: 'updateQuote', + ); try { var _localCallContext = await _endpointDispatch.getMethodCallContext( createSessionCallback: (_) => _localUniqueSession, @@ -177,10 +178,12 @@ class _ShowLatestNewsWidget { parameters: _i1.testObjectToJson({'quote': quote}), serializationManager: _serializationManager, ); - var _localReturnValue = await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) as _i3.Future); + var _localReturnValue = + await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) + as _i3.Future); return _localReturnValue; } finally { await _localUniqueSession.close(); @@ -195,9 +198,9 @@ class _ShowLatestNewsWidget { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'showLatestNewsWidget', - method: 'getAllQuotes', - ); + endpoint: 'showLatestNewsWidget', + method: 'getAllQuotes', + ); try { var _localCallContext = await _endpointDispatch.getMethodCallContext( createSessionCallback: (_) => _localUniqueSession, @@ -206,10 +209,12 @@ class _ShowLatestNewsWidget { parameters: _i1.testObjectToJson({'limit': limit}), serializationManager: _serializationManager, ); - var _localReturnValue = await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) as _i3.Future>); + var _localReturnValue = + await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) + as _i3.Future>); return _localReturnValue; } finally { await _localUniqueSession.close(); From 83f773abe1caa026614bf49c24dc5be735c800ce Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 19:37:06 +0200 Subject: [PATCH 36/49] regenerate endpoint source --- .../lib/src/protocol/client.dart | 23 +- .../lib/src/protocol/votes/vote.dart | 120 ++ .../lib/src/protocol/votes/vote_request.dart | 108 + .../lib/src/generated/endpoints.dart | 27 +- .../lib/src/generated/votes/vote.dart | 441 ++++ .../lib/src/generated/votes/vote_request.dart | 422 ++++ .../lib/src/votes/vote.spy.yaml | 7 + .../lib/src/votes/vote_request.spy.yaml | 6 + .../lib/src/votes/votes_endpoint.dart | 21 + .../20250816171653001/definition.json | 1800 +++++++++++++++++ .../20250816171653001/definition.sql | 394 ++++ .../20250816171653001/definition_project.json | 107 + .../20250816171653001/migration.json | 5 + .../20250816171653001/migration.sql | 29 + .../test_tools/serverpod_test_tools.dart | 144 +- 15 files changed, 3594 insertions(+), 60 deletions(-) create mode 100644 wien_talks/wien_talks_client/lib/src/protocol/votes/vote.dart create mode 100644 wien_talks/wien_talks_client/lib/src/protocol/votes/vote_request.dart create mode 100644 wien_talks/wien_talks_server/lib/src/generated/votes/vote.dart create mode 100644 wien_talks/wien_talks_server/lib/src/generated/votes/vote_request.dart create mode 100644 wien_talks/wien_talks_server/lib/src/votes/vote.spy.yaml create mode 100644 wien_talks/wien_talks_server/lib/src/votes/vote_request.spy.yaml create mode 100644 wien_talks/wien_talks_server/lib/src/votes/votes_endpoint.dart create mode 100644 wien_talks/wien_talks_server/migrations/20250816171653001/definition.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816171653001/definition.sql create mode 100644 wien_talks/wien_talks_server/migrations/20250816171653001/definition_project.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816171653001/migration.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816171653001/migration.sql diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index eed83e0..dcae10e 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -19,29 +19,29 @@ import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i7; import 'protocol.dart' as _i8; /// {@category Endpoint} -class EndpointShowLatestNewsWidget extends _i1.EndpointRef { - EndpointShowLatestNewsWidget(_i1.EndpointCaller caller) : super(caller); +class EndpointQuote extends _i1.EndpointRef { + EndpointQuote(_i1.EndpointCaller caller) : super(caller); @override - String get name => 'showLatestNewsWidget'; + String get name => 'quote'; _i2.Future<_i3.Quote> createQuote(_i4.CreateQuoteRequest req) => caller.callServerEndpoint<_i3.Quote>( - 'showLatestNewsWidget', + 'quote', 'createQuote', {'req': req}, ); _i2.Future updateQuote(_i3.Quote quote) => caller.callServerEndpoint( - 'showLatestNewsWidget', + 'quote', 'updateQuote', {'quote': quote}, ); _i2.Future> getAllQuotes() => caller.callServerEndpoint>( - 'showLatestNewsWidget', + 'quote', 'getAllQuotes', {}, ); @@ -103,19 +103,22 @@ class Client extends _i1.ServerpodClientShared { disconnectStreamsOnLostInternetConnection: disconnectStreamsOnLostInternetConnection, ) { - showLatestNewsWidget = EndpointShowLatestNewsWidget(this); + quote = EndpointQuote(this); + votes = EndpointVotes(this); modules = Modules(this); } - late final EndpointShowLatestNewsWidget showLatestNewsWidget; + late final EndpointQuote quote; late final EndpointVotes votes; late final Modules modules; @override - Map get endpointRefLookup => - {'showLatestNewsWidget': showLatestNewsWidget}; + Map get endpointRefLookup => { + 'quote': quote, + 'votes': votes, + }; @override Map get moduleLookup => diff --git a/wien_talks/wien_talks_client/lib/src/protocol/votes/vote.dart b/wien_talks/wien_talks_client/lib/src/protocol/votes/vote.dart new file mode 100644 index 0000000..5e969f1 --- /dev/null +++ b/wien_talks/wien_talks_client/lib/src/protocol/votes/vote.dart @@ -0,0 +1,120 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod_client/serverpod_client.dart' as _i1; +import '../quotes/quote.dart' as _i2; + +abstract class Vote implements _i1.SerializableModel { + Vote._({ + this.id, + required this.userId, + required this.createdAt, + required this.quote, + required this.upvote, + }); + + factory Vote({ + int? id, + required int userId, + required DateTime createdAt, + required _i2.Quote quote, + required bool upvote, + }) = _VoteImpl; + + factory Vote.fromJson(Map jsonSerialization) { + return Vote( + id: jsonSerialization['id'] as int?, + userId: jsonSerialization['userId'] as int, + createdAt: + _i1.DateTimeJsonExtension.fromJson(jsonSerialization['createdAt']), + quote: _i2.Quote.fromJson( + (jsonSerialization['quote'] as Map)), + upvote: jsonSerialization['upvote'] as bool, + ); + } + + /// The database id, set if the object has been inserted into the + /// database or if it has been fetched from the database. Otherwise, + /// the id will be null. + int? id; + + int userId; + + DateTime createdAt; + + _i2.Quote quote; + + bool upvote; + + /// Returns a shallow copy of this [Vote] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + Vote copyWith({ + int? id, + int? userId, + DateTime? createdAt, + _i2.Quote? quote, + bool? upvote, + }); + @override + Map toJson() { + return { + if (id != null) 'id': id, + 'userId': userId, + 'createdAt': createdAt.toJson(), + 'quote': quote.toJson(), + 'upvote': upvote, + }; + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _Undefined {} + +class _VoteImpl extends Vote { + _VoteImpl({ + int? id, + required int userId, + required DateTime createdAt, + required _i2.Quote quote, + required bool upvote, + }) : super._( + id: id, + userId: userId, + createdAt: createdAt, + quote: quote, + upvote: upvote, + ); + + /// Returns a shallow copy of this [Vote] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + Vote copyWith({ + Object? id = _Undefined, + int? userId, + DateTime? createdAt, + _i2.Quote? quote, + bool? upvote, + }) { + return Vote( + id: id is int? ? id : this.id, + userId: userId ?? this.userId, + createdAt: createdAt ?? this.createdAt, + quote: quote ?? this.quote.copyWith(), + upvote: upvote ?? this.upvote, + ); + } +} diff --git a/wien_talks/wien_talks_client/lib/src/protocol/votes/vote_request.dart b/wien_talks/wien_talks_client/lib/src/protocol/votes/vote_request.dart new file mode 100644 index 0000000..baf48e9 --- /dev/null +++ b/wien_talks/wien_talks_client/lib/src/protocol/votes/vote_request.dart @@ -0,0 +1,108 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod_client/serverpod_client.dart' as _i1; +import '../quotes/quote.dart' as _i2; + +abstract class VoteRequest implements _i1.SerializableModel { + VoteRequest._({ + this.id, + required this.userId, + required this.quote, + required this.upvote, + }); + + factory VoteRequest({ + int? id, + required int userId, + required _i2.Quote quote, + required bool upvote, + }) = _VoteRequestImpl; + + factory VoteRequest.fromJson(Map jsonSerialization) { + return VoteRequest( + id: jsonSerialization['id'] as int?, + userId: jsonSerialization['userId'] as int, + quote: _i2.Quote.fromJson( + (jsonSerialization['quote'] as Map)), + upvote: jsonSerialization['upvote'] as bool, + ); + } + + /// The database id, set if the object has been inserted into the + /// database or if it has been fetched from the database. Otherwise, + /// the id will be null. + int? id; + + int userId; + + _i2.Quote quote; + + bool upvote; + + /// Returns a shallow copy of this [VoteRequest] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + VoteRequest copyWith({ + int? id, + int? userId, + _i2.Quote? quote, + bool? upvote, + }); + @override + Map toJson() { + return { + if (id != null) 'id': id, + 'userId': userId, + 'quote': quote.toJson(), + 'upvote': upvote, + }; + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _Undefined {} + +class _VoteRequestImpl extends VoteRequest { + _VoteRequestImpl({ + int? id, + required int userId, + required _i2.Quote quote, + required bool upvote, + }) : super._( + id: id, + userId: userId, + quote: quote, + upvote: upvote, + ); + + /// Returns a shallow copy of this [VoteRequest] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + VoteRequest copyWith({ + Object? id = _Undefined, + int? userId, + _i2.Quote? quote, + bool? upvote, + }) { + return VoteRequest( + id: id is int? ? id : this.id, + userId: userId ?? this.userId, + quote: quote ?? this.quote.copyWith(), + upvote: upvote ?? this.upvote, + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index 187dc65..c6cdd86 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -22,16 +22,22 @@ class Endpoints extends _i1.EndpointDispatch { @override void initializeEndpoints(_i1.Server server) { var endpoints = { - 'showLatestNewsWidget': _i2.ShowLatestNewsWidget() + 'quote': _i2.QuoteEndpoint() ..initialize( server, - 'showLatestNewsWidget', + 'quote', null, - ) + ), + 'votes': _i3.VotesEndpoint() + ..initialize( + server, + 'votes', + null, + ), }; - connectors['showLatestNewsWidget'] = _i1.EndpointConnector( - name: 'showLatestNewsWidget', - endpoint: endpoints['showLatestNewsWidget']!, + connectors['quote'] = _i1.EndpointConnector( + name: 'quote', + endpoint: endpoints['quote']!, methodConnectors: { 'createQuote': _i1.MethodConnector( name: 'createQuote', @@ -46,8 +52,7 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['showLatestNewsWidget'] as _i2.ShowLatestNewsWidget) - .createQuote( + (endpoints['quote'] as _i2.QuoteEndpoint).createQuote( session, params['req'], ), @@ -65,8 +70,7 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['showLatestNewsWidget'] as _i2.ShowLatestNewsWidget) - .updateQuote( + (endpoints['quote'] as _i2.QuoteEndpoint).updateQuote( session, params['quote'], ), @@ -99,8 +103,7 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['showLatestNewsWidget'] as _i2.ShowLatestNewsWidget) - .getAllQuotes( + (endpoints['votes'] as _i3.VotesEndpoint).postVote( session, params['voteRequest'], ), diff --git a/wien_talks/wien_talks_server/lib/src/generated/votes/vote.dart b/wien_talks/wien_talks_server/lib/src/generated/votes/vote.dart new file mode 100644 index 0000000..a150695 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/generated/votes/vote.dart @@ -0,0 +1,441 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod/serverpod.dart' as _i1; +import '../quotes/quote.dart' as _i2; + +abstract class Vote implements _i1.TableRow, _i1.ProtocolSerialization { + Vote._({ + this.id, + required this.userId, + required this.createdAt, + required this.quote, + required this.upvote, + }); + + factory Vote({ + int? id, + required int userId, + required DateTime createdAt, + required _i2.Quote quote, + required bool upvote, + }) = _VoteImpl; + + factory Vote.fromJson(Map jsonSerialization) { + return Vote( + id: jsonSerialization['id'] as int?, + userId: jsonSerialization['userId'] as int, + createdAt: + _i1.DateTimeJsonExtension.fromJson(jsonSerialization['createdAt']), + quote: _i2.Quote.fromJson( + (jsonSerialization['quote'] as Map)), + upvote: jsonSerialization['upvote'] as bool, + ); + } + + static final t = VoteTable(); + + static const db = VoteRepository._(); + + @override + int? id; + + int userId; + + DateTime createdAt; + + _i2.Quote quote; + + bool upvote; + + @override + _i1.Table get table => t; + + /// Returns a shallow copy of this [Vote] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + Vote copyWith({ + int? id, + int? userId, + DateTime? createdAt, + _i2.Quote? quote, + bool? upvote, + }); + @override + Map toJson() { + return { + if (id != null) 'id': id, + 'userId': userId, + 'createdAt': createdAt.toJson(), + 'quote': quote.toJson(), + 'upvote': upvote, + }; + } + + @override + Map toJsonForProtocol() { + return { + if (id != null) 'id': id, + 'userId': userId, + 'createdAt': createdAt.toJson(), + 'quote': quote.toJsonForProtocol(), + 'upvote': upvote, + }; + } + + static VoteInclude include() { + return VoteInclude._(); + } + + static VoteIncludeList includeList({ + _i1.WhereExpressionBuilder? where, + int? limit, + int? offset, + _i1.OrderByBuilder? orderBy, + bool orderDescending = false, + _i1.OrderByListBuilder? orderByList, + VoteInclude? include, + }) { + return VoteIncludeList._( + where: where, + limit: limit, + offset: offset, + orderBy: orderBy?.call(Vote.t), + orderDescending: orderDescending, + orderByList: orderByList?.call(Vote.t), + include: include, + ); + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _Undefined {} + +class _VoteImpl extends Vote { + _VoteImpl({ + int? id, + required int userId, + required DateTime createdAt, + required _i2.Quote quote, + required bool upvote, + }) : super._( + id: id, + userId: userId, + createdAt: createdAt, + quote: quote, + upvote: upvote, + ); + + /// Returns a shallow copy of this [Vote] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + Vote copyWith({ + Object? id = _Undefined, + int? userId, + DateTime? createdAt, + _i2.Quote? quote, + bool? upvote, + }) { + return Vote( + id: id is int? ? id : this.id, + userId: userId ?? this.userId, + createdAt: createdAt ?? this.createdAt, + quote: quote ?? this.quote.copyWith(), + upvote: upvote ?? this.upvote, + ); + } +} + +class VoteTable extends _i1.Table { + VoteTable({super.tableRelation}) : super(tableName: 'vote') { + userId = _i1.ColumnInt( + 'userId', + this, + ); + createdAt = _i1.ColumnDateTime( + 'createdAt', + this, + ); + quote = _i1.ColumnSerializable( + 'quote', + this, + ); + upvote = _i1.ColumnBool( + 'upvote', + this, + ); + } + + late final _i1.ColumnInt userId; + + late final _i1.ColumnDateTime createdAt; + + late final _i1.ColumnSerializable quote; + + late final _i1.ColumnBool upvote; + + @override + List<_i1.Column> get columns => [ + id, + userId, + createdAt, + quote, + upvote, + ]; +} + +class VoteInclude extends _i1.IncludeObject { + VoteInclude._(); + + @override + Map get includes => {}; + + @override + _i1.Table get table => Vote.t; +} + +class VoteIncludeList extends _i1.IncludeList { + VoteIncludeList._({ + _i1.WhereExpressionBuilder? where, + super.limit, + super.offset, + super.orderBy, + super.orderDescending, + super.orderByList, + super.include, + }) { + super.where = where?.call(Vote.t); + } + + @override + Map get includes => include?.includes ?? {}; + + @override + _i1.Table get table => Vote.t; +} + +class VoteRepository { + const VoteRepository._(); + + /// Returns a list of [Vote]s matching the given query parameters. + /// + /// Use [where] to specify which items to include in the return value. + /// If none is specified, all items will be returned. + /// + /// To specify the order of the items use [orderBy] or [orderByList] + /// when sorting by multiple columns. + /// + /// The maximum number of items can be set by [limit]. If no limit is set, + /// all items matching the query will be returned. + /// + /// [offset] defines how many items to skip, after which [limit] (or all) + /// items are read from the database. + /// + /// ```dart + /// var persons = await Persons.db.find( + /// session, + /// where: (t) => t.lastName.equals('Jones'), + /// orderBy: (t) => t.firstName, + /// limit: 100, + /// ); + /// ``` + Future> find( + _i1.Session session, { + _i1.WhereExpressionBuilder? where, + int? limit, + int? offset, + _i1.OrderByBuilder? orderBy, + bool orderDescending = false, + _i1.OrderByListBuilder? orderByList, + _i1.Transaction? transaction, + }) async { + return session.db.find( + where: where?.call(Vote.t), + orderBy: orderBy?.call(Vote.t), + orderByList: orderByList?.call(Vote.t), + orderDescending: orderDescending, + limit: limit, + offset: offset, + transaction: transaction, + ); + } + + /// Returns the first matching [Vote] matching the given query parameters. + /// + /// Use [where] to specify which items to include in the return value. + /// If none is specified, all items will be returned. + /// + /// To specify the order use [orderBy] or [orderByList] + /// when sorting by multiple columns. + /// + /// [offset] defines how many items to skip, after which the next one will be picked. + /// + /// ```dart + /// var youngestPerson = await Persons.db.findFirstRow( + /// session, + /// where: (t) => t.lastName.equals('Jones'), + /// orderBy: (t) => t.age, + /// ); + /// ``` + Future findFirstRow( + _i1.Session session, { + _i1.WhereExpressionBuilder? where, + int? offset, + _i1.OrderByBuilder? orderBy, + bool orderDescending = false, + _i1.OrderByListBuilder? orderByList, + _i1.Transaction? transaction, + }) async { + return session.db.findFirstRow( + where: where?.call(Vote.t), + orderBy: orderBy?.call(Vote.t), + orderByList: orderByList?.call(Vote.t), + orderDescending: orderDescending, + offset: offset, + transaction: transaction, + ); + } + + /// Finds a single [Vote] by its [id] or null if no such row exists. + Future findById( + _i1.Session session, + int id, { + _i1.Transaction? transaction, + }) async { + return session.db.findById( + id, + transaction: transaction, + ); + } + + /// Inserts all [Vote]s in the list and returns the inserted rows. + /// + /// The returned [Vote]s will have their `id` fields set. + /// + /// This is an atomic operation, meaning that if one of the rows fails to + /// insert, none of the rows will be inserted. + Future> insert( + _i1.Session session, + List rows, { + _i1.Transaction? transaction, + }) async { + return session.db.insert( + rows, + transaction: transaction, + ); + } + + /// Inserts a single [Vote] and returns the inserted row. + /// + /// The returned [Vote] will have its `id` field set. + Future insertRow( + _i1.Session session, + Vote row, { + _i1.Transaction? transaction, + }) async { + return session.db.insertRow( + row, + transaction: transaction, + ); + } + + /// Updates all [Vote]s in the list and returns the updated rows. If + /// [columns] is provided, only those columns will be updated. Defaults to + /// all columns. + /// This is an atomic operation, meaning that if one of the rows fails to + /// update, none of the rows will be updated. + Future> update( + _i1.Session session, + List rows, { + _i1.ColumnSelections? columns, + _i1.Transaction? transaction, + }) async { + return session.db.update( + rows, + columns: columns?.call(Vote.t), + transaction: transaction, + ); + } + + /// Updates a single [Vote]. The row needs to have its id set. + /// Optionally, a list of [columns] can be provided to only update those + /// columns. Defaults to all columns. + Future updateRow( + _i1.Session session, + Vote row, { + _i1.ColumnSelections? columns, + _i1.Transaction? transaction, + }) async { + return session.db.updateRow( + row, + columns: columns?.call(Vote.t), + transaction: transaction, + ); + } + + /// Deletes all [Vote]s in the list and returns the deleted rows. + /// This is an atomic operation, meaning that if one of the rows fail to + /// be deleted, none of the rows will be deleted. + Future> delete( + _i1.Session session, + List rows, { + _i1.Transaction? transaction, + }) async { + return session.db.delete( + rows, + transaction: transaction, + ); + } + + /// Deletes a single [Vote]. + Future deleteRow( + _i1.Session session, + Vote row, { + _i1.Transaction? transaction, + }) async { + return session.db.deleteRow( + row, + transaction: transaction, + ); + } + + /// Deletes all rows matching the [where] expression. + Future> deleteWhere( + _i1.Session session, { + required _i1.WhereExpressionBuilder where, + _i1.Transaction? transaction, + }) async { + return session.db.deleteWhere( + where: where(Vote.t), + transaction: transaction, + ); + } + + /// Counts the number of rows matching the [where] expression. If omitted, + /// will return the count of all rows in the table. + Future count( + _i1.Session session, { + _i1.WhereExpressionBuilder? where, + int? limit, + _i1.Transaction? transaction, + }) async { + return session.db.count( + where: where?.call(Vote.t), + limit: limit, + transaction: transaction, + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/generated/votes/vote_request.dart b/wien_talks/wien_talks_server/lib/src/generated/votes/vote_request.dart new file mode 100644 index 0000000..4c03e8a --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/generated/votes/vote_request.dart @@ -0,0 +1,422 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod/serverpod.dart' as _i1; +import '../quotes/quote.dart' as _i2; + +abstract class VoteRequest + implements _i1.TableRow, _i1.ProtocolSerialization { + VoteRequest._({ + this.id, + required this.userId, + required this.quote, + required this.upvote, + }); + + factory VoteRequest({ + int? id, + required int userId, + required _i2.Quote quote, + required bool upvote, + }) = _VoteRequestImpl; + + factory VoteRequest.fromJson(Map jsonSerialization) { + return VoteRequest( + id: jsonSerialization['id'] as int?, + userId: jsonSerialization['userId'] as int, + quote: _i2.Quote.fromJson( + (jsonSerialization['quote'] as Map)), + upvote: jsonSerialization['upvote'] as bool, + ); + } + + static final t = VoteRequestTable(); + + static const db = VoteRequestRepository._(); + + @override + int? id; + + int userId; + + _i2.Quote quote; + + bool upvote; + + @override + _i1.Table get table => t; + + /// Returns a shallow copy of this [VoteRequest] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + VoteRequest copyWith({ + int? id, + int? userId, + _i2.Quote? quote, + bool? upvote, + }); + @override + Map toJson() { + return { + if (id != null) 'id': id, + 'userId': userId, + 'quote': quote.toJson(), + 'upvote': upvote, + }; + } + + @override + Map toJsonForProtocol() { + return { + if (id != null) 'id': id, + 'userId': userId, + 'quote': quote.toJsonForProtocol(), + 'upvote': upvote, + }; + } + + static VoteRequestInclude include() { + return VoteRequestInclude._(); + } + + static VoteRequestIncludeList includeList({ + _i1.WhereExpressionBuilder? where, + int? limit, + int? offset, + _i1.OrderByBuilder? orderBy, + bool orderDescending = false, + _i1.OrderByListBuilder? orderByList, + VoteRequestInclude? include, + }) { + return VoteRequestIncludeList._( + where: where, + limit: limit, + offset: offset, + orderBy: orderBy?.call(VoteRequest.t), + orderDescending: orderDescending, + orderByList: orderByList?.call(VoteRequest.t), + include: include, + ); + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _Undefined {} + +class _VoteRequestImpl extends VoteRequest { + _VoteRequestImpl({ + int? id, + required int userId, + required _i2.Quote quote, + required bool upvote, + }) : super._( + id: id, + userId: userId, + quote: quote, + upvote: upvote, + ); + + /// Returns a shallow copy of this [VoteRequest] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + VoteRequest copyWith({ + Object? id = _Undefined, + int? userId, + _i2.Quote? quote, + bool? upvote, + }) { + return VoteRequest( + id: id is int? ? id : this.id, + userId: userId ?? this.userId, + quote: quote ?? this.quote.copyWith(), + upvote: upvote ?? this.upvote, + ); + } +} + +class VoteRequestTable extends _i1.Table { + VoteRequestTable({super.tableRelation}) : super(tableName: 'vote_request') { + userId = _i1.ColumnInt( + 'userId', + this, + ); + quote = _i1.ColumnSerializable( + 'quote', + this, + ); + upvote = _i1.ColumnBool( + 'upvote', + this, + ); + } + + late final _i1.ColumnInt userId; + + late final _i1.ColumnSerializable quote; + + late final _i1.ColumnBool upvote; + + @override + List<_i1.Column> get columns => [ + id, + userId, + quote, + upvote, + ]; +} + +class VoteRequestInclude extends _i1.IncludeObject { + VoteRequestInclude._(); + + @override + Map get includes => {}; + + @override + _i1.Table get table => VoteRequest.t; +} + +class VoteRequestIncludeList extends _i1.IncludeList { + VoteRequestIncludeList._({ + _i1.WhereExpressionBuilder? where, + super.limit, + super.offset, + super.orderBy, + super.orderDescending, + super.orderByList, + super.include, + }) { + super.where = where?.call(VoteRequest.t); + } + + @override + Map get includes => include?.includes ?? {}; + + @override + _i1.Table get table => VoteRequest.t; +} + +class VoteRequestRepository { + const VoteRequestRepository._(); + + /// Returns a list of [VoteRequest]s matching the given query parameters. + /// + /// Use [where] to specify which items to include in the return value. + /// If none is specified, all items will be returned. + /// + /// To specify the order of the items use [orderBy] or [orderByList] + /// when sorting by multiple columns. + /// + /// The maximum number of items can be set by [limit]. If no limit is set, + /// all items matching the query will be returned. + /// + /// [offset] defines how many items to skip, after which [limit] (or all) + /// items are read from the database. + /// + /// ```dart + /// var persons = await Persons.db.find( + /// session, + /// where: (t) => t.lastName.equals('Jones'), + /// orderBy: (t) => t.firstName, + /// limit: 100, + /// ); + /// ``` + Future> find( + _i1.Session session, { + _i1.WhereExpressionBuilder? where, + int? limit, + int? offset, + _i1.OrderByBuilder? orderBy, + bool orderDescending = false, + _i1.OrderByListBuilder? orderByList, + _i1.Transaction? transaction, + }) async { + return session.db.find( + where: where?.call(VoteRequest.t), + orderBy: orderBy?.call(VoteRequest.t), + orderByList: orderByList?.call(VoteRequest.t), + orderDescending: orderDescending, + limit: limit, + offset: offset, + transaction: transaction, + ); + } + + /// Returns the first matching [VoteRequest] matching the given query parameters. + /// + /// Use [where] to specify which items to include in the return value. + /// If none is specified, all items will be returned. + /// + /// To specify the order use [orderBy] or [orderByList] + /// when sorting by multiple columns. + /// + /// [offset] defines how many items to skip, after which the next one will be picked. + /// + /// ```dart + /// var youngestPerson = await Persons.db.findFirstRow( + /// session, + /// where: (t) => t.lastName.equals('Jones'), + /// orderBy: (t) => t.age, + /// ); + /// ``` + Future findFirstRow( + _i1.Session session, { + _i1.WhereExpressionBuilder? where, + int? offset, + _i1.OrderByBuilder? orderBy, + bool orderDescending = false, + _i1.OrderByListBuilder? orderByList, + _i1.Transaction? transaction, + }) async { + return session.db.findFirstRow( + where: where?.call(VoteRequest.t), + orderBy: orderBy?.call(VoteRequest.t), + orderByList: orderByList?.call(VoteRequest.t), + orderDescending: orderDescending, + offset: offset, + transaction: transaction, + ); + } + + /// Finds a single [VoteRequest] by its [id] or null if no such row exists. + Future findById( + _i1.Session session, + int id, { + _i1.Transaction? transaction, + }) async { + return session.db.findById( + id, + transaction: transaction, + ); + } + + /// Inserts all [VoteRequest]s in the list and returns the inserted rows. + /// + /// The returned [VoteRequest]s will have their `id` fields set. + /// + /// This is an atomic operation, meaning that if one of the rows fails to + /// insert, none of the rows will be inserted. + Future> insert( + _i1.Session session, + List rows, { + _i1.Transaction? transaction, + }) async { + return session.db.insert( + rows, + transaction: transaction, + ); + } + + /// Inserts a single [VoteRequest] and returns the inserted row. + /// + /// The returned [VoteRequest] will have its `id` field set. + Future insertRow( + _i1.Session session, + VoteRequest row, { + _i1.Transaction? transaction, + }) async { + return session.db.insertRow( + row, + transaction: transaction, + ); + } + + /// Updates all [VoteRequest]s in the list and returns the updated rows. If + /// [columns] is provided, only those columns will be updated. Defaults to + /// all columns. + /// This is an atomic operation, meaning that if one of the rows fails to + /// update, none of the rows will be updated. + Future> update( + _i1.Session session, + List rows, { + _i1.ColumnSelections? columns, + _i1.Transaction? transaction, + }) async { + return session.db.update( + rows, + columns: columns?.call(VoteRequest.t), + transaction: transaction, + ); + } + + /// Updates a single [VoteRequest]. The row needs to have its id set. + /// Optionally, a list of [columns] can be provided to only update those + /// columns. Defaults to all columns. + Future updateRow( + _i1.Session session, + VoteRequest row, { + _i1.ColumnSelections? columns, + _i1.Transaction? transaction, + }) async { + return session.db.updateRow( + row, + columns: columns?.call(VoteRequest.t), + transaction: transaction, + ); + } + + /// Deletes all [VoteRequest]s in the list and returns the deleted rows. + /// This is an atomic operation, meaning that if one of the rows fail to + /// be deleted, none of the rows will be deleted. + Future> delete( + _i1.Session session, + List rows, { + _i1.Transaction? transaction, + }) async { + return session.db.delete( + rows, + transaction: transaction, + ); + } + + /// Deletes a single [VoteRequest]. + Future deleteRow( + _i1.Session session, + VoteRequest row, { + _i1.Transaction? transaction, + }) async { + return session.db.deleteRow( + row, + transaction: transaction, + ); + } + + /// Deletes all rows matching the [where] expression. + Future> deleteWhere( + _i1.Session session, { + required _i1.WhereExpressionBuilder where, + _i1.Transaction? transaction, + }) async { + return session.db.deleteWhere( + where: where(VoteRequest.t), + transaction: transaction, + ); + } + + /// Counts the number of rows matching the [where] expression. If omitted, + /// will return the count of all rows in the table. + Future count( + _i1.Session session, { + _i1.WhereExpressionBuilder? where, + int? limit, + _i1.Transaction? transaction, + }) async { + return session.db.count( + where: where?.call(VoteRequest.t), + limit: limit, + transaction: transaction, + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/votes/vote.spy.yaml b/wien_talks/wien_talks_server/lib/src/votes/vote.spy.yaml new file mode 100644 index 0000000..072b1b8 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/votes/vote.spy.yaml @@ -0,0 +1,7 @@ +class: Vote +table: vote +fields: + userId: int + createdAt: DateTime + quote: Quote + upvote: bool diff --git a/wien_talks/wien_talks_server/lib/src/votes/vote_request.spy.yaml b/wien_talks/wien_talks_server/lib/src/votes/vote_request.spy.yaml new file mode 100644 index 0000000..e6f5cf5 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/votes/vote_request.spy.yaml @@ -0,0 +1,6 @@ +class: VoteRequest +table: vote_request +fields: + userId: int + quote: Quote + upvote: bool diff --git a/wien_talks/wien_talks_server/lib/src/votes/votes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/votes/votes_endpoint.dart new file mode 100644 index 0000000..1e0d874 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/votes/votes_endpoint.dart @@ -0,0 +1,21 @@ +import 'package:serverpod/serverpod.dart'; +import 'package:wien_talks_server/src/generated/protocol.dart'; + +class VotesEndpoint extends Endpoint { + Future postVote(Session session, VoteRequest voteRequest) async { + final row = Vote( + createdAt: DateTime.now(), + quote: voteRequest.quote, + upvote: voteRequest.upvote, + userId: voteRequest.userId); + + final persistedVote = await Vote.db.insertRow(session, row); + + return persistedVote; + } + + Future> getAllVotes(Session session) async { + final rows = Vote.db.find(session, limit: 50); + return rows; + } +} diff --git a/wien_talks/wien_talks_server/migrations/20250816171653001/definition.json b/wien_talks/wien_talks_server/migrations/20250816171653001/definition.json new file mode 100644 index 0000000..9efa77a --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816171653001/definition.json @@ -0,0 +1,1800 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage", + "dartName": "CloudStorageEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "addedTime", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + }, + { + "name": "byteData", + "columnType": 5, + "isNullable": false, + "dartType": "dart:typed_data:ByteData" + }, + { + "name": "verified", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_path_idx", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_cloud_storage_expiration", + "elements": [ + { + "type": 0, + "definition": "expiration" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage_direct_upload", + "dartName": "CloudStorageDirectUploadEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_direct_upload_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "authKey", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_direct_upload_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_direct_upload_storage_path", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_future_call", + "dartName": "FutureCallEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_future_call_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "serializedObject", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "identifier", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_future_call_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_future_call_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_serverId_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_identifier_idx", + "elements": [ + { + "type": 0, + "definition": "identifier" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_connection_info", + "dartName": "ServerHealthConnectionInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_connection_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "active", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "closing", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "idle", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_connection_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_connection_info_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_metric", + "dartName": "ServerHealthMetric", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_metric_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "isHealthy", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "value", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_metric_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_metric_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "name" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_log", + "dartName": "LogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "reference", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "logLevel", + "columnType": 6, + "isNullable": false, + "dartType": "protocol:LogLevel" + }, + { + "name": "message", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_message_log", + "dartName": "MessageLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_message_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_message_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_message_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_method", + "dartName": "MethodInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_method_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_method_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_method_endpoint_method_idx", + "elements": [ + { + "type": 0, + "definition": "endpoint" + }, + { + "type": 0, + "definition": "method" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_migrations", + "dartName": "DatabaseMigrationVersion", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_migrations_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "module", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "version", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_migrations_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_migrations_ids", + "elements": [ + { + "type": 0, + "definition": "module" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_query_log", + "dartName": "QueryLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_query_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "query", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "numRows", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_query_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_query_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_query_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_readwrite_test", + "dartName": "ReadWriteTestEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_readwrite_test_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "number", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_readwrite_test_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_runtime_settings", + "dartName": "RuntimeSettings", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_runtime_settings_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "logSettings", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:LogSettings" + }, + { + "name": "logSettingsOverrides", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "logServiceCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "logMalformedCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_runtime_settings_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_session_log", + "dartName": "SessionLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_session_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "module", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "method", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": true, + "dartType": "double?" + }, + { + "name": "numQueries", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "authenticatedUserId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "isOpen", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "touched", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_session_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_session_log_serverid_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_touched_idx", + "elements": [ + { + "type": 0, + "definition": "touched" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_isopen_idx", + "elements": [ + { + "type": 0, + "definition": "isOpen" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_auth", + "dartName": "EmailAuth", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_auth_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_auth_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_create_request", + "dartName": "EmailCreateAccountRequest", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_create_request_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_create_request_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_create_account_request_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_failed_sign_in", + "dartName": "EmailFailedSignIn", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_failed_sign_in_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "ipAddress", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_failed_sign_in_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_failed_sign_in_email_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_email_failed_sign_in_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_reset", + "dartName": "EmailReset", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_reset_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_reset_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_reset_verification_idx", + "elements": [ + { + "type": 0, + "definition": "verificationCode" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_google_refresh_token", + "dartName": "GoogleRefreshToken", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_google_refresh_token_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "refreshToken", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_google_refresh_token_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_google_refresh_token_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_image", + "dartName": "UserImage", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_image_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "version", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "url", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_image_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_image_user_id", + "elements": [ + { + "type": 0, + "definition": "userId" + }, + { + "type": 0, + "definition": "version" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_info", + "dartName": "UserInfo", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userIdentifier", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "fullName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "created", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "imageUrl", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "blocked", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_info_user_identifier", + "elements": [ + { + "type": 0, + "definition": "userIdentifier" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_user_info_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "wien_talks", + "version": "20250816171653001" + }, + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816171653001/definition.sql b/wien_talks/wien_talks_server/migrations/20250816171653001/definition.sql new file mode 100644 index 0000000..c3b22fd --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816171653001/definition.sql @@ -0,0 +1,394 @@ +BEGIN; + +-- +-- Class Quote as table quote +-- +CREATE TABLE "quote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "text" text NOT NULL, + "authorName" text, + "lat" double precision NOT NULL, + "long" double precision NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "visibility" bigint NOT NULL, + "upvotes" bigint NOT NULL, + "downvotes" bigint NOT NULL, + "tags" json +); + +-- +-- Class CloudStorageEntry as table serverpod_cloud_storage +-- +CREATE TABLE "serverpod_cloud_storage" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "addedTime" timestamp without time zone NOT NULL, + "expiration" timestamp without time zone, + "byteData" bytea NOT NULL, + "verified" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_path_idx" ON "serverpod_cloud_storage" USING btree ("storageId", "path"); +CREATE INDEX "serverpod_cloud_storage_expiration" ON "serverpod_cloud_storage" USING btree ("expiration"); + +-- +-- Class CloudStorageDirectUploadEntry as table serverpod_cloud_storage_direct_upload +-- +CREATE TABLE "serverpod_cloud_storage_direct_upload" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "expiration" timestamp without time zone NOT NULL, + "authKey" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_direct_upload_storage_path" ON "serverpod_cloud_storage_direct_upload" USING btree ("storageId", "path"); + +-- +-- Class FutureCallEntry as table serverpod_future_call +-- +CREATE TABLE "serverpod_future_call" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "serializedObject" text, + "serverId" text NOT NULL, + "identifier" text +); + +-- Indexes +CREATE INDEX "serverpod_future_call_time_idx" ON "serverpod_future_call" USING btree ("time"); +CREATE INDEX "serverpod_future_call_serverId_idx" ON "serverpod_future_call" USING btree ("serverId"); +CREATE INDEX "serverpod_future_call_identifier_idx" ON "serverpod_future_call" USING btree ("identifier"); + +-- +-- Class ServerHealthConnectionInfo as table serverpod_health_connection_info +-- +CREATE TABLE "serverpod_health_connection_info" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "active" bigint NOT NULL, + "closing" bigint NOT NULL, + "idle" bigint NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_connection_info_timestamp_idx" ON "serverpod_health_connection_info" USING btree ("timestamp", "serverId", "granularity"); + +-- +-- Class ServerHealthMetric as table serverpod_health_metric +-- +CREATE TABLE "serverpod_health_metric" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "isHealthy" boolean NOT NULL, + "value" double precision NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_metric_timestamp_idx" ON "serverpod_health_metric" USING btree ("timestamp", "serverId", "name", "granularity"); + +-- +-- Class LogEntry as table serverpod_log +-- +CREATE TABLE "serverpod_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "reference" text, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "logLevel" bigint NOT NULL, + "message" text NOT NULL, + "error" text, + "stackTrace" text, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_log_sessionLogId_idx" ON "serverpod_log" USING btree ("sessionLogId"); + +-- +-- Class MessageLogEntry as table serverpod_message_log +-- +CREATE TABLE "serverpod_message_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "serverId" text NOT NULL, + "messageId" bigint NOT NULL, + "endpoint" text NOT NULL, + "messageName" text NOT NULL, + "duration" double precision NOT NULL, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- +-- Class MethodInfo as table serverpod_method +-- +CREATE TABLE "serverpod_method" ( + "id" bigserial PRIMARY KEY, + "endpoint" text NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_method_endpoint_method_idx" ON "serverpod_method" USING btree ("endpoint", "method"); + +-- +-- Class DatabaseMigrationVersion as table serverpod_migrations +-- +CREATE TABLE "serverpod_migrations" ( + "id" bigserial PRIMARY KEY, + "module" text NOT NULL, + "version" text NOT NULL, + "timestamp" timestamp without time zone +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_migrations_ids" ON "serverpod_migrations" USING btree ("module"); + +-- +-- Class QueryLogEntry as table serverpod_query_log +-- +CREATE TABLE "serverpod_query_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "query" text NOT NULL, + "duration" double precision NOT NULL, + "numRows" bigint, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_query_log_sessionLogId_idx" ON "serverpod_query_log" USING btree ("sessionLogId"); + +-- +-- Class ReadWriteTestEntry as table serverpod_readwrite_test +-- +CREATE TABLE "serverpod_readwrite_test" ( + "id" bigserial PRIMARY KEY, + "number" bigint NOT NULL +); + +-- +-- Class RuntimeSettings as table serverpod_runtime_settings +-- +CREATE TABLE "serverpod_runtime_settings" ( + "id" bigserial PRIMARY KEY, + "logSettings" json NOT NULL, + "logSettingsOverrides" json NOT NULL, + "logServiceCalls" boolean NOT NULL, + "logMalformedCalls" boolean NOT NULL +); + +-- +-- Class SessionLogEntry as table serverpod_session_log +-- +CREATE TABLE "serverpod_session_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "module" text, + "endpoint" text, + "method" text, + "duration" double precision, + "numQueries" bigint, + "slow" boolean, + "error" text, + "stackTrace" text, + "authenticatedUserId" bigint, + "isOpen" boolean, + "touched" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USING btree ("serverId"); +CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); +CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); + +-- +-- Class AuthKey as table serverpod_auth_key +-- +CREATE TABLE "serverpod_auth_key" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- Class EmailAuth as table serverpod_email_auth +-- +CREATE TABLE "serverpod_email_auth" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_email" ON "serverpod_email_auth" USING btree ("email"); + +-- +-- Class EmailCreateAccountRequest as table serverpod_email_create_request +-- +CREATE TABLE "serverpod_email_create_request" ( + "id" bigserial PRIMARY KEY, + "userName" text NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL, + "verificationCode" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_create_account_request_idx" ON "serverpod_email_create_request" USING btree ("email"); + +-- +-- Class EmailFailedSignIn as table serverpod_email_failed_sign_in +-- +CREATE TABLE "serverpod_email_failed_sign_in" ( + "id" bigserial PRIMARY KEY, + "email" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "ipAddress" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_email_failed_sign_in_email_idx" ON "serverpod_email_failed_sign_in" USING btree ("email"); +CREATE INDEX "serverpod_email_failed_sign_in_time_idx" ON "serverpod_email_failed_sign_in" USING btree ("time"); + +-- +-- Class EmailReset as table serverpod_email_reset +-- +CREATE TABLE "serverpod_email_reset" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "verificationCode" text NOT NULL, + "expiration" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_reset_verification_idx" ON "serverpod_email_reset" USING btree ("verificationCode"); + +-- +-- Class GoogleRefreshToken as table serverpod_google_refresh_token +-- +CREATE TABLE "serverpod_google_refresh_token" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "refreshToken" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_google_refresh_token_userId_idx" ON "serverpod_google_refresh_token" USING btree ("userId"); + +-- +-- Class UserImage as table serverpod_user_image +-- +CREATE TABLE "serverpod_user_image" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "version" bigint NOT NULL, + "url" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_user_image_user_id" ON "serverpod_user_image" USING btree ("userId", "version"); + +-- +-- Class UserInfo as table serverpod_user_info +-- +CREATE TABLE "serverpod_user_info" ( + "id" bigserial PRIMARY KEY, + "userIdentifier" text NOT NULL, + "userName" text, + "fullName" text, + "email" text, + "created" timestamp without time zone NOT NULL, + "imageUrl" text, + "scopeNames" json NOT NULL, + "blocked" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_user_info_user_identifier" ON "serverpod_user_info" USING btree ("userIdentifier"); +CREATE INDEX "serverpod_user_info_email" ON "serverpod_user_info" USING btree ("email"); + +-- +-- Foreign relations for "serverpod_log" table +-- +ALTER TABLE ONLY "serverpod_log" + ADD CONSTRAINT "serverpod_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_message_log" table +-- +ALTER TABLE ONLY "serverpod_message_log" + ADD CONSTRAINT "serverpod_message_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_query_log" table +-- +ALTER TABLE ONLY "serverpod_query_log" + ADD CONSTRAINT "serverpod_query_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816171653001', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816171653001', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816171653001/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816171653001/definition_project.json new file mode 100644 index 0000000..d649d10 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816171653001/definition_project.json @@ -0,0 +1,107 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816171653001/migration.json b/wien_talks/wien_talks_server/migrations/20250816171653001/migration.json new file mode 100644 index 0000000..056118b --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816171653001/migration.json @@ -0,0 +1,5 @@ +{ + "actions": [], + "warnings": [], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816171653001/migration.sql b/wien_talks/wien_talks_server/migrations/20250816171653001/migration.sql new file mode 100644 index 0000000..c1ccc46 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816171653001/migration.sql @@ -0,0 +1,29 @@ +BEGIN; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816171653001', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816171653001', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index 58e233c..e2e9136 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -105,7 +105,9 @@ void withServerpod( } class TestEndpoints { - late final _ShowLatestNewsWidget showLatestNewsWidget; + late final _QuoteEndpoint quote; + + late final _VotesEndpoint votes; } class _InternalTestEndpoints extends TestEndpoints @@ -115,15 +117,22 @@ class _InternalTestEndpoints extends TestEndpoints _i2.SerializationManager serializationManager, _i2.EndpointDispatch endpoints, ) { - showLatestNewsWidget = _ShowLatestNewsWidget( + quote = _QuoteEndpoint( + endpoints, + serializationManager, + ); + votes = _VotesEndpoint( endpoints, serializationManager, ); } } -class _ShowLatestNewsWidget { - _ShowLatestNewsWidget(this._endpointDispatch, this._serializationManager); +class _QuoteEndpoint { + _QuoteEndpoint( + this._endpointDispatch, + this._serializationManager, + ); final _i2.EndpointDispatch _endpointDispatch; @@ -136,23 +145,21 @@ class _ShowLatestNewsWidget { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'showLatestNewsWidget', - method: 'createQuote', - ); + endpoint: 'quote', + method: 'createQuote', + ); try { var _localCallContext = await _endpointDispatch.getMethodCallContext( createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'showLatestNewsWidget', + endpointPath: 'quote', methodName: 'createQuote', parameters: _i1.testObjectToJson({'req': req}), serializationManager: _serializationManager, ); - var _localReturnValue = - await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) - as _i3.Future<_i4.Quote>); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future<_i4.Quote>); return _localReturnValue; } finally { await _localUniqueSession.close(); @@ -167,23 +174,21 @@ class _ShowLatestNewsWidget { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'showLatestNewsWidget', - method: 'updateQuote', - ); + endpoint: 'quote', + method: 'updateQuote', + ); try { var _localCallContext = await _endpointDispatch.getMethodCallContext( createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'showLatestNewsWidget', + endpointPath: 'quote', methodName: 'updateQuote', parameters: _i1.testObjectToJson({'quote': quote}), serializationManager: _serializationManager, ); - var _localReturnValue = - await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) - as _i3.Future); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future); return _localReturnValue; } finally { await _localUniqueSession.close(); @@ -192,29 +197,92 @@ class _ShowLatestNewsWidget { } _i3.Future> getAllQuotes( - _i1.TestSessionBuilder sessionBuilder, { - required int limit, - }) async { + _i1.TestSessionBuilder sessionBuilder) async { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'showLatestNewsWidget', - method: 'getAllQuotes', - ); + endpoint: 'quote', + method: 'getAllQuotes', + ); try { var _localCallContext = await _endpointDispatch.getMethodCallContext( createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'showLatestNewsWidget', + endpointPath: 'quote', methodName: 'getAllQuotes', - parameters: _i1.testObjectToJson({'limit': limit}), + parameters: _i1.testObjectToJson({}), serializationManager: _serializationManager, ); - var _localReturnValue = - await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) - as _i3.Future>); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future>); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } +} + +class _VotesEndpoint { + _VotesEndpoint( + this._endpointDispatch, + this._serializationManager, + ); + + final _i2.EndpointDispatch _endpointDispatch; + + final _i2.SerializationManager _serializationManager; + + _i3.Future<_i6.Vote> postVote( + _i1.TestSessionBuilder sessionBuilder, + _i7.VoteRequest voteRequest, + ) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'votes', + method: 'postVote', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'votes', + methodName: 'postVote', + parameters: _i1.testObjectToJson({'voteRequest': voteRequest}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future<_i6.Vote>); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } + + _i3.Future> getAllVotes( + _i1.TestSessionBuilder sessionBuilder) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'votes', + method: 'getAllVotes', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'votes', + methodName: 'getAllVotes', + parameters: _i1.testObjectToJson({}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future>); return _localReturnValue; } finally { await _localUniqueSession.close(); From 68e7a9720ac4917c184315a7aaae65df9fee86ff Mon Sep 17 00:00:00 2001 From: mikes222 Date: Sat, 16 Aug 2025 19:47:26 +0200 Subject: [PATCH 37/49] powerpoint presentation --- .gitignore | 1 + wien_talks/FunMap_Presentation.pptx | Bin 0 -> 1633383 bytes .../lib/get_location_widget.dart | 2 +- .../wien_talks_flutter/lib/location_mgr.dart | 3 ++- 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 wien_talks/FunMap_Presentation.pptx diff --git a/.gitignore b/.gitignore index 2b377da..8276f97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ wien_talks/wien_talks_flutter/pubspec.lock wien_talks/wien_talks_flutter/android/app/google-services.json +*.pptx# diff --git a/wien_talks/FunMap_Presentation.pptx b/wien_talks/FunMap_Presentation.pptx new file mode 100644 index 0000000000000000000000000000000000000000..96ac4e92df4dadad3ed9554c9f8ac3307a7534c9 GIT binary patch literal 1633383 zcmbrlW0Yjiw)R`LZQHhO+eVjN)n#DfJdb|d)0&klleUa4Up<{+!nq$xHbYTGK#xJLf0Gvq;3X0&9_ zY4QG?yWmpLKYSnuSfF#(S8woel9E6(t28^w8nHns4b{yvJ3vFasmE+7=k<&LiC|3E zANB`Ii2FeOUOn#u){96_ZBLTJWvcCjAPa9v5m=ks}sY^f`??fvah=W9B> zn@xgu0DN&hbRRkAXiu3Owl@8U^rL{C1e$^tZN^kzzy)EfsRyIFToAk$X%lz@lUdO?ipU5sBzTt*AuX z{S1*@)Icz;8Vrma`=?)`H#QvFu}tJ6OFLV=nkTV1v+V|AJFe|n)+LZw@5dLHr?;F@ zQc;)cMSh9*#>7G%u@GDlAbSMtCVD0O*X7_!Xq-87ne%&XV|Jk3C|*x|=3fiXLE!E8 zra7OE`IUqeb~r=W$*dYTl8(rGh|JByF6O_TTBKb{R=S$vnzjbC6R}QolL(AUyB&#v z`38M8FlYFm6yIg6Et+_Ty0V&D@?T*O>%+Ih$Eg){a%8v>NKD~#ihalHB=QT^-Ei5u zzx?|8sl>?FENc9P-5I_-7w_o*NgpJQ7Kk4p0Kn7#nm&a8o<2i+`+u^RrPyoRPXN<- zO-Nu3^6LF}AT?6(uv75)h=q>dU8Lwk|tF;LfvYtDj9f`;Cq}0DdhU zYc?|%CbB^)!#ip#BV`oFln|;w#2j|v1O|}y6<6Eiyhj|CP#TJC;RK;T+W_YP@F(J3 zA{*tr)^Kb3@F`WKPLrt()=M zs7I!ZzwaIA+?b&F>g^FUw)6I+bsYMQEwEUPWxdaz`a>Ow%Y=s(ilY6@f z6t*aPtwWeWHYwosv_GsT)8n9IU3)%?w7srB)Rn9LDd%ewbi1ba3i(g)Vpbk|KE6W} z@V^ER<@*VHduMukM^h(LTW3ROOFP@Y(TmrW?P-^N)(i?E> zT$BbM(1gvOpPI`Qjp;O7fYToMQ;-$x;T3++g~U_j#CCB_M64^ECDahKn~Z`NN|t22=ZS~|ua&EPOR<5? z5qM+{k$D6<0gTnvqan|K$QYL;RF)maY*9C%uiGSG&cT0gI@ok;37t-mbFhw;P0{{F zDuDXoVjxD%x1zw41#S8jM}i!dy9`4X>al+Q%k2mM1od?*H|)OuP zv}UGL{7#1~@c%ZR3IClECu>U+Q&~eNXH!Qf`u}#r_%}a^x=#5F-}!k~H*wSlhOoe` zW#5dMYG}{0dlKg=w63}Yg*7KHUZpM1OZGE zNs_68dU<-=H-qwb(MV3EmV|C8LEED3ntYtNyMxpghrL0Yo3aPAI(~p5l>R|ggG(t} zq+gzhxbmuAFI3cfy`^QJD54k*Vuplw|H%5frXXF^KV|pKjO-K@Rz@Xu(n*B9+X+V& ze7Cf)B(pxBy!X&2&tR0OnuLu=8m%T#?)Ia>s8So}@jSe~I+cVMS+I&y#-M)d1pE58 zH>31W+IsV0?=L$Hk6qLIhPOq9H4(@6`4jX{YqTAA)|KnadccZ@c>w=`K6c!E=AG1~ zgu^G{)BU#_VI zTfym6eaRUdI5=+{(tVT2O9rjs&?8y=49)k7txvO#Ni14(7Lo<85XgJvQ^>;v6p{*Z z6C4!#xrKs~f$^ZE&{BAbI05O*txwAHJOrgEUoHqj2j_fVgE8*aY*%?+4OcRjB?Mvf zl3cjQr?enuOB6?WGIVvG)@Uv(w*c5~E6#qhT-Izo(cIR2J;k`LOg(0}u3SAwxKFNr zSLM&_za7Tf=Vr?Z8rjVb-#>)**askZKz!GPd>t#0v<4Z*;%g3Jvs$?JV0 zW1jv19E6Z71|g=D@OIrEni}E2WE-saK_FdTZ=OPY+4nd(t&~q*6;-+b_MU<#rc+CW zO0~UX2j3onL2Ue6>URao_6{%mi`n~bdX-JDbaany8tdjx-`Y>vP(y>_qq?%zfX<3J z(#DzvPDxg8ur;Olp8Mp&LZMxBU+-w&B-4P~_V7=N);ij-qj)WeO_Y2#3`#AbXnh<6 zUKYr`OTxvNcy^y+Muy+lY2&^pyEUf;+aH)&aorNgvKg zc)&b-IPNh-ff@5})bDG&RHx5U*8n?k=ybn@T=nlGnR+&rD3NFx%6^#+Mkfnh5lTjC z2sZAbRY@RcR&nCGHP%h|4Zh#XD3uf{h+7lLbG<%NnW2dD4E|hRHaE1my zKd6RIH5y*IY$(rDuCnB3r*CK#bTLgQ{~3tR6`;`6C>l722R=R-Yd;GxO{%MtC4SZ% zbtt38|1%;9M#b+u++x1>({v_SAXss9{>r^F_Ji6SP15acDQYcBlDSDy3~8FEdAm`` z51r+3_(&5qVhi~~hOqM)QnI*+VA1_ocHX9#Ac&}>)rqr0KLf25#1EBd#3as+@-&;A zrlp}RMdgO+BdUX&Aq8H2gkQ3E_lR^xzIZ~8Gyu~~Gxw;{-9eqn2M1Rl298wqB-@`Q z-n2aRxqaKeOBlFR<;xen8o6^}r>f@C*ML}oH#qasthak)(|A=v)~vM!m2=P?xEHe! zp%!DnXR*qBS4s9UGj;`L2Jw+txbnj-_~~( z=6{9mM5s_KVIf! zG)uj$$OWGF_>lot>=0+-%)_u9DaXw_zXLQ25*M)N&pEu|4st zpshTzCIo|WjwRxDoGAOqKpNXHm7>5aKB*%uet)|z#hj7aJubY&Ax^!xqOPT{f`-X- zvUc5vv)4GXg_hXk17X;4fUd+8+&XzjCNWNCBFVFu@QBnz-Xy?aUO~}>xzv7wSi+Qt zBur2d4wZPd4_t@J9Wd2n%7-yy2FF^L%{v5)RD?)lOiM3TSj0#m>Dpme^H*# zUPMA~HrNuCTN0XW~(csFAs|{r9=_EKqHcFEAuhH?suk!6HS(3{um#_b&2yRfUFTego|Tb)QtiuAx44SRttVS zfW%F%oznI~gzntJ(e{~GD=HIZ;RTmcH=HFtgO0@b-3t+KFx+r&24Ro_{K_P(Q*(iI zClis^#vJvVM!|YZ?7NOPcWOtSbBQJkD4f*w{8gJU%4mUs{7pb7-ab^QSN$xOf!Q=;RR{A>bD^ zSHILqqhBQ!qFZ2}CMc9!d9Fkdq_8eM7JnvM(g7*05IqDn8jS@Y#BE1S{x9@5!)xde z&|M=6(8??Gf!5xr%3h$y-i7qX-IjF?{2B^Fs{*UGUL!vIpR*R*4d+~;Z$6YQ<)t5x z3LWbXwl5z+q2}~)sYgp0ke(6Dwo+cmhpE`dFJtby z2cfo*BUe-ep4y;}RL`j4BUeKrPdLlXp69U}+z>c!F$e3~t?z*C6^~Ku1UUldF$X8O zgsmar?P!^3A95wve}JwKKR9kK1G=xF`Rq_%J}LuZ5)Qo5)i3VZeBEGy?0Daw)@Mcs?1-K`A8{&OR;=7QiRn+Hu!iJ)uk(L-8G_HWI=UZd}`8PrR2i;9H~K$ID+kE$jp}`9@swF7w)-2TES& zuDkGKx3C-7vf)GaaQaK%gP392xq5OLjy$DFpW7jtHp_IAgz&C>T}>fg(z zruz`{lhgNZL-+5G=Sy!c8-X>n2F=Ub^gDV6*BrTzZgX%Xb#XV+$zhce?&>_<`h9xD zhOH4lq*ox9r8yv)TZUgiAhwcd*xo)l`>m_DlYKt5y0t2?PnRz}JVAUfc<2}vcik9}CtCRn1 zR#uh!N_#*2UG@7u!>2%ed)heK|3p@p{#hkmYK{LRE1S>M3_2zyH?q7&oW|S^>zK=r zB2wQ4IVp@l0Pr9a%B-me{5Qa?Q#;M9R|lJ?p0EZ?uBq98+vd~YUeV8n~NnXHZojkO3*rv;E`y-9-}cCCNiHmR0@xn z@)$twaRf#aszwq>aJ+#ASw>=F#kVpU6*zcw#)g2ms6&V)D37IDj@+IENwV};*cBZa zuZDm>g{SJuH(BY5@+AhHaPz(E9R=cuDL&4+W=+$P^2LQK&F!+?rJhOH@NkPLJX~%AX%X-XRPGni%TH3`dHG zyS2E<3)49rA&41o7(}n7YR))6iBWA=k&G-p?paaQ7(*S0uHaybV62eLzFB$)jP1~) zn1Q59EKG?tqXRpd5>npW8EES~XGM=Q+a^x|vylE|#{{^`Dvo8BNX69pvAd-*4s&ce zEs}03)rA?kX8&{Z=Q1>8?o6UfwPeh6!St`W8D+IU(%hwwPO03nQGb%&C)7pd7 z{SG8#e<_t_2z-Fm<2s4pb}!NpP2Q1p7Zm)aY|$5mGwgJ=A4c%d$FOFXt&q&;>z@U3 zPJRW<35@q>?mZ6g1s>X97^}8 zOW)WGazc;XF&lP5u>CzPzOk9!yaH^ZA2KOs=&sAX9dq0#@bJv!X|`qq!pC*s;zH6D zn2)b_SzQH}tjG_r0d zf6-RV2Ln_m_G8!aTNl3SV;BA+J=}BC#`cR=Eb5P3Y5^yH&D~|(cImdlVSx1xYmu;$L^j`XOQ4I%tY#v zctS5pS$3D_U$(1jU%>w?C>{nG3ClqN0JJFn6Y?|vPx5p8zvNe4`~M?9 z0Ht!%M=UXU95UU%$xjS$(0eW_SILP+x?5rANw2%!N3%<5n9%jZ6tWrMko#OK3IQZ0Ja{xT$IPt41Tt zQjV>Wd_L#;B1fjXTQ?9&x1Zop)TS;vBTQ4*7G$iF*hNk;z;}mbuusX-m8w>1%lX#_ zN(oOZ1?>=_7}bm%troSpYKf6nuOyX)ievGtC6=;UdgH6QVx)05b{iR*4|gQ@*rphU zH~WuvL)7q6WRI#i`zjXH{6ss(Y1+q`W>7g421WQud1*@#D@4`FmcA^!Af|IAQ1{9; z#mBXmIwoDZXpc4(A>)@{v2*yEtIh3tr7*~o0Smtve!MGSutSHED#Jx4N*Gc{gGw_h z-Irl~T9A2&QF%^stZ{lPTbfYbB#43LBdbwLIj{-s?}q%q*oQLhCt}o;nL@TK&N(g{ zufnY$8LDSCxTBIV6LAVe9RA4=j`C`}^phXtP96BvIY}uNdW36V_|rt2S=C^rYZNHF z;3gb=4mzq`?9)Ze@4_6@1aYn;1B-MagEDQl?*KkD%JRk3@2tx^fC3X*iIXyt|L!Iz z{-7^@qmMFfNxn1@zz0^{-dM60iH-OaF16@bBG+x207Shi6~;)Maz6*u~FH3LmiwLi|C@8W4`lbwLb@XLXplGHSkL9)Ud!^TrCAC~KUb zk2xP@-aPXd-AzRH8CvQ@`>TG;t9}o01fl640W&C&)c)Grf3BaqFDg^1Z=Oxow)%CT z4%1u4D$}g&gzOVqv093q%Funmwr%{JRtB24!?<=6cDcj(F}uE2;I@6t<>TA?o)O4# zo{&(c88@-UJ@>CZHJ+?!Jn{Tib%E=*!#2r*omQ@V@=PwT$FZzHk7g4?#f?4mJ38^l zd!fetw7-;%JV;*#5$oH@S9J|Ndd!97@S%^q9iDv{LReE5IYnM@dOxPOr}4%~-m&sJ z4&}DD8|L9%+vepB(WRAEvYYwMy79pkabA~WAUg>l&R~5JmdSxU+qcz2Jk2_^pI#ag zg&RQ^rk&1oxrsJbTM5qm%ecuxn-gG3C#3qQ0@r4fc;$JmBJGA;kVWn{Ag+pmSElXH z+O{3^9B!eh^g9I|lew=;_JGOm21UAlVo;Z~xUl@RX0ZM2-}qHc9KS!u)t|D&olV?C zEe6NN=-8qxHnqSFB0HK@Ny&L*FhAECk-)tdFF&mW+=sS_$@v z2i>mPKTS-XNeVef{eF?fKY#wg8r-~^oi&(oln+QiV^At_@!EjY2Al|Iuy_yL7yQWR zOt%232>ku@NMjG4i^qJ!Ic$`5NEoEQ3bow&mO0LtlbF`_=Goi-1^5s8!Q&{KD!$S0 z@*km}SuxUQ=;=jO6sOKZYL4&QhjGxx{~)es2X3dj|*nV?3ZlI6ZnMqX|ZOC9(J7`#CmP8Dg{&=Q(zIG4jf2 zOBA443`8-9ZJoV7FYlLr!7XYDukd7RG8hHH2)wflWx~5`Q`A`$^HTRwM;SvJLmpwE zbT6Yp99{pj$iJ1OV5J|)_xB+a)0}h+s1kmy=ZQBV6o!)VVlSzp^)Swsq&Ub$4XMQ* ziWvtl%@3xQ1Dd@^w@gNwzsJT_QI9yKlh}s!9>*cS*{`b@FZ#`X;Sa~;W&v}!sYvDc z@FK@)mI0=ai`rZI;yj~~;~D1(VF?o!l3GDUFx&za1Z#n&D8K@sfC7*qWN+T%5b#oU zhWH_JO2V>U@_oSFA)L6bw9@Zt5}pRNks9l2nKSBZs4>m;$p`Lq2xlbLp}3Ya8~?Ew zmNc~VxWIXt0H;k+##A-;ff0LB;K;$zkJ4rdceQ3!c#;8)2iekJMIBn@1@45A67b^Z zLj|YP&r>nQcGpV;!pjU2KNZs|_KJRKwK9EIBE2l1~tkaEmhW8q$YQip)&^xS)LI!Xl{T*{}Po#BH(VuQ+U0 zou|av<7~rvw+AT{Q5^qr579Im$>Gq&n}YKQ6jp1!PUhQ$&M|=nkZk)Xv>BWRSfe&j?|%ZJtp|k&$=URgnj~E`;O+`0qZ=$* zT}ofGr$H+gOX4P@jV?^!)*4HXtOAj(CzMW!UB*41Itn&;bXk{z6Lj7eLytOx^~p~8 z?e|Ik@%vam8WilvOvRwH7zyagZju2a-;V&|oG0ezB&$9VLxAJOQi2V@qLmFlf}j8` z)L%f@lR=~nJLA*+EWM&R-fmEXcGgg{3_%Z|delS_pAke`qA51AkbVukDZBSU+N?KT z6GQRa2NG=9O?!_vS~H{~q&u~R=?pP@;u-1M7NSyRR56Zx^m-}f%fXgpby$2(WZ`yFZj zp?xR$YGtigpP7!#U)sAdr+z|BRN*#!RwGV)eS9t&bINv!QrLO4*j00HcyjY@3x~Gxk74pZ1Tfg!W!~xz-*?pT?0XtMHrd<7ykKvG#tXq5Vk&G-hdJ#x?o4fg=Hr#N zl?Y{KWm4qPC~ILYz*Sv(T-D8XSuVREJbDwioa?pu1hZFu`~37seT3UHj4(|zU71($ z%y4w%+cU!koc*PY*?)XKvJ-k&^c)QO5M~z>Uk%KxuA-wkF6ldW(SgVx+g#4o)${~j z@MzkscZt?{Se$2W%I!auX3T?Zvt5t7H_W-8aWX%}CD?BExrKw>-S`5+27Z9ZfDn?^W2z^9)I9sV>K3! ztHs5$Kbwr3&&_&wXLedoOkaz<>SST+1NtSCJe#0P?Pj%TstPM9=<@&GU#-w{mai6@xJ@=o?n^{)MNVF*dAlay*6XVc+GemGzD z{ZI&=Z;lA(aGDSuwU~z0d#?(#9J-5-_PpA>DRbH55+X_`?xVPBm8RKf{?wN{uOfJ5 z)v8N#763)nU2q~-TGE|HUIkH?=rCg~u2EyqBZL&@dvc7v5_A#mn0ZF779w@I{PV{6 zZWRq$j3mk6mV)#LgS3KT45r(7wE{?2402e68a1H~jXELV1ln6Q&4EmVP~W_wuB;<{ z(^#)w$qM?zraRz;Q>u@aRP_mCm};P;z73Si%HB*RUWu;Jvx+!{)x=H&A*(Gqnkc7V zWao)6Y1QulP83xJ#=f|3$E$~8Sf@IA=*VOIy`+>HgYv#S9)Wjfe-?Ci3MVdG`y}T4 zQNELwv3m7_wM~Tg0Hd6p%Xj)*5Vkz}lfudNsCk3Z$uyf4y1^ED#YTJHxhq>CgjWTQ zXg{PR?<#+1@kfO@0sd6}u@E)Q;{3YaAoQt;8RvRqwye*3JAa0b&$p%D3>F-V7&5_S zN3J*PfKxePk82~P=*P$Kzu=^5&ql4kGowBz=`veY;YbvWRLSiWYfzNCEdFT}A)Xv> z@V$f9DQg_GSTU(D&IsF2z?c_G#4m|_cqN80&jR~75=>-4-a8s*XH`0@;zYP@tj2j( zbnHl>s6JWn+88U=fT%d1_`7XB1mSF>9KcT2^M@WbeZ{Gx!_-|75>~H11m&xQ==3E> z98;tnTp^x_Lm3g@8V*6aEXIxa+WeGRJZe$n^vUAXNr)8oq(5I9l%o#Jti{dh8PgLI zS1EHs*#%od@i36S_r?%3HDmfFK&B1J1mh9laHKQ3;5P6yqs=C)-|-ni5!lGoIAvjS zoxhJ$RvMOq`zS&pDAB-Y-6^WyP1)uBZ@T)Z*AM_d6Le4#*t((=HnCD}Wv2dLlIRK% zXFsTOLp`rRi4H?kmUL}-5kZZeME(XD$mbALXttK4V~h*{49MUINnSG zcKL}hzS0mXbQxQhR5w(rmjR66$pUm!A>hLyRnNAC!fN)(B^y$Z6ibXb9UBrcKHn1o z!klzi>Xa~6El6AR^lw4lAfl|3`Z5AXFl@s>Y!PHq>FGAD)XdnuU0HS9V}k<|cI!;c z=G-rD;lbj{G$#pfO%QO&=!OCE?a@Qmz(E!1bUCc@Y*FQp;w~8m3kq?`9bWvz4QFhd zk;e;Mkx0dTEJsPU;Yo-N1Qr{7auRktHw_ffRW46s33$vLF}5Sm$wH65fyuw)^YRsO zA3jqZ>U9q{s(H96`(my$rf&RtH}il-BZvd=Vz+iwhw};EWoRzW(EBib#&g(Smu!zGIg6Ly zr?j6wcV^)6O;}-|lPrI}daiWIB(StuXN9ErP;*JISKdcN)Sw34ie`dXroLtIZ>W|e z8Q?ywO*;*C0zIY%OrsvHr-mT>F>%we`+Sc#_gQ0dnw(Dh?EY(v`6Wbqwm<*?9&rAX znh4upSZeEj8)F2YYf28Uk&Hgya5Wn9gYE|As{OD;U;z?}S};I3h*2f3tW(^dep3%v z-d1*V2`Ky|vXphEtBy!q3&65|5umQm>oFRbTwd)Gacm(h@(@?&OIFIu1aOjxJCgce z99-8RZOP1j#C{OL-rkT-pO>@nA)55!v!ELBnDZ@Ana=|HIZVlqFvRdB44|)8@q!aM zgF(f9w`5ruh@k8`F5xiiEZ)SRkV_G_tHML(C`Sm)Jui;zlzH%qLVFyLyOfaTl*>hl z3ZaE_Ug;(tjU?lrGWzL3i3cQR)xz;;Ws#8^0_kxgKk6q`+i9*Dr7loOEng7&l?1BI zHABuPS{V01NUbR+=UJO3+#gn8J^25KE*D~-WgEG?G8ogh z3>CjNdHfZ1F0)uqz4*$b@1Jb2|7u~6st^2Oi)3TQiDo#gy3pJkX#=E&B20jL04+W3{8sfx#;q_~A?KM*6u4R}6OJmfH$CWKI%Zm3MCwrP~T z9_9*#jCk4)Sae%NCrjzPhH5im0DCVG-1y))>m$N+5OXtU57I+06Y@Id8`CTdN`14R z0{je;US=CXv?_hGfZRLwQ-`C#W%$Y(1?lr2*;)6vBCvzN=>Ua9W50_1eh_v)Jbw9n zNpFW$T;vj_wf(99sUlTB1xNBvc=tY-2uI--(A1N^P=?n zswM8qxFajO;SD0}jSJqv$=|HqKyhj|UZty@Xs(U!k%66X-N~2+Ka#r1AhxO}oUQEP zNhf=l)vyh3T(7-Q(V%-W(uW$4{u-?5AZFB-^*C44;3H=qD~P7DX_csyfTQm1D-y84YdtT4Vp=R1)L{4HW zuVMOWAl9aV?Voetht?E71U&e~m)7!fI-|Y=fzfw zWz^+Vo>`A=xs)DJrxaP&r%^Gxg)Sy34eA$OIEr!%`t)R1GD2n@LAV2Fjk6q%v7PXn zqT^AH)<`>M`C?IaycO?y$)uj1q(*BwP)j*l+nLF^(dc^v-z7LXZp!HOw3Vu|1~%ks zT^g=GM2FP{-igy5;8Lu22a7qsJ@%CO*Pqce_}*bfedG&osz=Tvva|bVDR0hjI&;fW zpWdm9W6x|S{`W@hIoRJ_)5<58TMu$#-r4(cG*CFuW<6h z(a5Ur4db+@F}HX9`Iez)s@11H>~#6Qx|i+rh~Si=ETL|h-G0NpzK_-1J<7CT*Q=uc z3fx`ruY!tYf+)o4x5*~s_)m0${jYB5{7>DGa-=c0CYNH~Z_Ae81P}>88z$%hBwUp$ zVeS-$pGngzu)CD~8Bf=PuNZBuS(lj(_b7n8W8}a2-8Wc6{C0CGE7ZVwq&aaS(5#oy z7Hrwmm#PQ%FuiYBQeu@Rz#t4O?+^Ir9wVXBRkKIgreMuk;7-=HRcffTL37zT@KPW6bVh# z!Ed|PAla`<=i6{oP8K_)t4h~xR6me9^k@zd-EtX7=8Z|LvK~=JB(aU_G>+f7DjHQ& zNCt#pBop|sN^|EjgBp`Dh7Ag(l~@_Y2|bX3%u?$r>m4|q)I1PFm@*LMi75i%mN?SH zFpDiFjGFp%?udt+5Ezrdg)n~CQ|QS{f~=fGz7?@dE8FPa9l^Rvy2ZY)&Ph!EK zJy_Lp_OSCnU-u0*?+xDWJNE-m-`iOwmKV`TDk)MbK9b)ntm$zNRkGU%D0=vrkc_HE zNB$9w9Qa=^h2}IZV=QAm;&ZcNlv-3JgSpOH0OA7yJ3@5677OSJsOgJ$DSFPGbh+}a zeOGNh@><&WM$=92P1^2#bvo;AlR!d6`HALxz-D1&c3@n?{xhch={crE=(M6H?50Sr zKahkPtxmU-Y=xi78_fsD1}7n*(UmNKe0vKHh$q2*ZaW_Kxpxw(2(K1eCHw@QH5l{z z3Dg_$8f_jR>QLLKQ_m!>YqDVhu~1;(H$plY@`EsX$b#uj$%BsFBoWMGB_KlJ;MFYc zt{{aB6)9nrGuC-G*=y(nh*@sIB=)Q4Jk^yi#&7vhqzXoX%-svru-Llr%Grht8|7TT zq_YrTht$Wt$WQIOTNV)Enj)Y@uxFt_3mSK#aN>n52E!gr)ja}WNI*1n02vQm>}~_k z!C7i=M+#Y{-;kyuM}Z9B5-P`FD8PU+bGi`B085V`ny(W8okn()xWezhM5AW;uV}<- z_`=9*Wbdb4(dOIBmTWge=ig*??Xzc)ldabe82<(&k+WAB3#UnOY5%BH|@>kr5+$3 zeZAd0(7YPEqxOQg>o==F>>fS(^sOeX8MW3a8o>$m1ru5Ut5>f_3H~0f?>@FBHjh|H zn@|(`mJ@D+j>Z+=6`Ybjrk$lf$r?>L)Qs9b!ui^U9wXnC88=WT<%vz0|E4(C-FiI9 z`zPOulN{pdwz<3I4Hn|L{kUNHcomRuHEJWHtzZoueu>$sn7LoMk8|zeFolach;`h6 zI@px|vZ35)THchuqK2{_ZltYfE#Un3b0g@mc!6~7pP#%uG;FEE;W;+n&*h%~=*d6l z`8`1H3fMm4-64`)@pP3q-bWBT9A-Vt7 zqu69dTC|17_^dUuaL%ysJezSTbE zdB1ScGHlj7f6e_F?ZMQLnYY@UIe%6CGs%*%0?zRtL4p(HEjDlpc%_;Qgzm2At*Z5U z+!)z*pMD?vGO~Zb|EIvO6=)42_}$e5E%=}45yxLW(!BmI`XGGy$mh+5_z(~I5(ofi zu_Wr5J6aaUf+IA+WRJv)BZ2&Mns$VDqIabp1xtu!kvw&t8^Xu2Y}C5^$4ti(_65u>&Y=ikADstKcUA{jj_(| zT=5a#F^Y+#n=#^syT=96nu{ozMU{D|l}1VXI1lS(4=Pc_ofT*t6j4?qu&baE)h~S< z+3NV5bBYDvem97w_Baw%ql*GtqajSN7^ms2-!ROb1J#u@i2W>AIm&2F z65yLDi^)S>I=Z~9noAO^)sB9y9KN51zlu4=ziKwfE$1}JFV$&k;hZRYMJuh*CUhB< zkoiKP$wNw;_*ta&`?^WUC)^29pLzh)z{Kx~YH^H%o*ni6=WXIo+u3sN0;%z(Pug(B za}25(Aw(SU%jmGCU?XyfHbE7l-FL;A=yX#^)nKUK58_mgCSc#^%qnW*5)NDEpVIv$3z;}@y)s#8TVOepeL&6hCE7f z=rxk4y+XbOOK^Q|Yv7LONj`4VTICL!K8O!S@MS!GpQ|WEH=Qm+(Qt9$rTgfI_JjjN z8v!rFqd>?@FCiDm8qyWJoa4sY+kL_M(BP4f8$p``?1p#82lB{^>3)ad3A;=;E>h=6 zXL;*~6!WK9@it#{GV&Tn77u#l+ph-A=}|(XEE7)ElYp&UdLr@a zU;76)qnS8w_QK~pB4b&$nPgQPvrVSK0=NB36j_T2iP4ib3Lnh-Lre$ zzW%Qm-gu9lLGIldZvoy5=(ve*DAIIj9)mu!39HqcKYqd2Z=WYQ%a`Ndm0X-}KIn;k zGU~%9C9nMXX!qE_YZC9TndQNA!J3`nw{Z^0U3AB93fvK9zsQ7Z|Jso)G2QvD#aufL z;`)1x5guiZ>8682_||h*HGkHew_cCRseR@c-281!bf`>Kcm6KL*kJr82;=;VFpbS` zgrRh8m)xA>yA7TbQPAbU5T4} zIE5cS?kMl21xXB{s3D#)LfxStrt5eJ*?E3L_0$mrC;(HXcu=|#di1Khi)KU6c@$3} z=`ASOj^c+>c-YQ#Tp8-=z2G2x0TfDP$7}cxmQiv0X$mnp$T>B#o)U`NNSEr#FlrMH z*HA1O+{|D|rA=6zG3fa1j=5VHchp?}#?ar%J7AF~=PW8FM!RK2ox++&9GeK-xc%k1 zbHtXg2_~KFBp7O2`zWqBC57Q~CNA#KoDD@T@1o+u;`j4JL7tnT{&6c8-4h0mE@HTR zcb5!#u*!}`0nD6P$R4Qa?Gi6KKFSe^I}-<6KG`=jGl$0alP#dQ3N>~rA9D4^jMM7P zGe1DDe<5)%=wrxIDySghY{|B|F2ismvo+{-rTM{*(k-(O} zqO&q$9ZquTg)EFWMbI5?eHsDjv5(@xWsa7~yL$Otl$EfPBJ^$ZCo!u)QS2GL++}1UnTj%mDqZjCox$QKZJb!c$ zgcJ+6#M9KwSmb8zR8ncUwFC;qYBx>F>_e9zv{ew&MHw4P#!J>mDP4)=0GKrIxOnU6 z{ncY!C$>1vw3R*5d68A+W0%Lk^u!-AEp5O_Y^T5rRmt5riT;Jn-JB4dCW>yq#7@u#O=Ysmx->tUoI8kvPF@$l5v z%)4p_fj^DRfX!;E#ZR#2dC)wf?40UW5F0s9&RlC2O7s;beEEt6EHWDiEmeq@=n9IeJbZ~;0I-Yk&Q)J8?+gC zCe97Cdn%p=>SwvB z&X#V!x|Qpr1b5D#J-d?fIxY;ZZ$1of$?9hxbz+#`oa^OG(*u8P#01#SVLo(b$l1HN zthT1RE0W{9cwcjMM7MR0^Uq!t9wOjoHs&0Ma|62f5gZ4E3a5cX`POk)wSVdDuhEMv zEqOg+|Em#BF14r<`T}S3iKODmwAylg9B;W0J9~S4Q@kMf z?RM4B;l&~R%yGD>+(ZUSr}K!^kRjPY(Ew7`!LS5K-~TLNEqh@>vwNm2*s{uGWkI)c><6#CTV~|Wdqi+DJ%OZEZ?m9LD&xJ^uc)$dLvc)fx1W{ z&+?j%`6@lTS0s|1q+}e=KrK+jxa2Be7AXhwm?fS08ZY#yCgdu%;shOSVF5+)%&wMa z?AUh`+<-kGE_kLS1XSDDAqMV_(xAwAB;CZV%EjegR`@&*?m^;Na0>>mf`4)9Q>Dxo zji=qR9#VbAsB1wv)iem*lX7zsVHi1 z@$p(yFl!M*Dvf3~e`HYtYoIw6@^0GnaH#Fj^H09_Y+cVJT5JyjoMFF97L-)4**8GH z6S_zxh-epMN`{kI@}ok}%yfF?=!G!blx}s;npC@+I?HHNmfv}@DDx0Mghfu}E6%ie z*&%uuYFA?0^1SP2ENcBVnT`a63Vt@aA&=H~H2vK&3mn6e&Rb)FP>RpmoxR!T(HMF% zOiPs^EeT^GJ>ohuXVqIkDj0=iaK?qKkL2uOBGwgA_z*Y?a+wMdIID>*Speva_&{PB ze^JQMw8+Pb)W}h5+rwk3etb|ew#xf*T@((lhfxCMoD+to?O;}9GG8W>6wr_nrU5&NjWjskpyT7CTU?T5P{4{dI0I0Q>M8AM+PdHBy4dQ zG|@0_?ycCY>BF);soDdxE8oZk=wf7jF=TfxXm2HS)?JRUvW3{MiL;<(9|3m+)|reU zp-!t}Frq*Ijic2np9aFHeO6e@|IGCZ7o(R zXApj}LA@RbV1>zJs;X+W6wP=?0lB zg9Esw^&j^}J=g${n_Fs9OS&`h7gK%SY*Rx8bsOk*S0nZOBVXP3Tc&z8tgp-9MzU5g zXELNW@xgPQzU|MBryx%A-V06x_Gk2e(BQUtlJ73agggc^-rN@_yFL%?E-|v-`nD)f zM9=Zx!4;;%vr-(KdWInVDyT+(s%@Su#6aamUzdteWfI9SsBh<^Q+t@;i=Jy%nBdDX z*lMu}O}oWxr6cjAIeAuaP^?fN7oyOwo;C^HDV0*(4p83PD#ZMQPrbOXFD|%nI}#C& zdfpbQ>R1Y>nl4%JseVFqhg7brh^^uo3ap>du#so)tUGS|HT-O<%`V7t4BPhsV&~S~ z#W9Wbik4)DP?w4N_@eGj+UD&-w9ONltTgB0_PCh22j9SG)mT}wBHC!z3H<_M?nj!i zg&gnYUT4#%k>AsIu+1OvLg|6~(A2k0p_J1R@tR+ys3$s~AgR!hb7ei@tAP1>{+DDS zTK4mcVR5{fVaq?kZk#!*ynI~qCU+wC7F6qWLV)KQcqzCL9`iU5?RW43xtm7-+5MTp zTGNPI8KmjOskH%IN&)9hAEsXH0ksRezQ4v!5W04Bt~|f&?a=x3w^X$~fD66(n*O$Y z$-n;(9+3agW@b$O12!DF@_|7>Y@>QFHXm{vCUE$x%`C|}g(nq+{?cap=l<1ZO1^^p z#<@?1Jfm?2j;%i!tv{d)UzC7M14@y;*z4i%5AOQBB`+Dqyo*4swBwq#neU~gQtS`$ zx%+)+LBSLyMVL&i3D{t#Xl2sF_ioU8q)yMylT?5O)vhfMeLa#0t2fh7Ve02B&&D7# zwWp_Xj|O9TnUUgbhgjxp(q2cX!bLV^TTZFa)^pT0AdmImrFZOCb5Jz?qEk!8EpR^1 z$#E2qTd)$Fu;Rt<`|U7LKr@sRf16Gqw$s)yaftHJKsubPJKlE;9N};{&O8{S4mb?c zTQq_6PDYZEp+x?MmTeIx3EhC9G*~SoY!VlfH^7LfPn`fP3m@Wm(n=U!%E?w8j)^r= zn#ifZb|dencOB%jPyr(~rzBKnd2Qe=)5a*)XlHt6qzU=9l$o}uYu(gcej9H@8?*Av z$^c20$(kO6yYTWHh(nqbWDNnSdkmlc>!^M8xmkGYqS^_7wbg}lwrR|h)2xCx5#cb; zo<~T2yPnSf(=IsfWPU9FZtP^FXqlow?a3>)ECVYxG9RygJYz~@y<1j!r#Y=Xm$Gjg zon>ev*2$XHG^(o`^{9l0Cca`^AN)Xqe9cl;>$tM56qgkRMMQpMW3MGE0mG|k5A{*s5UX?LXV&|xT z@ak+(qeQiHK=U(XPS#HtT4gKCp~?wLqcx6y1C=7MI~L*Wa8sxOnkq3%N#;vUf(-5k z6jQGI<_*8sB(|EqUM2HR*eCZX_u-Z)G1Dzn6ipsRWs?%3D`Ec0~>SU z+1p8tKNv^)5uijINgz)quq%~-G#qSbQF&EJ-%HyifZH`oRolV|-ja8MrMhOrYSpB! z4gzV1jJpxlF9`Equ!6)@O=#5GG0u*IF9e2{ zWRjhtW3!ng6KnW+Uk8=-{SMuxpC*8@ zU?#_ajv^(Z)=)|;Obv7RxVd>`rl9@psK@W!WDB-fRE5fDE22Cz@Km{K0BA4iCLIN? zNkv!}EDY0gE}ep8-)oG1A`+7X--sBXm7%JYkb-EzN@C4beCAOIj{oCNJBS;PpA*Ox zJ@T`D{0O*@#AeUuho9OL!?I#c!}u_x={dhm3;Av6!+G(06ZZr0y_44-L-&Tb{NB1~F*SuUV z=-po~cxhhAfihgQ|EW(YiTfS;nBd{|TI!RevYlmXuXo62%L&`Mc+o3>m)EL5g^Lx2 zps^jSXE>fer{z<=gq^Xdu>Y*3XpeZYEa6iAJKfUe$XXVLFP*cG_~;qOM2>n#Aq#|@ z$IRxQWvI~Arjrov(ssQy`q;xj7@y&OfNpzM7EEsnUo$*lp^*z;=~&6;Dj&a9Q*8^LEC=}NqyrUS}n zS8P^o_P%pU>(#?*o&gTTj`PD+dJep3%FSy2dk5R5ceFi#m2-AST@jDF%iyeH0VxR5eDh3hE!n|m4&xm0#=nd0ud$A@+Wd3V zRrL9)_tf+`>u~*dCd}Jm1bPn$G>2gS%lHQ1WPF_L!d<=>}q{3rted z$!3dcf5os4+BkXST%d7;BAEako!wBVFlsaU<1DLN6{zPqzVh?N1& z--N#UkxlO(gYlI^VbzMSPLBM`Zseao)&Jj;@K^Nu@1BIe`mcZYB>YuE{JSUNFGcv@ zJqdrQfB)`D_{(GYcTd7!@buq334h_2|9g}0<(cu<&+)If+dnUs{!WJf?X&QAyzzf; z76|^wS@@4y`G0r#{2O=I!ldN@0Pf4}FQ@;cn?sTx%fS;X2p_`88BrgXj8WR!$g9Zf zEv?yklCn57w!rxGYFl#XamDSxe@U_m(^wJ)ENLc589r$G<9r^X`LOc2H~I~*r)hx; z%{|U&-o-wh$Te#?t&OQ_r}{jcCH_XyW`RJSU-@!U z>6a_b9-%H1JZcnnC=%uYSC3^7({XH{_YX6C;$iJ@>nw%L#9Y*diS(wc&e4~N| z5|raG}98bY-6DW|LX( zst}+kw*R+~`!lxG&{6&EcC!xV)JMizC*$wVF7{bHZMZ zN$5>92d;Dg?p@OFtsIikS#{x@t$w3>=1iH!jA%jc#5Cl58wD)UBm07?g~|s*CypFY zP>%YRQ7(3^wy}O`1_NmWzL~aLnizS!gNQUf6oqgZ5_Vb)lc zqM=gB;AuFoc}y7MRDdbw2_-DfbTE5M7g0t@M3N8hRDZtjKW)$Gl=$Y;-Cp@JF+l>U zE%LJ7e@KU%{)oN;tyD%Libc#Dqz*CtosoFYb&bW^>MaEi!B7s-OoO3E3iUF? zK|m(jnkpj}bP-1!nJYJ>i#$9a_=jH&>?!9Am{9kweS{0AZs@t5zwYg&%dxjD-{efw zU3yC*QqyMtN`=D<`i`AT>82q=l*d14Z~H_hS+>6Y&np+Rp29$$J6d_L2{wIE>1EX$=r^uM$<{O|6D|L~mB_&YA|exj1! zviXy$X#90I{2sJ0+gSLV}&JKfwCSocR3EB7S=X{o~f8-GHmw5sg zl<5Lk3?e_byw3nL*v}uQ`-1Z76|V;75`xm!u0{DEM~-FE)`AQBfca;b$YdUw{8F6c z)bL!58a9m@7FK0->%LhRv3qhc<7{T390|oF{R*~xswXkozQnW+)RN_kq)2lMV_Uay zS{$Xkcr|63vCbwA%_y47cN~(jh%aUVihB5iNs()BaiG3fBs2HjE_kRsHPb=b8{3(X z(wT4g7;{y~nKnWG(f&gA_bFCGtQ|rDkQDh#LT~9jjb1Pcp*03=qiB$->mGoDcepwW#eGmCH zl{#GS<`*~Acn5WMr4+{_)xnGLTM^w$vOcF!mVA#xw!Lf_3L_+u?GY=9%#j}=pm-3% z7Wey9WR;2*8awR))&7QEKX|+2iw+jTX6w@?OZNI{-Gr%}1=x11!k;2QkUqa$mXW7M zt?o4=_?LaSz90-VJAYmK>Q!kylUY<~lLM(TcMbdGB0GH^_=3Bx}N?>+;*hVNSX3QCoV`ydz7LYp%H6G zFcU22eGiB-r=a{*KwPE?eUPp_n85eeYP>Oe-kIcKD+>?kNvBdA)QRtOlC652SwAgw z81>L z2BETwv%d8}HfxJrbjPseIAKTrgKKUSPTh9tAvVSSlroD`W@w79k!w z3i8yoVqo+^I}eC{U~a@kr0wUM9tAA~v0;{%4z$5>d+y0 z&QCl1*p{9G_pT(b4|aZeL|_sMy3mZm&LAqx_~X??6~RTXz|)BCTjV@B+@e4T@gVN$ z4bVR{%OO$ubKNuK-<``_!E}#Wu`wVH*RuS}lrxD1>+mQ4l=$nO74XBkcUW{nbS|%5 zxE*^jtgd-)*X_$3`E69$FvT^n+Hn1PjOmD48)pAXIyue@SSa-_xLxw(>DXtnJUueaIgNx-k>y;}gRSiOWH?I})*y?=7gG_pm>UL%A)i5hKle>Bo2%%vOXu5d@dpdShslZ@KXJ25 z&d5q!C7_EC-q~cMTcxrs2L61C2_#NnLn?KMV@Q_bB0(l`QI+vfLt7DFE*jLB&LCD_Rqj5?AJZN!~ao zAS5udNCAIvLXAfc#{}KVp9E(k$=^C;xxya=90Gb?;k{`9ZVjyG`Jdz{LrssAz_j`T52YVgwJXSNhMii zf_7?}gRdhz!>VR!1D_Gw;gJn(CDJB$@OjI8s4@+al%~b>gc9M06j@{~x#-IO1yKtU zX4)T=&S^I}Tv+KIylh{dq|n5hUmh;ss?s9U65-WI`(;;%^NthijaZmB?NCYNS!eC# zzZ%F)hOx2b@e~go93dxq*e&Z-faPT8=u)6^JWve+cn8OS3MO9~&%-G_*} zSKnpOwuX?oJF=6@7*=g`f#w3DG_-&YRXad}dS?_lihB`3 zdsy^0?rH~mEL}^WXcr*dEs7C&HKWIb@v1~L9fJOL-_U(;V>8deeXp1VO+)oypx}-4`cde||pp3p1$@klrM2*DV4zt6-t~0!N{efF$ld}k= zJ3#S9Fx|m19Zes0t|Rb4h>>GTkkSpD_*A>^v_y5}V~f73+@ldd=;ii404}F$|LTK} z#F$_}Rj%$MJbvl}hA<4vX=4$F(^ZUK6$aF-IIVrGxImdgkS8Rj*&n?N%$@AZEU2wu zQvc)uBf4m#+zNzQ@dC0(ySUIpW_}7b)(I{Kt;-3~wL=ZWjlqSfNatPrI}*~u4Z6ZA z3*3MrSVeb0kJeoH+_@cn==AsqmemqghG3_qv3q%slCjCk!tJ&y;dhZESXe z-Y$fMMb_Dad75j_b1A6u=}mew2Q~C=McfGCA)-&dq1~bfLh>dW$W?&s-Mt_$$JpI` zXV^n7=0Q;3^>Q`jW7;B+FIUa5WY0;7Jh7YAfFB)H?oIS!RyC_&%L=9KF=Ar09YF!l zhe^!r_vt?^Fi*eQmKz)gykWYRT+BvdXqHkorcw@}zD(`~J~{5{?Rex=_7SIh4dQ%q?zX4(K)3miU;GwVeM`eFIHP`pm&B~4 z_8qZ7DKMh?Y7w*meDSiaZG-AKPiJzKthrk@xaUZg65(bZLaCW{hk2D$nWc?_8g!nG z&783JuDCK1Iw|q*Sv~xovYAJtV?M9CA;djz9zmizxIKi$?ZB1wC26_U=7b*K`tI8H z67#-a)Q~O1rDw3wysK z(T?O9Xs~exL)YJw0MA64ecqb$IK3-_Ls=$n7P2@ao_J@sMVDqXD zK1aAVu>}iJ-0eO}DC4ocDeV|?mBa$1^AMJIBQXXRE38m=u$XIUImu5e2o@ajQ`FFv zGHi(+u=mj4p?wmao}60FFXG_R2@38QKXaV=B1##Za-Ds)gDo|w{gc|P8(Loe*0&cz zV9u3aas6w+>7PgbPe3L~8e(GE{~7uE{~o!_qW6Tz7G}O{valp9p?Q(g8Uk+irj1`n z@sWS*-2NGvfL~SF*c{Bb)hr3=BF&)ipgjdr2gkLGNI|+=I_It~qUB+G&%Fu803H zEKg;k{y&NQe<4d%v6B%XjDIo4lec0sW8}CocVxkpgcH!J$=bvrWRxTS446$hgjc%n7#i$~{Ts7>63vMz{*<;Jw@y zgH%;)vdWVSivk^=NNBw*XxUx>J>wg_$VT#L$ok#lSDQfGbgC-Xi-tC|JR$z0 z*-0II^Bej)3|0RUef;N#;h*44{|1NQpMXpM*F^r`HMoEO+rR&3gA3qTKZ>DRolTu0 zwajuIPVgi)^St*bq;!A-p#&ONlsoP63F#Jiv;Ixu3>=SQLi0z`N5Klu*s$)o_U$(! z<@3Qq{+{_%BUO=vgENxhAXt(IRWa2ccaLVj$hbO@gJ9`C#ZF_09=?wwktn!nWLk7n z5k;N`)u_PU8LWyh&e#a(RGPx-upfEZ5N+h_K$7{d|r2 zH7nr_goG%;zPjkWOVuN=QUJ5Ym~_Ye<*pJGTGsW(2kV(4^HKKTdzR`qm%Q%^Zw{7M z#~9d2oCm;Sfyzj>xEqS*DK=q4-gF$$mw`d!_m8&5jg-z!*j~`J0q9gAsM_sU`cBDo zwE2@Pn{40B__sQ;r@G&m`Xy@(V(;>qSMQeWm!g(M;6w40Ff!#IyAC+#DM6NkRI3*4 zl2QD*QtsCXi2_K(ooC8ick*=#O-Jd`2-oKvm(Exd1h+BgiM{TYX~}~~!g@-G`J_Td zrq=O)jySwi%W0D5Q-+6zFGDQ}Na4IikHNHsqFRa3xjHiOvo|aJR?bu(ZHRa3fyOu) zzUd%B$lO@B)%^8)uWBMijw-09m-16E6}2Y<#Vqv_v68?&2QdB$N_-+CbfZ+U{;{>7 zif&?M5OlG5qepK`9J=>pA@HosBCRkLAssKvSCwjon?|`79HlG&^C%cpEAMS*sz{Zj zVp}-K+QP!sx?6u_!frVHyiDf8FH_*V3l15*!0_2Ec0cXGAisffM}Yno2#H4;H^fIT zD-hdJJ0oe&WB5`6d%+(RRa7K)sMMUZsL@hau9TnThBK_e(=8x#979I^zhqLX654M@ zvj2R%)%4`mp(awDlVdCMkBRsSvbISXD!csN|)bqKFKyo zuI?M$E+j@FBpgex7I-PT)>kr(5sWWS`|;7~?d!DhsUOmiX)cA_(12v$#zwu6N+$@{9wBvZ&Zq7J;$pf$hV(jbq_@NKl)9~Fuf*zNY{3EBediEj)>l} z*Ox&0H5?lx53S3QJr>V&AMl}_lAeZIL3x9*tNP7AYJ{1I`g`5(Ed)s_-XZIO@rJVe zj9Tz6%xq8&@)WaBO;1=0ntm7cilxiWXP)Eh--jy3Lafm7t6q!6`d9VZe|Ks9hf$dN zFWddUPVi9G8M7o26pVXdY0gY^NHS3l5IRbzCdkDSNrmqxmVfd#F(_Y6?!Z5Sb>rg+ zzEQ|>;pJNF|FG7@$KM*6Wi6V&GohQwv=~Uj-8~SE{MvJdrY$G_{4u%M$0#<8qJfl0 zinEKx{QQ1VF>h)v67bbC3N!U5HBAB{;HuPRCtw!=&`w2jtaX5e`O+C<;KHV`ISzag z)?F00^Ni3+I~HacO~bxfAJSJM(sEi(lWoeirCu}%mT%b$%AJf>De)KRdXr_UVo8tS zDlXz^td@Pw1+8Y%dz-EC1wF#?m$3`?L;;H;(`!dS95_(q$ARlfh=@6YWhWx2m+LI- z>5Na(Q`;w|bCC~NXM6~cu6#>j7`dR4q-A*<9Is$AbnA@2UWVs1?KRFk zc^}b7AvB`_684AHvzN45nj!-%o9y2!uC8>xS1h|RXNqxuP2)Vjrg1`3uQ%ihLHm44 zMuL=Ys^Nhai2_Rn2ur&IiXh6%5mRvSFpdW(cn>q#+O9v-VOCW@Cz7@LxU^Fvo3j}4 z8r=L6hAvLX7Pd=>ebV5gbsDuac;x02Sk9T^NHw@dd5G7LSl3qAWfn(2FbyV4ho_2oH!R73D+H}rdKcrEq#H9?i8!dg7OGoCDWI9gW!dK_NW;95& zLkufS3e3pS-2Ck}tEqB3HPCx8aD$=7uF*SrWg;-B98y%Oe+WND!C%FU0g}eTk{A_T zCh9~?s8#p&HMd8IYq84{bhUuy4uQQ$eVYVx;7u9}dir)!W?L|UHmW{pCU06s{s%*> z3P<9I7a(=rZ!&|Z4XU3a1SuYohOw5+8`+#vTOZsm*!RA$6b7di+NKc_A-Ei?YezQf z9?THF({`j2%Qa{;{pa~hmo$TjR%hN9t1lw0n#nDa`$S3plX3Q7(~s~{mNKtWx2wyt zpqpW19#8JkCGAm&WU;(ev#PR_1JpTZN~Y$>T~Mepy!o z_hUzIkKuf4os{9PZWOF|x=_CwNt1Q@bzog?hJQ&pjL&dC8vSAoVm41O{*&}`Q3U(a z#2VWj6(B?h2wXLoJ(J5dxMM{Mu@d|4D;hisowYgElA_;0y>{+$ptqUz@pprt1}cC= z`0EyW{aQNt&vCcS!e6A8zQ8*{gIDTo6yEECrF= zJ>K#EnQ^J^lQo~x1??n^97q-M#5ffG`8m_=^)6E0Sa`o%ewb|pIk8W{n_&4!5CjdfWgAXz|4g4%l*a_=xd#CkGP~52dBX;urTlw z5D+*xv}$m)JqP2@{y`F9iJD*!ehg%0BkPLdRP%ynTV1V@kzQ;P$|8ML84q0g|REqVlfc1qEc#ki}J9r=xBDF|`#tC)msaG@@aWN{U7a>HGky zij-(2BcmiotMb9|@bVEzH2!#9m1rf&#GjfBlw}R|_EI9Ws`_K|^NKEBu-`B? zo6D(535i(rD;zD#7PqW}f^1wubfv^X8ryrreC55P9c1+E^qu=sqE4S)yFDG*gvAY1 z<%L;fhKf^D!~7N!Bg)(R6iglLld~8&)ficrD#n*mlOixM(8`@65_Fx&X?eyTACFh3 zgt*u_CDiTA4aHqnB+J2N}^`jlC2&sL77O6iUv& zE3$h#d%tVCR)!__H&#}p71$|%M~8*>D5{!Et-&PY^NUE3Q8#@!*#vM18+gU&SvqDe z>>9XwTZhIe|H#`a?JlXPUftjG*U{Frh)v3>QX#|tIkcjy<1td&BjV^5oLS>6pww}3 zCrFHaIMyC#oD|Dms07FQRi9QW#=7gZ{bEHp)nC%Y>-m1 z(>zMT>7n4(+T|0krr^#l;mNI}_^|RzgGVZ@b=XCKP1wkyV`0@+#fSoz(mQ*jH!Pc$ z*XN>nB7JZ~%A)@H?KN#|-`Bw=$y~R}+mV-7c6qGlai~ep)Ua)MJgI6pTSa<#c_zKF zqh)e&_3>qSY<6j5ms`~b4Nvf^wz{b73r@)yEGsYVTv4{DVt(T4b&OfK7mmLPQ}YytqM6(;zt` z=Xhi1@%)ZOGL~CK?|x%1rF}0zN?*v##n;=-Us*ap*)&k!wdSWk4mAzYC#;;PvXZc% zyeJbr0QBpt0wQ_=1A+ni1fu==8R#FM2@upL(C@+8Z@p7Q{I&YvvqvK_&7lj83O_Lm z4Mi9*zcYH3{!U?o>gmM9xy>8w4~3<1s_39pftX)pr}+lM=D!xY^hSFc$_*n?sA@4qdySwp}#xOMw?e%s`IP4YK`c) z`pe7A?Q+%0bl$YB-p!7VT+I?5OQyAUcOdK=jhyzeJzifFiEy=WTm9iLmvrT&2~Or? z@*KfXblLVsi|Jw|Gd8u?o7iDtFmBAf9okl!oqBHo?B&LVrfP`)*LY$h6S?(LLOmNY z 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

WZ$^ZNi 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≤s6- z>%o_q)XKv%Z4{eOhGr~KPO6Q9n{Lt4@>nf1$fLt46o}H=Lh0jS{{Oz7L7D^cN&Vf5 z;8(f+yNY;E^&yaKHdVuecDy^GL)nd7A+yr9gB;fv{g~rIGZaFJP2ZfodU-_?3Bktt zZCll)6|!&ML!x?})u`iu3Rc34pO-@6G`g0bgeSM|b39J_4kx{5MK#bZ_)CIcl z(|o-qeMEHvtZg^vY8=if+MVZ&KfW?;0oqZ${5OQUxVwn=at?S>{6nnR6hXAKdMGr` zAJHJh<+|hL*R5c!ZmSUv?^qJNjhXS)W_}URs_$a2Yx|E6`AW3AQ03qACIx`OPA?z2 zi|qm^g~eqrTjY`^gsOY<9-@iWJ(}|a&)xJP+a{!?*+c;PiS-0^CK~Qs)Re!a#n+0) zF1q|R@;>fNfmI6|WK1l4;7!Xn7z7~uE!#H1p+#V|iIRWxrTbT`gt@Kd`-7`4VYhiT zejsI?D9pq%@wOXGTPP8kknwbSh58D;DBzRk=!!06MSL&~rqTH;A*eL%W3)q}Ros1z zqn$7;NlZxNQp}`-fYA#{UQ`FNy4J_>;)(ryC(D1q|9o4=)Szci-XS<(&$z>plEpKw&FnATvNwW_&FVEqo^zixd-? zM1wD>+&hQ-WNo&-b7f;jIBR3<-Y7$Z5XU7sN6meao6yMTU)ib!tf)!WXJ>@t3hS%0 zF^c9N#b(ATqJ3CVj(S@pnogTDOnTA?G=>ddq~Tw&(0haM797kQisecq3N6BPQjR5$ z63kZsQ;w;2%ntn-4EsBBgPk7tJ>4=7~KdPCR!>GbkE+q1*jC7j%b3J(>rO5aJUhfK&=Ya)C4=#+#L`1@;uV zdS1AcJ@6-{$UfGZIjFN;luIi+$L zt^&)==eC*a4L%uc--ja1TMBM}Ejn3*NfGK#Oz%nUCsHItcx-aU6mWQoIH9GVI%*J1 zHR?}s2uYSF6>NW5;~-nWo4?3=tmPOonc^!!e4KXFEO1Q)a;%6F`^4y{S?w~2BRP%JQiRd)3jn;5qw2h!M?%}R$+-=eZjkZ z&lfVH7|0L-!cmBFkU(~dF(-(qDhXj&TJ%c>`6C$|D2;cNLo5owLlVNKJ5L)2!oM5Rpt?&^&=GZwmvD=gTAepxJcAH zyuBx7`;XMfzj=|&Z>^xcypBb-@~oWNTY1y3j+$-=zQ2NHkHY?uDxm~lK}7qpb0wO& z8LR#(35rQn!hRXx+6u^yix?-GSg*jmVo`e1kT!R;9kFz?a~U?DkI@NIyC%W!7IxeL z$A;?1W>X4q7qKN2_&s7LLs^B)h6X=^9SX)7N|C#T(9c3B6sS*iEldrqkNin3a0mQf ztAzm}Ic_12H2i5c;@165!z(!5n}8`cuy{5LVzC>*!078 zO?2CctV*(8gZu>88-Vqw5D_NuIWI&YSKt?ESXC*~OAOr7wK>z3RQ)>X!9K7qU8j}> zzr#VB9fFxljLzyo6i(p}W_qpDVB%%qS!~O2iIyd;e3xeVpa`D20!m{c4hik=xQ3iR zeb9WRJdgsxaX=YTn1T$#^B-_C1;2TUhTCZLo0dCwN9)*z2e$<5do32VrgtotU%B3d zrU=mTaKV2A+tu9-p?9`Z5Rqr9NkNmXj8((V08oX<(TfGu>^6Fe^v7b1liK)ZVjD#- z`tPslISWpIopUKxD0% z{v24s6&D@nxPzz$SvI1PjY$6=8n5Ex1#lMu^80GT(X^ga6^%ts@qQwHMu5-czzTo; zb3h8uzl*9prMaoj!K$-M`nfw>PWe1K1j-VlFVawB?%12R!dfUcjaQQ<_MO%Rc6$kN z{UXxp~~6D_vz|tKuZ@9IriktEhXCpMV(8}T5?zjI~rntfckYIzW;ss=PJEP zdsrtIIF=&wN{Bi|#2e9Y^)%d~{C2|&+pr#$P>*w~Pk?&ywa@nY>FxUR?~*q|)r0}( ziI)YxTzK!kww|lL{_7WSkXfZM%TjFGf;S|q{Dc^NN8V$%(T(66!Zs(pRI3nd;wpr4 z7YY(XO+`Qk7ok%M(ZAR4Iv4^cf&+gNg{hfr2z{XIug3_jG!J z6uC)%#w-wbvLrB}1lB9wH%1A`2&~^#irIDgQiM?kYu!AIj@mnPBa;T-$wnOET;6x) zaw8YNDsHH1jQC82R9X|h(r`?1u8jckhYil;Vg`wWSzi(N-obCP25YYLrU|eIDcDgK zJcL2I=W_N30P*F(t`lJf0XC^OnrmmSwEn*0#e(+}vEl9NAE+=Ya3{S^+eQ=CMTZ)2 zz&+YmZ+b!!MLL-hosZVK;b5OfEZlIS`X3_rQyUD&f@TE_n@d2nUs$FHj25KQiHK8d zR3LD@EVqvem@%7w0j&z~hqizqu{n zNUa{JxK8O#uxo2WPWUH&F)=IC)J}tM@UTeh->0!rqhqPbnv(t#8x< z>9s<0E8^qk8dB&Y>363mXzXopR& zm@llx%}CWVMd7+!Ok?M*`ch0`iKhV7R2yFsNrd;a$>&!{$>4}AE_hTDIK~d%+tqyT zW?1~kY+v)7G2#DM1N2cB7O_5Fr3!AH$a!0ZH)2CJyCld9_wKy>$L@0JftYFnm4@iy z_Fennm9sVTov8eL34=TX{31e63D6ADaIz3JnHWD2&4rP-&Trj%)40{sV)*%1*!69h z8Bu!8LKJwm_4mN`Z-zqP%JoyD203&RlQI7&TL97d_cO!-{aYRt9)-VmfkQ;!ls+Ku zz#`}ftQZIy1%whOGixV>gV+C%)fg)K6HWCn((^F-9r|Sqlg{$TnKdD!H zQT{K|jScM;gEuI3dd5?%ty5ZmN6`<`cXMH%h^}XV`n-4bA*Iu)p||Ks3nd}b4P01? zD^^Z0z4a3=w)Ap*A|hy|Td*?REKb?X5xC5QiZWi+*F~RR7l7`&?}{yZ6#KC`f9R2% z7*#;QuSFkHb8d72cO+a3Ei4aQTo{ z0y#Nj^xUuXN>90Gcd{${cb}6Q>Aw@8eXG=5Pw>1Kt^9}q3^5wXfogFf#wy^W z@?cwwmw^EI{0eCHz~tr=v-U@;$obEmC0xSG14xzU=~@n-O|X|rB$z}`fTsXUS-KQl zI(^U+8QX#|zjh;pm`Uw-06{>$zuB7wn~?w)q&V&CD94=3afz^a0L5=d&GOJw{)FTK zw1pq`m_%FQ;OT3FuY$^Zo$yVJbI3>la!?G~%Yvr~2{;-eg^o{=Ao_^#EF$c>bYJd# zSl=m|lioVMOl*V*Dl5e#N?mOscgkrmk7uiw)6x0Q-wrp2pUgfG!z74FPkJKNErB}^ zmCyE^IWDk_ADj5^8MNpFJYJ+v=|`U90%4F3Q1Qp9hVVB`cb-)%IQg_ir-r zjdX^2zX$9HcwXP^jGCVbcSPKjM_!%BWIfP6B7q+8R`9D6kiq0Yk{{l^1OY=0MuXuRVo*lOTEligt?4{ovC*PqoQkt|VZIgSvm3I1|#5XgOO0 zw47UgUre9hwJ9)jk4DZf;>1)(UTCdyi|wP{3wPPLTse5N@NvJ+3G;&{E74l6UdZEA zPWP@G@J;b{p;MQB(d_s>R;Op3iSJM>&gp0($CEb%rx$JSSge9ma`auIA*&b-pOZ2`OLCS??e=V3%;_B#j|^|7lV-TcF%%*4~>H!?wGv{A4{C@T-9@ZBuN z*;#ed%*EMx1qIj88j3?;qD7&uC@`{kREt?eg)2s#8;|BIpC9Dk+7{R1f6FLA+Xb}+ zIXQ`l>aAkeI1ESjEBJhz>#TRMHsCg!IW9xwgWjL&QSl0vIR&qqr%mesOJCwOYV+Slu1>>J+pByU zzu54^ajal85Rzqo+JH(n;~E47?tX93+kRJ%&^tF6RT1bn$=49h3VFCaw*uTx5L?1t z>8ABA3qihljj<*1Z<}t@VsXa{MAujP6VI!xoIZ07j^D}?863#?SYTk^>plN(_2#47 zR*!vH_lz;w9t*@1g5SNlo{_Lz(Tbi$z+ynTkzsLjhIPUGNW0j4XD zCF=oHK`&<>Xv%S9_waTL7`hnLdM2#(v-tOcZR;g=58tfiT@1a#!c&0Sy&jS$nBNg` zFj&|h1_-uI{1eCnJ1upMrK`thG31o;l;tt27g#d2cJrK8O!*+OF2c}blB{z#eHCpJ zv;M|CYE7{E>7VDfbUc($o@5M@b4SZfV|^vI(IJ61RpH$DN2ffwH(pw^-B2nke`K4e zP|mEfDsakkS3*sfm5!Q6SKfQ$-pZIk?g%wQ8(3%w@w-AP3K`E_sMU1bG>q?zR@X5| z4cFhltfy0td?nwL(vLdJvIs3HKV)3R+_AKyYhQVGUitg1taIacgO&O1yaKD4Dh8aL zfB)5E;*3)6+4%0&NRxdhPJ9pny_Oc*y(~7iwz9@ML*l%w8=zX)}V9ueLC%m=yy!We;4Y zd|LHQ>Nu|U>3fF}aZzr3&bba+SnTT&PlzYF5TD+*HBB~1Q73wO=~4t%JG^`o%ttz3 zkWQh(ANUBJVTe&-kIqaRfzk*u80YXX+*c%I2B5%U$m$rEXlqmRT3+OJTTU+EE+XBw zS0D^e&^!rPDE%Y50+`kPO^jU>7G%9Rw>I|*P?ar^ve!t?ny}%X6?s8U} zw!KY$I|)jYP9OUjexTx+upPLo0eNH={ z<4WVN|0=siTT;qVO2T^yZ|IQU(rOEsUE`jWDfNMyd`MCUlpN|N_aeFEFy)5oLn7bt z`vq*nPg<|(k)}*9v3e$L0l2l~`oIIgnqV2HS)Df}EEd8LzWWOr;M1jbXX4tgg>CNUtJ9yzZ!krE2DW>fT!7WH0eNmqlLvIWT&pYzz@pY^`<1w&S5MUt>z;r@8q0Vj# z?%44{(?8>t;?Ju_Sw{nHl2?7NUBW5GpROW|k90cF1HAb6jIFX)dT#9ys?=OAbYMjh zEqqISkI@4Yb}#DkkTIKeO(y}J7z|`*3)5YpDfhtk$-Kaz8!}!S5HnS)?pK;N2b01M zHm}KGBPSN+r{0jZPmL6$b`s1o?DXtMR9>t&=I@y9c1O}#XW;9~fb>Je1~*ON=d3pL zH*REGFXQuO_jzOS=)3bkg5($D9_{`39TGab;a_Rj(HW*9GH!YD$=JOcc&KdwDnj`| zP^0B>R7QOGbY4yz6-~u1cou)H)L;*H718symB{4oC*444v%$21RlMmE71_57&MHk( zZII9GJy~=mtNztu1R1hVI}{8p;DQfqIF~p#j)7m$P=?i@KJQ!!PyA~Kt@M&2rkbT# z&V6g*bM1_96L1|7a$&{;y>OFii}HCf*J=1vXgYn-UXUWL8bTl zx_r!Fm)5Wp8U2ShaP?JQa@Dh|UVpVU6p=Sneu*nL{0=t*jc-L$`xN)kcWv~xM`S-{ zgRRHV*WS3GorZQR7;vxtu=yEe`Qc2BTWy!Inti_=9`?FL^e#8J?VR>M94WbhTgQ?YbQX0fW`#Q&^C!!zs|z()@Os&HC^r|%J+(g+ zZY$m7DbVuO*!ije!Y(6Ucf;(}2E7r&pvpmrqzbJ-!^3e1M`C{O-GU@K==2aG2?-%L z=I@N-;l|BrkTbGPL*0=?^-g>9Gegk$Lc6#^v>1HTxr)uV*veOlVgus$Mx$XWd*-Sf z-s|3Z#yrYV(GcfWZtuTfVv8#S|L zX;noE(k!ywsbf3{--U$Wmmq2E+--x<9I=kwAmA?MvRPmo4q_fv98D?aWyrmrwg$xc zcKVQDBLBToee^2_KwtgDMqR9mW5^$rHCw*9wH70&UF3!0 zZMNzIqU$Zvo}6ELaVY)IS{i2tQAfP>_xqRamjM%(3{YCO753%4(tpv%dj*TM*$t;D zWFy`P_Y45pQ@G&pMgv>3A_KgFH$IaKaY5!sA@flr7>x@AW`JZf@iBhq%)LI+A<(O6J7>7;d5uU_dDCHa1-g9ml8PT-qJ#%)Qo2dasQuM z39Vd}x_x|5wsvQQgM9Bs2x{=!qTS`6{lyohH+wT&$70T#^r3sk5q%U$iiH0;^8B5c zd-I7sq0rW-35QS9#nDMnr47f=5GQW44STgX6pOhgRY;uFxXN})96&yqX*ir*{&Sj! z!<>375mqYWHnzIYiEu2kSkB@U*oVF#u`Q`WxY*`eNO=|;@I)zyP0Uvl_-qwf6$H>Ts$CMr7=Anfh4SA!>n<_GVve=T-XFZki=e{R(u4pikcpx>W>;C+B|W z>1l|I?A~|UV_ocwYDazRitZwia(Bklcx&P!*WwS3bE|me(B99EN{$bBD4=JS5%S!0i_HA zTWov2Gkb^}#{|57cSy4tBhs?NdOAXLiH+d(4uyoIlV6`vAB#7|H^BqE-Q5yQibe-L!;%(&mi!?`j9Pi_eFgD27>3I)cQryvt zVp@p~UD>SvA1o=CkOyX*ik|AvhYxyu>vhy`+_;LRJ#~^PwS{cE0Gh#l+dwQ*Dmw1w zgUI;@MPywhpc^`mn*(Gi5TZVKk3N{i2CZ*AAZi;H3|wI?!B}&^0daw6QNR9B;ocMZ zk!+Z0Mxl8I!W{|ks%oC_5KM6SB7cF%jH%xUN%ocT;F2?s!}hX_YO79I8jm!q zWXcb`G3Obr!0c`F-I!jZ7jo4-^5V$|-;F%)@vGX|*I05dc8C!Af;ukbs+?cBd;E%b2QdPe>BA80u9>3*-U`+wAX1ki_y_niLwQ1&0>!BZNf`08Ro zru$1I3>s9qE%(t~dP$TQ5FW=jx6Qv#^w@%=z-$p01fcb=ubYz2 z4kzcb0?^i!0)lPfc7WF_4)8RHL(CP8iOco#QaC#0Afj3d${hz^HB|Kt+<3swjB%MTpAOUif6HtU8v0;-w~VT% z&h@)3UE_szy>JKCG!bZxs)?Mpn79-3dFiM6(Utr!jGohylOY0b(!IK#@j5n0uctih z#Kr-?<%u0oh4g5*xSw@}Za0fAZ`$NMQ=nXryMzPZ8^48|Qaq-#eE8I^bZR_s8+)j% z{BbW=7YW}&Zd)`yW!w$%ccnKt=9((JYWWVaWP?w*h! zy$c?^J|JZUDV2?Px`K?Sui+m?MnA)JLyX>(go$w(y zLgKUq36FC>b?s(ULoh+^4`_6M!9n7yn>XV*1mI^}!N+y-F$gSOKOtRlqzfLL$pQsR z;mAf;T!xwKCMC#`za8j-GA;0^G=TZc2^}AJGK395~EZ?Lx>=jbfVBv5)@v?V{ z&dXHfmSZR8J)2DTiXY@I=j3{v?z?Lb9rMd$EWLnqZQb=h3a8|KffX6~^Zy2RgNZ_m z_6HOw)U6g44s0$hn2(sYqOz2~##=6|cDQem<;ORD^?G?G=$)f)yzq^x+R?$a!I3uw zbFEIgsR=Dha)5+LX8VMJ`EbB`dFsN>iv_m=t$)t0?1HQt&h~}DF0%{gTx)OF~=B+T_jU#-}G#INT?MIX7(Xb0TTdcCp8st2rO4PN znfQ3O7@VHOHiyQ}vESzrLlLF0*oK&Y+_v7t)$Q%x8C%#5<`eU}tyQkPzFV*>q3h1& z&q>3}-=8J+zPbEak1`=smVDpfwrWbC1f(W@=r^@%|s-=Gb}XZeo2&b7IN(0!MjjQj?RWOdh*qV~ zTt&V@a42KzdER1VQEgeT3n|rym|tRe64_DWyr>y?BIF)f%OoK1Q-_c1TR8>Rx~S^* zwkg&AVzqR307f?`*le8A?DGmzIu_2XfTo65p%0l`vJ2#jip55EB(8y|mT5^_cRd9iWzjjEm5VuHqC zr-ju1w(5fgOxDT`#fo3KWscRI=fo!1`9U}`>z@K_&>4>%$#*}`f`=o|l^CAa45;dj zI_;14!Z&bUe4UkIB0ra8&0=_w=iD3KQ!!yjL0Ib(dmZ9jF<~R4C8Rt~ZrsR2*>`c` zKgN;zoag7QUM1YW!ks?%gv^Q%?NkIEkvq@(MPT)fJWi%Gs@iXcN9_T1M4Grz_y;!@ zfVd5*>p#;pOMwt(N_R#Z-8#89!??h##n0s9MVvF2s!~G-p#=ctkd#Y$xB@n^6(URp zQc&z%)58oo%eG*k#PzwP&}E>c%d8x4Rm4<0&uQNlv&9WN_jE_}db`|-arX$EN|mKz z)3!2(^5N87^R%i0b?rrkg+@4ajdF_#UyzMmzOl8Ga?##)fl{o(-L~z5E;iLU;JAuP zt0jMEdq5sBWN=)*ThLoKY@wSIpk}P~$o}zu9RgVZQ?%{6x*JRh3d;1_any6-QG#p6 zc+y^T(@`(`!A?S0C`Kg?Fy1|)bL26$UR2;p-fQq-^T=&OY|8Jo1~=o<|D)i%|EYf5 zKm0n=aW;;1taI$`5VF!a$2wMKb~;8v$SNb%ImbF?R#vKGl}e$IO1;mqNo7^q$4Dv_ zrBKTE^Zgg@AD;Jh-H-e6%s6o;pAcNniu6}L_3|pZXIZQEM81yMdrx7?WY?15EILfasPw5u z^A{!!l@ouaT3G;dm>t~pKnR19NK%&9;j)Dj1?HRR$RtF7$E(u$|KSvYG^Oli=MAx- zV6J+7CK7WO3$E2p9-&NqvI`h(?AVWVbX;T0defS_?X)n*xek(jV#R?$^JfO)A!J() zOlh1=@I$cC>Nz-LQXe@lGhDPH1eCI! zOg~G`j)LJ0$DH6!ucQuo9;$6Unf&5eiHQBZ=+t%I1+GM!R&?iYTh* z)ymRMxR;DDxSW!cHh!Hz5^;8qAXX+EJ`}fF^9OU)WJ~9{e8vyAnRU0`4zcdENjqv% z-fgz3<34D4f18$HyhWp?tpLmPV3Jy8`9iD&gAWCc0?-x8ZqP&~y!3B>6Z%rI6+HpS zuuVmzM8Xt{Dc}Po$|56X^Kx(7p$01pl1e}}_w+1=N5yOn=h*9ei*?tRxbCqcGTWN7-BgKMq6b9s`T z<|v}S{zXaT2*az^whU!Lc6GV+bF6BlbL@N@u*3`!B5$Wlwp{nGiv8Vp`}h@<>7$LR z{;XU2@YzeCs~ekMplpm+sy$@Zzh>)^8{)!7#-5Gad(+N7-2GP16*!&rdloGh+++Tn zq3D-&vg3ArGM}!gA9>M(D@22s!=UPk!lN-P5i20&G$<&?x4m%-$|R#)?lOOupv%r^ z=IE^yaeUmj#ro$9>;_UEx$L3X{0|*zipI#Nc zQfS!MQ_?wdW|TWS>sUH5a()}Sr{d|Dc}>NDD^Zs&Nrf1z_K}3HGs*jSEWnHfv|B;I z6#@v0Zpfw6dqn9Y5W?%ah@!gpnxheeHKL1baZ0YmK(@sQU}%iIz{+x9RHp+Ex(S?2N}Rww852wm2gEe1$R?3v8bmFH?=q*AG3g$R%) zNWmCmI6hl+sOVYv(~_3Syzrt%3bm2M3yhcAvq&>*=^MNAsG>JW!<(d<)vvZmoe^@x z7l#PTnexeeq6-aM_)hdoCbEUUcRN#K1VUjclLbZpE1aOxJZS7(cltmY_3s;{>2_|OEn6-KWI8smKg1QDC^__zQH0ibKjQIz z3ovL>ksQFB?R{;j&KZx*i<`FUrc<$LR{NDQ>Hwdjkr$$&m=`5Kv*ep?@az1s=Cc7E zVSziMbY*~6gBWc((5E#5GBJZ;vH-JQ035F_o9w+yv;RQ8z?1>jkk6z?SDq{z{K2^D z7CG=VSxh0k7LD+7*yK5soc9d^iR#jf_z*-E%Tb;96QB2Li_yjkU>_fBc4SwrV|B<9 z&8-5BWYU@Ceyt#I^CAthYy$~ezLDx=0$RQ*d1w*y*7UraGt@qW@_tSWMv2M>wUlpp z+xKKV#MEV4BLwp6#JFXf_?0I`!Q3;*nUtS603&yAF-OWQ5XK1X{P|Fg6ji3(4-|rN zP?pjF6W^IPT00 zH$m~RR14k8%>R{lo^}(P^qQ{h!h3@Un~aPQH~G7uG(=PXfz<^|mJK$UCkxo9r)sq3 z)6lb@9=TG_DSS?kh`ZRyXb)yvtUtCL|KJd>dh>WTx&?IWDhLroQ*1fl2^6p%IQ`tD zcVEh1P0g$F4mKJbgIV!4R=ck|-9k~6bAl78&fv!W+ zhz&T4!&kM{t`7ELlI7yB#dqb^rzCqbDcU1tJqep=w_NXnen} z5CmSP%MXCCoqY-wt6BAYU0pyiGV`%+>G@FZwn^iF7TZ#HKVg%PSvdF>%9EANE8LVB zdNEqWFKb-o?q}clT(Ll6*x+7&dH8~@{W^C14OrEi4V^8*EvxT8AlM$aY2WO7U&`5T zfmrfDGV+TlPG6zb8q-AzWi5x>;<6fpK#4sgf$O9T>r9(UecuU?m8y+VZ~rIHf^fv4 zF70~br#F1v?Fjp7Z-2!)04$3-j&z+(ql=5;jw)>LxQ*-GBjGDfKUGo0;+t0-*`N`s zbIe1o>CnQS_g>L<7OgC>F*wOpV7zQ|I90JHtKfcN@JH9y*plZR9xHqG0u6WIQ8NX% zM&Ay+lHc z)(8u|ykex8DdPtaQmGitCd<|Yxt%iy+Co*^e&zj7*26|U6f?6z5-NT1e3MQp$_%7w z%MMdLDu;}m8$7T4r|I&bRIA!xSSw8|m4*%Ccm?&Tr8?;dKKNMK$C<$7sBI10xue;0 zU7c=!be#{dmi-RGFm?UA{5S+-dPL0of>XggsfYTD3kHO&<%4vZBhS3Uo%gWj6&PP#}f3OKBA} zQA@!1XX^IO$c^v9uF$cmG+A8$Ink%ru&T@BtLjn*csalOl+c+BuC62*xLQO@hJ)8q zai4erj|%-B6{nr`+i^U9aoI*HoF=&nHn64RlIesE0FS0i$#b;p=y?8sT8oY1q75RF zeX9p4>n6Z(YS0vx#fYhtRgoODi=IFEeu&pZ)VMa`SkPnlf?38b*Y|EiYDV^pbHSoA zHgg^*O*gMO$+wtO$9$3Cxzqxi(n?5o%Mhd-dt)Of2o8}|H+6a}fDz!hTrG<+;xI9Q~v5C+O4mNIEOmNdq zagLzCLnu{eQQdeU%d8Nmke*Xu^y|3Vu8**D*?!042@QK+esz z!%PYS!`6;!YF@EI^8uGzN}DurCt&*SPLv1$YLY`_00`YB`wqam$H9>Is4i!)IIHEjTQZ)bnR3-~eA9F( z7N>aUaf$rdD=z?bP-^(g(wqLbj_Oj`z~Bu8yRL15BKUB5_9n0iCg^mu4xDLnDj$<5 zjUCbTSy~js{j^SPy7zxwj2PQL%mV5?>mveY?fWUt$nyP0?}FZF=k6hlkR083||j zV2oAC{hiGhXD*s-FXY}_5l0K8cQkEF?jt~cHu?B)1iJ|P^dm1*%cZU%(|$&@z7!vn z(NQYyR@Wy^bd2%H-+o;_pK~~Fq%kw?_`SJ0xi~y{)O%^d;iCC(Kcfb>yUT<1+@($4 z8C<(Dqdrso`}Z+zTt0)GMQ!01T2p?vs1#q~h2=Xl#XyzjDXiuai^c{mNh!WPL{wA zJWC7sDJ(fspdsp3acyNzt(A_XcNW$d9KnH|;@NMW zW$|MD7l@`9=sQk40`VjQH6W&uQD7Cq2EHq}7#C65&#zkv3bw z{Q$o}#QMjrS7H zt!-8;yKzeB*2^OuI`O5Z7x#YekgBnRG&>1kw6RskQQph|ns(P_hQs zd&xiZg5eTh8cNsfi~H53e5@oCbln+F_(uVKpbRtP_=A085*=e)2fFmizO)A_=QFB5 zSSnRi58VJbC;5bHu3N!oCe09J5$zEk=sWi{> zr3qAC%OeEXV`R3Susf?F*2VYcR5_y0LC?V~4P?$5#Q zECQ`m4^ZHBu>Rny{g{S{Ynnl{v~e$Wa`hdTPg{e&{poK*@+Ct&B=8$s|2x=1gp z=)^1-QWxKEh#!&<>ItzBJBx>FT@|1%e84Tvk>sZO+Y1%Aid%fTgu9GU?OJa31EKU@ z=B($&2tFc)Rf9b?qCm9eDw^K=xNrZG5mxkYf%SpVyv`hDEuRECGKDWL=rL~5+h1TA zbH-wkQmi$=UMH4RNUj8F_&6&B-CW? zKsjuflBPfY;$$8b*S`V{i9P4lN95~<+;K{ob;@2Vc3n5>)zFF zb(hR9U%hya8>kv8Z9ZXxy|9K(w6fXFMbi|+d2g`BEQR-HL6(mv2j)pa?C3ItT<1mE z)Gp+R-)ElGiayUhhTEfP^(3|L$3e*Cf_O2h-SPSXoAT&QfkAjCN9UH3^0N}S*fTAR zb?U`hlg(_q6?a598c@DTR&bJN^tfC-W6uCxb@DbVsMp@VQ4vY}gfE-U-^prfGq;T? zcF&al#LG1*5jr|r=i2;U4ZC^vI>{$TXLiZH^bXCo7!qPcdSNS~wER=0&f>@8W7ydk zpdSs=gh2njT-q%?-;T!*P2~zK0~t5=wO2#YJ*2|D2lwcDou+NOBcmH059!j5W->LOCyKMgI`23%9qnEJ$+W&^kfjru<3I#7uH_i22* z^+SXRc$_aC&VoH_Ernkz6&Fb;!G1)DNNFAc<%Hl&*(pXKwE#e>r~Z?A{Vn%qo#-g3 zRUY~+8#)3&3x{PEL%XW=3|Q}1e$l6cP+u#wD8`udc#!`;4(i&K+TUL(>wR|LS;P!s z(14@lxFZHqJ5T;*cN_~7Bj-P6|+oa2$Zvo zPH7&dWbL)Em8x=US$FM?2#+eWw+m1$sNlZK@IdA;9M)BYS(hN4_DAw}_M?kE~o zk7V@M)j0>H^N@XPStH^0-7_}dd19MU>+A8D?@UDtzMU?cknak2DLkmilnSOAL<3@h z1~0oGy`+RcAi)1qcFJ1+{6IIKx=h=13J1{^Hn!U2&c+f<)ZYSGeKCwZwjO)qqTlE) zTmlbBUwyL2Z^=&E_7B4)@1I^|aYtU=vc0FSU9!iO&G*uh#RZ)zLgL)Oz5zylIC3fE zIbBG}XF1MichiLud;w}74b{YqP+dYwm4Nm?ejjt|Ow(d9m9-T8RVDq4>-Hx|TJeXT zIRz?9ffFLjU_uyt(K^;I$^aBsawYu)s9yr~IDqK` z%=-X%R{gPFFgz<>svWG;E0k>KA=-hiPob*UG}IcS{O0@8n()$(zlwHUR;|fZE6@Al zGDV4>%18wni{pYAjS|oh{C5(BYlLee;Vg`yM3N*C7`8IT&9I4nO`r=P`PKIf{Wb)i z3Hk(l>G^IhQ>wf5kZ&B3rHR;c%3FWbW~0wjBI(n{Cn_qU?agmOxk&!(A^L&wU4IH-zGS9#{KvxE<<~#UywPRXY)Ct7g!^-`X9J^`vGJna6sS1)x&oQdo zcZ$&&;^RXaZZ=P+DB>3N$eREngQW29i_Ko|yd`!akuPGMtazd99g!&=49F+4o|P<0 z1_SV5wv0LtF7wG=OY>zaPVz8LT667ZckG6}rbJsNww8x&=Y@RIfw=JJE+pe@m^;0f zST4;xC-#V)R5;gY?NVa?Ww4jR0|JfG)*J3Jz#XATmmlsuYU{EHhkxC7WI+7uOkV9! zl(p^EAUNYxkv;#KJ?B~Y^qeDz>~}8o*9c+`n7Zv5f!s1^!WT_TQ?78 z%7ny(K=927z;;&yNh6=7@U;?12BQ!FVF@6#3y&7ntBbp%^l9)I2Al!Fa+u=jKNUIg zpCUk_>L5`m0MrY}F9}_tgzoCDn!01Ef5FlSvi>|hjblftc1B;;#0R-P^@!^bTDqBQWOmjUP{UUqN@$oN`9 zKl5X>mR|@Us`@-p2?#dpORhO96D_1@x~7E|?0oGu(Z6)8hH?AY<*sDs+krYo*!(=1 z@65E4jf{!ILH3!(Wi08`dI{2;RL<0)DYjCO%l3Dnc(7T?4W=R(sol&(#sD}e03N_j zS32@}c8+<+GXyuJLmq3ywlYGVSacr_{qtE&&ouXHzv(g?FF$uO%I%aZNgg5r6=)MX?~D0Hus)3QZIIz`AI-^)DC{rZSztRl0kX;0xu_#c(SyI3}MF=_p}bS9Au_MvUeEPNF8l^yb_4kFcuw*L zfA2a-cAG8bPL=7SO1<=w=?VQ50P9?3N!kPQ9H9h}s#5t=RmF9>Eb7?SrDR86|Fiqk zDufRU9j5`DDM?z^5Ei{LD_aAf?k;katD^ST7 zW`>Q6_p;IhX;P~~m=sgWWlkZVge(pL%iQab9b=Os!A+SAm59)p+aa9KI`0#!ZoB5p zWMWu|i`*@7eW~)i5y6e4N8*^U0gy;CS@f9zyDtnTuHQ#&ay)13{3Z4`kn|g{wW;$) zvKrsnyS!7~JbyBwK-X`_EUVGBcS({!{XWLMn9a+p@EP#4AI^8p-1;cLP6KU=)?3PY zTtky*H5&}EPGk1D&$C?nbj{c@U=~|_oC)cy$IjAr8ADKfkoR8Yy&Wu-d?r?rB*W-Z z=@iBlP*K74mtHUxk@-@QG#Q_dm~g@ItaPb>IgF32ES`V9Vnf{C2yGtw#WPXWD@ar` zWB_vK>b+xu|HY_YS@jn&PiuNAGDMPuf-q0C4qW41SE&b}A?UaJEtx~oTZin3%+?i2 zc^VJVuq1zJL&2UTGQmtg6apG!0X_vCXXYN(WOf|w3_W}_G|#)r^4>4~(vaE;y(5}U z84pF|>qVDIJEuN^$_F>7k<=fI#TrSf{BcnCG@x**UMh$xty}-c-DfL2!udJI1!Goc zqWhKzb$Zip6VBXPw=rzK#6F`wBusl3YzxsT_XMKJ)vrWDGLsbp0KSodXFlb$D?bX+2ha^?se zHnvh%zC-BUd;s?|M8;T0dn8o!)ZI!ZkRruwUlSsVsgmo=(|?5G8Kg7KxdwjEix=j_ zHQ9syuLn0$RRdqA#(h@tmOoxV6}1i_vZxwqY~$4DDbjPpM`<_yVgPIJ=8D&L@#jsW zckjqIX4n-jD3mnqW`G`s2w}5iWUu_V;I+AY=UT4)4`bp>iX9auB-cSt2Z7f(%%dc*0&q~`J-EA~GaJB5ILe`#HYVSbHEH~?- zq)?Vo52}7E2%7!3a#UUrabI%(_opYY`qbIdyg)UR4`VCiH|Jo#>J`ckh*EEs9O8E& z98ogzdkgqK9lJblm-_Rv3uJlDp8?o*$m1n1DSa#J+<-TuU>pEuK$*Xu3AN|T?+cM1 za@q+H1(iB%4BR4)!!M*FtHe85gT8a(?f(sKy_rP%=huiFFAyEK@RxwQX-MP5r*;A_ z6d3a!o<6qd^0%Mm6W-fN`k^0!<;nk)WBpIIhINjA4R5!64ixD!N$NAHsWE*Wc@nDo z;(rWh4He0o|J%weP}~EkI!^Tu8id)OQMbPFx@XANqGEgV{hY&@edVZRr{7J(L&Fux zvKhoZPKiZ#)4;mdH*a2ZEjuO_WHsq7dIW0kId$FNCd~E0MTZxQ68CZxF+||m-2*md zaJh@*rq-IkGK`!SnJ&cC@3R+?{RB^0epPk!O`F0cmnf@dc9`t{c4cL#ufC({C!*gD zJ++aRIq@N@*OLM>n0m_im_1>1`0-`)154}muJ;~Z*8d%yGWX{F@fDPybHe;oP!4V} znZ)M^>mF9dyvT`92yK$qO!43vjtm>Tdzm4OdS*Myy4a@U%k4OmXlI{c;UP0&w!2VD zkFcShT?!L|Dd--SE~@i87_6ddNXJcC{TMa2#!o344hR!rIa&CI0X3(L^SMrVaTqz-osla(9NS_mhRJBigHEkZ*;t+THdHNLvo%sx)haA4j@}Lu z1MkhhGA*s}p{`s+ziN4xgP4(Rf(;f&sNY9`daDmu9$N1sYt+q9OYNjX)^|J{^zN)X z*vS?p6ZZCOr(JfI3CVIkpH^KWlA4w!EJ!ySjn7xvLw?_HPHUoLf?COveKOOnBrF!T zUTzEBf8Zy|=WM58MfBAUdz_!~z*VWhxc7rTo*s9vJ}0uW`Okul%$EGZ6y#sA4^=)@ z%RW@(2Y*3eW9*v=AzK6Xhz1kZgn7LQ$+pL9vn%S3^#KnkqT|t|+`X?um*kG#`upoE zOxl|t^uTC>4A#x&PZ{V2qI)3{FS=|*Ku-VvcKbj`cOiHYJfI4aUKy{|NK9IXl;Upw zz7ZuBe%A8eL?X_#kMAx-t@h%FbSc}1Nnk|vbUy;d$h5&4&8ZMqMr1!Nc%L#bCAoQPND^TMs7Nd7Qm@M67hu={W2 z?0y#Pc(GL4V!fTxNf!PhK3tP3GYIwbff7}#>uoVd_d&O8NYmu2TTEuyAdV42Uie#ehhGuEbA>Q72;ax9jJT|M~6M%~WQ6Rkt+@InW!^mr@(`rLsyZ=iSf zVANfIL}`NaOUzrROT`E5KHBa1)CB{Wciu+dm|)FzKHM?=9LhYptY$DbE(lHM9z6|V#9}JcmNDkyrB61XC%K>nV5Wjhw``pox~`89vazEYBwi&omw-- zq@aL~2I8TTK~{1FnW+g$vx?59w3aCUfrf$x9+dL9#ZrE( z7W3bdN|Y@p=7?7y@vV%g>Kd3xb$9T{Xdq~BahyKQE)Y87vA=@o;FFZcl8m+d9|;eg zv(^T6-gcZBO5?lM#XBr&`rawv-cTmwaqWI}64Mc};GU7!ym&*+5}v-ZXY?Dz!zS4x zR!mR((f&wda+VqTP>OY_05imf98jf+c<=a&NVdfHYVi7DL#4 zGzkG$m`%!FXm_w~qx7r2Ef?sRtss?Fr!2pAD20sE5AA5#DDZK{-SW|Y2`=^IHzke%3vNnatdmlNrALBu=E z18ORq7yHsZmBn5lE|!#?@o1RB)T&%}c3Hj5TU&@b=`9kNAD?eAQKnzX93bc#7Re>E zPTgA=CM>oWfYC_`784-YOKLVk#sKWb1+cXP&W-NVKF?wbqHlD`0!uW7g)vFTTG->X z%C?L%Y2zKp^2a*&&rnX@aSj%m6Sqfy7#>S_%CJVU{Af{Lz7t>svym#Cjo5v16B8e& zLYucTJ~&cCx4Z4mWlMswgYIzL4L1AaItO?+Dxy%hnqPj?K{SBpCpJ6BMU8_{Nvub) zPOaI#bv8;NyzIT3JDD6umryC^R1w(`e!f2<4U`JlbMOaJCk&Y5;lJ{HdqBa@$IfR48GhJ2lVSjvH&mgIq z4C66;6^t;>ek+_Oy&)4}RWdQnk3rxWw2uFWKP+h>`Ne*-mp5zQx4zR$blja<>9+CH z(OTE`X@14`>1JaEeVOJ9cl~qpu15Uy2-3qQv!2k!8jK7VWaQR9$NG3j0?pO~e zePVxTThyGm9ji!+C^Sr-0CayHJdk;6)leivh}$5cHCbSbF2KMY-nt4F75CNzAV*mu ztt_Bp0`dfqgs~tCJkcr&&es<0J#Z*6`_Ms{iU&o7dpTK4P37U-enOe&z7G&83A3jJ z7O9R%wu7zV50_9>^C<9fVE46-6X(_>)9dv}OvB(?CPvLF370bz+A}hD60pGl+D~Zq zYc;Y8mRbtYIQvU{OHI7C@}N4^xYld`xkimR7OHjE-m+mSFL#k+BnV>?REZZswu7%Q zMT?k6&h^1RGDZ2}kXTmwV3Oy4EX^w~F`02mR-qYdfTARA3d&8<4q-Vs8-N%S6 zCAj+0F6vZQq?njaVdM_DNzV++oows&R19JYLqsF@iB(hAD8%Th<{Z$@`Tk z`|_~h7L|F9?ma(fa68nGil`V!sVMiaIhOO4pCT;~I}$1GkdR8fY;OA^s_K`B$sFon z{fYFm(br6mI*5U1C^!uYE<_f5F~yB{S+D*(7weA13M*sGAz=5)+-0c?vrg30&G z`>ldhc8Tx+@Pm)%{z=LO@Ua0@xJi!DMv2j_b|8d=-T)woRpdn~{OANLWEK340>*G4 zPw?9QtFXBeBnCL-*-f_J*l$1=u?-{t^uK5lsUoeavLbNW0tj3q_!SD)zXX<7f>7DA zkK&`|Ci@=in@NSv#xoReuDvCN=VUks_HGc(#`;>g-@=TmeS zD|H^wYXr~Z*3Y`WS3cUkM3itSJUym{+%I>3jd}o&#-24W5-)n{hj^|DhTxHdc(gqe zE|`F|QQ;92sDJMbcbfHoGvT`JxIcVwg!`2Us=Ty=&2K)^?3mF8D=~xx{U^lT62b%k z*b4v$m?ke?S7d`ueF`PoTfLi*bg<{?#0G%_Ho(x}V_D(PRwrFOv=FfIpx}mrOwq^FPI({ zE($Y-(5GwtqpLu%yGZIE5YHX@%Qv@Zp7NRO^;MvVU4SUrfN$}Xrglb^G;B}?0QR>~ z&0QJNwhAt1ff*A>1P|FEwDre}v|SSYY>siCSCr~22?-x|a4=p?AWPGu-Q|r>%PZpk z_`i0-amz$j>Tk>lAs5O-ltENR2YgKoOd#%l0XF)5Sl)}$R=W+NyF=r1>$AvE1L|pL zd_(16LzRixtd5wBVd`dfA0W)}J)YzBB1-OK@b3z#WB~i+mBtUR&WvQ4_S>>EK7o}J zX+^?jhM^AF1@fyysyS5}Ug%Z`)+;sCX9P&uS=Kbp>CN?3%jgpC9P2v&ToP#FA4O&e zFJ+KxDxW|L`4%1iFL}JBh}4quSPZ&?>#u-W>hcz=5E>d zp~fGO?29Y(KOYWOkfD*nHYH)3NCGy3C1OJbOU92?W!=Bf>3?=wyzTY8$t)qV_uh_<#^~-7N}VG8plK!uY&~cUQl-^6c3B3mx?A!9VvAa zuBjSP6MR{)qr5?-zmtF1z=sJ3531~UP#}escxx42DThj@TzJ9@47-BeJ*SaeHymM8)vL9ysgBlAf;oE~q4{wR%Z!d+#Fb-hxN2CR?2Q zU1K{O+%ESt;FUw!xb+EwpT0MUw2CCTn|))E5FEe()|$#p)MG-=nmF2MMOB(=RNfM= zzO4I=Rdq83X~zvTs>f%=o5P~J)mmJ zOTs^{O7pdDRy}{JLF+!a%>zq)(08C&>?PNnIIkO*b5h!q$1h3%zwb{QxS5gf@!xpN zbi26we{ZPw?^Btm?!Vij>xQp~C&8BO5GEk9xr(??5%~fj{~I;@&-~&lP2|6*P`yRN z_zzcpBf()$^krwDeH17bam}w65V9rjyQpGw7#qVZ((L6YZ(p@r?yoLm;qOL-WX|eY~yHr&?h{Qsr zR=7>dzbN>wGo?o5IjpIz`QMrvpDABUy>g4^cVgL8H|c}xluz8R`!-{1`6G;Kuo_G}zBL!xeq7J+U|PI+MB|3ReXDIKgkLB7qgIE! z8FGmRp+=svvu=hyJ^Yv;Ym`+%GZJ-Nd2yXNPE5oN8Ku-^{5hU7eqL^FxY#v*VaY9V zVW@P+Fob?<>Hg%$8b52=iSK()7eA$bh5K3)IX|cTRMN+E^e*oDf$Fe7wQTZ${yOEN zzk%H3^xqwkiM;}NZ=u0=y3U!Lj0{02wqh2} z!tFdf%bf}$$C-VAlYM$aYUM61Q}dIjMjIi{#P;wD*nREc!*X%$S@v49evSRu>5zq; z|Nhwa(hHDOO$0fMaP#{ZR~vCD&s-n;d|%<#^*am2=Y%rvUu!=9AKsn=?mld}r>`Ut zKU!S!%?dCuU+nyoY2|Ad7-np-4hosY&#YxzPi0(LeLntA+s!sl?d!MwJ5u4S9c;=n ziN`hfO9d25&$mZFG)92tF0D(v#vyg{^;MfK<#HKE{BuNoro>O0$Dnk`;#z-l6NLwI zC2&@JY4X%V^o}wvRQHv0%5cE>IE+#_ zLdKZ5$*wzJft*rSCkNkQ2DC9imvx|Ug-~vc>GJ$;VXe;YH;Y`$p`G0c7f)==eO?-b z9SBu#sfYh~G+1mF`n$owc*?dh^Zxd7hg&)!XV>p~9>HxF}W3+@e+28esX4XBghfvx8eJc@7h(tGh1VAFZ>rl+!+hpVemnr0MeAh%a02Z9p)PkQzknQ+IeMjU&)0O8MQzZl_gu-fVJDBw$HDn zAMDOL>)%P2I-j`+xj`X*uNEdZB{~x-gi;pVXx~#F%$_?1Log<-S& zlz;yHYT*+Xv$r^I0n}&IxyW92(>6X9dvqY?z*1N0uCpT^I>6BgVNfcp-r(a0qrbKP#F?Hr?N4MbM z+kE#=2ItuyaeJ1iU=6~I=$K}UQENRqM;VNbcV|mb1r%B4GNaltHlO~166o@A6D*>_l}K|w#OMKqE5}_x9puxHPGTbVixeZrGJ3AOslp%c@x8t+ zq33!o+39F4k`K1Bq{fBKw;ru&CHuVsQg=#Nu>*V=Xpfx!3y&;UAB4W=75A$F5_fbc zg(0zzxVk?y(Q)GqXKpdZz;6@S=IxDPc1#B*O*q8V4bd#G9t6K#&3Sx3L^POZL;YxY z^~yxZQ73+Dpp~eT@UKI~snOg}eaEw&9wQ>nec8duhpW~iC4lXo0m61(?`!iNbX?La{IQSoj{mSKLsXhNy8`TNit8_&A*={s%cp{BPxQcB*r*5v=oIbY(%b*4#%3p>1w+ZA6V!n_I5sT9Rrv%zcEAYVOw}sU-E@ z=3W#fNvesYQc3Df_0IS6{TE)3^LU--`QaR*s%;kuSywx#Z!oqKH#*>9Ie_oLrC|l5 zPs-7C)n;Ly@`uGdw+P~Jp*|K^i*U0HlgPHwB8;OW1COFGZ@RI?I!jwhG8kgTrh~E0 zDm_a;?_vfc^o%UlKx&5<4xXsd>pH0yrxV6f8Z;L^?oQ{JM)<={Y+Qg1_L@e0&3@7A zDl)&8qTHoawr7Ztoz|GgMy(`6bvBupsThO$6V1M}4^CJ&p0B~ZYk;tPN?}%bHY$vE z^hD1v>MGtG*$V{64FVkB9lUTt+Vqy3+zB zNsex!!_I7m5gMdL$ikeRXGh^X|Fl}r*V>6$I7-=84M)*uKOIGwe*N zf>^<7lv6lxsq4ce;PSs`DrZ(;5ltDEIGxeAs&}dAon?hZs;3^z&jFF)uC*3hn4R?x z)>|!fRv0BkJ<;nP9cdM{6Yh61Fo*eIt4u7JdGBT2*Pj6M`S20~?Zy?x+Nks>6Sy)l zq8xuZx68u8IF`ZugoLF1DECP15oa~-b2ILX=c2cr6H#%h`>Hm+acm-@rbE72^F6Nt zXY`$Nve52G%w!lI%_Lb3N{Xa5mN7pSY_C6j?-a2o<**_Fc;oqqZ|c?iKmH;4rDlGE zH|p(W(t3q(Ln&&_^*{4Jb1lq%NPSQHy@M2o(KsWP2J{}09&faPIsGeO3HW!zgZ$X+X>ld!`>IbfTnC#@mI0H(6 z;bI4d5P9`9^NjG0Ff6C59big>8dQR}6C~N%tkr2q zY2PGwu1EimFrh~$!7FQ$|!b63yj;g>l7XT zCAb#TTVDXs?P6`a(pZY4oK(JCx|Q?K*pZ6!_E)0MV+V+4AK82HJo=hFL0*(^ zH*{{iz$iV3A#~_KXG7Cj4*VO)X%ID0&y-%@rMLTYRhG>_jVBEdyv9C2lj@a78Ho%` zd2K<_*6VC?R7yGC8r`rPbx>Y8Tckx!&l3-54XiZHPhHAPm#biuU504dSFx*lbK7fK zXg;pfySSkrptR=b1?0q0%>9^G)LYDt>)MjIgNdbsQW9=PA|!CsaP@(#$M^%vpTf)! zhVwD)o5^kfI@~w)<|tx#d&Och(QOMbbglvTcl63#?*02r=aqV(Ln0TXr*?YL8UONr zju+t+5waaA;T)#2y?shIce-zUVsZuu+jLHC2?14=lN~M}-Lc1;3b#eD4oxzBsnBv= zXbdmQng>Wt2Z0&@$Y_oQjb+J`lg-^RfhfFiQFxhZjBCGR3cAPw0MEqdU3p1%08sA5 z0}>FNXv;ioM3&uveYQT2%>=Q9AUzuB*sKah$br%uNIN+$p z3Fu%~Rs@xWOw3Vd=B**FY%=a8tpmvV5Wf{LiV7hM9qU~_BvH{+u z0-vud;PvWX>bE8>*213{?YiVR^j{w8Ol;pGPWqpN9Q!qPiG2%4?3Uf_b`S+UtPjlO zbxiTu-!FoyqI=8z|B+*GPyi#4dhaRxzA4Sp^C3oQ=|-v)wnZ;XnGbfNfL`=~QhCfY z0myg-{;DQNZwhToFWZR50-^%}t*Lcu)=ey5^AQJ-CC$&87e3qGg)SS+V8Ijh-kqA&mn=7Q-GYYtR+`YW zPGdmF(AnuXv*K1j{w!qlMdoKK|F51?L9|)*6_86b8@UMEa%*0 zK5pA5X-%5b*@%|F1W5j?rj-Xqwv!TMALI zGO4<_4-S?| zWo2cIj|9TZp9N&IIosJ8K5@((IbJ8S9e*jIH*F^PvJ7itx}b(pD7dtz%%L@M%m;@7 zrcyW*{6f+w8^q%tcZIhef+M?Fm)jQ5Nq7EwJ@|zUnBcKtU3DzFBBxU0#!#T?6zGhS zo`ZtuQ84Ic%8k?L!y%H0$4|kUMUT(~&ZDtscf&L-COL+fDEJn$)DB^*=D7_lcWq5Qb$4;jD0_^bbpw7 zA83^?$l7Z9`s?!7S|aN-?SID&15k5Z#o)N>?NA!qcZzdOBa}<{3camiy2(_Xt?)<= zEr&LvtYoX#RekS&fH%5bdE3wSU;# z$C3{{2rIZxxC~`!`UI4b4V7;hDsQ&941OTpbv{g;{d9|{#W?*svGnzR?f7M~EDSBD z$X897yFiMMJQU@m+0ShWBYWZBlx+gc)@*;_Z&+&VT)H!;1^3#)s#d3#=KPpAe1G1vcbKMv5eV_SED zeFSU@g_|@9O~DY!z8tp}wq1I)q0ug2oA(A4b|Ps`Vqz&&Hm#yh)D7{b@vbOMx5dykEy*gQ{t!3{>3!!R{fu{CY8f@V>(As z@dvefyLh`=^;!T9$UAI!FZ|pJ>DUT2IQ@Y=oq0>3xmm-+8UJntw-wNtdC08c7?E}&Mj-Yv}|)r*B;- zb~WJZFtJR7yv|I+zr9ri7P>j;)helHWDLB+Z-lp?djk5r+{C|3NyK*ZRz>?qFMS^> z&h|QDwsoh0#L;#t`?Gm<;X<(t^Rn}~UrQ&m-aM|}{eAo0UC*z}4>D1JP2;Aw2k~}^ z9Y!u(p3Re0$HmjYy1=Xmpga%IdBPG**mC5_DLSyo01I6 z;Iicu4dYt}dJgI78hD=1_NvwnPF2QFcE0ILx7%<1_T@gq7e!@f34`yAiT2a>5i}ik2 zUf)X)Ej{;Ey?ut@A%A~zQOO*I9l{0Zye(BQzmHz@-c~v=nH1*19VH@?yo4S%$`qbadxcp`QiI@38S<=3hBm(QBaPMYn{j9B3G1 zTI5*)6ur&L-3NT*md-zoef>iTq;-G8^{G!;RLfIezcH?oieC#rMe|5ZxialYQqX=H zBlvuQp8wjw%t7YFvpBF;OT8Z=fH(70J>i?fto<%#VkJ6D-gd%zI{FDmtJK#p*b%xW z&NuJhsCUtrMDS&)4M65xOnl3-mea>jvc`7&jUej5gwL}FJCEHy6Cg4XD|?J24Q}x@ zDQ;-=QZf07ygnjilBCr1ddfdLeX(kn6iV7u=%prC$-n`zMhsLzYC*vpPEjJ(XXLn$ zkZbx*gng)RYqn0C@H~3phRvEC2_%(=dYh|mw7@CwLLuuZ z7v?EGMF)CYTr+79Pg|AM8nY`D-1Vz&@*&oVW11G5I|rTS6LH>F-Aslr)XVjoJTP^d zI6_XzP+NADdlh52!zvRvOR zQMIo{tjZ)7qPm)B7fL5));6#wLy>*LRv{*4c(^0)(aEnoH(hq7E3_N3;-Bm9iw1(1B&VefDZ~?q;@7D18liH4cH-7y*{?PUxYyyD}l;E9xUi- zg4kyGdcaT1=)Bmjh3@%l$v+nE0d@@-C5J62bW&hu*^~O_#8zl`A_z}~DRe7~d_%oz z-o{E;kJ9wY%32VWW%PQyN>d=-)Oj#B&ESmRxB4>H(bSvY-|OfPTFGib4_X8z{!bY&RmW&NRB8 zzc%}yt6_XJKJHp#(euIV!#7JN@2w7L6vN&t4%!C@Gl`l_1UCZ$%d_6~*^~79leCX^ zInG1?Xgh!p0BW9xY9A)BHA4YBD?0Nz#T7kuuh3R!5{wcH^Hh7n6jox~Fe>P5Piv!g zbnghduUdwI;Aj+Sf>b3eC~T5j;JGiZ{)DG)OKr4U@XikfZBZVkXpl$zpt@G|PB_(Z zym*cEI62;!(sRkoJc{pjK&SO~ggzJ?f>q+5weIfs1EeV0WxF}Qka=X|DrJLJnt2^z z9~yrPmd1`W)mXPXcvvd#fLDo!16%y^a$@Q|O|5Kg0N1aecd( zkR3DgJ0OXZLJLEgP~HBnGIM>Wb%iGqN$Tk(2#N$NPoxYv=DnMIX39UL1kFQjVl;}+ zrXJ~^8j1h4Ht<&SC>>Pq5>pne4p6#ah`+pMnNr@4u31z&Oay3WJa9?mztyx#%$>fL zC@xU}CY(!kJw^Kl)4Y6?c$~&0U?ma9=r`K~w8^&JUXjO4YgNUELUMd^dJg@~b+!Mc zUeSG`+u@c}+^J{sII-cb%|B_jJzFMp(l-sMxedm65(K4L6%^cqRfFli)Oo?W<>Ssm zBXh-;wx>~fWgl*&hh)LA&D;{V1-UJHBsuUUpO&qlTT>~YREHi^wK1h{A9(V4C4zrY zZME0X<{Q*9e@jdQ3##e^%=gvgDm^6#5IWRB=e&DzE^9z=nh*e^NVrEm{xyCQG;DJ% z=bdE-4stB`jlRu)3uqc53f5~b77*=2WtteUa6>P6U#FRM7VLN^=^>91Kuj45_FC3Giv zVQ?5a`{6e3X5l&BdpvHdBvK)g7(2@kaB{^xpeNpo)VjLk2U$HDJ~ZrxOf1)M^pC_} zCB)14xYOY6FPH`Y;^sBd@?N-lu>fiX0PUV_ap^tM-czET2vR7ds`lQinu!MKERQXOUEsNM&X~#F9%kU;fz# z2(MpRyL|NEJ4)3U;<=!T(i8kVIQLm5QOlHb-5$YR@&GP-C-jq3r(sfwU^BZ*dRZ*h zLmV|a5NPUA%K)ZKKB-HpaP#59Q#mfP1Iw#pqvJTOUKU9cLQYgMO?%W3Q}{t`Yy~={ z@2C6WQpmvStW|AU?An0v6kKMdC~-ntgZIF938-#)Aju3%O{`gMROY2#QlJpm83VWm zwvsidJMra4D+gG)cW)|FQzEoa-DZX|A9oA)T3O|vxp~o`foM5SX?D$J(lIKl^=RVl>eHY=&d@@hKDht*2F z4qo;9ln&AA0wYpuOMnOyEOTTDV1#G-)=J=&q|{1MnvcF)De#0H$fQ?L!T=*T<~7nq zuEwLze4x4=NNsh%O2CqJ&~PjRqHi&cX31J;zz7SG!$o+-UvjU!q!Pd=s0^m?_rHkz zpZ~JdsPd0YS$I>?qiFDCpo^9rThCeqg>cj$E?MI&+r$AUB2)F-gi;cbfPPDSjSG9m ze4Cbg*~is&dfT(AgIrxA14M&$hsUByq~7PwEzVL5p<^OVAHKk6d?-{t6nJ%Pu%QFe zM}MH+P~>Z<>em4@Ut+DLzK#78qR>>HcMt8mDKz~;GK&?br|sRi`t(T40SDeiP_$TS zeBf7&OZ@Be@#KdxH1=i#NVY{xY$Q20h^&8I(4qmAiQ-LPV8@h>T{jH;?#N!6lFpP? zLMRpB$MZM?ipL0&_)1CX_1`)kowOpR=N(Ot;y!OdIhKdi=d+- zli6m_?0dDjW;MZ*6@jEhATh0gFjVvn=!(@eiJ2%wV1?;eqN$_MD4o@9_EPqXWRkWW zt+gVNwYoUz_)g+^$a!;Yt)+y=Yk8gyxhR#FKPf-P->>^helJ@F#{|H6LFERQ-fU?p zpYopo%qb)?ZKDUIg&eg&z;321)LOJpokc-#=j>u+;>X^e0yJD2J9-s#B#Z?|7}V)A zoM}ZGi7I%f!PpXCI_Uo^-4vRxL4a;DVbbt5R%`CFoZjp z2HI+58&U?29rkwYja7FA7WpHX-!OTJ48?-KsQi%|42;9y9pgT7$22e{w; z@{1j6o6VDUFK;*<#3N+xiQ5(XIkxEq+I$WuT6B7XBrA03zt8E1$@C)&6$3enEhKLT z;G`*7 z{Y6%V$iVCF-xCw;nN-$D}68a zw(5t3T~v<>yXN|t;+66fvIpzoyT*xp3%TNce&+-vaDy_pvb|aoU-&XqJgb%Cxy6*r zB+Cwp4T&GM3ph$#ro%k6vr;uy_MyeELG@HXrZ4G_skD{uqKwZ#LeZ6;f`L8$!@7gu z$Wdd%2B1EdV>s=W%+~yzew7OGG0b|kbf~%@G}jF36Z*|1@-<}36}M;f6Z7v5@$$89 z8;u+CGO$3fSU29rxsO;|tv?mFV%XRg(C&2(jb}m8r&<#AN9n046^477wAi;Do%wOVq~FDq2}X>&AX~vIOz>p7=*Cc-+%X}{ z^@0_3=YBg8%(26EU;qXgfPUA@;RQciXjofa%IjatA5PHyF#4QNg+>pQr70f>4nFWg ztPl!zYyrYE-zk)l2x!+GAOINsLg`(h;9jj622{x$t1(R|&o0$Z)V>r*Jo^VW`lO45 zsAOnpl8%ANi;kUTO|35)ie^;Kcle^5Mv3xhj=$YL?MlGDO5#q-1AS{? zU?B14YsR$tYx;y1qi`_p|5p`3m`|S#*Tk3x7kH{LE^lwp8)#RHrA7|1=|1$3sWgHh z%|N*?&B$%NYBMCds4Q(?@91kg9so3?k{tEP#y*^)L(6{C>Rt(EGF{U4AU8y)ct-^P z{`kXfoB8b_kFb%PuQG0tQOQz~-4>PNh_8Uiy|>Ip^`nl1b=IRos*-$VIggK-y!F=kUGYwena z6wShBH_L`_+xBaBe+5t~Q|L~+991E|w_3|RGx!ute>S*wc9i1bQ(JB=QV;@YY44s~ z?RZ5bNRmhg90Ig@3#X^RTK|KTg%rNJmSZ5m(ub)K;irTzf)jyCgHIM~K`?zVJTq}J zZ~%@TAcbxpuHnVh8y%iYV^Ky%=7(T9PAHwL?cYm#UxqI4yb6JYc{%eZa(636RwR60 zO?3_>$uj}U&03iauPCDw**J!1yllJ z+t)_$)%xg8ngscz z_=5E9f%o_IW|?qz>vJ_a*x#T7YOpuQ2{qr<)e)7AkY^9GQfnGp9u9_zic{a_6ntKz zEMHo-_U&LPbPdSL&Fqb16>ay(-u|ie>lt)KWIg<{gGM*VNmTa8bYMm;osMI(xJ)1 zS=ID!gv;N?xIUx6zfo^eq%m5A#IrWRE{|K7wt#_{eDco3`zBzpT)|(MDd%ivJ94=S z?Gt*|3oeED@OkmKUxj^3kNLYFCo)YbC8isqyUk`=cuzh5;Be6ZL=#epAH2Zy z)CmydeF4V$U?NK1j-OwRH$*T04i`^Aaunw!$@PO&E7`dR!hQ8Q+pd=kea#`#KR*s= zp2r#sBH(X1Dn|hHC-tOo8JWsmNpH)5Zv&jGHa4N}a`NA(D}M0l8XGB=nJlLf=~du1 z(A_dYQ!Eh5HV(R`yxd=^;{6P_`{+~3#hK{WWkxbhwB+55oIZD41BEdFYbv|Fk35?G zQXsO&k&j`I5oE5tjCtyO=1IeceRkMMUB(>O$hY4u{|P<70RODf+w0n-f1N?cs6*!` zzM5Kxr&eO8`B-n=qvz!&_ace^t+hR_an}Eh@%)Rslk9ee{i8(to?L|qE&w?|#=qdV zz~y}&N^RaZ>y5m#W5;?^uh8ppR=&}X)t479=)A6I{qGJAoeA;R zp#>^TRyaq7U|f%a*rhLI8R%z{E*exs;|5ghR`~-mHmK`a5zb0eDs*Qa8>5_?v?!Oc zZi%~+nTQ*{pnT^p8xxxNtL9@}7O~%!H^Cm0LSw_z1p@tI$=NHSiX|neEGP|EpT==J2s@j2f zR@&M*=rymSh4%ooMKiT&|D#AX#O@ISF2Me%rMINoP}$6R%Hs-_O=IvA+bH4ZeFcZ~ zOOMKZVASk2pAuV}^{j;V(tD>Dfga>O3CN>5-Ob0LPB5@rt*$c6;7r|b=AHBBKG#dX zE7)YdTXAiBwCnS&@9B5H`T#lo-%|fRE(1Ic-|IwsZPMwq@k_eXY1jFmd;6P2SU&N$ z&w^Zb`}O=_eWp~6f<1Ok#LjkAj-1AYVcDr5k6wA6ikDHN z+pqUIy(7Oot(BKQLL-dAi)=y@o;|DClrq^5h(_nN{P<2Wes04Qi#IDn z{mb{S5S6?k?69^oQRqj2Y-Zo8h^^_`-&>?_uhm_+*F_3Vlq#S_ZSU!hs0)aL)4eeFRyAJ1f1={E6&05+O?eP~ zPtToWR#;yF%EZ+?2}$2{(K*;~m3Ue+{LC=kCYYPR=fty&Lb~J}Iz|(W!~yi18@{M^GY=Dz4ozCi z$x^pQo){5a$}c#&d$+t8G{yv|_LdZSra$%>T8zBRf3F*g*F`<9e{EC$-Z7567yFk+ zmLFDqR5K~jY{t5Pb*oH{Y>M~yy@gXNK}s`_fk<~mw!Bi(-i*H0v;VFhA^6qiXt#jO zpqe8g>bOeTKSO3(vnsdOtw^?%ZQvm*Nd-#9crZo3>CmnfdjF$uxv&PZRW)W1%S6kP zT;H1BM9_A?_CtMr^bF`~`#rtHu8Rnh=9JArPi~s)jQ+Rg4X-c-6aKV45!dPo-5=D$ z%<`r)cv2T*(H6BHpoL~?hPYi-{d8Cni{S#}Hl)DX zFL*PyuodTMGwR%C@5q{|2$8Uloj0elOL5#67ga4^ysi>FXj4k@>V+&A3m{ZoSxTyq ztXM;2j|6%4qzM$tZ$3iU8{P!Q0#BZw=P5bBwXDP}BHwO&QC}A35lk19EJ|{JvDx{K zrdir?={o?4NxAkt9aqLhR~~BqwEA6l4Ibe?bWX1XiXGR}l686>`uZ(3jVlDC2fH{l zbis^T>VYaUEC+%ECe0{Hy@GiG_No!8Rz1zVjmSY-`b(?0*C8*hkd(#Wasw+H^nYRY zCvk(^&P!(XZGT?ht5)G!yB|ABx&~0;6+rboZjO?^MDQ07+iN9p z&Y!A6{!@>#QW-rO*HHa<CPTxkd$J zpV3qE8@J`nqm}fuU&x$4w@(IVnjbMey^`ni<4mOw?}U_WL~^CfhMLTW_V@0BbI z3_tcrPl8Vhrbvx#2{%Av6RWdcK{D^+747tqH`|%GYN3Hg7q~Q~TCpBezGH6dr-CM? z>}$tE-{^yT?^^I#Cx?u{`{!LUEO_NU7@^#W?iBo|cOLrQIZ(#MTB+Zo&GM^8rRgu9 zGIS8`6`+>9^wo>1@Cg?O@+1(h+gmGF(86s@TtKEs54=_zhi^Xt;G+45^?b7o16Tp& z-GMtzSI2eRsNxh;f7&lVMSIF0poZ%E5vqQLpYQrp`#?#vwd#I_qt^nndj{Qm)rAC0Z)gf%&o^B-FYmS z7}_-i&YQf2pRSg*;epI64(`(aM)Bws>L0y5pl?bQ!LZHNEnH7SuxI=%m}%^&r<&gYLevZ3F!l&Vzr- zLp`-MRQuC-t}0<5zd#q2gk`ZQzla?VF{ZvOJNyG5nJ>qaduew^sNeK2%watC&U-`T zo#zt2O`rkhIOeN@Qm0HItyQn-Nhsl`zlPJF1Ikl*T&%Sv>^L-3>pOLX{L*UsLf=x> zcDj5)*28yyAucRQ9YD^d0nI-YK|wHyio>->Y-?3wf%H|Zf&&RHW;GmJ$&Pq5TsaCp zy_)OuXer`LbKW8(?cy?ehqF#n_;zZLHEq8sbL1Jh76Dp37`rDg9De6ccy( zTCtt}$I(&5b1!03Q!ygK*CEmuV3N?ga zK&y7xe%!_;7rm41phdNt@Yp1#LiPwcL&-y3`*=Mz8dlh`L{oChnyg7_r&f>jK%{iBoMk z8a+AJe&W@fv%uF#fixCacHtiwUfThu*(3t|BqP@)e>Fd9s^*!SK2RkywO&r`#v<6` z{w(VbAdz?o();Pp{f#RRYod82nzr1>Y=g2EQxYO2I5pZ=|40fZ*c#`)fc1b>ebeB0k_}F3i zxaQRvT^VTva>qX z{th)h5x}je4u=`{R~wg3j5C~Tq1%P^`j-*9N3QM3F*e}0Wb+ZZ*+^bd-YBm?<>GtT z)pi4|4bmZnEz_X@L*VJ<2ZoWj9lMv}9}OE8u77N6iamQ=rN?7mQ~<^Y*MZnniY zlPUhzQQKQ1kS@dOW=a!)Pj4I2-9iU3C`Jzj`x9eAh#T>b*zu!IAiYU1N3l`@<5KL7 z>R5NmPD+65Jyvg6sA+~ZgRIprIo10a`iQj^)p&2o{Q$;Bt&^$AU9e43B&R&p`ANsH zpURHw$_V~{4O43tYrp+3TgSYE^MYsr&>ezQxJo7nKuv_K7^Z!wh|aoq`@Qjv`lb|e(D9aD?4HLf}D1QzIuH;D@ zr>gif=URNRrj1USPj(!d?))2W)CtpOvjF@Ek(GUv4BfoJbiJ%I_cZvxm!A?cIC3A+~)1*ae_^d+5BTtBC0;8-lyZ zy0_MWXYWJZ=e?~vi84_@jXw*jUvCBcP&s~2q>;@~{5umYfT|bm)FK82KCRW<`@>!b z$!<9x!m?B|gtT1@xt{`1EeZGq z>Rh{6Ayjl^ET1@ua7ewqXICOk$lepY*c{Iby(uK-k2~K&7yk^x7;gmhm<6L(ASBT0{4(yhz(FzoU2s?tGtKBA}KjOm9uD2>!|G_e>++{ zahq$4ED)%7;Ceb3V1@JAw*qyU-Y0KO-;Na`2z2lLG36Zx6g81)0kL|b_5d80Pn=}nQ#v91O8|P<<^5zSW zwZEDL>}auJCQ$RR1Y~$S`EKRH_*5;@1+nV(jxAAEVjeJ%sEv})8@tdLV$T{yWs@!ogO45i)D3Dz$mZWz zcX#79gwM!QtmAgi3x8>UK(cEiEnQt5Ag*1(az}2hVSCrsscHpu5JotwUvlR!6Q~Q? z8!JS&1+IfipixUTPTz3i?%O^>EmW<#S6mN$vFF!|z zEQogFUPR=b8Gve!K;4dr=@QYelQ2;XjN`9>XW#$H5GZytRoevnWd41#jS(wIt&xBm@)Vl9D)Ud7lvmxLB~*gn zA7>BBWDbTWkzPG2RhFBLqiC>PmLeG^JTDNT0ZVcU6E_v#*1*4?)fkc~U@<#cPf?Fi z7$)~p>(4rq=b3TJABk$t6H?PcsW#kno5*{^-m7~syM0M(oR|O%f@urX1xw1;go2C5 z(*f86>rB~4IE;@ancx~Wx}emLRiQ1Q{~CY-YmwVn5*iCs7vSU}l6_k&O&4aM;xUtBi*H9`{UU-t==#0BZjdV$5-8jTYSPVaIi)ubY49 z0_~uzxtku3khPTrnI}%xLxm1|Akj<}szine*ncQQ`_lJ? zc_?HJui=;HaYdyyQR1l5nTG)d$r_NoqZ$E14O!p%1iPlcd}}4Hgs^St0Au?wwyg zY!0ZW%aT6aHVz)V@!P6<)3AHE6r*i~bY_D8wmotheCK_-#|7f~kGoRHY4?JJm=rVJ z#6nB~K)ZASdJX7#fq6Ry`(#_I@n>>^pFk*;eDSICXC>0-C#r)|4ii!m?6jS)hGuQ; z_0Pyrp>*3qj;8?Fe>M{pvVR@8+c64dGPY|40MVByHLz6OiOPpj3STr71ixNt;AWpy z8s2v+G&xWg`fe+lp`tBR)vU3<`OY5R1)OCdJMLxt$H0Vz50fa=w{YjJ<@e|G+L`!Ck_iPz&^ zy3{X8SaI99neBvU#M5Zk8)+%Bws5fY{X5pU00TfgSem>I7(&Y8%#vx zS}DBSdq30A>hIPf?74f9VqI@iJ!MFNEK}npQ+=rTEl? zWh0rqQNTB`j@dbv=vRwt6$ea%oSuvp?KrJy`?M$dlk*w%n|qYR?8itw@0n874vFY{ zz-N}8hp)M{)VBMjU+r=;NA7*RaprW_muH-+>)IWUa}I<)Y0nW{mOjlu8z!-UdQN9B z3?I>C=eF~I8)6^v1alrik?11~Td-`XZu(=ioGfmEi{799*l9lE{Dgi}YIJ^%&YbRB zp5B8nX^d_izRn0YSNbMbD`Qj_o;OJ=LX+I*RBg%f3wGx(S=zhi;VFMr!s=`;pvYed~9Z2#O9=f`}ek9sP^0YEgFY zl%2L4N`F05zJT}VDx`J|)Q5;DSYMUIA3|vh{xsBAH+MFT1I*VtfeB~gvN0Oge|}7> zOUAna2rkgj4RJYbMtD<(X*(31UTL@xb7Hc3*ziQz!DEi!TCBck|CQW&d3UV|hRYVC z{&i0}uKyhb?;x~gtEM@2jT`w|GltVuH~e3jyh%EG>C~M6`_~ytw|Bic^XIc_cmZSe zeVv(f@9eicljYk)4F2T2<=M@~RjacD*L~iY{!Q!uHeq!ZulLB|==hNW^-nwUk?xb< z;O1WR+Hhz)ePN@RdczB$#YLThn)}**2youm1d+A85oPZ@g=@@GyhUQn`?(W&Qca}o z$ZG#7?=!=>`4=^ZUMxe304V_#W6|G%;0@tM$!nYcq|Qrm?R1gwJcqu(rTqQ(pTg!s z|B7L$5g*Gfz2pKn*7Q`gND53h`3uqCJkbgfr1q;pfhFQ={p4^L zbeU6DM^^yq;3_>=ewikFcoe{-$8iZ)9V&xQC&;_`0L2=uttX22s!)o6erx$I1Vo89kV)KQ9y+WPj03cG&5 zJGu^{HBk$)Pp(GS+S;_4NyYijJ$0)?7g&wzs>$Ilz8SV1GQB4}j=xifr&`%&0qUW* zqD9V#F8P8=y8dwoO-pw+bca4Cp7BzsX<8>=1bA>P@8PI1gJlkZ2HQ(S@ZaZuiY(sw0^}?Ih{X)vEY|oJ!BLI= zk!9LY8+xhITX`P7XX|GEIaRXE_R7g>+$O9>mEGj<^us?#!}MylC9Y^BQxW?I!B>t< z&rzjNbC~vGHUJuZ<_TE(S7n%Us9p3KddU?Thd@_pCd1WbzovW@9;N@V*gb)DrC7wQ zcam10jHNu0JymdYj=)jC(B(tX91rh<>ITlNtib<9-8~`zdv2YO4^>(KGR{LW+D}m2 z0x6#p#!Jf5V{ZT4Br5&pf!tpQp1-T*cf5BE;P^Uv2O%_EHgu<^$CnDbT@rmg!R$w@ zv=N15^{nK0n!c{QQ~}j9+1PDzK)Oc+OyH9OFV_Qi>>h(@#*kqCYf#J068I6Op)v^r zzly{bz9!Wn`yP^I{Vd_)Nj<{EL6>zh)#sC^NVOqt`}Mx2wLCP!o$zP!U8L3bsz<3` znN8S%vwM=?z-OSZ3+w))J`6xVxMG#{P zPH$SEZmfK0u-*}C3ra%#okpj8d0d+JM8k&dO9vu1lec_f4wxlxQE6B zyDSTp;VUzkX8mDrvj*FueL3E*Y>aV$Hrs6)u)skHS6bQtr>~dv?L7=Xaer+{eYQY4 z&=-tYL_PIP)4FmxKKp_z7O|`-YF6lOO(0^A^d;#-sPYdh6zIE~ zbjnf7`!Jq4P8v?;rWk+cJ>~NBkK25`;XY#QJ-=5ZuAR>zeg%qJ6M1!~3b_+wvK%oR z?=1$d-^J(V+}jw4weC(Q4hEysZ_0#SjjrVU@C($#_mX8a@^-~4`eM8B9=CrNe95H(+ja6 zQM2+@N#v1|y5(entPLn&;jw+Jcq;X^x#Sy=R4{PdL9fCpq$Vn#0LTvgcFm}O))%_&X#M!@(qWG*N}5PA98;i zns|s*IdmHtuneUI2b|{}-{7&WW>vvijkCvvVdF+Qug65P`cp5(Qpt^I<_!AvXY8z5 zXpdz`{8w5?(#I?Fwk&z<%<~MmH5S-t%W_CZf{#I#kt)j)*aZpC(#FtU3K;Is?) z0y#OA;BaR8pTvkOa`}pKgP=ST+4ayvfKk>?iUK{w$O#Sg5saXqO}=Y@?BI|Bf6}aE z$~8^tE@Z5MS;=FF4e`H->t|`o!4(MNIJ|k)Q3@DrA|FI_JI+M{!Aevp>V&h53QKyz zDNbe6>e3ElXt&XkO8*sR0P8p8)4fe0K_yAPK`mtr?F@DaCZYrhO(7Coz2I^ z>e>%?dqc1Zl`?vpwPrpzk9g&7y8`wQa5{9U9|xa3gjG_JeE^oONap9hJOwmF;bEa0 znssySidKO^LYYBhBr?CC$eMOmB*zp&c7_SkAhkSR10!L)AkSV?n_$w@V1S*_x&ku)EkV}T*s5Q) zaCnTtUq}eNGnS27)X2CbyL9RA@fD{X=obJR8zSAe8#2i73N-WlGk9U$&t^B(i}ynY zQ922}m2o3pq-`|ut+NO+055bDu92FgLn#se5OH~2%=1p>SMKE8lM>Nc&>;?fp#y1- zM_3q$4@HW<`dJDY&6>$jm)dr)Mmw&)DM?yNkp>y1Fqt;RqZ3a>#SKh{Xvk5TrvB5L zL^3j2UBedvA{qfO|a*0T&OXe{so89HcIp!|}Z4__dRou1$3}C16y~ch+}f#6JeG4s5!wH1o{2MpCbKr#bxLIP&C}wJ{R-3jivk zvbvx_f6yQoTL_i_o9nGQq{3_n2K|xpxypKZhIhw~IB)&1jKP9Q%6dAkdgavxOYHo6 zI5zzPihU&<@(G+90!S!e%`F7xVya>_;5O*ipG#>7$NR?#2DAJRU;hFW$@RRdE`q); znt4z(#~(7eB>jghvBdAaU1GcL+`Cp5V40**I=o( z;Da(uJcksv8d0>Q(b&y4WWaXHxEW#ZluFZ#z`~r!?0twvb)Cn{k!H7wv|<9Nf|0;^ zGjLm^Qk)o?ht5^uuY1X*GVuxI&#a5rApp}1jX7+3fd%g$0`rML@xvz*)q(+3SlOCx zw%tH=qRX{LR`PeAxoEv764zN6!Sr!9`xe$ehk4o6fvx9aj;UQau}~2J4yZbWP_z73 z=Hcy@Rx@48Y0-y&?+i^Kdu(+r&04#?c6xr-Jo=dEo!sp$v{#IyWh^ZSpUyv8Pk*Lb z91)yc!_x5VXxqE*a-b_3YG(_!GeBLpLP2wk6}Rl60%yL)HCb*B5XXTCn_nq-t{aTE zDd|%YKAe)6w~-BpPOpASh0IDx!Z|po2-{AyPbZs)ALzP+&%xx)wH%F1SjuKu}MZk^$p-< z)P8Y#?5xFo&v>NA`BuQMA)EdCc){VK%GSv}gz2AGe>;m_KPZ~EyDv^H{`EbPeWm(c zsqGI^_(63zZ|?{^FajM{^6eKPjdwO3;Uivj_N@21pMkylkU(9Ee4iO)>{@fzcxd-{ zq|qF6d&}Z$40Ahh6YZns2=fuMG{7*fk6(9mx;emfHX6C`4D#GSR@2T$D3k-Y4jYSS zPaSg9%P?`ZH*p=B@GVERQlZ2|7Zxgu2&YDGGVsAJSLlyC2V&k|dszHm;-M{^hZghh zc7Gd@L2^#}+gVlf1NkjdKI(749{}hh+MEbns`*Z-GKBA;gKkZ@LIlbZTVLi|h{q72 zi!%^J%q!UOmHSV-o2}FG1X_PAE#u$ae`NfYP2p(EXLI47xsCSZ}8W&ZLdrr579_@YpU=mlbo zN!VivyE+Z#7fP;2AU1&Obrbj(#zF@XKD-X~`q3z2297a+ZSHh~S%luSUv1(<@f-@i zDtzUH2uWnXiw*U14z%cXY$?E{U{mmt%ys>IJ?FQ+rs8rrWzOWqfEdo51Xt%HALrZOth zQBj9~U+W*d_C8u=ae-S9nah%|)$U6QAKt`&HzmZdK+sLG-!M{Ln!*GYzi;I?YBes+ zXDe|>T@^P9V60!SXZ5FPDB;inI4Fl1IBbN?75i|ym+dtMC4xSPrp1KxmMOR~Tdy)sA)3l|9|w;HfPNi*{vG$_V=^J#0V8MMT~XubJ&KZ^?C;^CV!TvH8K2a_q-0>p`+Hh9FFBRB-q5^Jb3WYx=w1BX zF2>RNi!YnY+;KGv^Vnh=bzO<(qC|wZ9!`1(TE^J2(AQ+jmM^{hD(KIEy!-_av;qlv zPz3;NIiPe)DtwlMqM^&Hb)A(hk~Qcp?KF8{FNEuLH=9p&A0j-L z&pN7DZ%$9FpT-L@!*3qu)*QB-JqclKrhnP|xesxAajEy}2^_Lj=6>JtO41*n>JFZy zb<<~`wny@s&OVB%l)hRyI&8?q{gY{}eJ-CdI~3}xC-Sf4!cKPm=m~ewkipotb$j8| zd*W$X+2>WjA_%ZEc29Uh$Pi`K&>;yxx8O2+VN+{G+_4A%H3;D{|%f919 z{u*V{ddo4p%#D`sQP1hOVE>@^j9T3W(?3qayv)9WX(LjT>Y{Zg$eHTF;%J`04Y#9) z&z_BOw~U^QuS4O^#3v=99_dbZTq%BTmaW#8eFrE^gK~Jjdt28J`^(P=EvM1fYX?*6Ly#ntms|&V9(5$P0DA_yKe4dxB!7TDJDU2E z=YLkU_eqHr#1&&}#58Ye8}1slPwQ8VKAxGBrNqo$>>&b6-*nSEpT0}})_HzAUCyR^ zgP8Q$(eakt{Id^LmX9=Dp8Gw~`JlEz$H>>vx1OJF3~uRqlO(=mqsQK=zmO)+G+1zZ z$HZN@h2T7Fx`oi)<3CpuEG=>#afgUzT0y&rS+tr5p3C=F9FR0_V*I%dTM`M{-B-&3BXvg+#J?P8lSMt?{!&a@V)#si#YQhtz2oBeT4J8PG00?3QMfDKe|+FAWO3VTUxj*OFV6% zu#&yqKXADb00|^$pKXv7|J2cV;{D*A0Ljq2nyjWTgJ<0qm$}PBHhGS#N$HADd~;ev z)8c_ucP2No0`T^DBS2zv{r-A=C5!RCC2WsJ**}9_6kNd3$a3hsG1WpoquW zZzBVTABg;-ISGi8xNC^rKM|i@EOjp>@e;aEjurG%h#960oIN2J>u6nSg{20Krh_z_&X$-qPy2-Yn|x3k%e<%x@7D6$18Tx6;V;)-dfJGJ^2 zi&-IJ{mp28Szj4rodri99OVX3R9YdD#{@9TT&F&OXbf{M6j&@&itvsHhML)UJx_G|7z9vD07Tc?fQr_+I_>m2uW zAgsJ*>VqG4zFh$S%}1xXc99i*M3SF@lo5rReoT+__P;tMv%Znj-lu>EdoJB*c+F|o ziH*MVI$g6l&^{`}rd|m*#!TbVj?ns#{J+2^VjD2WNGx9p8F`UNg6fWpHmFL>;1TPH zn6LTnLWX9SgyYD3S&%U_!6;p z_PY!IfhZWWEz!;2-115Jmg&{?i&9DBY%-gdU^2H2Sw zFceiiW41ArJSRhU9netqpQshh2218zhs!@{#w@@bK*9GOmnax~kP*D; z4)5xY5;6#q&Jl79f{VzEn}K=?3u9Wf=h|!Z4#o$ceMj@AQ1S1_ZfEpA%mAJe=prZm zfbY^aHK$k@H?ANTCm-E-5i`tgtZaW$+F7SCEVy0c%W2m~eQt?Jf2ycLQnxTR!t|$! zIWii53PVwrzpmQX7XA?^y`R!V_F(X#5 z6@Te**>U%x#W!tZp#ia_e>FIOufg_Audib(^3w< zLgV?EpiT6{@+p}hRJ&V5gG$EHR+mQoLzBuX@34Udp8b)#pZ{=P{Z|XWKlhrmQ$dlK zYgx1uVXTw%^kr4bWkDX{;(NrsAK+!SV|r-Kp=ubKB#;=zHPb$4dTVF=2im zCj3TZqc1+|%hv8Sw)DpK+)!E{En7%^(|YD_B4kqv1f{aWlytuNGB2`PBNZcK<(wyT z(j-+X?X5F)po4ekznp*Gllp!QrukyYFw~Ft?pko)lNTk8*}gd@OD{F<8RdR!BK|%S z8d=g=^obbtP(M%6Kd&W0>Sq_UgII8YpN-BcHmU#3uwrYewj6?r{;-1?rZ|KM3d&gO zSoYwa{gO_5ch&57=Pky(W5XZ}lO6YKH8S1tKM!t#UsYf8J*#G`>6UDL8(Q4z!1_gW z`fzlWq#FVzCcI1nKYg_g75KX8(4&}WgPsT$`v+0zl;kN2{ba^iJrx1;4+THBaB8j zKDXt+^gJ>pv9hI!Db`S->^sNOY;!WL^@*H;mJ-k2%KzPyv0KcL?nWTpYOl-a;1`=i z5mL-Z8B{k2PI-pN$?U=7rY-7M?^HEts!n{pP=N(UJeG}%2Yv+JZRjnf~@*i|l$=ef4j}LIl;kBvql=OoM^P zJJ0Y1!QArNJ=}|;iz=P_@jdQZou9!M?3kpJqSVst$xx$aJg5Sl|A69Cjr)d7@v>&qKgf*Rz_O@r1>F`XDx)@BO;x79s*eKq>p_586gT(_L zq*H}_zi}JUWmxIYCdmS=4uOapX>43=_eb$M2>8ehg&SzC~VHqTNdr_M1bz zDV@)+`D^|OmMkJjj-H*WM4v-K1~jdep)vN2F^PGYz3ze}ylqysUAw~iM7~~3=~-xc z(4EGQwGW-l)$9`V^EDN9CKcSOS@U`GzrB5Ap~HPlHMV`LXnl^2FTSZBe-1_msWT9Z zgE~J4+9agwG6eMVgOwbNha18s9Q!699BD=yU=ZyIyje!iNXX_S!@oNn(b~q{oeqnB zR>N+3wNQt!!$CnvWw$7mc1%(jxW+@_iukk)QDyHY@QzkC$eqX&3~2GyOE-QG*&B`Guk5Yrh(|>RuG*DBM=dHu{xW zU@`o&;>E4Z7sX)o=efb%TGgcuo4%Iu5Gz2ijv6s=%(!lBdVliKjl2@{I6Ex{G0ooNDR;(^~mbF8I)6GITB5#imJSWk$_ z)QshRx*rz8K?8(qicc{W_xj6l4p$W=j-q)uWQBd~cKFA@-VzoJa-Zi6bp`B5F+j zOn!9Gy>(o*>sE6|`VbqpF?E&j@Zqz=J8RY&M+skaDl}TeY8c#zRaKawifVYZ=K@;GbtoeRATBVWhpe z2}f}!dj(r?THBPJy5a_~77GNOv_+9J5!HzEbTYH@WMr>xxEYMFnDLZ?tNB&h<(LY$ zXf7^Kv)vC z#BJ{!+zq<(@};j+6*Qfjc(?8x5gGADLSbAwn_VkTDE3Dy!51^EW$1x;EQ#?BUZ>JfiVF%J6g&# z+d1FveM>R3W9sYW!DYK3bO8*wb5oW>B1N*itA&QV8r}Z=E3`!#6n?TWPSWrb%eI(! z7c=953w7B^AWheiX5{t6Z>--_N{S<33WIQ!g+TfwY zdw`dd^Oie-27AN>l>$I7CzUa^J6-$grGqWOneQ70WKCYS-(taxU zic}tXRv<=&UQa75l;g%=5o_ri;a+W|yc|K%g(H?NOPdk_#e?aGdI3xN)2h4CN{|#K z$WxfgGC(SRlV#0ak$tUD%(hU4a&ExboMqX3I^$G*`S*&W_c}b0O4064znZO7(s9`( zUCHHc+fzD2TIHkKX}l^vXn$c+L~aMIA7y|MJ7VO^Ha5Hg-8{jDCTd8e*3I za{Myx7lF_n@a!+)k>?CgJan{HBkmCN(nrR*9H|%IU)qh7{4G%*aQ}P%`k$ek>gpT| zBZ=N}<}dxX$8;qJlhe@X6|rOSo8cUf$3$dIpC_E{5EB^in~%%ap&!=sJQdDq#(teW zcUpKr6i%Dzr|he!NZ|diO)KTH%hWNs^OA21lSRAX5#p0X{zn(~ zZSca1hA##Wwlb{%j`k@_WhHLYhHDE=lmORsvwQwZvoNlLE%5WDhDD;HW{tFK0gF2D zC#uCtPVT4|Bw`D)5>G#Ma{oI_z8;)?RyBN1={`r%V zJ?T(0U0wU`e*v0f7aVE}jE@9KNmG2|K%r|yuRkWsUrRB~aP>9pi&a4QSjEe@+?K4| z5dHTmw1CS$_NQmk3FYU_K)@(P8D~P;owIm&j7<QCEJIO=4_@jT1l?{E!6(U zFqieJ{Ac?lr*f5hM$w;|#y70rDJYfAMjuIQq5_cZ{zbc&h?z> z`IFQpft=3_mG=JRfgzknDB6<*8b6svY&xQD?S)+Wnd@!MtZ~d6 zB_R#6S#|8p=k@3&A|3=n6c0@E4~0gfVl%+z5!Y3&f!K)@@r<8ll0cDBC-+pu`Enj+ zTNry27)2*)15U)d(#6hv(buzRe%L~%Ch#mF%*-onHa^2QopXT*&-M;uC$P-!oDAQ9 zzq(<^&iru@aH{?hprvVORukO-6cU7SNC<>VCGX79LJ^J3F|;ZqR&oC+PJb`*Kf;}xrv zlD1hgdj^|Dog;rY8Lo*Ojo*B}8v0M%&x;K|7l=Q_zx-JskQYvp*#Rk%bbv_Nutr4z zOyU|lofrT(fuF_yC1$`;bTag`K>8Lyu|x7zqYAuF8bY^tB37<)u}b?YR_7+=I&Vyh z&Olr5dG`$$igSkPV%JkmxE=uE1`1G!KgU=Dk(dIWD+foeku#riTdA3R6*DCJa0?5b zFhmCnEMZ0ROUiCzB%guBnyn*=sdB{(2EWRtmjH?24slxy`aZ z+aeoG8o2En?Mr&=+?ZRZjm@`~*qa<9589iiXo(mqS@Q-r#;o~`>ap&Ky(0d+#WC&E{#%-iR zZqHenrMe$fu!W$KOO@9hGR9R<;wQX!*0#GUnQo^3)>v;4&eEPNmb>05h!>JCvM#5q z`+%zb7NuI3FK(!19Wn-6MAs#fPrhxp%$wiqv$-2`G?SqeO%fsg`StS~ochv|Z|}~> zG@dVg9FtJd&_3j|?0f}Xl+-J>GZt1LWE){*n#IkTpSMGdOeEC;EI?;@ z{_LgFda3p*SE-!oRzBIMv)1o+AQXjQVWz=L1}rA?4wszNrS8Tk7CO1a+d#SRCo2L= zr2`c(JMK{cM?kp0ZeUbR<_qW)+>Y^W$NLtBV(D{y5(^bI!Noz9|HNlAv;0AuvH?z~ z>`YbO1P|T`TA=Y)T&d4GFPGT7GLjKCG5%DrEp~ClSSbD26cu^XRqCCHq_htNmd`s| zC7OTu6#$!b#NB1OiON_}PPIZ0!((@T2qzsrkrGMXHw;pIcJS0?G~rOq5KciIeWU9f z-hFdVIFZwJTI>7v#Y;`N|DU>I1|CQ91<+sPhAm7e#=B45 zrCX<;qT1>zZGP=cPIHGrU;NboDh~3s9LNUBe~|y2zVA175Swg}TQ5m}86KA!W0$9q zuj%_4%r>{)_bp$IP4D~bOJ{$+zq}nuLVM*~(d6v#{Nxq#wq;C)jceP7DYX<>;1uu7pMW-8+O@i;Lvzgbg%WmK)uL9l?~GP9?vnplZ=h~u;B@-Q;_A<%^T zTCYI$VcpXXOq6WRq6PEZwMKtjVT1xY$E`wHy2sqk)?-G1?VS-hj?piqo;mRTU!0~N zhJw!SACN#8Hd|oiMG7$`Of_qnp&o-ybyrF_)@&k@ zOGO>;=)BWgi)(RQ1=qP`5Ip*mn3L0ZjtS2{VqP=nOM{wE@HqZWKbBJ>M(@N27GInJ znWr@*Onrcy**UPFesBNX2@-|)=W@kL8%-uxvz8uYut+l-=J|`K@%1}g{5CctA#D5j zzTp*d7hf}G2pLZ5&7+iKW(@HI100IY!SZ3%cpqL^O+q-gTu(4>j0$txLr8{j$vC=u zMqR|-B->nG%%b^PBhO}Y_%#ko6$o@##x%+{&|J)o{RuZajn1262NIQ3C#jekGG)(@ zxruu@0|u=21*c#=UIK)@iOwI1%~SCW7;UNfc*}}cJmds>wlH&wEX>~YREXtKFfmxa z{1%fR+Zmv%uV#pmUmX2>*n3NIs0eC7eJS$Jz`_VEh73fdb2Kfb4u5{qZXLO=KSgv= z)m^~kP1nnMCRkpa0`dUj9aY{m-r6qgM+FwF$_N^!Z|MObC%c!L77QNv&k|T03Bt-t z(bHjGk8l2^T=YHon0o!hnMEKG4w|C^pv|a&KRDMLyeBsC9f*4iP8Xr`q7e154d}o7 zpI1XGBMb=a z@34m?rYWc^z{DmriRRR*GNc`DVjFS0W_hZ{2YUv45Fx}`Y(pwE?%Gk)9-$6h3MDv7 zw1Svj4chIk0qz>x6qDlY0e#lV*ItLj<$s^Lm6tAR88zXth5)dGbfC!0b;^*19hN~bfYrXE7yj9=o z7yEN@_)(lle>qsFbWd|<;gg_07JR>w=5Fjw$26`51jD&y$v`^clmX&vx@h%In@yjW zanRVlbnlQh$~>~dkm0AQ@OPU9Fc)L;Hux^Zt~G%ZY%>I1zrwzVIa0QtS0-Q{cwy4a z7SB9pjlIm&B)F_!*yV_tdYY;IS?D?o)@GuZC?F|k`MZ)jbM6b>{duDPgOZz)*EKqT zK*hz4Fyo<#yUQb7Os}mumDVO)51+5IBxyD#3OKs`nWl7g(wT}gjaZU@ZKVC9*=)%5 zK~=;Aob?ULgQ7!$g8lrc@`mWU;LV6Q3TYXU(CTNhIUd@BQae;^>w4{pyVjbkkCH;Z z>CxIp%;d|-kta=0v=|i3x8XP-v!MiRmhBDX^1H#%tGFQCufuF5<`tCkmyY>$`JmR< zS{=nHs)!wfT)HmJWVLost|MZZ(02;ru?^txXc5VJP5ms@lBD(|(tXn1dFHof=Q;6b z6AlKiJl+f)oG#YFRjLL}PtJT|S55~*V9U}FOll+QQDrSQ7_55lpURIn|AGkq!N+yp zUtkVm5_tx5X|f(!$a+t2zKO${Z_oc)JbE4;@y}++&&6t7Hwp9}-Yu!2e8WtXep{$O zO(vtZI4`?EXPHQu3?MzoR;2}o#*`g zo#iV+UNRLSTlS6WuVfqt!F?bEry;_&;%5~qHp>dqOhNezt8b1;>1JkD-D~fM4h7@e zR;&#bfEVQ5(cxopdrdcGOR`jdco5uji zZH0{G9q~Jas(QY&XJQqSr>Lk+7Af#~@fj&s*#NoM!o;z_RU0uqEO_sw<}W_|IYZ`1 zyb7=384FgZ1hW7kkf6LkrZ|#bTt7U14H07KqYM+uT;byEhZmD@@o(p?$QlLxD1JkZ z1u7$jkLA}pl#O^<3X$m%;@@@z=9keXQ!Y1|$X!e|*&BrSk>{9JpvQ(vCD}^YbX50d zc05uib4^Zjy>yy@V-WBQ)cHFLvI+~(ok1=}#Y8LVCv6$*R;Dz?0iLhcwjJb3C8Ga~ zrAM0ah0)XLX@KWoY$*bsRZsw#HnOUerwh-Z@NTU54(sB_Leu9~?-e_4fOa56p}GYs z;JnAQW&DOzwg7}`&I=f>LKQj_4OOu-E@38V>UcLRZ>|!kUn2AbGvV$Sc&6w@QIthq z7Ps)gPUv^zIgJhXi!t1e0BL#HKI-LPLzu(gv=CoI_44$HIa4>SHAxvNu*l{KcCGME z{@HFx_};v}2L+cYhTF&M-=Isyki?QfLcEtmy59>DjhK49e_t_#iqCWDzVU|CaVOKk z@&;1BC|<1n;xzI(Ty^4S0?YP?Qa&Ju=?eU~ACd0KDetu6=7WeqRx4*JsR8V-^lM?c z%*Y0@dwA=6l%~V~@FHzUvkLWz=WrTYzW^nxh~rB)jU$>&UXo1m*97Sw*31R7jeS-ky+*B*Gvpv4I1%PP*tE^)B8w=`| z#UjX3?eY`7-P=!X-Co#!Rv?;WjeoHwy4m;7HnR(s;+q)+Ll7as=dq5tXC`?@LMuy0PrFpq!%(MCUoI)&+ z1mis~&6lcMU}aulWJ*R@#JjfrK&=<=KI5pnoNjx(ApSKct-X@61URa^@(!+9K^zR1 zHx!ZvDslp)X<+WEh8!Otf&jGlF~l%P{wS0lbp>494?>9`sdTjFC%vjhJ_a@M+8x$y zf17L4OzxZfaTC$z?*#a&m4HMgh9O2eKa0EnOp8Y0rVVOUff3lI_Y6FuyoDPfms+#) zP{SupQS|9cEXT`_DCb5q=SCA`HN|wt_Hz&->?64owYenJl4g)kzs)vA1kD)|>G;38 zx#?zOiCJYIS;jAJS|zFbo~vLmM{yS0%arum9{31ItfmtG3L_DeJHGhGabni{0p)QU zdQ_QNL~6wZOWJd5-#`-;+Vt%5+_9l#=8CV)%H=>wBy|KD7`N@wmxdfm(-6#7-v=Nt^* zdkGeM1YYIxN+I$E4|bC_zOD?OSw{j8n|Mx6QqFEjTij;}HPc1|R)9ypT;Cw`*nqs+ zrV4zkTe+w5 zX+HCc6xs1ku=N{imI0)g^5ly7aIw3foqH-Spp=%rm3I=beYpwg;r~#hDf2NIr!d_;2CEER7M%BPlh7 zF_js*t;UWBxUHwOgW@${`8jB*x=H%HDJO$;{7Y^@kK3!ndBJH@{CX3KY{0oMbtwCi z)409~XU1(GhEX#BGf3K2E{+ob;)?+pbmnLT0&w@<_XL*9+k2(0+nm1>xI54HW$@KJNg=Xdermu|fl7-^Kppym^0|u4+P} z&GrwQN;En0uUdO>JC|wq_@{pUF7h)r)gpLDA5B1sX1@>@A`!wt$AtJ{a*CsK-k2i)Gw#2(}}xw-j@jvuFMo!-+gDkM9Y(R<~97% z9Dr22jFzoon6N}6*fiDH-kCU=9D7bdjq#liG&?m8=N^}n*o|Rmidy}jesn2Dt}Mo! zgZ{N);F&BP+DAs0lhlQTVZrUuhxtc`FCUxbbTibF!<3`{9LR5#_^0uCO#>0~gF7s? znQMl4d4Sw;zeF)M<%i+iI`!2|5RdUkL9CNxTPCUs>~@><_BlwVNfe<*7wo%xR%ORs zli*o)_sKtT&Ux)Brbe)S^pv332(4mAOEW?8%un+CsR(mh>d_-hn5kt=aL>zrUoA4P z#jT^r_VTOT<(EsZcy^lIKKghg;ZKAzGOfA_Y~8X#;bC)VYzDL;Hrsrv&U1$Ou3P1vkW5P&~ePjf<@9*a2o?f zBH-By4Zqx*66a)*o`>|Hs-Nep&Odz9`!MGxY#*=0P||{sxcmGmPY?Xi%5nnEa&jcL zrcl{;M05dJ5JA#6qjxT!OQ(=A?;5&WEuRJ@k?+OM%;+=#L_5Mn?yZTdxm}3>MH=f)tGL?u@epid4bph)Y-`U+& zz_d&=Rp~r~5ip+(h8AP~0z|$6Fb~m9KR4g|G&GC*3+;xIYC;ecQo+S4Dnyj}5yrpK z!yF;QMqQCYvQvC?c7|o;4`tht-2aUmi1eRQKPx{WZw8-U8iFvw{Gv57T=rIS4XE|* zD&zS6GT_;dBK^x9Zi$^KkCU6_O%TJd$-ENOP-D_Bz55%f52t65cE0uv3N^jb47&$l z3X%}`=Gwu-w~4Jk^^CnsINm`8c@2-92W7_krKm^K0{NJK)6PZ5ZanA(z zL9CE~Z~vYXMTtu9yB3p;mMqo?;Om*7>LE})lJ z81~0my%^r>!I7j(57)b8MBcP~0KWYgYD|aPI{bU?DfrJ)ivFLJr~clLTSzYk zpo07-uQlB&7hErOWRzmB2<&|H>L2=w=L}nyJNar_8rqHcXS)v^pE?>0;E4i4blJfz zK1~|5{5ym;{p516(ft=%ZQE8=A0llq-Y*^*SK}Ma%;ZIvt^k3)HMQ4UJKHy?dH5+F z!BY7Ihu48NZW`~$ism_*Ug0_h27xjC)(=7P_7n;n{+OO}rxyspJnXp{s@ z7AxSMjx8T0ECew>30>+4Z-_I`=?>}d3!jl+dK*~tIom?gf)hutdBh?qZ!xUSwcvP2 zYnXQTAG!UHd1;@hO5oIl{Gi=7Bwzg%RZ9oBC5LR5G~BLw7PB>B>d}3)rAo@-ZI>I; zo$cAI%+FviW;&gJ!sy(%d*-`N!1n<^%GGM zjt3aAYb+K(Bw@eMI*8{jwXCSUMX7Q{TkU2ZwEh{63{_Q(9Kx`(%~FQ673T_v;DTS< zvm_OHuZ`)GnF3kmAFXA;ZY0Zyz1Y?`f|g19mwx~%^+_}ORbcO^DBL7%WD>Y;$Dpgs zIpVSEbBx*wZJRr{Q#F%Nuv9TbLH~rbt{9*$XDTwaU&ZxK7P##H&s8fTCU*1uBP!+^ z?=iHQA5{1H?y)o#CuYmmW%9?$)>tS^$ToNL%c3s3V?$eo2(er!w`KRxN0+}W&p+(@ z5dvHEhJ&|J{jAR#Xan)xBOPP1xA!ZD9h>CU#*LoEQ5eO1EPbygqHD^vn!%RX=BkN|y5kzUORG zt82Pn(b=|JwT9X!XkRwBA8rr!-1q^ve; zO|gv1<10I7;@kw3UdOpv$7iR*4>}LhFJ4sjQm(0H%NOjlb&d=vK9u0ki?KHkx7d~% zIrs3maV*1-tGT83==i9~`0s?2ots{WY^!a3@;q(?^dY9*=AsbF^Xe1JH(jvbp>6-5 zz*e+S;!KL0UA$|n+j!kw`FKtAS^IXpW=9^1^=OD0+Gl%GelN@RN0yifztQ1=pw=GX zBL$X?5EV&0@}YQo5NZeEi%=w#q;hci zB{MpH*-!bdr<7j|{xaXOs?ZeWm)2 zsiewExIt{FfbPE^R7!{Z?R;9zYa@NTO_z`g8mCNkl4;$;5{lA=w?EV;4m@bYn#kPk z{a~A}EUP_R=v4bDd&el_jElGP5wumnQp~Ok{6^x)xrws*3GkZSk6^w&e00~BlcR4P z_{wd_PdG^P17ASZwae5fBWY^age`%PIJq{cB5a6C1Ykw}bPsSU5&@7tuwWYlap8m{ zz?Uj6zGn-+ut0|;O@Hw^?J$Pd(bEGpc0=|Kp@`D{es(@uWrsW_j{f2C7nB*_jvL{w zzC(LyGw@2#gLL6N#{z9$GI4Sz5U6L?4s)Ke=K5xo#427OOwLMMprdq~7HunK9IY{V z(*B*@q)w7~bvVTerLb&QVa~8Lj4?Ae0Ax#$K@i*n^c?P(RbiP$Mg4V?##;4^V24c3 zl^iCkK$Y7PXN=TbOU)eHY2Q*cuaLYV`zisRAkMlPiTt45V)?_9W-CwDYbE^I&Vz(z zeXn6|*LD*-10EQ!S$%8^MO^IMZf~behvKuMyV8f(p3x!cuD#$9-_Eb*lSKCT9Ma&E zzIg?d<~ohxurKSfB(!UNi!D7Eej$R1sD5H3bWM{}?iiclLR=I4NPr{84p||a0LXw{ z2B*B-g`^oaZNT&)?0HOj^OYQHww6|w!c>bIMj5NtGIC#{8+M)AG>C<(-}EILt~^U$S!>BV zoya@8s3&GuHv7Bi`=d7jzztvGKC`KE=}aUO_Z~a1R1U0mILhpa;|H-I8RiR595_mc zaq?S^jrQNAmf$WB8$<;&#^~S`pi=l&xZA?3OL(Iha+igh1y{q*5+c>(y8hk4p_oZH($0K0cHS8rr8&DDP%e4(oR6?+{kVDzZw zYM@%(a}GVt*xN*IX=)|O%vg(`3g~()0hu?9P#6lv-zBW3t8mU=c|4N5e);w3zdXDL zXL;(lkr+FtGnW@vzFi@W$Fr~kKD;4>&8d4G?)`Z5CPVGvt`#Xn(@wfvGQbLEBmCrc zrBzbD{q$a{dh5Dn6z||oNK~eryzjVqe2cxZQ?H$q^Mk&4V2f{#_mB18Sfj2NM0&g=}J>poR!c!B`d3} z3=ANG5ABGJFW3M80Pq6@a!>%jaxj7;xBw5WIKl`J0P`d4LLB12fjDj;TPY|L=(gor z5(y9z5U?P)9(-le1MRa=_zbcAQRt;Lv}h-|u+jo@8G5Lrv;~4EX9~0!b^Yw;9A)fi z0s;{KJknX}n=Mo`wa&GBddLrIJGy& zY%#gnhczpi8{}1B0M|*{%HC_S3tw=2NxRZj-D$OKje(T_~Sk0+YNe1plM z_>A@wpo|2-Apy~g-nLMwj3}Ry4>7>AI`UBG5KKV^Qvd-Da*zaM-~kUVka-SpV2&Js zBMy$k9G;;8Lcq2{q5(qdBv9fa8Ui02fe!}a>7EYi4vn}fFhG>y?Zo5K-p=iA#)r25 zj?%!61i`L_uI}nqh-FBiy3X!ADh)i0CT6Y<)gA-BZZN)N%5L;d8(!e<^o~(@aPQLQ z*oIKn+RF!d@FfV(zG5xdn9$Z{Foxhpr*`V6t}xo9t&FT~!Q$xiN^jdF%)vx&sz$Hd zHY}<-NA*H1DN+wD0!b-~VyxEfjurs-GN&luZQg>9#`FT;c17U!!mjqh;P8rfkVX2W zC0axSc^Yvts!udNBmA^)u;3sR1`9lzCzZl)5?QIq;D8T|ffzWV147`=_(vUXK<9D* z0q_qGGyo64j1*?^3ktyhp5Yvh2?T@y1YW@x$p8(=fJO>v86L(%jIl!y>(CUOjRc_Q zJ1kHJuMQ3xBn4B@g+kC}(y0bDgNiT%1-bDu6iS6I4Lq1&mN3LS0OV-ak?mFpJbz=FumsM*YYm#@(~DQ4e#!5)_`Fj^O3#wQN1LuZQ^De;|8X#0VgEy3N7#Q)WTM3 zVkgEB3|CL|mf*v@t@XqW3`x)2Lb6iYuqc3{t4^{FEJ6>UtV)^ z=CrG;a%!=*v5ibcFf=m^5))*To6pzQw9?ceG+=IZk6ubfa9?sjFHgREa&Sss#)yBL zhk-anOUajyY=eVfRZvKCc+&RxkE*@#*woLZm~VW5t8GW`Vdl5Yf2FCQrJFcMWNe3$3K>B$ zI71mGKTTL>mYk=ym#NIT!+&vc%ek(9ij!M9G;nBiJsmAxU3YLlSH1A`Rb`>0)z)Eo zr*Dj=BrRE+i=@w|y^vIDZj^x6nzC>{Hq6b{rC@n1MrFg_($Jwx}t?updn~9Xpr>uaTy|KO6WQD|lUsywBk3@qwqeHcg#6R%m{Fe12$jetnLC zRA|1_)O|oUz}Ma@OHoWqNEs|&Ck+f;YjE<+!7eK&ww#mays{WOMD_gpPkpiCt-wGe zGFWV>K`=N53?Y%GuL=|-URq&;w7nM^BA=?SZgg40kG zferDS<%Z&DLnDSH#XgLLrz9SLJ1UF1Tc^b zsvJ<%QARbj)Q@ZY2vt>9Nkx?%2Y8hvHcE1!6F{V$K!jW}9%bDW_p^(z%$OgJ}ZTW||Q2-e$bH=hXmL+5jwGbcLJc+8&_fPY zG))Ry;PXTz7*YgcPxb^sPDdd=)b2{X9AO1a#>jM2i#K&3V=q9da!FG~xIh$9PVp!t zkO$;QB#~P+jMP_JCFvCh2RJF6S5{gn)FpzUwWV8f`DNEzalzGAUwC23m&t(rRqA1W z!WkKxGt*gfn~|3KC$TdmN{7#%`J5;ZyBT^LX^GCzXwQx+s@iDpxR!LINx#-xX0u6} z^!Ij9{|#Hw#16~b z;O%J=4tV@EyI+3h_;-&6hRET{6$BcXZ8cnQOHnl;Jrv0|pkpX{gGP*WNeUyj+xaw< zSfRoePo&5TFE~*`h>ABraZeEnuQ9L-Mirq{k3s%;z`;+cGF4SuF`qD#6)OqlR+mg{ z2R37=yw}Tu`GwbCT-r64%5k7se)*;9X|rTFv#(g$@5`L^`gWd42WC4H&6)m!ss}8g zy)x9&0>~Ok{VFk>B93y76NFF&hg4)c3~9E891hH5ZEUm7b>7Co4TNI~y3&=cL@2^T z@rn*z$V>{s11z5X>NSBHR&D|%AN<%yS+LrLe>%|#F?1pYl)D19{~Xew%~3=a1(HPs zBJnwLfoK|{t42KHK!;wO1VrsB5Q$V^q7|0bFh2F^A!XaeCrV=No)=brju!axQR|A5IQ#BvcaVn|M+MbI@7 ziakN-G-h#$E@1@y}3kRx04hTS?nuU$q22@4Z>vU6tZE%4HWi`TE*{W{mJmCq;s+vS? zmS?R=j|&C2nHuKjKFeCx8hmJ@LhwQs1QLcry2ZIG|Jb%b1;X6tzTw1nVetr;n8Fag zk-Bq*#0WPy!Yg`_0(`{ljIn^@8sW$Ufmzq2Y&42VeYeKqCGWdgX`Xl^CewyVkEhtf zsl*g1l)R#)kt{1JR7)i?qIT(#Wy(_&^fXGzkdl3o32=Yq1Q*VLHIEIA?zSr=&YIxBX;G+9MW zYf8$(U9e?rx}(Z;u2roJK2K*@NZJ_ss!WK(;j+w8T`}aqhu^T4ELe~dBw87XxSd85 zLzmDHokRt}g}@Vz>t&BvBp!=c!5iL?fqM)=|GG#iDM;lkhTvg$4Q<48RGhNsDYDB^Y-=M@dBKo0^RO1L7AOJa1V3LAIq8q)4kVpeC1d7Aa zx*)|k6R;~Vl9B^>syND1gp@oz(iD(?|J=$=|8-L*4ccN`Q6x?i=@p<-GGvsVbPy~( z-_7k} zyaGd?!$&*}ag>|J8RG(rg$rU4(vNDq<0WkhNtwc3nD&u*ew6exYs*{Qf&t0t4O1uCBTaJ!5sx0`UH( zsa4f*IqRaCV>eBp3Gt)}38W{;ls1=8RivUCz7ZYsP*`#I01`NNGFErdwoT;FP1JT+ z8wdfBWo^x7SaJ7vMY9^_c42{sG(2{0{v&psaVC^OG@2kxO>khDQ6`6DLyW^8`jG)G2ut4h~Qpt|%!QHi*nLSS}EO66g=Om|}K!9c|E9E>?k%wPJ*IZ8cU+wU}&k zrv&7Xh-bxMX@yJt$27RMG)dD+@ZlZ{hDw%kgQeJM+DHd^bu7%HWZFRyw`FCZ7ZOQy zW&3s#rN=}8*ApWGQN7?VLl6&8@CG7In5Cbvr3UJ^L5P(yF zHz$v1Cr2k4Qsrsp|2JyBK{8>*8N4BDDg+vf_i9>ajcPSCfWkkBVTv<&KQl-f#8DQ) zQ9-QeeGPO8bT9=Ob~f`+i$frRe82}N27(&|V;^^x)Z}6oI8D?PV<3oa5P)JzkPSnS z4G#bT%orN>w{EwTcw*NDO>lx`rHMf!Lr4jOrKpWfX^M0p9CUD6U7$G4vJ36Fj_i1u zNCbMG69J$za2KLwk$?~PpbFS91aF`Pa$q9?Kyj;CaTNzg7w3hrNfgvIFx3@2O0h-@ zlO$@m6@CP04--=o;}z;fF+N3y*YhMig)vvT7m>t=(Aj8uSTc5?1pWXA-4Fo{!2)bx z12J$0GS*C?|I}ZN5i?R{7)r+&qsACS7l?#`1$1D8pb-UuLNt-rYS>6??&MCY#6tJ! zCre38E2CFskt$MIiJoB&y3#;{F$3W6fYp>@b7yU5DQz;AmKPdX76)yWnw<~;J!B&{5>j0Vd>t1&L=kf2uxHLw zQ>2+AzDbe488H;|rpFl;%jZ)yw@7i2bC2YlJLfVZNf_c&Jwvbva4-rB&?K%InKqdbLK;ShS1DK<(3X#tfo91n8dQNFXpC@aO&s{4$+&FDsB91Ll@eH@fcG@% zlr)f+pSuBToDp?Vpp>tKiAwnym_Zqsa*Ag{Dlj;M;aDH2wS#q_jzYMu>Uw3zrKEzu zq^zSmav(5k6jDQw3IU+6sUQdaY9p!1r8W{>(KV2@xp8ik6uQ}63ky?gx<@gkrZgpy z5JQnQhnyB^Q$b}^d&;MTfu|ok7;=#u4diy#xdJP&2oFF_8$hz4v_9vl7?|pa>xroX z|3(sX|ZYowA3MNGs*9qV!M_t&3T^oR~OVN;bWPCDp052s|DHpNC>3sfTXkdX;QL-^X zWfvR+l7C3NJ9l$^!7-VJHpa2Mq9%zpnSM5FewaF`Fr$-%ksMNos+|F?q?&F&{{wcj zVHh*WOu)g46$G{6aEKgW3d4c8qftUJITgJnSn zH^eME*ahusq?ReU1Jx6stgj%ehl@2y-?!G8}V#@`ZiSSt>c_ybY>!O`vq{xrkR4 zv*p=-Zu}U5sHykmlbKLciYB>SChi-VJj$cn(FLM+TSfSJ0|k0T8Y4~$1@ur1_kc$I zio+F`!~5#5`ns<};ICO)2yb>H1uF*CwQ;sd4jXqAM4?i`lZGl6F;)Ch6ba8W)w?hU z7A^-Cc-V*9mwkKMks@2hg5g(dB54G$#P)Tf*Q{xA=M*S+%x%hW20^|=|9SUxt2m>dm*RRx1gRVMP`%OtG0U68`> z_M-)oj!A@DNyN-XDhQO&3)b)p9JL5MJOUgg2hk-41WVVk5CC^=BciLH#J@klcwT@B$rSz(KCnAH)za0ZwV%(>Y=4kRo(BIRs zgR#b1V`_9Tvvd;CGApx?!O++1K6=5aoB>a$3RaXsxVd~+$U&e5>Z+#DS0g>X4pth0 zg>1#RV!5iTjit3#A{{jiqQFYioZNTAnzqP_tY7I5VHwok|9u84a0Xg%25_(f5X@?| z9lo?7OqC+bfD(15I2;*FzI1@N1en`^QHdce9Qjp=;qc360toPVA6>m2_i-ObdZa~I z*05EiOY{VBT3 zL}Gh$c*V2(*n$*uzne(vMVuECJcvt==g~>Ih#qjP12@x zxPhGC`AvX%<;!P+1$JNxQBVi%Ak4)anaVtbloP{R_5>;r52slJi*OJ3Py@8i!!?i! zw_Xr65IJ&<*K@Xo^VWs>6bth{gJft{ zQUN35v7ilUAUl%rRVwM}p7R@tHlxNx7sqq#+Ld~#*gG6+(iq#Q(JdpOZ~@X~;oHar z7gLLCknZWKg61M!An11h2lj9V5IhAzhc%i}@0Q5k!X%#q|Eg(v(rNcziI~2rXd>@S5rB}|k@03U>W6pMEK@NT}ZPTg+#lDn z#ZhP=3h~k%)6yM+aJg)DIhPwRcgflbelFA~S@Ich2N^)#@h}T#umO_-8GyU!Hu{Yl zt&QWu7x`sM1c>RWR{e1xA9InjK0h2J|4hQ}`(!m0>=fr_MN+e)9Yo#OF^e zH;YCILZB&~AatBQ)d|&VRjLH8Zq*u<&ea(NW<(|Xb!*wCWQ$^5tJZGsgLo zO268KtR|>UplZS%q`Ot=L9oP;>s_ZNqTaEXUysE>oVc3gwvQ`buKbg9c6I4uu78&h z_PatBS*}n=7B0HkVwQL`_~o8O?vZdpEfTor!Fy_`LBd}&T%?9nYLKIbAv6p?ju1mc z5yc^52|$b@N-JUw8fRR?Ac2ZNNFj0_LWrUtE9!_NkW89sqmO1%iKUa6JgK86Rk8z{ zCofsg%JhH=LMSbdBI?Vwin>azv()NpOsKkYN-C?)?CLMG#FFZ-Gp7qP&7Yt`Du}qS z_{^pGun0%cx4!aA&mia`|Ew|>$WaV6)F6YjwZl5YEHlX-yNoi#HlQmd!d&P?3Ds01 zb+uCygKbsacpG9h+owTE4hAs{b|00}E7nRg8OF3iAF~=}PY%?5R*Nk*C2Di^Hr_h<&9~r$D^6GBGJqoDYF4r7$A|YgyBi?}U9xw8Jqrx{5F#dRb z@3F833xDZwLk$rYagkKyP`LVnQ%PmvR37d=mWRO?Lwt!S5}6{n!+;y(CO_@p|J1(ifE}?K~Cq@aAm$XE{nAvGfb;8rmsKO>TiNz~H7z$o^R2 z4bEd^0^aaQM;1?C#`D4?jrSnuWk^FBGK9baup#Unta=1Hkr;;Xu!cQM3@>s)ESMOv zi(SNg7D*CFg!I1m+0uQxGzpbh!V+wlaDOIo$^C3no|nZeX$hPe3ZIo0osnftJgZ7H zBM6=||FOwv5Ht%Ngf=yytwn^F2*(I*vZZXzsV^qDkT%3A>-BHLz)~>RR^ZM6>X1To%miS!1q-c!Kff&U_x07!lQ}6?IIkI z$t8^BK9A&besGmv$Yw&NFxVjsB;x>;^mmt&q|8dkEJ}Koxt63cr7fCZAT%9YCY*6F z|153lnKh?l9iwTbFX>2>O#~wp4uAs-H0x$JbrKFc5N0!-!Qnv3X2V9IrZM$&?Q7RY zPs~UrF--IfT@15<;B-PYPDItKMuRF?Ih2YRC0s&Rz=v8LZddW3ZU!1>kCBQo1|L8v zvD$*!mUfO$Eqx=Owo?>MMBzO;m5Y^by2qUMlmmfE)ay>dAN&sWKS(WJe~s$Mdo0qD z9SWZDKGdN_ctMjNvTB2|idBPI&#RqKCB()Wv4Xr(A!S{ITJzcwUtZ#ueVuDu=Z7SU zQ0XHj!A2O|T7f6AWUnH7$!DGEOajQXDUAIIQ+%AX^f0A?R6)x$r(-h-Vr45I|127! z*1`d1?u9Pr6d(n?86K?pmN1oi)Yxj9nN4{OpECUNm(8}B%RnkpF1bWzx3OL+kV;i@z;t+&WxWcWVRvFL&NPX3~F=AJYTj;Ky3iXq>KyAEy)Cmf)H9GTb zivzAp)K25u)4AA1E+$NhT<(kC|IDBrReOUpif6o6GxZme%-4W}m!Su3GDDrLYF4v4 zO0J5bd*6Ez`IsP9fsoZ834sW+Q*4rrjN}p|Q3O@Uz#v9&fAyZMnv9u}Iq@3jZY>mAF!EowiFux_o{|_J2C^BEF zhPB;PrV?(cO`Q#%WsVFJ=jl#_^Fa%IKui-KdMf3*ii)xNjdKlma^iT@i(b4gcI~0v zS8Tx*_8^v|;Zl@KPm9wvHJwZWXcv{ucfO#u!>C35zoCzM=vEq!pDKasDd4VZiG+1i zFPQ)>F!C3R(AU3|m!YR7Sd#(^Sg)~Xy-{{=l@zWp#K;OUgRG&f&W79i*jGzpj`(9F zTk**HC$b8-HQXfQ>;K%lp7iR8$7jiLk=L@Gl^R)1(wvSq5!G1A(tEsbA)(to+u3p! z)3Yp`0cU?An0NjYGYtnb#a-{(iMJk}h6%GDeh7P)K;$qhID;He|6?jU7x&}Y=)`S^ zkI~^I|Kum1?#f4s-B*k;=C45M8OeF`Yz6W@)^c5ZQ1|`OU9Rc#5xUBL4r-&%$AlxC zkLzHJg%w7(8q5VAWFwDTnF8G>OOpYUP8B5(&) zijlI4yB}Gf^pT~|n5B_W1)IQzOTY#X^uP|B5}QB?U=lZMa3{CYA15&=(?PGU03mu? zx9~WR7(|nLqo&H6K_X+fYWWnwsEN-yr=M_&m-q;8bBZ8rn!1A_CwxK}f{Z9ExYr9a zDa?%9izkA+!p!i4f`g&F7>wMrxD|*8j$sI!mDjaR7vJV3+0jsHEvD31EGz_-#XjnN1Z`z(=J!DAdeDKVK6%84RmDICN>c5^%$w38exie*~2X&jWh zXc}+h604Yk$=Z^4dM75zy^F9wC|pN&grOmtJxmER$=D1uyFz-rjN9`JDhl}^}=iQ)}8h(qS%mBhKjkh-qut4L#j1OIaHoS)D!@Eeao5sx?! z9cvk#@=%ZTD>am?MD=S%rBg|jF`-9{N&oRj{9+;hn1P#2fc%pNrLwwN)0aldmre3I zsoErZSrO}5kyT7Pu9C0{1D_ZPtAUU^s$@2q*Z^J}k|dc2i};uW2r-Qq39;nBzWO`2 zI!l8(nPEza&q$B&aJQea8ONH&no%+{ktPR1l)My^wJ0ahTf!7Prv)lKzzB>Wcqb;< z04HjcA^O6)dq*c!E!E1v3~a*6q{7O`LM^06g4;sP1hd%-&6GeD#)-31fsH46qHNd= zgrq2i+$dX_LpoHscu0%+wKKhaio){0L3%o?c3A>oY zW~=~GgGrSvCO?V9NPH6h5Xagv2daTJp8Q0kTBLm07qC;F4GF+h^cN8sfvRdn5;?nA zK#^2%5eAGvvH~BfT!S5{z_gMHnAo;(yEeW0umC+q5bP_@3JTP7E0$QsV(Kdt(ne{l zw>F_Sbt?;`xr!T{Ch)jMCo88cW17K2Ag#b4p_vN1=m>W*3{_YSCUDHkY)8v%!orBr zcWlhfq{7bpLK)&rDy*$6L>nng30G+xIbed_B9$g0u7aGEAxKEUsi-URjo3Unk6M93 z(*loDIW3~D#jyuI;7##69YjnWGaU~?6v^Y8?nWNkh`>6 z1HB?9Xaku7t$+_BRXZ@%7F)r-GNE9y616m$X@gMrl12@MthvO-9E>K)VWy(cH>UZv zDSO5V>Q%b9OwVwu%}@e4kV43GN4Viif2>g_jL|2o%w~ll)q+CD)Iu!WLI}7$aP<_$ z#3=0IxYRgTR;ef_deSSxDBx(Jc+!b8vk)T7o7BuPJ9Dv@Ip60n1=Mlz(7}T-7z?ITHC0pn)DLqp z1O+U z5}H$*%+C1(D*u9{NczcpxsVD;fd2^DIz>gr8sIe&VMUb zh}f`+;8}_w&{qwtydqE->)yfhI}n_b6eJn9l9C#8i4=^`CY##GqR{rGP^~D;qTt2{ zz26h!TDYVRffJ(8oK`MG2)f8cwN1>jeOqazR%u1xy1mf_rrX%FC*3QIwH>HN;oBMV z6moE`Uf2STJB`vHmEW@)zDZob`M8RjqTN{6bycFeX)PKe2PSZV#H=*a*|bs|n24T*k`D`}y#imnYO$XknY?N-zd8w< z2s|MS-*5|7XtYMlieI+iOQlJankXi5`3$;fx1~@E|AnWuePCRyOem$hRBSvJ>W9)CwnS5J8%KRNr4nt){e8dUUrSdIE}rb8@`#d z*O(OE%0v_dgNTu#MHVG7nHF%huoroa0 z7y`ws?)`|Q-D5sRTK`|_D-iT6&nl)A%ss#oj9uN!2ZD+U`e?NPub3$(uWiO(1=|nO zlcaE`)Ceat z6mSJTfDB)LjgFg?dE%!RJ&dge>c=!?$jm2TehpHw1J3hTMI;ZQsAg;q6f9ZE=!8=a zFoh;&T|YSqy0(K#I0+)I3py2APr<~gx!C-&25Zpb33(8&s~6~r5HElpMNLn#i`0T4 z80~oxwTr-kP&R^A2wlXOS%T;%(cUR(XzJ30aX5Kv`c4=m02$3OlwnIIA^|JB#5(Ii??x>ElnepF18V8@F*5L(8QRj1+|F zQ~nIHXrm&t3OZ4vBG7+aDj92j+kx`Tk8puAPyu`BhHj7p(V#eNEzlZsCn=#!yQ5&E z=8PWo$Ga9arrVYPM@dKwa7wfiI*mkfuEe}v^hvyQJD}@kgjk`4F>&dFsqqUbo&k=1 zB;BnLOu`U&X4Ef+b*u8{R9J+Tl~kD(0|;DW8R_gc_C*Zb2v7w#pPh-*#w)#ItGn>= zO=Cp=xeLOhiI0FXqiNq`nO~gQoPY}quI(#tzXY0LWTRM7(ZHt>_Oc6>(dgdfAE}AM z5Q7zP?rV+Pb=>4~R0UPW_h@a$FDy9h?r!OxxZ`Hqmmr4>h(0c`fgy-#2lmJK{uD_L z!vAVhlDBEh-vVV%*^94;f*Cl3E=ZL1tCqoPI%jvCDLXnlRq*GG#5!Hr_Y>OKP0?*8 zwItqaKOrP2_6waihr`bBSJRi`@!bib7ely*vTIp{c~qB05rcUcIb%TUQE^l1b|>r(J0MI;aDxIn4H8Iz)7xk@p`W7BvE|bpJ|M zX(5hzPakLD4}KzsT^RGnz8GwsXSGNAN%8!JtP?a2hi9TMKoF@O`V4>~*#3v`z!o^) zgpe~c%&4(rM~)jVs+wm4>Y|I6msF8+ zAx49eku2w}{cm_nz^uE4vdbeRz`h}?=;7XM#j%s37f z$Q2f2nM|;Poy8S6Y~I|sLT3(_CTAvH+0^FB97v+|#1MrKO(an` zScD_qKnH~bUP3{L)(}J!F$h#hSXm_%i&UYw5=lb6n4(g4kRwJ8EAY`$RVPuUQ%YHl zWD$|~UBnXyNd9D!NkonG(^XZCX0Ih8h-t3^jvpyA@X0Zf^wlixvqO7n~NzIk((BHPm28t%lUF$aJYl zcij*Hh;hIr;2a=^92qF9tUp7zKu&xwi6Mr2Ocb$3wDg_CmPG*8NYsG)$yHt$*o0xn zxd5t*jcA@JI8lT_Bv^q$;4E}ug%nPh&?Osos1SqTefS|$5}gH9N>;5DB}i2{tT09i zTP2iJFt#)jIq#`uM|wGEAjeP^zf|#(F$Se3eMB;)CR3}ST>sK)Lxp=Exc;Hs;ea?> z1VLCSOw)}R6%jO0c{36DZ#WxHgxd^3kmC=SuEdZ51RUtr5C<*{!G{v$Fad!Qopi#7 z7I*N$guIx=F*IfL7D}2aSeTMoC5zcncW9;Av8kt-$*pN@rGZ)*Yn!1)8pn1pjVf>E z`1T8N&c&)la<@)rt8}*Rdik%_U3Z-rs;nVK04u1F!UEse(2Xmvtl(_4Yph|ddUh2t z5`5;_XHn5^9l*iwzuQ-y9qfu*UVf{wYmjFJhG_8f2;B=Iz7k&eVGtk6CK_W5&L>`Z z&(gIb`B$+d<@r;ogg(R;D=gH2GX>g-jzgI@CGI}z5C0@na((L`xRlZ*lrW`B;Cjn_ z{)3dG6p2j-8Ayi0F_D-lVHPRiMK!wN2YCs^N&e|jO31;1Ak088f}z0_9KbOptN=_g zctr+WfR+uo;0#-E#TI4(2Q8HC4tMx~G2p-iyR~gJjrk0D9Mvc+)QyOyffQ&k z2ScntS+9VDJ?xQz*VzSk(YjrH(1N_;orHKsLklDY!mjZEEH81$OR>PSpm%XH4)KaY zM50i=QOfIx1^LheD{{m{#Y`h&P=d3@vlJ!7B>!Rz`w@>=#6G$xa4J3`-@>A#NJ`QK zS$DX{1`HAxiyTQv<~d5p8i*GbH^4$TtN;RbAYowiv9A`QK&c6ENa}$A1CP)` zsI?&sK@QI9+Avk21TkE!VUA5-`F@lXZ6)O>*{m5|kVHui)WijHxPt~%VYHW6geQ~D zN@d;B!MCgyo;qu7Yq1GJolOrz+1t>-1mYAWpwkuAAQSW?gd0@RfgBIWKn%9pqs+*X;sQu1R8A`9nS6QIyI;cP*b5tU*&NKu`p^Z z0+0hS7&TZ;J*r*O!=8+>=RKm`D*t%4s+98l2Yk=FP!zC6ue=bT#smPRT;n>|F8Bqm zJg)1G?@EWYN<>i#lAefI2@@sAVG(?=jWw0^d%V-f(O(f!J7E?FB9lnXgcA`ji zz0pV6&A+lCiXQ+mga1R2N;i({LSfQ)Q)*xPa;dmu95?qX3Ky2b-3~w}0#Jz9A2k-_ zMt4)$oiUv-VGZg@q*CTho(pM0tvG%NM3V1LMq;zx2*I&khYR|^9Q?<6DQjCzgoQ9< z#05EkrF9JJtSJxa0Ku0}JZX7LDJ|?_JxWT*#ti41!(8X#>Q-BpxpA4tgU!EF6Sv&i zngm_X@fp!@&j^hWzKzm>P=>q|L_&yDMMwk$VaRTn!(cc7M(|cZO+y4sjj6qYJ;1>o z5R^thzyr8IRLIi<_`?d^0jc58Lm7jsdDk>d!$LLGD{O%=gvlM)!yU|m58XjAoDCo_ zL1qw&qfpA^Y5&Hh4325IR}=zHq3lf+9^0?gSKN$LZ6IMwbpa1tU>H(Pb5PqIHCgzj zo*aw-P-)wAcuoN15$wTUD#RY`2@CBV)wHY!wWJ3VK+6X7UJ*>$?@iXvJ%~hT0w~oO ziI50GBp>mt81rogHb7ty1MET&V8jDpnmTd88Sudw*h37YKsS7Y z+r2_O{Qsa3uD}YM!3t;rALyeC#)Cb?LpM`1s2$gz7WO?@I_oT4Mhl+O)S>5c+JaQ6Ldp0 zkOdBX01)a3A9R8SXn{Sv0@~d{sTqSSxPselLCtjnbZS8g4n<@<3LyARMlm6J@r~X% zVWUi8Y%E^iP*D?2p?tYyMIg@J%)?6I#$S|57dXxg#0s@J*%^vog;fV(1!aXv*c{fO zuS|=u92Itu+a7+Hd&niU?A{>81YPRIgeV`rGz9W>Wr?VZVfsh9FyAmqh+jOKD9Oe} zyi%0OB~yIIRsIfmh*t19)J-DScD*G+<+tQqmcnCe+n%BRLusgK$v_$FWiAYLcj(T#9Z9kYlMd3)K}k79;X~$OTt$bUEvfB+j|{bB`_Np z1sEN?LrXb_8OD*fNf>q5p@emUufkqo1psz{8+9;fC+J~QsRx91mQ=pSghGp5sKUeP z#UomXBRZnC>dQlD0`XvzVW!KuB$8Z!LtX7ldEAIiKuhu91$fvCy}3ou3I83QDbrg3 z7R8AH%JC941*V;G6}|BpjtbA79gmpVsK2pTF?9lz#zUJ`Cif%?#abz2D9wdP!C;=^L1Z~=;F!+K!@WDUE!yCi{&%VJC z^uiO|K&v4Xp~`|Ru$`f@nH|8a2!X?4P@r5efjiDZZ90M@fR`57Q&AYo+X%!-!D^{4 z(R^(rvF%Mi-3{Ty&83v*Wa!s@!3Jhv#%dg)<{iR);sy^C1`n9gfms``hTjm_VRaB| z9S*M8&|bL3p1CRLv}gyl*d7x!>v{~LRMAAVZoqqRK(|K3zHF<$NdJU|#MoVRkbXp> zdEAe=YHk-Kgj{$HT&5y{n8>}+C6YNG?FyYY$$A;|H{6#+P0&B{Hp4fsp6h`rh z$OhO`T67;Q_0b?fz|$CmBlwoh@_`2QBM-en|7O7H(3}_7#$X5gr_n=*aYDX8ACikK%f9ZMR`lI^Vgth|vjNe_rHQfBnEvDt#eeO*`=yqx;-yP(UDym|@1sU&$G8R81T0VG4172R* zOpdG>sVejyi-LddYAP@#$9;F+`psDOsbaXeJoocwgy=$%Yo+EF8_CJz!-=5IWYtsV zCWmx#pRUG2@1%;=26IiR3Q!;Exwz9%&QhL6%y+)>x(n$ba%j0$Y5@$njML7J!ab+g zZf5Of{MYF6Wasv+t7^hBvJjN8tQX+$k`2F32;m}@#X(6j(Rk0-r95QLtD z2T46&m2I|UPaOClH@#PYQUF>QTU&ybh&sjRWlDA{F&e#czQSs)G)PxS(4&Ih*OjL* z3yHjcEJ12o-(8~=+>Y*dtNgmTMyiU)J566(KA1IcvEN7{J`-7hhKg0%mx^k$+*pah zSG#uiiXwa!Yz>2SbiYJSnFToMuCv;|9skGH(Gzl!_wR|3!2Jh5?0M?W`q$VNAwn6CB$=zkmEB zYg@KaVJ{j-MY3ZL@lDP@ulnou(uY_HZJMLePBkJ7a`AN&CO$v-!vz=q-Fqx#&?Kfc z{0ow(E#bD?9bDKou%eg+`8EOSOYC!JUCxW{`|FBXO)ZXIsrQ|8(P8WvrOxB`EOeSD zuj>rxrqDL4PN`{tI|FmVLvFwOSy!;bH^h>I*Ko7Ha7#W-WRcY(oTRDv33*KWAI~?d zPz=yPl}l;sVmlEHGnkw3dLZi{&FTxy-AWvab5;yPT|sIotNGy5sAXf^R~l0fAHgp#-fYnNY{G$DhJqnIA-%jn|Y1n_ve)QL%NAQK+{7|ZjA5A6AhOy&iR> zDZom;CVK%B?Wk?TakG~P0SZBHcuMXP20q9ni1&>m%DLGGJ~{a&h{8S)(NqhCE`MqSs$| z$LKghz=(Ik5(#Sz&k~wYqw8zXGq2Nd2cEgc1Qvm}<{rn~5moi%B8@vQ2e&oeen&6kPtwwZ-XS$&iFWV}TrOkID}9el3Z`P0Laa9b}e*UH|`BdgDPe~DSVZdcmkdXV#36n;f= zZtnwER{0l)gVNbzG$VmAP_5xUuyj}Be(M4%vQ2RTb+~P2Ha9>ho!{7q@6SALl?IXuM<98mltM< z^YE3(PGy(*#RR0A)#7{k33s!{mjiqfTJ(w&()55rU zk(y5SUlHUw4ju6rJ8L1Vt}nwKQLJ{l)K@*b*FL^bA~N#XVAZ@XNgHhF%EO zZ^YC*S~z^p?7A$jWP0r8hurYenY@zJwwj@H=T6PICPYTh3{3o{EJ_D9>@Y!d#UKvA zH(ss|HyIf|(oQ7ZA?8V`{Z!&mEXt$Ar@Vt`TMd0xfH+Y1SCqn^903JDpd z_n<-D;77)dA`7lDxnyxV(BEk+G%xq%tAreV+u`Op{@Ks9A(+~PjI#>zgM|aT8v68# zrLIZTZ`XFcGfl}ot&;~_IAyc_M95SK!ZtKm+p6kw=**t<7QqU^=th7*Hj6x-#J1>& z*#bV<@=u>{L30mY;}FE)$)dZQ0U;2)8HucTX7+3G=+rFo{2n}Mo4Q@~KMlsauQitV zt`O`CDap$JC}Al*{;JyH$^V`=>#Mn9F<0t)9bJn=+-HSRcfg3@cZ43>Q9raDd2@Q$ zabACayg8Ce$eO8-VA-%ber7?@>BwD1-6BD%1|;cD%K&P6)yiU>i;iZxqY`IOGk#As z6t~osC((jGfPyxl4*hM2 zI?+^eBOBcQlfeUeTSxoJnGX)Fx@y?b!Fwcw943XTyp+Y(#-}*s{?}x&`AYR@XCtYA zjww4ohC}`{@U-O96$3Ltq;0SO>OTe1`A+a+vlypUlj+ELV_)1#kbEq(UWe8Ld3;?2 zmyh<^5s@5XV5ee3+LPvzJ_;h>?6+-den<(}PvVQz(Fs41dm`H#l(Mq)j8FJuueXku zHQ8L@UU*b`Yv;&j)!=van1)n6#hTY4?^)%SOQ8m&@y056KL~7IV5Jp!*)O5tibuPQ ze>IpSDCB|~F{yz=;zH9l8wH2Kc;v;(<<`Eb7me(ll~<;`-Kw8IxzoYZTf0-YpYCwV zegzDaIE=LoS&u(^cL%A{byiN9%Vtr?3dnUaOk`NLqo?*FN;(i2+qSP5@;@&=HId_K08lm>fvRq89T9bOOcWR(sh3ePYhP&n;OK@jbRZFtHuq?BaKHKLEu78VM z+lM-wQK_}8)*QyaOVQ7_#>Wh>_`^1s~>O#hGH_@99#&Q`&N z__wC5u5zsHK8{L;!$H{bp0^Um;ya?$bPtvJ8ph0@OCkGt)U{KljlxphAH*VvIpy*Y@sMBvI3a|96rkn^wa z{7nm-NH?vg-(&yFJW5tSe7T2fmJwJ^nZDXYeXXbX7aXZXr1bjuGCiX88;x9oyaM|g zVl$f5SLJs2lncvF!iOyPp@7HS&RJf_dhr9YFyQE+}W70^2}tA z;XW@BTO~CZZBHQrCr}&*S|d2FyEjDPOiQ?5T|o?dwAb%B=L*?)f59dC0xm@Ch29MS8XF^vfe z;@lwV7>acLQ$E*&wrXS;LC|7#SLr4$ArAf~b>wVXsOS4ri)}uh7B?1$4#rx%w=;Pp z9P_Pclmq9QNEpZs5H^kgkr0uncw-6y@@gMCf1fq``j+gZy&AdLO$r-ZinTmjHnsbq zc}2-B_`og}_kwA>j-8Q5_0XzxDe%b%Xx1oesL5r%Aa}XZDw+xj7HF|(YH4(c2-1Bw zps1grvuM~$-v4AO2{IJd*Jf5%%Qju1>nuauDBx#mkI(%Xxip^(F{Lv$IEjV_)aPj| zd>q6_qH|pji8JJ`(A6{s6S-8K<^L@bTcL;g@{bT}0}>@XZL&%DQO!=)XeTX$J(j_H z^0xuzekJ^7Wbv-z3!Yvq(`^krIb8qGhNnJuY#-s^;NbhKiS(cq`AGfLccE9*pOUb6 zl13Exzt0kb0Fr;3yMHt}-Lb)Hi;;x8^5-OImYho8v|?<~vLxIv{J z*hB`>D({9;;`<)y$1;+`tB$4nEATw7IY97^wO}j^+Y&u(jEcH)4(a7=buu2R77 zlBvHH?0HK^9^rC?idvgb@np7Ek#b-H-xv?f4;CxLaug^JK_qa;MjP?1;_69Zo#3PK zw2$%h^1_N7S6|NQU>W4kfND2z?OQ*tkEWK*foRCWQSs_r+09XI;J5c={Svc}9Bk+e zNJh|E0by6fI@}r6ID&qRZ0`y|gXf>%mpmjPrv5oR-z**WaT6}-E##W|q&NfVPd>LEp3UuhJBz9UqwTu%Oc~FDQBQs`6Lf&D z3(9xBpQ`K7;VUwbodAoZcPG-+x<$?%qO-GB8a05~4H=}L?(n0cDRmp> z6fDi;h^CMogXwH`B$4Hn=(iyiz^{-K^S3otmSuzaeV9bIQVUHw~T_?Q^GTc#Hx zQk`myJyjnYLxjcAVH-1$X{t7OH~kq0#-iyHTUY7(xzA0WwxO$n2aPTRXo5hw3(!sb zf-~5^_edTGyck<+F*VJ1(f0{$Gjmi`>ua#?RT^;;ini`>5rV474NeVcq=@` z#tF8pFrL&t#Qq>7bp&}_G({=HWv@TahMjnsqcB_Km%K~gu1kq|2x0?D!HVG@_Q6@H zkxxGD@4tp5P3nCPy^51snGeAH{Jh$S5B#&$n(K>cctWoDOvsKWE}YtUl@x4}x3NjO z^*cW(_(ne=;%3O+$q34`2&k)_q<-j^vF+0|*ep?}EidC5Eew%A%MGE#+bSp6?sl^W z3b?biY~-7K{6qi*FE=vS5#riNO|^MJ8LqebRa44%<~o~IOsv#q3_*?5dWJ0>OOHHeV1~0S?@mi zP+Gc!tv-_)gaIEl?atU-N0w1x^K9(Kjj+e{VVm2s)N9H$BOP9x#disy9Rp!^#xG(Y zevB&v+h2{2Cn(^>aJpErTL!|jt11C(FqQfb9i~IgmN0aLVB?}$rvj3}Y93(P7`e{g zeuW6Lq9dbm_|N@%F=9BLhTR-eXJXHtwMgV+sU489y~aoS)-q=HOy>$kx;&Wmj7{{r72O`U2P+;?L1eKeMR zeWF`#F0^DIB70t~lxAjKoP7`ygnM}??Y;b|IgzPxmD&AYrp93!H^3N1f7!p4Axo_E zrBrz+7m{dTOY_BA$&kkOI-mEzvS%DN^CrV0t9HlVl5;&OJl$Td4S?PZ!ICF*SNF~K zjL)7N-u!i=0@N%gcyxOuUBhk_yTP{LQsv@g)%T8p)I_RrB30q-s@|}M?n(05E(eyY zDnVfV#Rw)n3_Jcp*NTn~7Acb0^6b~}h*#Nr8L-{!|P+W__nV6*}13kMWORpYuf zY2)^=#VYw}Htf3KP9$9+LmgQj|71cAy;xT1A~)8@hRjEz4~j0{Ai(29+Fo-5Iz zGnZ#WB_)Sc!^*Pj6{Z3yEiWXA9}f7XZ_Huofo^1Zk{Mps-(se^Rt6qtE$m^{IzH|Ug+A% zb_30wUErgHf<&AZ(u$qEbW1D$y!_Ocy!_wJlX@B(GsF!syjzALZ`JxHQ0`=CbJk zOL$Q7!DxBOX^cc_0ehL)IA6zgza5YNdtlAo^@N72ca-BjwFOfh!Im_3PNocNLqIK4 zow-!VG#gzh&;bD6F(O_~Zzb=_u0Ch2gyD&i-H#>5=kBvx^t?xR$&p zTR`6{qpAsGFW7j=n~$##=`Ernm-oP+4malN)uq-*V=c(SnQq8FZSo9w-Oxv zz-9~``bn%i8U~7^f;z?cWHzRssD+~*{cBh{PRC2xm?6fvX5AOfIu2lfBo|thg~7Wf$k_^Y?Pp`#?3?VpSG#FRe!YIHPhhS3QoN^OTO> zn2Fd_i6l}L2n4N)P0$7d#sws`O5=Vd${3+<*pd9SUp~-OxyMwUxg! ze^{=c1F4gbYD*EveJIUG9bTl1!O4%RG_qtMiTI%>?pO!`HBbK#tfGE*^E#6;(TrB( zR6$>LOj?gUC9?@>QX4%~U9<18F+sdnRcNb4+ivaI*t?I74V%ELvztIy0yk5UMj~T0fLm~Mx4L^*L zMKr6>5LwC3RNUrauO*C#Na_&nRkoVhc*vgHrp2>!?{^^R%sx`LNggU^?7+%vW@h1_ zavi?^mKx$5c;|1^w9E!&#q#K$I0Za&TGg8dD4A;h{JCFX}otN_V-0HEe;hrQ(6J z;X1Ae2Q6p&nMfZf0kPYX*i8f6_^{^@i5<6gZ$^cwb__*vm#SX$aa;@eY0d4MoP+!^MtbFXSkNI_ z=FuGhln4Ot&*VN0d}@(*{bKTFz>)v2uYZRyRVn1Z>=T0moJ0} ze_p;E8T(V^Lhp#?;4pED^X}5ge5+h-Et}M0s*`P7n33({-~zW2k9S4#(evbSZHKI& zg4QEFR!Sh7sgPk*+A7KHeE0J$XNFlm8c`xwW1F>mmw;(>|_S1Z~ec zU(IqFgpVR3_T2Y4%Zz+z$`~n$kv5~URmHHwv~%cCP??F}|5UD}#5AG>m80lsR{63% zUgONRQCU$z7b$`c&ea@e=gVP28nh?s<+iw7QO*}Uewf(N5iXn4IY;(Fl5t$}mxYoM z;!E}Od^nb8SsIJsY(i??uti`k~zfab6&Jf5gu=StUQf+~iI0$r)C`rM z!+>L|#RhhKdo0Tc{zo`axtiH*cK`raX5vrb3&s+b88z7i+Ub17MgrrYLR|=AQKHD5 zI>GVjsRubH6BMi@jXM7}iZ2NX2nUIUQnbdTa~}>1cnqVn-T|8)0n{o1wd=qu?%y_y0u)267L=@_ z=C~OoZ#Pfy30VZ|x*RULZ|=!CCk(?ojz0l^26G@aUK;Fui27+_*`Lteo%-J5rnY_C z4x4gs_bah)l`^A`rOe2E>hEvsTy0wd58p{Oji5XP0Q$-Mj)c{Wg zTUvxFF^d_gCx=nZwbLon5$jA|Z1jri4K`P8JG|4cuzg=~Sebg znnuau0Z{y8`jUSxc7hEgbTMj5?&iH`Hwpd`5#i5*5a>8*{*>bA(HL)ShkN<-V-h{2 zg3QhGB2G>#G#`@wHux^>fYqmXGJy|beAOoYT z^T_{@sJckAGW}EyvLHchJVdtglG}UC1G-y?ZXZFUUb&V~)~+-81LcTLjxLf2~{VOSVM|fC$v!QpAKKYsxF!kMm^zX)(FngJe*!xt+mezvO z{-BrIuYrOK#3I-~pD%m}?tAs*upazx+-LC0jDq^uoKg&giVG%t|K%sf`moq|D`vgX z-3G168IPZObh~E+bQ(XnUxvO;xA`N0TDxvS6)hDG0E7cVkh})g*P3}s20*SrP6!~U z1Q3?ZUequXrG&vcCfPc@myKR`)??jk1$_sWTn-PwJddB7+jAWzjbTSVgwKBh8$lmgq-6>RWy^X~=xy zOK8%Jn%`kL`zF>gF|>OV!Q6FFO3@RSaAqpVb zeE0+6sp9XRXbSWm4z!01smFPaUeQ@tBl7pb43T{4Q7y8I>cIH;#i8 z06##$zv`cyBw}*sQNLjbO(}f;EI5bkttnOY0b=@(#Iht%V{?*B&+R(k)aDTr_ zCMk12X>*U=3*LeVf&~cwP8kmb2gfZUwWx4~dO4a@u1o~e!a*IF2tO*~FkSO}C-}Yy z7BIUHG-)zP-FLvttPQ8Qg9b1}1!({%A8hVotB|D*uX0e}v5w~V7~C>;%{n5N{-dyP z*fpy@sd6#2>`HCfQHw|qtfh^cNoDOZ&as-?yDu2IUr5?^yVtF)gPd7TK5{twOf{r# zcS)}|Kw--5C%{9SVE8j&6DfK^vrebc@xi#2@g&p_vcHB3l~AE~f~@*GYzGmb3_f^L zaOykx#N&TY=|=3_Z&NmQ<#;jhF#OUe;C%~>iq266`S zF)pjI#zF;2Ao#ZwSzIO8mcQxxcjoe4MS-x~8Eej2BB`J6{;8N=-t#l@vGyJA!JSJVS?z;PZjTRD;4DG}52Y zM8EQ*0W?Ibx_Y4zys`zgL79K+4?>GkS)-EO*!;?v!3 zcTQk)4Z2GJlL-x9I^dtZ zK#VMEJvaw%{c-L73~;O|aTi&hV}0VwPnb1usiWKTyQ$UkI2@Ovphd?9hA8;c11+f9 zVi}MiiqgIey$u5)WeTtC%h^-JC;|IE3xN`&=e_Lyh(KJ3qBY;v8bI9G2f@jJTB$0M z4??p^mQuEvu<6d%9DRDDJ{#QwKt==@c`E9Z^hPop^g^AB{-A)9DWIedKX6zZI`*po z`bP*xyXvbJvHi$@9T!xZhyucy`;~h-xL-GUMnlcN+>QJJ>;?_kU>K!MFvc=u2s-&6sSQF^OSNeCX#QgP~Eth!)$pEVyPz$96g#hy^cpgEgmdYqqGJ1UBY7>Le{sz#`kUy# zrEnT`kCqQM#VPYwcU1r-^N6eQe6u6HxAeo>EthKD>93iJ>G7wO5D{#pPMLzW42KuO z(r^l`^)ONl;s8mLCIIOifH(*oN3;+@)PiUM$VUhcI)D1eDsG92{Wd9ouEGhWABvg} zX`4YD5vusm5J95REF3!MeQ4vWI}h+lymPgs!)=BMVO>#S-M`zy-j90V01q5=Zy4*W zgmtfNtfruNKWxmlc}(iBK~4vB1`98a+(lbI_LH_hUe*l4!P*G$`z@d~A#9fj{j&Dj zJKTNC=G1qo_ccUyEuPoso!(tndvF~0G)W3e5ItBbf8fqejh)KbE8L9udmZLZAOGdS zjUxEqI$;5E!fcthbDy7WFmr~ApJ4-@Uv;yyUiM21vU)p{sMuXIQ!|#B>r{3bS;1x6 zc0s0aA%w8-0g1+8dI9Kv07SyZ^bnv*1W+OYx}A!Gv*&B*fT0v&^s^Ek?0;SST* zn!kT{?)wOr0P7!i^mbgrY!6P&pL=D*S0&93yW>EU(f@{}I@m zL4v2>gkhye&g?vD-ViKC*w@AVvuo)@++Hhkqu(^Q3ZdqELqP!X5$4i>Z3@3j*$U>~$>XUP5j^6PH&zii7v-=iXbZFsD|(Mr?*5dX~v3qXUT z$`P)sxCWArFZ8AK&!)ujgxux+i9h$7VRTeQaeNY*6!jx1r<7&$xdcGrt1{@dK+Y<2)*9$7+yaj?PLDKFSPL2BcY|B4 z>pG_f=rPX_KI$I)K3Ue8h1|On)@mOH$N{|uD`0Bwz!$b>Ub1Z zCwYC0^Kp;Co8#Rd`HLSt=!ns=F)~Pb4AU#x7^D{nw!e4*4oMRh|_wmL*I7fLcx_y)k zfxq>P<9P!05I4ij1!N*BeN!5Z%->rJ6m=NnnT1E053y7S!b&kSM-+RT5i~85;{?v( zSm$Yo%BieHCR=;~vOVeZ^wlE|-`a)SrBN~lOJ>1ZX%XwQagFD%s#yLQECeAW+OQv= z6WDzZmvrKGo~%B`!NydXD(P4MBo45*92!lKBvXC-4M_)9T&0j1&I7vzV2mZ41@VsI zxmm4V5WpG8T5lKT|D$y-mAO&DpvJ!_HKZl7uu6TIA2h9zP~zV_sxsE%6%(m$QJ6ac z)2uxo#C&lbcSo{f7;+kmpdJx2Tj;}OCg!S+9{gtg4z$J4O7xy|L!UYVgA!dl+4@>F z@>%o&{tJV`j7@C%;G3c=^&w^Q$ETx5f^O*ii+LYTc<$~1sxk`@9jm5;(T- z3k;fnG?NHe#)*YUOR%>`DJhi5X8VTr24WOqjJf?PCG>KSjEK-?56z^6wLze`C*hol zMLI`LJ#H_My!I=qpr{H@ znBp;CNiHk9u*zXrMBov}>6n&bbL>w}MyRGjRmwRgKYk>p00y2=;SeD(7Hf@t~1iMJJ;~b%Qg|3i~nL z*s8(h0O$;EBmoX%Pa|rSPO|FpxHcA}Dy)J~f7%af49dUlZA?^#)KcmCcRVNDiVP*y z;!AWvvG}6(28WF|M@}0c9SCRAwlG$D+b_!OezzA*>`pueN4T0DkP;{aE(D85BD$G` zDidDbal2vrEfPX*e*GO8J@=z2^+_3O7OBverj)~$&zZ_=JY&%(jL$_?ObWDOV|(Mz zQ?ks1d*>_B+_Gy#A*bY+&0L@Q;b|Pi(tM#q4|5;g1!3-}mdR+Fa!bi^Vp#mojzTTp zQUd_3Kp@olN?xw^>)OANx)~O;EIqe)C9SOi(LhqMcKF!pfI&y-XEv!L=*!5*>jS|) z(;X_g3h%;uydYaK2bK;1;+%W?havvPc<44EeTZBEMo~KF1}3O z9g4LG)KL6|GggLYR|gZedHt54Clv!gA6eyg)V;ArFwY#ZRKI=0C!IiZoJxm||Xv4xFJ(2#)zq<(J+ zL*26~AM%xb$zQh0DUS4$!?DJ+dctcolZWij6GcgZ1Da=NJUKL^*Q12)n{?RK6KKWI zv_u@YUiFJTjSfEBu1_!@BqE}Fz`Cxq+<=J3SPP*S_A)v5mPvtJ9o-ei#laktNmxi< z0NzzO&jdPyNh5pWPENuMvfQ+Ai&%W4BMg7p+P>>=X>Mz4Mc3V1n>XIUiGzY~SoF2{^J7m8&!#=q&$c zPJK_$@M>|=U5la-Ujm7$F-S*lI%pGNIc;a^48NkBWckMz21GuC>MeaujKGunQw^1T zh(nfMi1oUwYr<@+VG|KQ`!UqVsj7(ow%?>AxpCZ8%5#3Ar)S0%!Ch^~3yN!Z4;mVENMR12Fhp!)$S!b7X28rM z+?_8T68TBM6)ZCa$(mR?}7 zkq9^I*@fv70hy~4*ec{3_PQsbUvrX~Z)Q+n7s`|TXAIOKspi0FBdVsQ*3h-QV7I&f zfeB;4wnuSUL+Gfo6YCjf8vN=_r2d;&($ROciIqyd{D7=}+;L!Xb@m&2W+sF+G|9z3 z2a4FKCOT`ZJj)-vdxxe{w%ia6T^h0vq7zXkN?b*a1doKL9{2Uds1>@g!-%gD82X^kz|1bAe_jj0*=%JOLFa@*< zfp1@=L7;TD+i5-J87f=;;{+VpMMRziQQJXOh|OXJ_FVNaZnuDA-^5lT-9#L)u*{7S z!tLshMLw$3hGHs*k`xWNcPnY&eSYU(H6^?2ovklTTO{I5&5#Et%59vSmwW;SxQ0ME z*X*vV@^?N&YnFjP4!U8Q{m!#z*|632qys6r+K9W#(4G#OT)lK3jyrQH20489p8I=Q ze#%(4;u&mRPvFTz`VJ!=pKGQCm-7f$h(j@F<}W@^yvhX0FGG~L`Z{Oe&Lvg!_2 z%RNpZr?9D5&&12;2rEg0-&DNI^PhpA=AM?G?Rjy7jT-uf$*a>-aq{>XBY>Up@MltGfPUm=DDb z-oH=buQb_fUhUGZ*99$dKWKmB;aIMgEEAm!%UuhOF`LMGsvXu*s7Kj9gLI#gOU7y^b8L!_mtk* z=70onAVivXIgxMp%Sy2-q_^CRtjXvFyxAV~@r(hC18D*CcHq6;h&@{=Jd!5~%K-FAAh1_hE~EO*i2 z><_U3wVa#wHGlUTMDR3XpD{?H2U5f3KQ`O))NIR>WbWMo_Jdz44Zpw*#WxunT(k)A zra>n4zyusvaS=iE2B-Le(SiA%A^<{WdlK^Cg`|_oP%|GJ8}A|WS+YTF(KDJp6Hpe->*YGJsUoNsXjGx6g^0#3|wk7(&bVFfGpukrNLi%adDqJ52 zCm=cd+_&%Du-oenV2!uO*?2NatugDW4OXCi-rx?p8Byj>6avx7fXZ~&K0fJ=5Bw0} zR{CaEA#?p|X2LBy4K7_+Ev`nuK7Z6xL>;PhWYkp)kCo%-nIAgtiR1+)ny71HP z4HB^(04oZ&d8f-mYF!;M5ZIZYCGos6a*L)^s2kJ-Lnoj>R+(9*Ee>2CQV*1}Oe} za2ceYrj>vzY0QoA&I^_HNS62(Rgh7+ev~Fy+0ylla<1*7k6~K52k>ZeXPstYxvnNR zbe(UiiQ9^I6wCqJ@AcN-;gKmyN=xJ!ll(h(eXmUV+K0L|JGpJeLDV*Lech__!j1hb zrj`BQgCD*DggJh$(6icCTS~Z<()EV(G0~x8uqq}` zrJ>E5)Pi8xcuxI(o-oLE`v@TboDAavbsQIL%>L|Nl0blIuG$1bY)=N}qWQK~-k#@) zT>0eOt$RSHyz8HDsAZ7LmCABFgff`HMl9=)ZG z_J~ApErH|Ou2)!{u|)j&xMhys^!Jw2^gwkB34jd*=WI@oJ5|F3j|T+X!GgNH06`>Z zCsxw{VHg3@VonSq3shU+hmrXNcEOCXPw1;X+40<>oNXmvC$OLj3)`q|bv{g)qO!we zg>}CsW76(G`HhXd$rO%>hJEL^U^Rz|n^3pHkG(fn987!bI1|AB9^b1WZyw(2yL=Na zUx?Ug0C*D=T|}YrvOJe5$7>&_VgvJ#n!3Y-#_r<(NkpYiW(_Uf?u=a7q}x5I9%Qrp z@k6~zF7;-fNFEDVL#F`}_0}>X+25=92 z-_2+WKuDZylLKCOY=5Tb8B$V2nFJ}a!m~D65}kEW_J1I>kgY2*ySohf7iRkn8UYl> z(1Tp+UXh?oPFe(rA}lCO_TNf3-&%xX+Prb8+t9X{3u&RF6wQF}B=bMjK{Z$@0S>K!mV+cVmY`}s7F(-^@*THgx z#c@;~{vM=L4l*NS&mrYqrn!d};VU7CSP>ZDBalp(iCt>< zq4VRHNBW$>03j55=#lbZP2{?7$(FeV4AQ2%O;MG*hJB>KL(1hNszbu(=l|MTJhsLi z;0?S^@U3CntsUh(mxCfmjy^wL`eW?IhVxf4#RM+=>#mLIkBl~71;RD}hMMSrpV1pb zj|!%vEEa2~-ETd)r4405riRxh$$(4R`(|`t*Sja?i=E$gy)x%N#Q?mOZbeVqjoV*~ z3NfIsNQ7~e1QuAJrSi#1C)u>)pJSpJop=ca->;$r#LJklk6Pb@KCCg8u;g zj|$v}@5PEF!4=8cB0`9Q(Aa;@l!dJv>zYirA_rK@_+=MUF z6ACVK;rdj#6##yf`zR^f9I;4Dd;wexSt~p>g0iqr;R0z(vxt|!K=Cu;12dqss8{Qb zZ~XVn#)bF+X73@sSOk1ME| zR72|+4#^WmyxAhcf#6OCWX%czNSzJ~qj0vk?E(>Rl#!7PM)0 z|IW8mJ;}&D%iN3*n*~nH?=lm_tzbT;Cigq!d{x8+C_zz~+<{}Kt0_Q2)Kl+Q4xu49C zwASnyJg>B~kbl-Gr z2VLS8c*SzOz4l!zB6d@GKb{Nc7VPDTlSE*j?+^A8-RqtXuU84be(kr*jXPPf%9)6IS zi2M*Mhi&QxC(4TwCaiacY>AbX6YsY=N8^z5QWNObMT=&` zLA+JdCH2!~TiDHKPi$Hd_|NkF(i_|U$)111>wb9a?N+u&hQ(6~<|F$#Yx<OUmKjd#}4%Nch0{l+ZPXgdUs}{G5_4f z%Z+35+MbC$b*I5TX=kY1=l4EW=Pr?9i6m#<@vd?|#{jZxxr7KQ_B#|^7*l@iK(5#x z4<;$Y-gW^Z8NcwfD6}?v=K3R>_~N`N;Asi(9J{ahSi8TNKU>-%ylXEv8lRkSyi7d2Afxer6sH00jl0k{XHMRI!=Esry4%fEpY`wFk7_>Vw zO3x*0x=C{3gEBlSq(cz#c9HOQ&BQEOE39?dwBmf<eLGt}rVO8ogfuU@)73iH%4zvvL1}q)stl{JVZ}YB$~W*y@AdzKW+-x_#(f z2kBmzml{9d$r@n~fON6U4>=Drwykq3@P0@;gAOzO{~@PI*%k=%Xy?lkT3n0J)bz6) zB9bSK38#0{pY zK}dwYT|Y5pDKoOY$NhsksWOt4#unME$1{3q5!r$=-_QwV8Rf5GQ4J*%s#oc_LBkqw zj$pPIFg|oA60;Rv_Vw$kn%{oJHDuGaGp5A)d2;(9WZMZFvERbo;E($jdj zoZR(Sd<-RLV*Tb9yZ@zG_LwcRqDfp`>J+EO);RcWyuaqG-iso7g&WTJO+4_&tQab& z*ri`y6UBgyqjU|Z$rN8T|2D5%sYMUWG zGol{Xdo{B1$`xo-)ATA&S;?coEz1*pax?=)G?TP;$xK|DOCLVQq*{#THgUt?wDQ%d zwRVN=**2dAnqm}PTkTI^Yb9$|v2QBw*&8aUQdjT)s4BO6r1n=L$QZ!%WBGbGMi_7n z``}m9t`3NK_0FwE5&re7@gMJw77*gST-SxNCRF0EpcB3j-@k_SIUXM-0PtT571lYt zDkQRrcZ6=}Z}A#o6C9u)C5Vo0U;udR4T=BOMI0bH01dS~_%ss-rp^+`X>yA5PGj2IRu59+ zL_a;cj@+6IDbkywHw&OI{Q1it$)kqYU6-khyD2z+Mdm5D%2Nq{uUK*KY3<1P>6J1q zc{M%ATSJo&++R~%wy^W+u5`M4O!`R2wL#CIOtc#k zB(vc{^khQV!F;WM=Fgr7*;>&jcbe&R?)2n;-(db8Q!Bn|pJMBjD2hAVd`QH4GOYDg zubwl$dzkeIPFy}qF9G6)mFT$+aOIv1J4xp(1T$ zuGaCQ?^Y?hUkkwbIz}h@ab4?GT?B39+3I<-e;51xZfcJhlv=wu?kl@K5+z-JlZ68* z;XhXDWBR7coDuYB|45ho+&-zUgIej3n2E>=6`-|Ti%sN0<0v`{)7D`z;Cxi|I4#uk zrB#BFD)=&E$O2}nfZTih^woPQuH%~m>_14&v?UdL zLlov}4QniEptHFvs0tY@g=|MqT|;+}A?HoZ3izQ^F~O+UQ3SOTVK84o#u*b_`!~%E z&%CK*=PeQfo~!HLggn{mPEOshtNp7t^;StlpyY?0Y;&+SXehqlt-8Jt<4@3ebv^ci znst0FRH2`Qmtxc^Xp}|_%En8P7c+|zi}iCh`HZHcjKGvxjh3YwaK3aqbn-vGr?H39@Ga~4iPBr z)=X%0R`liDd@EaG!zcLVhhn$D^Xy(VLL_sCoGm}R_O&{EtQ`vX(XoMLh7KUpetZ`9HL z1&ryg=pM>6U_IL3Xmm*A<$j)a z`2}DLOOm4y5`0CHZD~r~+YEhAk%+1-?+mJbUc%i_nb$%%Nn!?mnm%XirUYO%GaP+> z;GDaO>kDM@NR|kbxO2ftpSGwA50>SBe|_cp=XjSA0n;o3JjLjBYDeEH&Q1ltG63O@d9*jieJ6&cUtj|3Lvn<`5ugV zZxS_2>IV?v`34W$e`k(n1>vo>jS2`>jB2N9tz8_o9S??BHiAluAMbGmw&U%FbEuwQf%f^KH-wp2O5Zxs|19sf zg$C8#`8Aq8*l5cFe?P_qePeB(?kvf)3NxwSu$jhe7-k~99!^o$TJnLH3u{-|>93rM zFo;z7WuAl*2yU~BwoJ`kH%dM;N=v&DEzZ(nXCdWRH1|An*E^O z7vZL}EN?1^P{Sc;+2zcHc`LQMLi_q2_dzMAYPUyr7XDfB7S4FGymt0c-X8Zu`D&|x-J zDGZI7$pJ&Jew{3~E)jhaPW#$HmeB4J2b5x4R}jeaxo$V6g$i(L(1tb6WeB-@~1W) z?X}lRuq3G60%zXQ4l9#PsFE_U+ zoyxGh%2B8?oD`E7pyguD8ZQZD(Z<{NPY)F9{Hk=!mcscgPFlgXl>rc^ac}_(R$P1S zsBwg^=5nwM8Ws>0*^fR{5TjkA^GkBIRW%^Q@nWUfxHyGgBLn?tH(}H6y1(BVTjn)$ ze28M&f-(Fz+mQkHWT?>DJaEamaL4dbg!y%+k+h z25_9wQ>#K+#dG_m+qo@+i*bt?p#GuWt|QUuXL_qfYdf|v1M2Cu+LY3@x+dy!SDC1+ zO>RtNq7=+S%`vM@iYzV$?Hz_tGeZ6bAAdN`P+I?tvpn>JJhak#-r7e-L*5kOWo#A+ zaCgTg+4Qb-=Va+Xhm^ofan8c@;Y^fyzHoGRlc(S>(DAw=%u zsxS@o+{f-dFnUmIG}()k_gj;hKyXw;EgocASHGGA#@0bGaWKpqMTgn@GweJ`Z(f{q z?^v%N-7$hWY(2ZqR@RFh?>hNy#5Y@fZM?Qx9Oyy@N!Xy3@>vNubI@}p zku`I#RPWpOP00rRB|RMd6)x+hZFLyTbxjn}O z=AEDy2?QeZ8A*9i&NQ)tR7^_F*+Be` z@K(t#zTq+P|1rl`GY9)g+L;)AWRiU$>yCS(_L)DK&$1n6FIP)^_#r_;)%R!!^Xj-k zq*SN%l8x-Bw?@^`|Ea^j^jF?T+8Y0kp_5s+FGUTDZrFF;2suJ-RVD5ZjJ6I0`Xo2( z>u%%(=<{eg}L zhd30?1Ks`i{3cb1JM2Ml=KA9q%UWjrZivW4soqjxkX46c`5zmheEaTi$9s@z+Ca`dRvEO^J?p6e88elup~BHU8K z5X*NSY(CEMrmgk@#9%zcr@i+RQM6L7JRlQ;7F36zy4dU!c;ENqQ()|3@jpD~xcE5W z|DXu@#K;TKt9iv9+^v5mDW&)SM`YqAAj|wk!)REL9BbM%WY{V)_h)frN$u|ac7+%G zxzI|#+}b@K*Jg^c8n*t3FNls>@ITuF?1kwwJ8wBI6d%qlIS7l0P+h`mMHn z`*5pIhRQl}m*c(5QGahf@Wnss0n-PIFFDonINl`}q&`?2gp!|sIE7q#S`BP?Mb*zZ zccn^d&nN%f2GDdb6N*99afoj*>dBBD3YmkNDEZ@&O#CZR?(EpcyWL+^E8??YTqq*) zYKYfmNGJ^9YmIP+UKJeoPntfM|LtHtn-2UDh{W?32>7LPs)3Y7fu5+GQ7x)p9pT&m z{??Un*Et*1Uc{tivpNnxCT`H}oA`nz_WG$+6kjpf@tVe>1R?|QzSlk>L8w{Crp;jE zcoFJ^hjWemuHSp#ufU$2DXZ+x$@aa-J6nCgTltT3WJmnKxBQ(c%UuK0B=5ecq_^1U zd5HrF5o8$zqk-CRA+Gk5>++9X$)gR_}l(9}dkxF#zJ)1d7 zDE5|GoYn&9-r2NF3n7wsZ6QI3M6g$%D)xmqV$(*_?+=kNT~S-TAq=H+Mi=oDI8_H9 z02ZmRJKoSVpZ|lD;1*M51HkR&+e&d?HAdxB0S#;#`#CoDu@h1QF9Epf|nD| z@sHnKDU&?(05@WkbEQrw-);Jxkd*uRgo_WLUkMaFDYlq49?Mv_Rlb{CIzYH^0cV74* zA0BbKKk?+7)P3jAT|bLV;#b-cm7f-*$bBdN`2~19Y%1?j2BoscGTaZx;OzcoS z#9h1W-*AdodtgPi^OyE{RF8~lTbz^QqG-&or0hw^d!}k0Dj+-UNIWMR!wkKQxwQzN z!}ODC*qQAvRS~VvJCS+|!Ghq}S~7dK%|OjwCTH_z*2At5{5J*4GcS z1(cQ#p)AxkYuW!I?o`%X-VfF;+X_hiOWf6CUK(OPhdkx> z-x$Q*5_}Khj`DvP6SW2+&g4S?>CT~ZuM6y%GC&-vUTip(pl-PvV6+=`rXt}(i!HS9 z#sn;=VECyu)Fqn7f;e^32ik~*EoZMzgu4sO2|~MGteazSArUmrV2NIs&|pTWVm)>! zZCIu?b~`XLg}^KwU>>ds@n0F2@dYJ$@fw$w=iD6fp9$%+cIJ*k@^D?GJ8 zmmM$r{?#W(Pv{)VWKZZ65JI@k;{C}JXQ8CLV0f+P!bG$F+;pz<3hN}jMx;$#q7+q& zc;9!@YiSy_tj0#h3N-#zv1U_k`4QUO8?ew01WVpN+KUTweov?PkQz8jmBnkwvvKer>A}fZ1{jmF*4!EGli7D zOT?0;Ku4eBS4H%akaaT04Y4S!jT{$XJ>( z63BvlviL>RP%+M#&!#wch_~Jsp-iYnPR&3?F?L;IT=8AK1-7$Nfid4}XG9EHbk1i%9P%+tA2=W$@ppP^PPyh0XjN3AlzCuJCqyw{gBFyWS zL9k(Wzgi7K*1E6^j%k?(XWQYsi|bQPeW_XDGg^WsgUu2c1(eRuZod>-FJmbPi`M93 zkSs7kBzD~n%HNi3g)PK$@JJ>wMjzV}rUg-Eg^EjWodP!R<(7u$AIGZ;u{bY16CZ!6 z=L{H{?Et_B1{9Ab@n&D~awj%ujq2@;Q2Lji_C`BsP;W4JDQ<%OHjN`)<|TqM@obA? zRmJ021%eS=SeK`)T&&TOmuV*7#a%S1plX@x% z#S2egMG57OT{!#A!oqJ~q4>1n2WMTx-MvkMYl?2L^kOv|&j)xk&$uSxk>0UkhWlrpSFC z)+nMb+yJA2xTWbEeMcb-2?3()rbf&z{t{p%r!Mm*vT;dtXii0yl%+@lujuae>>PE2 zDwqhmqS5tBv3q>$YGkmb$_XATUc1nP|L=PKL455P)k_5A%=mA}B1-V`Uh?^ivXhAy z;wH+a$P?fNBJbG;T?*U&isEaVx2aV5T%s)y`$H8X2xlkF*);$+!s4gz)67k(*nt zw>PtlyQvS|=6%m>=20KOm@IR5y&}&2BS3^44E=uNNu;a_6-)Q0{pW%VRj?tqk%6Xo zS>gUB5X?W#@!^&EXw#KKI;WLiUiSJ$2=7795 zEIK_2()9RQJ;7M>mdoEMML3xl`h$gxn?eA%Qa%%YQ&mzU{#qfOx4{_k0i%&AExrQD zP^`6r-dVUu_C=j^ol`EBym3u=(^)jlOfq9^SB2v(=^1%rb{1`CEmzK2P_+@^U`#xi z7N68x-9s-f;FW5x$Q6CB|8Ah4x5?^nunMsmISW7Vb|5*W5xO)3$n0_Lio5bTg1bm} zOhO)(01`fA?SSD8Dz45E>&Zt(D@YYuX>rKxz;;HeD!)u)TVJdnPx)}(w2olMhRpnm02f7Xe<0`rEC*X-=ehlbXpUIY3J6$LH8JJN8z zd~oRw+&hI^sRQN4JHiK+uNu%%Q;B`eKf0?-KY~2f{F0+nA;PVm425|$)A&O&%gf(P zqcAz-aP-DS6PLb#xa0s?+1yJB>UBLSdPzAM2m&we@Jyr5&sm1}{|`|IGRjjRnDqz~ z1?Yel_JgLwyQG)RHL+=(S- z@(g-Y|At5!rRD+bH4An75P44NZBIqUD|H#_J$1vdMJ=v^Z@3_72`zTMk8`QxV8$w3 zEu^}Q_UQkt`R7YP@FGDt$MaW(-c)lE^>eLIOe>KR>*$q2G1POEfG+`r%te{2!DT+S zU4Z>hphMT16n{41E=`%_u_)szBO-tgul!0@=#rJ7BOv6DdUJm!^aN<1Jz(I%8nZeC zb_6ZjD2GWD9goJ3@6fx;%-Oyj`b|A5)rSS2S){R%5q=ZTp`sy2}0? zJH(-zWAJ6kIdjOuES_nWBPK^vA)QQtZ$Ea_?xUQK?BpA&`{R{uxJ!LWH}V%u0m#*}`Wz)%rF%Ftr*)UTI!cy88*qAKNPl z!bgNQmKQ>RbyWT93z!NOxCTBXo{H3ly1e>qGS#eS0ucF1)0c2ahzR^=FNt;tvY#yx}*!*H((rm5qjzzA`WC>y(EGS zO_5zYS;yWPS}a&PL{el-5FP+M<6F52eh6&?=Ka?>H`usrKN&J&y^e8u%jHw{Nmf?d zt$GwahFHv6TqOFuBCj1)N9aou?C)-Xrxnn56r>*GqBb9m`DQyaEvnDUu~9_g9#cQv zyv*yTVw**P7t>%M(!Eba#sypAn9gdI^8ljJgSKyBJ=sEusE8@V*SQgrjb8C z3WP@zm6p1X*+x`T!>c;33*SS5j5Zf2nJRD$fJL=K1>@mgaGzXZTp!7)xOoenFu-oD z%JuCVJ^}0lO3BPdEO)f76UNNj_Qff{a;m}Pqy6&Bs9K@jmf?5d1-v-{^Z<;IRIi`+ z?O=F4GI9#YQsTSSxSC3!M^TpdnxLGjrzRn1mzYjRk6I2yLI$jz``ebKvci5!hTw0I z;h<$63Q|vW#$dGTz_3{=b1uH|(4{Ti@-u<2AA72qB@AHwgRRCU^}5%5QD5^++({vLz%`0_y&^QPx)HIAIv?s9#MY6&1#->H|>r; za!tMgdNjk{e9#SgRrQ~b_^evx{q*7svS`gw)us~yRGmP-p#+_+Vps8XP1^Og3$D=@ z(7eMi8NfI8d^CIPYbu|`-ehLgCU#qTE8h6!HEGd$le={Dg5+rl?02#%3wRrDVU4$V z8&`3l_^mw~OK?`fPBgr$Zcp9Sf8YQEeF0r??cf@4vAB6J_dn$$|Q}$0UnD!lA_I=DX5kw|w&#ic~k)*}r z>M<HVz=Ic+>@dtx;KDVI^Zs!jd)Q{G~7dot0DzVnS>iv z`)T$2>hTsV!yoM?8CuA8@z<=5j^IDmbqbp+;>G-%x$b)#$3WjdipabY=gB;J<;SO& zpFK1peW41ReO=cFs?)OsG8+FZXf`q%VDU>G_ziV=CEm4%jjjVlfowtdGbDJ94{P=| z>$_Gw%-W}Tu+tj^!!wPW6y`&sSHS@4nK5O%z;j1E`PoypQ?~9eBT>XfL5T>7r;_VL zUD034d<|_A#=^sEB#-7#C&*4N<|~Y_+<4+%FRJ2{O^RxBz6Yyulc4d--#kJiJWG;V zGIn6?8JkoRvZx<(lgX2cP(D-k5I!>K~`786T=rYG3=9(`;EkM6pq`Yt;auvV`6#f!) zjcJ!%x!kvU`JPvY<=4OZ_H(Y5d@oEshkLxtuNH=%V?umb5LXeIttg(*ft=dG@ryy= znWoP7j7^Bh6UW*A0?2Rmy1`1zr`J#3Q~kk8@&Z%8L_6^uxOwmW?stOl2HVpkrh>o) z8|x$$gJkJ$aXNu$Gx|O`!UApb3>3coj*I=ln|x>~uxxV%uRJOB`(OPPNfg((sK6y9 z-kpyJ8|#hmVZQ{h#XnzHM1J=g6s?s}CEn%MNTnFk$Mg%c-zwk$0c6oUAT~|369EJ}~+2$CLPvI>>9% z8sd$MZ-auF#(3a#uYypx8Gm9WLL1i>DlTe>|{EAy5LO^Is}UqtLz z@lX*zN{@=NU*J~(xErQV-#-28jq$@9KZi<07I9h6Hpij_{SB}nntvS~#g6jZGDVQlujkm$>&vqXZ zCv7xIwyv47=kh;X^xT$FsG4r$*0U00OZxjlYMyR2(<~)!_*nlx+u;85gZ8mu@&rNf z7i%B0Xj&=d=9@1@8`SgREUD2p_j*w8aANWxP`s<7Fb`jS$+En`rM zWs}95@{VzBfe~t)>yI%rCN!3J49i1gtR)<(Nfyv%*;MWN7^wE>#XhVAmmtM=jeAc_ zRT7+KSHu|M&DRegy7L{yh9FIQ8OA|&xB}x0rRh?R5p$U&GpD8kc)xG<`ar|=$%j0G z7P9h5GJZrp*~C{5wR&d&SI6j~Fw-AqP!3X?gkmoTlBD@Q!PY#!UJx-t?$(QamoI{I z)8e@`AUN+ykU3p(bzP)Y=%WX^7TU3mrgG7TM^9>M^NnY4rE`t|8<*SE)cYu8tmt0%+A0^<#B#&k6Veo8wiS)Ns(UhPjc4!nb`V)eXL%sb7t`Q65%Syj zh}-5aufgZ=8$-lqCG{WR6#>;5my?XXG37nc7U{1!an) z^hhc~;}(0{*;3cFdw^_BSGqa2SMoq9WZGgc3;-&NRlOd*vxj`W-k7*XW-L!rhSAF- zD!GfPf&>xMHeQKv^0oDO$2Hc&3(Y^xXv;RXYjX<&q4#MJV;|;#*_HtbDS7j%px&XJ zt2@oNb*d_Mk3+x!tqb&hbZfE$zHsO$jg_coOQEBM_Ew(E!fpQPS0ISwBt#g`b-P2> z60=mokgUxi?8yCV^ia~M1X8TR{EH{QuIL=Hpv?vC{#oEL(k@wng&>(NAyFslu_=>x zVg6bX;g=Y2olSy6Mf#9ttwd+G2j?JrNR$ZiQ6wwu^bEAIQvs9x8pIdQJmeq^=q~fc zC{S9Y)#DO^^S)jKu7-(&>%qA$syy%R%`NRkurU963~!#}oK=rlce9bQR-3Q;gAdkk zQ9;4HSK;3}F8qPsfhavga4}H);X21rI)9qZ%RF?YuFkIUGtT%)wkLVM z0M7&rd(?cN*IMT-lzEp@R6SCcR>27c5IjEHwrBpZL29!{+6>rri7619J8t4%vPY-$ zyBKC!?>yQvbuzLK8^2UTyw;Lm_oOikorfXdX%hSR4W+5aqh9hvZ6o=iLMq(n0?pIF zFxmA8N+$^UdlZh!>Igjko<@!@e?z|BO-Y^s8Rv`_jy_}JvgX%UiLFef45$UZ>JWQ_ z!~a-TeO(>3-zv+XRd!j*tA;Rfz_o4c7c1?W^d{+`M5?tXT7Wb?R~_8ud%^*8E#&4c znpv;9-zgY?kgVR^7))cLzIC`mGeldE^9X2j`|z4R3&XDy1tfK5iKh$S2&x4vqB;s` zYS4+vU$B5u&|2Zj?c4+QaD74-+=T=-f0Y|)m7BQ)v2<0V zQc5@p(pAVL7W)*H1TIUjYrYT&)f8{=NU{rg8U%SAbA4wqQ#W0!^nJ`IPWk;QcC+0% zYjke7#a<@4#S3nFBZVM{R~g`iN-P;)u}3M^aZvQ~y;?}RzZURR;(0F{d=I*t12I(| zizonBnvXC|SG6;Bxx&6Y>@0X2+yS4^Xi9C{Lm#WZ-}7wJ^qEjZKA`PIQyEfcue_+R zcF5+p-4u&_=@1DC+WV|nBvk4dU*jsx423W&fQ9%XR_<4;TyKr7zrr&%Y>gdo1)tQ} z`cLt+xz1`@n?Y8WL0&R-d8fK{X*GRY=eFn18Q#kc28*w`e7Q)6a6??0vUaQr*`B4p z`C80>77%84foBcKASF4*xM>1`{=#v`;RR+P%$-Kf0Pf+LV<-o$l$I*GA?X{TBHB4( z<9>SK4DQ59MxUR^sIrvI!a&-TCX<rd&m{T=3CVYlXs0@KWg zn-QvtBeeC#_vsM2P){eIg$IDsKL3~~!V*I5P{le3#P%$m%|~FOEqVpkEh);w2ZZ>W zGmpWKrZC8SDiqgJXdz|+B`?~RBZBXk;C$_~0SsLtm@C!?*tRLr8 zL{1N0ZL=c4K5n!$5o&oe;OEnZQ06O~3}P$zD|py1Tqe)|t(Wl}vqR1Fl#PDhFKd9# z*!H`ch$UzEcXt;5d)HXaLV$@pv#ogrhW2i<6^|kemTci!GU30lwZzO7SzKh6aAVv& zW-=0M!a!=NLhuCU)jTwa!GGrpTaSljieN`Xc2>4o0=&fQ^REBl5#ciAb}hVQ9!yXo z`AXzc>O5qW3OS_ZI;Dccn3OO+Wo{>CDiF$JWN+eTYr?}D7|e_*(8?~--0KvCd+Jd> zcJ8xVj}ZP20P5xe-WR~39dMZ6m8o<_SQU6_os)8Mb_$UON@&>=*tWlO5;SlaA2dh> zg4~I|)0@}6-F>jww0ph(`zQpt5oM~#*>>6Dj79djf894k?ollS;P^QI_Q1UWXv4xD zH6H6IGSZ(0euxcBnXxa=#PB-Yk3KTb;|CoOu6pj`am~mAF}9W8OFd*|aVcP5$`#tJ z!ZC-L`Brh2WBcy$Pu-|7PE0-*02;?H*MyCC$Et5)ZF z17tM|YARecp99}bg_|;<945jP?=4UQyO=<35@L6j?Lt5F9IzIq#@|tZ?r2a+G8im( zg|ZQJ9*^jvbm^p($YGz-Zc1Ha8z+;h`ep4)lYL6@s>Dj8yIG z-;2SgMA$tFTy7?Oe}BL>EjT{1^dg+v8WePXbHyh(^=dS=8=i5opllOoAJO8tsIyF* zjXyG91_Oh`Vo54*RG83S1gC|;ox z$=put!fM~^EW5h00ZH|NgW_Z$Sp-&Bh={|(cQFu9J^~;K0V6m<35BO3F=`P`eY%+w z|Epj{As&vt4qwusZfP)cco-B9GwIYX;#YaCujf%EloC6NT43=WTLNIKweUSkoYnbi zf(FfC!We_x{aWDhXQ^{t`qIXEn43sP%7A}-ZO9oUnP(SLtP0k*z&y2PjzaiUJEjf* z?N$JL@Suu$v@;$SpI*qTEffqKNktsBNCV*oMD5E6+IlL!`UR|N5wD|9bLY zc=8u-f;a8>{k(dRiT=QHfA12szddTBCeuJ`m~6|AK3|A;WZV9X z@aF%yP|P>3zB5C&a=GqxE%JjFnZw5@n0RRC1{|uLjBh!r^$G^J|+sr)-oBM9g=19AoAtVuM&JbFXDD~{X z5E`kFYR(WvA(d)#MX68;sYa?*o}$B}QhvXG;d8v+?^nGTex%~efqZRUg%Hg*&X?b? z^6o*i#ob9B5V9C0@@^~n00bMy5%CbqcEn*9OeP83&++&p(jZ#sZM~+`P;s~+A?rY= zJ4=Q-w||JFppt*+y@eCMkz*oq462pbXf4-NdHEBccFw6N{^ zR3J%POrqlvXE>9n#knnEhR*6hRGMG0~XsrRQ8RAk}c$K6g| z;%#{!$B4@yvl!u74Sy{eBGJ_g66lZwR>DR4im>>lv4t^cCxTxkt#M@Hh* zsohy%x<%(f2{hUk5=*Hw-Q;Gs^UM({}>t zJTCw`MFT!afUgwTyIezN(5=TI=fn|^|CZop?ZD-B#1Rgzr#%wW03Y1jKm6NMC#+@C z<@u!jo!(wJ41NnNA6+v=fC7*+;!Ybe~*TsnI zoGsTy3P>(E2!NhjNlnC%+K~mPF7`(H*}wW1h$`0Ew`RNh=;R*k&bu3TasxoS`&&Zm zj@&lMj!5-FO-v^BI~JR4JX5akNAlrsyZKMsrRFhk*_y(>0LWenY{3D6hA8gSNAzn= zmq(uSiJlI@Lu_Q|n@hKPaxh0Z2cPmL76b={LVRz;1qAm*Z^Q@LO}M)Z7tOuh^{@og zJ~|WYIxst$i@);b_Y2XI7+(k}F~;S|6H?zeYNH?N$Q`T3wvw7rGa_WCq`iz&W_TZG zl7*ffgC0}!eN_y5rGq2T;4bOi6@Aum|D9qdW_Y|kwH}+1LAKA`k%YJ=L+Y^=S2zf~ z7&QlgZpc#gmacXK@rz$SH&F;mt{~E%K1wSzT&8Fz-mYprx4_h*V}RYj8B_5b(f>(q z$PU9tHq?b`s}*g`@SLy8|G47<;wsX<#-@Q{dVXkamhK$Ln+UPmltz5SAkR7x;61g5F+gK6AxX6cmpdnO0BpjsmMRI0cff`bC z+~3$zuLqD@I1I^0L2|ilQG|TR1=r>`HOc_d`3cYO15C?G#pY=_K__6|Om%SF^VM~v$ZCf2*c?HWR<^A@D!|~v~TmP_>mSV+_ z`vFTX=}TE*3E7@-7ajDbNJZT10fvt14+?~es-*lCY^Fkp0CbPo6Dh{N!9N-n1sMC9B+3J08 ztG^}q>%utby9|@V(ax)ne&P5Gd42y2`p*$;RI9fEP`dGfcNF$;xfu(I`O+TT zUgz_S2Z;)9zeF}T0_x?sKow{w#GA&Iep2yfH z02P-4K+i6sRNjqV_$T^K+p2Kk{kq}hyZ@}upXGAZGUxgswRIn}r@)qm?zN<*J0}Jd5ked_j0>q5&4_MU$v( zo$%^c{i<7KqECJE-Aj0aR3d z#xT@4?dt_Gj>K9olS1oP4b19S$<6O`oU1<79)Fj1Nq~D(bbKD~m$3>Eb{p2@YHgfK zgq0^`Q{oWk2ASlVi3KVyLuBdslVb@w87k`Ija9eMj zaOJN0h|o>jNfIas0ZUM?V#WNh?| z<9gT2jIDLQg3W^(Y<_TqG2^vxjR+b|F*+ZludxXro2WU-eBOpczA5`?miTI{59Ttw z{QmcWXf8}$oju)u0ZYwXnI6)00nR3Ed}4X*;boni7Y;pf(f0e@xA_$jRT-ElF4mAV zXT3lKBhn>OOxhDzcuq8~21!uV4Mkw|_v}{B4$@DcD}1DkVv7$skU{ARdASfTyR1 z5G0xqCG$wMQTac0Vr?%L7$tSfm=25kyY?ri>=oKbN-~2Dw6Z}UV@mkU`eK4-Z(EA@ z4+fC*cv?yRsDMlqd%3%g;Qf?A zG0wvgCL2AWdKBAq(*EGOK3db$+lHo>V#@3Mzp6Y(86iR|z&fdWZZ&ez!3Oy4UxLQ@ z5U5Od->N&1Cp!^d%_H=Csgp?f+t=%(b&`3~zrH6bxNE+`i<>&wLDPctHD0=JWP(K=<&=m`(OJCoV+Qc0Q@<)%&Ke#pD)6@S zv%Tpdbu?*BiS!AX*m+^J+@zc@F_JI6AmJrvBnN#yXKXZ2H2kkZV&MT+ra+BaC3=d~ zdzzhd0M1m3Ph&rDyf*zXIqBrt^FFEI&pd0R^(h)*M-Sh5>If{VodjMX^j%wYs)W!! z0oBrdd-Uxp9WuB4^V6=WCqe>!w5sTUFlDDCoy5UCqIiMGzWpnw#*3oIcHOB-Fm?7p z=+Y1km^wI8g$^?j%_-t4?!o(NP*z=(JWBFhS}o=3?;O)4{}&xcvy=4<{AtZ}97MHc zuF$_83O>e_IEF}sDYGE_hb95Fb9it)xcr{0dXUEFfMUfl5H@yLD`I>p_j0a;=!fJ* z^ecgH&2N8X$M-z!#i}=Qkm9C?dB#bsJp5wx!*q5sJAptLzznFkEJ49v=L(F6@dl7e z&*OG|VUNpfJI|hrHFG$3QOGe|C-N9i^pFx+ z47=-aIXL~y>_XC8z`;wR{fcwKeE@>nLxteKlbnq>->hWCg&XVo{9gTGXgN^1I`ib? z|6M%;OKzt__3;9=;RCj-r!aAo;@3$|@pnJ1Ov1k&`jT4+m!6x}<439ph22~F`XWhb zd5|m2QGj}ID%WbE^y<-PQ8=;@A)O|N7j4m3Y?HxF7-KlUq5)O@@y^q+a$ruzaa*?0 z42wJl&XTOfh7rF8hPmZs`t}pJV#xmyP@~K0uH-O)GhAZcDB#wO4gZ(4a93mrs>KCTQOg?2aJ1?(r+YeKb?rs>)kiq z_WawT~erNAH0(hg=P&4j_<8tv2$$YRL41}pA4u<0!uV8 zD)~0$f^`z9?8M3aPFKsED$fe)U0TS$^n*h|))g=pQ_F2~-FSHpaSCn)yKo9u4u3j&b*EK%*P8l@fs z7gisjrC+w6iaC&gKum$4Bt?I5>!5|viKSNG1IR*>)whazDW}G5%F^!=F|bZ$8mu{e z*lOmh>!X-*x88;sFq+m0@lk^8axR>kaPV6$kNTy`{&w!|E#dA=h($YJbu}+FpJzuB zI&uLc;7-yfB{i%l|NP2|Fo>1 z-sP$Rbvd&f4$&CCzym{Rp#p5eiJ45(L*6CuKCJUp?(24qJOQagga}VSpZc)52ux#B zoAbyLqX6hpS)Pw9hf0BMlb@9oNQ{wI-0_;4tF(%K8qnj3ZM{cU5uv<<3<~@Ro3ELv zy^RZOT6Hq%hadjXqW@K2XWrKN#U<-0fVBka`lUtcEVX$7v$pRuP<1iT^zM9e$)Hpi zz_u|fSGsCZX6{sPX;>DJfY3TD^tey(TXm5HU8D|QLT+;5??Y5)hN7IAV!Y2 zR2Q<5=QF#WggKlCDl41rZ!RyVR0uDK%vxEhE%QJf>9XHXE5FRb+2(chg83D|3$O^_ zZ43aZ5puQVd4Zu&s0`2`fRkIg6BXP8*Q`0ea(DM2_R8U5BA9x@hJ%FbsiDA!Ydlr2 z>x*yhtlw8p41_%x-2iCc<$;GDEf&Q>p~h4P?r}a&m9+}XiVz8N)r>=ybkz*sV17XHMBMM-|SI@%>Hdp!19W+g) zWg6M8_V576CLduX((yBG<;YoSa;Q_gAa4K*DAm>#4mT+&|15I0M1n0Th>|s_4WzTb z-6ad@4Qx^dHGm8>%bW$m!^rKnCNS z%>9wJA&PVz#>q_;Kls17C0Aa*C%JO)&ETjcZ^RUQ1mY1B3)V2@AL!UfBjhl!mFQ57 zJ;4uOR`83Xdk(Xyucu(h!m59ogGKYj8A}3r6He)7Ndht_dpOsJ!$9T7r z{Z6CwDP=b0c~-yxwNT< zXHD30`3XavY^U`L><0D*PF>U2EHffrJ4^`xyu4l5aAdpS@--L3pJ0ocTUY3UfYqBS zwXGSeRF*=K(qNyG)eY~P%{9qnjJ(QWFZtUra%;2?Puv^Qf)X$FhMJ=oJgY}`suy}1 zu)u)(2uP#JA>vy@|5u~u9hl8J=<-iwfnOFl@b8GyiO46%m|H<9rI^7-m6t;U&% zx@6=+lYoS-J*i}XF}zg4tPFS1KdU054)d@QFfM@X$i(25AW$Sf|5NRiGXDZq<*s69 z+!)l_N!gYlbiC?v;`{JnT3O0DyED)o`ra0HfbWi4mS6>mk_ z6K4d5w|O|AKQxfJr8V1Vyv|b5suHw!&_!eBq(7tgk#hddk4#~k&r_$aa<&!80X5;W z`+WX6>QboRm}(;scFq3so0IU9Z9HK3H4vKf=k4x)kbv9};Pm9YJ$`=g?+1|2#@p(J z`zU`r{b2qGq@f0u~%co0xErA|k zOED7}{;C4#Xc+RoO=&7c{J8{a`fyiM&c~lE!AB!9+DnXN@c1$Kd--OUOfGiVTap4k zA)8GfQ#AN$lbJAy@r_VwzW1*x0!}c8mQqR0WaKYiR>;#7%#u+2`kf|1G%uTzQXRh$}H=&LnO7{nm4)@ zz%Jb!u*-g%og{OYHMGb#v{hmjXC-Cm2VPrDxi5&kpYyPPGN@~^#^-B8Lv^MPePG?y zi@a&#+kKb~8ogzp!7HfLXd2`N{5c3J$8u>{E@l|mPU40`5QhtMwd7kU4UVr+CfWHp zNlkE0%*7vC*HL)_mv*5-25*lPqo@msIQ*W%c|V%D^HIV^=qF#g+Ed2colTKXO;@4F zIt}b6kJn8aucmUHM8Zfaw5SDPPaDycfx5~_u5{J%FF^41I!zZZi5TjM6am|y5Xm)-SglNX}-(*egqOH9( z*CN{m^)ly8mqToqhG~MAon)8pFy)@*mrkE7x}}rkh%#fc;QTkpX30ALvO$0$`PSv; zTQh&O{yue9kJ`o3W@MkcmF@6WQpv-!Kk*{(KU_9^RMy}bHYFBK>7+P#jo&{nF$%LN zr;J$*$A5!p$D{pCT3w4p?v9>>5 z$e*)DhGQ>jc()-=mHO>liwe)wdKI9oD}m%DR&2#SqVThu4(0jf?jV-6 z;=qNmwjmtak_}GFPoC4d{5q-7xP9^0!(@vlp1y4N<6ZBl|Kw^XOm9K*Ikc4RA_(M; zV{!<)RgCbVJ^4}luLWVFHWL0%C@8&ao4gt*&E{E{r0tBSJSCkCp%hB_P`SEnLHud%k_d%lXe8_P+eLl7wW~o>bCr zo_rp;*H)X+rp=g-Q_613G&&^7Zo6dn04j015wOKaheO738%Fo4w)l2Q)L(zQ-9S-1 z;I70v<7E|7oZMk(ZDC4wzWd*+)yzf2J4+-g_& zR2;Hym8@E(f`sX^%Y23*Y+CdFDDrZA{(8 zv%|zk^T|Xd(xt?+PijhTLR0svpF@HXfa>k8rs66trR2@&Iy=2)2$CXlk$_uoEnKU^GQ3E|1dFtowQP28fzx zqWG%dwe&smf}M0S$GI!`hA61Tyv( zg$8krgzhiU!LtJufdt8ay8BSa=y0sPxJF;oqHLLs+%U8{SP(n5$~LA}T{D1h`X#S( z+MU1ZZtQ2j{~Y9K4il>6Oq~`&h+c?%TJTI%936t{G&+q|%85J8CECXmv=dIft=JJ1 z#?v`QSr!?$CxS~^N^yq89=p7lisT%_0G5(5EMUUBrAH(+wZSNzG$(TFd;sQm`(}Tq zHaot?_jLAv{p%?ST%moe53JDH0~W&nR)g+YaF(P4+jr!aZV#y#o!K4|RkZyyJ%;l` zEhIU2eO%p9A?kp4MEZ||$ZH)x9G*v1tvz#(%JVaS1DJmCi^&Xk zt1j280^=JA9XuVMWEly(C$^uChZ2K?RtMy#U!eXU&ysy#2}E6v zcF?IHeYOyX6D?O*&6Dm)4$0;+*hjn5mAxI7**rL4b<;E|8*kM<96ng)Js zB$gFx!OAcv_&=y}whqpA6*j7T|C$0~HDj2L>@5gYe9${h(8H4NBVKEe$A;~TzvlkQ zb)q!t@SQ3v1kx9q?)cR`-?tHDRF0#L)R*CMt{I)-hC5MZFy4)ZGhCDN_^O?K>u29G ze0#kS$x4B&((_sKW)A@!Oh7-#-LT!u+d_3`5ZcUA%l|2zC}sh!bDb*wpX$@LHI^fl zM^t(xUSJ`$ZhtR2jdX^8@m~qEPwDT%W$wU&mH2>=4)z#LflJp$KqWkgP+EPVpBy zJbWW&6o4ouDFH)DU<~nt^Pwm7lU2|Lqud(h9m)}Ns(Yx8kwN6`Uk!T+?;8SkzTJ=H zX`HQ~l?Z(Y(o|54^PdMy9>Zh+$V;N_^A$bO5UXUv$=w{h9~I?xAC}g{TZ}#AQq9ge zP%5XPBbHqvd%1-E1c=hRWv*SaROxbN?l;FV_3hcYJEBp?ucX6HUoDb`!aLLq=Q*e^ zr*i$yG|^n&r{&+KnmCUAQs|Vkj~{kz+mK%=rQN$G9$Zf+>lF<5$Ipr?AKDw>{WEj) z!GS1jf&@qB%B+b?-0)-)ahtpkYu7|44n%<$mW%i0*fDbFI8k<(>AsI#7_Xu)S37^F ziheBPO?~=CZzxT}UZP;F3Q@4UU&SBhunct%(sxt1Dp^Bz5uqK3h!nsKx^(_>gQzGD^UG zd~{HPc2A%ywX(}L7R_T#Q4+|m@nTHp+`2MLG-6a#FdA#Fvdv+Mk2c*8*);{AyvAV8 zE1cu@_!_Lm6hk+9ti_!|uTBYkA2Q*+=~HFHj`8D6*TMIjTrxLUr;R-DzMux1n$5-i zu0OpmV;pvOYO5__zBuY59=)wqRs*usaFMj<(4Y*ZLfHV$o{K!ekl_B`Q8$w)CyWHf|e}s1WxH zNfQ_V?t>3Mlz9PmJ0EG-Gib%;9tU%NA~vnsqE<>#_lDlHu)m^reUjSWz1d}BC+o*s zcPN0@IGR0=l+JLA1)HfwC8-FcMf~Jow3ieOqn_> zHlj$M8x@j-N|qZdUA$o)N$lcX0rT4|+dnImaTK8PD8kCBL~~7wa1+B1-vU3#Qj}c! z?7rb}l-ZuJMP&Q0#R+5Wh9_QdW#zeo_vLwAddJtco$@W4|xw1->}=3>4F zDO;SslM{{Cnu4qA5^#PZfjLp!Z@n;gCCA8;EfgJ($eZn|=<8QUpZ(C6-1=2BkH7o$ zTi{^(7;JWo5-S^#t&e>?5F4|^*tB1DoS-%!u1m7=svMI-_jkP2TcaV>DFWCr?s4S` zz>WLTeSG-zWB{c}H}J!1rv=oP`nB7ofew9I?gqH-Y^pwlM*by zeakB4pKR?D=w>-S-;@<~(z2`^>V1Eg`pNBmou{eC@mA+n_SfE7OYn5b;stZN(rdS= ze1vXsjcTc^{uY7VN!e==I*08sK39{sgx)bAfwdV(j2ubL(ROD{2sec2JAv4sQ!$F( zc#v%;2ug)AK^$s7I**3iUa`YsKI6fSF24V+(p<|s$`@|F*F2MP52W_tQ=jSp?^x2a zDD>BB|Lt>I4@KmEZ&3L839FS+vu?b=Clrho0UgX79#}1au#qxLN`?$XNztny1i;^G zFU3$K$Y~FSQ}^OEqxyjDfLM7V~8*u|E+aRiD3^t=>-XB$me3IR`T zMOF~^lYCLSd}9n)C763RGa!{vG*le0HmJuL4e*<09LVWAK1x%`ksx{XsME52`01mI z9{2%)O}#`Xfnln;>+fJx5wfNzmJgBBH36RTdA?=^$Y9-z7U)*9@u?SaNLY0=a_4wy zVRjA9$wQ^}J{}Jsz6-#~eZ~}qt|T|s!!JaVniEZ)a_ zMxENpwJ725`520Fwm?0-veJ$-xeN;+I=PSF@fE`a&VAfc>L%o#h*vPQN6GGo9e7M7o7{o zo`^5}S>#)F*2l2CkO>U8a=Ke;9-tm!v7QMB>jW4r&`c5}%vF$6r)c!x@f1$IPl}Kg z!Z#xJZBf!hsbg?zzEXC8-$9V#7|%%+n^#UmzasYGb+TA=*BU)1u_sn@ z6j!G@zO=k~_s%MIeAyn*yF{hN!~&J1f}pC{k=4vy z)ty1^tQ`A@MvYM83u85 zn=Lx|{rw3Mn?~usH;rPZEglwJ{G&R=QwuX4te3M14 z9>LIck*|{@_!BY4KWtdCT|(+%k^w$1LliS?;fhDV4jT%FcB3B!Xyoh)82RKgsk)jZ zA6^fZ=!`NpByi21_T%5yKN=F^!8Bwi)A&1Ru#l^1$kRmfG+p}@f~5+reRhTr_*1XS z$fyxqa@e^=-m(XNwf}y+z>y``@eyLb2GXRA?|O;AmOm_B3OqGKo?VS1by139`-&Ix z^~Q(u^NK50KuS4GJ=ZdvB*M`f^(?7YCntoSIYZ}68sQ$mgK1TaNAz;_#5R1CGE`}w zzQwpVUcT4VhiOx7W%d!}>BYo84NCnnVk$o^hDud?0Aef+-Xp=(_t$Y~O8Ip2Sti!< zNqwf&?`b2J6qCBruTlUw%lXz+YkN3kd+6o2y9Tw`?mH9QLoocdArOQZ5HUfx@eSU!=}lmPCt>)DWdaR0fYf?Aii(LWT-;|mm8{nZ z!hdIKBBhG|NAlj}qCT36<@oa+waLyYix-Z-dN2~&bKezDryXV@g*5sjcQKR0%XX@|XJcMku^AE2Gne$rqyHH@- zJjv)BSy&rnaiiT67}Hhf2~PxSMUOx|`s7)l&YJ(ps?P`yIJI)OBS6%Iu7pNthtW36 zg&cA(f60o5sfOTvwZW?bi*}xKQ-5GPmovk~N~92KTB~@ljV)*^lBOT)dtdn2S(DYO zzs0HXMnuo0sJb^!eV;L1m(2~}zs8-iG6MgL&sPcVi`ziAD+lSe@7a8s4oYLVtOB|+ zI&KsKO=iNLGKsA;f~iLuw|?Kc9M4I}kCXwp){T6AfJZIiXQPZet%uqv7J-Babfc&Sc5ptM&nc=yUeG3rYOAc&M3=z=877vp2Ko2Q;UC{LK1#b3N*DD|!?A?B@tE_}UoWx#dDf?VG<#TMwARabrJKV`p*GeB-5`6nmz1 zIo&R^Vd*^B{Wn)-iDsS6-9&+qf@kaYg7pAKazsE@cWi2QXvnZTqWQnOIbzS+(2;)*hp=2Z?brrY*}zN#KP zkTC4Btof?iI`HCYw`A(0(lAeF_i1+s7O?+1`mg>rt&OSnv43Od%RSE8DpSf&C2%hR z*6R_QkJY0BoijcUH-g5*fk!<=B)beh)Wm{;ktRH-l~MhebC3{XN=<|HjPj z*tZ#)XZ(MGrkok6{`FB?=xT2*`pDn#^~qKQB7KZp4cEg6^L^fRK$w{Rc7vjV0W*M|!nK>GknLvH`VgU0b!}b>L_agMM>Ji@#=lbx25t$q| zL*U|EIp5tpZ0d0P&_RPY#}5T~)#WIcPw&wSD))xxX+Ty4q)n(UCi4dVA?V0dfG6#xZVKCI8TD= z^}PMe6`8jYxFVeV@)554aPZqQvv>ee4H*h<7zGNw+;I*u&Gg*F%lLSZQUxelQC*ZD zbpn1%KXgj_>2xou#$!KO6pOY`b*b`f1`zc-3kr>sH zs14*41g9J5oU>t?pvNc2dJK$3Z<3kdiJ3w}q{}O%6CQY$p)(#umn)sf36NR@i+JwD zG$o5nCK!z89(l^$FH-H_BqlkjFG}@Bhuw8!$r$Zqp2pEKq{6QSh0T9P;3XCACc|_O zmEwBvnOYrxPQVr-tLAi%uXjD=l-VulhTzT1Bg;jMUgwJYVVC$qt14MhRC(0li|yxI zJMUo=)_4dOm8l!C%uDX!o{IF^4XdTNhL3{Qj{!}dI`JX}&j_BviwbV{R2OZK+GulF zQzKP*>I~E$Zhzs!WK5&Vm7|a7D(8A2B=j~dt*38dEG-{W8En4WQ!uPJ)We{+&L;M|0DTts(S*` z0)WmH6cWm22-ln3ZK8*nbb; zWJ#^70*ku;j=>PsQjHxlcY^xK%Y&3g8;IH&w^Lb!)jxK2=<9@cb7bROMHn(*vj5lYJ))ms z?I?w$_Z#mOt@<$M*b38r8%s`S$+%|i0jO=UP0f4RjKXf8LB*8%7W17t`Q^z5ZRZ19 ziDgyg2U+?!iZq#CR<~|kWN&!m*v|(afp2G)??3OY3cHf%$dA0J#6t$xX>|@m@K-zd znBH1#C7C&jX7dd#$rtPO-NUPAS!ZtgS~X^0 zY<_7BdrAemD94oxqyBz1TjC2L6+E@XkT1{LLizgNLB$y)t|qHOxH->8u|6pW*DYt@ zIh;o;jJGv4at8G)cRGwXe>*>no&8N&^Y`Zi-1TZfe9++L|0bT>e}hR-%7yt9YJmAy z*^-w@Qpq8EDfA14hl)=IW2RngR(T?ZTf31pmkT)g&*{b){Y-wK>UCfq&UG@-AUay5Y$jGo*3?{M9Lf`C$~0%iIVvp{a)L* zv$3tGrbLep`s=szo8HHK6P)0y)*IIse-qnWe1bc9!jI| zLBc=`*Jo>{J0?hm90l(roIm9yPnMx~QTqrxlMqZ-U zu{kw8d79K)HE(QnhV~5oY2JFoW9G}T9eXx@m_Fn4(_${W%acx?azCbZNAF*V7k!iO z-NLB6<;szJw5v7pe||j?aw_=9^T>oo`Mn9#<1Br|0yn#xr|4YM(k=nb1I>;Di7jY+ zo^MiGN%5%H{q)Pn&1J>&`Ce1;DOLU-s!KjB_>9Jqm3M(2!@(b$E|1FZBWH`S$t1;S zHfYUM894_}WvlLz>IQKY+O5ZO$k&Wb#%5AM5oCBb2oEPC+AV`<96bDr@vdlN{kNyV ziY94bM7sW0?tE7sAD5?ZS_s}*2+pDonaLG&8BvHlkfNk7#GhAHTQkX!u7kdlw7niT zO_?L9T*yb66|0S_Y_OfH53K-QD0$rt> z4p|gaWDlI1_BG7Z#Vr~9`3MmXFx4)-ah|MGe=7tf*laW`+GLsRHUnu)Gmnq=hzoc( z5cDqYFg*Tn{J_8)@clOmYjp(xe!;Xp;T0n5 z`lloMl%orbf@-^x9&~+VXS!jHAGa$^)GU{LSU!f@8G6;$G9e<9rj4%&xlc^r=&J)PDJbD$+J*gZ29$n~As= zUoXAr#lFl}+~rR~S6@*^*XhQy;mB0=gN>VpYSd8mG~BmnpZnp|cp0(;voaBl#<7Ep zp~|?XJkvKa!NA0o`84y3zxrJd-*znrJ2vX*gA74WL^Rj|(rt^ZE9(XQ`i zD%VqR1h%a$b4ASmI_776iLYuwGG~`VMx!?DQOX-)y8iu_vj0uEWxTC>9z3aEQoD5% zMTPKC>gvU*>>yAX3TDA*uSi7`Q!| zXbuA7=P)5O#djcZb*+;xuviR&}R1C{A-!;$G4M!|+QKQTrv=G}`RMF8bWrFlP8iTFvFt>#=aHy8s<_}<14OCZabs1!+qeLx~ z2C1dlR0Q_|_t&kTHG~0Pt8(wk#XdXx7~IZDyVZ*`t=MD7_TlEas!sF`_8|P4M7914 zrT>KMPT3o66J+fFDP}0IDZk!k@bW%k0(|dXT7j}*zVnj; znm=MfqKaoDFkPs>z^-8d#=cv@5pF)rp3b&{-h4{ANmD`N719lp%t=Yv)~!@S-3RZI zR|89mVqNzB(0kpYZ7ac9^N2eO45$n>N15*<7HWWvTwuer0&tkQ0}eEW5SeZWTM07) zdnJLl%xPy!cQP*;AmTvk|M#OP-IcFakJ=*+H5*+Gh;*3CNY%&nal)uDGd|c<4j|rv z*AZ0=WFfAN(PqZNFdMQ2*Y{Hk_ay5v#MT_w@CWZj& z5mMEh^4Re>FIbD6GxN@T+V*#1UG~hu5qJ+ksAGBJaznL!c^rEi+) zrxb*kQ{p%EHaI7Y6Oj_)1al38apdH?4H(Re#_ht2_8x4C4W+vEr5C8P0-}roJt!=n zrkzUG_%2bYCaK0N1)DYE?4!1yvD3Yvl3Ygc=>EhxUgBjR1-oEPimQRllXX3Kiqv^! zp9YrJe}l1%|50=nZcQ)VAKzyk zFhD3gir#^U*q9gN%J2L8 z7tZrO=e*v}bDr~NDYk(cK8R$Znq^MXQC*avtx)GTEKREk4{=4>-RPVmH$cTNmWsXsihZrT@ktsByFyVM2AK|nFl+IVzey1IKJC$$$tCK-T!)MQm~DQY{(GXGdCMdv zf4AQ~6KkV8XQe=D4rrtSg!@WIn8w3pZZ$_CwKIbnrT-dq8WTvND3h6>#Ya0+n8Xey)-oTx0lxm4 zNrE|+{svTfn%@rzqg>v?5jS%N_sc2KJFkYuHvBxvNI1%OJSigNqerNQFvAH^Y++g9 zfv=cZQFnYc{LKSnVX|u6Nq8U=L3RkI07`QprIS+mE|7-Wmt7`)invKEmVk9#meEOu zi>_kGbjTC2&Mgp@9S^9Hm+?4h^(t&G}-$jUl%;wP=zcegpyqPJ{VY0D?8 z)B@h|KD4@gzSx-u?@~BF#rH!vQ{{>Q`TY{P2Fg&o`+?-%)ug0u=p)Fuk-N%Iua`uh z0+54FLwE#3X_cZpLC2h-%UepWg%n|9#8|c)V=)CTa8rx{;rxn@_SrZbtUxAE^fIOY z8}F)?JO93>Oi3iDWm6RwC|8E*mX^7KzfN5UOE|iJHpXP%#smZGQ50h_Qkb(MQy-zj z3dS>|Wc#jaS#CS*QU5H+R)^fIedvw)EYoWFiF;_XfvY6Ot{MC!>hTy0G6sMPoZ(*a z$c$DKep3>#Y4baEQ~|l7>1x`5zrx>r>dVUYF$H)~|n#EzRU*?Y#D*M2Lf9^U>u@mFxpj?hh)gu@*lUhLZYG}$kQ zFB6OKp{o^3u4oBYOTrJB9A(%{KpIcD_s*ObNrMtE`7}ijr-uCx$RJn{eoPFLX;xeT zJxm2*YQ)$tGstsQgra9)0Y`MPvE; zOOuvw##YWcf4@KZq(IKf%L=hBZT64XY9v6}*QCKlW6wR4Mv~|ECBEstXk+`!e_z$N zQ1rN--!YILSBy)V5mMdPb|Pig+>TH;VeThfv3OgFpgVq?rE6{S+xmmFh=aDGjilXW zVQU@z)34PA9Jdcl0xgb|*mT}HZGSDzI@!2Oi{e&NjEZ`l*4~^~2`>Uku&337)+4WH zgq=3O5Ow9yOGAVvnL%YMtXn6dPxt4M{|BvHj>%ADU9YTyhayWo*Ve9Yz_ZRVK1QW& zJ%uByYH6?bG*X(etK3C$E3GBo?7nV5kfZlj3B)lMw$QL5yvx;}YbJJ6TN93U-Dq|{ z_y*r_*V9f5pX;0-7w}3Dwmf$2esAoqIIV!%wi=TG0}UeWX3OgrRtnEy1qj)eX8AFe zmQljP$T60aUtM9toBQXk?DaZ9_!Cp1=k0!V$T4Tle?yM`7x)Z8&e;|O+QmjI6pW$1 zH8H)|_J##)i_5kJV|aB1#z_{(CVlg<2cv~S&DA3B4&7ia}^*5 zvR$ApSbkfa`5$O08_20U&kZD2J621?EEz6C8gQ-7{iWp|11?Tu53Pjd4mU{(R8%?5 zrPhO!@3uR{rmQT~z9824dSbt3ZQb$s|2+58`<$#m}h8EJbtoE z%hwPc28;NVTx%4e&Pwm-&osSZ>rKiM8$$i9JojBAiFWp+1z5SOPF+RsJs0~9{MOPI zT~o0w0vRH!`D|##FHwGxlG%rOr&|wBW#HKRoINCuQ-elSo}_n$o{PGCFN5uOVBmo+ zc3=O4zNa!HpVrj1`eBcD9|)4BG#zdpG5+K zr)zknSwSE$-{`V9=AL{G!l^@s@eJE$>2Q>Je{E7sZp2o(CLZC zxaH1ACvx2*RJb%`#;t{yi+el_I+|3PLsROHPPi;Q!IWIR>!B8!+lft2YvpM>;Uu&7 zi#cj+BWisx&{A<*5l*OZ(r|d`_80&hf`dwx<-$D`N(e$;Ww*K3QfsN{V%v#ZN?q21 zCg*En%(-(R3u(%GsH?YBqcn&5%`n#;!RFgyMAXdf7~J7^#OeJqW^&E7Dh=uPrzIBO zMTOxF8RU7d=**RmUapL=n-3eq-eVDaiOvk`4Lh{?g_OXciUg&gHP+QG|DNE8boM%wHRGW{#c>7h@}YZzh6W0dZNxdSoILVmu#X3(B9#S?fP5=bW$uc!Ku3y47+bR!FgMb$e3!7_) z$y2>+i)7dQJ1j)(=D4m~^ zDHbfYVAPj{RLvTFw3QF_Gk@IPQ67f7j&NQFMq{;TDMO|*Dt%J zMz|Q<7I4QY&&;Q;fnwNK6_59B4OTs_QOQ^`!DHzep6eYQ*Jn}P`(=1BA{xL=cdNAc zuX1MzGF0AkX<>rbEgE5(akB3A~ ze6|v2d&>07L!V79+YA&z4SJJZ9x>k9{gW7QIsD7@T>Q%64BfztmJRcN+TI>{?F5x; zdI~dM*VlOVb|xNLwjhEAVz&UjwNM#=VW5 zb(u05cS<#Elm2}`6TAuHSuQ@>p*~OdG8y#1N?KcwtV3lFu;K7xu?p<9Mn#t`NBzD# z&1>GbI#T0aV@!Zs)V->J8BtkNT|gI3envHIBSe@tyK}D@%H3eAML}B#TMhd79$sCjX9frVeCMKDuw(Gl_>)2sKPaetg4<`Yu%*>5maJ_6yoAyLlk zf`8$^M9;jFT#{o@9Leq)3m%_OiGR;uat@h))>d4%x^r!R>D&3#!Vg#HFZhN1q2K&B zYuuq=al+`UvaAl7dU|a&aBChF7XbH^aR7Ow9vR~}{%+RC%=*;Tp(hnpa-YDIamP^p z?=!9lj5m;;T1JHT|NTU?8t)Z2qq+Od(}OzG!E9VD}X2kGq}nE z4k!t^VMq|M?ykZx%>N1S!we4}`OJe>f<|c5A))W1EH@AbIe=-xJdSo%x*XK<_Q>Ys=85){^^P|V3AdCTuin^HJQ zfSJ-*nvqCPAz?)SPqz(}O7o=EEuf6(TP!Tlo1$*R>agBD!Q~OV$o($wpZ@dw`>^Wt zhn?`C{hFQM?-`N2RPQ$Xodj@`CL8R)JdKl@etbykd{ro#+BYdX-fPpyIu;&flz63sh< zsR`JK4sW+U?dUZoGt}XQ1nSIF4qtZ2CFHUf0KNzED?#>eA*@OaGg(08(lLYC$$9rx zK0*(=_W@r-fWJWYH0a=8N-}J#yayo6gd*g-2%Im1l}O+{-_&kEFqs5rD=~1yD*8cU z^jUe|Gbdd}CN)<`8P9EC=eMk2H$wem=>?~&Vs^Z;yj|3`+3IChP|5w{@bK6Hr+=@{NKS1AN%%e{NA~ciBpFbeey8J5aI7KfZog$EF0& zC4?qoc!H9e$Rj2L1nnB@W;H~%0CL;d@XmIRL3X@`y&bhJ+aj4@v{o9_VW6dQ%z4a1 z>J16F7krs*i0j*h`X4&3g?`MJ#~c6kEkD$|2#CBdpP^^uxb~MvN>XIR6i}~Xy|h4 zUO@F~i0_+ZlZGu%EQX|(#B+|O%cN2p={$TnL1V3A2?*7(AF{D;Q1## z5ChnQQ_W+bG)1x+V(9xm%C!ZkRu$?mrcvzuP*-bU!nmY-y><`kj8K&(zo&J#e`w#pHb%G?Fkr$u0LmZiS{mNI3FH)QQafQ$h9 zSBi3NO?lA~bOja|X;@3?G#u3q`OCwcrb$=A$6Yc)xQ=RaCD)7B5D< zaf?3m3V0M;boQY-8C1;K9y2*uG++grffh^Ri=8)I-nro?s$8Av=y@iRFTm6y0)wTH z1yQEN8{RDP{5chyv;ZB0BP|zD$C$9ZWNh$kxf&fDn-q490lqA68LNJh{sUFLiE=1) zJ5xY^iq!i|&`eV=(a8ZTR_n@rbIT%}GC8T}%H|PM>rlfG05CTU>pV9R%359!tcwbf|Re7C=q${C}gz?r5g)FHGoaI@7lCnTX|KROf=sk`(IjwJ?og^?4bW zGGOnmsM;_HtcqlFYj@g^4ENnbIFb^VMS!wFNo;!S_AS$suwRF#^Gnn{-422@ul;M~ zS4#Mgb;Otn%T6z~k2ljPKJ{zW{laGavF@XeEp~ow9&m6tuGrwSw9X-`zv6#dx5E0| zGc>!h-LoT9?NzA7T$XFN5ks-zcSIN?G|4+0SZ4U@irb&5Hrfc7PJmo24qHo8#gi)S zQyuu(l?6~`6|%B3B}KE&M~eiy&VXhU;QKqE2~u!JDgw(uQLDmNrC@i#Wk33rr$XqL zH*zsT>@q59=F6E;q1p%ozRG}0*v|3-?)(5~0E&>mr`~Wfe`qrQT2j%KcuL#D=s)#W zKipMsTDIud9bS21TJ;j-+b5eZKz0g{$y)-sCW7tLEJZ6!D`9(>OguK+@Zu`{$`@R; z`jq`L1)7q8^vL8m_tsivTiQ$%(aH;LAHF9z zgLTXr;sZ;MdaZgDCGd56OhAyhfXCiBa`Mur~Rt*OdH)DFx$U!im8m%%PZ3tAJ^P;k_}M zxg-q%8tFi2zABXMz@c$td+k4UV8vb@Owfz~p6@0sx7)xo%+s_3<~JA)@+H^oRDN>%%Bd=Kt4B4C+q8YkmP1I zrVHKV9i^x*VzQGIL1TgNIH(USJG2@VAe9pdq32aC$)&TkO%D=(=vXIO+bITJWy2f;3iV7o-HDAL8Y8K9~tlAvdRQUD*3 zVmMWPGx|d-D9q@_4DCKlj_zCzm@8ce@#TSWF!IiJNV`OR_5I{7hiA$QP z=L=?(@AVqpQ%TT02r4ygG!&;WpEd6~(gX)SKpYnkW-BOHksgzI{}2-t@>1;h(B2Vu zE)@sMAw49cuh+?3k9nqJ^FX<%~*d6wo+7ErO^7*eb5HwH3t0c9z)1nbUwa(Uk< zhH3Gm#VUmxOb6Y}E^$;&G5n6+FnjSD!+wj|m_<*}_3aUYxPWY0K>o@=BWb7uwsOZ7;QQ!^Tkk**u)rS%W*-Q63__R-z<4@l zxxaNZ|HJFi-i6e(i?!mHzH4VZN<$GBCmPq#CL)#73sXd}q zXKO=$%>*MaTX^%M5%a|t+ruLu$vC^CKNHJ5+8Fkq8n|?52XSxu9*i6u)qmDwf_8iNkjET-(@ zFE<*+9c;shX#e_%!6KXtGgvN70--YVSqC)!E76_`o$3#o3Xi|=`9jR=m9v1owNY92 zN2{av_Xc|HPOPVckBWaBrGuLo##RT=Od;aff|tV-@OVoq#~`IMKnN=lD1r`o_nm+9 z+H&;1U#}NFG~$CkyXp}WKb%-3#8R}GOc<7q@l3!h0%54Ljyb+)D z*1v8zu?^fEf)ihk`f*2}*XnZ+Bzf=s4)xo~>|fHe7(i z0A8SGckdyVhlsvRTP7gPW2FEya+?SL5Y8fwyZzIOmqx6pZY+Vv(W*8KXn-ae`>RpR z>M0@{&Mp52>(muZ5@_za9s=7Hd{C;OQgn*F@cM2t`ZOVcLob|T#gn_kJfAE>cAh5n zjxB~JzPJHzG|S9h=(f>MS4BoIiu&a9SzEG^qD2vXKo~G->Ada%;Jr7bk|4qz2`e%y z0Z$&b^}-ukOWlKP0W2QMIOTru&0-JYK;_7xwwDskeD>6MMVh5R!qoL3+8O;^{BVyO zq7kxedh<(br>wjlo`1z*AeH*ur8l$d#LI1S(5$mPd#?O3amvejWb9w3_y_v7Lhk0c z`wnfF5ygLYXen%`4t4~ZUH;LXgpqZ&Zum{t9d9|5*WIaYokpRxSk9y3^$|LQ{BnrA z2d5Zi9P^%1Xuc|U=7D1kuUvM!2M(m+e}1~DzN0R_G&avc9%MT&p%<$+FoY#=T`p1< zG_$D()%gF@NyeBi7=S*ZDQp2N{CmxEGNT}CMLaB==D0PwPS&(WY^v{_4{R!N6;@oPNJ$e3J8O@?CuWR ztkSz3LbhpBr%1@**z`P}J9p)IzeF{@=Lezk(nGWx=6@YNS&UQ>+Jz5g&WM4pc~vML z5qb~0NT!*{D2O%2mvPe?je6**rizyS8B|n@`>uam&vr&_x+y=& zW?4(oU)m-Y2-O=?(lezJ8tv;s`(=^8OX7jZv{)wWU~fS?8|6x!9R6@OXlS@t^FyWM zr-j2C&ff#Y*%zW3>X zwuLdp^bdvZa)59%x#bR_f^{g3&V=7Bc*evdiv{B_r}afcv5r;RiWfe0Au82&$|$i# zw{acfyHc|Xdd|R$#ZBAR>^nP2uh@A$>es|UF8AWFH+)tCL zk@#i3{P>tpt(CF;0j6vC7+~kaq2UrUuqEA>)ui~cJFz2|{ol7o83=uQ?9|Dz=Ev@) ziSM?yIkv(46+=lm?{NDD{>!X96iD2#{pyyBtH^RgDRA;LLLTjFl7a#=XO;5mc=jJI zwaMaGzK{75?V54$?k;z&5rVf?3lohe$|O8`9f-WvD*8CT49)brJ(UTZRoH(%afJ+> z85UK@9g)ghUGVTsW5Ot8ak9r#PgOe9wy`@|)yZ8?)-+UCcwwsK++%fTHBnhEsR(pR z#8F!nu?rSoAU{QNO~oqu*7MB065#tj-fAB)iMw=XLLXIzN-Ed-Npr)sJC9<-b|*=z{{D zb7r6RU2ccnFU(!1C(XSFFTB+{N~$)2Mj23)c;py8_716l1&dimtE`UUYFY6^wm8Z=9&5`HwCwi;r4NzQ zufYGO@*+{??zN@1BPld-y>zfi@!kdbbRZE)0hS_mtF@}V%%5P zYK)CyEP`#SO7?7q&IKP@23e#@3@zmm<}qwYmNca8WP-ltr|v<4;l8pIW|329tHy{l zHioWyGUOS6p}rfFv2AwjpvS}PakVzD6iyuwFDs~2bzbbRzxm*FBzV zyUq^H_hGGy9Q~=$mkT;m-^62nN#5Bck=_is#rGQ3fi$)qJ zwK0IE(wd!R;k_2AuhC_D`QqAv%onDb6};t zY@9NwYNEw4#_O@7r@(EmfM!T2o?b&9Y}be@sg+HebiO)7@Y3%092hQ9mn+CQI-z%R zU?OXD?rW5FZB==8Aya*@pu^^DdS}$=FI=JPRzv5u=)Q(|pu&HU^W-CgZM60l6f!T= z_5xq2Xb`hHG6`@mkv;k*m{OV8xZ zkB>V_xemBh5QVF6`#XIV$FdiKCy}MrXR;>!xCA+1Uz%!qm~$mPsT%Tl=5Nu|wh0^@ ztcKJJn7UJQ#KYcMqj&B?ePQJFHRej4@`XNXbWCfgf&OdZzC8*C?&w1KzwND+nx*GT zMj0NHFsdm#x9PM_M5o^q7OFxy`7B{4FH}iSIUy2a&>;pz%iNwE#{g->IAMGJt5l=U z3kz?Wxfh2LFe2F6`ynxp3~dH)Ju}E%#^}JX=b4y(Laj}h#kq)iX8O6R={=YKJ@-u( zbNDvwa+1f^sXcpA7DqMq^e?@N-AE|2sd`gp!A~ip4W1tH)DLlSlmFCM_0S|BOKEO? znMttK#Rm-Sel#y(sl_z2GwY_d%K)h2Nhht1xD8`xI!bQyutc#ykwV>XFagwYTV5#4M(wds%DNy)%=AkdDA#XjnsXWnu_{|<2M$5>^sTG) zukInj2|Hn73tYRZs%^q5qb_;VbbV(u%cN|$tj+;7YyEtj?3fI&$&7(bR&7& zbV~?zES)!IB{L^e2asD$)iyo~ZPi_Ey>EvdeNj$)#q7=FQ4OfsQgC}01Ww%6pk5`r zT#x_N?HCEzOWA6R>^-Fz6;PQIh}*eg-br%?pA+xPWqFr6CWj#dh>(SWXqZ>D_ zluJmwPgnl>1;vBp7B>FQ_u*{5<>Zra<_ny{E{>uuhp*TK=n5)qju^9}&_{NWQ9-wqh! zog9T~OF6hBiWEm=afXOx!KkEX6XO@bJA^eif1W24v=cx)vKT&fgL#1AIur?7OYazB zzzpjUSRv#i*#6esIGSE!M@Ko4V7JgJl)>^{o3+nA&pn&7Osxm!DIhk3Zd}?tv7@iZ zPf2^j6qjamVkE=Bk?e^OgRj?=!n=9uNU(vgX9*bx<^$`Sr3W^PRIvF#=#kokA6m4GqBDntTuCXL&W;tX5CwYOv- zX;}H3lZjH55xNTWxCkFf(YwbyVFphxnAUf)c8}x`#6F-+wq`wW^;1{TPax zRVCOyT;FGErUh~wT4}v9C*Sf`fh(Bd)PXM^;%DUcRUDDmevOo9lvESXJ6LJmd+az{ zaso|27?EIxGKNnLXrM*r{w{a~A9#f;<^}UC=x}Qf>?Sh>f z8Q1W?o2}z*ml8^!{k*Q%&A%{Qr8a*Kf&xcS=8;lZoDfQkgp}ST!fbYgNYl zo_k({aGhk^;QA3s(?0*f((CRg4DkYy9Q}R)ZqvbTn4&w&ZHyOOeLRiuRUEM5t=H%i zm-U4h$1892zYKC1LbI>uslq6$q8mQ!&?X-=%KXV~C;bvXwXy229GC8P%8%}f`JwAy z(1}9dYh=4UWJs|9?KA{E9;4*arf43;+E1>H_VwGk#`GjJShwC7O*-+(3+7Id96Sz^ zvRI6t0Vt#*KQTCv&lz3j?oir!^ueP&t&qGoy@>-w|IVtk@oS8J%Pgx`sCIK`WZA!? z1k1kYx4IXW8cNz{`yZsUy`rr33MxbD;g$tpKT>hxkn4LA>F|xo+11g%2IkRZ?!3pn zj|??Z`#krxQ0>r82&yQb1Vb!9FEKz0vHgT90ith6CaXa?@u9&JGPI<#r~O*NljG_$ ztZk)~)tXRWi{kAIAcuu}I#t%PT9yIb%v&dA&QHxcW|B^mi01c7P9)fkZE@#l zD@}$?z-g)gCxYxivZ=CQG7hfEXQ`=`B_D!i50yT7_K*-$LfW{kw!UyBa&EEc41#cl zBX(>lP|WON%7UP~=3ugP_zuP$Kf!aqbk$Td9pS!M%W^dYuP^Che3CChyg z_PN@4-)nG55!t57R<&eMwnSZZ{3a~uvH&(f$-mM$UM2zaXayX%4ofTm%Wi0UW|n^> zN#&zRp+m*7nIWNFpwK$wuXPZ(cz1jf{kFMRVodY5OR$_x{@Y7&ZJt%#jky0H8fRVy zKt7oO?}oC@8}Gjw^$Xy3XNU`Oy|?^|C~kMaRv>OZL*MK*1d`UOE16zT63Cf9s335@ z`GpO-wO(^jkevW24HX68zzUIYB_hlGvh0X_$=~W|^Pw<`r@Z$49b@N*xBr+Kvqt>~ zb=#@oo9G!nQ{7%4xdbu6)i2zToniLzS$7O+PSRLd(X)_5P6UlDOI!6fJxv;l`ER17 zcBV~v6TTbyXqGcMq84;+e7I_;t$Gn;v;iqhE`IfmqXpvnEwWyR@zKvLLWjzC_?~<; ze$o%R?G|xQp8_zE1V19+ z5Xq5ye0M-PD&MRVxOYakVn^Vl3#1?s7nyP#^&#cU7v|nbY5e_4wKsJ}gD`E}Wapxd z6W``H=cW;lc zCE9rZQ@N#eL}6=ARf67Yeb*LwJsgnBfNUp%Od`QC1R$6KXhnLxSl28T*I22Xl9|;g za}s2fM}an|`uGx^-$~<7c5P*vKX;qG+{Qr^fc}aE$p0V41dHRBJ?$f?FqzG3Ro5HK zEFx)^IFk1U&od<{Y>~MXi^{A!@hjIbo6kZrorl(ouM%n_3YZ-P^N4IWN zb;INx3&mSn^mpU?QBLAVlA-cXKkUBkTa4a6(Z*-{D7nmT%3OX**EOwB%+r7dX=K)1 z4y>_ljDKHAW5R2Ts_o#!0&wCwH&&?K9%-x+_38jNH9v*^UIhJLDHSntO{e{(*buy^ z2&Fc$v|=7K2%$)s^|}&BJjmHAr98Jq=_Kw{TOU@wszBp_ioR@}q_{hqQf+hV`yZG) zU#!0XmYo5N3x;VkP$w+}p}Wy0J7IA07EVc__tSwvJx2sT5CH-k2w}byp7lB}#D@)L z0u5fQ0{Ie36#v@L|4h9m7}KqRes0PPEe$`SvRyOfQ4Bh0&;k zD;GPF5GoyzzxZX3w93px02v1{Vz4}o5T1ESVT>dv6Z4_(;SocpXAc|g&MHEX(3y5| zVRW`E6J$ipR84*t^bo#}_|kfN&br0B&|Yrek^LK&lE1k?|7K2nzWMT_#zozi$qLKr z9rZ0Z+F;mg58dt?r}a35MKCY>f)A-UPFiH4244Cew2#_-Fp!?5{ULspP~q_5L_%tQ zUg`(U59ro+y)mcJE_@OJ5hC6Hw;rb>>lJER}cOjnn{jK^%lV z+bItEIUiSIKI#uaPAqe2n;hXJv*Kj5tof+k4+qjO@w<`w`~~q@_j6lIGt)){mJ1y) z009YNNCKT_K!U{3ijQ`s8&Gc#`^6Zp$u;!xBQNrzjo)y52DbMa*lRy*`+nQ`LP>oZ znA-_?rAXrSWMND(ylj{gj-rA5pG2R*u4C-^EJR&HAPrnl6k&x-7J^D0t}b}qG0!e2 zy12e)c7U}%5^&m>B{SLu$d`B~Xx-&yn0C%S0oWGtQ|0LMLlr09tpt5*zkcQXbMi@*R00;=p(~)rHt)9%&3sS|(nwk(H!LrD!uBGm zxUW6Nb=^8it`)>h7?E_f*E29_m&2xI@$Nd9>;gP6jrZ*kZ-*K$ON{~9v2nJsdK;3e zF(cl(CI6&T9?FD75_uj(PRb$_wE!cLI66$$kwt`#uypkGc@C0iNsBq_uf^J;)Hvcn$cc+Zl9vjO8ZV_%YD)pd|7jEd)FuQ#6*@$HdP#7qWCIUfY$uI zIWe zB$r-5RZdb>{`KwW?b7azA6)}#lkp|H#7+{rTT*D3bIervp)Z~8yz{0nSz#efgobyE zlK!3AvT)lsr=Nw%kvC#(EA=n_+c=+906OD-+)@kVtnpb|#o8Vd=kj4B|6bP%_8B{i z1LvEsgr8q*{PzB@|Dtxh9Y>_p77YGM{BWZvOLsng!9x*C#$j2I1g1oFkC0WIdksVs zLLiO{(_AndDRDqARTs+{)GWgtx7B@uY!MA;k^u4-ItzxdOvsv*`AkD-$)*v!ITiB& zWh(d1!DT&!vdk>7KORr0sva^?uhOcG0VARDU15e=-goXy$Y?UI0uGiG(gg0vdCD3( zb#t7DvH87d1kz1X95-VODX?UF#qkTc)q<-mE!^X*60OBh645@7#Fe#=?@Hh)^oEWX zn`sv%xo>}#X*B`=(lwU6|F7a@gre2#s<&YWBcZgXL%Qm_%l>p}5hRFE8+zfQm0?(D zc`$6T<;;IlOFmW7qLJ}&G$oAq?Y{h&W$Z$b zrb^z#9hmGGFipu)Is3A)a<(c+PW>}^eeL)IE#u>}Msm}jxreNr<92`h+eNVJv{~o=CpM-a`54vJm$1fk+uYZ;k^bxQl~bUY9blzT4#kH9e9N zK(+=3eQ2jJW>CV8D`_02$*Dn~q%s>4K`U=WOZC~53x9W zmq=fW%Q4ia3FVe?3RuLcJ^K-5-}vUSxIYuPpWwVH(HI2ssT++@=~F@g+46#0ey1jY zO5xB|9A{gMxwvf0Td!h}BBQ?4$5t^*6C-p^uYv%mKlz{E*jhTv)cDcGxgL{9ZqBJV z-<#4X)dSDZ&n0e{v6D?x^Fa4%vYLr!T$o)CC$Z2&qRY*j+2k?gp0{;$m06X8<9qT)NaaaMC zdI72#^Lg4UQ_6>hW*9tUc%pk|F&Q0nOf+9&{(%8s{oxLITBrT(@|Ejv+e;N2#0tSl z_h9)alaKkEglAq(*hN41@+fRzZgVQ%f8xhB;pRB_4|~Jad}$J!kMpua7l@UmQi-@Bs@L=o>32kyY-cAbrR-_ zC6Ch?^UIo`ns6_4|qCS%Vr6`9jFGV#r=Kq=dXcs_Z*`0sRiy2IcF5 zT?$sRvkKJ8J8(B%MIvNxb>GteVc&1LDaY_Kz29PRw~H!!3(K6TSXo;hns%s+S`Ue2 z%!8Z1eEMRJK777$hIHHp>JC^%GR+b|+>2KIwR?9j#&Q>wIwXpa6$J~h9Y3;#>01 z1e!RseE9mc4PkAhAqRUR-PyD--gxq;=x>ETsP6NvR<~Or7ikSSyW)R zYSe7#ZriYv4jsbtd-ACcKFOdQXSkgGwQdJn<}~h_O;hEMr6i}1Ueb|6(F?`RlMSWE*mS)$zi}4-8&h?tOcBsOC51-MjVFZ+xz=zfA_M!MSGZwu!AexNjsDJj%Hl)9*D=3K9%lGcQp$&( zLB&)D1irnv+N=ak;wR|ubaRzy=Wi+H)$ zukTQia#Zt_(h*u}v(AhXg(blD!Wr-)r|>m^ zpo4lJ;Ce6N#}_1TNjuA-R8M-KehPG3n)=2M@WF!V~OuEU|q$QUfoV#c9PF;YZ{0hGMdO~%1uY(jXsCv3aEz3%lIsi-qq8pm&1rL zOaSV}hdw#$%TzaK>D5u3K$;QG7{DKBb3h!|)l-))ul!e`cQn|;wp7Ql#29uftw@?4 zR-)ymLVLf}uAP62ZcKzN!Rp}#6Tpr$%rwS*V^ABa0)QVB zil8UlM`1))jQiLmea%M}hiq>4rj5oJQQ| z9&0mAv}XqmlRSg}`TaB{Sz#4uF?NxO>bQ%zML8J5!=9Gu=`MHfn#T(avhM)oMQUO- z1iA^FVmyTtKn|eiFT2J*uwKAD)?%mF3VfCte-;O&fELn0tIWDwHb#c^KOg=PH15N_ zwfzT2E{~1RT}!oogL7u$3D451J5oHY)lc3WO^Y!cf{cDQID-e*PZ)oswj?ts4A3U z&E37}+byp(-*vRjxv41An%Q~CJMUeS_Zf=QrUU`vZ1Vw=YB&Z=rj8XGRwrxHMP--E zKUh_MNV<7!By3k4U*&liZLU66-bW{CjQkrgHkTMRjhQe3E2WdrrZI(ej^beRzj(#G zg!X0Xlj9}+s!K(Gh%x2!fx@Ne=B2>>q}QRncubKv!C!LMdY>cd!rhZQBXFSqk!l}Y zGMYZ?G*o1`8@qPIgu0XtVx)k~*}BA6diR-l;d>X+)&)~EBJ&%fXQQ*5Lo*3+2*mjAp@GwM{J%`)z*LYE^}waX8VNJH<}1xqP17vxHo zi~MjHSe)nPJV?=*3V1e}D=qB#J(-_Hy^x})vj~g^hHGUq)ySy#I0{RbP+0wHDj)`4 zq;%;J)9Nu8GV-d#7jBwKhk8+G;xT_#JCB{&8$D4p5s8Sn{1#{OJa=gsm4c8NBXEMf zwPs-CCg{MDrxITi^GS>)f=CN)zx4nMAFv$_;AEl;stJQ7YG?9Y0Z!%4Az;~-~Ri?IaQi33Vmk~Qzz_xWbb_r)~y3G-;E&w4&=@ivhi8xPV5_@+WH1=$*{q)THtf* z6qfqf5^S#bD(%l0I@Icj=)KEtwu+diLNLxgIjgq;=+(uMmfS8p;5aatJC-DADdMzI z){3^Vx%Tlk4Y~9wj;;WrwO)GE0k-@88a|SjFD%E{CHlLxin^doi}I25F)apb>%U3c z+_C|ex-VA$49E)1huFSQiDiL-R+{AC%RW32P~=N;ygE%Ms8E-4JO?490e%U)YMbzO zR9FXjf=L~^ec<8LAEm9DtCu~G4HsqM?%+PbbC_|BOE;$pHZo_#c}a-dKaStVmfSY2 zTLppjR)PPbj4YUx|N1#lW8lw+ah=~1HQ3DE`6_j(+uvO=n}N7Rvu z<{1g8527UH`~3r+*YkQkzr5d1!z3qA!x&uP43;?p2p#}<856@5AUKsGz3K3U#r9LJ z>CII+3^$AT{^o$P>9U7$BU>V}_jqZsr%LzE-CvU^%W4>l5+4V@95sgx5W`E>IPqtL z51sR9X?*W@!i2!l7k75vrwQ9_3iIo{+fA9{20{`~>0(n)hNb1r3Bb2g8oc-2?9ORa zWC?}si>nq39f0{+gB)g~_es#^DQrvJ@w5x&+{pm-K&0I;j{Il;Wgs5daFEe;_u>x; z7JtN`Y6GED&`G-7tD1m0QZ^z=Pm;8KOa&VF-NhVf&P6D31fx20){OI1?Gt- zf8I`VCq1TE0b4BcRBs$N#1n~j{XH4`hZv9CNZJR71WXw6(tjTk8>|D}E!##S@BI8O zAtposNCM0UZ9!_JvNyYGC?d9ACfj^Zlo)nSWLYW^?bd(-MqQZ=e(;TeuF9c)NhVgtrTH2?=HPUz#%+oyl zev{5fn#b^t`%@xpVi1M_-H7}hm)u|-4}alw5xM*FAZ)(R{#(UUo(C-cVZ{uyrNCMr z&4v1QDxPq3MHjSe;YwvFrlTAzY0gAsCc-4MPxIRuzJt0OJ=b0r4 zZ~0r=KYu(rVc7tI3nWPPrpO)?+i4EPa1HkU8kW}vYYu>C$#p_&ZjOcyXMoHU)YGv` zIQWFuYl>MaGFvGOj7AWp8)h!2f%?*bA`u|Lid66jQJ>N;--h8qJR45G%NLwRjNmi~ z9tKCG-FbkHP(mWRCyeu78;79?=^R0D8WRuY1vw+az;w>o_*WWlLaZ!vg`PT1+2kAt zjYo<;jYIr)lC>!)OEgI;0i9|0Z!dh$FJpDR;Bl~`Yp3hA5kK-&*h;Jha27SA`Eq0pAz;Ks6dL6E(ZVZSH zADQ8bynpXf&*uDwrpS1{VpaV}&h1kgwdQG1>kU4+Y0k^#XRjo7%R#>g+;ZqUApD@zM zI^5&nrydI>G^fJU#Cj&3q%%1T5n#X0IuKaIVVh2)f@1INsBTNK0;waQ8)2~W zP=Ta763D9T*%V4Fg=qz^!Yibom>>*~qo<3btR%u@&9Y>QRw33%JVhGgVmu4WmgP$V z=DQQTKxOWX*fF>xg9XXMYS*P@iK1|wAS2!NbRJW8wv2f6#Ln$fE$wZYY*E-sXP)15 zB@Us=GHS*VT*Gs5gbH%m><^I-0bqxIL`s%=eT&UYQDe=G+mX^a4YDM2Znp+hB5|Wy z!OU)nBWOD%TuAXIQz65DJ83ynAhB^3cHMKx+OypE9EX%3jV}msEQcixL4`B7&t_X@ zvds$x-Sw9nJ$l`i1S8MjZoH#B#Kymi^2@c(S6Xk$Ywus1`ue0lj4^t{?|XMh?qGbL zG^gPaci@BZ&BQIVAtgJNgPXDc+(@mJ1i^HL& z(V4%o#TMDP2O}<56~Uu&H>gA@;ZG?Ka>OGeKwycdgxe>NwWp(wb|_)SB?xK51bUJD zVPY1)qkYO;rDh3v+*Y+4(pVX$tkD>+I%a`n>#u=F2H*!QDvz9)96Z&r3}C@;`uC`` z9%~<-os%SDvPahe4EkTrU_=Vg^!uBGTAJ6Ht}UX3O?E?pgLs|tW15-p;HV6hX7eH?6>i}^cJ{?>>2ogCqpDkV8Cu%`;2`k3D-%MK zNp;-BYj?*}Nj6~Zg;Y{bV3G0=ozr450Gs0s)q1`SG=_W^2tmJBA~{@tV{D|SF#(xEYZ7Gh9VMp30gmeBF)_jP7_~hA zDcA>OC9$mS1BXcFu7l|-CUpM)V@0=Q0*Qzq+dIudfGy5~@0TuM|EgvaJKi*ZQ%dIu zV5Yj(4}o{pVyWPU5q|ypl0wRHumIqjl(s7_WkqHBwQ-6d3QPKO!KR zh8ME}3g(O2yYR##RPh1XR;$C(2juJ!?mB*RbQ)hKHVcOj-~=GvEwFhZ8VAJMrKRBn zZAw0;EO&m~(ToBKn4?t>f(w$Li-q9wL>2;kvA=df4>^&NN39VPp1xb!w9m(BUy z!c1|Pr|JPDghb>$?u~$-_(Q(!KNc2kbT|YBP+^+WSW=ProaS|}+v}hov7UISkYhQF zuVxv#mV9o6uDN4PsxKB#4r)*qynDQTr&S?hRkm#5 z%yEBlkoW?1#Cv+D2)@YeK3g`SaQvr}IBK+v(=v zPTT;W*t+L;?={Fx0*XL=_aw^+MHj^5ZvJTKlz#_Mm&|;W!=8%fpNz}Y+AWT7@y#vQ zbuNijDCY=pzkhNC;Y!oBhM+1^5lx6J@W@wy+zx@CtU0=oOfQndgOKw8uu(@}PM`}8 z{d-j6<~I^YRL>m~aKH=w-x3rme+B!O?tv-y^G65U-#cx(Vb-vpcCL}t0-Zu=IWapBM^C{G)li>3wM7Q03&6w$jB84XKRYlNH`*X!BRln2xxXj zjMcLa5$CI3I4u*uTkE(Oa%V8Bz0t5Fm=%L~?>+engXk{LkGr->&caO8?)O~CRhpd5 zIU{3sqeJ_UNq0h6(n+^rpO|^}De0m)qYm$uJSbP`;_~U$LlqD?R0h zNq6q15e~3YGh~QSGw;=eGk0&WjUz7uZc3)oN*uVnCSb2mI{wZIkVIbONo&1%d=2!c z4|HgK@OU&>Lj=XuOBO?J1GpL5((T$v8khR>*>hmI{D2A9Kv2x{F;B~D-|u|Ur!< zk+A>p_vS_dI3>CGhUm3hWLO05^{O;C?in&i9+jVRR{g}T^V&-@wIWC{_ffzPeI5b> z3wuuIa$G0WsCNf{D_LDq?+1W-u*J=!#C#hRZTt-zE3!>TPSN4V6ynE{^YM~I-Vz7# zw`BNQigV$lRefH6DEY0b!lNflOl%ZPR{>)>E>ObpK4SG9b7Y`_!@4(8WI^rdJ)oKi zKY|wo^m>K3&4(88)$0!t+5SXiF5FvoyW$*B; z>;$7(!1K3t?P+f5s$XuBp_Vi^XX){O#cm`ssxy^_;5dic#S+tK{~ka+w%1&x^K2Q? zXINm5433(7VAaL${O5ijEhP;*P-MmAnkfwupGKlJe>NU388ltNl+;}j3?)LhmJrK0 zg_vE`!m^4col`Uvn(C~WGl7mKBR9W?^`sTzXOPFjr#rAI97rH2m3{ubW!T#K9G+WJ z9t+nGf^=tdNz?yt)jU743zqA+P`rfAL8%1-7l8+`Hk9F>h9q%GvgnfQ3@$dCvxO+q zGANup2t!PY7~U2(C7+`@#8ZF*fl7AuDV&l4zq)Wz$we6Z0O8F4q6YH%8w%c1qJ%Zb zu*{uP1h~j}E62@|fi0%MTHU+)9R9U{ILA8C4+K8OBsY^T+B*nWuHzd!^@+jz_uzu~ zFyT{=lm44_?Aj7mHo^d!TGsD``CDMxrnS_9N?2yAe$jZK{_LgZ`2s^OyeLDgYE67i zVcdCHi*>0ihe*~STAUICVkrh)>3<6hZ09S8_Q155N7EvK? z7ZD0nh}u<+)&zG^)glA}If3F6B&DJz)TSc0l--VLKtMD#JyTg-@q$g|?t|#O}K5qk!v^| zNORAYsqi6Hfi6|Nz?ftY)anACLJXh6i4~t zuB<~q)|2_#=N_yPjCSuE%Cq?bOBdzC@lgMNJDI!(WY|A~ zaP>W&ir{EGxk5b)nI7(3%@dvb0@$yH8JXk(4DxKIW7YyBl>^|rM9v#@q)46U61P}6 zUC+-2$BvY&k!Fh2JD~!_Kb$ap93}oHxTb%0P^gU!n-)+e46fZiM%y2^plEz7gyR}d zZCre~2b$kb7ZARN?T~udB{kVCo;VE~(F7%@aOWm?&uBHs?hgOs_k3L{9NRLXNb`Gy z10@nU7A(#0kYP4_8JXwQ*9fu?a?ePvoH>MMX)mE;vt@U5_Pgl9Q=fgGjM_@QmOmc< zeDw@bUPV`uT#v@q={0lC&i~Sj7({&`a|-alM+jU8SOi;|z;Nd7E(voabH2vH->T-k zpPm^DGM={en%D$pvVqGZDC7=WCxB}KE5e-bf>^xP&N)F=5pV}fnvDt1C-4MdQ+TR^njW1Uo|{m25j+}o&caGE z3*oPYS*vs0Yva~`^{b?Sb2o)k;FoK)M)u1tS(26~4G38+i&yINvUDhN95cS>rW*6hw~xwwOjrz7KV77M zem>a>=7NU;OJHA1-Gul|-^9ty$Bas|1zl5s(t&512%95yTq119`%%JHqoj>yGA2k9 zGn`2xO5CPi`8Mj`k3}6|eJ_s6ZU3rzu;`=h?p{bhB?nP=9JBChskl6#z=6>gnNKD5 zR6!Qc(Yoll-TX@&fMT@(I>tLCTuHK^uF|Y6i#B0H(jsnL{fcqV!XoQ z{qTpK2ifys55*9rrdg^JvEPSXSxs{~gs)l?X0}{&0m4n}2Y&Jh!!p^FB=yRcyPH%* zW6QG$8~&CSE=P9d-+EL%mB-X3t!2@d?a}@Dm(SQ|1lbIQ0N8wGo>3A}xif6|({Tq| zhgJ>+ivXsUo9D20HaH@(En`bRs;}}<=(oje!vNlNIG0u4kA5mUQjm1Ou{g=2EoeVe0J zyBbV$Rm)%Y(|_j;3Q8}{zYzc1D)u7s7D;#+z30*uXO|Sh#h4JJzJV1Ad;iy8QgAe( zO zmCEc=Q%p5%_Pq#A^)-7w485kMtESz9t|#nV6n_}?u2wJ-w9G`exgtGpt9#x!Wqret zv2;IOGf(v`kA8v`xRl+;%LcLmLIhDE*T1L+CLB~Jv`6F>z=;KKRIv+0GJ&9fuYYA8w#)=MA#z(f4_hAg zx8%XUPX(Qaf&N_*#ALnv^g5VeK1Fcp6NltL(h`CL!T92%CEQ1^JogD#(J6CPH(M6e zZwW>{@=!Fz7OO&~aZr&QKtEQZ9`LzuAEk|0`riL77wofh%+M@s04IMAKnWEYjw}H>K7+LZh2PB#t2%ne`%te5T)B0D zvVMx(gHlMG1^g3M`@B5KOadPd+x>sd|# zG!;tw>X*ROfQGtmvF}vC_uG=0e!0bwxk(m_!)wt8!|KJ6Z__s}#A(E|)Pk{CkzVS# z44_DKon|eOvnC*3x9WqV4zKG55?vRN-pr51!q;st2}qB84Q>UOJ7Jk0uUJP9JF)-W z!yTP>nghE+w`3CYM^x{7+ch0p_D#r`{*ihjMlWY9UiSk>HElQ$0RA34OR2+j$mLh^7smxreB>=XZ}tl2yoLONm79^pEDOU!D0U$GaG$p zK|;;j9c$U*8V+mv<*xWDFbhU)_3S+NI5#AN&(Qs0V8$ImNm1?X&48tslaA5nBVLH<6FUmH@z^L^8@s$x^rGj& zVg&(vY>guAb5nK0UOX8r{Pq3gm&MtOXZ?Tvc&kS`bLOvM>5osn7P(TBu=4POkd066 z-*ekkJoXgGR7i&q_B=wqnVpK%Z6@n{*ydZ}{y^G=oH!j^VU~Hifm)Y!-akC;`Kd z3%8f2gnSmj;}Xs$i~>Hi&3O8y_W^L5_;^Y=K7L;9y(IrtJkfDb98>ck8Dl*cn8(W& zChEMT<$sz~$nxFQ_U)R6ibuH0cK7iDN~}z6xVM zMPB(Eh|jekGat&N98qac;=o+6vT{fz+G3DeCRM!Jt43MV&eC591NI7StcJTd8tzZ> z)yR+54XRp?#8_;Md!=oNM|uW1e7&zAR-_|}2{`Rmw=+;^pr_m=81`CDr+d>48wl~bTSk>j@5t7eZUJ?JzZ4BYwD5?D%-#i2ou?Ajhi2+`0k3SW3|(Gq z4Ka=Nf+X{%R6HOG!KW7oZX^-{rX$4M?3{A*Z{U!X2y>T#LBWE|QAOLGbGyICB!*bs zoD?-qeS&ytMOR+OW9|!)!E>dX3@+G0y<`s}6}F`zpUzgJT>jx~27A*uxUUA|RGL87 zvwBM^WaVz9mFkON3-Kdq*fCF{;RJ|B_pXHkHM-`MGMZvtNJ|27lYG`_V+o6O z&K~0LKxg_MWFp;KhFfPD;)Trt0ioxH5vOLG_;#foxmL0x_vU$({>~u3fnDiM+L@XS z>B!c2us^9;Tp(B3H4^(u(KO($%O99f%wYk-n23tfhX_q4jw#k$;Cz&QTkP4|?XHgx zPF)TpNNiEE@)o+K`9w?o_p3Z|1WK^&Ho+$j=<>H1r=p8jP8n8E(sLUKTo788gXD$* zDfPLmJ@&(fjb5I|!f-r2q_KXvE)^MjgQvd!__OJ8Af_)3&K<^l_FyX&<+%-R zufkP_vZmB$J=fZzcc?!06!ByhAzFu#qA&>d`ml!#VbLl(gFkz{KaVs%%YJU(+o_?& z1Q=J-)1f2nV)vQDqE$GkQbg*t{Dm_rd`p>er&6K+4gL2#7Ip&sJK-z>iGPk#Btw)1 zvUw$tPgA2XY6n5$<|H$e`hrt5Wh+D2G5i^!X-O!&!c>0*k8FSK+H7#4Nw_{dz@p(q zPK)R0eO7sH++l$@lW|VDKw8eGCg}Rdg>&B5-_9G(7lbEckv;krn6XWr``jCoCiUiJ z8LPJyH0YAfpd8~=7Dt+Zqjd0QhTrjjEybF`&!yYf->Hn?GfMSKVv5sNYgSo{UVEU9 z(krrx$9o34Ik)-85}_OZK=1ruSs82Q#D;D8x=b@uvVDSZ&aG9@2(khepZE~*u>8)0 z`Cu5T0 zs^qgnVGcI&XbdZzn;D>=5j6^@y?hs%-zxZb>(0r=;_R!iZNLA-6sZV95~W%^1)@$d z_gUjQ1Mxh|U2D|~9JrXRPT@jnqcHlf&B}M)4XX`pCmXLlh@6IJf{!1h-^?9F@;aEK zpPqA!!r<=hnzg#doXcoxI(BW1^Sx^d>npJSw}N@L9Y)A(NpA{3Y8Y>zotmkl57^y` zXts^Ern5jOwnynbukGcx{M->yIf7vu>zCwySQ;9wHI;7&syCZgV}zSq>@4J&k_=CgaA0S zJT~7z-FSXYea(AF^Op5{U#!P#r#f4ci;urfd93Yz_Hj3SXjB!fWwbasCIs(@n$^OB z42HuZHOeQA-I-O_jkj17#3_qE=d*%4+}4Ew8zrO&7XuftUJ)I9*F!vU8nB<__`pz) z9QU)S@w}q5u_yKAtIQI-0#M1U6Qx#m+9aMZYDh3yDCI2Y4?6dQfOB_3FWjRE$K#+g zRK!FhPz(#_+fzZapk)ev?3X4VV?{p-nAQZS)s9C*H%Dku#QxENGlTG9Dq@--{F}~m z$P%6zIrf=ha@XKd`v8Owz?GM!`HGI>7Q}qhjWhw1pJr*Tk68e9xhKY<-2Pgsf3J<2cu;8{vm!a+$N9(i{S z*((iwzODQljrb3bs$*RDBcT2z!leizQVbA236?-c@_p6>u3hdczx;PcD>D3IKRl8r z%X;tfLK?=n=7#KtK^0&SG_1Qu!_tLXM>;4POd?u#yl5G+{#&LQX0;|&CS(P zdonw}>XfBN*;SW4?sf*yR3R=TjWY@xBS?kbAjLS*IZVu~!(Ull4&;B^#T8G7@(JpA z4Hc#aqtji`TmkY1VIEmBuwR}uImD@3EDob)UT+GAmk{5Tp|jVP<(Emv2oBLuVT~Hm zh1lUFkJD&yJgL}&2>wCl(LgJg$@_G5rw22*#&$)%F~Kzq@HePOp<7Wnb0oXp@g?>1&{j1hBPt2Z^`y2ykL(tks{roOf-GA z#n+n&A6_nwDQFVCK zS~{$b%%z2g5*ff`1}Mp&dmNJr&1pG6`2nf|UVcm1n)RHO^ZGi#63uR#tH6 zxcu;p$3yL$bz^A3_YCgn(`C-Ngj_y!FA=$F3=kVj!$$F4t>=H`#Ydw9vx0aHdTF12*BTw9`LH>EQlVX&fP`|; zKPFJ{uER$Q@OHTB!CUBmOpcp`jIpj;|IkFI9WE8LAh{PLM#_BW;&+DSFmEZ!xq045 zRBiZ1L@oRh5zn)@4ammg(PWf^&8;RDw2lJocH_VL%kHlsL}dTg^FcUX^gN#c18~V# zdxJ-X0p9xMpl!@Nc{axkW*{AS` z0qmrK_?vM~tHd8x6rHg5n{z*ExGG zXu@{LNC8WyUH#CD@Ni>&uK!DLx-OSD1#^|qT1A0rusJpG5Qb&KmVpnB0M`PDmhf_Z zWA$FA@iaZHXU&4hwM*&! zqS9hDpfSMUI)WFyWW9#5In999Qu*{LUCa15T5#NXJeRmH?-y6Bt3a3Wr)B92UcY<8!T_00zjb>^A#s!$hg9oJVuevUP;oMkv~;)k?&2zZ@YXkNH}SVhEDq%qt1~K! zlLqhr0Ca#x^9)4zvE?Ja_Wbu=o*xV22sg^92T``ecE~)VS6KBS??*3SI@z2QLa|^U z7n*T=LSvirA3*5xS;1-;Pb^*nLx8)`b+BX{F74W(16JV6b21x(fqhesiuKm zIcS^@7?`wp0J5MbTnF~g@2kG)7AzO;KTx|*ACGW467dP=GO2aP(RH=ZP)|IM@G#`K zN&x(){mJfxXye3qwNo^CNyy(pKpWy?GC8N7`EGkl>fe$mYBHI+tax)d{BOC+$En`w zXU0v=+E1c%F0P!sT6t|IO5Eex6UF@fghtnxY1h>m;`2ZyG!K;(6E0wV~T=^%(z7yaPJ6aUADsS9@d( zuN8ogGN9F)@u=UmL7Ab#yx>kW*sF6S)*6POjG&h|H}9qcXbx}Z1(UI`777QE1${&p zDe&JCqkUU^^0Dx!%?1cx+(xbLo&T`8AF*}*ysGJk6-P_aOMK^0a_4l7zwO~ja2)z0 z+!3Wthr~Z!dQmr7^;N}r@K>Pf*ks+nRQIGd#{mC`&_BY``+rMi$**2JE`+=!&8$gRZPd!~VUcB}6Q0sL*5gOZ$thnVj+?!yR!-PB$*25O zO<**YXCI><2xy7eRakE4i|Bx9sfHOxgpxBophVulHIE!adB0`Ob~I{r5-3^;vaSIV z0cdRiQr44#H5TItXW7kj_)?_q z;rDM=8)Nci+ct1YuJU?4cO#2S= z{`qaO-X*{1n{C&Bi=7pi7MFqEdxkw_@9Oo(h0?xE)oCq^`hJW{irWg)SX0jUrJyu& z`B+kBRA_hkRr~3b(*u8gK5_{IS}WMr^8Y?PUCF!#N;_UdTNnCsCd*~`>(byi`9&ZU z5JD7vwh;D3F<1zEX2WvW$$zn)>12wL8$pkXXFTS=5);gY@-N|#H)K;nxc2-j$47Pf+(o&5omrU94UQU z4iJWwf!w4H(R1W4?R^2tl~Ku#h>Go5YvBqqD3$woyUitMz}PJKUh&8|KDDxC4Hc(O z7HDIZ)_bVvTx@af>pi>QiF9=Xkw-{PlDVLc>oe1kt;{jW%Uc~&nyvX-&k}!UcE1m^ z`{w>uxplgWMQYsF^7HAQaep1i6*&;}hAVPGA%C_Wv_fl5tM_ZpxPLQOaY)GLyeREU zpXe&SNI2-Zc;o>8qE8`|~?9|@ByVb*eSAO3nVKfRWpu=i~h@e6K z)uq#hh(G5kpzoK6+XH;3j31Qey4WO` z{CN%APIlZs#a*55{eL3SER4>Ji1YcvFY>u(c4zc{we`FVH7{70Gko|>cRnuf!o!eP zoijoH^z~KK@Y1yB-tX_WW*g>4^j$3fsy;hp^xuM8(ZJrkTlt5=C7rRy3ZWc9xyy?4 z4^P4l8_{rs!gc7dKp`WDnDn!=F#z$k0xX$GsrZ~zczH2UApeV=(+Z!F`{`>jeo=C1 zSlN5neJb@hko^>?O{7BV29fS$(Sp8I;p2aHl8^Gw4*p=-q-~Xu@fT%j8n1#=d;+ne z@efMn+mtev5&@TVZDfMzXRUm)>s0z(%*Fk`2}&I>XL^4Qlc%L&2Ay!;ob~QR?5t#N ze_B2Im8{~8hDdoYKHI=1J%tom4IfuzuqwYQesj~MHPBZNdv)JFS}HH& zE*4anfA~TX9QQ7;im3w@MIIeg2VKb&9!L~ImAGKm?av!d2R#4Q{Bpu7@R?5>c3d^t zMSX{EZM?M9aM3=UxHf8SGDfR7az^uny~17ov*B^=u=`eQ7(i|4Uqf{bXr`xD1}h2BvulbY&+AaL`Ag188(Q<6Mig$H^Xqi%aFnbR1DA-JUNA{Ko!c4ra4DJDVXr!IK zL@anjA^s9x8K;xhHHGVmxB1@WdXCgoUJw$SS?5~;%2iovgnlZpmhI0L8B8vA zQ-cOYVDA{bs43PqmJ@O`*RnSF_^Yro$Xzn7>gCJY=X!=0{KALRrgCJhy`SB6biKV| z^O>~Y;zAx$ndmlV6e@;D)|Ysn>~cr9()$go=Tr{RkjTOAGpScTV;E8Ck=k5RzBWL9 z%Ho?$VEmQ13F3*HzmC=aq;x;Pq(=lQ#0PsEq=j7PCc-oyWk6$PV8GP0igo644P7RY7aT1xV~?|VtMx2B^Zj>OMTZ3f{>bD0(#_Ju?;W`Ev%xHp zF;d!0BX6BvSQzRTt8Z|jj;A%Gp2CcZ%z;cE9X=x0VIj@2AwjPQ#5p4n2<(q1mvVxVXgd zW7z8JlOUYURk63CFI>q*=dU?H%S=SJ7mId9}*J(q!gD)$b? z7M!#2mZA^pDbN0v==e-tPPAFQ=K`l^;ar4~=aT^vGXXQn1B3VW~f) zub+S6@_`qQ1vC~sFRlHm`(YD7v%SAX$Rrc?RLO|i>xrX+L%_>n#?$6!J*IRcy5GR( z>Fn51aA003x`vbviuhgegu$i#AP0q_i$VX`6JwOmeEA2y|NFxy)nA>T{^|+z!_K@2 zSQE-#DflSLYUa|e{#`}#%6D4i()3npmob_Z$sm*znJ621Kf4Wq82zpg4iW9%2Jp7XzB-8_?|zOjT#69sIaeH7qL((h_dz ztMVzth~ksdjM_6#-ph5^qx{v(v?CqoZ_7x4zLyT)KAEU4aUw0-5l6LpB6xG*ze6xx(D; z1-=fDxEDi!&({F|+%DoEjwWSr(s53?n_k{!K&0j!=t3&DjaWJf0ieO7X?3PwQPo-} z%e(q28|Y99M4thk65~Jh9vV@SW7C#Xg9YE*&XJ$UtV};uM11c??>9?$rbDlQ?`8`OU%RJ=du58^Q}eaYunm&+uLbNKkDA=7r;V}ep?2DRFbLX z2UMQUAER}Lqpx_m5wTVQtFphh4LwL>3xL5F`uPehDi%Fpc+jm*LPZ1&2EKdrcGl<% z9jvilnG$X-y*fAr<~@uu$+1xRJ(%@HBQr5Ojbnl*Bgt%WtNb(z)O|ch3*AUJB%`l| zi>UkFQd)-;T9_a54lhdTQ%(->r0x|G4UGMig|F=&!4=4$h{{4Ym%kwk_H(?AxXQ z5~FrosF*q1dq^z_WN(_-GnFNLPYq@=05kT$(#utl^NO9nE6>1)9b^!mv%&J(9KG*i zH4!joBBp~BupioL81}6Nnk&!q4JMK@CTmjr%~69b@SsQbTjWCZ^;D(ALc#e$qxB3P zl8Uo)YbS`8Hwk)3ba)vthxStGx|Eu@O?? zrb3YhR=I2Z*?zR8vS;NcruIz_M3!z1P{D_qmDZs}S1ng8tw1C4__LMt!Ev@H zcT`XBM4a4PFZ@x{q=f*nT5g=M$-cpB%YSHE{_>uD7}$dWyxV3Aye|09_fAx_?!Shq zxx*Jfs@=-dCm}i{i7i`+5v>^BuCzlyg|i@6?Wm@$omU&ntuB9Z!w#`Ua&mU~(q~t& z)L)lM2nrYrX?VSmI6J-Z?4sN>XIar=-J=y7l;kU;El*-lEBH(`;&Eq&;(GccLu1$c z9(gFQqJxTxgoD@;V{Pw2U^e(`lv&@U84gcys%xv)F@c8Be|g18Dyo9|(&v`=DpBJb z!)@zi_uHqd$&cTheA7^tGsP!9`~SwPNlOH9MQ)Ak7!tPF8ty=DMAnv+x?Vg*+Z9 zS7q596}J2Gh`)7P&V_WEyh8zyozQ%*h<8Yn*W>HR?gk|oa{BDdGX=nG;9H*nL*A#! zW9^-<&r8_P?DV4rcygSS2_kc0PWTOGVWhV1Y6WnaQTt^fgR>WGSl_r*GnZ@M+O>&3 z++ZkLs*IYe1R*?UZtLxFOh~??d7&#nvopTOd~KP$S=o(f8&>L%=910LlhVo1S`9nA z@BJx${p0YoUu~LlHYpdwo?Jx0R7r~(0bXhB`Aat5{))|2Mv`38H;)7?e{=#p8Cgl& zlQu_B{0>aFWDz#WBl`}0mk>aD7zmOLj59n9kWc{b-}3x`(X7TU5MS-&pY+)u2I-RS zSGh4H-Vtl+L=gF1I!LdGyT}VQoQ3atuhfLZJ)4ZmSHPw-RtV^f$BGigtPJO;eyXsD zfT#9OL-xY2CSNAiyvuEJQ}bQ zidSWD79m@oU9ftO+_~wWoyCn9z{dHm0hXb6KNwa34fP?IM&i?VR3nP8_(hXLrQXB3 ziP5U%@Iq^;t-%!cl=$>i(D5uac3njxX6S?(EWOZg@f*}&J=Hh5aBuL#8{-uGwj}Gw zuV&{%^`ve@YY&gi(2of~@jX=(HI3X+B{~T+lL#idBW^XMD6!sOtLIfWzhhrjH?h1S zyn8G2GWBL-%KqoceZkok(fYkiNe`sYzV z=mF>j6@UVHL}-Kt(a;4e{3+eyyiF=myq#%B`5CtsoB~5aSG>Cp_F=IK+W zKI$v2%tEIGEnu^bOA+29 z2Bb?A9tCQSQYcXDUbu0D7O^S5W-Fz(+&1XgWyc!0h9SVhZ(&FXiP-&c2ZVwWaI=RaID%~hLa75cMGr#Z^<6?A-ksU*HVlF@NCBXM zgFe0k?$(iNsg~^9g-Aqd8t8%*@IwvaGJryL?nRFSYW44Rg@%KJ^Oa9c-PD43M5ylc zI5US3Xa{o$2RN7@`))X!OmOo{4Oq`CWv8Ib5^JTL)wAAO3a_CF-$Y(8Gg+vH2;c&4 zXAG;uv|gs`4VIi?hQJt?%Nr2kSz33|kjq(OaR&734rQ!S$mZfa>Bhbxc;&aVbG*mfJRfo>3eO#`Dc5@rOfsdo2E z7jBPqj}3SKXMNfCOJ@a9+efQ{zwsO|^mrhNdys<_`1j(*wst&dYJ+W#d<8KG0!WC0 zF2JQ+Vvu5^0gKz=E|`I(m`p6c4jRyetwN}e|F&%#|D)fTFh6;3^ENAhyh^hIZaV@w zm;!W*SU7j3F))N9CJ- zXRqVMiXJ__(n1FS%9JWsrVR1`PK=MQf^GT0fecFkG+7*Hf4V7QM)Z0bo?O1c>FoX#4heI$M z3taL4?aOy>SH4SQ^yTHM+k$Sq7Vt8B__1HVj$IjZl{Kre%a%81jqG`EeanhuL1aaL4iWPmkJd}j=ZrJ&)WKkuhy$ye?-MADEaf72d^be6a>t0 z0z3e~1J4Qa6r|vR^2k$17j)3kMHjZTRgZ)4)MLjTP`#qUEb*vNkrg0~m|i?b*fU~0 zRzzfliy~6=Mm#jW@y0|prf3KbbIh?2LvtV`q>pQ8aD)~~8nVJYcf=zHK_}SaBSH)R zA>;ucvt*zJj@CFC(H$AwF=jkYYO#WtPNpelnHEhHgBDHXG-pcL*mG0{8Nl>GFc8#3 zC!Ik_H49Nky<${Rgt@|tBZzHf)lyhVDpej#@nQoU;m}~t3}d;ql3QeaK?7WIWfDR= z=HLZbXP)(y!coD*kV0R$C1x06lR@Sfql@-+nN*fVH56B^x*D1zjDEvtV|}6atU6aj zD~xJa$Wl!;HrxgraJ>O{1GwD?M~QOD;X?^^H&EByaq1SAoOQ<)=UsK+*&E&~=b2aD ze)-*NuYUO5cVde59T5?JDrmt(5M9*4Ac78Ncpwe(>{7=JbVSj`At%&hA%g(_bfLs7 zTO4{Yi7C6dQH>GdXk!Kk>qujbTxxMok~nM82_!g(g9Fe*5;?&qsU)d^7KZSFbTJDP zgrJaBA~XRGITUk8l38n=^_WYFy^IImc>0l-Z@%XLyFcE334f^G zh&J9APbYCqVT;5D@z1}4BnBY~X{-zV!%%_XfrUG4VHUGMnT|35GYQ@ZW?6f~nSO!6 z4chDtWLpH246!6bXh9Cx@EOo>Ff|4c2@;*qz&$jeG&vXoXDbMUEf919DoJeuhp0d& zwzh&H4)IK6)7lw`I7B|IKm#jaViAd`g?M1$ZlGF0O!AbcJJ1BHa8heacj zLmcYB00$+=7T(;2#13SOI%q5ibT~wXBvuas704DFu*ViaBEcHX^JO=ZpajMCiy_{l zpG^AaJpdX|5w2hnhCrGa;?T2Cd}1LCm;jOH0EtweQH^k#C0zTufvY19F5#a)GoQ<}&yHmU;wIRC2*UCNQuTB5Xk~ zl-$gt-Z;reP3DpdctT`aWvsmbrmwD&3Rj*YSh@BtS&dmGVvA?3qn*g89Qe?QOXTpQQS%`~5Mqlsn6#jLNH2bAs^9d|bcXl+uYPIzL;+`D z1A-J|8PA}FGh|=|{#d~o#uSWfgb`5nxNur%uz@rGeB=&raMFj{)WvvUIrIk^>)sx10OzGyzl)wCCFQnmX zVEkIjDSy%x!%HldQxh#~u?99=zzr{^H(JhWHkjfY^Dw)IoTrR}v&J+ZGDT~Q6wLXw zr^Saci1{!0K@&goJ5)*R5ZgI;lK~habO7hDi$g>q3cBqAh7{D>kip{;T5w=RV0O=c zu3))0yBX4)tAStKO z8efJ?K@}?P#5UycfQ&w%*S-F)vhzCxJ`AD%6VuM0X%3B1U`)EObYHAzPkpdHaQ93VB=yi0&Wjk!NCDY#W5O?ni3il z5-vQ(z&qX%4mj|IFm5CaS2)8LSmlnCkIIT9wE~zY^My1f4@{K(!dKZ%d6V5}lq0e% zb7);F0$=9EU`>0z(vCLGZEmxfJ$q*4{2V-QW~R>3XAJXgVVOJsSH4t$9u-_i3u_<% z4yG`LI!tK}5=#&{9UX@W0kA*;e0PE7uz`3yuoyIZLvoRe!Cxr1)1QX!&7fP}RbNyN zsjhYatbN@z#32rrh=MqV22nyEfY;~$J@2kNaoq|qz`b**!y$$QBuy~k4(e4x4mzO( zC5U14IT*bXM4x)qr#|(|X8jNzpalIIxTiWH$1qmViDvV`A58518FH|Tob2S?K0(RI z?x4iwA2Dn9CexQF@^3Dln2Ryk1|8Be)-kF?a$mUITS#Tdvzp@_95{opqO!ZozzQnC z;*4MilgG#~$`SVORkA<>8Y?eqq&78HYMg&B{wmgAz zBomx*)-V;_nO(=3jTz8^5BQK)nk`)l^ulS8pb0jecZ^_aeaI_Vfp;81LJ`0x(1AE` z-8gB}1WZ8`6yDgS({F{7f#AUZ5ZK2QC5bg~$=oSdblqJINtYASP~TY;tEHMnr9$M1 zfd<5b1~eM235|ID$Ql&Fu8rZYg}>-dJis<+zykzV&q@#j9kg_-|djbVk|}g!W?2ChF%=b0xWcqm?jRN@WF2@N!~j751Q0f?z`-1$a%D}^(A^U1of8^@L6sUw zMxh)8Kq_>CN)|%3i2)OcK{4Q57%=42P{|JA06FMdOv0p3!ekgs!5pv<4zghm#(@T? z(FbS&1TcXe!emoAB@?(nOitw;`k@j)!03qqAYLUoYycJ*P=nNiC(enyY31mlrRc5Y z3e=uT#9PJeL_x&cE&u{eO&fsSm)`{#O=-YP4cPBN(bDA9xt#$7(1GQ^8(QQ986Z+! zaE@Ha1*&v`17w5$#nF)+*^yBw&N0rBRo%(rlm;d-hRM|q{z0QAS=q@+qX9OC01BY} zUE?-h~IL-P27^0daa$bve^0&x;&I!*%wUe=i9QapZ#3XUK@j^HSu zUi}N?m#YWFbI;I7C5027yBIVBtlQy3t<<}z66eK>_0}KHw4p1~)Ea{ly$^Ucqj%0SokIYgCJB z3@53Qsw^O9B#?`|xZ`n%mUbA!be_+57?X4k8sNZ0zE=)bKo~HADr|r%^eew=sDfgFZb=A<)|gg_mT#g%e^R`#JDlAe<0As^o8>4B*nD8aO?UbR8uHq3*^nuF!s z4OtnIl})4YkR~(oRj*9r zVN|N5#)iysYNsa8ZVE#+P>ZOd260Zqsb0%8Fb}y@$9A~tb>i96IcNK*V7|QBcR(Hg zc(xCCm`uOOkNos%dW?b!xIj8gz(dsmDky6OU_%8UD-LwQ91uu?Fo?7=z&Gsz9Wa5C zkSni=t3mbM-u2zKmTMJSl(nfOyB6;l-a#Y~r#ehSH)wzzh{HH}Qyt*IC0v3k*nu5{ zLBINI1=xXyIt+x=!7kXsE=<7&%mN!UU~5Fc!)^c|NUX(v<%_1Q#zw6Dz9?7{fXEUl z|GwMZ>;eb;sP}F_%F?eM+QINyqPKpqnCRL<}Gp6vYQp&m9R=^1TS z+MylLL7nmzT7=)6++t(mV)&5?r~CmO@BkfffZKEtMzB~K%>q%$5mSu9R>&3q$Q9XV zK;vny=Gxj{q`IbQI-~4tWB(PP{b89f_`;|9X5aShsBRhFVhb!iL1R?Unq>#jbyhMp z6Zo_b)p?-Q4Zw$t!T{JyzL*F5tdD+_2YJi_ul_1ErH4I~$PokpBuqgKuHkvIr+enm zMNUkW_EsI(0lk6RL6ui0Y-<3ZWDP`N4fJmCVpJ+I9$Z$8{EelkGYE(lEC_%)kLIJ-h{$}V`YV5x5 zYZ%yp$l5Zsc21F6k*aXOEOP+%V)Hz>Z^S}?A85jX)I%3UK{#MR6lj9~gzRq|$Y{hC zF#Wb@GTW~_%kx(PDLT&pg>=DJS%{6T1W(kM!i55-yhD$1zzWPl*qob_d<0QAP*b?y zRZ!CDl#<$>T(3OiG>!(c*bXWU&m~=>YsQ8R7*F1^fG@y8YgB_Qh^n-3DyOOo2nP z;W!-vqq*lqHVC1~Za7)YHd#z?Ay?Am41Si^b)D-Zv*fy}Bzl!A@TO$C4#BRuR09jhLN8Yf z`-(w3Z>$B+^D_VFk8*(if)g}fNFDg^|E_WnIKV19z${-g2Lv!VgacWMGacj>7Ub5) z?m`g2XgkO6#S*an)^iyAXfq=>_R>LFWQ+*wa~FidANBK%HQYZZoaD$wk7)uR3_}Lo zn-)A3p)f@K8-d53v)M}Oc;cmV5B&vAZ8(-A;HhCh&o)5nERQ#H{?JPZK= zOhFK&10CSN4EPY&O#sKdCjgP}_?CtEx|?aoTOFtZS%aki1~d)Q{1X&jRJwk0EKG7- z3$GQjYm$$lDhxp{6sJm)vT(}67LY>-Fo4$0009&>9Vm7bbh!wNZvq(z0Q*A%!`Q+M1VIDiGX#?*-bha8SdQe};)MycCOCi{ zKmcKe2}Y<9p=4)vG7ft4MS81uDZ!32+73s*w|ox|v1@c|PNSr9BRRIlY5eWqPI=%) z0QBHo{0UZ@jaGN?qfUe1zx2nx=u7!f)1UE&9hZCmQ53}y%m?7m$9>R;z|hAEFaZIO zFN84Ki*p^mOK-@AFNJKK_-<1@Fn}ExLOe7L&d}XKIoE*puC>8rEGXzF>zWwYwXRkC z#NYK0Yyt8t54Lo?FsK6?JU|`L0L^N75EQnfIT`_=^MnX?#n7Tl5C%8eK$^1v3!H{9 zY}Ho=ZP3y$ar3MFM!_yHfR>A}sQ-~IbDux|1Px3ola%YnR-`-*)o~`G{)^{W;AIUyG9H9q89Nr+AT}7G~a6R z1FmCoItS?+_?>0@wZ|iAg-09XLmNW@KI}{Ef4d5l$G-RrucmvtmxmogfgQIy@Y_d< zq=xA+Qr5DdYVWR1=o&2`;ZMm=7yb%Gd5 zJQ=!V`IDack0D*dq_L$y;nI9-@GT2mfenDsE^K*WUqUzlM375CI1I!xFbEwwGrH_z zP;XZd2xnp}aOG-&4UG%7tndSY90V~UMKU2rZiC5`8#Vy4(?y=VE(sYnv?Y&5PMtX! z?DFYz%9I&Hg?5=CbfH3}41Lyfx(nj}t}aHW(&69&0?8aBm24IB)rA-)5L}o<$c44kcFq;6npL)OKb25o2waDFVAorf=)~8N3_axCZ=-BFf8WjM2j=-$N-Kz>>1a}7-pf&7|bxEEDy~( z^U{@fK`SjZjO?{nwA4`l)6KWkXrnDO+-{4l-rQpIjbBH;fep4NN^_W(?OfUJiR!w$ zIE7xm^A4ZxzQbpW@Uk1Ayz1_J~TK?MH;FhQJaJ|e*Y-w?wN zG5lc$5C=Z|u+@4}o$8Ph51HY_sKW`z6b^`JgM)b>V1kLV&LW4$usfjuadF10r=8ZJ6`A(SMMn_;f*zg*RvcXXH5E1GcdPJM@krQ|J&>Y_TDujL1ac8<8faMg#=x2?2J< zou}e3gE~wB5MxVQj8=d)K4<}L_b4MDRq1c;zQhI)ix zC_$K&Kk~@`yccO91B+>+2K@1&7ctL}E4bB)us{>H5QGC87{ZI7*GV18;Q>1O6_Z}l zsPVxnd<3x6B{E44!;yt7N-$jK3`IILr6nzbt0Wz|K!&<>;Sy;{$WMGihi&--Mr~}P zA=#*fH@4B4%2b4xFGYG576(O z_p?kM^oJRE#cN`qxd^>Pa~gZ;%QXS*25D|XP}|H#fv8!{Kzs9=2;Kmq&w-9at>X#_ zZtyyz0FMZ#^Dz%`zUWha%H%y7mtm)_7CT8Kw6X8ML40;m`}v_>(C zp@m=nSmPd8U_d$mK@LE)2@4Bp2#0Rc#0!bYL{aTR6R4^KPiR9A5a0kEq*5u>$s`Ob z_+gM%pfit&aL_f)Pa{zXs4KmgpX&znb-$}Z*tkC+563NzqA6f_Y9EJ&ye?|4TO z9H4_MBA^NFs8kRf5CxdbfLmo8+gWd92)6P;t#EYXFYM@3JE}2`Y=vWE4NK-Tu#pdn zAta2{*5*h)@TACF63w*zRWE=}d%vmi zjcTMri0F)>V&Dewx3N?1jdd_O8}nF$BMb!-o~Oe3IjMeP$g=_E?4=yG_kVKQZxM(1 z4RU?!FMe?kg1=2hH7G(Cerc(zJRlo>n1^lYA`dj2KxxTRNTqndkPw6b14HhEk%{mQ zK!#u{aFGcU%DST%$$3aaTEyDs8rLq@Jgtpw>m3{W)>b3-42|6eAGT4*ARX!DZPhZC z*?5o28g|iVBrKi*UG+OB^6EYWHLYcR*;3y*)Q4`&`xwI*x?(-hXIO#%9K?WyDFCKK zbV$cS2&22d+Q9{O^t!3N-uH1`b}?gDq%#>)>dQW67WA{yD|)d7>-0kLl8M19E@K_@ z4tv=2)TftH@EOmz;-30!_Gzf?zk(Ui+VQpavkmw^2M)9~7pvF}z)c<7R}A;(#)ovi z^MvehtYae67<(0?@0;0x%W34DSBp2tWQ zfs7VG4({RT+N#Um%FpNuvjk18(kibIt6P$*tjNYjf@DXUX9Z^ej?oHh&`5C60u2Kb zNd;5z&JOE`Mogwa4G!V~4rb8n_Ji-NAOi%XW&lsr5baw^&3$AFvG{--Kx-aUp-osx z6`0_)vY~U7-~qH?24QXQ`pyPV4FgvVvEX3V?j!LMPx0tS*iyhUI&Wem=6*8cyzZwB zH4mRS&-0M2fAC3vMDJd(ZJ#UxpyG=UcLTmk1KXg@H5}*(yv^GV(PA>HqeRG~z@uUk zEcixfq|oC$QVRL%4X0*krd;Z!o{!&XN()d7t%||mG~gEu;owqHM&uwB3_%RAK_2dc zCuYC}6d)MRz#sI09NHut@J0!0@Bui0AZ9)~& z#4rmY`)(FqZ9nWm1zxQo>4zbOuk3amPI59Jubs&7KCA@Rzz__15GB2ioer|> zFe?ZTPYk!9ej1N{%HuK`ukkQ1f8+@${Rs^_uYcOh^E~fA-AglEVGlq9UfKnK{6$}u zvO)8O4_U9D{O5rJ0stZT1ON&E{{Soi0002;0Yd?Y1_cURg?Mc=EQ-X;B1KBDgm^y| z4m)FKZeLk*q^TMtD6^!Q#mma2Usg*;M1qBa+T+`9ZHVKfnG7UXNM@yOb9F^fcq9c4 z&WnWV#=So+B$A|Z%Rb4 zmywXGy{qErs&Z-Px33Em7b;R+v9_`%F;`x5bBI64)6(YJ)-g0QPj&z=wkjBSyu| z)f_WuT56eddwO+LPUW}CP<6rg=ir~DnRTbZ1z1`L-_mp-z22O!n#9Js)Y%msM6i5t zlYDire27V7YuCxf_r|!^*U@5nn4zZH2te^q6GT~~liVt-#~ z$??*&;yj2?t`QPW`|KftW*L4IdI?SjLJiVYaNW z@+OfZt9!n@apXu$Bm`EICc&Zs223oMv4+GPLNiu1k>0B0#Hpg6q&#K7uwoT!XtOM8 z%J|8{M3_^IP;E(_YO5a}pI0Sm#lw}WR1artbsanQgM|-fKeS6Lsmodm?cBDT`$TTs zxp?Es?E=ItkamBc`~^a|u;Igq6DwZK*svwSrhr7AY{``6%Qr4-#>_dh=Nq3xhc*Qo zH0jc(O_vs(T6AW@mL9uKO}e({+LF;&)}8tEWyXh9lZqyHX1TnmU_Aj~URryxBuVL-MJkaRHN!iEv^PjqwEqzQ26|VM!O32*%f8lSw9~Wn-2Z=9y-uiDsCEJ+@h8ooRNPYPPNB-D-H| zspp=2?&)1*x?z^5WqA6A1`xgZMjE1pIY1a1?Ho!NaSl+57-{R7_uQt?-LTGf%Vihp zr_qt>>3DXg`rWFnrE1ES>M8%HfEKg1_g*FhJaI-D2r0zSL-;`i>@Ims#l%JqdFYK7 z%#`BI4+~D@4L%QM;RFp5S{O@AGii9!BH-fWO)P%QSBx4eCgsOcRtU3CyE5|e6pd41 zWJ_2=di4R4T4`m=zWO40mXS=#MKF|ISm2ggdCe6iUJthwS6_euCRk#@Wn7rXVs^~& z$B>2Wv0`v;W?2lE2@ykYLTuKuDJ{EJXrDCKZ1Zk}-2em{pfv&7%D0i`vt{n+Y|5cG z@CN8%fHkJ2VZ$a5)#HhWDr+=b=IA=;%?iSLYp=5u9>VCt zj0*VJ$52Bg2>Vdp#FYQSj0YF#Vg@lfeYmU#;Slo!Nh09`Z7h>G0ZS=EOt@|3G*u{| zxE;o#0uu!EBLg#jyqJd-@X82>jKZAJ`n|A+MI#wwUR3IZSC(4>@kEzj8b$!e9X~em_Q7cn^3x+f=4h9%Ube+%y(QZ6$}p$j z+MTM}EdLEY=UG4fiSE3!pr4^Un$Ahn-(Q+G7)Lqa0|%s3JBWicoegI=YuT3vJ^+MG zU9D4J;|{367Ao!diB71hQ_W0KsaUaxJ#8yp9+**vGEAaZ_W{;Je9@o=nPCG|(1i(9 zFt`PAA01rdXmF6>Jm9+1HrJYb4-WbJ}i0~L3ovq4jJkeH>MnJ7o-DD$L^R_viw zi#Sk*d#GU-b@LSj^rJV2GzcZTpg}AaQ3W5Cga(K304s{fplSWU43qeV6PO5-3uUfy z)iA>lzVZJaVcaN-?Ru9}tPmqHvd(p9w8bH$B0H)8E-Y*mi&VIR#W?=XNL@M0U5cbp zJXYy0ReBg*^0Kf%PV7t5o690a*2prs^ihk%9wQSum@ZJ#W$e2o%(Ot7m1R<9@$;np zN+ZTy_-*>j9>9m_tkt_6#&- z9p(pZ^S(K)%BZMm=Gv;(w)H5$57bNw2R7ji`{XS@zStW+9LJGGY^xfJC`n=o1VlU# zU=oXKkVBsJgGJE52~LxY#(rwQY$FnR6kAXalU_uJgDM9QmULp)%o{-W@iA?{x zVmg#e8yTjj#?)hg;Y-O9)!pv8&oVJ{TK2&2fz(NhzlF7DWvJxCSV;jtn zfiRlFgwk4p3GYgGK;0!3d%^BTHkzHhrBcx!{jRoS$+AVcyf2Bx(qhsZ})usPAqyev# z;RRmlc`%Ldem$K_8R*jHx!kG|xVlxY-h7u}RW+wf4z|*y)vPAR6MC1v-kS-5ry1T_ zd+N#_D;U{Dc@Xgrd_@8XnAq50FSdh{U5#o?Hd)VNg)J122O>`E?OF0OWh>vv%3`syB>ttl+eV&^0wXEF$2{DD z6Ib(k+2a$81J&taY%y}4>FHkzXNg170bD{9cr}yL%Xk-Nxc|5^LC$og@5#J~_6~JC zHMEee{7N6NrOPv|KL=73Em^IA^y44{PRO7FTAiTJxw^|Wh`IuzuAu*WS^a7U=jo?T zZ-NlYn`l+7?ERSmTKnSK4ix?(*KGrQ9{RBVGAv^2#x_`vLu_GZY$;|2)ldV7rC22K z1FRqe?%)AlpdgfGY~H{MYH$ykWi4gE3{7DR^0E(u#}qMgI)X<~?a~zUG8Kt;BmXo} zi??_`awAw4BwQg!mIpApLs0-TN0MLxdjxQs*Lf<{FjG=+a-m$((EOx259fcR+a%@B+xb^};!(2{K1mSTk^554SXsbSQcuN$691EQ2zHvX3`_ ziT!h40$GWPCN`!)Oz<}-1!*Vc*h;QsDX`ZL`7<0emrE6Jhg5)v;3os6=2fDGbJgc_ z)+c@5=Y19M02S~7Kvf!um~@MHD%*j6FG);4g-L*hd*1&QG#ZyOxObB`uq9m(D{Es{ zspbKB@CRiO4y8auVMlCES%COZAY?aAu2>+76AO7j0C;c@j0G+!Vgk%y5w^etGSGKS z5qMg(4}FJ%S_DR0Bn-+}P)@OAG=fDgC>1m4j8Rrm62+GQa}`;3BwcYNb5v%7F+Ac( zj)7s0idlpd<6OTH98JTHPDoSG#U_|3kKdC>fRtU^wU7OnGN=JReKLPx$SSC^XtZ%O zuM!(1v`T2<07XJTuOTUw@&ULseRmiK87Y0>*K;1wa|mE_)>oVsiG6`6h}VaQR3HPT zgouimbTH{D?b9lZ_=uSSiEecon3#J$`I%b)d(!_Q53}-#w33v~&_iHXfvVV)sK|=S zMox-V67SRpK!67bVq;DK2|;Ef$>RaTc#QiX18E5(YN?h@p>A&3MKQ9BWYl=iSUVCG zFhrtn+UQ2TQ5u~lznvX$g83qLW)pD7^8$9zGwuDP}_yB+K01uFnH|JGb z^@pOiOMLi|;0Jytd40aAkx|M^pOH!Ew;k^Fk}p{rKDvm}F_RmYD0JFB{J34NX&H}k zB{y&$>VZP*;R^*=fb1DrgL;6APz_W$AR_;Pl`migY5)eXunib7d1HBQHg}9FS+$^Divm&2cjVwTmt8z zrmz;dM5R=~31~4G4wsp(w>?srF)k``YDO{TgM}xfNqx4GKhsmDVW*w}khl>UTVP+U zSzoV$UzL(TXz_-GffkZbLF?f&NE&^-DWy{S2Y)~X*mq!l_=hFw0R@(G9*~FEH?X?7 zn|TliR)7YcgmQTjr|wmq40{`ph@*YxotV)w7>j%MwXv=F0hMqA&r~Z_qXh(rii<<2 z>lt<&k!&h53L{gg~+Z z8hvpbSre}nKm}Dwr4P^tz6pN%N?^o^a~0ry);F-9OR!?Pn{m(waX_UNAd#&?Of9(@ z-8m;c`CYVEoqz^kJvoV%^d^MjCVEOjS7HjdMpv=|0)slJ>{+PB1}?~^sJG}1)xZi= z6qW$u2ip(;%n$(DtG&$dy+;40vt|h+y(E3lCrdyTAasuuWbE0SsUVCJ+a+p_w2dIRlX3(I+tsapY7z`3F}oLWk{q$_<)Jd!uJxw@H=RQv$U@COwDX|5rY5sSOq zx^cKitsEz~E&N@U@G>t`8JQ8J_Qi7JnI3ahD<_+>Gp33aSjR;qMT?*a9Wn%2014qn zZcNa<#ZU~)V93R=cYFWG4CEWW2TFp0$3=rjc&PIf>&sfJC4=*;suE>yj%Q^ zwvkT!rDD3yVw#cE2hXyMk@Lz73tRz)h^;91%wEieiL$YnxP?D?la(O^$gHQX`Hxys zKCzK}LZATmcYkx09w}?G6+Op`Gh^Ul28o)euuulYkiKxaLVi#L-;2oKtGz1}0L9?Q zMizLHjG%wlE=>PHcuyghE9hE}_kx|QszMTZLy{xeh!&M+%J`NfMo5l`>B=Dr1mf7M zPJNCujAce(bJaIhsnm`e{En(8U0mHU?jTc12)wf^nr|Y1C2WaW;Bl9+vGp}6_?2O3 zp${Km!<7(6M$iS75F2Q9LOk_+xM>S?ovuYz!`;kigx!^~A?0k{!T(GFi zo2zTNmP@67P{CcW9kkJiO^Tx>Y#JqeryO65!)=M1@dqn zxGl06?M^dBY<2wG(~@Fk_Yz1EZbrs;BESqLebV21$SKXpjLdfdP?lO$(_mzEGz~^w zWNt}j$rt}Im+}U`_SSe43VB0KwWLg2{R@PBbeR1WqJz{l&(kmqSGPAn0EgnC_YI?8 z%{?&+GRo@9aMp4Q&CfW>j}yDC9Os2BL!?h5KDRm5T`<@l%W@8&#vT+IzZKX9CTi@; zxPq8V-iJC?P?8_1*ypUA>P)bbO?{{<%T-*jnr*Kp5DyQ~1)mbup<&v&m!mJd!nTXX z(-WkUakxVo+Z$V?^@ZB8G2~lf33#Ak5}k&!q6Nu&iWYd$GbX(+F$r1l4ck!2hfKcR ziv!Fc0)8L@BEZsyyvTXb(mqSwo z%#OKMT&0^$<0kM2f`CIoslvVCT^U?*O&%Lu zQWuqQ?S8t$vts2}e(wcX1+4JpYLIs&O*(*F3^5(aEX{X@ywbXm$lu#*YH5ObAa0aw zw5WsU9xz6GJ{8uesu9|kfO(BqfrFw<7Q2%qL6{fFy2|9p=uTZRi5WK~soBBQ*zSn(jLBNk@m?_(>C z8#D1B%(7)$nKPfUb-)&$%>6QZ?hHCJXi0ebsm8;4b?XmjK!0eBhj#z!5B)w!>e5cq zlXmTZv?I{2rf}fJX$nU!e0Xr+HE|9nfU`P~>pX34H#NQcckkM{Yws?;Jb3W##J>z4 zo~2Ee?{ntt;y|YT5Bc@)*ALTysT)EPup}U8)5ilV)(~jHHP(>90~t7Z(1SH7gb)D= zAKWd!)?|>Of;=jaA;b`6h{Hn>1^Td$1q(V+M1x|CV;E-QSm+OiB!UPci+U_0o_WGC zp^J4yiq8}@PC`;iCQVXOB_>abX{h;jnr{o7egZ0}nTR5)9hH>g!V;#qc)|gFIGSo5 zscx`povwcHCeEygS;P!5Cb`FiZMKOE5=hvhs|ZMVC}JBx!Aw-nPV-C>%|J8lGtX2#ptV<96D>DeXnW1J&ss~3H%Wf$ z%{l3aJB}t|X;N-E;M${U3+JYr?gnS09dA4G#yij2X~DCpI&G&5t~Y1P({|j;xR*MBUjlBje1@$WB(W(wW)W z+1Xnm`Xc4``|thx#^-(BbG%*aP)iCe=1i1>3pfOPCl!vK02_-XOME964zCBn=d!k< z9;k|#X|d>ppK8#!FjNxAF(UEgY;o)II-GZ_J;90_lA%S&m?Iukc7{w$QFf6G^Ke!{ z^!w$Yi0XtIfHFB@WL(1`{kS29f$1}@K4^#!%X()U0`uO--`aK1)qK@_zHf` zJx6XHBVpcvKkgGdd^q8 zT0h(|9xPFw;m9xS8g&9iRC0Ko2;?!W8=|C67qOVNb4dN{;iUY3{FATsbNC51f>;$+ zyLNP7CVopqP`x)QZ@#(t=_rM<-RVF%H+YxR|DOE$p zO!{fM=U01@T_GsuhkueJ&XCD%Mh6lv))^{e6=#Ln-VH) zLYLG%-F_H6Uh_5BZ|xPJ_(w1_GL4c0(!fCWRgGL~D-Ov}57jygp|RVFI&Y|NSBux; zrlY+;1(nc0ZUl+&xDQ;Lmc}q_Jtr?V(_jOo$Jvx®zZk7%e_`oQpC9dp6KC7+$G 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

h&&^O zY`SO?=Y>on1Q}3IjYU4J_tQAHbT}WE461zaB~q)>E8tGNCy}w()rWmeA-!gUwLm(| zMUWMG(_mVo?# zvjrXYbc?8vd0z%B2(e6#f*#M4d6G zYx2Z!1MbsOKQz(UUli~Et49rpvJGJAyr4)+MSaLTsht%5k+X!gV<>2eX@6Ew@{9OK zAR8rpsj-hcJii&#=1gypg7&NL{7|LmKe1-Z45}NZdBTjQQr)%4A*hsET(wC|Z-(qF zTEL&B%^FUL_we$xrrD;}N%h^@jy@w&e<{jqbiz9TK1r9)xvvv~#Wy={>FPh$vl=-b zoZ{p(5@fBR!ZoxWct%!C3%m8}*wGX@Fa_7hkvFIbm#L7?0>B&q&J<#ZJyOO#q>(T= zHvxPJlIMj~^PqZAs|BgTR(O$EOfsM= zggSbkey4EOC$=e{cQCT#TYv1)(xgGEmGmIdSOo4A1DEWX-?Rls+$9M`r1&3Nks{KlJYIQIqf4MSCBIVu zHni?7`=?LOT<+vv3bl!Hsxv3`wdmyio~ec5nz^t{TEEG@XNJUOf8SV>ecIb@%a~Y4 zWg4H>65MNQy0}MA6etlQiv!V|k-s@?c`yL4r$V7&@;DKo$^kY-ay24r8F$sC-M|XK zH5&o1J=VVb>~u)R;9o_2@2~8bS;Cz?XO1ZBQb?0~!2oEB_&^aR@RUq=n5&#XQI;wj zC?HGZoWdza+LsX$QUW^D-1ebmm9S zv7`Su?kSPNWv-rm6LfCp{FeCKfD=zIE_^We$f$GwZnV1k$ASAqJpqD8(fI4^`w@wK zy<`|SW3oX-W>%qh2dc_XRIrn@-LBGvK^Le9Z)T|yFZ_el475Pqi77~m04cxo(286{ z3H^z*>5bq8W9c0A6GA%62mCgD$pXPle*k+P|mMkGXCO zo(S1Lar6cA=nmM^NsGX?U06dQpa&r7V!bgp^jhoVKu@)`=t;dWdFUcA#6PlcNIl!Y zZ0%6}OhE`}?zpYPzW32La06CJbv=htq&?_Fj!>#ij2~D82Dl2fVM>!?(tWnlfC$Ru zlZUwwC{@{?y#;AxL%xJ!E!o84I{8qgfsuq)^OxaLA~ahlwTVIgjn_50sgVst|0_Uq z#=+^UVoVogO>oxdK}>esT};>Yj1?^XKTg8va`V_$WMp@-4iH6c8{`+?zM^{-mLqn{Zc|Uv5|tGT!z>=u8cyE{y{|JesB$!aBhvzNrw;3LiUYA+W6!w5vE2# zZAl|9e7*h#9_~hs%wL3O=S~~`+R?x+$RE4LZBw%y6&HUb;lgtFuV5PwKTYU}?Y3;Q zmoII0;c=k{Qw&xpO_On6s*T@+ei-z`+&{W6RIT$KajpS-U}ox8gn6=+RG4!jVTIIT;>W7qjxD6=yY zxg~o;>hNJ1gHqeUy~MMLl$82^Y>HD|U8lU(tu1Pb$=8Q?^-s@<>tcvu8fOmi9h^QuX@Kh>MXY(?rY0Z4}0v+JmO>WP$qQ~&xQ*8h5 zwv@6zTIHYZgs($)KE=s^4ib(HUOB>{Ai)}I&)=sXYW9`0J6&o`_uRfS!LUZpa5VQG z6$H1YsLCRB`1S}~AQzKf3l8H+zh+P3W%m^d@}4e`Kr%h))LdGyxd3G485vo;od5=S zx>kRhV4T*=M@Fz4oe(ArBZibJ-6lBXY$I$|x*IvlPJl3Jo86@p=`23XDrMr`a5d=9 zH^=RY$Jrth++KPF9W7i(xq3H~N0dA%seYc8w>Gp&x4muNs`5#*5A(;gZbnwwS&Gs} zWP`=0-yHmQvkFeWZzFVt9kk{+<4*gBGc-f~nC65%4~>}LC;h=fQy}>H_L<5;ykf1d z*VWT5QHf>su}T6u{E<>so^Oy&k};Tf8oyTqZ`E*X42#t4>N|<(`OG?m*3U;Xgp z+%eqEXLk{MJ>p!`XH+qu6I<9q3g9C}v_43?Manr4X~6?%dIqF+clr=Z7k0R&aFLiTKxT5fLo7H``rW)tRl|8$y+lnOmR1S)w$bzNv@)gpkmZ{5c#;Z^Wb%q zTs^q3YTRP?tK?r^2U$~vjYncw>MDvqTQ9vj$_m7H1;oyV82yNm=N8!`Z*IGH%qENQ zDoc&u^LhREe_-ATB5B;X$k2rW9v)GE({hn^E?eHj;&M&<8fv(Qy5oRkWXE3#l=vSU zX}VgViv;n~vcwRBxB`r-7?1*}>>BYfl`X_)6GpHWl01dd1O1`1Y)YOE48u+;MNsH! zzq@$`Dev10lP;t7mXBurrVc<3FliAvxjPJ|xZ2%@-pAc1&$CUd&d$@cBTGfH#W~vB z6Bgk+s23W;B~6}TpV^~9IL%~}Qa;p%v5{>-l%zcLVWm(rTI?DwceWS)%hl>SIIr-M3VHH_{fNqWjejF0nM!LEm{OsJ*ZLVsq z8Sefv6dP;=;_6k9lwUM%s~!K~M!ubspE_6)YQw2c9a6u&-lJvLzxSkh$o8{Je9`fW z5^v3qa>k|pU~Ks<1NVPNy1^Ak7%=jb0`71jBp4Gxo(zPX5M$9%at@>8OjQ~c1vU@6 z$%Qb){lcaVW}CA`ak*^AK`BD*Fz(NI+cx-;hSJg$<{AZw$sFV$V$b*hRY0o0f6MWn;^LYLq2BwoNoHdp?;SyIN+)&D)}lhKok1j4E|J{w^RiaX z^j^!375(YT`#^3X`IpWX17$PLRo0<=+U6BtGu{5wFqam(Ka^!No6!|e?eWm!FAY67 z_jb?o&AZ-aRD}s-T3Tr#M>l*e$ANJv@SZ75-;dPrO1{(L`8?LC>#8r*ffpPb)2AQ% z!7k!It(~z+uhTfs>lH}ft$!zjG$nT*e3ZUd*A8$WEC1puSEI3NfsdD0pTQ7N1NI#! zhrMOTWDL`b>`A$`Ho#{0dqo|v)Pf(xbGpaLUm*3m_NrCl=d!pYy8OWEy>!>+8-9mJ zVAdj(7<|plIxft~$kYj%EW&4D9%5T`oUlcUC5ka26sWFK<&vnVs6KW6YFO+}1%oHG z2a>>bn~uggjIb@KwhNFQSeSceFD$CtG2qC*>fV#`ZTt=>Goil-tp4GDN(r=NO@TCT z7UYvWG6}XdxjU!WW&8QF$;lb$(8bB!)ca8r=Z?r|U9fA=Q`$V@*E)&J22N((IawvH z6|yy^3Jk|v9iQoyfgikVjQad2nDC)S|4c#3U0+$Nk&!Ze!v<`I4qIjC88gS5PtK+* zytjKh?6cDA2N@Tk_}>h|IDt?9TIbmBJFvf=@3e}%bkQY+LMks} zwbUdRWs?M8 zeSaw5AAhs{MAVX8L{1JRu7_RnwLRUFM4+M%ytT=6k|~guIwyf{yt6&)C?6t3W=Nv; z_!x{iD2@wY<4vIZGm3ptN=Ito0V0FhUORnF)ho?P^%g;42MoTlvO9p_zyh5@4V9n1 zJDx3DosFuIK=<P0qgPkMch6JSH$h6y&C8}U?#n;$ zD8l`tY3j*<(BjiUmw;&f!W7*>LqiwocNdfz0& zPjN#ODfT|)IA)CfMT=PXS_oaJT#@XlCWKWu7kO33-l1o&Smg`=O1gEG{|Jn~3GzTI z#=(Qq=>%XmA>RnR3!9Q369{_>lKPhei4!9RIEc^ecmbEy$||uUcv~NasImZWI`s=B z)7E$YCV`eHhNVdmC&VxU9plhszAy%|k3{SjqEy*voCF<^T!f$YHF{d)L$f^3M^AyU z66dfAcCiXSthbxAolCX}i;q}26xAG-jC3}qlA-sUtq(hn><$=NH+tZxx?d201f3|z z=Nw)n@J%BNsAYMFT`!vgJfCUKCAAJD>LhdBv4~i*1O}-|UX2I%~D$;&+66mlbu~|oI{1@s} zxs{%XWCCc6S&{;5!%y^v$8Uu@>u8bFhMkS6sl(sG`zqjaEM-azij5U`i>T5m#H}2zX^hg{ z9D}bgaNe-NH9`AsfkA4T;dN1C{<2$Ru~L0%ivMD}+b*TxiXG$O%1`@r-Yx}pSlExP z%T%+W1+s?~lOUrs`)TOm(6{#K<&YY&HBzFQY_;=yMXbg@r=srF9~i5|iO++jCH06R3)J6 zNmA3!;2;#_#1;YZz!-n!jJah!T3C)IuxNQ~usxrLa-cDvAbTjksE!-#CJDn9fCQC-AW#DYkKA4)0 zB3CCU?1)>?OE(@q_CzJG*n0heYWVAS)}@QXUX zW`greJbwC?k3(a>ECXxYh{Rvp)F^5X>Sgb+a?THQSW)ojF0nIrc|D7xLs!m2m|oSs zRq0y9pxDrQ|p*TBWyVC*C=Lx^P4F(pFGnQOSZGZ{5gu%j_MIrHkH4XnLv#AcEd zP=bHKg0vXpwIqlUHn?S~+s5%&L@Xq?7M;chs}eK~e_h+_kf}J0j}{h1(}92K2sgJd zt0=s;9x;d5!g|_k6hd;9Ch7suW8a(Ibe*m5V@1i1J}l0XkMdX#Li*^g%T6doj_*-I zcJkp9AxGp7`Cj#VDN<{!f39P=z_#6Ue^2>3=adAwVm(kKMrD^D*&|SP4gnTOHIh?tozZuad} zYfJT`FCw9;9MHzdj!9c)^-O1|@OmnB$g~r7W=IVZK{@uz_(RIj)^aF(NgDPWfc}b$ z(&@T-@W!?KkSq!KKNh@%4L9Y3%t);FKlat#W6}BQ6mIF)w}7zRC(y>cB?+S?ft_Fh zhm$ZCqqiW8$&Nk9B_-&^o}_U-j9)n(Mb;F_>IHrGcs-+XOrreO^n~*#1-~fyBB81A?u!W&eTo6;5NLRk5;*8! z9rQ^X+9tnq8i>dx21lMu0HDVuZM&Di!bO9Y=>hA;k+BT-0!Z|sE!hr-(2n}w;R(An zjU)>99a5wZ+rL~?LBwvm#0@Cf9vhBOy1OB>wFH{&DbITuJk#ts&8>)N4A3xFL*HfP z`lgw=xPLOv^Iz)H-Ftak(9pY4ui2;ZOd(w<;>OOsH?Ec-bCvyeC*gmA%+lHD%Bc*) z%65f8b_(cU%}6X~{f=d6@DuJ*Pg-F4Z#4^DIbv@-^z<+bqlqu-8N=N=|F7WaUlTPcU&?&_ zQ1-RU?A5q8QU|l`ZYtdcN8-Y>m8G0OD*c?sq*MT!hs@#W)o z_1xF*(N6L|9%Zh*W7^-$T|1@fK}ybwvA`{G%Rx~@EFanNJV@K~q{Hr^zDQ7@=8<*T ztzWKvGa?e}NXrg|;-R*LAGC*Arh3bF-{MJjpjrNx^)L%Axy+mQk2|DvsClp z$Nd#D`F@7Gvlk}Y?b0u`>#Vjv+R<^PLh%{u(j^~{&2I$Ct-)7S9wRC_OW`WV|HY;E zpHnaEoaRPMGiIVnrN3T=p=6cvn5j>Kb+dNSrI?N>3&yZfuYkUNU!c_O&(jCrVQ<|) zDVHOT3o*OdFjYEJe`yw}`BdX0P#^}h#8>jh@jwH5UlJxd7Q9Zt?ITzqj_p^v>H}F! z08e8^k{}VqGVk8`di6^;4ob_i@jtgfh)5=IUV;i<$+GOx@=RLcJ|v<}9Oqqk_Bh%1 zAuH*Q@X4{uFeXUjq;l&5sCGhLQ?wENPx#$dA=yiWRsJQ%>4{88dN?P zmG>v=6)!xIJ`I>uDBUl5f(s%pBglk{05KKw|&A$`^6m4!SYuxM^NJ*w{@R` zyx4f%&(UAL@w4pzF)#CDm^lMXixDvi%}c7GOl>9?7b#_!X@|_pi(|_ ze1TGS1}Zn`XOmw1E)n;=QqXqdYE=8fQrDHpvT9`UG~AnyZeYVfVXe<^B5Shu9tqQZ zr08b^0wqa1F{*Wp)b#?deHj}nP}z|UrTa9Go6GEN?un6(a;nxg+}&Jj+Vr5%$1VBT zuHJ}x^RZ0-7Z6Qtvd*_T!FA~tjU5^`%B*C9g`Q%j;@qv=@GAAkXB7$l#@|GR(gKtFKLf{F0p5)E{=3B`2S%0$2DHZ7av)i=Rlp|OX za^*T|CmE8c)_f(a0}IB50T=S?JPWLIQs#SHw}077OYKQ|SDL3CVwaE+F3P#J{yt)K z^M}6ApZ&q%=0#y@JOBP$*)Y51BnykAvd-=2rQ=2NyzZ~J{(gIsV>;PC#RQ~01?9{{ zw@d`@f-+sBLy5fU#C42xrB%fHKRCb}>Ww|jb9_-tskV9z+NGd;WMh<+l-$V9`M+X) z!%%3Oe%TNkBHmI=B*qd!i7(bKD1>JLtqSpaLD~&E%58i~;#ld@*`tGDuIhOGNFuFe zl7?!nVAtzv+6H9CYE@G@TvZ8e2|k-w$4S#(pwP9JCka8jn1( zF70827OMwIwN@8AISy$0r{d4sX;QN2{l5`~hRvDC1K^1hc~H2jvF5f=U6-a_CIMmeoU57tF@SduX5F&?teY=@4iQ0?`U7I$U8v%T(x!!{^o+goe8a% z!$g5$#TuMSyPxDx$`Ln%q4r5}qgpJF!%p%g{ht&y{4l1~tmC2?~o#{-6T0j5E7pvn%+F5=^T& zR;wa(=?Sf1U(>3}9hvco*0U>%Ohpg#c?k6BvuVocQM*h8woQ;G)ZOjisPW75$sl_w z#TE)+q1OL!p883TQ!`#3Jfz=cWWUNRDNrs3Lld>;?q|-2PN~m{Bp_K6J4JoWR?xQ_ zWC=k|b#^$t8s(m1=VxsTU)Hn8v+{)Nfbom^pMqGMfZ)i58F3q zhE9O0VRbW8@h7cEarz^+CS&AcSKEApmg&z6kSje6O%D<*DBv|54p%GNSsaAzjavr*UdySQ$W&-M>mu=B*c=8R(Wh zp2$8rXAAcmSR!CZ53CMR6}Re~RVKGl;*OqBilaMI6(0XdGH&`7y5<-JKgyu#sZqd~ z>GhjC3nZb{rVXLyr%WDatr{oJgF`%b4q^z>q#YBKPszVr7=Jnt{-T{qeSr3l?d9IL zfA8row!1W{RKO@vLu=~_)qlC(vzZ2gbwxzpfe&0b)NvT7-xF|S{j;nJhzc}`6)|p1 z3Zv3l%7f{01w)ooWMXrOyg6lYrS?{MdMc5+_FaIty=NZ&$2ywbWqt z>L?se5YlW%-RHKxu%S8WDuZ7DhyU8@r%5Eq#2AfA?94TdG7B&1dZkh3h^O1pmI}^? zSbWHlLLYY)W*5;N0kAGGU{b*O5yMbj<*}l96S=dCtw!H^t14&Pchuc0d4`X%g!jBT zzb5kbb{tit&gemFC2UzzI{4`HD_Mfiq}M8;=4nvzkxMtV)I-;dFFH(>FG6|yoE zUx7_z`S68ra04TwRh=V}CFa%g9bY?yQd?y72<_6L2%+^m^HOEJo>~&2?VR_9C$>t& zJ+8?@_lt~>OAqCJnUYAd=s+GDV+O^ChP8Hsz^apIY~nDAWt^|V43yg|!dnGA%M-4$|%!t3ew8DHfWcK&`MM}^t zhx6g8j9EleF?Ajk{hb|X>DkFrdsS}Ghw;?QWdkux05bavK##7=PpzMM{P3r)+T*sa z?e8lq#@@iM^z;bOGnaI}P1-wV>uW@|K@4*Rpx_oNsHIj$?k5?3+z}uAd7wC+;uV!f zpR+nvx2MTrU!sge2x^D3lv9^j3SxLo5*-TLBov-l5vi-EcQunkqbe>nXQwnOk@g=p z!Q`*bI;l3;ddW1cTzmTXvRuu#o9W!t-nD?jpKqSc^}PHH_suOxDveRPYA)&9dUUQD zIO@=J{{=YoKV-k?lOikKW3HBC_d5%)HS!T~0IjETk$;-z3*=*R2r5Q@h7}*kbnRtO znHzwD%J1uHW?<1Z@if^ZvQ~=KwYV? zKJD2qisOjj#f`pOI>Rzz+tz z)ci!HE;#_011!p0cjr^hYB0jpk!`0LFSpQ02-Ys*SnYnSw5!L!bZfLTE2Fu}#VNf> zv$r8Dyxh#cr%%SRo6}&@JENdte3=%wUIJR_8M?b+YB_Fr(eb3grALmP$7hObOhc^! zJG;4PXbx~(Utt)%jxPSVcIo<$vmP>k0nb-|%HR!GWgMmrAv50^aY%i4mnoXY3*&jw zA~D!@D%2-eNBxl(?mvok$*V_?_DX1DUqw0hR=?SX08oVy zx!Mp|z1tzc2`OjAi42v3cEL-~^A|{hLUcDbc!LwQ0aBYT%-+ba*Qm0e=NRIva1*ln z1g!cy^(zyV4ysq3dn+AaRfL0QN!;d^Z|a~*h3y%@6ui@xpNIp(%fRsmD*bxEw#dR8YFHUa!!2*)+FlWMQ|d@<+|amB1ts_!`k>#%I#xoxXT74t0z zK%yZ&;gI@yZpgi~!s@+=P6p!2)*QR>@%-ZIomF1MI&AJoKgUM-e88Ak^UF z%GO!IOyRS1?$I9bn@0sY0EkPs02$q5w84F&rz#60*y7vOG3~*8?wX|J>od;&XZ>FX z8uxQ6ic%cIyL--4bbqGYRl91Pwjpz{1+#Tw*%AM!2`?&el+vz|*_vdw4^bJ~#ydI! z)|)QWpmVpeK!h9?Y8_xYeG{zirR-g4A>r-CP*km}6od*_&ajkL6uOUauS_V!<8OZ9 zHan_g!`mva1j%ZoY8+YRXp0~j^FVt?5M01g!c+CSc~rf-V@Hc_)z+_lfjzV()paX2 zgldpF?;J}n*gpZ@Er8$?%^%ABKes=0m94eTKI91WQn;3tLv^5VUz?QdYNmz7B3#T1 zGaR8iq&&Qoca>#mpL%LnCE~@c*1HJ!=odu~2wVoh?%d?3Frc4{2p@GX9`bP=1)$Bk zIX-|p`)&Ytrh|4etlT8LEr1;U&!jQ41%p@+?w`aUmSin*0DB$tby&h9{6Y-ly6nAt zH|FVvi7S|tLK+OX=%|{1Lnf}e9L)hL%eihowAbutRGlYir&y=v-u+M7^LO{Cv8ir& z_g$cZ*DqT^S&6QW8Tzvrl8T2!5YHXuc^%P2=(UaeU`hm!#z{F)iw%GptTJ1G$?vOk z=d-itIUUwjs_&f6BV-2N18)4TBZ3QEBe1s~)+tuXTmgE=6VJM0p-*?$rSHR|ipt|B!QCso6OQ+;Cd%1w4!?OySTAZQItaYg zVtGV#udv(K%jGuO(dd)u#SCiA2p{0@GIf{(+0KIW-{Y+|3r-yE!QSu=dZ<}4pnY9@S+t>-2K$04TlmaRZs$i;B zR8cB4Ox1psRGjv1`n}$WYqqv%J7XR6;GlblY!K$f2eUPO2z8_I1Rm-q04s?gO7xOX zmmtSQ<1{j$bCCP^$gRZavMq*!auWD3zQUfV(3Mnq?KfSSXQr&F5f8hnt#=vj?p?l^Z_^RHK9F8`bwa0=Tj_2s%Wt=3=$3?9riRP;|^~FSkbKmtxCiI;eVOBv! zdLvw$+QL+}tY$YTCotg3)gq%(Ehj+%NSd!F;<+BGMhgqg|L{duwRWA9^Mfns2@0Uy zU>!jL7IrU#=)2GK)WtyGp7at%(TK_Y3HeI5Jzx2xZr>9hPcckN^XRVLQiT7RiN6@RjNUh%}a23i|1H=TPVhh+sL$O0fRQ6a_=au@(|VcyqT);VXB zPpgIW-bdw6$iyStD|*3d8-RaeRMI4}AvvICSDx*Ls2=nHuPaa@C^Ta+TOjYn|7ele z_A`aw)Z{1_0!ICK;CMVkmRehI2w&J;4fZoGoO!&{Z+*vc*c?r$Uk=l2o;ElvF(8o_ zRT23Xj@&#xJ88ef>9<4&c-HwSIAE2vY_SK7k_k^&0OV_&A_OkG?t*lce1dcE#!*Vf zY!IHKB;aZ?z%C4EiLn0e@RK4sNj{(2kZW#pLwlRp+k(&XPcKOQ0@jp(qgO$AhRs>2 z5?}ye?8ts(%GMHrPRxS|f>!P4MHO`J0;saR*2O-qOH;~&GFVgw3)Ch9%5!nmN5Jmb z4Gg%b6`y(w8ub6Ya1*(At+<4)|FlW@Vzd+QI>ySyacXOyns}?PGw(4yAeeO|-FTa- ztYZ3g^>l~JWnh)xfc#fF&!-^!*FcIya7?-}8D&z%0T^H9I@Vq(Ev~Q-@ERXqw#5T1 z1_+1gJ=kc8T|%r1tI~)dkd&b}xtL86CPfNz4Dq726-JObNifdz{spXK;X~J8J-*lH z5wGLZg*!U5(Fc{w9EC>fyuZ6U`~W@W2;0F&rNmaKGPc2S@P9JNEcX|-R7hg z!`xEGn1?gwS>wUFwfSow_h6hZhaFPBzUs^6G-%8Z)>p&q51v&1SyHU9q_BHg_2|+t z8FyS_iSFj02bP+PRAYbYf)vk%SkrNKj(|O$%7O z#%J{pl5E#G(AC?Ue?+PP&c&UM`NLcz;u#H_2iRy`!x(y3<@lB+k(Z~M<6CSyshQ@7lDiyWz~8bOLJ*u$LIe}q-M(JCstTG?#o=PtIO;Fle*)i)g%@sTv4V;0%h-0RaejRs z%W}FYd-b-#&+_jANV&qr?M#_md_jGUeEd`l49`|4vTviT_aBS-PWyrbas1}(NntyG z9ZT+Wc22%uuvORdSbspGbxsox>!`8~08o-eE7vxG-=gZ z%Y&1J8tLi9iOvkQ9wTOHfFlpa;y(AksiHrPbNLWv`8wF}g*qC+-Yr5yzrB=YJZfiZ3zzlkcj}(M) zQa>{9hiZgv4~I6Xo!kT0`TW%~Y8AXcnr9(YzxGvMOhH!Q?sM^MCC2 zrLLUHPvrx7Ums|$0#C56WzeO-G}AS7R^Fc7NL>-kcs36#gkjB&(d?bVCkx1Ge() zLvoC63;0NG?`>{;7^6hK@497|CMS zIdZUM)^^8I@!xMHV}8UPe@f6D_hn^R3Jx{N`eyC4}kzNe}f6U>)==(Z`Iwm>F@8^b2b^dQCCloR`FK+d|d%>=SEk{+8QXjcfUXkrm z@SSYf;1Xc;?oo^Mc#&N`5(hLgb`t8R|0qPCa$^X-Q~rHq=`h<{7Gqz`xe`BG+?Dp! z0$@SDDFq%_0ypHn{=yJ7ySe^Xn)5we%7^mXe>?QU+V{Q$Z^`1P28H8WiaC9;qm~#c4FtIpC}F9Y zFQ2?8`|aAvdYOr=nF<-#zsBAnWS5>%oc|`4i?as&C;{y^#{25(-ylA*TZr@ywuce) z5rGl4UwMMSgF&s^U76G!PLG%~31_ziT#($~bhfO4dSdqj=dVf-4sMY&JH1Uo!6!(C z5~;+4&NCJ1uK#5N#ejT$IA?;rm$$=kjYZkv8;Q_8CDXPj;T)4q$+~~Gpo7E`E za%Ew|(f8-rUiWP~4@)Wv8SKKm?N9aP)|lX;>*6bST;1R`=0$X{-x2Zg{Gca>*iGeONERrO|9NmwR!KO2mbkOWh0p$y!%4 zFBl{v>+W@Xa=LEiybgVm$k7R1FFVk~)hd&=$ALal$2e3OPiTCoRdjOm9QgZ03ob*VV^PLtY$)P$?FsVQC8NB^MSpVaw-rziQ9 zyh78NUb!L>7DV#ZG~QCGfQp2&`WrwupBZ_XKCapnpQfX30yZN*l#4aneg8M1D9_PD z_Ez^ZuDa!Usw1;( z3aCika zDozS&u+Nd-GB<9-Iqw`Iks6C+Yq{92)hQXnCYqKhlDU{Oo;`<^L20JiL21JXJAe#| z-i)~+mT~3>vNBYI@I&Fts^?*&r|p))4K#3!xro!PH$4!9|7LQgx%D>79}?cT^JH9@ zGRJ3)WcSbhqv0!-lO13y+tn&q^MMXc|2BCduu_y^Tp{#BlPm@wXA&nug-E2pd8G8-RpFlo{khJdXu zH}O?;c9bG7cCiWLMtmV(BQB9)0@3o_=Ui-5F6>RD`25O+JAQ|Ec(n~1N)w0MJ(<{@ z`5?phweR1H+I?sI~J!86VN#gYZ8y?zU zdxH0|bb$gU&r-_r?1?&>b?V;BH-8u7_LOD{E+zBE@&AywR-iFt_1Cu77j*F>(Ryj!KwC-L}8RSlm;5nb-^CJhaPv<`XZI{}; z(7GmXSYEJ(_S^l&lr&%2{ujjkN4Bl)aL#-_3NhrYKhKVB!ghBmy7B@)r_4Q2+D**A z{M$dt_xr7f(slr{4+x{s!H7RmRHriGzQ!bqw!-xnKd6na0XIwyF?sI#?ib1fYfUv& z-Cp`9#!NTQeyb^Z#M!p-M{B;HW@g#FI+gMu=9+XcJnrAstjm?MdmfIOEo&njQiBSh zy63d=re*x%eGXVkfQW1OQL~P}azFj8&?NPcqjxBc}Uw1<6iA*y{$rRU+b=440qWa zOvH3QzRv-B`M{4?70PkaC#WN2{pk#mOSu9;R~o{N-7%yEp1DI|58VV(04T5iGKdKoOsXg?Ce3asb)K z$@47!-XpNf(uO+$VJSg@%NHO5=IO7OV8N|5G zpNnA(Tg~o0_FU&Uvf1>w7X_z(1+Yi}P=VURHcajifr8m=Y&ZzaO9g(Ha02u>K8*UG zanztGo}A~Zq;O=+$ifbnnOA)4B4;{USc4KKtm%qh*Gy1JLd* zG2xkFn|a{eJXz~GM+?bSF!sB529#UINc;N6N`FV1=>wE`xyb<6pzR?P2?pcuYY}!o z&kaV+vNUSNnU+Jkwc?mFlvoQYsvBe$cTsJCt-%9plf?4bk9K5C96AW6&bF8vm*0Vl z6?4lmQm;FNM|R=E&a->BPttCTl10yjA-q!a+f(;KBV+(nOVY5iIn4qy#H|7w4vt6r zsE@?AoUY%J2IdTTsfR-8V!9hg$ps|&2=U2`Ys(dGzh8_<1J**&pU4pZUWUiVIP@D$ zfLaM4e5MbH0K&DdMHX#K7a2MZyE=0BI?_Ptq6I|T3FvrP{i%pMze1r3NXOvza z2dD~GOZFQI+*w!YsXk~RqyQ6JmZH=}XELa!ab(#(kybyzq*}D*Sg#;uE9A}`%TWkj z4OamG&)**P-1%TPYzp^9?qykFg}L@ompx7GmH%Wm-3fXjS;^le9Sy@{%9A?0ix$*f zL|}6Ocoqm>8M59W%Q&(;-nAU)&bxT5EH7|R_ox0iQL7^V9No@bNbf4 zEUHKsLsKTzIBc>U68G(YjN89|2u)Ry7D~5{s4%ivE`c{NK8Cc;n!n!DOpE%Ms zF~c*e_VH=JUrMd#d#X}z$Nfd&G#&>pJB~OHoKB~XpazDWjqjE0yr->oApnc1XqAZ+ zc-XrDq18Z#RxodCDsI_t`>fx` zGc)%|5uSj#CW4K7DdodmI~g#B#~ycz_J2xt#}usN2%tR&Yrm%2PwDL)Qn(&vaV+1q#h%Giaz6~ zYxvLTBae=%3r66Ntb}XpU%gLwF5d9b3>*Qlv2Ek#P)XbPm5oV7P0k6J|Iu^cJD&Q6 zp`$yGKG+JUB2&xZW1^p_Z1Ja){9`)~0dD%y zRMZ^)D}xi$bN4lq*FPM%mce~^2v9`*ICrD4!ZDI1=6KO=d#bD>g$CvutM z%K5$0pJu(=aWOmWqQl@PGzP3(y-#Dhh|8z15_&oI+u!7ONsI3K$Uewgs$Jif_I4$hI9vH`~?efEf8@d&`AKQ zztaxs1|k^9hHjN(U!LXW8DcPipLWZE4P7b@3EtObRKzJSclO+8Bphq;lDMd6&+Iaa z06ndl^8BdzuQXDlj|*MY1%--0eLZLw5fL*4-T;6S^FO;o{BP2>ettH7uPy!VKPBlp z8Y(h$$8BfX!M~dl0URxJ6PZz^w1o3i;QgzH0NWn%`die^2d<*!y6f6SjM37xT2sY`KBE%(Jgr z&w9JqHr^T%j!#5=C$IQ-ahvP3JCecZfO&8!jP3s4I`u;<=S^8@SJO(GwyjR0a&1q~ zk0#&DR~XBmv`oi#kPb(3T_9qcNU<^ogvGP5#$wYc1bMgTU@3@D%>^*HE&_rp-r|fC z;F!$bbp7OQ)DElJm^H*Nx$Pg?-0KzyNdW07X+h zIl(>h=(tqbfNHh(hnDB;R^jV2LmIagtp5B{-kO?eN7*(Hy1Y}QJ|fl;eNn#zEKDC# zclpOT@CPd4nm#WmJ^=gH`#f?5SiXyVd8tl$UcBp=B{33L$W;IS8mRmosH}OUDuk_* z%7v%WDqjrilfY&Jz=Ek!Ev`mZ=?Eot!b)wLxl0-}sd(x`+MDXL7RM*dcB^0*VngyP z{Wg)|BDd1?rH%_r*J*G0u|3%Q!f;boD%pcwkZl6$zyUlojE@@E;yXWt@C(|My88`` zxz!txg4-k9E-O2u>Pr4RQNEcBVjuYY)99;4dO#rvIY}Y)1YZ8&^io_NCT~R;(b9|u zoh!y%5-Y2M@PI9l)jG90UTb>=@OXvTn8|kfz*e1mS+fxMP}>i2LG4WM=(d4f$IcEt zy)oVY8R#US%pEmQn5F7f)8yBq3|xS}flT8$C@_(|do?rQ@?*|7ANJg-sK-;ylO(0a z%6-|o-%I`AH(5>F;Z?=}Z9SLVAO7*3g>I|i-^22+eAgMz;RhZA$OPz=zsk{uuynHq zb*;HN>42nv*@-{IE(5^*)&RWuWjDr(Gmfes8m=`%Fk&l~ii` zP8M|4pM7HsfN?+Yl1|d1MBeznnbzfFm8NrCPG zZqsGnO_T32cN>8pcX;hly_a!UCb;U~pga#J@bj$Aq5NAx8Xol+%^?tQFU7J=GHtG-TdFC6o@C zVt|YXL-M6hb~aVUHvk8n{|c#yYhEY^cd0SfyJ(`fk`v z7P7_0&@X)>F=o#|d`jT^L+M~%yPV;t`)19perHfR9#os40-B^w_nzaew^KffDho=I zs$afg!D$P<2Q`4orq?enlvDlP?R-LI7L_(1>i+aZTI@Uh*Jc|IW*f6T5A&_ybK!NJ zi|_B0-CFIsf(mny&MfN|cSYT@uVu~|RTSEm8-$Avy(!ve(fG9Q43VJZnBL&heoR09 zyWX*j=SPH3J;T}@4mfA#gdXiTir?Lk3hX`mOVO9?_vMY2X3jzU$G-GKl==LOHvpm6 zX?bZx^=rUQ?B$00N9$5%f$89f`GaE1Q#V~^RA2&o*P|mp>TEBL*6zYe1ksORB~CtD zU8V3q?UX*@IF_VI4-`Y}rkUpsH_`QO9-gDTB9k!guVjx-JF*+lGr|>~b}l_$S$8a5 zM$1MHuMhL%IIdt^00?9SdL92+R;88u>DK3?nUo>zW?x!~MjA%9K*KNTq0)03k7E!bp_Vrmg}pE ze4{w}ql&t08*#Ja%MXcx^vsyq>GH{SF1I1ONw-{0t8E0P=f;?*ruhvNwVq9AYHtk* z*!fC3_21nG7VL3eUnR)dCw{I=rtQN@= z(lPCKWV;URjJeXW|1S8eEi~jT|6}wtI>+IqlG}~}sj++-aYzzpS(eJLFYmtG8=H0` zCCB_mQT9WH_JEG&tFCXnYIwYJ=c}L!7PUG^o;WGV=KtMz6@1)fLsWJ9gv0BC*?6Brt!Kh^ zzS6L(528J8O#a$ddZf084D1m3xU=mClE7x21LGa0QS36gOWi}J{g-+RlzlI$=2^#U z-NEVL??P-O zhQD5(+1L^kLy_N@cAitP1GGeIeW%xfr)o(gRvV3>s9s#Jy7QReiZj$;)t!S?ZVhN>&{gUPQlK8h{fZP5w)O?~L(=4Oe-cRy|y! zQ6I0>qdJ6P01F5#_UTI!1Iw%cL63zAjV|3_`+8^4jM zV)XQ}yzZ2MZ&}=kC>Uu(E4R%+r_)=q0+F!xXGLBvRjlBy;)Vwy?Dm$!rU~?AmCy-K z4J9GqpZqH*=KIkSUFLyf3m2@AAuk>$`cOv5Xth*jJS*@(?{%j4-P5a z0c!SEmLXifz(T4n7LfWnl-eV-tFwS3m%MK1*7k-aoj?`4p+%k5+fX8 z+KK;3q;6l4g^slI514FQ{p$f+0rVZUaZbKj$pqZvwzRBp1;p;;CpEMI%k1!((%OVH z?8I!og*m<`Pl;AX`gcsW`tUyo{7&BKia2L`C)$4>F-iKiDOsoTm+4pAKjPR1e>@S*4uEx-pMmI37U^Q=Ge=A1>$1NGPHp ze`7c@lk*X2qftx<-7TXc-T1inju#`3uI>aYlGx4$hr}qqbzJEj zy7>hI0y^v>?>)7q@~!DB&Y52KKg@t6FvqMSS)oeBH*C#93v8$d`MH{h-hE*x+7`?d zy19$w@(a5f(jog?F6lY{({ol~d;gq&*!VWG{+S%?KlG41GFAv0d5h}t*h7zacsh`J z;S?*$FO-T;Ujt$04(cPHAM81rIlWB?Sde?yQ`Tr{XW%%CcZzJ(IK=;MYFbuysFsU} zoZfw;FIiwXijU46qCsjaKg1ss$qlQHfiE%PBwgR<5$WV--$y=ke^U%0GgY9;h1RXO%1oI ze8_aF@NHWDXdtqwU+P^;HF>em$A!G3%Hltq-eFy;e#C3^V)XU$Rd9CW1xBMRUZm1A zs?l^Ij}Mfu6Mm?ZqTakleRvIbk&q%+701NLH$YgMoBhO#Siy)``5|X7XE>Rwg4AAT3~T_StO^+MCszux?~;aF7vvUO+R+P zcLGRLZ&CirKyBBbc|Yy=5xJO=8+}Y~KMIWZRyNcRk!x~mutYiC`oLa z;h~1HRmzD%B(D(;>oC1+By3nV&h0hLz#Ig{NG~gl9WhLY{ON^qG+@rkpMu}hwnR!V`o2>o2G_645tPAP7 z2{!X-)ncyM>csBX#%o@d%GC(9?-Z!yu#t4&zkX;$YqUB>1cQ{?D^C=rkyXDXs=i#s zH5>LO9Kg|5e*NZa58z=Cf^u-9%<8am@QCtQg0euWc295S0k`^h+_OtU(2zCAl(j7$ z@K+M+q6vu4=DK98RBBHQ80u|%Tlq(Na>3`K_eKz`VA^}@rvm6u5nc;(nl>rPRY>^C0Yuu12-4PUi|{6MwkPCUdYIjic3nl`cPx zPAfO&7eM8{qnFF zmO?Vq`ZLv9;gIzg>WQMABn&KJiM;d0asYGCUl!?fG~6>9?)OD$ zSEKgd;(eJGu$;GGjtDGI+3W+LcmUPHFUeb)ap)HWls=D2TsfS9ugI~QB>_@2@i17l zT23S8jc}v>kXw4Ib}Qvk&ixmEqSP_kbd+D}2&xF`qx`Nn|^uUmI zBaT-c3NPL;-2Ly^>8JbkJstwCnB5vYg};i3G?=a#{DFU@OxBt`E%y+Jw!tfef)x46 zs!Xa?HPt8-1pc}gh-3Oo0L`qDs^9^+bDg<`TxHF?zS&MH@Zl z8v|JvprtE8wwi#h6C;O~;C{waTU9=jlb53vqY-Z|=B@N4e;&_k!&xngus{1^i6IB= zlZq_A@L8;7Ipuzy82p=zDUXIHN5eILq|n(&pUPl3rO*7-;TQyQUFc0MQ;9;M)K`+y z50;aK*t5oDZ~ae29g&0u}4fza1+oS!S6}9^L1qc=lR^ zpR#l1+Ra>2{2eAc(;xx`zRBt-J`g+xi~;Hvv8}RqS?2DFxFi3;rRuq6`t}l)Ju(j? z6{_|q5@{NJ_{Z1q;3{CZ0o9;8qQhYCa~9K^#Dvcs1NZCsMuQ&+;i-YS-Q#ALmrXgr zPR`~g$sQIBD?VSReYaj1>7W~tHRXZnO-Aqa54VZr+*kk>3-Gj&^=t_YXkPBFqN}mh zGASy**}Q?-GeTUl(<{3e0NR2D9%3t0s@@37y6iQ+I(3GO*O z=FcfU)^ts_;SKJP0%SFsmItlCxtEyTJ9unn|Mw-$Y$iM>8aXXi7R)5yzGh%j`$8EE;w$@0yRrKOtX zharR>_QRIs@m>X7E_iP5y=zB$Ug!8%9SiTJ?N-~JJ3$j4W}1)?2BhjoKO+33a2q}0 zAk@tA3iPUxnbJP!)qP=$gB_xx&9?I8RTzo znfaF`ryn1zDwb?fR45;+lLJVH1bm@&}vahviQ48%07Wq zr<(w4ov&}3m-`)7s@T~py9=EDxnzd<3m4Zj-!@Ag0WNxmNPvj)?>_8 z%b`9c@2rsPg8y;`e&#U#RYjYVbuLE;WYofcsSa$^_80rwl&@8X%DOg4E4_;l4N_tF zM*hdXu0P$@T8H!}>}amZ?%sX+MmA9a3w!++48s4VZL6k5AL-s+d}Y6yO{^I8`&tz0 z>)s?G8b$_=r6aFgd|yX1>)r=F@j6B&dG+gzPM5yy(9oItLrS`M&AYPJ#m-={whVyPuv4>J zaf9@h;nh1}3g!b-4HWG!!fu)q9IW+AtXpt5R3T|W$?sv_?pLuL6NuDE*i+0CP_H`K$+5S>wr9sjmG$cU@z=|EsZ ztk+08UTu@)M@sfOHfKAqfB&E*Nx{**6Ee5Do%)#Z|I*r@p!7+5W1a3@$aTMcc+bQS zYL6x}HX2*Z=^dvcV)C7*f4yOiI#JDqbw|Se2oBPVXLe74nieAMqg95Y>uTit&+U+r zABKMtA8HNXnF{KUrJ@|kDsF^xA2Hk( z(i8}BIZMi8qJ*1`D#ZaKr-2$oN*UKT;9+ZLp>M#=h)!RZ@Xor?$KR@P6CElOpqiao z7amtC`bU^AbQKORTe#iXJ+P*3n{)6|#HXhdGXI^Dv1VgngEs_-k`ECv;iqn2r|s>n zKHvn>YGWs}rpD7_$8{CzZ}GCzo9kph4jWB-4U$$%yh7p4tnSpI^ z{YJuXvPzqXzW*m(rb10ybhc{0|3H7r6Y62F)I;_Sti~CpA zfh}9b7$ik=qw$-yoX-046YHa@v#1_F6oe$iY3ctm{UWA(EO*XNGIVjY(gcQ8ATor| zZWbntjYLw)Z$-ZtC67d{V2Dc<=ztKrti>V!#o7~##hnB46hY_B4v(TGW$ntHtq)X- z0tUBd>D+OlYk$abh;X~R!^-VX(dM{v$YlcSm7?+9ty}+%rI`=jKW~|L8~vpb{Sk_v zn&ppnFinUTvuK3`1FRMDcQAR zTJ6I5?NN~<=lpJDL}H@IjPf5q8ndBUeE=4Nqn?7mfj4Q4=q_c5gvJKI(watIrvS!DS|-#DSG`z#W$y zpTvw+TTaq#uI4G?DSYUG>c(A{ky&SL$1zsadB{NtA;mqN4^3e-GC6X(iTUh8hC(zC zE1$T;%8?$V7idNZ8fA2(OVNDI?8?R>xAs7dycE(L;8Dp8ZMW)@f_V4C&Z+W(Lj zE6B3%nk%Ss-YX_<%QO%~Uw~OeZ<3GbS5aiWk!E(?ph|Z+F&#r?)=;^%@>=dR3bQ`R z)BN~AGa30QQ;FtPG?4CZpVPWh<+Hzy7wl(yKWWn6T9ScsU?q!#ASb7#`ON_y5!FE+ zABScy?6ltb*wr-dOPTVS!RV8_wi>4X_0`Z5=GT}vt~~ZM42TOkLtoH;DBIcVCwLFZ zjlY_&Tx6~Hp?mnJxYROqgzy1eeul|`%B31w0Gj;Gp4v6A$NZCK!^l%6Bhujt)n8@N z665};rcb6m#uPqbdE=)B+*SS;7^R*5t=t9gS19YcHu!Ca(r0}Y5A`Iv(R0-E=R%|o*HtAk1aY}tnEofppofM2viyMrAo!A5p`QnEmOBoQjHkQo|(@zxgnnEho(dzgqGwe({g|dcMaGdsC&G|5pih%J2f!(Z9Xh7Z(Pn%`p!D(Y@ET z??Un%6t-=u_x|65!+nc~t<)0F zACx7l?AZvWS&9HQW2%=2vCoXx_x2V`d>3`C(gWnZO5y(eek<6+8GuL@Cu0mlMnevX zhx%V#LDye&dfQm&#uSu90*2(38E8We5v6Y&t=x>~66PEVt*0nR7Q+(~MiwSvh|3|@j|5M?3fBf!y zakAv9P4dG>?{QzAhTlhYVN_*Q*vXXShj3KFP%5)n3pNO>MWWrFNG(JJXUl zmAl{=a(NsMAk0qa8aL!1b!BZx@yp!MxeB{zq#rB>t4X9B{u@fmmMmw&`N5crH{)g> z$%QHVTC)lZBd=v95~XC4sqM6{Yr%tU*txO}9eH+!RH zyxWgs)B`|`P^^mCDBzpI;8_fVDmg(i?2Y2=y~Mh+f84tw+6DhknR%vbAcQR#ylM8OjhnILp3&&&fv z_t)z(O4Fcb#4Ukkzqc1m;)Sl2Bhk@3BZ{D-1a}ei*?rDW z6d8J6`72uMMNCwsR)VBsE15fVb{>5>F??5D&78D6K=irT;B=HOd(Sx5=zV!gr1~J_ z?-g}aQzkeq>Xj}KBF1z3Bmxh)w_A2xuUS~0)FrQ{I z$s%L`KUGUS0^eF_aIFnFFDeGDk9W=@zk!2Pp~mz~2kEI}z2l!zDuD?@Ckm)Y&{k_X=|0qADUM~-*^qh&eUJh>Ix6%Rf8$u*h@ z!!>Ik-k5s9HE@46%t8Mqf)YE*HICxQ3jR)mI{-Su}XmX{bFvAwQli#=8ze z`X|i^*C%c<&}JC_)}UV#{kHTu1con(#HVn6NsE_0+tgqz7>GC#yR|VmEdRP|BvS9( zv-y(j#$xI@rQ$I~c#KRD*a-1bE&MbX4o#oaq)-fK4^#Knw< zO#Us$k&Hsv%Gh&0YW=)s>Z2G&t_I3961y^I7=xeM?zpYa!0tLws0oN9m%6;P$yR;4 zdo9sQT+??t8{B7aW%Tkb(EU^j$zPr?M%Q#(QPdlC=X0#6_z+>3n~XaHHrD)RO+^yS zuQFyCI~1L81n{AR@dylq5js!a95`KjT=Gkf#`uE;+@wpMSpkQR*(A9yU*-Qg9IyOu zmS)iYxoZ`t!gh}ejUdo~!lzupuTGyx*5lNN=))mW3}BwAK^E`u_d+s{;qY^3O4UD> zBjNa^L5Kn(UjCgs6cf93%-?smclAoT+0+A>B?4CS{uM4^>_Tk9y6a zc~Q~b2pcRRNpbj}*_T){M&^ZiTKha!ig^H)D$F(RL4!N8Z`Zb)Xms6n`N+cB%rH%a zw(4jugh;#?(CDsmteAlZ{$#!|b0_5oGwFpN|ID3?JE-0bU~$C_3>|O?2oKJJ!J!D# z4ebW(m0ElL!w`QBY{Zc&&(r{NkPg2;W93RUe4QKcb%qx{=t?y>=SAdR1?UlAUVy)P zs1q^<$O$?lfZ_>=xn`Kag7!Qy5+W|j(yv6pz8Zdfm&zJPEz~dE>f@dXYX>|vRUuHJw# z9;K>SrhWBITUJM}_@&L&rG4}X+DH`L8ha2Ts^-e(#b(9ovJVCwghI=E^m7BI-wEq2@s4e)1{eQI#}mPGi1^d6^p(VK8Bq822Z8)JS0MO zuv%8-fYSw6Xc#^}OZLoG@Krv{l1PXw2i{78>68O?Ho(+!W_&Yp84c7XuoRaw>}DqQ zC@??vLvrJjkEu}928@^6Gd;p{h$hNr7(DioX&jzz&p~Y2i-N17-V72`X(_DK6ct_T z!@I=}da09%#S%F5WvIRthu!BfRW^j$WmuZl2qW-^=WLhD+#bx=OJ$db@`XoDPOSvx zS0X%Whqhu3m_yztvGbpLc^#?ah0mj-vL0D4g<2V8zL)YQpp6Y$I7+Zm`Jmf*u|EDk zF6L}WJ|F;IX5X%>(p&*JI=@AE&mc>PP~D4csd0EO&{f1Ln}cWor1tB>yr*@+T6U zn*=<@LNFW96E-rwldpeMU;a+=DO#?ZcKr%@ZN;nZs}=`tTZZ*l0eZNeOnOICSA4<#x4>a46*1{(IF z9T!Vj_d*<$8MsL7%4!mV%j}ur*T`XPuJIS;DE82C=7DCWeVD@|Wd?|k)K1YQ#-d9W z<;Jtdz76drk?zt%`x^Enl-rD&Zc(fppxjHrFBZo{!g5r6xMWV_VBCk`$E7T&<;JwQ z97`C15N|+-vtZ2yE(G2n!_Kjl4x~!l?}FkDIhTlp5e~D{?o8NS0O&U!rGl2rkBF*G z6dO9q| zrWi7--TXX+y<$UnN2NG z!Z!S$Ll~ZpRN9Z{jc#kEw=lo?0PLT6;x2`MwCOsa+FY5Hj~pZ{%*y|5W$^=8{>CGv zf1d-G3=kdVx!W_0FhJnjU}o+Okdq~_q+Hz72WH|?lp9gA6)!gO@zv$l)_(=0O&-@> zgEoK0wu#zT){0RLex%W^2M0fE>m8{nRGa7?oR)a$&KNc1iKmOcimM{zU^$&rvz}91 z#m&0jf~hl+kz(ir6DWtiC9*qb8C6Z#N1xd9TNz%iU?c0XC4B%vh@kx+7kyg8?(#cC zbM{zJFWsyK<&aQ{GY~#U>7qCZms)NvOW4juh6qAth(hKI5x;!rf$(8t{orRyCY;aN zO)4NJ2CSF9Lc-PPfFrc|-o2|Ey(~r~sHr7W2Z><>dZk&IU)Je)Mpmya9iD!4Zsj`j z{7J$Sa9cpk7%w6RCOjsH{3b97vqX6^e5M1ns8+0|HANNl z4HEtYokpkaE+M}WC$1|M{VU-6G-PokEiT*JIxf*qqXbP;U4DFgIMa~|nkqJNo{GNL zJ}jUn@xx}(LFL(}2lSuR9V6P%ct_$sZ8TzfRnrdTM-nKHIp+cMCbC!ghbD?iM24~X z<*5T^V83Ug&3;~t_@4Rs;z;SxU_M(TyjG*OhTQxVt? zcvkNLynxQmV{@qZGi)5p;Yj50aFH_Ra()q4Q5|sO5k>Yc8e&TD4@f-cUpDaXBS8hc zU(S!_(Kv3QHsC7H%p%H1mf~D5Uf@ki?OSXoymQCw27|G5Ad2cA-Hc4YLUgdGQUNW| z3aBd<9E^rXMmfQ82psl*kOtbM5+hFG-{^~Z9NClJK_tFOt7Cra2GAvS-;a=^l1Vv=!L%NK;4zZ{f+`g zH6KgHh;pb#7NQ^f+I+-I9SDhNXO-?VT0uiS4A}rPkl-0)3n4~{Co4+DxZU+qwdn0f zVWen*Z4zE9mVSXs?)1f7<#@N`g%fqyQT;V{%a^4yE z9gF9gd*OUn-Xd9@b--?|OxeT>ouW+6mKj%@cb=HPPFXP0mAGRR&g?pK(NPKK5JOfs zTRSpaD+@*Wk}q^W;ZDzcC%L-+*4ppUBAGHIc~j z|FWwXu14H|expO~q~Gb8H}RQ;JiwlFOp{QDEyS{ZT#fOKMA|X`Q$V5397FPmPcf8BIbu^^Er{>!5h6eH0tXqT?do&~d_pG1#DW zhlHBB3YAz4+No1!X7tKKv(ze)xuMQ0;(rUzLigU$?ygt%rDTt|^Kq+k*4*In-qk>3 z_bP;)IHsBJv1pMLZtIqr1<6(QSeBP3!P)t@icW26ri_|Ig<{3{LmXE!agd_z-ybQD zTTq3}p16W9%~}!Pe=v-jRh36<4%|GRn`-7)Q;A~rOqI_s^7p|QmIaQq?u=zB1at~a zwt0=0T}k=j;;H=Ue7?@^xesT93XgrWcdrj;?~j}7-M7EWarWN5x!PfB=Q&*QE}!R% zN8rk_saxH3ClACganq&Hpw`y$iPve)l>wWsUcEI`Mx9P{8XNmT!sIAO2WV$D#J(z8x zsVIzQSKqr}!hWVMB_?%kiyAAB*&8Uo%RwKPD4E00m&b;L2s28)2l@*#?`7rGCFh3$ zAYa?Vllc|St6TTuQFYCpG3{LfHzu!C>3wc&pWvI6H4?qukO9Y(FIe~PZZ%|d%j`5X zU5Q^gW@7i~Gi)~3p^LOlVdiBN9ppb8C|=VBA1ch5G2QG~H2c7*vO&sWezB1#d*{Xa z0~@YXYhtKu{(HZ~>Uh`2<;wq2e~NJY^`5*P?!Bjf(n|uzWPfrO0lEwZZm&t{cKz@p zX1x5h(RS^-dw!H%#nhex6hidp*8{kqJ{F6Q03?9M~b1w zvGT-($8_M5qvxTFii`L+mA5yn*7DjH^#jt{*Zi2|)R!H2LF$Vk-%^)}&Za+9y)TA) zINNkC4qW`)^dVg%bowQ(_j;2siX3>B>&_N=m~t!f%pvOy6Z)NJ=YKxi@2>v$?+i=G zSA}V14#c!cHK!@520u|{c~DW-$7tyHVSr)GL)V!;C}yx*Y2IZ-ky9jsnfFAp1ZO zW3>~EyhYRq!VFe>(bsJWV&F7B2S11S@TnNDpUp8uBAP|IaS&?AKEE8@#s0W3Ex=G< zLNC6xD#?%X80)9QzBCK5A+n+{#CoKNB}EJQB+Z{yj~BrHBx0KbuQGMRVo(ynJ{4m^ zv=VjX_+Ho2C?=K{GbyxxOrDSp;voS!l@Q}aZ-y^$r7S-cF$|S9um@+o7+C!5Ak6#U zjk&umy7nzWwI%P*e4aHXO1nlXz4B3MxPHf5pI7Gp57hQtFkOf6bK9av_W7S9wsqdB zuvlN_R;~c`c3t}wlqBR9a`no;dnkOwCycvlLJ>X1!JQpgjgr(0R#b=IB5fJ1}pOg5HFG?jM2>L)^Y9cW`Y>i&jszYrDt@Y+65 z8gg2Ff8C}2-o1^;@V6{?x<>D!qKH(4$bjBXa;}Wa0yRm`Dlx!caMYuCer4ajeAe#M zQ<~9Y>6gaD($7JBzl{7k)Sm_1Ha~RH{IH5oX$s$I>EC#A{=tVzZq*@_lbc7hh1`pNiW}q1XURDtgp5r}!*U;!2W^rDRC%DNdYaR6X9_=zHEXGW6CF z)maz(?K262Tb2zVHK$xg!IV$!Hl*Y%N+5x(wxYK5el>CCzPn1f+J_dmP6wA z%s1B3U+yHxgndgN+4pHUn0v`DsDXU`stCnXxKkW?ZWQhO?sv%deIFD1?38BUt(aIY z>zCKJfv_;wH*(KicK)o-wK}*-{4WgLMy#&*Lzcq;+bqP@OL+Q1rZ)eAxDS(~3`hIl zI3fRU&a$2nFLry6WnaAI(P5|2+6w)AwbU5oWxruBQ2; zYH(wpU;4a;*M1}aj#mX)PqLgjRi%K*qG;l%%k3O!la*<^8jR`<$#jfZtnQaf@xE^^ z5QXhA#CQOyL*6H+OBB0?tkcD6LMOaSS&%_sfTP@kc>?Boye(Yl4pCCRn}1FI=KclW^Z=ft?GhJye6xi(4)zSXP4L$bJ5;v$-%VG4x| ztV-$9ZF*y|k%<}qn&VcbWk4;jXvJvFXR=N` zp%?t*K7fR=&0w{?E0Glq>ywuwH?h+m8P@Ar>g19lI)micrDp;9<>3jp3llqd8L@Tb z?PCzZvgbRxy^X1()w#CTS>njLX?r!!%T{j3IuBi5?#rR=Es)CA*lVuNnI8=E_|`-- zWi2a)e>K6Aaydi#v=``{983da>;rd0)wm-YrcjHy8H z&y?vlWetp=2Hokc?<4> zZ)Y{vJ{9;FHwY)jjSp!qlSi>teJd?3t1VM&;SFoFw$~|U3Ehu+2h#eInP+9&h8*V zaFDQ((LW{Vv*-_>fei*7Ogql>>jNfh`JW$oXwZ`kz`w6T_6fYMMg1Je_@0EJq13rw zPZzob@$^}@Z05+ewB=00wZhSYLTM6{>V|nYM z_yy4=b}q`D9{MuS@A0}`VS?BotVKQ88k-$4pLc^bD>xd$R)n}$j{22pjHlcoy*{nT zR5L~2B|;Q)^GOcIpA-tc{bM{p83BnDV|p2YxpuRJ;4s5moT7fk6V;O(^Ap)~J2Byx z7uf|*F?NwJEliF{jAoRCs*y~YFZXUcX?S>DdQ`;yI|g+MjDNVM}b@El^ZYnt<5f>(iBg-`a8mUs-KkWf!|h}D!*(bgjr)* zrrJkRI1NJj1U%;inC7r)|Ie5MMe*J~7Vql&ny)@}=*Uo;vv7-gxyO>L=nFcfI-_z~dv^)gPHa zWriNf@P6-iP-P>NRnJ5@1pJroWJHC@-_VKYf1O}>um&LdSw&LH(<1n7d0YsfD{f7l zOlf*#f5Uaj<+h#AyS0J6;lSJW)M*U+p}hli<~w3$K(e-@jnL_-ab6lrN^zM(OSiD4 zP2`zv&}W72Ti+9$d-(S)meX3eQ)O3gL95?HqhX|}*jVczxPSS|`Q-_I|T z9%cE=D<}j%*eoXw!6s{I|8LD1y6YVHsE3aXv^E7pZzFWu7$gylKmGZ;9$E61JF^@P zpOiPaOgl#c<9)E3m1aFX@0d6 zKd{?h=#t%wK^+k^7iHg7j@|leALY2R=?OiAqUN&;2~gC&z<;ip+~1%8FQ=MY3|M+1 zklhcKk@n&9B8Csp!T;*NTl%#>Gbuop3j1fkA7fBsy+qR*Ts=vKJG1s>#~SL(4Aope zawRLA0Cqo|FgF92*D)rAuQ5PDkmb0hcdYhZLNH?7_53SC>>HR z?4G{s%X?dqwyw%2V$t8lrTORPW~@Cf@V)2cJ{+4)ez`2=A9LY+Vc>dmw7G+I2f9)1#;K_7gd(C=k{976bbbA7fpL;VKBJPiV_-3Fg~E^&1(b;bMCDI@;`s5`iB zTPo=Vb*{hq=QIAyWn#zuKi(}-^R1Bgs85IH4yUp>`;YT4N0-xFMW7h*1%+VMK(PbO zlTU#U+CM1yMZeuvi`f=R7yV%WI}TSU61yF5X0)v%E+Km!;HdiY{YlkLgD9^Z#>YMz zRO`Zo2V;fTDz(mqWnw-hL;|uP_qMh0-Lbz|e(*M?MnuPRNn{T1bxhhAVXnbM3<71L zJcNnk&wA#s9eMDetN*qW@I>}K%NKf+TtW7>XHKrNCWvON`}9@hK$1vt5<;A@=^r_~ zd7=~JqlWgmrtfndCN9bh zo3f`Y|EpO`eN$fssru;fzjpOc)qA9DH&x~=RTjsLbJ-Z#@Mi;{8^tQdt}`|)RY0CG zFf?4Y!0Yks1dNG_*$FC#4A@vOy?*zgoI%Ebs7k4j>*rr4|2n%aUq_B~T6=sE0bMTt zv9WYmkr95hYF+x(dJ1}dtoWKiSSlO4!bQGhq6mOHvFS3&`YIirPx4|3=u9Vhbkcn- zzH`C!k#DZtjN4>)t-W5q&iXNLX?a(e$K(3>_Xqk%52p`jOK_V@xEA>mkRHj(Yk)@Y1i z9jKh0*%aer<;0b$k0<50TG$?}4qHJD`AS~5Z~ibfWp`Y$Z{5y6Tvg!)xP{o1L#siK za&6sROEvHMd~`T3tgDRISyk$>kC7ml(Z$2b>lOnI6-;O5xuxzHC&6 zew7=hnwH*{tL#hJ(q#01eWSSFhTio15?U>&QTIc+P6c1kI$aK0*B5cJ|F+=Do07f= zHRQse{LaYzoA#fNo0l|{Qv&R^DBwM3Jl9aplENwVBt7f!8(?+5;`WJ6=SV1lV3+(JTt1XoT zlxgPd=0oMf7BbzIZ*$&yd1iB&p8q>$QgbwkFlUblcjq@uG9J#d6)dWswc&9O%hk5J zEoNtMQ+#Pj?EV>uoO>e;oh(xkn`f_ji-fnZD2RM?-iTf0S?W0{o7}LEd-vpqVNe9w(YHQmH(G0x3K*2Dd`5Zd+aN`1cxJV*z=z&M8VWSi z7&X?PQ~!+sz<1OE??PW!vp(`^cm|6GVJ(>kF7cIXqxb@NM#)hhg*D`EeQSAJ7B!ML zFcGz(NHw`%4Pf8s{yy^adhbVQ;;rtTbhR?IAsJ9bG@5U(oOjW-3qQy+k}WKaDo}** zaNKfG7{U3Ni460_Xb+CcpT9b_OotbhLXDpI^sr9yGI%Xy#NV@hYW>rpg23)vSV=`( z9~RpQP%w{}XYL=%*)h2+MbuXhOTHLtOUhbV#%bw%_bjp&)c0AGjHy~wk7y50b4W5n zn@IZoEgED0>7{bPBPaJrTNSWZbj{7j956~Oj{o-aa@n0#soK2Pn&BIdLwcAz5{qEZ zo<7pwq{%hEVl>ips_H2PP2YJ{%v2Ld5h2&GpG^Xu7wq z6)~0oQWB#Ti;jeY@}Pb%FZH>m zOHLM^cEcRhJ(|Jytt0oHCz!&YH*ri)X)BcFP#~174k!ZM)jwE%lZ=@#1H?WruVzl- zVRCv;O*B7iPH{b0(2QChq^?wuVntoJQHxnN`f?#Pr!fUt##_gd z74Zn|eOt9+?aFlZ=ZcR$nOG&x*%B_kuD1yF%j4yC@x8b-uyiSCMuVBW0UjM2rZ1=n z?FyT^f<4IL=gZ=c?RuEp4qGv|)?)yGnL=Z>=Kg$OoecS=>d##O3-260!PVu>+I}bt>P6Ml}HZ~Y1il> z`fc7>tUpO3nhP6)5hwW6Z|eJ(6MqjWN~)0f@%uLSCG9jEcF@^@PkcBwDB)CWy6Z65 zUbx_#SGJI-+`H!~#158j$o19VWn2!4Kr(SOLHTJ`xd!= z_4>aJj#C~SgbPUVGN~iJZnPYt;wzIY#)>hYm(j;R75tMMg%z`{Aa8DDb{g$qIizY0 zm7gjKKBWfmCXL~Kli@bX6>{MoNq6Jyb8rqGOinZ7xh{&v*g`BM$dQ-Da3_}ez@z8- zXA$t%+1WEiQa_VS48ufo8n{Ubbv0a9@;yDCr;nEGZ#tx+la)}EPXP-Q)+=4Wrj(s0 zLap!bPrjGzv#qgq7*f1n$xwDW#0=q~igOKFt2Hx7yKpuDmiPY~XaNfLUSPpC2m3A^ z!P|PcVI}z1tT!fLTbz8vU`wf$iNwzQ%VZ!qoXQN?DBV%7Rl4D4e+Smvd-;Hcxn1f_ z6e9%_dgP;=Aj92@)sVAqvJUSpMMdmEuXWG)YJTC9l^+(xxHWao&^T~fi3-kM@40ll z4|!5dg3Z})&zHQ9H9E)N%#@*mS4`_l`)8T@DeOY4F5etTF|ta;yOsgl!fZq$p06s!4YDiJ zti2_l(B$+@MHDNT*d4<8xts79hq*S^+~L4h9vY+!0B3Jkr-EVlm(FIJQ8{anhZ}1B zz_YKBwq$-n`V#n`PXcowm4zjNrm1E5LA8efL>1;_WtbJB)#cRsW;3{7bA%{We6b@V zDZzJ+D1C|&j5qdDnaXwqpl2!?ONt}R`IMLUUfw478Q7On8rHx)3v!=C`KI(%;9bM8SJMoy1zV%7XD=1YgBUf;kq7M^o<&^D&Ec9S@i_~ zM?kp0%+ENz=AM#Qh=~OP)vBJtd$_k@Qk7e+=OtC1vK7x|282BD7haM)KVSfOSS~gF z%cSIA>9p*p1r}w8RRQ85FQ=J_v$s6?AK+gyoNXjrIi>Ipgb#3OvPQymFC-l;#qEcF zg|nPi2;Tn1?uc0|(2E@a-RHT#f02GG3am-}^$!d`Gyigh@c8$M+h5p)^6r>`UqDxH z^^`%LbaWvVsQQ2z(8ZcyF7N@L`lrM$1bJRVyD%!4b?&*l@PLrN#e*mpRO^fJ?-TG< zp41>(-#MUZ5P*mw3O4{;a#^tZwDdSCr8kqQM2hQygT0jFk_U}?i<&KY$R=(3h@pvV zsX8ONZ*pl^XQ*!@K5#w-$*uP25%U9^U~ebAJ|k#ajINO$)EshtaeS^7$5;MgpPhCZUO(fGEe?dcaOUz-0&*hn_Z6Am#x& zWmIaexIX0`La-~-y1(2)=Gn>-4+={p_UjQ}x_F+JV$U^_-vmhU{hqN`6i!TT9~}l^RPfS-q*J6`ut*z+h43oOrK)l_`&^-_x#orIZKL=Z6Q98CWy(3 z>0Usz)7ZDQg-$4PcpV`;NC_b#%vVW|8+byPkU!BC!h<=_fY{$a&NFwRc8tA8HSRY} z=+&l>7TG~@(BYpp?-1>WpbN)_w&u{_x7juBp%_8P0DOTJkc#H|;?12)NuSnDR#>#+ z+_hQpaL46&aMchocIs!9g0WNuDiz-tbDr-A@95Lr)?^D^2k=GV_!?t0+b5!8VXnW{ z=kgMYlSU+yh@Tu*`cp+)0Xj#dawsOFG|SXK-H^Hc$t?_@foPp z{~@FYu_pMI5O0H?qZUX)(JWr8jzgJKMqDRl8bgHa1-FgGVUsf*WT1A0w-?7hd>pq;GA}U+0d!=QJlOZ$@4%S9svz&{V9?ca0GOfxkLl64MG>^?CBbe# z+Dgt_h=(T@C?t}t??|ZT;<;}1z)v8mE-_s)=?6_HQPQcVj$w@8j49QcSrgTw3XSav zQ42E`v;5oReF_J_%fN59sT(&T>{6l>$2uKvonvy`YaLsc!+#sz94hp2gy zR9AqB>exU;egWqlOS3R9#v3DCrxYS2{ZbZ3W4<=1kO12IXr>L)Xkq6!;Wvj#DxJ6s z{oA+Z@)Pm`Dk$q-iPhncT6Uy5w{=p)_M+R_KDUEtrsOy$y7A$Wv1A}cw$u+|>jyk_rdcX$PUR@2~`WCl$D=X!&qg$M5$5FPkBq-tO6hPKdD_3_bK zKeUtqp_9~I_)Voo4)g(B7@gbdk?S+kRz;iiZdCM1K>Lx!Z2^UR*3Do)>THWF%cwEX&6*7w?X<2`-`uA ztmt3eDTwy3wN@U~wm+PoLuk(sw7mUmUajVhMRWcg;4l225z}BdXs%V6t2$+?Ta>l1 z1+}OcrK+5dn@`)d*Gzh<+O?yF=+E{!DP%=mfS9EMqRwgpAgUarCIf_Xk`(F1Mw5B$`h+Cn*Em4 zzK7;sjOefcP{(4bV{6iG9q5*zIWveSmpjG@{NZEE)8=g~WoV=q9nr0So;sGik}CV_ zI6VQM-i-<-e0{C|Vz_5~UQ+Mzu+2>`5D?c@WcWumF;V1YnjV#k_A_aN_HG-qlH zCsmu*8HfRt<*vucXjT|I5Y)RUHwy_u;Z)(wBc8UP{jwlRdIK^y2-6pYO$qpXha!bH z&Ofl@ucm;;sB|uGj4dFsr$GvEASer0n@I<4XeWZUuK9~AA;HPJ(rFf3W**h41AAc7 zbN^)?v2KAj0pgv$!P&+bPEuYGp{S(dby1k!*~nr+>f7bn|>`RCH7wr@N zIj>DdKfpqh+!$HTESeV`0}*Oa5{Om|Uw(2h%w9_4VT$2I#F%6p@uC46;{WS@yG$Vn zUPwb_5}0!bG{?w-&a|r~Up{TMz&Bc~P#s8t0b!n2(AmHsG?q<8v711bA-W+k|Cr&1egPoCIU2w}p_p0!Uq`I^b@5 zYg)%T@X}Rg&v~Q@^(8Y}63RQ?U_AL(k_LB1< zScMzHtf$Qrr?(y>+o#PQ3sM^!;CG0IYU*%15Rker5TEJ-#6ocA(ePXfBQ}hEa$E1` zQ(dJN_CNdlItrZZbq9(uTOr?WoD-y~oa-i{L1SQa6d7s+!ju9r%OH#c0K?O&xCTLZ9p~JoXl+om*8jY; z34i!g?UTuYnb>=FhiLJQRpB)~?!GVa1%E6{db|HS8tDCE|MPB##_bOLWd5R68-Yp5 zpO(i&5m%=UQ?dr%ZF#Cr|F;1vaQi^shCP(ApMCcgYLHRVdN4WC_t$M>dLSal?$NJI zvOFFS3IFrvIHs9tN)1&zW;>$x%Tu?|HBeeV-3-E5u&UD+%FsLPT#9tD)h}|1y`N9v zL{n>ie`_t1KzwO>K>3`u5|S?+);4>tw0EI{CeeSI{~5MS{8m zMGMdo_xxX6TR6q}w9W9(|IFXUH^hwYB=T6@UJ8H?qkKL82j8I36S}n4TRwP3ZaIR` z4m#W%eOzPUuaAQs%4;UP2>%>OrvL2ii3!&bP)rY?^=TNIo2|R`jO>!Bd0c1kGi`M| z&SvHMK60$&*ZSn7bFWX`)_`mAbGU%W9-(fc(-DSbrDp*hUrcs!?;{qZID!n zy&7Ya0+H!~g&XJjGQFiq%+FYtYX zIgS`lYu*sL9KSwk_I3 zsPk0O)t{ujnEG|bVp0m5cThNY-*^GMoXUaz{#o|+r>%0+NXjm>n1zL61OhIcQEI6x$fn(HikbIZpHSdUq!YO-aDni^;4iN2E@W+to? z0VYzM#jWM>&0>j@a=nldYywaCm~eXX2S3p*&1|De88Xq5kzfKgbPxY z&sWFHqlk1s#!jQ9B@O(z&7((`rDX?=1qJF{UO!G5XhKhan1-GOo!G~}%UK>1EQeNwY--S7 zeSjIjW$FQj0*76-qvm9!yAeqG~qwc2s4z5nPi@&EA zcI%1NLVx0$ zjG~?P1v7;_lQ`F}SyPNQ_=U;^JMW^u+>Q^L@?=`u5%iCJ9GPAvW-+qhWvcr5#zu=@ zMP5GdO!Ktpiq>)FtBjeawRe7xRVoQ{A*RTLCtCyJ?q&QgV+O#x#f69QVYk}MZO#9$|pv^k+B%59{RQn@gz<~wR-duoF$9i=EDQ-WkX&i^*nl0TF zjrb+V-!piuHWOd(_ECzHxcQY+hDkU_EJ50~9K~5jz_2Md@2!(4?7zukWiu@Q!byUi z-Lx~gPJTLh1C~#s!nKG=qHMBBt}~-}Gi+jiEI43urkLxcL6t~RTA;Cid^QJ2yz|kt z$u&hI9kzk$t_Z0h_ntL^&M{7j6%2Yc_Mw!^D$QXb2__|_Z(8SO%rdfnN8C*~^BNbh7*o3Wj4ayr0H(ehSx9?ti z_eD?q0&2wIGUWdN2|)J0h(kDrM?Auqz%YLJ12cyC2SzZX55|1JF_p)RVcY`_l3 z2*)vC00TS3;e|4&fIta4P=XaqW_VBlTyBY<3EJu!*WgQDHkckD5a67Wc%LaaXq(yy zF$OmP0bcL|0uSykRQb^Y3uP$K=~Yt~Fzka2sOQoaE(d2nY+uKO#vv{LM4>JgOA$BL zv5t*d;sg4y#D+AM9`_vL0c8MYj_$Fe9>E|;Uf^06m4u|OE~ymFU>lVd@-~IAB5hlm z+gc9-3^#yjjt?<|FU+ur8k8g!H7G@$PGTp&rUVg)6l|XoX}Lw}L~@inN>s+-C`dXs zl=;Y%=t7w(Ol3-S-%y<=Go=P*cp#a>ID`;XYAO@XP645i2Yz&SsuXhU14dwC1%?@i zX(1DO!bGMsb!*H&EarF|_yh8eC(OlAVKLh{mLI4)812D|P4Etc)YR**udNYKXbh*(61<22L zbIAsHK&1sBw6nZ8!`T5m&`wF9(}(JbQ9OIvz-vU|7p8cR2Q$bWJjnFEeXv%2n;Qoz z#DN(o9!53iOG7Js00;n5>BjssG%ZYUg1rMlhSbvq_r^Fq?Ql;Q@Q}bE4bC=y;VW&30@MOVd68tPA{UpMH+&09#Z*w|;m4 zF*$&lX@z*E7Kn`sQ)u^Tc_u3EkVSM6K2@8Cn-yr7?e#{932cUDEJ@#=I4w1}o zIKM24QAa6Z@;0Xc-+5W%;c4QNJ zM2m8+Yjz<7CV^|lsOP{ctiVdF$cU`U2oT`^Mj*~cjj)6S7Xk%S@JX)3N~R>4E>ED3cktIr1Q9`ZpAct!2*0q*|H z88oZyuFx4YF9Cdo0PbVpJfOVr;NSjhEw14XWC1^fAO=i92)1Ag3Xl!gfgU~$0Tj;z zL<&D}126Dk_cm|1W(|3g%MWm^Fajf3)Zlmo!vqH7MuO=^a!sljW5r;I0kiJ`dT+QY zFB63;xO7eTSZ((jQTLWl`EDdf0z(aI512&p{%UWSn#Z>Cz_zG>0gX=-b&UaY@A5K{ z0VPh_km=X(z-K^3K;r3^JSZ&M!3wVb>-WlF12$kDe8m}cWdo3G_GWLmYQ!1=qYP~1 z_G+;aukjCND)sP){A z1JHmHjDYdbAc^<`g17+yOkuc+i`4>=GZL{7SyC_(@kTUn)^P23a1Hl75sP#W7^{gH zkS7~4QJ8+qE!#5pYR&ipWA<#3ZT4=h^9oTfuTc$VuNtuk8lABk@4@~y07vYPF6lB@ z8nH0yG8eNkx}Jb{!XlpDC!SWu+Gvp)?}0N3voo=XGsB@9k*pgFqt>hlYjPxO!XZd@ zfk%+67a6cL!=dJyK}c*xw=#ukER&Y5{a7xw& z=@cA+?E~1`@wN=0pShGdeP zn}>i>e3(BlQIv6TabIb$yTX-ohlH7@VOCJ`*UUOoh`xJrY=eX5wy8{8b#GK*(WRG= zwz4)tL$S%wOLBA4_4)7h_=K~%8#O?+nWBvnBs<58o?l8>Jv~rynx;o+x+6JwzkH3N#KY~Vn>$rs zpt!+vKsIt`Tc~VepH)$QeTgkRc{NLybZCcGg^@&3o-9X|!RPG0#lmEU%HG-1hMLOo z+T?&#VWG3Lzsk^*p45SJkQE(6lYDuVe2z+EYv9JkpRK)bl$&CCn&S2P-rM5f$=Vtw zK1ybFwQPM}dcL-YjBcj7u&b?niNe;BrSI(VvAo#Lr>jYHe}cHiu${YBYqR0H*MMhZ$cKruHc9Uju> z@877cveVrb4IQM!&F!qG2>$@_9HU2I%(*PMp6 z<~6)zZ{BV@^X=KefB%0iynJoqjd zTv*~&rImMWxmOqHjL}73V-9xMU-TIE*qUrQ)|X(EQMN^#naz0{XT9~-nR=ZCN7`<$ z1uE#Ega(S9pnqWIKxKP+0qAgsQgK>ku=%!HYEIN3sivxJn&%%>DAo=G&sk>-bk?P+ zop#tIx2kyFh5x6VcCqmW=%a`x`o*a7G2n%-?$Jku4F|=dkUR}Nq-;Y14$}e>2XfQ| zfFVgJl1UGS)1XP0(8xt78^+jSO@q+HQ?({a0gEG}*x<(o{>*gAB~Q>>lRsQYg@-Uu z0C`LnzFb8lJU(J2PDY%$3n>S!IJ==ETf0)5+OrK6n=NXucg<=+TAV>KbidIMH-v zO}FM~XjAJpHENmGkTuq?5kRP?nKFv0VpMRK+;zUTCtcdiwHmA0*}b|dcG!hi>u#%g!W62IRb^{O*-W@jb#_OEh$0{jS(BI?t}Qz5al{(8F#m=i z4sk!qLSjT9vP4oK0W49p7D+B)h9{gvTbrXIG@8%^n263MrQ^rx^Z|JZ*+Fhz6M?KG%w>LMHWa#WRHOP%+1lw& z?xgdDrBa~+9auCO7Rpmi`+{`<=brZHlOE@w2Rzo$f@ASVBK{F5N}d3%AOCTIB*XaV zFfNe_1?2>y6v^!qNI_9J)Dpp~yq4*~Aq!RYRI~I^(nk>y=io!s`5U_AKhhV`W0pbruu;7jvKoJR;%VJ1&yM{K1qyHpWJc&4n+k~0S zL`M857wSNw52ujA59b)gG4Oz0Vax!$|H{I5!|PJ+LeXEoC>W8BgcX}I48Dq7m?AM& zJ-K)cV_fP2mhemJ{rY!Is1`6i9FV3^dUAXsJ8-O_+Okx}EWxML*;O4phV%7UgCvVz zSVxoAKb%!G`-4;i1NetmS&cXy4sks378)w(5;INH8>FZhFZ&yH2-btIKkP8E(Ba^p0hGA@C@`a1^D2Csr;#W*n z64UooowBL+Wikg2J5*!M>-RAx*HsDAUB#wDZ#e^oM21%P3<7`tXlZPH^^1%T$08g3^uM3Zd$V{8Ct zC@BVd+Ez5Cry6o&R-ED+6ND*5Lm3woZiK;24&Xs3h+~WLV}#K(i*kY<#1`EE0_@NY z>`;T0*A0Kb0Pw^r-=TTm(H;6mC~@UWw4pR;MKwuiY)g|TUZ73vL2x+4E2M%47cc~A zFa(ZZ2DFDPu+<;A*DS*j0Wu&C!AChBb#iOq1VfN5*b-b+GyrKp3eNX@EO%#5zy+O< z1qSdHyrXD1w`hs>Qha0}d?aa)MtgQi>Q^M~g%G@?-&|I;*_5L)DRK-h$W9>hT<*m%h3G&1%9M34uQM}w2s4c&kSATWb8 zScCB9Lgyre!_*yd^-dOOcS#ds4a7e{vnQO;1)MNiztSFolW>k841VAUw6`A7RPgw_5YXiF?xHqcbs=A0OXXL z)Jp#603;KQHHJ-219%t|4{Y%P+emrrUwnscdtnKe`c1LE|TL$4WxhdLr-~?H~+mfCM+^2Nxg?T_#&6F>*OEa#0Wg zX1H7q5+P&e2!DVd!G%R8rw>ms1r=2jPQecYzy(c^g%`(CP#}`uC6XigbA;%9g{YDn zL0;z9h>CP1H`y>XscDjw2cgC#^Z)mge({s^r&Iz)itE-%egSp}mKbVhKv^Z9uJn{J zW1m|k8UEL64yctwLwCnEcR}NCPWCE@ay4gpH)!c7v@%yzpm&A09&rgKU;>JwhD{+u zjf?>odI^~9FatN(mmxZ$f(Zg>FrqhTdEq3QkCj5tF-!y`LsvsgXo)|?u?7F>8Jy`q zHLwNfzzGD`dLi^HUN8fGkY!oc2LGgc{!tObAO%ngr8$8GW|)v@h+7fh2=U+x$M;(% zmlIJS4oz?iZ}b%Tl5hclMLom>%V2-BxzQAlO6 zUNs3ZPy&B<@jYFKGKN8(KmR!|wx;hInCnj<%I|6zs*`B4m#6R=6!ls;B^_btywK zDf3i^F@OmOpPlMp2>&>rID2dJSu+W?U|S$E{ntJuHne-vqhqxvpK)xz2x6%bmbR#Y z=@D(K!L8^48o%Kxs&r!}XeD4W7^(C$+{B^d_@U4Wts+W;%8H^NTCD7FqR(mpY`_ke zS16B}tpn6q`J-0*6M?xXkHfK<^COS*^P^N|aH_`uAdm$!kYy&I0+;Zl^ZKOWK(F=s zTd+W-O>sKfQaQuWuTtU;BSIpSQ;}(a1bDCm!EkW_u$;Uj4G{aL-xa6ab&`VUQg*5Y zdW5^vDQSpUBr=&(fEv6YJ2CVX4|9>I25}f^A~I&;Ut#jHl+k#cWHO)BV?G<7H-oeJ z>6ANLYfiafk^do-+53Q~YHdQZs%fQ!H1xE=Xd1v+SLv}?tWmUy(u^n=Yt9HYJSME# zNO{K!w`^dxDLSHq8JHtlwq(l=&l=3VtCAQ|bVhPK#)B3i`+jnflaJcGC`+E@ z2^f#MbvGL|WHM`xp=&eylsAijSJl0nYN@AG82u+UuT&hT>aBeXZJkkiRzq#7;REj* z!7(OpE2(4_83T7+7Bzl83SeVE9mp6E&Kn%H5Wy-LCt#(ib~L^WhTrERe_-xp@El&`Ak)b zsj&#hGLwKUb2AiuYjb>+xCX}n2#P|>m3>Tir7EDZ8c+Abt+c!vIhu>HG_)S)gi(}Mt$*I5wZO{g(@Bq+C%45r{A?l&1Y^=uWm&FRVW&6}YZFzVn%h~a* z>^QCAsvRpmR*tgL0JlFct;?qI%d*6u^Rr1GFb2|bDuwGD5gEBK9L+iL3u>YRPqw^A$hx;ppHIp=eaCSHhG&-Z-K=QkEi^09%M zFm2IDBzwFe!-)iqGNTui=gUzmI$hqpD{o46C55)8NoJVVJm9Aiden+LBG<_=>I^2 znVbsZ{QyB7zysW@1`MLe%B)Bom@^Q{Lk++I9KdU!%B`$~RP6=#gAawQ)q_XDarei6 zD|g`PKm7yD(ak?j^CwbO%;#zh=jtmXN7t2Wa`Xzh(d?S~fCaE{kRs9(I^hp^un~Bm z0;TJwc!UI|X_|O+nu*<}i=Eg_yj|nmeHaTQTT#U_)w}i_78`+dHQ98{b9BT@7l?|o zNIu4#C^C347#}bLNN@)4AOkHh3$xGyv2X?tFazE20Uv}_nz1wQnN>DhpWcfzyPYW2 z1gbzQs$tEQNjpms%!HgZH6unGh-{0V@k+?FO*STKagmo^PM4~Y7#2eqlK=AEtS#P1 z(9=(?wkWFJ&w9$2Y|8%|-)xZSn$8A|o(gTi4y;PmTy3M^dbFcKVLmV?FHPY0XjBF8>quevPzXQ<_Q>r zanK@@T7yB*8{`W}P!G581hZg75wHNa@Y*1NzjthaHCt6XYpJnFsTAe})6|N1+?IPz z+(t{k`eVLI+k~t!!G!nRpW%X=Bx=;d7LN2t;8q$gsx`u@U)Q9-Pyb!EAgZ=C|F%l~ z-Z=lP3Vi8o@V}eR>6wfNKMm@?(dzy^c!qMBmU)Xm)9R?oK)U?WF%!5o5KC9TjL>Zv zQdN(6zzL&L1`u9wYwZPf4b2uV*JvM`uplC*0}I2I1~ccTP!Irkkfs5!19qPR(th`N zV4A1t;xI1bh@Gx-`iI>&?m$w0JmupkjgcW-jE*Y#{bINKacb9t<;+C{hE#h zoZje2@Blw;0u~St#xZ*LlVStv$CnB9P#?H~o6AE(^;ZuNf4(^3RIuQmf@2&wLCEP# z!7iJ|cq!vWghgW&MHrJZ%wxx4AVGR0=~3RWlf(4E!UD^sIDg=R`GHc?PXHu4cHn7+ zCqN1$I0Fb1>gOgDqcoM)oRI}e7N^IuNImwH>QxZOvidrv#Mf7_z6|6s;46<=vt`eY zO`B(w*|Q(=xScyH&j(*0KG+@gfu3J_f$5DoH)hOW!-)?Q9uv>7>D$>!5k4PFRq>@NV$)hOr z5obw${0RjdpOOlICp_@jDS%dXK%$i`g$Zh?q?R(OrY!uB2C6f!vMMUA+C1h>ui{Kg zth2xxt1Pt8dJC_(=yEHsx#j}2uTi=v)HcB$TmNh@Mi-myFv$)JY&Iv(>8ys$$}6q3 z7hU@dw$D68ZPe93164KCJbR2D?q1xjI9UJKFhu2Cgw?y;NLWVOn-TxC{in`jU&C_uk_cGjA`;kK6j(<2Ky?+{=%R83b(C zzyy(4@Bus)G@%VL>S4nHXF0SGyyJZPO<)Oq;4MN~f7^nSWI5@AMcsTDQ8~~CD#+qL zlFhhPj!QgtB8_&mh$0cB=*Z+CPbTt6luCl7NiL=sqLW~%3?Klcro4H|om%m^K%cz4 zIZUK%DpQ)Kp334(D6*RBDmTH}$``Nl6#uKOugE&^49Ofh;aW&5zg7^O$k&f>vz(;8R{6*W*tC6%FpM(fm6!#jg*HBe`ZXKmbwW2iWL zI-D?9-EghJJMUa{z}M-Fl}oR?uG0%0bhz_wS!TUJ2-?c5wRS#sOqtd%u|ELez53YE z&p$u%^Y1=W)cx<={{pliz%>$V!$1b_HDP)(rmv?SB)R}Nx87X85IGLF$W8o)PBgza zgbYi_2Zj=I(Q^_B8d3g*42!M{?q(d(SWZUXv00IML1iaVnMh31vX(^wCR|7Z&4RH5 zo@vP_JqW-}ZX%7FQAuY+Spyz~5&x#7NP{LiNRv~t;xwvEYg%tQ23NX5wXfXC7jKzU z4D|$;J>BIlb{QLA0#z5Z5u%GiBBeA1 zM$ce0j9WxiYR2G2kfw^Gu@RgT8uvKPjHWoaO67zWR*=vnt2y@rR_@kAgw)Nba1wIe zKz@aeZcyt##|tC~Y{!mn$me!{5!-zl*+@t(vRmqEm++3ayi2Yj6-Z!1DmLlK=~2%F z*E7QzzVU#Gs8X%$%as!%IjYoo4~=SJiWxt--3`Dh+7l$+1x z0R%}!1M>XSUvSYbkV$0+8bELtdH`xaPz|01g4ba8KzOMBSwnv+S>aR=XscW8q$e8` zO6$3!9;Ez68~8Oj;^4|e2YHcgP(V9;y_57Y@~r>spZYg2>LC@oT$CY3WS%_wDJZEK|>PpGuX z7x!#oSaLf|kKGOW44+fDVGE0}HdE!WF*chM^a|u$tfu*Sp>s%&>uPl$ah7 zI`ws5{|8(vDMm$wn@7# z;Sx{ag8vG#31w||Lg7}fvQF?&Gb`1sCqDDZ&`irh*D`HsP6=~W(mYQT#OZu_G`VRlfTiQe#ZE7*e3G8uK*Ugb<;%PFccVyZ=_)eQOPq1W5VHR_4i-t<;JsQJhO$GVKhw%-W|&gDX(k_{XVFmDtwvD{V&0oxH}+It{eW zdA1AL$aYXb?WN{{hWbM%iWrF=F&=fBO?Zbs#gGo2(L(PosR-~a*a*7Pn6B9P1M=w% zMG2iyvpUhqgI_@nXYqp0fFq&u9pBkIbMcQ0j5Q9lH9H6-5PUmR$bwkIme>J-HMjtF zX|M+awiN^(3#hPS`#Wa~yserSXfuHa7^`}42ga+1Z2N{Y0EQSafjqFh!ATKZB8YNp z6>*cF`7uC+u(uzpLSf1uV{*686Rgz3LeLAlE-(h!E3$r@tSESyP?&;)!?G#c0sn;y zK80Jjg=<6NtCAGBk__^!p4cFw_#o5rgExpijB7J|ny1;~ihRngf1;tVC<_@H1x2I_ zu8A|VF`FEs3&bjvQLqj7qbTY6L`73HlcFxc(J0rbqK?wP(r67Znl#D-4FSX`0<@Gz zIgDTt79Bzx>3BL5v5@h|8|t8zKmxFCA(wBFk8m-U%dj=f7(rPhLHno{_Q)p?U;{i@ zgBBdN;NdEEu`vJeI}Aet4im>`s~739mmX}qGdKgr`-WTi24)C?ATWW#iU;NhmDW%~ zD|(U5vpgHqmBXO7F=7?9;W590w{;6W8&kKw%7cB|k!4XPFNgv}sHOo>f&bvsrr=9} zG~h_!`^Y)?NZ^YyI&4ELX}B%jn;{B6K!Vf~Ar|@yM$D%cIw2)!ld9RLH-j@g zp-G>3ET6??x0s?4chxmAp z12YyCS_2bc7Y7TFc416EAdtUXHfGZ*1Gz>#xWRg%7ZY%Y&2$IP6fwrz0Ct2&U;u_7 zhy{A2A~V93(9oq@@}>G=H^aCQzoG|pP@DELz0iBNVM@KeqNy(E2LJ700M-EyT2O6fopcl%H2db-3=B3e|G>8eVnGsRQ%6jb3Z z25q#k{DYvQ0tp=tDrk&JiHtxS1?0-QOF<4)nkBiQ7ID!)x|}u4Fc)QvMsLx}S<_3p zw2uQjLBzy^2&+3Jc$aQ`%ywxW4XeS!s}}|_$IZMR5%WQI1j1WbQf7#O(=)jK^fH5Mi40{<%5k@0{?@MwpRY|iOS zfGM!kk4yt_0LkY}fROBjhHJxZ+Dl8N&mEOALNF%#4hp`!7Fq-lyXyFRd(iuF8; zoovLb$r`nYPvBAlf|A6e%ul%(RfpU}(7TNQML<@azffG&z+oJ}u|KR_&<4dWp<@kn z+rMQoBEiTOF`XO7P${nijm8+!*+Is!qa6TyByyR7;@OWB^`k799ksIq7{%7S%mV)~ zLEX6wJh&Is$~yvi7h&tht|CXm(<)AC14oFS51Ss(+yEbJyvB1!e2oE8I88J70Mcj- z&FfOfATJ*iEFZ(d8k;dH3{!$MQ!!;oh>h5YRRTLe2mdN)mN#t{)`?DzoX$I?PLJG3 zkZn#kOaMBhvO*1jok#&g{TZCN2|o;>nt%f5I~vyNI5b-`+VTqViy=9i#JA{Fuy_lu zak--83-)+9cn}-Ja>!skNX0-vi;6l*kqyr{hhZft2(_ri8N~&KG?Ch=NAp_8DG#VC zOV8*z%2=qo=?n^W9j_}7P*b6?iz>QID!04KyL6=9iAMQQyR_3wYq2%_NTe(%9d;nW zHW&gVSeF^#D##@ebgeLP>?&pBuyFmbVEC{PJJQAzO~-r37`O!|jR6!egFNV)CkhQQ z^066dl~i>YFRZK4+X9JY$TGd%+to!~gjoGz)Bn~P5Ao7kK6&1 zB}qYjpp#5lJV=3wOGyfHNzwX4r8pWi`8e#mzN{F^vEWddD~p#4D7&aLI-847z0cqx z%7YRXn@d<$6|YATFOp)S`uiI&qSc=>uTw0yuzgV1m_l{4I(x&Nzc7}*aEs2E(A=O< z(4Y?eQlV}co(-HG*@;oT?OO|^9TL6P%g{>zP(ZK0XoNA- zDwd8@m5vIS7VWv%j17%eM0hnA= z5IPzW`d&0M#H+~E_AOt4lDVNAs1JY#4wXbj=8LBFlRiT%+c=a@>=dgFVDOS!Q4FuH z{h~{Dx~nug(b(j{nK7}+#nRcty?9F?`Tzom+qA_C6767X2}}?EqigBlTAl$F0%2Lc zjKJ)#6TTKZkURS@fgyO|U@MSvm0S&jmkjHwHt;I2+F^MOO(X^4B^_OTxw?Y#i~Nm;`;4u%IlsK9 zRuxL>YQbd^OjZ%D<+Zz(`EY8frq;w=>cVV5yjZXyFasOq4|aI~9gSRZv|)1Gq;m`_ z&YaiK>_KcZt0e^n(v`;{@Yg}RvE3}DdF!hg(`$IEt9BkDF_q^or~r2s9m6JU!(MEs zE$qUc3kPUZH|;mp0f&Gl-qZsTBRNr?`jH`wEw^<$A! z0-RLOeOg4B3)P}@xkS!ww=fj9P-*`>^Rv4UQ>b%k{k>`8MjWa26j3G(TCKcClU4kE z90ynr9U>IYu#^dwP#EbN5O~aKLF#*+j z%s{&=FtBOq1|15jxu81-bB7YUQ5ufi7^dM2%cKJl(s>U1 zvph^BsMcecZ}Lv+@)qx;Rw43^Zw_w8rxsyrSu^>j@2gH+YRT_g#tUV}wlz=}NX=2m zRc6R_wp2(3O@fyNSL=EGOnRl)brj8SkZZXPf(!TnUwW^__;A|9x5MfyPMk5ru4l(y zY{foohuj2WPw`|w>pB?2rXnj(tNoe8V{qzCq=z%}UASGgNUWiaJhh zJ(g70%4jHG&pNX+q|}o_F4{YDiwfY-darkS*u?wXlR+^Xv>A*k3Y=ENzb{&i#0W3u zrmg@!x<+%i$*}WW%$EPaUi}d@ohBge?$&NnNg%LRWP2zTh>}uR%=vha{uW0($hNOup2nPE8WxbkQ&(|(9(av5&UEX~b?ec@ zw$PP4Po%MPRt(zQ>%O8lRek47EbMt^$Y8I4O*oc!MscfKalJ5Xhs*<(>*8e*UTFu9 zf4fPDG@c954gaK{&J zBytrtvPOaq(kcbVL9|AC2LH?=n+@@=SsArk_@RdiW{oM_Lv?S)?7y0;MU`V@i%mRg%Zo z)jaU>eqx^$7&sGfb1x(71E9xwRY5pJRj2Lp-Z-I7kc!@IN9Rluiw9b1qT-F ze1foEx*3UY9N(&}HuYA#*{^dgJNk8yRst(s8+h@YNawJ9e;R z`-+zb#4&bA*31Cm+qdlBu3h^c{`zhU^s9Xh& z5sztz{pDz2jy^i6V3D2U1Yd?7HW*}^`nA}FaTQchp`v2;fnJqDgc>~s`Qlo2%K5^M zoFMe(%LmNuHUoCG2FF}C%=va3bg~v#?03#N=SxGeL18Ox>^wVLcHL1+9d{PU7G8m* zkg^6l@%do^eCVME9~(Nb!NwZxw#%S@Ysj~of(_amfPC!9Hv@I;#iqjydGN(qh+TY$ z8HJ>Y*x9L|iTGJ(d9;|Ki8bc2Nr`dUXyZUKO8oIaVl^TcCqLFOBt;h?xspg4ndJXu zltZxel1o&=BvVW>)wEMiT@poRPyrlu6clMfp;Velwb>LDODo~aR9W5iRb6%Zi6>XS z*rjJ(ZLu|ITxsPxHm-G{s;Q=uLW(w}lO^`YrI89&nZm1m076_KBpO;g=r|D%ri!&n zTx{4`N1So31;;P0AILdFyS*J(>#@e&hPbiE9!u=9oxg?^aXM20+j%$Is>#Ca`8|2En?(Oci2OHtP$(F?o0P8Sr9+-+qPlp$N zIO1HNg~l+$2vOW|$6e6aB0@3}bWn-{CFHUBA1G157+(BAMMOkaBvBfj8reMv*B`ZK`dPLQG*)b(qC422+6h3!_K_8o9_wRD0{8Wd1OQ z)yM@n?BJJmGS{40vBNdFvegXsBO7694q40j;^wY$x3~oBIKe>Oa%WU8Oa|2n}m{< z^si<$n@P^7lt7*FOeYhZU{H{GrlRR!O&Q$atKxKwS3S*YO6XIdOh^`NVv{agQDGOr z78e6BaTH}6g#-Aq1y1}WQ<8ey4GrTc$uMS7dm)WwT4h90jp{Q&R2yp0krv=+=ZXB% z))~Es#wy~+7;=Z#t5jvYXd(kQad z1RMCqB~X9|*yIj(w}YeMVq*vG@YFX}F%DMb@~Y_g%XWZdhYp;lgDgnMLl9e-h(-Y# zsfGq(RHer!S7fmfNlcUpVWmPg0izbl2xD4>(J0TF2Ts%=B0&GDK`kee5pZOrBp>BwoLTz>hn3QQ=lOu;Z%p7!hx}J&>0=xUDqh|PtoEt2ZT++x127KBBttSUja+SMYS?|h@I zfF116BZ$CNA{DLyU2mC&4eL)Oz5K9Wr_@(G1fxqkz!LwKZj$1n2tyigAX?I-5#ua0 z7HWum)m=o0wQhmAu}=UUF;iUl@M9xOaz4a}k3 zaPIQjevS$&pzEUYr1Kk1W@-y#AmWBZ^O;G8Gh&wJWM>HCme0Uw(_}5*LORBx1&dXy z-)kj7l+X=&RK%@tJsDhYsbQ7qFMlY>53QjOgco2qBjG{Ef zHf@@YMPwe%auy!5#cGxvA=SQOm$}FVz_Yasw+H`Kwy}k6hVfM5x%u)#cCz!zV<6aa zMU$$*w9_(hxk`0ams5Xb=gYnYs`6fS#pV&HHJm#$MnT6c*Btyc4Uf)ql!a(BGN+2s znT`|L(T(8Xc>^&Zg+6dGgIqni6vM^t0Bn9l+XoO|KZhE-*6gk2@?I)k?T>ybxlru z6P=~tCPI5)P9C_lp(X{{NHfaOipDExH0{PW7UNkYJGC8WbA(pYY-Zt7n$F&vRAs9R zW)hP_!}#T$6xxh^C7G}g^_Lz$WHLnBNss@wToI?dRbH(Mx}1Y^@yiTN3lwG`3=`m? zxD=geoL#=~&IRjkz90gzo)huo`ZlBpcW$0Z0gZ4xfgSYN+o<4@y?$zxE4U}i?Ky}0 z4_)2~vGf817~rF}Isr47CK1m&!*lJCbz`6L-X_TkBky%gVl)ch`hb3P9gQs2b{NCS zTju`=S3S@fQ2<(&E{#wDD1^zw925c#ay&SUMvP-DBfUTnPt42W*{H= zSsn}m4*eho0d(KJ9oq7^krLtta!~&cntc)GOjLCV+^js030#2dC0rK~2eDj*-UQ2f zfd{h`8VKN?vh1GTB*(-7RYoyO9&|%Pz+oK9MMmX;1$;vgpg_nO-*WX~%8Aix;7uN| z8L8xrtvrAUAOQ$Cf%at|1Jr=b(NAi4pAzsCCneZg?A*{H#3l>`D|LY>aZLMsOoDNY zR~=Y_U5t%z(#3dB1(?$LMHo74A6%Ktt8G{U$PBH0-K~9?FJ1`(rdR+#0X)!y4VaT3 zAORw}&V0-O1x7^$T3`l2f!#$`*&NjBFNO3`!+khHMR)*%Sn$@X!p+ zlMhXzMipYBa2BeNMjl)qX(<1nmh~2LAzJAbOX&fNMLmnwyx|%ELl8VcIN*Zu;apW2kq;IG zI>4mC01i5^0~@#lFucPpm;eaO&m&^W#kq!dK+b)%K`PjR_lc7Dv51C9RVaA|Cz21) z{T%w8-^ZBZLBL`u9>j@c#+<;C)%k#hd4WmjVw5xq|NIPB`9IT-1Agz`Y__>(?wK<= zHusgbIdjxPg~;4;HA2XzcDSz`C6#K8e*8$4K^Z*1_pB|L!K;mlYzPU^Tg>~(C+_NLz@nP1J+}Rvi zlzlWhY8KVys{ehTCM(bX8VOgSv-l9^^nrBu&nE2U1VN$B^Z1Zj+h}!GTD7p}-RW-; z@lLWUi96o`d+KZa)UNd5dq94j!z-Djdpq8+dlu0<9=?@mcAQ-NtZ~3Y-_!ZjJ9Ly{ zU7e17>L>SC3ku~rgD-sx3H|;A*v1j5)`(PIFf@-rt1Sd*b9{nhspStP0 z!4BG*PWSv)U>sQUWJ>j8Qw#H^C zdd@07bE{C>UiUhBkPiWN#{Fh0Z@|@FfMp~M&*;8~XKL%3;R!;zn(+Vb0F+o4Z6YuJ zmegM9;i^DErUKeF=m}U4h{B@VN~4T{0hw->=UNeu z-z5J`CDU2nd6l~Y`U-+qPUi0o+5g~#azWFC?SuTLsKP66i$0z$T+J^^L>0ZwIW~c~ z<#h7aBoNk*>Oq~2$lH$wU0A!aSzdKZu-+>`Tf2qM_=Wxkff7J2!JgsJG8Pj#d8%k^ zOK9Zu%+Y1{oSxRKAkm@n3#!e}6bnBHk?*ta2G7oD3K(w!N*Im>XR>17!;nhlS#=o; zLss*$g6ih6Eh`h|7j1psFBr$AHN*1-&S^gr;snmlBv500{^^>R zouFv*HusOKyN@;=cx<_;mXs}cCgMl@4QQQ-k0WDPcO>D^b_M7P5xPPU?<$|bxro1f z?vVLBX&SlV8q+F2mbeg%dE&f^;IAMK(JIVxs(!VM5O%6>Pp=rKM}CGWIm)yxhD^Dy z9o(;*3zPJfYC3laUmSLd5rD~pkF8@$A5-;ToqVwOT)%5|)S2H0-q-85LDm)WnY+BP zi5N$2;{hJ*H`66Dw57<%-Vo%_$a^{rHkI_ZU*}$L=c?57;RA#!cNDh>0Lww%3>-vo z5j`toLkmEb+0Leew6VQ$r8!!`FOa{ZR1Kryd0FJHrO!syPhJ+0hg(kkJf(Uhqvgr7 zfy>th#sSF^c2hh_VahB|bbJmv?XoJo2JSi^QnTW2?#sN{g1Bl6gKO%S{yG0F<00mw zEBe^;1FW$KWP4m~^1%|2Qb}Kvc$X^@^#|B-`ANqKpgoK^{ceiC9y`oba%HWK9E;q2 zw0DY`_Wb4g{-Nj%E(RD1AuXpx*}gs7R3Asaj@fV~gd^j@T{r z1u`G6n{V}+j}17G@BQI-nT(`SAqGGHD9$b6|H*<2wN0Q&B|eUd!ta?}1xaZMNlB$9 z672#|C1AsIAj_2~bfb|aw9jOahTpg(-6kXkgWE48LTP+>g6N;{pbeykR|@&k50i~S zlYPyb$c;PUzj|Kr&eq4!3`;yN|7H@$ymKZR^)`DUg{K1cn<=NhgtEn=19L^>Q2*frE158ZZ>lmO#TRN zD!AMa^S$n%eT>$H*K1Q(8^7&~@ou&Mn+u6_%O}Q}c3b6_a3SjO;6EVyi5LtG;+f}+ z&-rXKHv8vLq>rG#gD z!ou#-=PM}|lycCq9kJnGCq2{+u4cG}E zFTE6q=D!fsUyU}GkEA}Y>KOa;qT@lv4Y>tbq@wHXjFd9fvvuwJtUS}uZ3Y?iP}kDj z5gAqMk6R8;wlC1HT`u4MK;@b98IcKwy8&KWgFQR=@pM9nLHDDpMQWI~ROGkDJO%Gj zy{OUHH?SD?@a-lydupIDl|#tj+m!qQ`O$s4oYmfh0sQf-HdI9Addcunh2l|5tgzrrjxdzZ zS<%ZECO&G3mZdk#qs;>oshUT0{%JaLQLkZ$>-FS-q{CP?VgE!?mLtx0k4BWzQ_C9I`+S=lN2JO_qsT}N0*x2yoR5cFTz40TM~eUjI{5|3enNiUGaHo zrg4&tqeYO(`q6LoERQr#-~3c$voYMjKO~aK|9%Yu83o<6*yOx@+Sw2+hiv}^+3t*P zj{7>$jXJwSo?|M(pa&+3?+eqJi?Llh>1C{6cRN1*Gw)K?-gX%-0 z$RP^`yV4*}e)wtn$msW60?|Jl!~G|-^=|#+Ge}7ajGh|1Kk)p~6P8Wm!iuWe(9zCx$_)_`Edi{HN>6s%hfE)!b1d${cD}Hd13;l~{Gt71k?v~ei zx2iPtbg1N>)0-c(Lue)LaSsL*#5;e{*rF?V!Xi#_Tg_^C%KF^uKufJwdjI;9(gx6l zhOYKb_A38j(GG`{nYqrT@kaa5k3De}t^SuCbJy0Jsy1WXh3X^60zSlel*@*GkWKvc zJwiDvWa+`R{r@@Np|0B6sXVr+dzFEGXHU0@#@wamf136y>GkU0ZgnR^t`9i;E`8_H z?t>eY1J4^t(Gx;ZS;#q3FMHcScyuXB!P$DI&e5-+*+9JEbB&B?GuA?s!uSEIl> zp7ti$vDwSrA#f%2!Q*%POP=(G(;>6^UYhvywN&b%1)ZNbC8vOxSGn7MxqW_msOZ4r z@66xQsjs1j{<-^eX`Fxe8+m@P!L9wPA?}w`O-J#V{x9eL^tcvnq5|(3rN-KNP=}~1 zMFOa>ay%7KaChMiDh66k4FSJvb`Ps0o*c#*{;tv9bUzqvtB*FM0rI1y7-_Di!Q?7h zI~Sj_w1bB+FVL+Nc*-=iSgygKrdCG(;ws+Nqx95bme=$~)EhoD?2hd!dYF+nhH7qY z8EY*zma-r^#=m+{1}758#X1g0>*MNOj?N$4ZU3pg+eAnXkAZ8LN@F1SB~+E3V} zM9KK-oT=&WfeYw(Xf^k9&sDB^fz@7wtqw-xmYY@q1Aa&3T{m$@sMMW4`aQm+jJ6?K(4iA= zxj1^WFJ0gN;*9pS&%ylfJniPR_nTn3=c0iM*;$XW^H$LTI;YUqEclB#`MIP~0Q$I9;0x>OWIDstRN}wabDqS?!^qLsc zWe^t&z68 zucXyNe_&~=g6UXsF$u4D6co#F>;a>$^ai4RW*FORS`f#|D^7$LG}Nsw=edrLmUpo$ zPyL=WgBHlow7>`X<&8%acNck?E}5OSejgG+dTuz%x8B}PCkCVrj?GIDS#w1Rx?u%6 z2zi?)JIwbcKcCrDFYGt9`p4zOp~4rzYc&+1a z+CT(S*+WmW-UccQ8_@Vd0sWolfM*?b)DvwJG8Ls8bLLH??!19X9e52R4Gei@gh{^`^DFP(KVt1&=IyA^w*WGN{b)* z^}jn)3(|COU#E!t1&hA#ikHD#E>COO&K++#(tt9nYw;R?40!wkw8Mg9|z@`C+j zxhwRpW5oSY307SP{w$(Vg~_4e-oBHOdT8YUh`)x;=}UiYEqCXlFZ6zV!hG=Iu-4+o zif`o8Q=M^sA+~!`J^Zf928TnmkPSL=eoybMzs0fiQBj5#x1T-exN23daIjpIhj94> z^5}hfkS2MT_0lUy)w~a;&K=TjkGGq;#X;5Q=KHgzj@r5P>9OU?2y=CC_ge3(S#NVp zSqgDZF5Yn?H}5AK^_^AT$b<6$jJ0q8BS!Yyw49cyuQ0$3hQwsGf8G9D+&%lp0hih( zhHqN5!_oKTt{*Dk!UE%1-JtGoef@AcFJ$G}>I3jrvcLKFw*M~n0dn$g#O~@JHn|qH zATbBtu39I(2f@mt<1==jYJuh_j3cpAZmP{HQx$SMPdQ_J7Y~?vH0_UQH9PAem3<$E zJ}}q+?Y)g({dr ztVDhgiHI%Mfkz;IsrVxEKkgTqY4`*7ztx!R*D4hc6eeg$^qCy}nO~~H6_>3tu~MIz zE|oJL?oHhOwda2Nx#l$YNF#&Lc+&XhAbIY6 zkjvkn`LJh}r|i>mdUEI|imO!k`j77yXKDt7miFuY=7ii5k-js00+LFW!Jq-pv6bPZ zi6ZLWsH8QwL%KWC{9)NMv$kM>5dBixp&;PwuuP8%P?tlkk3#oi2c2`=@$`JFn9i-;HS)9=rAfe+0Gh+M6)fJGpxqMG;d3LtHPU3(0aafRbnmBUV-R}(RwF|= zEvX(Huy_Vjw=Y}ZXw{pLq_fxD*;dalpQ zx=s0v0s8E_cSr&BKOb#k_zrXNj!BSF5Bv|WSaNSruU~(0lYrGJT3Qk2KZ@ipmC%o* zjtrSLLZF`*;LGsv_Te^{oxQrVc>vCd(=V@+I_g0kjV*DBp)N(6tqi{lh{Ei2H`{4I z(%wM=UjHkkc-!Iw=DrYwG}uy|_V=CI6Dt#xflA8sUPW@!M@;j)1e2rlF({pRd%*i6TkujV*=u=(D1Be?3f@)zo0G!a@CGVB57+tSCy z?Haz)i8vC&s6qA!Y&FuL;}*+Yz_-jc3B5-@k9^aMj}EJE;5ycuK)1~0(Q)iWHD<~6 zdy9kwv~pI&dbSSu0$sCF0GlA8ZNo6w#_yX(;R+ub!>2A(5;K6da~IveGoSXlHm--TZ0qriw?hwQ%N*_+^ipGD#yF0`=>Yh zPj4QuZNR>Fcv0xSWUfohsYB0;uf_>9f)Y0GNf_miQTJFB)k2FlL)>q`n&wSmzDFJU zg6ck8SxX~jR+?db_v&v+N|?x>y*!i+OPouR_0U%L==)3L$P`t57}h_MFl4c$AOt%f zBKL#m0aW88bX1`Eu@5uJQE^$*V3LBnI$%W+1Tt-%ET{bQEp?cME*qWh*ZH23l0xdo zrHY`x7v)XEh_sShbr;Z_TT}Ovpb%n|`QVTQsLE<0d^5vRn&#x{ms4-@e5? z{xc^0Z1J|(E9hB(xK1)N@JD%o|5?{oFX*eu<_D8W>THmMP$b7^!F$Bp9LWi{wCCR- z{`<1!Vopn>NAk43juONu#`DcRFh`Fy6*K80KziP%#N`)7c^pFkkFI*z^7`~A4l)fq zFF>{BpG^1Ukd4BWTYwDrSXxW*NSB7@7g2ADAn$voZX`-ip=G-$&W%O zJdVt_@`F(h?5POw(@0zyS6q5+F5c9Itp24rCdr^Y=vw{~ocRN(Wg+OgQHd#gyrvs1 ziigjWCN*h6TBPfn^Bjb?Ky#9`|BN<#flKc;)l*9~F_Sd@B`(u))@W|QdoMVz<}Zn^`S9<|Tt;WQq))h4mxcb86! zGizmlH8wu`hKw^6!1f+uD0OSy=>zkweB0}TdP+kX1FHQX;%Kz2K>J%GiI7SwsQ>WH za+sEKh$n4OK9_oz@Ky2t=bUJ_ots|w#j?5LD>;$67Ke)TzONI_jrAEi`obKqIekt2 z74_imS29nmv_7aaW61sQ$ZlbO)<_Ax(W=j)J^J6N7fm0@bH5~XU!g_HE{B<){K{}j z^Z$0pfAdr~$xd7ImNs*{6m;uEV?oPsz~O@at9yoa3A0BdMM#Yuyre;$OH$6ZJscV9 z!mBkq2cck%6}JjF|Hzv+5bs6MEJrq#BWo-IcW`B+pFR{#LMJ)8F--c+2#}D58x&}+ z2{cUk<{n^;Hx;@Cll$xqW}#A)o2B|73oh={VfKT?9F1Fxly)8Mk&0;#MkJAAG_-p3 zsQXy|1WC5?_bsmDLLpBz^4VV<%@q+ei1saq^RH;_EG6N>XRlu|^V7w550vOK-{A_R^IgtItW%I%= zL3B=My34^lT^)k!iIk-j!`xpx^&C#WK@C(NY40Al_9<+XOSI|_wT@G@Amfa%_TuY? z!hGaEReoDvqn-9_+6xZd2kd@TQ*9dJv&J=~H1hb@<*RnU-J0W&=Y)+Kn z{aH~?81-d2OW8qYi@A5ofqp$!|9b(DTVr6={n-AKOu`>>!a(}t4!F+f-uOm2U&yt@ zs(@?R`5NY@leP^)?LoL<5i!;uI?ru-UI(#f+3gzw`6G%?KW^TV$gUbto@tVmT9;h+ zE*U4rEiINT7PTZ`(sq%}^dDXo)2+f69ZbKuTp+3Yi_o^HeF9TW7aCvf2#F9uDw4l0 zE%c>TR6OegM=Mu)ZGgwRInvtaZ+{xD-tC6$C zt{a&f!K3#*BVKqmgj5m)Kc4OTgGLoK7rb|23i=Dq51?8k?S?SHGZs;fU;jEUUt|8R zO=-OWS#|1all4bp?ee{UOJ%Bwf7d7E?CTmAlQAi-Q2$#^A*yy7Kykck@rcFn%*6Xj z$d04-6x%Y=vH9kxk{0~5-MB?*p{K9~Su-iocmaZL)&fpx2AVIlgL!~sG;s6+i?$u{uolOG8*T=b&G z+#*^X(6}QF>E{_gs5Cf9`|_J>wNj?>JACigY6r8#YFCD^y2=1{Mp$A#(Vx(LPRXOG z9gR$(3SQHNh2e1Br_u~~%tzbi6?bF{~if}KZEwbVVhhut#Xn`u|H< zcKyNC`9;V_t`$=R^#vER!-%~CsjswMtPL|e_Q7}%J4ZS{UHJc3{Mx5a5zo*y{Ks8f#RD&Na235@`Ho^(A;&HTlp3X_CW2hNS^ zhs^@$3?22P#kRYgt0O8?O@Q)dfqCyaLvm7eA+i~~_Wty<_Q?J04f zit}funq#a|o?I?{oIE}J0F<72$V7Lux2mY;w5hw=H7A2QzL6 zV4X)|#ieIzM*3<@BR1pgfAAIFBQ)akHg4zWshjRZxvD!Z51}DuJDqH$zOPSInc1}d zt+Ut1ArZdkZ3RzV^?eM^(Xu5u>6m#lyG`~_*872cnUJ;AXEROxFC4XEqful%#yQm& z#NQvL^)%0UE&Bce)#;o#y}e;Mic7!-VT|c584c4t*BNCb2=n#W=palEs#_* zMD?_ceM#`|x%6a{t&FJ{hO0GFp|(btsa)#ko&k3UvQ(Rg)M%fh7wQ&?cOpK|P{^g9 zv+0AbE4FK;sMQ$>V83iDadBJ~C_M7_H~BE=f816)gm7Vwl)(u2RYWP%PP9|AHZl<6 z?=PC0q(cr?h)beoX)t7K4e(xd>B=I~bfAFm?&v=w64m4dN_K8b6jILz`>RJX>4<+s zc`C0c5ezj#s)C%uOMe%reJY8Dkh6Is-eT9BIyel$)zEx*$P9}6EhgS@A0cA>nFEK za7M07F<_ZB(Uta~I$xu62)8#iyZ1pK8}= zJbjXQ#QR8?R#kpZ#KxKg<55!{mZusQ+mFCBZiE-I@I2=+Lw>i@i31@d=CsYWSoLe4*> zd_gR8L|;`idXgVdvR;@EApCp2I>aUn;?XkH7b$Lygu%m#bY24oEps-61xiDvHpt1@ zaXhgaZ`eVe*dzEb88w1%cicAZD?!u7-Q`qWn9R9 z2bO~!ZzWgh@6JtT{**b{qM(pv9FK8X8dSa~LLt_36?V5?+}0mSo_p|b@Zk^WkQH-* z6%?i#^8aCn{R+xD!y)#H`?Ti5z-nCxCKF?mU;Db&SO{^rH_D%OlAtZ$)s>h(mfLiQmJZv%^JV)w zIpP(=9+izS#}UCuR;|D?R6U}6WCNI8O1^e>d1U+F&a<3lYBzMM!`>dPmXi)YM`dbn zy*J7j^A^-u_BzAV0Cxpbac*{F>?uS0saFSX*5AFdjL!JA-zJ)-p#bfJ?j-qj9BZXz zXM?o%{WwR_$%p$>bqHI|HvUDe ziW$9?YhJCktgXJCd#Vzm6tdpdsZECm2b39A)y?;TVt>g0sa(r1eU_V(_CsX2Zk}fh z41^^}htVxemtR6>%)dYR8uJ`acuAgSVgU_0E6BBS5m*EXc#xG!L{q1d;WbS+ZOrw(36vkvl0aEI8Ma(0uCp>ya9Sg0>T^v zAjFdb#cYnVta!H*I(WdJ)at%%5?@@ovkiU!1FN@xaO-nfI{Z%+!&qHXnr^FYbffFl zPWR~h#AH(Y{x+(jer2=p*OuM{Reg$u;e69pCfI{36IB6Q%HkHqWcxn85rxJ1qvG1zbNtZS$6rI@QF%uxD8 z{f>K(j7=U7n4Fl7P`u-&V{b+dv~4Ct8CYCQ$$_|CFhOi{e11mjPm|@m245rcXi!vA z@#h3wtW)5p#G_c~^&R0UF%CMW`s3ExSC-{)4GFxwMz11m0YB-AONH_MU!K_mDb+|( z6v3MV*1Dpiq56Y|>>=@V(g19bm}jrvfwe6lY5fp`hy48cX0bvwEtZ$#EQ@!@(P$7Y z8UhnIxq&Ag3Dk{Yl{wKXzHyF*7DXOuEY3>{uTlJ(JmP>YLT87A(1Rp5XaP5uULz-)Yf(`fISp0>^V_^3cid<+xQz`>T)<3E}FDuE(>iVvSpL z1+wdciEUxbg`zg}J3{>l`uSLo&NmcV)EW_=dAqvtgu zk>WYsw5fdqe<*}vW6C2_yAElv!CO-vi6ZPb8fN39OmGUEF2c;`crCLbPig5eCd!)xI*d%e zBtlpfq=(WF%@iZA;Ybb}-Yo{V;?3{-Z~x{DJI)0CtU?D9K)xJs2no#O`bEI?*Uh6( z2GDGB{URiafjLL=Mo{Uq#ySd0Do`+CKy{CzT8}xLXN{3|9dz|KIbOGkh-NBBiZLO8 zQb8DE+Z!k#Iy$h12vx$pJ*n)zUL;4t^#a`dI_2wBe@~iy=Tw|M6J$H3)?KX--xFv) z5Xg#jD>#X;V1ZH??&*UHgMDQtRY8*=*y`M|32yKg8;>uS3@~hLCMD7PHTqO?B1FC% z+X_s#$cMy(v7Psy!$yqOv;2yHEw`Nlyn(wvj`$(y*t z+v`(Tq;}QayIui#>O<&LA_&_MRLw%|AjuqM0tNtr$N_y6Ap|@?y+S6TTm~nG=d+6= zNZ|aM=$F0l{&KiE8+C$+)*^v>8PPkJOfDiBx6E~JEWw!IOu-pNG7ICj8}h8b(B{4}hOL2}Sz+LxtgO4?@N^c&i9-w#!-IO^W&p4t!9J26O*=)o z5eD5)f%KAaxbCgDK4f37h!el3#uDNK*I>(U)I%bVJ>Wvsq6ydDqT?FOhmy?=6x1KA zYCc>#t(-g}@gJvtx*>zL1d&g)m0@sT$wUtFW`9N1`efU8e2b7Gamy z&mI>jee9xU)hR>Bn37dl*dh$VP>2_U1BCGXEJU;r{+)$c7b}w_=cy8COAO{S@BeBv zSQaUFoZ4q02k~X@T`;He^^|j(sP+Q2`O(b49QCc;VIEQ-LmW234E(im!LUkwpxOOz z>oJrJtW)X4J*Gfot6+kT8x{djip=^`lAKYU{Mp1?d&=joQ%Mx-Dn$;?HyDSifJzas z27|g<4_E4J(aCS!7U@fN&8uYffHKb_mPvL`Md(w9H{m1> z7RPSv79hSTRDC&|a@m&`No(4-1l88HBjL@jG{8d3A!Gpf!2uF8krQuPJo6h(@DP1* z*!2i-nh}=HMim!Bzqj$DrxbB4d3^x9P;PiLg(kNOa-W4Kerz_!L-ychYl>Rch1g5u zr{&o)xoiMT!5WLeMKtX52$`0%ZOtk0R>46tj=q`X_MLNvN*qK64gH%BJD}fiL{B+o zQ67B~vGrP^sA?-}9T5~?nAdW|)>R>_OYv|-7Zj?T&AoDtvk%fw!SS=U9d&VRM2JMF zOg2bg3|kPw{BjRw2_P6I@wnKumvvQ;tQM7;cvE8fN{S#0H;vVt1DHL^;?uB+a2)E~ zg`Vr?STFSqp?N$2zLsXa1#&TK##{>0nvfHqK6Yxx_p6^1NRM=Bkp#FnNOjtNU`M&t zo#XBXEfT@p#!vZv@>CclU!K9*v1E{fp36|g zo?i|7;=veFbL2EgHAlDVE3m5>aGm$|_~>*WXhJjtIF?+3G!k{)hgGcel!N^&0dRs) zN4&2i6W7vZy?GPg7*x)8nnyd)S(BA~I3fkT_wEcHV=1#2Q-L2>EkIQ1k@caF^ zKUFGUt#>he&6b(E05d?$zlLvh^J|jxkb3Gp8U7qU3*WoTczw6sa6|a6kfUplY?UYDpqgqEyzNbnsXmXaKl+?mJ??RF+Yf{aN(S89k9ZwD`d# zHezP_rn)|4wNbSxHIuMs3@4Uf;a>{ff`f)I@&oc=w~t!dY_L? zGrRn00CWtyYS>wQD$rtEw$fO{QgDn3Sp6H!raswr zuhSjCH%0(Vh;JCUU;hDRZM@klCk9jZ4$H7*-#nH>l622hLb{xHJzNKdrFJ)7W7FDj zr6sT!0q2IKMXwnVz(G&occp0iM1_;#eK*k@Rt)}>J`=kg$oDR9y)*%mX99X`$Q&Ey zE(TaRD7|51Pq3E(uQH?u z{t6FLBfTQn@M&AX%j_H08*H|~b2aLQD%FT-jg}MS1}*OmGKAID+9kv{72ZT$WU$Zl z+mR)}grpfqgOyauWU#=0ArYXxxqh~(*$eN3JTRU3Q8j)0z^!^zMO%Jke$X)UekO3Vmjrvoip6|{?ia?=Md2%|SrHNh^xqO|C811WDRB}T zg6}&nR@)i1eT?p|{Hx4Df__h{KY#Mr=hI7DuP!mgOQwIPS;^Y(9=Ydbr-m(hMs^8t2NM*y&X7 zis8Utit<(H&?9U_m{9IwI5|`b{7XT{P#k1eWB>BOYWUP%;Tg~@*!REx1b4s}vDH5B zBVTb?R`1mXe{@!*kSP)Ls0g})^y}Oh6vmOA6Ugq9;*OHiDQqy2J!=~-m)+8qQrq%$ zW*3h153+A>B7ogR@>|41ShMyWhYdRv+NqXGuMX(Co9jONJfSgz4P0|@BQMOI+geN8 zvUms8O;wIyg4CEz%E@s`f7BEd2`~I=^l%4P7*i7|uo`KI0%} zt5DtsiSmfBy|+>FQ*tHbw4bO0ZPEV)EEtdc#D4qQ+^nS$n0>y1amY~9QQ03#Uwjmb_x;OEkiKmS$;W0} zAAa|{iH~$5yJX*7q`BNqZ*~50f>KhGtX163cRc3!BF5ag1&obregGXMEyL|15(C>u>dtvLR}-)mzuOt6gzC#sP}4SJ<=s(opI9rt<4>GJ&js~iA60sZ-srz>6J3$oGvFK%p~d0$m`Y5bWGp}9U5Lo(izwAj$_($y+p%~Ef{z2PK&DK;NXoDQM@w;&MUNS1 z<4}BGAud{^bCS*Z!LWH+8Gq^aRDjx-w=XLn^9qPT8Tq9d9TV@1aq2bN)fRKf9Pg%o zS@y3TQY6lHHZ!{sWe%DfZ!5FPMFZz$zc?>e6M{rTIk^7c9eK(xTIw#a<$G8dgEbc7 zHetO$qLJ>F?4I{0oUWZ`!7j){ZR%Ij9FrBpSjo7<9R;0S1&Uy*6zfFeXjmFka?kr~ z#_~(Dk}?elo8G|U37mSeZm9vQkS1fyG+2Td#Er@ynMH2Y!wmu+KlV15Ue`GPe3Q-D zup9Y3P-uFmy$}7t>T$b<*}YLn!!?ijMxLYX1Mumv3FhrQ-b188fumDwM1kX-xq7tT za0^g#!z6>trQRaNV%B$WKpJY@PyA`p#T~EVx`$UFOlAb=1&cyY&*=ik>?ZX7j0eK# zHP|`YWkanu4=`n`RqUw6P;aWXUt1F+>0rE(-_-220tU{AS+~__-Ps=loZj72tQoQ# zhMUSYCAAgje`1^tk#0Uw#&1N0>aRmsV4V^}d5(;AK#7jGDA&Mp1tk_v==lS@kGc90 zO0T_VBuv%vAH%XiEpiDoA>0@9ny{1O>=XyLAd^^@Hv45$65t5Gl@-it26wba0woid zF@8T8(_bXi;xq}=U<0frDd4vCEdpdxzsf=w&%Z_#FNZ`B!l!u19uXJ=aMb2^>j8j3 zBT~%Q3=+$l0JKO9K+g%1=2(;JP=)~_y&%EF5f>f&eUE-8T@e&TO2WYm0gTb2?Wo40 zViN}f4@V&o9024Hj&Lv*mEi;sD8cZp3I~Ll;c}cL8U0m_lww3G1iB&`{oL!4yP3Yx z;hEJX&$yX-o2Plg>$BlwsX9~7ETGlu0HsuUjLG+jy$a^3B5M~oxnVT|jTh2>tvNQz zxV;Z$Pvl{J?TZ}olw2pStu|%gMH;F_Ip%+tJPOte#?h4m-$a5p|g{6Le)M#*eY`@ zU}5OKmdx&ggB4E$#HSE7I2BQ+x z>0T&hbPnrT)LbbDd!2+8g@X23+9!{?~p*{rrS(cWu5p+7>K^GDzT$D8pv&98azF8uIqM?GB{o z=or@Ht%{n&arwYxXM!@|!j;+8xo82U_6pm2U~|Iwmkk=L(#aXE|fm*<Ym8Kt5EIwK%|-( zWYEh*3iSERO6NqJZ)V3bAtLB&M3}k`7TRLm?_C}kEah)My^#=mqVMeEIB&~ryw5|Y z9jYIu`{wP){mL#<1irl9&q~a2@*GgJ?cpO`Y653G_IJNTDr44=|2$F-VR&Z&3@-2#@jKE(`qT?kj0D3Z~wb5}p0m)kVy`9Lq(!?a&J zm%v(ddc?Y;@>f!N+LjC+0Nj$)V@3PFWwx!1^7edCR5-J8aLb!YHvli2>+Y^<9OLup zns0`Q_lVHQxP341eeb~GLDeaH$MFM&wk~JCmkTFioP55r0=Ku<{j{nJkN6{Bqk_yU zvU<>Ocb!u7F+Lg62z-v&Ed3KW71tb2bWV&*JBmn=0*E~akh&?K zIEU3_A4y9jWRs_cWo8+i0A%iw4KtCPx=vv}W%r5y`^#a2=XDDbuY(}=@-QsnfE`p{ zoHxCk=liqbfdc>hlpZyJLzLXg%0Q?DbH*&Lz6n+L@=kB zCc5dlYzKc1L2cNfHV|@QLO(o^#^wjvmwvG|&((bi2-zb{}&5lk^#co zUiF{jsccdpXJnLqJmWcTsAd)@Inb1@F}tr;@P2tT5o+#Od)#(Q&JRQ8XSHyTZSZ|Y zm7E+3ak0?!49ICIciRKO86>9<$(hqp-oDHQGJ1APVFx`d6~YmhN4K?Q6uqj-yU``1 z6h7QYgc-3oyL-1rM9PHXjo zjaPNH>#Km3XxoqVLL*-1KO*N&eFTcAS4vxTx6-k*DL?`fKKKKM-N2Vd0*{3^+LYNUZZv|2x45$3kzs7r78W7qI3Uey8r+9d*|~E!?4ZfP$P#q zwj8pVGs&rvq&Xxx)JQ_=+QB)8IaG3~CKA;pN>aJ{Y)(niNT{SaR4UczaH&iAUf+M= zdAq$H_xt0A=kxXM3Xs()pb6kwOtFIkWW&B_zJLf#5v`MeU1Sg|6+EDTW+J7b2F2)B zVEY1iPuFFKC87I6&r7r-V2#~>h$c8xeeYr*x@-3D0DK`?-A^gd`<3e=5XLh^@hqWzLdoG9dKL4<MhL=eR*8>UnNwhnhCpaE0G!A8ZdlECVF)!l#fivk)*G4+bi!)t zH|#Z!B_zhTCvn*2UT>pm>!C0#LSL9y);Es){W^Pf_i!=V# zDQ%uMFvEiU>6FSG!^-@c;M_2LZoE}7i73&iVueADA@f5O;Dbydp9bk$$+K?)#n6a9 zbVW!RI709rRv`yj&XuILjWVQ_Eu6x*ZAs9zQo)Fld}M}+x-zF}_QtMv@Xu`m-9Q&^ zV&&;p?MZPF8STkfDQr=RdBu;DAJDJWJodlR|Fi22%EI7QC zl2(saU{Ne}jBo@qaZ)i{})UVp_ZY~JK2SSimM_L^ zB@76?-Rdtr06_;p-vmavfk-(2(l>fx1*7WkN|A#K9`{sCUt1B_PXd$y>nu`1L{PQH zivm3vv4nx@B#Hf^1g>*ugV1~uT_LD^$np9>wcedu|Zb%H>`m8c6h6m^~ifTH;o@;t-eo|2Ubi=!P)3mxM zwUY`A5>EM)L-_=yz@x{bcA_4EvuFae^cj5;(DLq}6TQt<2%9WM=a-%fCL2dP#i;_J z3!ALrLq;KU44ZPsK88<-#8zxI1+N53^qJ8RCK7fX;e*?6kWB4Mownz@b&53#c4^-R zTmJI7W3d~>0)tk-wpvyUYvEI7u7fi4NE0GtElZ&Np{dc=7(Q9@sG#9f#x>b7fSLh} z%)nBmV)0x=a}+%U#?doTr%>M zk2I*7)a%@7@}bJtd!J_T1)izbK6}?#4G0s{1xjYFfeOzz+EN~b6_Rqxem3Q0i2WoY zk8x3)z1TSnV#~{SEih0$I{8Bva+EIugC{<@pU6{ogk|J8#OELPHvOs#-@56>=bIi` z7cY+`YGNx2Er3(5fm^j(7ABwYgoj0Z`DV|D{hkjOeonO$@`{=RA5$cM7gAshQc+Ac zI)%6|<@ihm+pBDw*WnyQ_o&c*O^QRloS`q|(2;p`X|5gZeSjp;i;&=|0tVf5P2y(# z2>HTZ-&4yw;}S>41(1%O`RvZQCrHk%`P=XtIfgQ!Q(*pI7A24sFx{jw%_z9#Scw6H zqFEgSkI!#tdmeDP=CT}knf1cL1suwTdGJ7?1P=Tzm?VRPIw2top@sT+wglmEzLSlQ zrk@8wT>)0-w`C)BEu=LYgApU+CDI?@EpO&Gcf(T|LJe77Z@^yDhL4<6ZUYbUAkw|J zzMP$J8&e|)!_jAot|QaKAg{h5&f)THl{r`MR_F~N;{z(^ZZ;{G&PGr)ZFg3_^*tB= zW~hNK8un3}0I02NNB6wFB0wvlCaMC(7q|@)ab!RoIw>%hyloB^<;h;%-GK5iFGPf& zx8^~j`L+kE$1Dqk!FC|?nH)=Y;m0bo%`vd-Ut+f}eQy6koSFTTnEn_n;2aN|iFusC zg1fRsyrFo>_lb(et%*sK&GESuWFD_ws8@t==cYUl=?BAh>><2`os6onL_I9>LVkqS zZ+=e)5PV<+voJ&N1frDp&H2z)XkKV=< zdw%4CJ0U5410~OJcAoh~&z?^t%q4bC+3_w>taHbnx?K*+hb$ysk;C0{L7@YA!6XET z0rOa6<+@sev>7n2CnThTWy%ucC*3ZibpKvFJ35T`Oxhwb{mMQfmd>Q@@ilh29tUl8 zu;>%I6u5;W2A|~mp#-m+OD>MSNoI2LohOrQ(j4K0rC7W?J=#=DX`4{di9~BR+e-@27611J&F|s4qic~sq!2YkQ+N8Jc;Sk%vYSY zf5L~TgjR9bL$ILj9xNa?N(M`FxnV8?*MdC~U?3C8#A0Y+H@}djyLIBkB!FDfH~@2& z{C!@vRr8Wku22?#=WRKJ_CI=s&?4UMEzr#uCHqHpm`!R^1FJu!bT8*RE5lOOYWM$n z`d)3GXy-17g-rsV@!n1foJ<^4|7!CV z;;0n59ssmS2wxol6bMy!UiJN-aY#Yz|4xds;`5u;lP`~0j1ZCo4Mo`t4YP`D&V51g z50Rdn$r3@b!=R$dZ?*M@cNx4K(Ryh_%XgEEWy?O~rLHF|h&Bk_S1+5a_lCvp_&)Nyy2RL2owA!GzI13rQ+~k8mXV*|E@g}d&>GOngE9$ zaEK}|v;erVUyQ2;t?0r`TK_O<#oV2IXYUOYgjK$G)7OMsRma!QiBYDU1VGi_Tvv6_ zJ~Hr!8R4jMn5;p=Wvcjn_tL8qAJm5<-! zNbuU+WoNL!FHjYvd>Frb1bsX$@CchiKK!0{Jl6U!T>T74?#pw`Rka!bOc{cI=u>=BQR-tF={7%f|wqtnm-0$!gSAr-l9<*DPD z1W@2>48M3gq->9h^cZ2ll3s)?N#}ZX_8rKKb5dA%BMQ4#Rbta;Q~d6XY?feH=c6pB z2eBv_3(_$v8G%t}a_TV8xdjwdP&)*R$(|$0hM3m(~&5^YD)TgG09K zs+Pczm%WB+*3C`tpcH?`moDCQz?D)9hCEw>fo&|`)FI>>OW`& z=N?cbA#Au=M}CRnvnqgV;uDc_*kLV~D9XD88Gll$&oXS1Lhz(X5V-qx(6li1VadJ> z64{$d9v(S`bASPnJ|{x<@jc+WpBS(u2YKGv&h1WMjFz39L4FF#l2Wx^Bcv zb2T@r_;?`a?M@!OPdBDjU09zC%ncK2!J7A0W)PquSh_&)+nekI7ilE(>hfXJU8-Ev zjJLWN@*;!tco%h~$hc$yxgky^JiYQ>ZC4=5KPyl(dd7X7^MeOlYgJbP+6=?HT)RW6 zlwS_pyX#r_;I`Ifi?zPVUf}g|-|d`~%By327Q(EFuEp6F-8XcrOjR!a=XGW`a*-)| z23TP0tNT~v@XIO>ZGX0PyozfZHsBw3L0M*=A-CIjeFWp}X;W$1L`G&Gx@te>T~iBAIst@dcFNdzim2^6&| zPW-${P8ldCXkr(zhOOl^OgRKm>*?ao1E$C7V3@k#WQqWi?_Vgbc`4uG${IPbJ*{(t zav5#H$Z=FP=4LmoJ8UTJUhIN`(}~bSwBvXuqk=xc+XS5XpxTPUYErO+lg;#Sh5q)qtQ>k_Y zg!10JtnLK$MO91xI zfChQ9*V}kowq?L}6YXRSPq&J@lZnKn=83SSZB}=`V$`_a5Q32I-b>D7-VQ7_a-3f!@>^QQw+xVR_X%K1Ch!+QZy}^XKGo z$=&6j8Y~cuh$wt0xT}%KK`3UrEQip&G-?kiPnyrq?x8$?$kiu1-cu!~)t_eekVwj$ z>doj@7{QhuEr~#fkhVFZ*b6P0#)>GcN|y)`$h&oIW?wKbF>&g zl_)ZI_MVI4enbUViHM0i6Px{EQMWn_TL6*_6ZTDvSyB|mkl2x%dh2$7(&{N)$lOCY zQ`}h41h$mSD!9(oJXv{b9>>$B6v%UxE=?3i$&2o1L@*O$>wB+zIwudpF%fxxYDmE) z>$*YM_>RVrbmkb3`g>Wm2?NT+0~CP>{o6j+R&IQ6m69D6{P zudgcxy|urF9KRd+G$}^kN|{GS1~Q_sbW+`y54LN3>yUJ$&pvk=*wOn5-frf3%&w_j zIEQDYiHj{7tjXOP$7k*y*}ii2l(LWFUs;x(4K#`jQC|J*GIQmuZkWu2B~nC3IMcN| z2|XsQystknG0ajy4+U zFF!>7oK2WF`rOhnBvVhKV09cH!?XzI%>A@#^kjHeRPhXXzX=SzYKA|?k1GnB4AV}_ zaeP`lWPj(?F4BSuVteQ9Sh)uok5;XToyhxc{CQYlx*)SXSGWDf#{Zi7gnYgkr3#X6wVd(`1hR1dwC9bUOL(lmAvW&On?961`N{3C?+(NiKhWDKP@# zz+fkHDj17$^;)o5l|c8k;L>Y|Z>AVoyCah`ob~$8jr^WWYj(we9HErMk^r5saA-DH zXF**(4Wi!L(_6>IXUm_r^PG!46UsHo1?>AX$n;|J|1V6d*d~0odRSPpX)vhTEsuv% zkL7$#>%Ho{)#Kgd&2QCIcUd7FePMyiBE2+Gg6(*mp4Y;SW9-UffD6#W>~*7h2jFUV zP}>J>$Hd4kHm(@7<_AN!Oh#?QDyr(BkhWgG*k=aqXFHTo>S`}3LUFtH+4Pp&n%6I< zO}81x<%XKD^@{z%vIU5XX1l4J<#l$9+98hjD=XXLbTd@e*Mk1Hr$@bA4MrR(r zW}ci_gMIpQW0g=xVw`0SXpIRpSsc#=wthQE-Wz5%P)>gBvluw_ap6Ht+Ei)UxOz)r zX0}|7!Jg%D+mG$hkdlo~?$KE7(UNdUEcWL4o^{2&2!>Fz6iP%xEU`Uf$x%AnDa>k+ zMTEd;L7>5q6WrN)jM?o4xzzV{Az;khyImYv!4$M6ESv z%SSev@$l5^oB-3fDRp+Q`$O9Mmm#s3TNw(3uE4HAumL^2?FabfML#s#gYoIvoKGbF z?~A4t7w&e(&F`h|8tI0c*P#7Dtbq#`j!nP)!6Dc7SR=&-iZ`0>g3SwDs7$n$5?6<9 z73++#2c`->(Tz$~9Fuo>ZNJ18l;Jj$iUZbOf9*eY_3Q&m@%ju0uScyxl(P@csZfbB zPVy??^1DQDaxR${i;CD{S}X>7H9RZCoAliEB6dCNE$MtlGZ;9}He}})|JnIp&7Z8) z{x!NzF2_8lsSSi^#5Zk{$+8QA999I{N#e{i^H6lid=uWMasK?k1S~>E0JuM@IU8fa zo9z&%uRhX=56M$CJ!%iqe>Vbg1{|*jPfY=M27u>5Hc4X~YTZ6NYv8d4=~^;MD58`l z__A_ww?g~~$6*a{iP>UCVM9-S4&U-0{dMaP=ph ztWCnxLq*>6psEyTRY{J9D(d;o9L=V)E@QIf0FGXcUqiZECsb?z-9{Z^Z=LV0@$fJT zf3r2oC_11OR}_viIq zIPj*?Anl#?e*%Z)Fc_Coho`Ngg9Zvhbuvd1YD;kAaBKufvp~eChTLi?U<_y@7D1bM zMwHhw`^6zl%lgderg+m=We$jqx&w)1Hr{_+O$J~)vCgO1rbt1|$bD2Tn{Kz=yu1e@ z7$n5fg}$%vL>1gJ9bh|5tj?SlMV!Y?Bl|y<3^a+?OnWOoht5ybvhh=L!wisDV`-)w zRG8NQPmt=c*xJ|}zl0*)s~l?D)Wctl(^vOBJ`OUN;Dm~|vrCgxVSMqi36S2VXxB0k+;k=LI1uLypPdIx8g;7fif~ zW`27?C+UR36w$S?opa&K^PZmotiWXX6NARl;|uFO62OZxa#}auI1Xq4wrXJlu(QDz zW$(_JIp@Hf$uMezV0LHUouLENSYdePW4OePfCV9?f5C2gTs;mrj~$32zzMJ2T2tl8 z>E{S_=K`~p;dN|n>b{iWbDM!4#Ohz4Qm%Q=Oed{uxi>pH(>kC|yq*c^3kvVi!=VD;YrbiNo4&i% zvjV}I{ycYo&d{_J@`7J&aCQ;yG_md&$WbcZl!796_4k$dRx7S<`$mUg^BtGFm(th&t`icVbhahGOvHg#OLF(u;kG7l!hTq@glW%$Z2=m zL>0Sepa3A6lKG+`dwQhv*+eGX-J-}3gZW9Dn1k6?5%M)S8KRW| z0%fyXY78;^2UQi*QT{^0>&9hj9+Mz2Ba6fL4?66Nf)e*ZBf3qJ1Q3PVKNZEBZscjF zu?LxUs>~gbj1t2k4VqMl8MXaq=1{54z-F)WF8Ku|zi)h7@=mDoKU^Vx$Vl@Xotr4Q zkE#NXFMI$$vC_l3GZk)7Z;tRQB!Lv~G|$FY*)pze z9eqqrzsgn*bu*P9Qj70rdMCOPVwk@^AND`YxLx>X(xY5!jo=opdRVt@&2x3KzC!`>g^IH_Wbydag}BpZ@<=~n zRjarryvmB0aJmMtR*ERf!*83|tOAaH7sM6pu-?7bfF;{iOsO*i@v=SwE~z>z==Dtv zF}HHm_(Bt>1ADh}!0p`^kK5=tA7~2setCxjii9MPq_Q@-K-EDBusvxYj#V7 z(3Q=VfRQRbwHSnCfwSp3wk0BRAji2F_8+=c>pl|~<8I!+@b>VzU8o-IA&N!>o1yGB zVeI~$gx(k!8%LiLhWCkuTlaRK~roHB2tH1}Via_UE;$cjoUn&L7Xx`^rB39MB-^ z?G-~l+}J$tSQCHO@#>AApI&XAcaX2m!69$P(*b6G1Dp$FM@z5D31idRv7C689J|1# zVnG^#APCEE_ljHOkl+}l-+~Wf^8WpClxk|MN39hj$lQ;ch2K(bGc+MO9ZRoLKM!=} zmGF^l)uy1L090sESh4=;EkPYl2=`i=8}zK$igGU^O&|-!BeXwfKTy98=`W^y;$btd zb8!gwdomF71_Ye6@nN~qL@U(6-9)HBxJTu`0K^TA^eOaV%<5usG`J(Db`57_;`E~_~3 zBpg^eq4VM=$MfpNJ!`HOWmdKeqID#U}!?I$%~s}BQU-e zKWVm26eJxzH{}%obFJWrE*f7jW|m8gA83Jo1Ssmhj11>H)0Sf&*Bh5zQ=9sdR=088 z<2+<=0}qsUKLD2X^-i(wlXc)0ODj@w8{W;!{A=*JLK7{kcAgURq4R@hp=U=7U;eQ( z#I5_|^`kwdmcRM4Y5@+bJzTsK%32uU=}!ak8>Y$T0`ly!+M3T{1BRUiyrt z25%z85I3yd(D%^O91Y~aEEkM(F-{*FLLNJP>@_OQC{>Ru@cTNl9(=4D^;W@e6*S`3 zcX7;pl)LkgEn{B#K{;6}$Xs7MZS?Gy` zM+3qN#{vX2tzFvQXwXW(6n1vt9qP|>JY);hgGfi5)vM*jG&@+XS?X*1vSy21jKhX24x0;Spjf36avrZ38NBnU{mJm@j|)N3UCw#3y`;?U+w=O) z^Eb1wUahTVLRWTJPtL(;l-Ieh_ds=Lb-GsO-W?zn*SI0S@Rxw#haO#eP}^@{eJN-_5n_G}?d2JDy_6?uPpJuLu;y)9 z|AI7^n-Lt;-KG}GgSZ}%NJSvy|%vnG2dOjRN7n{=&5dRM?PjL z?pGEtsm?&hj*D9BZT0!#K@eThWG z>vndlALrvjh5%G@SdaevMF<7SMI2PE(FrG|T7NGwMY{{s*0b#30q!S-*d(vbgnB%J zQ4gdkdv;IB5a*_&m^ViZ0n53*;~Cc0F;o3N`WH%UGGg?94D>wT`~`zI1|haHJm@QY zpNem7#yjQe>54ceh31Aj9w=~|UL-P^##p^TQAq7K;!&l*Bq^FpEBOIXvcEoyr4T%BTd1;oWdE$f#_ z#=qMBCd5i7>`x$!IiDlfXn}7QG}`SNf%L&*5T+SDn-)N2fRYX?sC+XU9yCMPcmQ!I zzILO}SYgVkFJ7Pg&pNN2kG%tBbJBff+>Z+#aKe}X9m!@O4ZjKLD{@jKEB|nI`TXD+ z5ZP=X(V!|UDGJPPpWy=lqM$Ux{HIX>Nvv_b6~;~L!6y6--_*cG zK&J%wc>xH|3ls&|OF{qnt5wSgZqHS|?0(Y+>+5{%XYCu+29v#r-X~hy{S$BHYss(u z@mFrPjBb##lSK9xihX%=faIgho}du=|I({0ZcA@vIhhVP`$zAU4q*n_P|Ybr?Jp}H z8uMXmqTpJY!}|?SudRg@oTz2*ZJkMObPN=|B-a6#0-=bbA*l0bZbEku`dp3quzy_g znG-lE_aFGVMJ!8AYrzdRA0pIk2kC{eL$hA~+p)$#>sWhx=yb_|m@yjl`O?8Z)>985 zJqp~QEdqS^zxmdTPA)YoZq|58oUmO}t)xe6urPCh%514AO#Ep_pF*oS?XD^Lz?^e$ zFSdi$AP&N&i4+Q0VhjE+8wQpAKz=L?Vl7> zp79ED@yX13JJ7Ay;g2;p_6?$LthY;Pl*)8sqvIZ9t{ES!7a=G zW5xcYt+UFyYR3oH?mfnj!Aa48o+Sv=Dm^L%k%oA<>rza|nv6t}VQP8*w!2*`0AygS zTT%rBHqqjk`IONIgx!G!#k2T71U*O*&Vtl#e+SN2ItWNmTul|4DoKgMIP z&!D4*d4`L$=6fc0GrTucDM<&A(Cm1{Bo8-aXferyPx_L^d5@<(NDKiuH7b!WL=XhX zV3Y09@8PXNM3sduhK*FP`SG;C>g(KBk_X;XnZlQg@cT1)IhUe zn!f`AWED0Z%&P^$Bo||cf^L># z_O|%u@MpVH|Lru|+|R@GOA{7pm}y%6@_R@JjlLt`?We{{-Y3le{A98~C&D6^6@|UW zJ%!wyGbm|xYJc=Wn%c|R?=g|7DgprMJ4q4mY!6<{MvfEtL({w)J7 z3zs8oF81!r4jnzwjRaZrU_6DC3vKK}J<$8|3QIx%itb^hXdA6e48JV9Y9UKM42`0KFiGXUo-CLp>^$H9e&JIl*>K z)nk@~2%jO%Hsk#@@ef+?SS5)Z1@BVAmU*~->HU7$wmA-}Nv7W=p!m};U2@Wxv6B*{ zozKn;EZ_J`zVSAYm0pR-q2q^VI5#{Es+mEhhmQIVqKx~VN3x-+DD}?6>oFYQ6C3aa z4cBhHeZaF54S<`82>&Sa-W0f0@Yl3Q%lO6I@8-GV7tQ0?d0lHk7Dtu19FAU78Ms)6 ztf8alqe$Cn@C*z~(*58B0>_SkgQ8ML-;$O0j%X?ox3 zIoCNrjvFJOo_D;>;dg<(uShLD(P5!nhfmY1HbVW!@*q&cRyyRu=+*Bu$YpOzd_ARr zCRp`DbtWGCRPp9O+4wB?%+M&x{oRJob_tOI8_33Q7?y51gzD>akTf3pNATOM1K10t z?~5(1=}*=4Yynm4y9Rp5MHIpMaL5Zu=n)y)24L^8@C_XOfN8!;&`@3ICYf*Pp|ynJ}i$0C;-v_WoEHpryP7PF&e*@o+i9EOD)gazIAR5TNiNu-c44X-v|{ z#^h^Cw8kgAq|xDd-ToE7H=Q3g{C#Eirzi3*uk_vM>kD}tqOolG&G&TyNV$>ZR=xgY zdy2L3Y9x{QKX&R%3C>y*|BHt=-4|>WqPIdIIO(L-w^Ul$+v?v>Ljh<9a~PO+I0k{X zq^Wh%spCpWzYK%q!H09GlTq861(c~leUg%F2&GQS>*w8J7mA7V(81EfTNiuPi)AY3 z%b6IHql0-w2ilIu!r0erd}p0OdX#1w2S?**O61xF;E3i!jlNQlVj`|W9o}9?7DyxR z89rdk6f0{xoIL5VFVoD1>)@dWh^w^RoEaRHMcK{KV$Nvff&Nz1!-xRx6JYS&+nA9- ztpo~jb4VxnnYG6coAncwt`mo56uthp@!QYzYOLk^ zN_ofy4(Kp|)4h!Qt%P}kpd=;iHw|OS!=*>*P)nQ)zk%bUAig63r8~8(iZGIY1{XMw z^KJz8)&*LENO`n8wiL`9i+v~~07gK$zc_G^G&&)IXD}wfk0&$6Zadzn8#4oePj5vM zc$#Esfm`~>Y!q>r9*eMfH+bFrmH_ZR1r*Em=l?T{J29^WU} zqKvy~jV*M&b2B>ra#9CdYnG?AeMa4Rs>g+-8E{9BDde~c;X|X>ehaAArMO@^=C_nW zyk4f7nTX~(^j^yTBq-_YfX0ffyDu3(EHEy+GXPRX{j9_46(GAieKBjYebQPORM}>R zsl4p4|4w*fP>jPp0lpQ4&<0+zA9Wfl4b1765qP-o3?LyMtInfj`CPlvBiR=)8;d_^ z>YlQv#WE`3+SkG1rS0V(J9cTm;C9ejt9_X3b-Ro3e^R%hm>YXpw-3=ZZEUxNm}+)2 z58;)HsyeAw@WlJD9qm?1@*=39R(gLluH$Bk@kqb=q>NNtmthPY-NHkbW?slUI{4kV zUL}Jp%y6CvSl>8gOCd22P`eI{PP0+dz+5&DlP#m#aI~Nth@o5$OjobssOQasCz8vQ z=5SltM!rns+70Tb-TOClOYEhW$D+3MCOQvQ03Fi%^J_An3c9YdwkB(;XU~jQEXP2j z>(sd@*qb`L;9N3aikzPzuw~Q^8lGL#WAR&yNuTqn0kc*#M>)B;eOPnpr$vGNi#oUs z$RI%qQO!US+0axneu1687NthyPzLj@eV2`U-iDW~dhSt18TKQ{QXLvdBMJUrF2Zv! z5X}76sSHC}yX>3p*~b|n3LX=yd6e;};(vH*6~K(fu*9sc0?B3CwZawj1OG&9#bgeP z3uPixC*qM$U+nlG^J_mpNYwsx1K~5be`DX z9d){y#(ipsxzQbV3%|tPJV{r(%*P&B8?wefMz!*Z;~wKj{{2JUD&uTYz}Maf1^))b zy27YhVRiCJAG(eu&EoV+w^L_1mySKh$q|cE^i;eCSbq0n7r~NmA6QQu;OKAOf@=XG z{e@b+efT-8?}Ki7?j(JaoGpEG)1P0$FVl4$Pl2g*J!{9bHqTJc(a?Fq-*btu1|Cdf z20;L5{Gkd%lYYceJLilHt@}?edtGt9nzb^Zwa%Xy(Okh5=|c`i*0v_zSXXu{IedBl z&NExxA7-0@x|G~cXp^8FzPCZjH@RCath)Y!qNPnE_1=|c$3VQjXR`MkS2i_Z`%Ot+ z5<0gpda4jYVs`3&@I33tGE}aqIG9VxPHC=$sRt>z`*p^rSYg+zjJd-9`Sa!lhaCQT zp|^17^$*FVwhCu0y|XRgN%oThlS4E?xXaiGlgkKy{slo-V&gBNGaZwJL-95=82 z=qY@Xw7%ni{Dh~M5eN5oWnPlqFcRRh?tuwg)w_=Hm5=KG&HL?~b%k;k8@Or5dUg>2 zO3%I)^Ix-gu(N+PO0t)$e_(p@3~%nz!}I2jBvSop#PqywX=gpyw1F@85XwjyQXxza ziPPyWj>@qs#d6Sg?N?{Kw0#*%p81sLLLZ&WV{gPRXVU8Y4Ex-Jhm8M??{=fFp9=Cu zWEaTpQx27flsZfR(Qf+9Ywa^gsyD5zUk`+w%QxtbO&PMTIu^*$*_E{9LsoT-aBZGu zh*0jaZeI)4l`@S!W)EThjqMjzcaIg+`bn-!OfP-J-P2j)zWbG~Z~jhS;XbtAah%VeHTyi*1k9*EfY!ZFLnonqF);HTcALS|;4O2^M1Ia%GVsf34WP6 zs)*rgcO&orc@VbdWp2%PX`oHxok(oira;D#mj_2lG#qv33K*;vNnrMDOw8y3kn6Bf z-H1?ulxq-KJo+kjQE3fj%IpR_L}pE`%8>|my@>g?xSOe=Bbl1fPfwflE+B^P=D=>I zM3<>$5^NqD$L^W~8=d(7n>g#03~*`GJRd>ns^yfRbgruV>mQwK%VP@uwdQIEpBnE& z?B-u6(jay%c~+kbAg5_)=yY=cc4jJ|7#x#5>L|lgI-QS=o zZ&A4Y(fxa1eNn0=5kzYRi8NnSCsgTQT;=y|Ub71v2(zKvUsfrMF7`QC#Rv7^CRPE6 z!{l16+Xr>svCGI8;OrEHLF~<&+jsGczvY5`A}YD~J!v$y!==^3y`~Rsg51@e7uY*R zFoZ=@Jp~_#RX4A%K5}@S?Khj#`(-dr%FPeLca9~0)57$Qy{?1rB8jsS=Ah44XQJdn z(n03BlDXJAt&EkhLrq`)Tu>-B!LJ0Mg9*jO$yZ~B3h4(2>LC?B4AmHih*Y)`W;P!M zPh^5ze$!Zzg+*%>@4j9hlNQ`Wi;rN|D2VPw5kzm2R#Fn{u&5;NQFuR@@J4ruPg%dqt$bEXTM^8B*U(iq1vO zfL!`!s?|*!-FZ6YTm7YKMbQH9NfpS-T@83YAk;JC6#gNd1)Od-vi$n0-anOr(pH3y zZFTUy5p>A#fJ_SwKuC;wpi9a{V0-RCs{3#xS~vJBA09&B9IzYYm@Wi@o5|7I8^S>N zPi#_TbC2K$8v)*|z@-Mo+0Rz+V2}3d4(1T;mj|)&dMrKM@P^&^A@RLfuKtT^g@b){ zRGN8*IL893_9_aGzEb~0?~TH748>Nn@3&Sh@)2;Ot=emrN(6ycjt&?QTP@5$f6vn~ z-XyMbniP6~r5?Fc)&ncrZpSaM=BVj~kD${$vod(Z6sgxKBom&MMz`ZH64teM+_bba zOo^FkZ9?>?P-N`aMhjv`wSS%=o4^9VPpg*I+BS~mXM zvPJNB5;2)XP{V{tYaVYnsokCli#K(n%#bf-RgPBbH2Ky~(C*tWHlq$zi#2K-p@?-$ zC(KkbV%mTlHJYk@qqYxB*bU$T^EF<_Yu*k2Fd4d`RkTMXLLMP-IP)Sw7NbXSFAHS#Xckhm|O{xmM4sl`lQsaqPQ?)_nJ0 zo-u*KNi$C^)+`x13D#QVQ^32(F+^9fTpsfMH=4+B;&^clN={D5?~yHE#EX-Z5^ z)OmeJb{^^)59BO`lr8Xz5Dc0&;bguu5MNaKmJNMBpnYvKHoA|=R9kpY=-R&dOj*lA zYctQ&@GbS#PlrzQm9&}p+kOF2TI<0yGB-KNSs&rO=y+&SUgkBEPx(r??3EW#ZnQmi z32H>rOH2jc@T}kXKLcnqpR6V}@K*o|$~y<5)^_H(R&TRW3B0t)QQ+_-fUKW!XoN`g z)Dl3}hNG(bNXxbO7}9Z_{>ei~^e?H7Z?^1vm{>6N{r33`cgx9Gzs%ll zkkyKt+508Hu5%6?Bb8gH{5iCZ_NAH{_Hup4<6|H7jHrR;N4~c6!5akEfEC)qyRRq* z54MXt^*kU}fVC)Ib@$cU_kaGEXnkVO7(^d0+scL4<~2tK8^HdbEb|Asd}T4NF4ZuhHK|gDFoBU1f(Dg@&wc z@{DylndY(=;wgc-jG^5wx~bbzU`B^GLAQAe5OOJ0|4EulKiP%7*H-~wCxyf)-R}di zFcx}X#MV}Y2>hxZquA@!9;d^Erk{oj5ZK#1yCfLC9oUz_gHYK(Brl`C6_cvOrN^u7 zVyk72!oCs;3j6bS@l6hlA+NHL$E%P=y#2LG2tH6BFJY%E_sa-SnFO842h|P~UP%w% z$vmoJnmpwneabJo+mYD5ZP!f?|7)^i5BMkoL+vpi9w~*ff*%1f?68YG^(#`3VRi0RBf1dhn6zN5E-(Q<_b@uBnTx=l;b^(h>5Ge>9Ma(hV6Muh7rgpt_V z?PknqN}2-^I7_qj8in6u0}cQ=&>pdwfg4p~d|N%%0bpMq_3}DgzYM77f!Fb|0Rrfv zQa$piK|0iaZ#6vq{`P~NdCBp49!6MID-0^jx8tcDW+2kzv5|uHnalYxQuO+6R7Abk z1!JfY6D&|*p0`5t`%t@;!0y)li&99O3a2M2Tyvy_|FtinTLKms9bE*#XVZ$R3KP3- z72SM#vv|v? z`G`Fa>=8sqL_htAIqI;7eU5yjqN^@6I0ODl3j7}h zXBrOm;=b|k>|-`#A7dN)l4a~;iCJt34IxC0B`Fe;rc!4%YlujcG}h2IN=4C`u{EU5 zB$X|VQcc}!YX4hh5`uBWBIpB8()Fo5eBLsJmFfL?v^eIz|ME1;S zHd~cmb=!YCOL45|WI&Y&EY?;&zv_GHLaw|$TDwqN5Pn>ur> zyS?qs6k=G^WIv6K$q4?zLXQeD)*O&@DgD6`%vphm<7D}Qp)UaBS0;KX3ca}KwuE%o z$U#y#a349KCkH-L<0(w8cLsJd6_Lb*{L52O4QYYl>Yd8RE_|*v{H|D>HGYg8w+QA#gWDAxC%! z!UJ-Wye4%6-{8Je;opUTJsumuf$U?U-eut4a_u*M)7!7uyY)M^U3lO=2eDBMWC6b0 z<**RjXca`uY=o>kt76A2?quRwd`k5#axrU*@%0!?D=bFoM%4JSWzZfNW za`7)>+YM8*8yX(G738u0;(ND`Eh&)efAF|L7Cc%Ww=5!PlHh0|cvtx&$J={PZmqLcL%h1b0^cWS>{}c1J zt?VWfQ^3qfW1$u~xPd&@3d#LY`9|+B?oR^uh8W@o?9?QbFHoV`EN%(_Mape_sC!Bp z!ZZb072JfkzX*2KS)Yu;Uh)o@RMSp9KH$y-;fi%`#p@`i>ZzXv4#?<60}PGPhDU}1 zFN<)}=!sD=gu;OY2?2^2qV*OqkRt*B24i~bR=6_F4H{ium1K_XXR(>(Fbq{W>>GH8 z*nstnaG$!@(*wG`Wx81+I#NbO`=#c``k;@qAWV;&5z?-MDeN6A|DCY9VrBEA3SvM`ZchfE$741!5#b5`3=w=)j9rp7|H=;$PPI+ zTuk`WAjuJII_*^Hl9qqzIjW3YxkoXc^9~t}M}$yecY)x-Gq~ViEx`-0jd6oJf9{?W zp;yaqW-Xn$EJJ%S;bCK_)Srdj4JpeRATc1l1On&Cut^x`G61a`#=T(bWQv@R>v){g zws`kQ%iyU$s#WbhhMUc&^UtkUjkzx=f|g|G z*dn|3Bf)E8t1I41Y$i3dP_pE?_xLY-|D<6eBQfyNNu+@&qvrM>w; ze0`K?_cYWh>XBMc`CAWLk;HC&Fa1V^j^6Ysv!1`NWc(uz{YM`qcxbrmp$bL^zz6{3 z^wurkk~B;?SWxv?y8`eZXLz|4=iTyk7w*z0VYNSEqp7M|a%i%KvU^j62L#rviRpMY zo;<1K&)dW}0_wtJy2#M}3{0XzX;p-t6=C(_F{|R;>wgKWhZP9MWhr%^@*EYsBV!_V zK&e!SE@i^s%ON@V^NTE<9SYbt7Q&2*-G>INw$C;rpm-LDDptBH$L?Z+{A9IaGmFlF zV?90izu_GhNSK5SB^d`jCdL`C5bZ3`b0N?!l$KoHhfz_`&Vq_6Ob53}#{CR|TYW)p7qZpdtOA7SF*)ytvIHixbuh&<~Y z9y#wJD3Ip(?&`~4!p}zN$64o_hUE1Sk%$T3bwK?0Y8s?p1TpXV$7HJUG3aHoaC(7? zn9e|bD#MzVV~d%n11jYK83(PiG1OW_oE)vO0uPZT9Tyg)Qc(;cbnbs%xM~}}FvQ$A z(ms5{XYV|-aj#=qzLo;sBt*ryfL!~~h5oRxySr1Dp4k7nRwshpl_^{Q@w-`J+Vl?c zUjDzjippVq?0O7aCPOpNSG*8GXFrr)=HQH2caF*Y*q3|8CIaV%k8N6)4i_qQb6|rU z*aR7JI^c~aQ@LHSQuaHwRQFt2-LX}14=erEk_f#WSc-T$*?fJ`sQhyNqs4&usgH7~ zV+P2K1^?6lAqg-39EYz@kl+GuWg-=cSh9KX;mSkLK0O8Ob?ueha>xQ}W`PMC5}n+T z0sq<>tycgDw{V5ZKU0{v!MIt?8r1X*_RgsGbegk;`HM-6(b8Vq(c>>L;S~e=303pN zb8?#V8)&~bdH%}Bg}8sNi1mJWej-PIvXtW(8CWV6aZ9#wR_!yGiJIQB|9QE|nm%x? zHS4e(k-UhwCnF~cp*!ke;c{#U(EQ(&0jX}U%4eh&xzhiYX+L?u6OCtICuGtGYBmZG zea()^CB<5aJ4}vr`e#1S44J#7{Z-}S=DZWztEi+?mRq$VUsz=?g}p|bhm_hve39Q{x(q4*s-yWEGL&-Co?3-4AVD4WBxIq~9m%Id`RGI!2wiBgq(LKcTC0kRi@H zfQ;9ZE4#*OofD5sI1&RFv)Nkv1M&G~E;=p?D5LzEn!~J`hN%f`fa{EVk?;ZcDgy`G zfQvKc<%g7!y^n9IxNZcmutNsb-pL0*Djz0Wj4cjfA37`Ke>H>mgRmY(hgT-YnwpOt z{Wp-1`+Sc%G!XEIr-;nw3-W0k@b=P`y5H3N(n@9-286d4!eetMw(L8H*mZ71=vf%3q1+t2o7dshX@0(~t*{NPrwC|4+fCcw=I1EZ+YKvo z_Tn4tfm@Fo_24cy{@sxaV$;xeVN@+^Plq8hAV%e+a`$6a#3`T^}ot~?=b#)g3 zZger_HF3vrp>c^vReN5~;j4QJkXvOn>F!VyKW!}ZI2}@&bx-H>S%cnlwR*E&h5PUM z&7z53KUOw~y#ADUDa6fB)f8TBU-)-;;Pa86A$r-1uarwDnT>Fi`ESSohT)_$s0SuI zKB?|rJMdA@VM3&_Cl(_f(u^L|QS!d3!b1?cB>81woG}^z`b1bci_lLQ7zBiEO+olF zB}cTUEdg9-_>9RzxwQ%XgUFlzH9eWQ5X%qo=PA7f`@5?o=RBKQ&rMXPGVT=SpP=+e z>%BP_3sVKW^#OchjwPhY`d>+^N-dRsM8_z&l+bR;Vjx`+YzJNS_3Kg>F;VzqiiqWpO<{B-s zA^p2#KiGBPqIZg+(GNV$!@-bu2y3>}*knF=hYaVL#tPISRBPMPN_GpHG;iV=_HRS; z(ig<$%Et7e+!{VEmy5W8go07?fcvaacUmm5Ze|J)xgfn(kvJ#lF?MT|{fTGu3G92X z&tIrPY?L>}JnhK8@JDD*O%CS;Ud}OqX;_qn7~_%aa|2G_lOEFWS>We&a_4Ku0vP&X zj|)`GIr!25f_ausfz+(jz2uedJ3^k_Z#)p+9Z-2i!7$%SgTv%q(4v&)qN6^jdXQP15c=V^oha_d=vJ)Sz1 zh<2h%Z~YM#pCBk3h9lLV7jAR-7)R>T>HlLPLIAYKn&SV$DHOGEE-*HKdpH*NGG%2wETa$z7!k#T4nVlxi5Uab( z4_ycvXwrnZB*`C^U%jD(SP&-QL^TlJfkM;Vd0c$dpeo4TL09-1{UlUdv!`Zg!;S*v zxy7O}eRzFWj97iKho~}|LTVT?FZ~?d#DOO{K@G3$+3nM$`sr-J<%8UFDnE@4AeK_v zkwwOX06>4#1asTjAwByB2(%yu(glySK+MNxn{_xYD(%>d&`Xk_V-)#F$|5YY|G`BM{dlji%6!YrY=|r)*yfZ~zE87JM{3*#_fOQP zWQrV}OQkxcOVRs&3w1YJ_`3m}yqzRD+Mp&i#x&peTZ;b`_gJ1~xas-Y=-tWNmWR!n zZ~1*6Gxz#F_2K9&gyb3d@EWh|AMVe@VZYz|Q{uZk9uyrp6R@DX)JLN#O(c0X;0`6UV+=4yQ6bWt9%~-MT|SoQ`$q4<^BG&wSWp$p#PBN`?S}DO7+xmGb%VO-na2yzsBt>5GJxD9=k7U z%{Bc?Xz^GcJoE>&P>oG3X<{FL?f`fFsVG3LHG(NuI+1%zo-`<;-u$a7fpHAO4`D80 z?Zx1*(^mP8RRf^-8rO)w@o(%Xa@<;XKA6pMq*^rTdgH<1<78!h3ahx4TAST!Y`;`! z=dpRc8~6OSg(FEud-NiTetdkZGpwiJpW~7AnO`x(-nT2tlDm{&oMsyI>J;uRY5^zS z1{%Ce8ctT2HYdFkm4tNhx>KfU=EPc_doy3>d_@9|=LIn##izII8`9;doY1u9DD^T2 zv4PqjwjH8=U!;mL`Xau50OWZf#ZRva0JBaNWh+QmD^KZ+IjFdz$Jr3|;;C2{8?~wX zk#BXXGH@>pO_)f~ZFbMbxlgFiq&ljdUn8QDJh%XUMx`9HKZW|-@EX!K9>3L>Svxv; z7kt!S#QWU8|EPKm)I_SewR-$gJ3c>F1Ys=ltYus@39BZ8cs1~<&YnO97DL?E?KKh& zssa&=a)_!NZnX$DUE~c}@N;CmT%o<*b~kmC;{KG9oPbixC0*zsjNstV@;{d+1;WaX z^S{8kYdkxoQO7G7tUKRiv{pCD-Hnf1p#eFfveP~8SMK60)i2a5l%PWGj>4 zZ5}Ayy7e_LG+-zmq6U%j?X-Opk3!tyy^;r-L$X}rDR5)LI%HE1GJS9L%f~Js=LPnp z+aEsIGQNOoYSeSSayRXPB5VBOWIzflPw`$|FCcFhtsq!PXure%7XtLlz~9fd{<`ru zbgM;rEhi43?4*&DwxT*R^0@O*yEU*238K~ws7ZP9Xv>J2?xGnmYJ##_ar$mKAKC;) z6ZvtAh&mp`rlv%_H=vOPATq$j?GTMXh`$2jvIcKL73?PE6QR%(Kim)`u;mAdhpfX+ z`ai*Z17YpCUXW81j||jSSK-iNT+yEX8RiBf0MwM^pf_HYmEm|5!mF1l!IttV#b>?l z-e?+eba!XmLph0KJisHySAN`0K3s0Uw$AhV$q(4BqTFCTrJa{Z1yg^QcenF5{@|yI zxlMO*Io&3=k{%cW`2-3ySk<(Ih`SEk?D5#TkG+yQ%lWn&Yn*c7TA+G$r7``X`vz zW^?Pw93YMar3>MEQ}Tn$&5p8QdMVJ3SJ;l?4m%D%@-djA$oFQVJG%c?Vv4+&ZA#?^ z$94W`A#o00)`;&0JQQFlmG44=9+H9u_<+4fs3mtb-MUY#E``vSA$Amm=_Ic%0do-P zTrw!lSp%~1AUilyCgC;hNsGat>OaGD0e@GZ?Hf!$aVO;q4v|F!#)edg^7j@ z(~URo7=0;nU7l2GZ>%YlxZBbpMN?2u4`XsrQ}}{1pkfW3f9%|^Y`9MuPjPDffzFC| z@_%i7(?^AV)_M@lnSBppG(MR0pytTA3_?Gm8;)n4)0CXktoYwyKy*ovzGgm7&d-rU z?t5}@KY45p*rWy&o2a^z(-QTw#Z0AgF7=ez(%3EI%EYLviEX;u$3aQkz2a-QF=Jph zfnU6#bG8S$bHXKYY{IuEcy1P4y!P-U`J!zhzh)7(;1d!j;(zJ@d5Ab4r+Svc>pbLq zRg;oj`MLm9Y492PkD?A>bXP+zRbQ#GsA>e62IQfo{9HwT=d{RLUTGtw9Fn$=(dIEZ93=rk5_CiEj$20H8dLhib*}5w4rI~v#ZpkzKs9dE_Gtf98 z9GenLXY)fk3q0Ab`pq5YPpm9I04l-&yR|};{KS6~w?C`@vu_FpIZAGo{?pS2=*eK& z;(}Z;B8SA+UV{)h#i?<{sZYB<4_3FAYwX`8l_hYzkT;JV2Dt*{>^Qdrzk$R-2x}5} zxQUt~+@=$F+i#JRD;4Cz?i`Qk)7L#^^TCSL4XUT&5N&kpgva0i;}jRUYHAo*Hcd7! zxX%Whq;9@z7tZKa#owF>C0!v(e!gU!@aUW+{tYql%F-D*b#4H%J{U;`Z+C5;|m zfq9a-2t0iUiKk4MRu}Wt7rFXu6Rp}x7ZU#n8~DaLUJchx4Ee@?7M{m~b|QO_o0MYH57cjc0}cOpo_Q0I z;_3JG^}`S@C!z&T56JuH3fFc`AOD@^THRrnf}ltd&MuexGAw>2O8>jzeJEV?qxOE) zs76E^5GmrMX8eiiSVrIj7_W1?KmToKu&2da^l3SWg%=dAr&9Z)@_lvk*Et z1$s!|t1q@rI}Xtgp6u*PVdxDdl6-HySiG%Ac%u8T>k5Y=C*J+;8~kwQ>Bb0Hux=zA0@DjQTRt zsJtd=Yq8o{R=evSw!O=v@yp{UdzwUovqm=MPjC;6`ZjvMzBIVfMEMQr%DsHxPx+(m z@E1GaDz&VQp3U7$&J-4L% zr2b6xt(Kf&>L$Bdzt}oWFj>Yy?^}m^Q0i@^<_60WHDqYRU9K+E6v={}TdZnr6~?je z@565?Aa2?Dup03@PEg3VUK1;`bd6FF#o}9Ov_f<NRZ@xPYq^w7&J#<^Pc3&`9X`E;K}P*BG|3bj{9W<%d}dp?}npgRs@(4 zDc506QItgmerbFi2s4I+Ou0HtwJ&dYYUXtBz2kR4D>iE?!|a_M0V1WVSYcHlZ4jp= z0W>P#Qt=6z0@f}Esb>^8B=P}^X|1Vj6T>`YIe0m}Od|@ku`q9c0Hgp1C~SwWeT={U zW-J2J8u86$V$YYyv+L1iey?r^&uDJDK>fl~DmU9wdaw3Yu*7-zbX3u)KcAV-el-d% zIcheU1Wggb_3#m&zN$BT;?z`i=qws`{wi~y(Kk?l-`EQ@XY%(kMIqZQN*zC-2C0H> z5BwreYYWUs4)yAJ=0B&|VHSD(!{12vcCWQe(iX``z?!!dg0@(}N>fwV1;fse*UNe7 z3T|#qV$A|AyVD+bXNA00WaDuZw_P2TuGwvAdO^vZ4rhd~mo0j63Gk1~03JMl z<5xiRUibrN)$u<1S(0AZ1uc9=e1R{-QUQYe= z8;?Dm&6Oe!N)gKa1-emS66G{`QDX7HPH!ChFASOOmW3ZNlnMC)_}_){uW!mAJfC$u zv)K_}XbCk~aT=|>cuw`?3raC&&wb;-ljdIq)^01NqZKyZkrpGT-i!qw&Q4ldxj&+5 z{@0%jqn|?~betUI9+hqCG&{qvWsb2j`Oncmi zoPCuRVf7m;&G+Zk!)%goiZzTMmg|kbpKxnkn6zgr@OJrUVD+lfCZlaNm}_qr5~Iud zrs{^i?tXaT<76m(%hPI`)p6|)iDM5miGM9WoO@+_Q+cX=y*Whh;^sWt%v*}N{w2yq z`}=owcegZE*n1GOB3SaFf|GVT6~~q``X%Revr+lxhd$nSCY5@nt;9=f8kE!m(u~(1 z7w8=Sl{G$6!C+`$otlm1(A7z``@8oGL3Disik!c3$K~p>-26%7m(XM18g{y0KoW!q z{lPCqhO>YO3s`n^8=bJZvu0Fc-?|6~>?YRwU1l@JAHuXSAdHi&kUQi_Ov!*7rXcBgMSp?}xuxn}dlT90rH4kofyr~}Ms#lbh(h$hOkGEKZ?pJQ{Rxu67 z(hX0mZw-9-Wn!yk&}oi$Ly+VtEX?9e$VQ#Jt@1@2llO` zfvB;AFu+M&O{3-Qz5Co_iLU!~6lF@o#tw^k1TtDAd8D1 z357lTYvSkVZ?C8{g=c7QRurt(?q1{p*|7Xd$3#36H=7Z>k9|Pr7%hO?uFcS;bc*a} z-?HkMzF9oJ2vMD{mQR3eIFf`gVAB$3dl-jEM)f?!hkHU)k| zZ@L6}cWsM%M)eI+MGP zXt{vQRlZ&E&`-U8->9~`ph_tZuVSLRM#b}x0_37p4J<3~$(pn@yZ$w@A?RQCClZ{g zs8ZePtNcXZ;}tVeYLT9m0u-_oVsZD^fL4HSN9*r&;(<2ChE|!tEZYcRvfoB019{q> zB&=g$f!ZULlcC5*Y#wCRr#5FDGc4B)wdLt%hZ7?J`I!3%~6>p zZIr*Mw+W{r1l?5QTv^#N;VJ~L^bdRRHGRjoSBT9VvDtKG*V8d;fA{5h4XjUI-P8bn zX|kU%Cxk>sk(75T=w3PTLh}Ua9-ZsT>U$JQI)r!){WU0OIrCcWmBNz=o|iPcCvfn( z&MVeoiG%?-us>H0)&a(K2Wa;b3Tcp>MSt&!cvIVrMatns6WuO(zO;xcnjL|XU`it+ zbcb?-OEV^SAqdw(F=$cIOpEFklvhBEUr^L-z3Hlv!%1ca6%(6qr%%Ory{~!+-n569 zom_`Dy4>I85waI46xsS9UE=Wh+Sy_y17K_BLB8dMq@NH% zFCJ-YMh_)*3;v^pCkWG--Nmb&2?ah2 zpes268VTR?VR6w4+o(d z!q}6aa<-B=NFVOeH@be5NKRhVAV>S<+OW;^6zXt4Wcx}`P?FKstCOWh7k-z#>_K&W zdI$t7B~l-1_L4z~%V6)-Rk%j-)^jfwKd=ZTd_Uv=h1efIIpPEhyIi60&ZZ&Ur2_^| z!%72r<_K3R;I>Fbq$wH!&ovNH1_(^k68NA%e}k0Op?$p^9ZX7TYCdtW@l!wEOT<|B z=dcj)v;iH};*+NweSB*-YL9{%uWNX#6dbV^`&kC2R*p~Zf|E~yoQMau|8r+piw)6Z z1H)(E1(d{;^l1vD0$1pWiH*!HL|~GXa1NSGL9Xu4>aec)f*Bzq&wh56E^F--MVq%2 zA+;NjDt?EG0ry7|Y2!-Itz<8NN%>3j+8IUC;Qe%0wM zxfIkasr3*YB&Wf6i}zliT_l~rmdzs*|7F?8IeC;8#YROQLwUYt$g?Is|IJ?v*z!k- zJ!)&ss{Qb>Z_6&5t+(15i=g#CKLqi554N*g-Zns;@G?DY z%ZmUx5I%4Y`~GfQoRp_m0@{ZUqU%ES$|2x{0ZVlN(jifHDV5^StG-ws7-_$m;X~lxzGarR# zS~Q;ZJbkt=4l9?$ji}fQ1{^2oHj8vK=J^^BwNfl0o#wjs#?59HAx)mW{5@qHI&uLN zhFyNq;CAZ1BCf)@2$?I{tvxsYLP^gW1WpnJ331kanjd7TlE;9nwScN(8X^FrJjIB?0mQnH|1C*N|Jx383@?_l z-EAXehn%+(I^aqkfOj*@<=msb7k*`+Z~MY~1Umm#pp&hKZ;MaHtE>NY>;&iZ%OAnO zy)ND3WZ;)uIM{b0jf8=2dJX&T_je{wTtUcOoN+nAwzrXY^A9^GD2F?d%3H@Js{pg@V|l-V-ozVa=nZ14p0}m7(TNj^U;G;5`ZUh(t2>s zteB+D)E>X8p7O1EGioiTtTddD6xYG0PMU-+pa`}KV%He5aLd;Y!{yx;ei%etZ93qg8I5jKSq)wTf_vXVL&(EhJ<&L=)$DR_ZB_ChH}Gi*^yU$ee;-WV2^Xj6T^ zd&DOQ`es3FMw;7mv#fzq95{Ju;bxeB(&&ej`qD_$!r>E3PV`O3>N7d@Ox>Xj%U4Se zCEIay3o59yhwpgU*K~LQ<0JuhLy#E>p3v6LA3KmfH1$Pp0`H%M_gsDIfHsqX?`7bD z0eCal+VADJoB!PEI@z6PX8SgwJ5T4&*gxbQfm$*~MhOVZ)+sSrC^L282up>2is^O)fqpdIml8 zw8S>)VsTsSgZY4CV>+p#eB~<8p=xeL=S$nzi@Ca&D(4fAW-*S?D<*n*m=KN%mG1>G z{2pm&ye-vCOCm;Z;?zIpq@O45kr>nfPAMFoDrBbyAD%{^l{P1YE}oVrRkEWKK&HlT zqHBI=pC(6Y=ClzatC5Ndcb`*`%Zul`7Mr<1fcTV^q|9p1u0V^xHy;g$SK{|Ig!x<0 z{IhBLRd2Q|lo`59V$9mN3IoG1Vp1~~v}k(NP_k`#8ZpN4kczd(#5<33qLa>$n*l8` zU0qCvt_v-#u8JK4xcXgyW7N#bd5P;_JIll`_ecM&l()avz_xVwg;!5@jcw5i%D=q^ zZn*9fpz{8s%+I|S(Web*a@kwqMHW){toYb+?vIziux~deF~kXZXzfFxl_2r z9gvQ_d>1i*>1u++(A)%Ls?@?fITLqNnzKWA%tHMaOl7#LR$1>7@)=?26yP;pQd&;c zrkbd?3~cD_-*${{Fi5jyfyfzPAcK$m%|)*5{;TyglFjHoTk&L{UUd%$(#)%n^PCH5 zJGmf30nK|XAiCnQ-`pilGDp21q?_{j!b3fS_6P=9)p%1pL7%wmizK8%S(Eom|2LL4lu8 zhMIuqL6ulgwNQgRCA?&3SwBY3{n89j1nro?{vBg<`!Tvrm)N6@rqfKR&`*9ZexsvtqX~Y zBb98V1|VPUg(tH#-UXoYFB%dGvi8fiLo8V97?`*rp9hp?3o61ls z=W95Lv--uB7U^!~17@BYkEn&n&N2gYE+3Em1f?|%}N}C{cpvk0BQo_LHLA7qLC^6xMsix z19-17@J zR#A0f?v*ARvH`u|9GCDN&v;H@#7^5oxD+=9BvOfzt0>UGju-FjjLT zIPN|d(MH!bVU){l0kYVD%&G8ovqOJoJt!nREsXbw^SDgIlW#f8!Ol_QXhwX{dvoo~ zYpZWJocSGxSgRnM?;)SuuStAH8d5Sqp8XkOp^J=pQROmB`{taYt1<~v!JsxtQ}ko& zQ~%LCIlVgMP*_&>COBJQTXgy5x~6Z;aZrZxbFeZMiJ^lD9M6kfhd5s~X^UMhpxVo@ z?j3*#2flJR$Ss@AIec&GfazF2>hgg57$5wbGry7g!~v3Y7O*zrI>o+K_Rr4%IY7q0 z-JgAo--Y*wZyW>#R_Sc)%GZ(&d;}ccX?8C~+5=L|q3b(|yE_GwU5viry{i`_K{bD- zy0kCaJ66*?CchD%bL@Xl8CXl4eReBZ^jku6A$1h6t%N`6guK(eEm018&(yed6M2ND z{cYf9`_0lX-J|D`bV-m#I}h94Z{N+^U?DN??T@=e-*JFfltRNo_s4wMedf#V(`u{d z&U{e&$-yCu2yz}gmP+t6ELm@3C^!CCEe2k`;S+vnCmhU~)2^O@S=YRAQ~%`l!Xl*K zsNP^^Q~y1m;GnrTJ&#&5cby!~X`FFsdy(_*m{@0$21>jWgM($*K`u5GUsR@=7v2HM zVql3d)qqCOnAm0zjH&~vbPX6xn(8MVLWRS;SrXLp9rkOnat(cB9T$xM1?iGNgucKU zD7QgpBUdMhX|qT5%Y_h+ja4%i(i1Zd;*gnvUJ)Ghk>^@tYq~QN_ub5q$cQ;}^bW-K zq67PH8i5J9YX2J){PF~Gb8r636UdBy)hdQwCB%x{Z|THw!S~t(ur^kA8Zvuw-Zxz> z{yRp8uC4Gwm8EZ4=X$tGA2bpnVG)4Yw@RsZ|5M!n$8Qn33qmab3fUh6-)rBN2hs)5 z+Ai5^_ynJV^c}sjmHvlAd0s(;lhQHC&42Tmtt-w@9TORqVExSJ^AC= zg0yIS@|9|h6E11bI-@t_ippCa81(%``R~UopU-DP4j{G6def$yh793Q!Y)YQSx|$8 ztJ2%a5sO2e3FkqfO~VLpHt%DKGoq$Db_7a&kkvXbyX_L7ST4`OP%=yv zWtMJ!v)y0TQAzU>okzJ^`GZ z^5wBkdhgU0q21Dl*IxU70+n7rdwWiD|Fkh>^~7cElf|HIIP$$eR^J*+97|Rivd?Ew1xW zM=482Wqxz)8Qiwm(7aEs9lco%TD=X5g$QHZhZT>Y{uPLK7NAW5M7|nQh9kQz!=QL&tTYkRq0I+n1x$^;s-*82_0uyk0zT%CRAzx+6~M0D$fC?f%#*hV$35*P374OY?+p0nzxK!+{#DpHFC>XaD9E3(;>bfSk&`fT{6HcbS+RUN6``?7VO#{96`Fco4Y6BCv= zTiko8dA~1@HTibTk913%$s_U2&f)VzKL@UtnWcE=x8YIWzmkyW{h<^!iCH!4MDuA* zO7Ph523HlhL3fa^8guVc)ctzxo_GG(OVdYEoQyA}59q{e^NDBpO8@_;6kk50`%(zD zmGvu`ec`?Aoo}gIFew)}EyQZ`0)Vx4BcDQ${aOdeh}{%)=#|>rZwseRuR+cEcQ$#j zud9W2@T<^2)PnzXjnY0Yptp>G!jsSRUaD$gOV-t&+8nrFeYtAXT72Mi4E==04U_%w zu}c!ox-*yl&W%6Phl)&Swax3{_8d0XB0np9$zR7bng$4xy%?H5CGH9R|qul zjPuLZfZK8Wmc#ly?RnDyVlp0M@=b_4NZR~2u~6yV8hWQzuMlQK(LF-0LfJRBuEsOm;7C9Ps z*nB-Q?KTBDP?k)9l>GeC;vG{9a+z;huUQOyUfgVH91{@ht9X23C%%a=A?3SUJ$LhJ z^?5*Bs%#8Hd&Vnx;DXbj^TIJg~DOPT~yC14q0WK<%#;m@K0r7PG(^x*eACKNWF3hgWdn@@fKyoCkENK z5JVZ6n(Gx8nPxKvy-n{I?O(^kPy7N5{@BO63!fo~sTFBt)N7aSTlM7pT)!QZMB`=I zit8d(%lxXS@$8iq5mU| z*Utl3`TE}!=)+d85!qA#m)r?{e)qU0TBJ#K!55o#HR80EpJ$%p*Zrl6aDyKU$y{s@ zaX)X%o0V0oe7aP;erRCXo2Z2p{3w;L7Cvq#H6K4p&ADD`BSqgOvHuybyzte!j_yn? z(5nWZzU58O1*Sl4iCIjhaMZ%W@qE^A<9;^{V2TgTD(T1_8@@$*LyVV3;lQV?-wNVK z!nyEp8X+Sc*+%t4HlCbD1*L(568a5Kl`WcpjV)do^#`5Q1@Hh(YZ)+TE(_`c4!G|Q zOM7*__ftqnkuuWsAEV9J!*-kDTMm}cKTcfz=#Z!91^fIS_c_S-Ow?v;j{j#Fn9VDA zlI^eL^3cj<9*eqmYt5*(j&tNV%>FIaJ~#C!m<7OT&ssUpa!BV^PIyc=Jg<{~rE;+E z8@|h7>j*XoyU0Q6vp|tl{dyWIlB!&2sDfD3VFEA(OZdB;yZUA)0jclD{gKAe2fwA5 zy!G~ZpGN=^?#S;g#y2c;1*kOd9PZEFf%as<17^AoF;kC?Yb|I_(`wXCAV`iA;M_^M^(Fm2msA|5L%xZB_YGvw_-_eMB(ud_iPH5Wv8}t)s%FR@LTqbPJSEZArnQjQ5K%mMbfIQx&{`G}dA1E9K zZxN*C+Ig>vg;9s+b^9guL*m2d@2!kC3X_`%K1nf|C08rbaO94w`z0a6UUay(>Q%3> z*47fxAX(reSJtVw&UyyB;Wp47u&>3O8_2Si8l7a3DdNTc^^-vfd067hXU*?5h&#%MF$NByLWjcJXcTC0zX#7Uq@wZ&hfke1QDplqB}CbM)5^FuBC9 zY$LVxR~XzY*@~X~R+%_omh;$zQDIEjpk)wzRgMFkyI?0p` zBXOx{EltGYs6jvfPlNs6e*0Z#sK$$0e+WrNF0iuO9E)Ck=HiW18TC}1)~P$Ebs7U` zQ&HzD?92PIJa`&z?Nj*y zSW6FVVFO573mW%xVk$Ibcx~$p=%HNS`sXuK=_v7K^nU#fsDwD=KgiSVM|s>P;MvGw zple%?B3_y&lw!L9n!7#XqtVRwZxt%ynYY&fx63?wVFwdgfWDa_bR@bHfVf$!T%3C7 z#mu2hE+d!$Hw8cdV>(#SVTI!TZWN;0;tD!y<)T8;78i%(0!nv7f%YQQpkHh!KanC9 zyNzg>z_EyB*lp8Q)hN9$Hk-wvhW{JfipG@eZML7h@9N#CGi~CS#41C&ql}CwAv=9O zV?&XwAIBvwA-%ofz<^-6DzYr99s7A_H=DE+NpeZ6a1X8UOslA;oXMr8h2J~#@Qbpd zNaF)lQA|;fqQbJ+#KC<=gf$PPvRmr_l!ywu?ne6c%$}=_dd8fINC_Pzfus5qY=N>F{aV_5k#9Yf$ey zsr1T1<*p>!YJM2(@S=fGdh`}B`7a3)#gvqy0N@a5vX!Ar0Pt>i`2kSIU)rXudT?Tg0w_o32D2rYbuk< zsKhoXQ3UM=oU7$2s#8r)Tb2JKA>>F1g4$PCk0}uJ99GIT7MoBqi-$o5*-Zeu-OLJhK~SfG(o&l+M+J6Bj)P|0ue->j)IWKEYBy2rJJzhs*-i0h;TJ z`;QRp!872?7D)kCxV+~(g|(8*lwPPMx&3tHcVWvo0`2l^r%K1a!iKc@_iYxxgS zv=$)|AsqNFhljqN^7@y3Kv)Zurb4;c07@Qza^>CiWW{WKjcKiduvY&(#Od=TjJqXM z^c`N)=VEQkkFha9Kuj_hlML_Myck+eC#^?Tto_1c!(lN}c@C8*s)g?C`_>C2^zqgqh?Zz7 zBI|#`{r`PXc}%QgE8x1ZquEyp?u#UM8WFj3=f3)A^l&}*9$)TkJ*b^4P#oOcNA-xU zyTx0mS0e2299Hzwxk^0rk{CEhN*=UO5I7bSuNUMaMi*28WhEv9z;2P5$BO7cWunM& z=%!IpO3aYaViwi6OF3+4Hm&_$4_;WQ+}#xvx=`=hi8lR(8FwV^r6djJP-E^C`e`M7 z$}f1M#=&KcwFCVSLzp?Lk=4+V^_b*t0Pw#PT3^Ti?fz7e<#L2jvsHh&?s|au$WiYFoTSK_#&7youiI>_e?YzGLeoZtmI%xrH)fqn*67o7m_H#=bXPLDcx` zLLLv?-}{FzNpJF!_oX-t7U)%~fysBfn*RKH!-syt<#eDv9ai81Fz4$Gjs6-WTfB~w zd|WVja)1pwg3j#N zo84Ck1Rvg|!g=|9@gPfV)N@2(4D;`^>#ti?zaCjP;5S8g+97TqPyj*fkJxcI?+T>b zPObi}t@Sp*s9r)KE==YMMn-gfzQ0WQ`R|LieO?KhZ-`ZDdAI5xUUV9H#8S4pFW9Xx z?c-&?#iw^eI5+TEHQmg+{m=CQTY$-5R_B4d`;BTQdUjt^RiFWX9_oc2u_0#Z?o@%NYt{!F%OAB1=*OfqDwHl$ci1>Qk zE*cZDH07t^@V2AA*uiMZOT&AX8dK^p!Dc`Ogq?hxkNiwvMc=UNa>b4m#bQT)8a+U* zcJ~)IgMdOq|0)x9U?Bb}gooN@A=K_;1nkb*L=hLf6a!t;$1MunKi4Gr7^i&r3Xz{5 zW@HneCgs-HMi&P4_$kr79~0dT8zE4oe!>vRYW8b|xdM&WW7>6nfWCW=#66oDJm5YM zvOlfQ?{NG1XVt7rhb}*Bj`+CvsClrW_Kdl8!Wvw^X34!@FBAH|jV}gcK`B@UC zbopSQ&9P6%Ky)ikVsky;(Q=a_0Q{Bht z0Ph0vweC4`5@i2#+)==vYxBpS*n5h5F+S>KO}F4$0G=ZnqC3Oqp8LbskIA6UUs|sC zpWJ8$-{z6+WZ9XTzxDqaN0}nB44t>dZH@}u420PH!F4b_X`hfem~$#Ah_7sZq}N-` z!HzkYY*w)lY3rRFty5-=e1E4j&B~&^geX2eblS(^=YVF=#Gyvdz7@-U1AlcsME>B0 zc^^6x*V1ERz@Ey29a@hXgdK4Dx7A3VOEpEYhyWc zaCCoiG&I71x8r*7q%4P~)YST(7(U5Bk`q?g%fcv zQ)5+GI;mgb5K*llHNKawZnfSBn3x0RX3XnrI^4(c&Vu1GXcO6C96ri? z%e_G8*^ieyZ)O>Q>!#Z1%63o-gBOHpo-S<4XAG@>d1}yPJ z`I!|xU6vqE@gOPNtP^l9*qpAvHVl&QCV&T)2e7NdS!T{Mo;8FD+TW_+zD_SwT0a16 zNzDa)SistF|Np5G*l}?IV#aynh<`cYOK~^+AL!~ksJMQtU_-R~dk|N}!Jj>}oDvNV zTkd}WHT%Z87M65H$9U5m#Tu`xQU(;9{2xUW`DdR|CB4Nt&-Tl6xv(7+Y2M`y7$~Q` zvEG-Sc}X%8t+k`7foys5udLAV{qeKT?1AHTDt?_a0~oUe5W=UUM}8E@oJ&|lU8@^H z&){($RSlZTF%yMu5&(ge5QXZ(_T;;YKgB(D)Yx6&dPh=pQdpsupEaADl?tY$Drnkv z1)PXwfeA9;zO3ew^yz3zyFZh3fSfOUgDaBglpzq6_(|U~zm!#7xRT3|q6(n5$-@&8 zy&-v#V%4sGArNVe3@VMEE|TMN4+S{voUhTbElF-jJXi!Wl;P2e2>?j9@Yzn146biS z(MS{1H`RPa1%|)qp4bgnjI*S0KOU?c)wFwAqgB6uK#OQDn+H2fAv-FiYI*>k!dzsK z;O`h|UFfRpEOpQp1S)yF=rw2v#B5K^0+pop8#yzeuZpO59jfxTp5GoYnfm5%apLN0SM1WzcXI;x)J>5!wL4Gr9dq4GfM2#htiVs{|YFK{*`BQuqJ@Ioh#9 ztcUyHLIY5QkkQi7q+qT^M;ni49jWdTg1VDJ;o~BVfW|O#E;Y#3GPVzH8Z$_=k~?n@ ziGDwsN66si+3L8qU+l<*7nfr}g^|xYfAa&w$mgz&$E6>UdEa1``^S9#V7y>~x)G-o z5qH@e5^4yJyqcer-cJYa-`H{YF`Jj#rXBK*EEhfdFYmj*^g)Gvk>mT9xtl>BUF>iN zeg50%s`{JMhsO@1%Fi*YyVcLzM{iUstUO|t#aC{ztm8Pgs$X~)SIT}qB|0|U9GGXF zD;Rih*WbwJfn$1!b4(Abr(z+{9Dc?2k!SHUe*cfBp4_sIp=`-W4~Yap%5k*b#scIl84OL37LunP?|g-6HQw{wzED9%SF)hfSS(Y{o)eQy$F_@)BIsE9WQ_Mydy-$h|V)0(8%7B5FS;?jv1k$~N{FDd+#%&c$YMp8Gh^e1;bYNll{I2uG%9 zukkdEE6IRTT!9D!#bbVpai%m-fygyADnT6{7iP&6S`MlbHm5!G^ks zFiQXqU>A1VU5eiwX@dBR6prQ|r?5jbC!w#z$aM))vlJR9Iab34rBiU&DNxZ2C>?*` zv<<4lDl}I_h>^e&=n!j>QokpT=XLli0djILEi>XQKu5kn*XWQ{I)nn) zvtL|53Icm4p>fK~z_S*qJ?+nnvt9-Gl9yfp=ejy)5Pb`b9-XB=>T&R4CVYxv8 zz0sp#OXW_|p(8CAi>Q)sO&WXH5p2;5qxY#`i$J)j9~Ri`Pq9T%UpWn%9$0i^9%OCf+f z662`N(SE`A%DrG$ZsrTC;W+O}p*905lfe|F$bDf4Z*lV0AgY}WK1oT6rS}wj-d^@J-&);FJhE{4 zV%3$a(^W?t3jAfzBg(kFVz*B+{Y4MJB|G2|apH=5X3O@%BY?wq@1aTqo7dW#${FMn zG3amBd+&IHswNK`9ffbOHCBOSIb!kT3)(kfu@)x+_k*nT^a2USgRDf>?^H)_(7G3{ zT4r687rK*6!OuDLcoA$EAlJ?TeN)NOYJ!>|D4!!O?ao?mOsQwcps@4c&vob!v1pEo zU79R&zO9U^qXfDoyFEul(8`tbYqN)uuO^|9ZZ^&?I=hr&Jy@|t+}J~3b^NDw1e<|) zAzK{CMFi5&ffQ^H6W$HLJqStIJ;m+$0Z;i+l~}*ke-dUw!O1hw;YdsiCDkiEHJ27z z@eN`k1EefNY+V2r@?m)GbGZmZ8%dfs9r|91PJ&Mxgx`|M{d=1D;BHlkicvL5 zx!C?n-9}qlrx9~aF_@|p*kY6;x^nRz^;(eSPci+Y6yhe0xXg5Q02WRkPZW>beiv2! zE~qfcvHE_V`d_?Kx8>gIvb%$T^VU%Kw+{Il3Cw{~j3a74Sb+U`2Nj2be^Sg}^h7H4 zMdG|%Ks)Xl^Q@}6$fWFxLoL?`&$DdVP?`t^1t2Hr$epD)l1PKF`7KCC!GsrYX`xH9 z+L2|V4SG4JoGijTU?QiuU?&-Pjt=+nz`lflH0`aZd04ky8CaRtnvwZODRpnK$9E$S z7PKyn30xI{y~R2?WpyMgTzB z1K7{fpk;+aKj%poao-~;vrZO{7LFSPko3tfH<_^SY{c(l#EVJtsRPJwYf!tGYoM=C z2l3SrYLp((b!K~{Y_3{uKke1X1(g)?a9~g$mDW3D;>G7oO=TfuU?&lBLIMG7N6s-3 zA1D@f%R%24j!Xwd+b?T83ClXO3P=`15F(5d9wTuC#WS(z$75bX+}#w)KZPZ`y@Mil zBpvrnQrxfpGxfMbD{=-E8?A8K%w9)H20Sd0)8y_<@F2xOQ9{l*;-FZF2kn>y4@u!e zG=+8P!JR#TH7P1uWc>5mRsj%16m5;6qqnIxX#K{-;vpsyugvlW?|jf*JlH@6u;hkn z0zi=+O118Xt*g^c_l9)2g4Z_zIIVebgFfoccjU%xr3Vf9w0Xt%0OjwLDVqcw{?L>{ z#8l84k@UOr;`=`P1#nL7l;THd*g^E6DV?+GnwOCiHFM{0AgdF`Ztw7YqQFKRJ<+J3 zpv2s5I%>CVX2i8CMU(Ru^;A+&ZJbG)(#eOnQM!M753N;t zP^Ut|N$!!Pdv{{*S^Itdn78)oHS6G=9aO(-U-D9Hjjsj4$cr=9PqAwp42}-*cn_U^ z*W_nhSZJ=;8u~vqagB>AllJ7-rQyE@_I_Mfv25L;uw4CO0dOJa6gB4J_9ugn-#vX0 zI@EGM@Zp+{MrY!K7vd$+c`@WGG#TOLg> ztf!zUA`jG4kEE~gvGI2>H4st^J|F@$&>$zJDA^Sye*mc57S{SP_{X35_&DHa(M$P- zGf{ZReztWC9#Roa$k|Uo;UN+{xCP+#3Ghmj22S6#Wl@>jX!GcFIb6mBMoad118^7W zAiaRs(=xeB5+Cn{Jl&7spZ?~Z0!$4h;@V>jPn9Z+cgOxRnV#-8%3gpzdi@W}ar)>K z_U;sRgD%}m1OEe!zhsc|u>@(b(@Q(fj`8Mu02q5h;G(raW zwwdd08KnLdd`%I?r6jA*B&n-BW1K}@#Nu3%)im0NRquLsdhSqv z`nlZUw0q95cao3@iD4)QSj<7&lw!xvss=2q4wqxCC*yT*y#7E|I;uZ?X|wXzckw?z zi|%Y-l-I-rs z%lF(>czASo={0r87aE$DxWZl>VFY0YPAR^H+W3>j2`;( zD>8AgPsB6QzW5ibZ<#vu0i+OnF6AX)HW^HR=YP@RPO8f6=_|^~X*MAnrTPKdjoy`} zkDmB#*Kka$@Vaw8JLKZFh^`sgoV6RmE&5Rosm&OwxUFG5`)ePUx2bGoU6Z_Q_4ZSx zY4o7oYYw93mu!7I_AxEZ|HnP5*jyQSdoM@mWmwDdRwgI5-^cBrU^OxJWz``6K56_d$O&)` z%+A@wI&rc#oqrw%$+x#4xp1l*1^`<%k5#r`TB&zUY=57tZ|jm#TZhvSOHdcvWF7_h zP{kfp?w%&Ghgw=)+2F~z`+)|wQatdII^N(N+`5ACMULsw*4NdDYN zt|(=4LH>eScj4pFJU#gyYR)GL2&hq)R9l{@!)27IC9)PN$wD@=7RQ`h0yh|~^a9P= zRmwyfui|ofs(WRisWx-T*#ckV@4!vX4C7yQFi=LI^n%KNrP}2G{)BVr zAds7k4uk)>Rf44I)M_FgE{~{jn<(gV!P>{Tq z#mj{^1!o-Q_LpRqbE(y8tkI^m!u5Hb5>ve^^99Q7wOudWUm~x%m_?0hH+$cRziN0r ziXXf~xA)&sRM=fWLGW$ZcAxXn8D)coRA)OlWbaCzzD7j$75x(9Rsay<7}T>|wU@7( zGaEk9bfrjTl|2C29VXP6i;YfuS7_7uvwpLnp+>gYc98?4>`w1YH3>>hxW+Er1o-bS zw5^!c>Nxbv?(xwkarQEvw%3{lQTi{0Y_^f0ya{3fG{1}U{oq^QH5c^ikR*u2F|~a% z9{4|*ZZ@R|;g>oDo?t*vfAeIRDNJ%>5R^)D1pPe+kBog=6frBvbm*x$26!tux!S8H z&_YZlN8M>K@pE^a0)Z_&@1zWSWk&p~T69F~j^=9v%?(5!W|Yz1R_mt{Pao8pvmtc& zHG{2Fh5l}`Y@D6M2g~#tlCIzhaSW8~J;1ehvMg?uiWJtnl6p%^X_O^O%4iRqomDY% zU@R`VKD^{=thO1aH{hh)tIc39+tF*j&|^D((uv7{ELE<57#T77B>)hXhd0 zp`f>^ABLS|=LQ-407e->Ar9AgrTJhtg1dXH*Tm4eX-nPAu>?-HI`UOyHT=PUmNvB%mO}%p`PWpaA4& z_nL&o6&dW+_%P1%fK<9D#iKQhg7>S;nI&nF0$s-kQ2S&am?K@tWIMot6?(6umb7@& ze3IU1dOy+!tkYMi+O*B0`h|_Dew5t8xZdWs(10;^|6#*5&l|z2CwKOnH1;;ZN{(GE zs+;q_nB1cII&Mf=U5scs(3cSVM4(qHu!&*S;z`Wh^f?wkr^!`6QQ~<{RlS6d_~}D_ zqh5L)0?&|vewo_z(02cI!=N&w2+>DC+zxN= zGd1arTe{@44bc3lU-TRC%jW1zz?*Z2WMIS!&lx7%fL@x(61t1PTZiB53c?dxE+5E> zu9Bc**+Y7B+yVr9u$tgic+_kSqFBjBo5wdsov5=nx~_NeP3x#Za3Ih2`liqQH~X+T z8Y{QHlKLLJUg<*#ETc3N`Fj}GK4%Pk#N>WIKEG&c3m*2X`9O*St=?oQWvk;dtQyGr z@eIg^q~he=EQU(EEGOcZ1>{l1W#{Xmn#HWe>eR9QDj(iwxCUG0sULIJ6my~fv7a_E zp0!{{l89Gq?tJ5U8T=jYSN?TBPj_A-=iyLpG4bbFo8cm)swwCUaT=R{c;p81eK}d} z&$40YcJhZ6iFM2b#7AcV4w87nUmMS!HE^>k`=b!mC1R zh>7DPyORoR{_udILZG=81va7YfkwpvSMqw$j!%ttvcmTU^y-GrO86SzGh7qn#LyE7 zyeQRtO8W!z+d01{!)@=qSmw@@9NaQLkF-91?|5w@=dp5~`o90t!d{sBbDG=zH?j;T z@Tjd%>wE3oR4~6WqH}|74D$2>-#Pf%#?8&kudhDuI%Ze1(B-A&Qv~<+1!iqa-fc?W zcGUuyUpjVPooe5CulYw8vI14>$G)d42Hjo&?wf?{=R*AGYD{{Lwm2JX0QoM}&XK_F zScKZ64SY#Gtl%1b5iFGQ4_4B>5Q0;woeCRS3QQplufC~RV|l~XShc=v+i1fLWY>)Y zx#o6qQ-*DHR9iF2s*%~)exh-CL-AQYD2d5qOTeB|UGi|2Z6#25gPZ&l@bWjmr$Chx z?VP*;>$gNlu>kBQxCM=u-jr)8QMxmfhG$rNv)HM=dUQ$ec|2o<4^+vNg74bKtmu-B+EFt+MN4*s{fc57Ajd!#(6 z?)M^$xK>ZDLj0t|@v{$AH`+G;?J#IPznRjZ1#&A27|SC!n-hPwAqd#&6}Tp|!7omr z3jl4wLv*GDmPcXdqah>!6my^FYanRqYWW^lLWKa1#ceq&uJ1{2s6EQH?c&ov03gzA z>ncV9z__5lULtQiMakM$t==zh(^yW(Sw-3k3C>&e=y?@5@%6E&{N_}-2Bz+RD3oRs zDv$vQ&4LDb@r*mjdr8?J=ae3ZQ11Wccd`4;5ttMN=pB-1%;J*7uD>O&yHi2O0iI?e zxXlL47~!_N68%4AqY!69Q{f65-1|*Hg@YXz4B9`Af@ewDb|k(rK1WU}c*DkK11l4b zK1}@gfm*X+{hC$cq|N4#V(~Cq^^IjWaZQ_uR0TWY?rrc7&TVtd0N6-@HmTg{4EWZ` zyLLjuv#K2!wbFCHaQ{h5*Kb!f%bT0vi%&LHK?HaW3y7=C(DC21#eBYM$7P(9c=&($ z>>O__MkE$Zu?s1R=@_haIVoBS6Ip^@)3IZe8RR z!=DZpHfl`cAfx3Ky4SaleNlMm+IFkbNda!_Zc)0IyDm)CF;}lo6O_=Kx2maItG8aM*Tlhq7x5lvH$^Wx!YQJdO zbR!9)OUgFi5Ey&q$gz||NG16}cHd5W ziB>DIo=ZVD1NKn1yv{{oae7OALFx+XBXEywJFsZ@LM|j`?IC*k74k7Rs-;>Bc-~8>{ z<3s_~Hv!TqmrX@k3)fXc&M=?#nXA8VIPI1{^@4fLj_mb5%OLp5#pFg+K<>Uu5T_D+ zfX0pX3fxQSB9i%GNf%fzvKCap$xX8l*|}+PdVTEaq$rqX$h5VTXhhFVl|t|vuqffh zLv!deH|`+fc-^<1G}8K``1%_o;MAr|W=c68LcXMdx6Laz-fF54lX1N;4*}+-r1W5rSj>G= zg56H1EVjp5g(1>JulQy*-#SEEpcD?MlWLm?q~GK6ckByMZ+S|&{$#WGYg>S|swQ5W zv0=2f9)fCs_-$N``Wxa$&v_hDUmcCGi{74vZ_TUms&##p-!M}&yTwn$FL7fQR(3j? z=g-)UYy*TC)|CtCMOxQOQ>2iQ!2Gnu$-wm9K$q*Td|iT)38ym4kd;HGvr@UaPO|L# z<6z}w$Sq3A11ZG6bn4SzFbdD#o7Ojg0%3%}uqXV(;u=W7nVXZqI6QGcsxdyfcLD+W zU(5XOH?c9>?I9bJPRjl~mu1W1{|d}rJ8!@(1OGSoa(Lb5z;yz!82=CdiEX3Q_l{*X z;Jig?+1I8U&hfc$lK#yis0!i%%TACq4gTi{Jl!DNV}QDOj`#F#BQQjQ!HM8FlE<04 zr{xC+*R_FoK7N5#r-Zu0v_4<=-Zg~-a9`_G2GD~WTl&fN%tI574{FS2kcT(2bmIg^ z*aDt9(3=^}eg@Gkv$uHx_XcFc=rE=@JLZvKN~twXR~UDQrr3{g>QOVL8h3Q�hh{ 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%0DWbM&jv7_B4dCSwbN;iH+@(HGd5=bBi!X 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⋙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

GakaCd|>*iHEw7hY0X3EH2lZ0h8h{?Vil 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%0A`DZ<}&kODThV5uR@D;^`1 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

w83hChk*Yc#Rri^j~|H4XP&D1#|+hST( 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

j~<_B29&TwIjSo6Zu>#vtOTt8Wf53P4E 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
  • NUB{n+RhtRbu#I-N_q&CTAvKCrUjW&A=m$R zfO5hq{G%{BQR2al@-8^>1qMfHY(OHSwqdtlq!AT1-wG&%*J`HcVy(HLkO+7LMfSwX zeJ?JG1l)z}0V2uZ1d6N!6~n8pvs(Dy(rmTQgM$9&9U%3fO=Z=cChM8zmLxXF+V&Nf zB+gZUxUfv;!8S)VIu4o@tOGix^E<}-5My+aNPuiQ8NThG**=5ipzrpR1%?T7nyIew z6G$9D*q1GiV|SKNAo)}!NS-2TNQu0vl!l^8}@fNH^7hNvrbJ(-5Kk>lxPoWO=^)XzSF<3g|EwU`>@5ZQtlL zdtUNYts#@r%V#zgu+dYEZ_0!8>LAfnxF;L1N0GhU06iQ^3?f&hZiaTdSi{3IeSPY(Yso5P^~#BGP7tFdko2dsK+-ph%(#UaSgP1A+`s zl4EH@7ipkM*HuWQ(Cjbp;ST)y>*T;i6|y>ge-!B2nZoR^wb4hHbj7ts1V(s>5w~5spL?+$h$gmfX=1kp%v!F7D1lH^S+z;8HhDQ%ykxrY4`8sn!+y1 z=z$pFu2|;UrBfWZSRX8X7^X*s*s1_M>%|)6uD@~NgRF&nW*BAq^GRw5&2qBw;ek^3 z0{uBsUbZ(P<2!tcAk=v84#0)(VYTH70%Sk8k}hdo5B)z1?){Mo#sA~@?)S~+I`_HX z8M)uu-0zK~xi*(rlI9v+cQbRT=2mXih(b;g6;f?(QPPx3r5Z{qb?Bzv)9)ot@5=tn zDu82}PE0aTkRpv4l0pD{*2|<%2a2whLaTwQIwaH`s&=O2xXt!M18nU9w##mZ?Gw=E z5!>8}ozQ0t*Y+N^zDu6Nd)HUpz~eQ*&37K?vp~U_x|_!n3!b=1{9-amny-~o^O_Jg zY{+3rTdmsL(oUaJlHhO@SPRe=CT|xkTR#X$So{VXZ4Rz1PUY4iOh>%T4Iy{tVUue5 z3IL@xHfn<|N3`^-`jJ4+ex4ZsRB0+6!ohTg)TNQz=Y_Sgzktr))aNDCK2&W ztg!;Hcx`>??}XIed()V&R*uT{E#61=*SPLY9-bt)xrCgZ$#PN@0c{F_O~YE%l-7+# zhc_)X9^Q3s%*lOfFnO1rCO}f~ZWC28H(eRqg zFPCK@*=`}IyIZ?l`>1($Kyy%LIf7>Dakw1S@e@I()EC~l3{6xm5z0czxQ4f?Hy=;?9NAKa2tDJ+Fwp7Jz5#3a&)m z%jkKXJv5I!Edd7bq53hw)I>bdhVpHd5Im%%$W}G2xS%UOT1SOFWArRTZv2t8A{R)o zySoFPCVEN6mJKyhNs7@!4=neXT>=EW&n&N6JHI98H2+!IsiHp;`b*HT_Qqr);uHPY zuJ(>yX1Q_hx%MFZ1BUio>X}RmB7$VAznEF7qJ1~&<&;uYPr-B$?*zAnrdU&wV@qP7Qx3zaQ(EadmD=N0X+v$ zo~~o?HZinT0#g>Br;Ag!VS+|$r@!K0%?;*(S0SAer7pMY4y!>o!Pw@OtZfX|gEitopE4S5k(U&FpidE?GJu)aw>28i~Nhsr*a zj$OBiK5#{4aQ92Ahmlw-l{A}e^`e1F_sa`qo8!u)a2u^FWv518+#HFiygxf7g;Oaaq_qAU>zC^MwRVbE8PAbO4EXl(KDub+?eCfyV_MibEys0 zJnX3h9gy$wUtThl(}EWsA(OIZw56xcJNt4V7o|UnL@$H4u~_;jd~BL3<~BO~bVNr3)Imz?la`D4ag^E^4 zwRuf%uU0EQa+6|RefQj>*0>VWH?Cu)L@NL{VSQCl`plp%T|2Sq-!sS44yYE^UANdf zkXxqO`uxhW>Z2lbj&FGy{g_GKZhj{xyt5X998C>eet6!e#5&tG&Mae=CB#J{M*>PT zuBf`NEfi4($v)N{fqUuH^SjF{oOBPfdme$-HCen7A<|%}7;w^rtc`FLbbNq3T6nr^ z?4KPL>I$Y=?Lk+P#>!t!oV3{>WN8z0*4>)OKk>7zOiGY;OW!b5 zEgK&$)3~ZN!7ME{)Fo7 z$oT2&8UGm%&iu9g4{-5}zqP zvG_JaJM;~>wPVm?#xJtWH!Ab=)rZ|GpqIz4a;p|#>p$Jq1L^IqKWP+f(cLNxz^%G;D*P?-MU7z&Ms$&Vc6_*Zaz)n@TtCp!nkR z4iYz7l?EThzXIPG;I*yF8_}`kV4U8j1zg|~>Zj40#n?T6S9xZCZJ`Eip7Oy++LLsD zYn?yK{$B4}4k_BUnsOq7qDv!cqQtGES!Ojcm5mmK62YA}Ng>XQ0@T5Iv`U*?O-l~6 z8hLcSIF}LDFXY-HiS=IUg1ijZ>JOd|2*_|R8kZ~T^BOuE&72Q6BY<5!@$MljVqm75 z^zw=G0GshQ>i?PEhHK!tOj#0YjmdVKBi#0%IhKB8@J=Moq2?H(Mc-!}n&kITrwD-2 zHe{S3<^wjH_cDz4GH+|<_wZf}0^wIyhx9XO|HQ8=#D)k3w@4dF?Cfn4@X_$?DaNyK zRO&eh8b8#xd}ZL|Jqrj4lbD{=1&CL^XR$2Vo-WHOJJPp`Frnd$F~IJU5)MHZ|5Cw| zrS-iCs2v2XBe>#A)xLVe(wM`Fx4e5y1!<|D*HjL#_8dKw)da40hC6w7m+ugY!PT`} zv~}?O!z*Vs(hhp72p@qA7z<$Cb%lq6Jr`D7tf*Dn@Q(+g^gOdoAumOEBU^h?L?;+? zpEzXw8;GE+=wl-Ra5Wvy<7bDK4f2!}D+cg}TV4V*&ME_|#eC-xm#|>><%sIb)kZdi zq->y2OSAqijQ*L8*P?jgMQq5X!NtAqwLsvjucD3O$z5Tm>!PhAVnQjc*JwmwwXU0{ zo_=3)oVJ|nmizXsHFJ}Z+PbkDd75q8m5eb1_^Y%{my;k=paIRBw^s^Df^dKs1ecLp z4Btol?AK9NcSc}l?G--c@x4RM+b>y$pL@Gq>pEZvMJaNUH#f^g6Pb$mqw*AexNpH2 z?DxEasgDHhIO~gN&RgwQm$Of=j%dVas3WI9n>LLKG|6<+r@wbOhPOceJ^0^4!uz4f zq=3Zqe6iq29~5pK9kvyo#dh9c;J4r4VDBngDjrMpRD92#@SHEZ{Jq9~%fY8&H%eLK zjkmn#<9-;+W!SmMajiVxA)BcRzO%;$Thk5!v(3zc9BP?YFYMyPAL|19#Vu+iug~rq zOx7_D8~5(HNc-OT-M=G?>Gix!(+I1s5MeJtJZgg~{r+5TKrBKB9upO_BHK(^dV9Y& z<-aObZ5?u%xK`|aF}ok)!m`+xeJR6QL1Gy1C`*F9*tyU0iPd?|!LS5E;&^CIP{q@c zFn0~)GEc_$aB1__-gaU5P!ZWs2fIu4Ilf5s@Q?1uR>q?hz-?taG9>BuqHek~SL5_r zc|0KTHD$FJRE>oP_C3~Ck);V-8IyU*6s2zEdy$jjIYn_*Y;8)2^-yz>-N~I8|8eT& z4%snV2~bN;da22-vP^mhZrS)d%f=og2`jv}+(m?ltIlBRPDb>{8%g{e|L1w1?h^g* zPN76nUazbevJ5jI2KC~PYteXzKX%cB^GWW)qnz$!N^usqNbyyB38Kr+-}LYrIuXHx z$GMblA6)3UIk5yxEdV-Al0c!gXK@MAVPQ@dY5y)S$iH-f`qXqe4MT;g2Mi-VlOcAI z7hY4kIG!(8dFVK>R@di6-9IDH_5ZrlNtLqBO@`x}T@U=HZtlO|oVF#LSWKvO1}V*m z0B7gg^7Go*-%jm-@7n#qbLENEyg0mXNc&UY_%@@yTeP{Hw`co*`#Wj=-GZKm2A}d~ zLz%cBlF6FD1S{PLxe`HW8qNo*(E7YN@7ZuKwgs_LkC?OAks?)>Rm?9Xpr;(H34m-cAd%s~ z?F`J0A8>_Un021|rdIV?29!4A!B-4fows1A?OWNZn#j@+7AV@XaW5lqa+13Q>^?M% zD5rpG#t}&@AS79+rKIfnz$TxCvsp#o1ON|wvx9Uw{Y)eq@JT*2_$C?bj~LVi*g(^} zFioWW;Uv&o66nS_@GT3cwTdqI2C|XwpP^tk#0NCH;P)BehY{JDc%Ul@0GA+E4G-PE z=0Bab`-)@it6IIO6VdVBfw@WC0PIOwi7U+|t zy9IRQxnI!TqPP(wmxo11c4TKR3o@6!AGv=;bl<3A(<*8s&E>>amzu5k*D48@?Fg&g z`S5H~g48B-TDfll6BK^fSs!k-i!&vMc`H_VRDza8pg0Dc$U=YU!ZCfqkYwlwHoA`t z-C*$&R=uvU6~y`o%6H5ak)M+n>NtSk{zW~fk_!9E?k9sks3!3BHbUNdYd}b3t+P-+ zGQ?UAzac|Q$dE#DmY>*~<%o)DxFQV{dA0Z{ z1tRlfDkmDt6IG&QTluw$0{TAiCbFT}ZMn|D0T~>hT*U@o$aU z(<YLhy5^JiTNEcO$C z)DFTSSrDikqUbA#WS}oI&`>~xrW}ft;kMTKIVU+-6>e=?bXB$mJD7yk_ZhWD&yeErD*YCG12D(?Cr>AAiv18n3VH}I zqZPEU(EqU@<#M;j|06nZ&y0nQDKWP zMk^?dbuRwH#uaN4n99nSlt9?q&qs;`IF)E}5Afhv8PGS^CryUg zRIF{&rJcrt{lmDR&ww?taC=A~1sQA)gI_O$4G~eDtDx^)n42W)I!zUSynXm!4mh^*NVH;nbav+YlQ`so%yw4OJ7Y_yL)EC zCHX-Ud_5ks=Az)N<3qtQE1L%%DywK+4&x}R#p$V5UbcJ=b$sUZy(0EU4TyLS_dWLv zmV_0OHcO{_oJjx>098kWRQ(Sya_AZlz4cu-=$eIY7Brthtd>>wQ_#(71YG!)ZMK?9 zRKQaPl;{IL&%%5rVes-R@gG2CY~V&0+JGI7WrM9mV3RcMTnaoGfV6x>DRfpZHoLv; zJ3Lg=Y3_pweO_Dl;r6&hDAc>JgP`1Ej`GTL@>-~CbnT#0?R_izer2_v*lm7eqW{zw zSP?XE6^$M>2gg-6-jt!{B-pojRM&3)9tLoZcBkh#CY6*pDML{y8`$CNXl9O;TO8p2 z>M2KOkgHgMAVEK3A~r_a;?7>&$M=8wFk1FR`rB3SNQ!~(n!cYNLsx=(!+<1rVawO; zrVi@$Y&-069%t|yZYG1;#qNoh7*#CZ`gNh}&vg+28Jt1M@mm))KFs_QBKgtS+V}-U z+~u+`ibp2m()6WqiIx5Om(|OS)f!!bsVq=2OK%01Nk(U~u$%US?JOYb#>h`3q}hZ) zQz3R68N`%;9%Q= z@{a2kpbxe=oxgCM64YJ5|G$OCGdg1dz!o(6?kebC{Qf{OvbDS+PziLL27N@q%GI!C zVtu1)n;$JGypw}%A_0~XkS__LK|?zOb_<96UsXikzBhT`Yx7;JfGPigcKwo-Rp7D& zu_B>87vFsNTNp3lc-0# z1W6|y6__*0gE;GBMY;3lHgsj3h#Z03=!3JpK%@VoZ!C6L2X#QKb7BX~R z*7K2pz6VT$uYv`#M>k*m^J*9BZ7_)(LxOM(a9L2DHRA<+(>GqGLl9ZFGBitu$fYUh zbU~Ex=<};sdd9i5XJ~&C3@L`8C|Ea|8J4VcjfOprf2<@yuC9);-1AR%1O5k4BO1ID zk5XZKEOAJO4lZ?8TKwpKQc{c+#I|$ei?XiG3O@GLYjkjLU`zi&n^Dld%9uM6tbzor z&%V==v7DdxRNQ%eaChhJXQ(L+P#~*e%>niu`DPpGe}4Jr5ARe40z#00>SUn374E)b zpk)_$EcC{hw%(-E#xaFvj*jJS?M9EoiVCN{T?84wz!=pZZ2-M7aRqXZXB+4}lD|0Q zJ>@%ec>P*jM0VT{&HITUnH@63Q2^+b__O&Dl#(1+AqW0up}NVy z1{wA%?OZGg+$+H$88Givg}vm0g=)b3Dq@TRR}!P5bdZJ2Ys!(Jr!;D&4AzB5Z5QME zayCezBPzLvl&b+MdQz3Edb#`q8izdInn**lez5AF$@kX0HB(+aa1r{nOQYczDDD?X zL5!S{4BSG%1ew5D0!l$XaBCc>CBxj3q3ANyFBX(Y0(JZX1d_oXY6kvt@HqhV0K57> zG1!s@@Fb^Pk$|M#?vGK)wJen_i|?y^kt!5Ianf$TIK8V|p7ee3dwtnn*MPxGdr>a0 zE5C4)V%nO$cvF`E&6jNYm^Sq|KXXa-{@UEsLxuRY-+*)(=ASu*(k<9t%BSa_E+A_m z-MMUaw<~d_A$l~aS)kMqc{$AXvTCO?@wK`Nh4o%GOzsk-~!cuDogPy{@gRNYXWlkyyIxl<8h5Mg?17~UyZ|U&5&BmjX>I)aA@#}$WXa* zJ6-qcp5U)$71&s0Mo%A~tI`3|$@BUB7iw9807{BVgrBRXCrWv(`O+xT+Y++Nbf_7sqMJ}Uv;WKRUc`nx+pF*7uy2_5 zdR}%!{gyL|fANA6z_qi-viq2TW?N56amDTcia*9SU>S70;k}$Y)DTc7JLmeIZi3Pu z=$k*TOc|Vq;iXo%kqw13-NrJfS_QgAKuJX%w3rwYpWOoFjDr9KPa3#b}!GO|*f8WRTbeRkH z*VY>liP28q=f;lixjYThq#A8yHrU=#=MnNX0_J(T854Y{s$CWUu9eX}15~w+_Bmrt z8X7)zat2u=tc|G*G~OHW&G@9LaqV!W#d?#0>fxjkUzLq*&htJsp;P8%O2J|3=~ZoX zPEpnDpg5vpubEegXjMV?EeCf=SBYQ9 z`k4r&gyDlNM!XEwrBnf^Jia zwINC=uc?ZwZL)I%AFks6HEd=T`|J-LIa{V2G-3tjN;wAsYzw9sq|F z)U5Xbh4I3~<}dKa?fR%3=JaddoNDJkU#+gae$a@EyEL5OZW#SAr0_$06(S9m13Uim zQAtUp-fCaYmiY32zucehDxu2wqy{?LHnTveou4n+IoP5t*MZYgDtrMnic7PqDvPsN zuRIq>ZT(ha@-pn^Yg#e;KV+YNsf&4=3B918==Mc9p#<=^bUUO`Vod2m9u5IOLS@7F z%_`pCO4iviU}eQ5mJ*i4~fu@a|CD>3#@ui^NG&QSFu6SP4O1&G_at?uM{#QbbAghERw@c-|iTJn(MqZTEVqj&(p% zeoq-qO-SPa=cP_Qrf{RFSwKOJ0See5FiucHIka(zPG7u$xnc#)3<)e`IMUc&g2pNX zbfK$2beII;$45GcpWR|;;G+9u#>Y6qz)O3wsl-tz*QORw@%7ZQf|0XY=OMR=oyEA^ zgKX_(636sn7T7ux;O*2OD|nAr!1zkNjX-l)SepKj`V`A0qN2Q|+BwzloeF>5P|1&l zq^u7s*W7K?-9L@i{|3fv4e+W;WoQ!3n!q{B>=W--U7v)vZ~pfAZvB}376!V{)H+{M043j^zT6Q({)S=1lnE1oQDbZrNn$0?h|_fxmUu`BkQqsbHBn( zoV}bI9q)c?r67zP%m(?CbFPneZF#>cFgnr2Z;=e28+1jRzz_wk`#&WHJuKbEl6RR__Ec->D+!71jE`PT&^AMQHDC@27;NctOS6!AwSx zrg#`NP;f!vNS}z5xtIt?9>piWBkP6P3X>$|@gGqd0DQh?Wi55{<#o38a&tGKS#5A` zn(ZnYDk~s**J@B8HbGvBP9(0jhKycto z@HxCZAb7B%8Kg20=wg0duYn=K9r_h346%2XJ~j3K>8xd!(>s~^G63?ccF3v}2DJl7 zCGeYbs&N2BDqr7e6aLilvx$MctDo}15x|dk_}8Cz2Zk^!OEfQ69F3kFIulPkEuEv$ zHeaD9B6hxHrpytG1Gw6+_87UH*04H`;}VWNqk{5D3E_h_P@|o%bQ^8m_2!TX5Y{kA zl>`hZ7zXbqi7)ncz5!-)V<}K`cjZ1Lm<|TrSuWPL9sn~>$syC@RGs~tBHHYH$3|Ma zzpY>2wv2M3W_%kUvr>XpXUV-2o7I36w@U?=+kN&vQd7FZRxehhs?i!hNce5g(nk&$ zTu(X0Z}G_hYRxu+U#=>Y0m~=Ys$naj*mpHtT2V*(o}-pY>_RYNUJp_*UM}^~6WGq_ zUnv}sl5iw;jHUi@CjSlJJesAqLo98~{VN{h zu?$2rgvA6%Z~V1zg(saUZ?JP5z3Y40GM7$?ZXNpBgvVyq9=jM zmMm%pfnC=NFu{>CY_^?OD###&5*KUz2NZ@dHD& zul~e7(kn*E{#7t~Ic7P>=sJQsHF{e~NU3@2J`U*UIyyayH3SALn!X3?lBCcf7SKwI zy}tzjHxSu=w=OR~R3OenHBxONUP#n~u2yZDlfjW~V3^|iD+u3prU|vmhD?4omT^l9 znP9Z?2z2}D{d`|YA|zyd*v|5Q(HD0`r()JTuGW7+rPKf!xO`i^j{w?_HJ&aR!9Q7iD*f=$_N9xqhZ)7YP>ha)d2r;pK(e4jjzK2J?}!jVRmQ!9@l=xfaNe$6M7CG zRx_L)-6InJQ=cfiI1P*mB$n40;=NtICT_A}lAc~(UDMq7S^*C1W;|P5$Em>dd~<)B zKvsTUJvjACC+o|Y);km|*Nvx!fTq_TeNqcDAVHy)#UK}vVq&WT9!&RwUrD@#YBxf^ zbNbrBGc33iZ{f`7xHJ^#>?nqg6;=#q5n^hAF$DlJosTtznzunUyR=BF@XY|1owe4v zTVZMv(B2`otORu81KassrQr%7zvAR2X}^89%S(~cK0KHEo~NiZV3}*{`Hss~bWl$| zO?h{6%h__d5;3w$KZQ}OOfw1(7{2A=oT#BwP=a@#RZ`Cuc-Gn>h5S~TTNB79lZqxU z@G)#Pwn1bUL_x&%s463l!_t@+?+0^d z$Y5)+hlS8Se)i_I2OzUD-$|B5)ZESe{hMPLQl^9_obV7xU@5h|MNjQHP0f##c+i5{ zS2?w&+;a2F;Mqij5el4VOW@UM?i2Bi?_hE%_Aou51(SWS#5Li%fJqV%Ly8fS;($QM z@&NW4gQJg!c)2QQ$y|$t#{--3*C&qG8E`G|oG6jC2NOy#HNuF_!f9YPIq0K)5#AIY z;w(apT!T~L`zV@6hFcHMNZ7kCnlb?dDVU&VT(!bY9w5~4ot5mRsjgDBrlQmWfqNH6 zzYD5uN+tmy;9)JbjdiNdYwBiZS01CXrbodNsV;KyvX)z#^t#M(Ol}D^^j87qD??co zWs0%gujhw2__k>L=u(~S(z}x+4Qx?ut!c+iYl>ixY=BG=>_%uQ^}~)N71L~q$`%t% zIRa~u+W?PmB!?fC*9@b&pIFbMHPRQ>S6>mIviDK_=D7d z>H)imPYnt0)Vp1%vzWMMVe4K8RSb4j{ZJL{tm8!Da3gAo!FS&Pn@4MH)q5@&dNnT* zh$*$u+&-8SzQ`I6b?Uo|=&!o*`>tE0of8YDz^>K+oPO zOBY@<2Y?xJ<0Sykl?6}kG7n}KZ z^SR6y{0~gb#}l=4By2n$yjWds_Dmo!n~JpXHrZdx>9Qyx6v^HLg59dmrzq6WkcX5+ zAKj|6`!>(ESZts3OnAt}uNSY+6{W3$bY+}?Chq=F_Wm1CRk8H32EQ)_l6_ z(eb*oeD(FB!dcLTHgLEEW+jAM0*02_U>`d=VUb4HcC}s&!YlR(-d(820{bu{4TqoO zcch1ptn&tywG<}^!@C+)Cc{gTjWu`j4lxDxtDJ~&2yMd@@H6rs53$x6NKlh~jHMWc z!$zC^L$1B>;3i-k2gW>IDzo-yjkEl&L&AgmU39ANI^Dep1iEu$3Um`fgDYT;%bj>bq5ocxzj?AYYUZs zB@uqRz4T`-Cs7<`-)47_#ZC{z!WZ9xj+>J7s9t4Ht7Xug(&EDY&DkH>>8zvhRZ4cK z<_Kx~92S@>Dqo(&Sdl?cfMESA@XJ$#`3CX00c}Tm6G+t=WbVwN;(1^OBv3e>s2wGj zy@LD$4yAD{gEo!go3jgmJDGwN6cF~6CIr}M4Lb$SPKkEf91EGQ^oUjf5-KqjgFe?a zB^AF1D(ZGRmkhH{mMapNf`|ZKU|Z4euiRY>&MqPcVT#m-+-d#>)|mrs2JrmbG#U`V z2J(=33Fy3*^)Tz?t-hv$r{_m-ScFJ7_JxX8z0e}=aeIho?tDF z2R7?7E<8JQXGI%aIPoaEkCO&XU_b4B`?FWZe*9kZxs~zJYEgj9jvHa#if;p9+F%$V z%-S^dQzgV_qSKbdc{TdRJm7ZxY>_WsA(qK;Vse;b)fi_kv#;peAztnjsnDX~*YJ)% zBrbjyu1EB|lpCy#I8AQl4p~*{7b(X0@AMD21p!U-I>B>hKsLqGl677zaCZ`-5TDUYR*Ub6j59=CSS_}#1wb}@yu5xbb@N`?jKE0f1PcfED$svkz(>z*Z^%8^}JIw+YPUm6y#L z);C1;#p&Sv`ByY4Q^iDZC_<1xhyTbt<1aUY|4+E$0t^_%XhL z5`AR<&CRBS$`P;*Lps(Su3A2k$|b~ihCARnyJ}$~84xQ2YSGiuHA zN1v&a+?p8#xwQcTg$h=uwC(!WZZb=5N|JwymG+TzHU~DHb8OmFB=T7EdikYFqUind zVG-?h`ePVCDPqyR@VcA*z>)tThY&uDeMtyl;Nm=nL8n7_$D8XR`0K-6xFFrh%@!^j7q9%0?lb(^j4#e-nDXx#fBA z?Ppb8j@{P3l?H3rR~^yu6Dr#RO7Gs?eY^Gg)p3}U2%OcIlO-`pBW*j=_r;m`s71J6 zVU@i};p~-IL=jOWQm)6Bc>d*&R3SEtUZo3D5M^SKCgD1>f2Q zBVhixB_gB2yX0DuBgnv6^HXVYI=!QG&NC(-AC`=;k^n@%iuWIS#q5H<$mAq#2Bp5_ z_&gmzI|HFn=@6vZ9Qcy}QeG{#LQ>cCv}`- z#(c#JV6)bjoSZ?2YGK<=L2TBxmYEj!ln_1pnx$!neV+{5bJV6!Y3)<#ixlOoHEUVN zncva-93B?n{(kkhZQX5A+}ecc-MxhpoGxbIG>3gpKyco$3{xW5*5rFYatOL5xbaOq*&P z!R9+oA--wg^=Ai?;?AcSvd+v|t;U0UF$5n6x9W!!R5Fno zUu#;uJ-l;D@ZOEIl9lu%l-3M;r`kx_`;Nm01b6tH1wT#MS`%u^ z=urx>?ho$>iw8ifOrP_m+qPSlD9$)uc$upN7{bM_bUD6xJgUq1lf}bZ_CNbz*){Z9 z069|NrDpPc2)xBmr!z}!$Nr`mkfTF?MTM(ZUpNSJx*%dw<2F6H*rcj|XNbp%kJrZ_ z+sDKG;V}X~Atts_N`?E(rTPX#WJCAt=2$X6%`=Y@i!ujxbpu?N>>nyv{*hNSPME~D z7VVYUK55(*u#3>6>TvP4kXSym4s`ptHb((X^T{yRq-A}-d_y_?7%{q}`#AbAKF8k3j2~=td6Zo_uKE? zH%#<-&4j9HWpt0)ZO`QtSCrZGPcH?TKK3m{!jR@#z$U0TOpANn0*WbxX$al3j+$24xJ~=0Ps{_)X@uJ=`UPZa zRJxjYxK)J@Eb}`;N0Pjik?}%MP41Oa&`g;3wCl$ouXvCChW&fC{@#wy4M9~QepkL0 z|24A;R_bUS6I*l-oUl~|D}>D?V=E9R`_>;6M?=QqT%y^K)TR?RekWqdA^>Jt#J4C| zKvhm}-|0RN+{k0g)T1QBDzg%Bj8Lrd%oOXCN`ahk<{|R%QoES>;iy4I(!FK2ETBu% zeN_&ni=^t4a#%Gr+(pI-n>i>yP8Mhi^->KbPbZ&! z0bYoNYp)?d;9C4?z)>rp8x!D`5oPdiqXe<|GurtRPxrU@wma9b!j3CrlbIatH?=7) z&D1i;TpKVg1F$k;YM}85VV0>0cDchV#`Pwl?=X3LPWz*7tGo*+yWp+3LUJ+x0}Q5L z##&wVDO1b57?N>kbUDc1^+6FyOABieTpYs=SJBO6dk&o^Q(bIaskU9YKLjC(T z7Bw;%XD(O2v8-~27@iI|?`xXf9u#;S@z4NJ!^qxz;JqQeV`##0zsiLl_duqg(Rk{uUF2A;B2Ger?wnLye`CXW zdipo1Pwke3bWTz9L~&3Lo*a;Btrrgtu#h9&EhXxCwLpae5@^RHShb1CLp0;L7P%Cq zdj%ZKK|NknT%Nj30Y{xFCBMj}lz7ICfg@B#dy=4)cT1lBs`vJ-p;j`J)&a;tX9M*L zcDb3?S+%24Px?I2(ZR?v0;%qdGqW z3_h-OqEd-o4kIkiDF+E+pVIxKpzA%^d`Zs=;!Qqt$w{JKg7Cph-LI~4T{DKYyE}(1 zb`}y0sMaX#GS}@~WWU9>61X+y9JwSA`JiHPfH*|6uAVT?iCnDvfuzB23OMi;FlK`` zOwh0|G9WGFZ=pwSj$OE){g;Y(*zmGtMsLfpxI4Euzr?$45Rf}-Fkdh;$uoAq+8=RhV%EoG*6!yRjyOwks08!n7IXwkN*KbvfyTJ z4`bsuo^7|4GvUdz9MJyhvQ&yNV>2%!-i9R5wHIIR(7sPn_z8>XTQ1K4Q;62$BHxD# zs`L-f3P-B+359Rn-?cy0*cA+N@Ac2k7WpXe&xM8d0TsNxK2@IJ&!ziNan)xV1sf9F z^V$im7pJgxq1)j>`1ygn@uIhrE$3_!#W~s{THlengiL%gss-ThcA9i_PJ2N|K76z{ zA5^oO4K*^K-|KH40W9=-Z&*OgQi}qso|gGo+9q~2Zk+$-SvM1O$UgDWMNIwO)S~wb z$~W5ZU(1r*14gvXYK7h~Tr1}~Xa1kdTx~L`_}E`yoP7ch^1E5>me~HV`xG+hw!_29 z6Ej%!G8knQPGNC&+kO&zYc0rtZ3CkAp;<11`$DjjA-%i96RdRMP9DiltYS{1YkOrq ziej)4QNm5nfnsPpv3uup_Wju86Mj~hd%b>lr}9~kwbc(%_S)Oks|9v}jpv#*t}XlH zXV@HOE=5$alg}Y`Gj|;}@qI(fO^=0K*A{s(lPD+=V;)f>Sn4({jom$^?Y^Gd_tt4NyblSE7ce6J`#RbG!XZ_50yVQ(pwa~V`-cV+j zxBZ$cW^1iuF)*g~>>LB-^!8>;$=6TGD7QYC)~9))w=)QLt@QD5+JnkV_8(j$v&a4W zNCaWPkOUj2CLX&SS+>=3cH{~%Z16?qphB>Sa*3gE8Y+^8Mykc}#@@xYEk7AQs#V%V zoY=OAKzu7|zUW|g9>yiK!F>fQ)eYg3Psf-EhE?Y<7%)B@oUpe1?Q&Ynkv zN$qN>rj|UNae!qmI}_vk{8Y`xUM7%EoQ`<}0Z`zRl-p2w`L10R_tv*1bn}QiBVOVc zc658&2L#x64qL@3zCT3aD38arK7QYVFlJU7zYua$o@w?5l#aZ7fv7Bm+q0ad$()HA3Se6}@0Gs_5BMViPm;(XpVaXEUz?j^uh zooyEw+ne_a!w0zF0YJV4lM!ZfbOL=S`Q+D#Iz&}HL*h#Fc4(oXx*81Th8;-Y?E#}d zF{4`t`J-lNS85PIa7Xfj(qoC%={>%6{o%+?@Im@$D60spQM7dgg8H23c<{bQOvzum z_%AK8LgC&IF$_b zjpt~!sVmh{Gx8`lQhd~e1UFge^TWb^DlRwQ?*mbRSUSIsMv#3VkOxbQ-l z0@dH~AK|F-+^P!FubSsNLp7hED29}EYd^`tp42u?ZVN#Qqj5o^WC!lq+%*X%PLqI_ z&Cna z@2n4aRpM!>WaTaavnZQ#AhJN&@229aO)|KW4U(J6|YS*()5EU+B*>JH&-nQkh2VOr2}305>J-IlL;aW zz5r2LVvUO@>^?T!TuO57)T z2zHU12xJ>2u{EEl@Hv+AEm;^HhzfXOqf*1NJAX3nY!>d($;R~BL2i!cTl<(Zy@87u zceZh@x4S)il@GMD9PJ;GL}e6hxX(pLq6N0QU66)8qkNB3Te_{~T@YHP6L-$AwJ#{4k`FAyVwBUap~8PiGoem4{u3!@Vb65H0VZ zmu;$L?wIw_wPb6$i|_?rx9`!fID&kj(MrGv6*l|ClTZ(e>XiVl+8)t4EXdjvnQFi?*6OQcEx)V;GA$S2#r+IHCJ?L&Qz*ljtWhwB=sIil1k@W z$LH<){{9KC=kxh`Js;0so-gwr?f3L0X0F8W-?>cz1<(NJu%2nnKfch*I;FvD#=Vaq zP{v%qpN|$XMP3u2b5N5TRwl+oQb43~#2K_^L7e7#NsP+GKVs(S|A4W}3jdDj8;}tT z_E12KC^%M*jUTcIp#8i#6jLFB%Ymphx}kFsP{K<|yy7@5wT*nD)ds*@cwyE-kY!%W z3Xfi&o^&sp9E+BFiWsx=q=;}Ng-7>X&D)vB1 z@&Qi#tMuyl6SLzS_!FagQpZ~J4Nfv0!DT+y`yY1_k-Sel1^xY!_E*g&^3diD&c?2J zo>m>*6DP4)BY?o^z}~ z@9-40t+KP=rH|P<#h*{8h9S%yNkiQhmp9L!ryqw#HkEJW0v+tV!16RR)ynJT{sH;d z{;bvojVQ0zmqTwegHME+@3S6g41?Y90=_$v7|Dn}=%pG40ypa^(GB`nb~YTdes-!?obParKw;!RxRMfKsYCWax`0 zxBmOT}8mgulq$OApkON(9QRa zHHT(i@ZUZUTK@q#3HS&h_xXfZ8hpT7-287ZV{@NYki{qn@K4md)j9P5=r$&*Cm5UP4t?0?zV%7rC!X$a zOe7DVPo*Dt+oF8Z=y-Jf#f-|9DLvOUt{$MtL|o*?_O0QdRG7f@r}RoSKlkxR3+|v2 zX}2AxBSZAN=m1jZp;?G>kBfljh^G@bXP%ON?!Rk8ywxEzr`yB6m!9lExj0-}vk9}a zE#LGWq+>p~Lq0OT{+;q(|43%fiSG~0pqIP-LvUX<5k75f&e$4bUTAoP4>@?S<~Pct z%C72ffT@B$MVMNyKBqn==zH|#hIFeWaxVlpvTL<-mwo;}gJS4+`nXon>Bj@|QIKvR zKv&FAm4og3M9?|9M#_-!;?Gn#Z`{q3mp$=dI=>SB5vZr%pO~OlGh7&r~MQ)JCND*C7}JzK5mJZ zu_Nki8QQ%(+8oR%-E`}I)dNAGiB4w!(e1DME?I2pFjFKYz-Jg{gJ+vwAs_ds!hcLE1US-YDsp}gWes_C2?S`B~g~40t~zoX%jC?H}nj* zm}-4^#S>3ai#A9M4El(+C?KGe8e*Q#LcwPrT>;d!<7-7I~YV{$FEJbB!+iam5W`_(ike1D?p%^8Fhyku$#>r3)i#(}THkou9dWGY461p~+ z)_6-YU``}D&5l$;JEO!FJ7cC*u9U}%Q?6EYzT=~ZFXqsaJW%6y59uh68T%6(9{RkHp^wehHr z*$C@+#l_Y-Pm^EwDNg^2im;9g%e<74*JTItEMsO}eh^%Wi&!25``>%ZDHT=j64I zBPs}Du=px9mn=m1-G2_}YcdEGh)=JM9Yy4X%`CWD)>^zRUpH&-t2gQEi@W>3OkZ-6 z`#PFa0z@Blq338*xI)(riwag5*8Yr0rkn$_k)1IgH}i?g)Ek(~>VNT1Nag#c8-KbPdd=!)O6r8ZX=sjylW$$i zC)<}M?;EV|j_=u0wp2bZzJfCI)y$P0u|0i5ajv?N2EHn6K1RXCS3Z2!)_Tq%*>vDu z)tz5WRgnwgGAs^H2l6dRB09_?alKf>KVG7*r#Ft|ozPr**P^c9e#d+y>h8zO)}52u z`S*AHb@i}S%a2;m(>wF}ZBM%%b_qOsNP(FLMpY2Jl>QZ_NNx98qvPOv-)cI=WNmYs z=ynPtW*jcau!9vgY=CtuOcb(`X_^cT*HC%Ym0EZ*M`B3 zPfA#vrcF9+Lzwl1s_?o}^b1<){@JfW(L}3fwqomHPJtK5a4bn9TdPQii98DxGTnb` z$!%+yhDJ6tP(2+!7FT@wR1;WtthhiL-h62ok?C+##ajw$Qs3FUr`3R0NO8ns?T`&7Elw zeffgshBac);yb4#oGo^%l@DJYXK0uJYpQCFJUW-0=&?(sg8gtVb_a95Q7?o~++A0y zXAi6+)*3*jQpV5D{c|UCV6WZR%ezumjZYW!$DMnzu<2HX955?GJKg-;N|=iu=(T9& zNnH^1-45n0{U~$gX>ZsqF9DoJ3cD)h>+yMYhkf~^ol<~>eMxDCiC@WTmh!!Fw04#IKC#feZvU<=aM$TG#|GC#>3d8A4y0|E zlX%k?q=YY`Lw>&Wcy86lIYofh=Y@B!gXS`CS+0Q#(s=V*puA8D{!Sgy{#WXF>(4wY zO9)0(skmj(xM2Oho#viz&~~e@btCIWwMd*2yD{lWI)abL6scUPePiC-8B&`G^++5m zzxL?LgDZ$|0~+W{g@^5^b$?-r$@&u>F>{F=@u|J^R%etHHTd~o5;3s8dn0T^I^oH(@o*sk9o?%rC)#E#S!@Y2CKnY}MWPq?-B0k_z8X{y2spr~+n z9@6NWC)^XPdZ?3z53b6AR=IRt>)QjHW_YD~BVnl!6cC6Y$)FP!yMtC!SsN!2VR|dI zfS}7>@YoZtV`!Ct^$yVCn+l~8x#d_vO1b)-C78Q!*(`g|lndzV~LmW(T< zK$MlK+AT37__{036e_z=l`_zI-6AVhV<$dzhqTw|3S{X)si5jix9v=~BB+DC>U(@W z*RMv*M4a1JYHXVJe1Dr4=t5V3qZzH#B~Yw#nh{7G9{@CUgL-UnB_Zis9)#ENkaGn< z@HiDVMiGRe$D%4bHJ?P&jV%sb>dM;nU4x&|6q!PQd|X2$*kR@c%ja%SWVO9qlOA#W zr2{Vb+o43a;^eJ03+w$J38xOBs7^oPWf*ybv=0(y_4`o-!?D8~g8!M5Y~DDvu54UO zu5%dEBDb-)jS4Tr8U&N^K(4a;%4cKS2`#^~1N@YMFu*e&p4|4crjJx=_-^hMeqRY? zQND&NXu2%G(e?3k1RA%14$_1Z?c?5Hh27aI4X>jfxEsc%QYKOwE}wjQ^8y{)X)$K@ zF^lNWx1lb<8aa=*|BhZucXFREbFl|O zh4TXhrWCM?%6;4`W0;r7QM)|FIuF}Nz>N*);*DSCahdf7oZG!Iy)@NlW#*v-$lJ6; zmtalz$da`0Twbg5rz{g4uivwpG=QVxuV1<6KmVP&c_R*X*bSgi=5!HlbXa%3Og#Jk zJ@4;5u}PEU6qplVGApcn{MvD&N>+WmvfvDvkmr1)CRPIVa3@g<*nR%HO*Z{XsayCR zr}fvruai>lCs8Q00yZqT0^t6UM$25ZkS!)!?540@&yWCv{>VLnKm*DsOMrJ5Exj80 zvvSpqDZ%De;a?3A7iq#f-1}{T5b=NUi=-0IddF0tlWEvF@#ONd*`2{HGGW-{9z--h z@XMv~Ns3$V7Bydm_Dz!2rO{o!T!ig^_aBgEG2@d)eVg6Mqa*_j%Lj5?@2OJKFtjow z=5CC}@DzSj%e?{QE>&INs&~if70@*A^N{K9RR@m>!qH$r2XKy0(o4amR$h-!^htsC zl@y=iqEXS-yAVc~=BmbgrQY#U43n)TgM+^fqCN<8KSGobKXjxRa7PsDbs7D_t>^pR z&-R+X=(L=L_&Tk&+=l3jNh^n=E7;VBuWg{@ml5Gu5xmN*Y`uh!rw9rO~e)N`=rbGdtbWOUj zR&*g5l^i<&vXo$17LXtC@JY}lDNxMAuIfTXu@D%>U>n6KVi+m%J^_ix7b!K}5UQ5db)|;cJDpdPaiXU10fH|Kc@Wz{*;vopMGjiFI@c7kRk3=E0yx-+rZi|R z#i8rxz1P^DYu5%V#PiEViR(j&F)JJYvXvHX!gs}mznKCJT}ob&>ZJG3o_+=%Yg;V2 z;D%AOmS6Bf%wzx9c%Lc3LnyAtl1Eoap09J3nVe;Y$n&)-)WBAMuLV-ZgSRQY1K6v) z0;-SY#oXoMe@U~|RxDEu%}Me4(vg4}S>#M&;7U(mqPLpw22iDWUhf>MzI_4K*zlDl zFK2;+v}n*%&~x1fbSVG>(W3HG5_UtZ{4ZN;sR83l zx--i_djewr6zjUb7Rvz6N)C4u7flld^rqdGKN9`VZV7jsj_4e~Lolz941y$Q@Qwe@NdML$aHuAIW^MUi8ik}~W9e%9PV>4 zz+e`I%p*^9cD(;Hf+;zob^(Anqd?B^{I6_5k8o|j+1nHb#Rau~w7Q7CC8yjGT64D{mZOBhEiWK!Y?!@6;ADs-D`D^A6!)o$)uqA<{KxaI@6l2N_Nksmu&{nu?z5i z*QV05n2d}j9iOJJOWwAgO=kf@-OLT}9f-PE>4MHU8}Sra^lM&|A=UXc56qNmExksy zb6>4^Wmtr&&WbTig${$P!XW=WOH=IwXh$~y+xdteaeB2pA_YjisYu3sBvvY#Sq_!{ zOD%tfTFgWd;6?TQG-UHJjOR(66$Nc@Px#Jp#?#O0T=l%tCxEbsJl^*_Fb%n;80B05 zeVqqlq*3%W50)gp9}Mk!LNp;qn~N`BxU%`5uZ8C$3eTRz^$%c5Ac+Hkg)-RQ{pLZd zCdA@LTlz;ni0Epe3OzYVS+2l+Btu2?dR+1c23tuUrxYqCKdR_hd4^Wc51_E+lyF33 z*g0dg9{yS$F^`&#i|d+Ko*u{{%z&dBEBt8Agg9ref$cVcb7Hu5vDaMtClSLr zye19*&elqB!pbnd`10;&CRux}LQ1YTfctAx{NqX5Kbx>L+AO2wecJwj@mrAnNE^u_T8iwpL~Zc$Ry)h6`sZfU{B% zlLoOMsVx*#*^rQ9Q5mb!S7&V0mIjovbBHTqcj-loHPW)lm9XzevnM)q_L=}d?C{;F z8no;(2;j}Cz=M9%dQ~^kchrWQ%rjq%w4{1#Z~>lHn}Sa<8ZGW8?-1@ewQn11-`yc% z*nOhwhPc2|p(}b;7!ucWQWGko6{?a^2(hx+;M2+S^jCPl6=6GQG_BK&DvHy{f1|BO z$JE6s`^@8X=JiAaP45{>LNPnT3r}hIpdU}9mQj2LDgNB6 z6#*jGs)Yg5+18W2YtO=Zl&htjwqF|lTudK}1F9st1z~GTjcT_)^NRTgdxxERW`qb4 zV7|=n$e~BweSN&eLDQ4i4fOE5M$(*NUyddsS>l-JTS~awF@*rU2DkTY^B$qhr`rUk zAwFB^CYlrMFT`lwR3IO5m3;q)KSR@&Hr&_|siZAEQ?eC52&yO-_1>0HqT=PhNd24N z{&kOdo_^8C^r>n)8#BkH%+YkQme|Sx)$)Pd&MDs7@1!SN(Dr>g2b+@bO<3jTAL&jJ zX!alZ(m9u$9WmE#G1*4e5Q7;F>irin43b`EoXyA%n+$^s){kxVHohLR06Un0x!GP$ zzV41=r?{~v);q6iYzCBXR?Plhc&^RW;M2A08^DdTZuN1MZ~HJZ`emDQmtTlM8e()P z;BB8&$C<6gI^vWh2J1EHEGVDxeFK{#Lsowg-_uHT@;p|H7QXFw`K+it+jFh3C+E2o zz*5>>TXO8ySGNNW%#tVXBAjZynaJ4rJmd=$f0D88N^_-n(%tr%mvp`7nk$h!bFQym zBkgMf#C!rEo25O`w|a_x7ACyVvU+=^Qw7npeB{nxWT))tzsqUuFiR#~O^*x)kO_b| zWurK49iR@DG%(M!oFE^fc;U4b1Mf#DA1Be#jbB~hhG#Z_uxTLPCmiu-U*gy2U`S-{ z38`wnnxT&)R;%E7&jI4}3FmVev%g;;+7J0182*o!zTg6VSV(xIsrA*1D&W#g&}$SU zPOINkZ2<_b=MjGJG*Bn14?jF~?rQ1l(VtOMhdlfLCX&)yAKIw0;pMJe1yVKJ)poPO z2?o-&^1@e$-J{5AY#=E%cbV-Y^HgcTXD1A=4BM(-jg>qvDGfM_jagiC?n;WKTG)>J zf@qDW&RJUDWWO--3qI=_5gT6ctuq*UDzA}QUDVq8aI@*!-15cd-~>%dpzSC-)sLKXZxg$u!J0-gG(!GPfam&>{%p9^9Uz)n?~(^7_erpO*HY zGMBx)k@M;4J>r`q#cn2je$`)6ZBS}$EOOyLgken=v_|4kiREc4Cvz&lM7O8qQ%6M14SPAwp|E9GzbYQq zVA)=p=;BrNd4Le04Ky-{KPXP-M~M_k2uz=9ll)Z0A|M=mqkJ+4~rk|*;Ll=*`WO#Juo1)s7!ujpToNA}1 zp2a>ZS$h;yRG2WSS;iWvQ@b)&B#ZYAD;ab<-)}If&PXw;Pk!EC7v#9U|403v$uP|( zE69)|(a}^449x7W?$~1bXk#viR$^X42OV__122iTypj)Ny4c(J`G+E}zs#Raaykc@ zti4`>`>ozp0tf8JlZ?M*b;=H?7p#>+(q?qTHs6pT3?3?Wj9u?zWD@5R71^gKAI>6x zg<%Gou=1v)omq~Jf)73wjmr#%Cgd4;(02D2d$P>P$d!`oq?Vd^V#|qyr6LUbr-I-X z_S4YFiSrY9%t!bW=!%UmOad>*^eyqWl(4XxrZH3HwqKWlJU#J&e_O33%x?iE`u%oo zh?}_s#ojTv&r&T(?xo=)FKSg~8uvM*vfa#?uw!jbFB4Twb(tXpmpqZhaF!FTi(z&V zBD!xra~Cg-PTz3%<~oIK&pUoCdScI=?bpWkNOe~3f+lnyH1+^oa>f-;L!&;Z6Rzik zENoV(U3=4pYVeh;7uNxML>6WWHAiuBR-M+~$KAA(g>hP|9X1ry$8TdiqhN zZf4P^AnY|bK`p^;^)uJ_gtYARjzI#j=BS}NSrFgWq!%XBnsT=}f)~*DpgToHBuYu^ zPDGGq+kAO@zQZ;3Qs?H5rjp<=9ZA_*I;C#7B5Yd|{999oZd+59n#@4|&4h0#W3Ff> z1Z&}4RlmH0IK=%x$I;n6htFPc_r?m0k!_;UVHuL1qVn)dombs<&9C? z(LI!^K#z2qW;eHT$Des+CPizX)J|`=NtXL;^(lBtvR&|aX^KnNQJdH$;P1XCSHJHV z+Qe)ip?53;HUYNrwQ(4OwldxGwN1M3+aAAOuC0oG{96Arsr+&=&?hc!;(4f-fWmpL zG(auY*-Owh^efvN+4+cauX$FPX3UAWkAFQvxqxm-4LoeuLLih@S%s9LUoG<8%y8v} z<4yHH^=BOAz1rGIEc}DIEyP|Pc4jzObwAe|o>^Mz$}u2Br+B-&Z>x3{>g8rC1NDMrT7%(zX7wo}lFOgYSP8h9b(UU<)%Z96nH+14aQ6VLu*6~=<` zeI)?HHBxDvf=qO~8s#`gLcxA^pPC z_a<;k-FzjL_=8Upjo%NcKG+{#Q`t(WZiBmDKqv={wU#pt>J5z)$nS&%Q2x22XFqU? z)#{c3DY-0grg0f|71t3Jx>_u3ioEjuTa|HndP~DBml*jYKlud=>1jvZsTjachWF znsP7>w#aU~GP72U(KI*8Df81U;Nny$eBxak&jsYeRm9a=k?R7~ENG{Q0X`!iJ8i&* zMIc6jmu`fdiJ!L7o|KX78$Yv-{D&5`PA=HK1qQY1m{xbRP)-rnaTo&qkQf7#(C^hM zdSO_OtPIk)?xlIyN9K6U*xmdM)>S7Ky;|r9N-~eu1Zj;;Pd8vLC4bKvB$W_J zPcyeMbZY9Ep1IF7G7_Uw_QCs+LP*M4{%Z4_!%g7wpRc-lH^OMna* ztHq|_3rK_SOZF9Kyaj3CQoy@+)u{OPG-BhVUUo4OsE3edcoVl#n8r9(sC@MHd>DM9 z39Hx_?9s6cyl)r47}~Z5?PWkn#SpNBlf(rK0XRQ~gZD`}NgSS%CPLLI>nAPi$uZ?2 z4qPuHPU$%M+8S$nh=rab;f5Hwp&^2VNMZFH>=ij`jtUMJVJ5}#ui^oRfuWxyRyO$p z6Am2x%?kI;%A^>zPYT}h44B1&@03`#G!)CSQuS*vV^nmCs$=6CBvq<(K>`o$g^!EF zl#37?YW^5`kEQ|ghR^o*60myR`mvlO0kf>U;a1}+dk3f zWQaI1DKw9Aa~Qi(!!oP*g14_$Sz%%IsR4U%pg%tXj)PQVxVaLX(&H!4g$TH$7Gf($ z5k#5BWU#UvdM_k)=}CxLg!@spyE+cEeqwI{3F(AW`(3_W>#tiM#z2xgnr>=e0zg+5=$%WUmT&0mZvoq0&e2Om~Ly+X}>q_(DBM094-5GIu zTzBvgnA~tZnrjD3v4#DP*!%ai$$%>A+dfzWPI>=xfI1uUHxm*8Kr2pYe_X>ex$qDL zdO)sh&A|`QFwqWZ%c+n#io4nFy?MCcPsMP^jA*fz2ffZSDBShGo)FzNC?KMSh~S|8 zYYfZ8x;KI`qde0xuAB;nkbw4L$fwuA2$Ay7ZK}l$$Vm=3LJo9qP~C_j#X|ssfn%Ea zaRQSy`c)qM83)q{fcJ3`k2zs} zJ@9S4@VI@Li+$vtpQ4=SB3;hO9p0#qIO7#Dmazus`U%aOHd%GSg2R-k3Lsr|(~jnX z!X@E$8FGaL{0#y}a8Ro3vU60&ivsM!j>__{;2}hLk9WPB1k9n@MCNQEfsS1B)ixa5 zmY=BKDDqG8+Syd%Sil92i+4IClG^jZ!|P5Gm|^!*O2}YExGm*W6!zAh%b_)t=DNxX zno;94Adh`+R!db~f&ZkX+`z%#UjzBE;8|Z>Cof<(^4Z1w zm_)abZ&27UB-yo(3ZG;{?WM55nP8JTRxTZB*M{7juTmh_vf~0XX^@8hIPn4ydNfHV zXePAKN_yz~P6Fc>`o|jjiiD8P4$sCxvq)*z({ zNIMG^Q+^@^X%oL+=Uxl+CJ7lM2QcW{2_lM5DCOgtYqqqN%54?&ZQ`5OrQwiNRU~I= zpJNx~sL-1~TUUHv%MgG(L4|LexZ$16QT1WNx8sy`r2*kzU}a4@71WC3PXWzxtb&6v zZS?KB9(fJ9-&Z3nhe>?kefsjOYZ)GTARc}W4Y=ifcBq`PO4^=sfFfxrP2eKkNCz*q zIE4>V?ymTCop5eO05F4T-Fwd2&j0n)8}hC<^YkF9o(*66UiGq9=}RA`3wKzPjJ2i) z=?-A>#izdY{WbH?`3+O|k9$-=v+lFcRAK8HdqcAJeukRU5PEMhnlA8NtVXnXgHm)2 z#;FGF*06E2L4Ae;fMc#nSX$8y@6`Z`1&p5@mdC|}foi8B zFR)R&?-5glu&tz0^NtwEYwR0&z-NV}9Suz;9rkOy8lymRe%bE7sW*v3PKsMg%UTP5 z^`_Ax($qIG?Ak;K()SSMG?tIsaZDN&m?K90;59FZk<%osp9rEXSDFw5HaHMBu2Dm+ zzS$R`oA}0*=6>@>^{inBlTiJRKK*Wb$urLB^BvmDa-cOS_G&)qg~^#WQf!mV$*1OG z#21Pm-uZTGDNnUuXwWY#DrX!w3S9_lrlH}OeK9hVi`kB=^9gl{6mjkQn_2O6PJ>cUZX zl7N>!!>>$1FM+o4DX1=-qjx|2B&VlEfohV=f>&EooiQJ%`6nF=mZIT)66HSo!M7xk z9ToSP1O5J^%DQROySP@4?lW7}(cIg@Y#6EF?6bn#qlVJsU7Y4tHZm6n-&kPHycdnx z&nVwkD0{KcbsVyod5`?aP{Bni)_~VccZ|)O#w6)CX`kNiMZ81@wYblYt1DlgJ3V&V zKMJ55iU*ymCEY1OcHh2rD8Wb$H@tqxke`zl2&xRn_b<~@GnlA1-0@cnf9ZOo9xh?? zai~broqdBv$cA%0GR#3+<@XmbSGfcKW$qc-`4`PW3m?*f+E7qR@PSk@%>UuX+a4EL zY($bd;W_`O2$e2kBet`l8vLI`{x2fp*Ge$#1IP3^$A2wU6@!88<6p!PLd3`z3EmC| zB`m@s)}Tvl=nNOGzt*)Ar~WqsX~zbZ;SwsV7rscFD&rn+Fn%Gw(Gd3R@JSX>#AY&Y zYXj`|y}zXGB%MzF2mVZww`Du3g^JoXAq(n<2Y6z#e0Ad6w0&Pd$r5Zmb+BFv){z3; z*8tr#G=U3zkAp@4kPOaJL0W5ZYHPk*U6v9!pE#NmXtyR77Jg_g-0l;@OPG%5JkWkM;p2j+D)kTU{qE-Xy-ij~tgOMQ@K!L&^cIg}~axSTaX-K2kMm zt}5Zhx#IS7Z=%}20)UfNccR%QJ&EugZP1OKlHS#xD~@rH`&TDl$PT})G%KJ1-snB_ zss?@f@X9bE+sFryO@*i9+$2v-!nOz|Ln~AUxpm!jX-`>vZsROToe(7 zQFA}$E`k930Lm=*jWYPQIJgrRb5oifBf{(yS=wYl%?@JCwufTBA3~DeZpFDrT zaSJxnZ%_inz3_WN!%T|+Swf{TvCe}5Ae|I78mDi<$I8jN$1-j1x%k~1y>+~~^a!~8 zP!T0^!THp;7lY3L8OU38(W+w=hyJ*%I)1KFSAi-^F%J~zzrL*Q7Q+WbN3G>B0uA!) zBg~RFdH?9#bJ?9Y)_eak3ZBThwzR1F@v6tqop*oUdMM&nr;8qbI?6`mXFUhwu0igg zSaR{e!Jpw*xEBOmJMC+C!cYP+z5#Hf|II>{VRQwyUbw8U-|AIr&W!K#dvqb#(J8xq z`rh`@xsy4cUitkrEZ$ImxHWVYdHjoCtlR{m=g)cS%_p|)Ouq5%OKZRrwZB4h{X%&B zdL^w3emS(-OAQ{xj#LyKL7?_(|k z{DiJ#szB|CMdC#L7}b8SRd^s{H{qm50oSSi+wvp5r_#$24~Hz$0r6mfgm%^@Am1pa zV_WM`5z9IXL(Xs3ar2@03L0L{xs=%?cnVdTywO}jluX9?7=!MmKEIx-we_(3*QJ?w z!CpPs*8V;7Rjl9t1fI9&JQGzf^V@^FG+h-{y{qkyL1&4LM6U{Jx35SSx|a>tMGz&N zQrL(u_GWhehDqxX)?+RXZcs5p=0PfGr8lT@axq#8@Txe1VgSZRTq{J?=se+a^%0XA zd2^*>JvsE4)~aH#{B!R+(9s%zfuWCCOLMl*F#d>&jay^eYnc0VHDz3Fji9RRjx}3W zcLa^SJz^~`e1pn13DM_Te=%(qJ@cO<_9U)phLa7fqwTK3y&Q(Lyt(bOqUQmw~`&6}$pU+NN-ZRbEGN)Dk2@Tm;n z4RN_yUSFSnxk<7xzDlcr4K}P@RZLW&+ zdizrPAism3Fjq8EOdM9`1;&fia zKFXXAD7jDGnJ?*V8d@BL$^9~w0$tMqOeJp%m0^f>ANNKYn;F=lb-DI)wJc?kf%Q9c zW8QCf{cV5Eo$Ciev4pHzn{&Dkp5v)Q*DJQz5N<7kf}Tc?HU)Ztw;#j#J>Q^m0sc#D zgY#k7jIYPF5b?*ve;;Qt;n z!j)w%Tq$=4SGXN`i(l!8r}NYg9KLwhq&RI;p}ah5!$yCu>ky zrP6=pTBUvpyR%ab*iGRTzLCk8jnE)j#WGTP8eE1~5O|U)xO6N=YE>)93kRsyI=4DYshKA#PWx3P7aEQvA*uONY1@h7 z3pQtwL7-GsvC?s629A%({ZfLT0ki`C1d~R8zig=b2le`1d;K1LUo*8D6oYyn;6A46 zXxst;7kH^=Ee|^S_(GhVo3MUTFwm6?H-5tVFM;l=?Vl&E8!qV1v4^b-3~PhsuT_66 zGuyL^QF;Ylx;r^VKn!7U^PE)o*y&;TE%^q(jTyj~0tB0Wa7*@nh*N8+lbK92O0xP4 zm4&$B!*e9mZAt+4i7#VY^vs}E;!$dP9j|{;QBe{y!e)r17XB>0=ePgBirQX z90aQd1f{tT$c*m8h&C6wZjDGRYFZy7TjQxl$wAR)XcY;v$*G&F=Q8?2G#gVMf#St? zGMM3=e-}Q_(@uH5?4cm~2lOC0R)TkK{$4D&3`VGX0FU6LYj9_s!f zWl_BUf9n0tkP=dBOM~8FV=po1Q8gT}-YOfrQ!y__OZbdJ1#Bmd6hI!h=e9IjzO~u; zFFjqZ+G6!(pjh8DY^oTTr^2AV8H50Yv zwYK5Ez=@ZpY?`hnC{)DIc4>QPS1tum+;f$)ldz9eaHBic2q z>444L)y%wWy04PG;S+WJy`I;VfxD* z3BSM-GQf!vo~xx5xpb2?UyvAhAs240psQNjnCRVal{>aQ)NLj<|#NxP6H=uyK-ARs%OIg|xsp9z5LDS2QaV9cqVs_t? z?h6hK#SYaVGhV(558d20sODc?x|^xM^VfJ-s*UsD?5_$@?F4%!bfyeI8y+Kgv*Z`y(Ay*Z~}*oac#tGFRW zx0i0h+n~O`>^{Ql3}E^K>4}bmDaZRid`MVHv-z-OMQyp9@s+sk)YQ&oyZ5>iN#AR3 zUt1oa0nUg3a<0y+z6&mu`__uUdby1k{%5N;Pp^H$D*+wrvu?X~5FrSo8H4LKimcnX z#5OLL#J|wTx8{@(NT8f${ud-r&)4OJxaMmIK-JDht)P@C0XTO67+jdP02W5$YZyTC zgq1UO#Z#~8Z`Tq3%9W?RZll={=f2VdBG|VEmAq?vHj|dy&J;-FNdxY zz#je%wviBGo5yxAKUWOGm}aTs}RZKcN5 z zd+@Q!lVsO_MFJ~!bz(oDIsT@x6uQM36457c2WW1ift~wc78KJFhTGi-LvF-M&(%{T`-^9@ieQm&W}s|0 zP7s01&H%rITK*MqbCSiNMPRea(a;JQql=d-M5504|Zbln?XBA$^8?#$s04FIKR0HDXkXhdA|(ZKr0 z*NNpuEBSo;m#&(x=9Ax=YF4yO+){M?3WA?$sl7W0_3%S@Ox^v<9HAGfy4UsG23ilO zq<7ezHea^I-4DS(11|e*v@c2z*(`Mx6~ze8ScwIW&hVW=o@)yDBE&044rwESWPp3t z2xzPeoG{l~aH`0K#kV|iDTlVf6XW2!P5RHypE|WTK;?k{WtUpfd9yHSqflQ3Ir_=(M>9H7Wvn<0rJ+(B(9+bd3Fh9 zL!~Yc#v_a55~Vzni${VG0VC=A5HA7 z#-cu3{v8@LzXuRlhkKUpxnk0*ED<@S0DKTd=rPY9(UV_^cheVrI5EMTX~&l_Mj6|l z$Re%e$ZKB$Huyz*MpL3LKI_>0C0F&&P%t;=n3opKP_gCp{FcLsMLGAK^1qyoVAb-% zK)X}ac!9MDdw@0zl(kkFBQ3hH%*{zD${2&;)qpC?0CTZGi)5<5R$_IFFLEwr;((WG zsIOAg|8n4dO)c6dfrrZ>c_|k!w%I7Xp|jFVZ_l8w*=?Uzg*wmh{>YWD-6~0=m8zw{ zV-Rpo9|K=!d#MiUj)SZ8g=Ddw7snT=KkBqH;2LJsd9Ir|eI=jHcyzT~$>ey&104U3 zo&MvtP>&;*2`Q%c9u*VYz)Gy5-F*T>b5MluGO}znvnk2fBTj9qi}A3S6z% zfOO8rI6`!Lw41lP4aRAM{io!o_pvsFVIVRnmk{K4Nc8B8NSWq2YtPRXR=rx8-nt#P zHNF%r=i5lyQ~!)9&Xh%baQt!FP;PVmL!*^cJhy$KS|+bH|2+5kcaYSVZ&I+i$4!-5 zJ;`@A1`Hvzxq_IPv+g@oFY%wws&92f)PAO%2@&8c1dr{o5 z6any9t8<%mW|AbJ43tBNFejX^$DLo-G0_(ZVubwkzSxKNph_v=pydsKP^s(a`~Q$G zF?q)o*1H6T!1u9Ac^7SwedQNLQ@6*^%}>zzzCbjv6h<0Mixk!S#hk6}y!?L@oryow zj~~ZByJv=(YuMP_x4F->&1jTD?#LVoNp31>moqd+uC5W1BuSD~n=4785TzPPl8W;6 z)#>;B{Ri*Iw)(z=599U*123tnN;?81$WCs1mW10ZF5%+)Afj4DI)hE5f1Bu zRn&%)-Yo4~kT&K+(Y74Trfe|r6>=3!#XwC1ps`KhSOC)XS=yMaIT|O!lpNf(Z1oJ! z-T&AaDLO0Trmb0}>b@<)Qb!y80|=2LjGvd#FO5h!K6zxW!TI5yw+?Z&xr z7E?y2KyqB$EnC;9NZTJA|BMCeKwZ{VgWHOGtRKC8WA&6qLSiy(7k{W96bOF?U5K}0 z1xG`UUg0(pS?2Y;jX91q%Pr#;1OTGkk?bOJZgVdyLofHkNW&v)?hCJ;bXkNnpY#15 z=i$-2+mVW-1jJ-o?zJuy=A~r)GT5z)Ex$T{2!}Ug<{pa1yvg!0UXpR_Lb>5SAmVwd zuisRhQL6GN%&L8+YF?rF4->akcx-A*@4>&>GXZa6EU67-R0a=MTJL53R z!YzEG8wNIaYtGr};$n>Cj)uRxwI!=DuH z3eDiYT=;m1!9EnAnC=FO3*v*0Fn zFCPcCd2z!xZx#U^&SGU zEI4X3$HepSl`*{6rgW{BJy9AmSYULJf-p23D?cH&W>IZr5k_Uhz6T4nDH?X-=Hsn1 zTIW+wEEZt{N4^c6pqCzr&W3Xc`V?OuBe}|tdE>8b2f6>)ib7(az zBKLlSw5yPJ=Mg_CA!48Q13N!ouK!wdR-#>6#?tWeI4NXGKXU4013+PcHeto;?2}8H zrek%digTa=3$xdBUcvJG-KUXgPre6>Cn2koIl1cFtPr}TMcWIOD8;H>v2GaqxzYuyqsC$srj{4>)=9^%nrznh9oeNG;lvDo_@%E3P8vRQvyXem z)^4=BtJ>=7o=)sc)ZtIv9;YTvLM9|WwjVZBOJDAee5I47Y8@APV*vSIUYKKT?#DlW z?_aDVIiJz-<6HJvr6?|np8qUtH{r+|gN$zrVIDV}w0}k~_T1TXBYc!8ME-f$fq8bw zF?jz?_+Sk~jYkjq+&bNYO}z2?vxf~lBt)y!y?1Z1PZ!wv_hw@4irx1Q&+?1z9J+0@ zvGVeE^263_o{8~HU+`7)_d~{3%ae`_jXGteH}Bk7N?Tt~j7X(LY}|DIcMk6T`$pNt zEI?l&iYm>tU{18crj3Z6d5LpV*k8k*^zH zHD6$yW*d=PA6LaAEO&8tBo53a_NnWOOJu+gFcusqm^?pH*2(dmv$2ofkh3$=ZXHFv z9{pn&z0V}l(;1a*=VidggtIIba2N_*PGY^p#!Ks)w2VdDxT~sSTWz*U+PUw5?Aj`2 zC-N6Y4r&%vCCe*8EnuEVZ%1<^@L*<={$9oIy)Mi+@m!&5t;yI!Bgqu)iom-dp|_IX zfie%Jq?Le4BVW*1g=+Fzql=OakNN^^wzQ@35G@m(v~nXcx;ID1&31~4@Lx!R9awH5 z(W7e4w9Ry$D2F?1)&C(;%@%rB5pk{8=JF4H98CKhOJ)cHgJ%ZXqyV#i;lb;rv;0uV zj!2*|`RQTOdGm37$S%mekQao0*@F)cDQU%hC-0YPNrqb4SwdV@pLCMIO1OQx=Wu3) z>5!~npAkg%j~l@PFO$${x+7|FMJ%l@(1dHQ1m`gw4T~9<^36G29l357qj%(co{ZL* z*mbJOvPjj>GgrrJv#D5%`85Ng=B&Y@OW%(4-f3*#)>iLy3qMY?oE)R=bV9{cYg3{B zj5*6Q4f-)v(%R+jPN9^W91xVhbqR|6!RQz_R5u<6ku+ABK;9kv-6B;2({sZKk7<8e zM{QE;$58cFS+dR{C~2L4dlGxOQiUZPt+Wo(ZURlbmTPhHx2(Zh_!aKMeF=wQ$NZ=B zG!RM$-UnUvzn4ZT$QYXC)2#pf`F$ zHPAn06*U-eQ!A(&j;-`Upj+FGegA2c?DkZ)zJE#S6Lw>4Y!GA5r)?;6~u(8z97Pko7Mo?!bpMzE-63lFKz-c;6`LPOxXEui3ZuNW* zJFn{^e1!lc}({?}p17-&414WS0~W4^T^;pjQ_Ul|acwx*rV z;xAOwPqeT7BDe{Lf*cLlzjls|m^1q-^CjV-It!{4m!PdWvB1HntRq?{3Jl}JE@X6y z?wSa=K&l`c*_BwVH%(GoY~vE@Jd5;N-kn&?2#v6BgQlHv1z#ljM}MJW?9v-poP{0+>};1t!G_xviVV4kB)$EDQE5w`n?Oms9!?mIIe4$&If z!9-f(eg9&_$~(|u+lNYDjy?}|(pmb-r;}Q($v0p zJ?we&1?tl!K|SW-Vt0Hik)e&S@z4yHd5yY9{zkQ@?rip= zXU7nRL)5@5{kM?3HBRX7@Koo#_ZF@R|A}mN>JAiP`j#@FD!3G`pSR=1P~Av7gR*6G zlJQtQC>vqY1e1wxYqWZ2UUAUmwDAnnttpCB5y%rsNhRcJ3HLP}V3Oq5kfQwgwVVte zk+g3fqC;>%dNYJ7eE|cGqH!O*l-I1itna@y?2Aqj!5?gfa2*_lCNg}O@Sk@T@hQ($ zTZ22YgD@}&@-9vW3xvyJNhfp0B}>4)GNP(p&%MpzEBzGgWCj3NAxbPK)()ms%_)tt zpDS0rlguY0Ktpc3QSyIbq&^>@pR3Ng@N)vr?4?S0k8zs2A+HbI0Hrb` zriKjaQ2ov^^8;kSrzx%iTYiXFt$ zw=JMLX{$Ljxb?1Ma&h4|*Bf&2#U85FL-a*V{zH#Q*oFNf9jSzD!&M42IU&blLD<4f zWqMsBJ8$2Qfd<_-m%7yi*1=KB|EvfxVq1|!THC&#d_lUKfSddp7!EEm@L6Vj@k^mY zKTHkR0AsDi6C#*n)4Mybn&Oq}X3o4%BEeo^2Bf-HSxQy45E7Y&D9DlAXt#N@vC(|X z@14ru?!^axKK1pWj*T6f^CzJ1PsIT7+n>fQ`ZoW3a)duli;U~zFavh?IwH|Vl;<+ZpWfdsvMr^I58v&k_+13G5$r({Qye*#c>? z(LsqO@aEO=(K^wKCp#(3lh3b@ZH>;q1x%Zuf46SK+i?NNciry4?Bo)14!YQUD>)Ug z1Rlr-|Ca0OuwOew5z_fFmi);f80B3DM&- zM71HRNdQ2i^bxdrmFS{_`4ohFF6N9gk^#=hqk7h!>w}JuyUmOky&j)Y%t4;@@%6Q2 zNN{^V`qAU#DYDNCYhHv<3t5vjwaCCLfhvJd6oW`X+j?hioxv4^In9d9m#C&twv#95 zwU^h5#6VU#*KVx0GUL%1M|$|5BJ4T~iz^oEPtCj0i8x{7J=*0HH5E7^e%C1*J*tKl zP2Q6xAKk0Yqgb@<-Y%?JTBBQSX#olnXK(`UN?3{P1=i~y4{_zrmQ0q;1n9dD%zEWb zJa0f<=z>cTN!Y)z^ePKLQWK3%uZ6u$xRGrU&G;vuv%%mfCvfkkzWq0qqTu6f)vwxf zUMbIWu&XDO`u^hI)OS5d96CULsdV+j* zFwC0?a}r~qeXxpiX%jApXD+yDR*wi25_9#yU5CXCpdA##^<<&U1u*sCL zprX8+D|tAu#LS2Sb_)qnG3njzDN-c{nasSFA%pFQNQ7^|98?&tyqmUAJNKt(PRh@K zdB8yL4c&5o4K5sjYP|Q|Pry-3+C-WcoHg=^SbH+k~qSR3SP*yUM6SQ(4U~>Hx6Xr}lFxe1J;yp=m>DL`yJA6Gr~QUt{hELUw>{`ngiO&sfkx9G7+{`cPn7ab<~L z8hihV5-RxEIN|KGa(Y4Mq7!r45AXc1Jv(&BpO9CuMqmQQ z!F0$lxi$38{mK(=3i|lmXOy`@W^`_JQ%@41z^Dj!Wk^A|m%!J{-8`h?MZyzaT)5Kr zFZwh;ldU`qC_<^y6R%bOvVirV%52sfv;Ma+?<;;k2~X6fj!Gt&I@yk(!0CuFy$vlYW2E03*+3)K62nJEo>wiQxP_h>PjvHZkDH1O5-(he>M*cg7wJv1RhP0)3O-8s_HAdfuXBQj zPT(z4K0wX;|@BOl1cv(WX{x~Jl43!@}cU(1cfh$2n)1H{*Y$gOppuPv#yCh z3xxck8KOaEvz)^4ULv~p_3Mx`US3EhK*Nl>+Ik24ZSvpBF;ZQpn6UbP53x0{6(9=u z@?l<7c1_1nOVd$^ooBCt7F&l2z*``2AMUaE$P+l_8w0U5Ul2O8yTKHsL<$v^S@|M% zkFVB?wUOShw}$=X)h~8lj#_kALY@{CCnU|W(`G=$vx3tpY&$3$X*A&HG0ydyR4rut zv^zV{%GSzH`5Mi>K9;|JA!SPtucD0H6J<_^eMZxWrja16IS z3b<|#fd@M;mR?4*CZ_kZ9QcAjCc;|GM&`w91URcwB#omvTF`})PW<6$ChlC!%5LRn zAB(dKK?+_o?yZqKU1epy$A7(0vKsq32X}pPOYiHc)dhue*$LaPlabK`A68C}EW8Uc zlW_LsnWE}h&>>kac$OoZ$?_b!P_yi9#{|wG{eIEB4UDFKe$(?i#fH%L7^_B0B!3HNsP@Z)Dc`OycHZc-X-TBO)xnq$9U-%RpaBb`sKgzl> zB3#vX!u{$J*w=P;vNQWd<3P{|hd&gv(^6M<*I64ms;ZH*1&<=DQtNZenX@9aisRx~ zqvjzyqlKY&_{(o-RafdR(O-Xldm%Q_FI$zt(sPkJ@=vZ$G1Urh=`; zf;Z$*_J>raGqnI?od9x7WZP$$09&?K33tW#Diaw7jkqsY5xEGMW;ttdrTl)FF1ds84W7k`YZg|=t82EYrR%+ou>(Pz#h}g8N;% zsu6vv54nV3kdiGoC6H3#q#={S`mpffP6?|TH7RY6&OKY6TK_#3p~J!tcpJ-dFD$sv z$A<=0w`sRm9(dw^fUufG5;iNmsI_vuk*fPPqv)VVlCG#j!r*j$62Z3@wW|UdeO;Lj z!Mtkntd3zd)y*yR{cJZqiys|q1gnk-!3#Ul0ivXsNNljyjZF4DsqVc|-TV9+4eP=C zFR2J0O3XurUH{BJVC~4j?9+3d!TlcDi_l7-d-_ilC`?~bWl5R87NS&*qJm&cJoj&( zk>-s;^Al&!*bu#nQkmtqO}K$#TF-`t0Gf`>4O#k#ZFf(WzgOS`{ltYKnzCFbzO zVB1fU!%q^6e1)95;Ws-$sKQoBZ`+#~5ZOw2vUB69?JoPv$?#(t>FD;SU--F2h5atv9i5o7=ycqh<3?ao9g!X0&d^JxK(N zqi-`IML6`g7EWX_obrZ(J#9~)`(yra&=dsSi556puJnywIO0~WXj#=#+6t(5{!kcU zYi#YlvM-AP%i!YsWkDFx_-zH7?}{>PjheqBag}_3sJ$SKZJzDEFAp1tKdriAEwTM{ znsIj!=62l+k>m*1d<4=YC$h${kv$YcGDwMuwDqh$TyzW)?5q^bwX&1zhT`R(9=kU2 zv}yWq>x(_V@|WeV{@YVHe0jN3OK%dfLXkGgm8=RdrJJNQzgl zu>ya0v{AK%ZYBFP@k6lLM~~g^`TBQ;O6X#^TD9L;{Q_&{4an`9o^=WL+(VOoc zU);X8bM|31)W%o)HL>Si9+*iv20BX^kr6OQe!f>OCCOMsb-oDMJc>V>wDo@b3GgJ? z65WY2tB-izet4hfe_GGykP96tIb~m($H}|8%Ao3`uO{RY9Q^|3P678fIl0MS zN^2|k$}$nt6qmf;+ij|8t0S%5}7a|=PhGM3~i3mr&<99RnJ zv0+2h_<)q5Uvhz=P1R2>GWBo5yPRu(iH53e9SINvH(mnj^mh7?yS81OeByveu+(k)2c4zNBF%OjN$R(!%N;0BJcJK{t_{jPF5W5`uvas?;(|5Y9A}VTmn<;cmRcjT zGrhAeD{SlBR82S#IgOAB$y@yv|E*DM9w|GkcvwtlIj;<2SBTt;m)4gE3 zOcbgn8U@s1DdP)6ENADWka`!@Yea8%wFVwmBjrU%saZU526_Ro^(_2YrSTYbus!@t zOUU^j@8Ac+Lzs#OX?_Q%+h-FGPR9Y8ou{tGZ#rKynF`dw83p|qK*!tK?s)0fIgLBUo?)gXtrKgc|h;G$>T06_*9s<$LC#Dv#qAidj>^X zaa{7`3I{zhJz&C`BXdhY*++rV-e*8={?5zx^A^g7d1wrw*p;~E0 zM!%USn`4?H#9NH@E2se7X3=v_Hb}K`0NPRKdn20uU0%Yvp`%__XS)(ngis;gy6;(J z>M%`3nv`2BA3aPj8ZLQ}u;8jtWL!+5slK@1sL@%X2i-o;*@etUbU)I9DYMVXXM(yO z+!4aE_QG$K4nfrFIfyU~xwB*RMxRXYq;1S#V81K?@#H8*RrSg?nZdlfG*NFb9GeU# zdppQoGnqV5O9^i(B{qAVHZQqE%yyW4KN1wN>hnD3U-gi@FxAURIX*-4=oI?(nh?+Z zdwCQnX{7gL5>du~)=N!8(6A-*YG^Q^Q@88}9V8haGa%_B;Djbnf--JY{8`SuMhG}X zFiXsZwzCm-8NCo1Sq$3pYz185A!JV_H0@p0v!PQQ437zWf1vuZ4@CeuK*qmL8Amf^ z0Z`@&NBI=dS%S@`8S%(6l?;f=1Pe|NhUD07+r6hzE+=keEIerQN^1Etn8xZ@?lRw5 zo)^vb#F;4(n0;t?U~$GQQCCU`Q9P9+cWG{+`swc(#ckQerttEZ-(mf?o^?T*udH2+ zzvYRf2{m?{C^~J|-K$CIe<6EKif%G|iTNwQ+NP1=a@=VAvgIYyLtd>BoBo+ja;iV%DH3nB zo)igJ&Jh+m)>EaPSHV@z36bajW^AVt&SbU75$mEZNxn}(fHIL1b|Ye3el*YOO=7>{ zh!9`8#M#n{-%x+?dza*6`9s{;B+EV9Znm6%_Q+~G1^kXDa#HN=&$eENqyKyl`d5F) zOP>Wj1z%!ZuFLq;Z-z$Syw#Xy_xM!T>Lucg2R7J^U9YQ(yypf2e;?yo1G*5n)~B1M zVt|yfn(f14mI)$1Hy?NvI|FB74tTOnN7`i2xVd3PGVqbInmr*=&^44wU}VH#7gc_t zt|f=~g!<)n4_*R2=*u4)df8(lubpYGf1QudygC`M=cx8lpE})-{rU6iz2z=Zz;JT? zWD7)5v}6j&oIAB!Tn2d{7U8DX*y@FIZ~yLI#f_D4RO^Y63buM$8aLpifX!g#(bYRT zTXOR-1AZUT&p+P*$no2(t=D!TL0qHTNDFhy21eO(O=d-w3t=j@f7T>Vm=kJ)j8w-Z z#;gm`6~+j+WBb-zu|`a`^?w=UxI{tJks;~PRQV;0%gGdWu^IPh%Yi?!QzV}#SEIe? zFw8sLg1eRG^pDY#UMgXYQ&#l5=jlOmvUrj8l0uQ5TK3?lSNREN750%Ni*}BK zWtdvc;`-Zl77X4&gPVJToJ=3V_m;)LE|31!b$etxLyLF&!GdF#W8gYfnrd#*eM)FR z0#e@#W-~%ucYTyCt*TGW3zvV@Bhus3!=x?pz^azD66k5r%i(kOPoEV^Z(WJodvsV+ z(q}k{Z$j5LyxV=oUOS;)tpefbT31ja&_&s_I0ya-fd|tG%%II;!uCzkvvM6Ar%b5- zD#BcAitm}H)Yl8fz_oTEb-n~+qs?_7mPQ8ej2M=Gg%*DwN(Y%dT&IG*u|PurFRF0x z0tqr9#?*(Q#+YG^qK8q^Ih>UUaAXtD{d}XQY6>af+}u$f^NK<35*DQJQUFOJp-NfE zjCqwY(e~bzgZ%{sDhr?RP}_pg3(^{cdboy17UMq?M`$`4JKYRwvG!Eia;mEJldY0<@pBw;!dC3&O-gi< zn54wGk!8N~PGP>W5l9i*9<;Nr7D5-}jaYET2T4Ei9#)Zh-Bqn1-G583X%&C=tfNRo z5v8M8Qu9O!%Q;Y?sTz$^ARifh4s-Tgtv)%g<^spC?Q#H*epHKDb0pCrhb7>O6j_EM!xNHR@gz>|FW z80y1%-(@J>zF0StCseKrzY_Nd%>N?kTEF$Ni@A*NzuG1}lG#Yrs{d5+k*Y%vP16|J zm^ZB(q%|+DkhRp7(auZ5U;4>kDE)M#$6*@p`byK+Z>?XYcYdX5@mX31;o&`z8mYq+ zoZ=p3yqof@29g6vI-OEw6k&WlCI@-n{fL-h0onkxD~hE+DuJX(LN-XU0+DL4se%Bc zf&r#e^5x5<{^ft3&P>?MpvX-VCCC6oO$;IvRo3fbE-6#pf{*4)3qh2U5VDF&(VkT5j? zq}51bSs>ZLL>`(iXm6sOZ<8=vhfuPkr>UZidDKU=M-^&-XY)(eP>&O4~Ex?uY-$AWAgNfi}X_<3;#k zHi2HdrOTfy$mrc(7_Pc{+GuEAWk@%({j=qPdHs6C@phWkEK&dE)!bIjZ$Wsb_4od& zh6h0;CsW=W8$IqVn<#rI~tV zk%NpV(3gPuza)glbEJJXlusIAFqh?d+vDebpsD`wRR5+u2KP5Kv-@-7U5*MH`e}{l zMpK`q9k5y!s8`Iv>dj2vJj9+P`6!FtItkuZz3adgtT{DEU0P}|eAQ0h zs4q!DO_tx+oa|t?D}a<>)(?{W36g58g}tmL^v=EaVW>|CC7P`8je;|NS5zX4_vyM0 zZ8+=SpN!~bsz$M)gBq~EOhZR8N`)j#2NbYug#735yTs++6*N)v7L5?uqQ-OHa@MtV zp(b%?;0oO$7E_K0Vsy~24;J@&e)+O{tS6^fV=f=VK<4A9i->> zk_p5sYq7@ii=FB@>)&ioCwd>=RWV_lI~S!d0%*kl^F%k;ik8{fau#+dO!~f1gZKCr zYM?9U@SUKC2rE($7L-L7C<~eDO>nFu44&O4$Yy$Hb2i{QegMH!70?9$Wn5rDw zuawY7u`%@tEf@F{c;(yXRg`2W3QJV$sbt>tEb3_sOXZ#TS6Y7u@5?mVU~hlq&(?91 z3Vzo-u})bA&Qw?gfk%Z$@G+9>LYb3uksm8m1(7Vts_!F_ZnMwaVuXN^Z8!D++|?M` zLfo6A%l(stgEnj=&1q(u@*IQ;S3ud$b9fp_-d3R8RI8H45^tQ@o4}!@8BpSTr5NIz z^ajtf9K*VKnPUwyDYjS8DC1_@mVx{`nO@CH>9&U5M3_*Z?!95X&9{K+Tkx~f_E1pF zSQt9RPG_hV?8xeEw_p)Pelfnak+*R2?zMw1wRnid{RV@@_YM}fi#3~Y!bd0jL1<4K z{2KuOvKEE4lX7LMGzukRsZxJyQ;rnMYXp{-MMOKgp3m6bdIs#!NtJhhIcLB^&?!)# zsPgx$k3=8&tg^R)+gJUL>Lk*1akU4_SNGrHeI6S^n(&SjIF%A<&J0qlHMEMla0hCv zbfLZYng5BsDUQoSF0%>@9=$zsUc4%VCdq?|#Ix%8C-<>&St9FDqWpad-dx}Kv6e?g zByQGRJzBsi+2<8a+Cq+!E||J#EV87mZOPf6Q>6!{ONkQwwNgT&{2R954oTjUq~;9} zTIW<4#F(F{cXM{E6o*^blv!v~j$YM(;ddJJ=<2iH*H5w?yTc8;ndb|;9Puj#=fDB| zwI?{@n{~DYH@tLz7ZJS0XY?0BFa5V8h~d#uh2z>-q9%4Yn+0F$ohoTcRH$Q$Wvnkj z%fn~SvF+bw1ep5o?>V4oz$8q~9e0~k6V9pKKZfGWI*kKTk;_=`FIW}9HQm8|rgvJi zha-|qYOH@4XcQu+Sr{Ip+<_vUIaZ!auC}(+-S7?Fu6?87#dh=LgPYtZ(iii2qWZWxjfGFi1@uTtmYXkfNR>%@W~2vjPQ9x4 z1$QTj^8Km@oJkUeti8{EsUY7qYA!sfdS@@*m%jIBtDS{cHlQ!mP^JI0d~4WiA1MD* zU@&hOF}I;oN|YZV1_sTYV0ITc3>-m-j@YC)y9w}B%&fSFa$PqQABxM0^vw(G`%Yo3!}`;HQsm zJv!|SD+o$+1K85)XExerP_Cq#wIo zC3*DO@#F24pMIOB3DM7Wo_=q>{uk*|;yvcoLI3#$H7}wYDMm=eWGS7v*>Y5^Q(#Dn zQ46NPIV@b0EwXD4-#_Q}jigSIfDUT`!H3+o|52Da3ZGDRPi8BoSX{^#a~{=Be#Uq* zw@ve}?(*mje?WouzD9dis7kBsxum4~>j_mpG9zl!zCGOH{CulRt>n^Kehy6k*a7`! z-3Z_Pguy!C-u%z`$9_ZMMpIO%XQ$H8d5GF?r6}f;-y1fDnW6GT#Oiv}1gXw4ZcA!{ zgvAyAAjHoj$st+YGVXwC(C?pD5ss<<6n}Vc@%w}921&|Xxa}%S{^gwP*hO%opwX2W zq&#Ox;(v&#eEuS$|`lN2D&{WyHZ9SZW zPfgV9fBnMbX8V($ZwL-*q@>}ydtbbNnqhNu^<4Vt52wGIq*_`XC%wy7wqV#MAZe!* zmdM|zY|;q|6LPyMaVJC_LlvrH<()}rGEz1lLvA7Q5Qiw7+8m|*0VC?#y@FBo6Om<7 z)+Qz&&Z}aDMA3icT`#Oiek!2XsGcPYC5y;qaH}~VuK~?DPcB>~roMyUkZZ+-_TCD$4r~Ce@(1 z*{4WJ0KKf_{hNHcdwMqpY;e=3l#LmV-vKV z5Gwar<8EbWmO_O)0P1=6nG8X*01_WYc8;(Z;h(b8SjB)rbkBJyJ9ws-n|7Vl-Wm|R zexv5l^(SlDu)hZ|?(jc(EVfo%GjFKM|kn5P(r1;;|BxXW@K_>^P4I2$TPX9{ZAVw@3Z6NzP#Pf-g*zC3X`m{IDK}^xpZ6@-j*v12 z$PyeAMyPQ^Y=pMg1WCdk@~mIlRWr;ddWVPUOVuR&?fR0H^8K-U9R*I|J!|#zKBLlW z0k9K2?bssM zQnpixVN}3zp{(FAEDH7(T-k*!lTo4PY?)aQd6Ba&r!ccD{F_y{)M6WlzH|up`xtC{ z(50G_F$bg_qoLFr|60swHJVfJ&KF@Jx0#JS! z+Rjr5!FpOD4|vezf7Z-cYgwnJe2$CVdzQEE$H8_W0png*bo&iJ!d7#KZTG%6T0-k| zPp-n_0N3r$$hHoi%(DEwvzRIn+S~`ETxQs?Afz|?G=AG9_(VgNvi^@Oh5F}#;nSX% zQMO#kMRBi`I}JRyzUY~|^)qkBvkX0`EJE8qym2S4q{-c*1z&9rzWj#ixaXe*9S5Ad zS0iHg)!AYF_B!9I{a3bqKJ(o7`h0=^h`-bKR2nMXHn;sJ6&(#?XWbPj8b^zu^(WW} zuG;_#Du?Us35Ow!oPnVm!r&1WqC>#5+wk%-#E_H}d;GO+hp1qKxlkbD3BC>h%g)Xb zz9L~bp{G=C(MOdRd`81`qSU$0$jdr`kIvL^=^sWk>`(Id9Q(_n|3I=GLRcDVNq#P= zyVjz1{((HL7{0L76+ysn&S(Ane$hNWlA`)U$SM>-j8bab*UaLS&0nc^ zcjic3n?uo}y|yG47VB`#OHlLPeMMU3mz<_Oj+{uywKZp+&WZ%k6Bqi-Y^B z3hgJzJCgKf&S;%E%?ZYth)ej4n|P~7@_Rb3l-cmZeO&Y2c=a9~y_8|v;~7)1QTlCL zT9kHXYSZBLc0HqY_JIoz0&>vnf?Vcitr7*`Y)_lZ#(R=LTMLhsz(d#6T8Ly$ASisO z0h+`}fxC-AGS4R2CmaC_dJ{xy<)3P)v;=7_-zUQIRha#)3GhS{$AKY$eX18W>UXhM za<(4tRik~$)zO?+Z|OUKD1{1+-*iUtFzO$WR01u*S-siT!fx8gVQ1=Thrg?KKl&e` zH^=w1kBUGRK7E>xwrOe(QY2665TOmpgQeL-sN9UKvl8mnKC6@$;VsnDSPYn;GFNm@ zq1}a(>ZLC4X5*@&$Uj*H)~+@Sl-yODa5~_jeB+#!C5t5G41AWShrRUNE4}NSYS|$h z1mNYvwbq!HOU+fuPR?^CbQ6IUItevXv`|&3r&H@_-bB^*M~^I&4n`ilQp0T4s5aQ) z*j5efKK%UbTg&0~o_+gP@^2qozNO}H9(>h)r9d)OjQTWEIdC0$6>g9LG8z>WZe=`X zfs#Qq`yK&Hc7f6dne@~21Hip0hse3gN+dnfT&hPoW^r0i#@gt*J)etD9;&<#md*3& znO7icndNH-wIv5opoay3(%2l_FolYxcLn{(TPkJ#>$!8ptU6_umHdMlm>;-MoyIp( zbX=HqRN(h{KmDG&B4%G1o$G~kt%2bk8c1r!4h#AiIvM}G1#VBVTYU%(!ii$(%=Y|v zOO5MAdCr>lvgfpY*rsDt0?X3!6gppuZs1M3*`=x}BbCwnQdH_yXJl21k?y}W=T`Vs zh+%>9JnJbF0u+~mdZR4At!p&p7 zwW1~JUC$p&Y17oHtc(9nWAZS1GMf`}WEOny+1j(o}T1bbQeL`y&-c~!YqR;9tr8-UQfFbI9ur1`O(PirMdSqS3~3Zq1c zQ87NA0*-wKdtjLy$dQs1B)yO|zxd9=yfpbpS|kI0FiB`ZuOKLRf`VCUj49ZW4U3a3 z>2sI2UlV{IV4(N}>0b%bYs`oNE8@KhU?NE}&J{}9@=S|Ox7NUFr0Mu)_LFk85i7Nf z6a4hN^`NL;jd%bu%Cbo-vnjNaOyh%E$bqp$=~y!C(-=G!fL97LF2K-Pd_W9HWeDEX_L872++N543KomdZNT>SOhgC*9X@Xh1%$5gAe3u8otE zvoM2C+=5tB4eVuQ&e1}uO7*WL?Vt5S5Ge9boeRgy_AmPyUTc?sdeiWBuYwe2&+58D z%$(#wvWy7}_DdFePq^n4a1xDyUR#ymwHd#jHwL8?|Fr?KJ>hUBY{4_kk@8=pf)_Ag zc?DB~tF)y6deKY;_rg>SLDu~T_I=CNGsKG%I-Vp&L>TV?UajFnSke(Jdbm*gNv$M# zNUfXfcWkU^H1Oc2!H60*~Z_#BF(XIquCVI;BhmT?{u{Ba_o0H5im5 z1(?PZT%3ljc}g#}1q~1A71SLX){eUyRdQVq-c2r-JE~8abDZk%sMavJ<+6LIOa58z zw%)u<7q5LYQwEpk<*#hb*Sz*SJd`2-B{lwIV|-`{_`dLL92@pnP;`$7x$C)o|0-G> z4aZZ8U(Fj|A3LXd8~n)@h@${so1jqJ(<|-Di)6@;43^Ra@&_leUX&;d z7??i=s4bPxrK!|Y5F zgVJtl4iKTX?$%+*98GVZWwA;S6)}&2B>@ugZ8?=g8b<;Ga#A(Tzn#%$B3gv#%E*kE zJ27Xs8e?h}1COpE9sDZG%7P*|cIP!ENUL}opr{E3WQ@Tz1QK+hAR3jwMuEO!9&Jr8 z*ri$RP%k+k(hgg_%+&}Pu8`X{?r4AG6t$%09rVO9&v2sb@ERuGzohU|wZd5X;XB?4 zg;gY-ic&~`J@9qv^>*q7K;H$302b`fIBI<`ltMPv^fdmicY0F^C*ey0Va`MTPvnD* zQXp~U)37EeVj5&ImSDrQe>2AVKX6fCIwnZ`YtHuv=+8n&QQEP_3K-`8@z7S!~&$~dF4`)p$1 z;!R0>n~Y9(SxiS=q_#s)0z}D0@{U-72DsTL`Kx$aAMf0e;G%H|gJ@yOw6NM+m{PDZ z$>lcS=xr&^87b{CMD~DMN0{kln*#gF;KOP1#aI zL+BzuEE9pr=Vz^WSgrBsl30K_>k7J=4Pd}5@SX0djlC5WjSW(R= zX7US>HN)vJZ?pZb)WXLBh>HfhC%9LtRIapvyIe&u0>$b5B|^&%MT|gdA1m}8S*G-{ z;<2&NKR%LM9WpQ^1$Y73CN}=_fyrh9zm`lvZ8G1Qpzd3OgpRQUKMZ(LsC)sW^0OVx zW~#thDtGuQUP4Hm@LDnv;h6&YWq>H>_atG!!>{=M$&lY}Q2n;ntGA@O6BuSp0nFg~ zC`tVt$moYk+t(YBmJun_VYL*!HvMEN!ZMsb29Ii!sTJ^|R(ZC{GD0oA=t#eNwJ=hf zOcYZZ3b+-zXe!oSQhQaNxo$Opfwg#M^(Mf3DKff`QD2GDNo^Y073s$`HBTJWw9?3h zwcPxYfR0)9W;ekDP};nzhWMi$@@*XVeeU64eR)F(lNb-1F|&Z<(lQjNByi~>4*t|E z`KFCt?{iD*sLp$97lW}7g6ygOn~;QGa@)5`Cww{lS+KPwUc(8Tk|z?~z%M4%t5u%DHvvwWEzgM@~w#&`IV)73KajS0t+ zAbuES%l`oY0RR6KoQXdZj{nDZZ+4lv=H8rhHb<_gU6`{e6{6;rq!FTzY8U1np($#P zqLM}`q&}M~iIOB;K1e0hN4Jhoe&65Y@%|HDugBy0d_3Ndm!hnS2rc*s%~wO14(V!= zdxI%(O@NB3CFHl?1~zTO8e{>^X6uM+QaVWLGINQ`{9d^($Ulx8DY5h7LF` z)nm7;2`y@_Xr1zM12g~Kq?c)*@$I=h00;W}x?1rkFt&jl4N!RS;7=8y`9mAEjg1da zR&GLq&u}n-a->FtGLYLr=7G*~fHSKd*%mGvH<`GkC2j;|@k|ZoW!3w9G25vaEdWes zebw|FuWug(bI=zk^X@+v;uh7RU-wF1rv`-AFlSOx`czbe>=u&(tG$Xb<(esWUT>Ec zdMp%P5!ZBF{cGfUvP*lQ41d5b(6e2|Q@-s&8$D>(Dq>-S#zvnb#8DC5?5NKKz~y_F-*B+_ zSZIU{VsswTPgMQFhE4dXRw-0xh;&m;_^HugZ>zJf=P+q(ntU7WbucjQM!NrvTbIlR z+KO3EHpxEr++ss-D;f-X^o`i2UQUl<*_nphzQLc5S47HC5pvam|Nr;T7+J49;Vt`n zv#({m*`~f-*lBc@M&CwmHHj0t>!$5452|V(5uL-ke~(iAi3e&?AX_Am;|k^e(5r5O ztKT9N{7TS)*=>^)%=&1b&TQYK@#=jwuw^a=b-?e^pj+7|voRW|hp65&ZohLJXe_%H zi`P2MFb@SKi=H_#_QebhMnvLa=cUPyLIOR@0S{$GlaobDgPyH4&xGWon=a>gl^pe( zJ1~91>J?LC(|=YGv)IDtL$3~R&KjQ#^1O4UYpz7d|z!3N89@Be%PS+}3w`ccEn=WLk9 zLzvY75c%d(ge;Qy?4+yAM^qoJyoWv&65RCK-^>wMWSF9uX$pi~3l8fF-HKTvf2pAa-C0vUPlEC#!?x(B*DW~{MagYBVjE>)kA^N)e@9()7@YWKntR> zVe1CXSDOg7jBLtO9$Pq-koV}2^R<-tQPV#GUXbX6nEufU?8oFUH|*)ry?H8noIw^W~UXEI#R)%XB#{Y4m>Dd zDna~X^X;@MX5ALDpgmJ@vycz)0O(+1TbCz#u_~lWfQm)}uz-hbVZ-7mXwOw$KosYG z75`8}#K-Fc&*{1|R+BWbyp-XWW;ha@-&~{@*`t*>w>WBYonYUQ!Mw2l^y#XU+6<-8 zq7j#IeDY<}g&>6CsR%3Xk4LZ1Z#ulhtQz)ixHo}&`z?b)w;sN7v@?rxfkC%+PdDm0 z5|?hWM{J)ZZu{}5xeTH*$U$W5seD+EAQ(<6c~N%_jW)~Ikiy4IuKG?b-D_$V7Q4|E zPvuefc1FK9x{jX;-*YLmdK0Q%!EU@>Dp<6foMfMlKl02yV#mcny+)`a`PsDt{|wdr zl_^aQm*;*o@P1OFw|IR}X7FlAYG>b>PU2&DU!I1uWRC``_J33z)Om+*G%Nn_w5RQ` z(TUp;LW4~s?N3{;Z-pp8*e!7+O5Bn-;cu)d z1V@G0qUAJAFWuqklfY9xA2YbYaEbv*7)efU1twLwZAOJi6f7^i!1liKo}!n zA!}Zu9MG`E*vFNN#(5=cyqI{g!Aq1hqTIME@}7#a zHZ6tNKpve;TE4t-9#3y$P4XeI1meCXmC(g@AGxCCTE6Cfo7rlNu~tlR(;Yc!swT|g z9@;Tkl-OvraVFAYCc_VGg856yZY*?RDbLmJ9|pV5K95H9cT&^QH0fcjzDeY{sT@y!uh^i z5IQ7HuPE{kGV*EAVJC0Us;iGnR2MdN`Xey2m>;*YFD&Pc`qf{OKE!_yC6nCDdf44L zSkIzBAcEE7R;?hFobicoV6{!tK!(;4mTsLh(fRyGHOxhT3XADI=Zzi!q$ z*JXd1s8&S*M$!Nn9C9h0PB^J82Dhrdt`gO^2Z7DKFW*hy=_H;hf9mbJNXDj4tUuz}ukbuyv*&a0 zt9e{8J9C)=_J+QY=Q*Guc zz$U&^^?Pf8(RlOiXvOQ$rN92s#48IAI~l7~bNcP|lS+Vt z+65zDkaUYE_FpI1qDFk0n63 zULFf6R|nfyLVC1sVzFnR+1uxgxyEw-VqF4@C&`I!DT%a9ijTpkL@nuykLU!~1*14# zE|IH13(}Qw_Ijf4fBLk;hC%zhJd?bnG8~Ia-R$Ix_}lFQelKfKn@xmTw%}D*2!-|D zFn)x5PQL&L*Yhxii$zrI0kdyjL2&PbfOTAB#Sx7(am^&NY9JUi>RoTH8R(bsm*u4X z8TWZr?@A!;D}fZNk$lvZXPnZ{j4WjMyRnQQ;cH|E2KSh|*ie6QtNMgLJJ1S$K zvG}$05VD6`Qe*r|*OKd_*#gY-pzw6&hSSQx-trmTifBwP2t45Pp7}2N?)GaJvq$@@ z$oqY)Jw!*w6Sl{ZW@KXT*qXokbgxnci<3Ycs%v~AgO{D>C_QRP*s1P#Z%22K|@D9 zww0W8iCi;tAK?Sh1Hw2`=$%`y>Qzh<;g<$Ud_4p|Q4YEV?gm^!-=I)(ce{43wYU=@ zC@D~tCo+?Pk4XVBp#sc;2=fJS&sEz6C)gryuF#Whb|qG#D0j&~7qVK-&AbZ@?G(A& zHW?s^CG_CH*5e5v2LNp2xO@FCQU##&fb`WHo5}6?byKdkY9H7uw;V zE-aw0^b(fb_;+J}-y__{PnTfXB4mq>Q?DSYOW;uf@mT7Y15al!=I#v58$*I@#=&um zxx}^n?+#$KS>D9!=XF$FVhzxKJ!Al;@0Eso(G0OQCV;>v8t-eB$8`p$PxQSV#NvQ8 zs6gjc82<%zD-V*z%QxfY$3Hbt6{?W9!gV^bLWovzmEpH{L)j`KHE6I*nQj7Q&bk?x zg5!sUoZhDge2XN8T^3`_5f$-c#Py;ui3QrUW_C4^ zhji_S^4*-5ufhu&n{_0(EHV9+|Bz73^e?aLYLv3o{3gMkJSc3faeYh|WWxm#IRJBc zfZBBap|xB`h1c#c0qjSxM?&7i)>}5Axw?xGQv$%0ECjOoOx-b?wNvuDpuMwviF@T! zne=H?@zYcx#myjCt;$`xIYB|5vNW$?Sv|EZ@C6P5k7#@Xng*(tZxc{kay}dZ^dO8W$mgxFjpDR zk}C8V20LWkJ^2DG9R+iT`*;rp=GLSISNdCd>AD#Ttb2fNn@Df|tNvWLRoTZammU>L zROq&Ae;Zdk_=UXrT~fB@dbNYG33j1IaaCx2w6XKFV|oD4WWpt)z0A2d|ELUhn8?4J znxDqa&t4L&JEELp?m5$YH@f#KdN+Cf<)P8dzxzn&yUEmMc;HwlO#dA;nj?U>6gs=+ z$E`x2UApy52=Kz^`CSg#%jWCi@^sliZ~9ob8yrFfBvL_^i;yES_};|9@m3&xP0KgR z{aGmbnF2=Xw)Rj{2ZSR_XAxXl>C1&NdTLKHvAskR#OZ5DcKZ83Z&1CfTAUAN`J7fI?ZpVIMh+>As$BGR9N49jofDWJJ(J*uH}+f zAqkXmRw!7NJIpfmHA~|QOX7aA$QT&BCez3g;OhiV!#pRd(5XvQR44LH z4BkEsj-bLwHUy)w3;$3_vr?<4RIEvIPgxh~ygJqp`9yUUc`m}QoJ4rR-quC{UpX;S z4Ya1bIGKa;I7D?ivv@N8FtzzgQBx|I=Bes zprPR`@X{=Q15vaA$6p`Hh@dBetw|6ySGXEcgq4XJKf-445r?Gw4T)g2EO-izAHmIo z5@}5nI*;RM_T|e*wO?cG%1Q#;vN5LW$5NA61soad$117Ga!Z_mCjh zSptUisPuB#$3T`hBH|AMZupG!A5l#KUdb3yIq{4!cWFsd^u=!~p|az}AH3(7F<6XwYth|4||0p!D`qE!6vNWWzv7 zg~Iq*O>U9<&d)zLle&N^;-Hys{(%+2$DYlxS&!@pHR-3Dw<7sE3f{79OrvtSb8_-4X^Bp`aQp5*e1T$lJ*S?BziNG=XkwWDf#`AchbqMmHpYLpq`B6%*tW z{!09I)RG@RD>Q$fWZIu4+{YC#BzX)rxY$himpOPlQE0g+IJMF)0Cu3>aAt~utsNi> zf9&dTDfw#OH`8rD1QV+ewOn5eB8-%J%>S zdlvI|XT8F%#+-3-FfjqSn*;v)1hdPo9ekGr%4&8stR(PaS?0^7GDx^9JY^R6-x7$k z(fm#2LSYNoqYdyl+qrr;@=136(;uH}{qVuFoQy#I;g0W@cAG-rA46WSx5}ePo$DCjs(MP!0i)xTtq(dQ&jme z%oA~*l^A}>v%!9_%ES*?Y6(wT%x8~7>=yg=5??-_hHcSs8a&b1T*GyBcj}AiEGDZV z78^IaHyumNJKEynr~q*Y0un-?&$2i~1f>J^Yjh_Kpsm)SN^p4u;0!Y;l9-Q^)a$t} zesk+^DgHts+3&HW7KYpbw0)Y z8yV1%i|`RKyGjZMO=JA@K03>8IL4nwufffSf#xkR&^YwJXaj?MMogqcSY3a%AVz*3 z(sA2ZC#^?f#+M>aoqG=mXUAg9t=@wHtRU=ejQX6Db3#npbQJmo@nXIV5`Nwj)Ob#`n6vFnmUQMup)@mLCNtI_dR zv~d88cu~ye_>x`=&=Psr^(6LM^MMw?#$g^>q5W44MB^63 zNebH~PT0qV_;kV9Spu5$!|}H3>w=FTUMM>Lq0W`zo_>;pj5e0#rIwz%NO~`)e~Wz} zsd-3z@$jp6nf;|U~_yUJsHO0ULe1n0kf zaNiEk{O?6xV93e+be;92eVk^7fm;Us1=V6lkzM-E%==3wN*%PyV4+I6>{{7WG)0t? z`_Tu4W~J4tt-baiyt3CS=UQrY;3dfQL1U%Z^xOXSu;^cvWM#)d>%g?!?94S@a`aHd zBrn)8u;kRX#PNVl=`7s_Mro50eBdQu3B_ zd(z#SE<(>qUyYqRCb6o5sHB??h)JpSSu2!~a~(I8DWg)@>(P^r(Wd;LX)8njvWzzD z5hU(tnAMapbM@x%v^4d{SNpcRI>L ze{-6bI3pr8cilk$8J};EB_E#0Wc5lxhRH*KW}vTIUV2P5Lxel-6dxK!(Rj4$^0hNNMveAoK>KxfA<~1aH%z`p zLEio@$2iBR#ZT=znq#I6thB#A=2zyqlWr77+6i)g%B9_Nnqw17y0jW zgu1NxIeTxnx9>U3Bb%I7jj|0-bj;-Z_w}S=WXAx*;jXtx-^g_(;t*z&CGQZ18`FB| z-ezX>>RvY&E}W;utlUn^-+I=sVY2y5(o(@z?}xM^n?IzOqT4)MaJzfbe53i6Xf_6x zg!>EvzewkT)m%cO28(POUcuZWsY&N+`pt9~>jf3eE-g~0TA?YnT^uLt8E}3}-^sP~ zfoi&$!GZc=b3>^jY>&d(Xrt3x#&G-OqD@cw$NVP!ZhQA->qsl+)~m5s_h~mIGeXw2 z8!B`k6foI%I@sj}#T)TPMDz)LSrIp-`v}!O6qXeA&&h8yOxj({uNE1|jd{NENxZHp#x<+P2??3$4LrlmxQhsX|YD_+Dp0#Qcj<$r44fo^1*ZI)!&^gyT z^(xCf0P~w4OH%9{ObuISaSJwgod0nvbqjxpG&UVU5{&6GEu7nl0R{4M1Iw#x7UR~^ zkG#ArumgNmd#LtdPriGB4Bt_*`?lS-x}rM&)zYd9r8JBcnc6S$rY$$`H0C{SmajrtS54@kl~6GeEAe4 z10D9aU5Vdw`);1CiHh7+bA$`o9omP_D;0YMSgGB_{!bHu>zX@TM5;HH{fTR5E25&& zugV7qSwsDXJ?MDbqMB@7Ne9sF>y~+6<4r6;?f%M91c{hya51VkjYUV{P5bhkA=fNY zhnd?@!3Ae3MdW1LHk(g_CE;q2l$FM0&u7*fPtl5xQ50pD6TO`fJUB>_L5xrcO|KIK zJKc8r?TgrhaPS4OBd-Tyc;)6cIs(?5(zlWbbSA>}Dr+ICl|;cNJ5#uyQ{18Qihpdk zIP}o?Y1N%y#+(7?P^J0_CN5%?4F^@MJbJC5U3%yLE$p~C{eqfxq+uZXBX#U3$8!6% zXOG(om91ArQ1jO-MVfzz`L3%9?8hvsHDNXgL0#wQI7$>9lW^<)EU#U^783r`_-wmA zb4B$}069R$zl4f*i+zb@K$PRznml!uNlD(RH<3ZBX#I-w!P8>N-W!u%&ZC{9h@a>8 z>IMWUb?E}kpJjKO%Rwsst_JoIv!F&$DNL`AvfP^<;P_kBTvra(KhHCevdYx9#fw~8 z0=C$h=(w`%2R`$_o@RPmLw;(4@h^zb9hGeOMKx7<1;8@QYJYx%_qFEs$2AGX%SAmy z4cWs~=m1^`e#Y_Hw3&*DN6;yjs^h78mCI^#mKj{|4*D~kTUb4Cy~)Nb<5!bfnLHLKGM>EUycSiRJdH6G zzfAW0{(Mh-BZ^Ml(=2~@Gc4kj>XWs|-G|n#cr}k$K$5i%mhP-8e96XP=Ad{Z@(X}xCPE_W59dlfVeZ) zh2VOGWnh8d4tK^eeb`F~JV9@A=WuxO#I>`b?<)Su$L78C2Ln$3G>EK>SM`+9?MKKPCqv`sHh??W3+9dDm>{CgD8CG79c zKLGXL^AFB~W^Tk}#;hdqNMKnx%&w_?_CW;QG7B~k*=HEgXSkv?;|X&kYgv5Atu(osBd_=4qyW8D)Pm*?M z!Rj2}eKn}D9h(ty=Jh^0c?DeenC3RAM6>8}5|UxVBUc%EtrmFy2Iku;Zp=>kA^a}i z#WOteQeRfIwU@qCU{wHx{=_}@*O&)M{WfAjhsxfoM-gUOJQpWp)fL7I901rmqKn{v z30yyWJ+aI+Zg1C^02iXz#^jr~G91xGIyOQ|i^9T`uA$&*4(o;m3|;Ts>tGeLb0v36 zl>dLzMk*mx$5^VaO|5!>lJUc+&oV;SLw|ro)CuVGq;SA}-mDzL!Aj;(oiAPgPTb>X z3KkZ6es-jrkU{A~MEi_gmgE*dGD7b3596>uA~K5kJcI%3dOuH8d_*#OH#A>M4Emd$ zujIU_+DHX)cyCf)I>)ML^CQE3$NqnVDWlvVeQ(i=z@lM<-Uv@;Ad)cg61>9L(lU4U zT9n?B5;aagu^@2cyxwl(g-BP-*DxxndfE$yZMJ?gCccI1>mdbKc~Ct>>pX*q=b&_@ z!)t%^a0zo!MVn2BvO$JjO1mG=eR$YHeuHmubl9hgx19saE2oxS`)z@K2k#pHlg_{J z8fLga-yWjCOZ(BIR5-hD1D^M-mGAfkdaERN=j@X}mcRBe-#~va+?3xFMJw&4s^@@^ zrXaltpea>=OTHhwG8jl?1W2}bmFNDQ?XR-v{cji8vK35#&%9}>lLcu&CZ|%j$;ab?^JZLaG!%2}-yY8c1$*fKk~O_;k*DQ{!#$xxp`n1_SiWhL!kHnm$vxoeeQ{1^-!j65FM8smT33yfr9< zYQKZ35yI2^A4jwb5uNlcwfzoG$_>2?V=-8-R!?tQ8MApvHZbz@rRY~T3xS@Ds1s=d;pM9Q`Fsgk5M&5qD*IOUg!5pEDp|w!;>Z<@i+u#)R*X^v}r1IYdXFS z-al)B!Zg)N2KqR6GFVWbQhpYJEU;-2d!~< zSD6l+3(r*(bH$HZg(f3a&)UV#ognyVU0wTP#VGYAEv{tqIYSN~!Ro7-yo+%K7p3zZ zseVHjCnWI$wa*Mq?s86MP|Ny;KcxD?rrOFxIx&YCc2<)45p1GWc7hCBuX?E!f z{d691k`Ii4m`T7u31h;&f8xWorR-={sGoIB!CU6YknY6$!P40K##ig6Fe0j5R=;Lw zpC(uNx~2bV!}-vFp?#U_&#%7_;gXFESyTha(z)~+r*B|*rvRCA5h@27bSe#M`_Uoh z)MNgqkKA)O^ZqHGx-@tna-aS```JQa;9>!UCMDl3MCr?LU9n1%c<-ZBS_kyYwU+m( zE!bKXc?T{sh>(uW6EGP#ipU+#i;0oo=dz{ZW}Mi3NYr=Mk@r zRe~)=Jhft)itb!)umoWrSg)o`=X_=;#)OdpOdaHE1!-}X>-1t*%5vl0dYqXe( zTMOPmef=BOzoFKKCIxS2mQ*K-6XQxxBAHqxPU}@5I6(yiS6Ha_wM3r zv*dk2(A9OSaVQTF%7fwrP%79divnl#8xR3bIZ9;Cs&)>|Y89Z@$<@H|T95j(eosx_ zW~rXP+iz>6=t_ZBX*6h;a_l2tqJ>xsX+X$JBZZ|4869y_}-3}(+x za}_8~Bl3GILPjN)jj<-06?%rU>>VLeF57y0o#lPCY43q zBH@+I(A&#=hM^hak!&KagaQ9F@nnTqw2ijKFo0}@prZgRI;F|?A zr|y4-mikCPF!}HLv}h;J$nl00BDv(u{;1)kyFk6fRc$H7DTHojN;gCI8)$r?$oeQ` zCo9u*hGS<+2hcQNNMuMzwMfEQhDMk2!uz)i(=>fC`rxN=+u;phf8I+HVwVv*Fgta)D^JU|@cbp?}}O&_iAuG8{RvvS%knFI1t8 z>(k~bv_nAD<6P=4IuY`PBDq1oA>m6IB z_9)La2PpFfChXQ!;q|-AXs`vEVWq&+fnZ$ey=!kmTb>;wvRS>0Zb?WB)2pxY%)I`s z?K=I^MC(RV9|x7pGc$iXTc;f51mYt9i&-v`?Y?RqkHv2%zJbu zmBVJEHBw*N%zlF|;U15nYvdw5&Vb1p>No%$Fl3G&vF^i)_a3nvnYSJDPrR%p{Q&(V zeiX%m{h2)3TK5qWrUY}rW{G@Fr|7^dhY(W!^HjjEi`xx4fiAsZRWAPmzm^d|b`Djd zi%Ade^X)yVS6?bjLWCiV7YQ=HwUg8YEioBrRA&nr83|=3`nt1yswclvjUhIVP^q>5 zx4O=6f~y zpTrHF0yo|lx~P(oPRlD^KUa~*+~+3LPuDo*?IP9ZKF;Jb6B8FW7nogI8JB-_(UDo8R@vd5)|hzgbbus6hM*_VjqA{n7NpFL+TpT57KS zTjoyw%#KO>_K2Tf>XQzDOKIQ2m7mf9z{G>NH9D@gA3P2URHte5f{|jtXH5;i-aUj- z!4q$wsuSqJ^&JK*kV6*(6u=J=!jwfrhFg@LJg{pg*iHmyZ2X`=Qj55Wq$(8boAOnnzYhqz#=2xkUB8l;C0dt?~)>8e4iU4T5~4uLCHa4vJ{tb97l7^f|KUVcfZ*Haq50 z`s}><>C<67i+01A!XkZZ(^lD4&>?xSNAhKsabGS%rOKW?)I}4C^-I&1hDk(=g4_*z zWgEjkp4%q#9tY7bb)L#t_Ui{>{wgVSzQ`=uGsa(NRoxSL^?F=?9tM#5%KrL+<&GS! zkCnoMIPr(`%(I(OoYiX1QQFz$nX9=^ZqByadAtpOe=};(PmJwOu@TcO#qzzziDQd6 z!8ZKP^%pi$KH_bNRa+5m)YrIlLxngRbb7>h4z_J7*rd#Vg4(ZXflD1Iw>SfUV_g;5 zAnk}IS}f9HXKlRht_do$l7eh~I8>R~s|MhsmjsZ=XhfP`I?};%Sbx6;3vCbU;rN8IwEwKzf}8jRhO#n%aqU0f>Oqi|=G#Ze?8 zfE``lT55k_Nuj?<+_miTPv7?D(uS#JkYy7Ve8}EdR}!NKLRA)bjC9GG1nW4FL|EeN zp^ni_+$pUNp9EQ6?xc1+-g*6To(`up!%!%G7nFTLCit-j!x%S|3|*iSfV}iqX7&O z?i3%NypYaQO*+9>ENw?@cQX)a_E2zCj*;|{gv{LfVh#sTq0`ip>%Y%S2R4G}`i z0v?N(prkbn$c97)erX)K?p1;~l?WzPQ1Y>BO~4AtfO|`Mo<{@%lPJx*-}JFw?LPok z3b>>4ELGL)k4*tlz<7jy+ZooRF!;cpE4fa}TQ{x`ByM{&=)74 z<^%9Z2fE*G7wF+XkIbnl4SL8^zFHI=->$|Znne25&KsT+IZ@EZ;rz~tlViy>4|1$o zM*BxL!ZTPr+pCja&L3`^o3DlFMTO4oE}Tba*iiKF5)1V8t94K=)f)T zuk6bYk_0hoO{bBL^qaJzb;m$c^%J@UpT7K=qqH+BjND!Ivv37YvQ7DwTL>^qV_t~fs9Mi>L7S)X zaAC`RfR+xV-}*Cq2-QG^46^g=kIo6UW_J6#B)_s#R2mxAw$~a)VX}HU0uYns@@43U z?DBmo9cb(P-9z=5^|Q)&6D#}8kGUs$Ccnnt0F@)spgaJbB@LY9JHM?=&INE8d#xPr zEp^cl5}W|i^C%Z?meeJNY#$v?$EEI2yxz3BN?kO^Sd;F?W=o8 z;L4{BcO516(*DcI|EYY?+NZvaleg_EwLt6pi1&$c){s2{Jm+Uzu*EkwG3ZaAxi>;21xjO$TOWvG3SD z6kI!Q=VNfv61k_X8D#(_+And;?G9@8-WT_GKZ)Q&1BA8*_NgCzqdt~lP11co#0T7$ zB)}_hf~VIH9dN)F=!vN+ZXzDws=O2;l9hgUX1l6(UeU{Pt5KQZX%P~KY1&#K4>bjv z=mdvNQ&G(;LbxMqu9aaN^+0TbmOFJ zA-#?0!;~Y&rDw!GNBM9MBJ)wUtl+#4U%zQ)NcwJ?|MW+9yEAao(3eUS{6-uQJg=xU zG|96=LsVb8HbwnHYYa|B88GWxM@2-E2X#r`17YAMrtGja8Hl+IC|aUFM+J9(K-bUG z&zqI+i}veti0D$Ly&x7wnccy7({8kh0apiy`8D_&b?wRa5`s-a=%ANx^ePc@_fpK6 zC63({8aFWMjJeZ8+r9gAX)jY+XZ2q1R$gzraLUk?f#_IKXfMse{znIOyDH9^-+2mm z;q5l)1%?{QgB3sRI9j=LeT0;89&QB;j*(uZb9OfCxkAA~bwF5R`+C`-l~uAraKCDb$8HfkBAwq6J0t`IYNT^!W|wbf5vO z0rjHv0nVDdkdlVKkY?TzOkNJQvvgnOT;v$v&@a(L|BDXw3Gv=<_=ZH-BLk1meP(go zO7DFZfnABin4myJ&^fRn6=FC$Gc|{FZO~s)>{uV66@R(&H8a@(7Wi$FkN88>nxVNWTT33w+8T1T5)U7l%dH?=5VXsQZ7cn1-UUVl84bboyRpAjOq8RZ%sR_%pV_f5OMVm?Yj8v7$m zNm2AMau!c3kz|PA*lGwodlqb&9BbA-yRS0sJ#T?5Dsd#9*vtA_$k2E(t9DTKI08kJ zM#m&K0ADCmFOraN=zA8IBM}fSv%YIKCSOHFqz%W>R;K2xu3HM!wc+8oYT8@-9qau! zQnzp1+K4ZG@csNb{2o5wk3z?^{_O$){lwf2)<8uY>zd8-F1G*ZYUK3AXkqC`$cz9w zQFjs_kOE+dW%?rxL^@#0X#Gp4IiR!;1moI`-#xbAWwy%0*vK#gbB$?H28IB1ia91? zKy%MRK94L$;<4+~Bq%;@z!a!|QHDIjOH_~+$P?bRBo%Yt;dq4(pwyc!ndC9GyQq*E zl7{z$b99GkFi`_PXPJXjxi@RTsW6Y}h)9ZI=Hkr9;=H2pP`py_1qUdvN2Nujkx65q z*UN9_{iY7fv!ABFdIK*)-QQE32 zpjP6`?Y=6YLGNI$pG;SI_RbA4M;c;=ZJLa&qh3U1&K9C3y{g-Mss%;1U;22aN;!8P zX+_1x16A92n5I&AV!5O53CDV6gbe_QpL4vnf8%*GwVmot-4<(mqFm0{s-#`@1}p`w z=cw0fyi$#yQ*HUEnw4-ikMS$y;4vJC1Oii7f)zyc#cgpX7i5?qmU_z^&`<$lDnPmm z$RNz;BX3=b<-zOm}%}j~rzz^yw|UlDWeD;>V@#^dC~ZM=#H&gW4AE>!o#K zt@2T_&T*&a*q1CWy$|_~W`kF=(YT_`x}Zr{?Ca#A5)+=g!%k4Zq3h40-KtF<88>W5 zI)P{-BC$m^0u<-PY)Hiy^DY@`eC*~Q-Z$q4iJlJ8eXuqrh(6@+OPN7q zxfH5;B7al8m;SU2jK2gfCZRBc7QMie$gikpvbfEKx(cF3Yt^}h6PtxCKrghuE)mM4 zX}p+IW6kNtN72a&uZwfKQ#%&oL)1reaqeG`i`S^DKJs{fw_ z1g5?x2z&`Q*fa7J}cETDrCZHG!48 zvBmt8=!^zHh5%({5x=@h2Kl1gWk#`pL@)o3ewVZx*bN z!-td1{3G+mj>&ZF`8(v&JCo7^>CZj`(d^-wT#i6^e5tQG{hVgaUGq28yapa7bEqYyUb1)nC4&r<-Ts+aeE$uMa@RA(3n9Cl z=KSQ4N*maQgq$a0HAEQqq|&Dx*rH6lk*4ny1w#foJ|co0h?vc-8WS=N4K{HLM5A(e z_nq0@S4hw|rVH{pU55b7d4)aFDfXX1o%LzJ;@VfN6JMvy%8d!6`!r+L9!JRdV88T; z8Kv&XVZzQzi@P`Qle;W@LyqoqP-`fQKF}AJ`Xx1K{)=m03)h)7wR*fxjqBDO+FJ1d zd%?m^D<sVT3HDp^Aaa)=utCcFy)FIygl+8Fm*fXoPr>M)3f#4qt*7JAHz%O87LY`-FZY=>Lh~v@e&&^uO%_(K4dT4WAN#i%Tc{N!4SoG&bZc__q0{;k` z4^48*Mxg0fsEscoSGtTVHYXKaXfW!`hvcn<-N>gwbn+VWNmrK*uMMYM?V2doEVPWf zb?v`poRi>xPNsgF9OyR>tsYGU{*85{$2!Kwj0z*d$lu9+e%VJgvKveWA|Vj^xLvSE zyzTv5z+ETTDe0BFv;Zd5Bdt7;Qpg|$8#qg>P9=KxXz7^$isw#9qNCf45CoXl1 zv&vYZf(G)Oc;ejZgiN2 z7B_KKe#RiWom7Cp^X8BF`-_KDyxm<(LcH&z7xX3<^{TKwiVF&DS8Ua;y3udR_N=s& z+S4Xjp;j^)VL0xoLgkK*vUewL77AWoFzON)KIB{Ke)jD*BAUu!RxS05DkjQfe!9P&HE*7tDp)Cw zc|#YJtOl~=(X7P$2`WK}pDef5=v&IKgWc}_!4t$RbQzeDTWzBHt8GxOd?po!ln-}> zc@J1x#(7#sn2(H$nES+949oqO2860s@s#@tcLI3X5B(dA6?(sac(V~^6t8j1Nn@U< z9EPJjbL>!fKMLI>egr(Io>RPbn*|ZE7pw*2*}zf?+UzRVB!w%!1vtr!v)@s<=5GIj z(oz879cyW&{Cyt-WGJP`j+s6%%i}s;Z7brb=aPM_b-S-fy;kE;Z1L{Nj(aDyi=op6 zmb>S!It728%hmP$2qJa&*Jo7m&cSZjx3{z)&kxZrn$TB7lNN-=cFmt;YEj z@DQ7l@Dw3e_K5PFkx^(WU|#eiA>z~Rdqt%j2|4VgDv$RR4v*@koQk#RAn8jY9F-J7 zCeV>>;rP5?B1i>|NP;+1E*G3Q(uJbn0+R94;FrsQ##%u-lEHT=hhj7Qa_BF zIFA)9UU9ugy&b{TZMkuEYZ+4nB9!E>{;JqM1xpw(@Whrji|7<|fqR-)Iya+ZEvX zZM>vdSaa;5sNZp6+;ob1!q_xW^1q&GYpLZz)+i{&Ej3N(#40OAXnPysE^?yEzv+ID zA&tk=f~l2X%&`NtF<4n1%YLc&=rmd>dvN44l5UW#R9+A~l2%qex5S>1n=Qv;W4v!Wh$!WF z2)OCIh^-;&#Z?!3llv3ydWWO{o0z`aOYibLkYYHx+=6LMXq@rRB=UmVPcs$n&KWz) z@PbF*wT`jINCNz?JtU|!>~_0cyaj6}RXzgp56WAXEn+RGwCOxkp|iPzl)K^VtS)DP z^7>hokMdHlDkRCxr=N92f!s`{AwToZtabi$aIj2iG_oKA_dc4bUZEBAA|5w?I-@S; zERrX%Ov7>O&fG>vOu zBS~5ZVARVbpqT}b;I1_?JZqpl+BdCc9(zXnz^YQcF`qw9`pm|RH+;-ZJsK5Sc>VeK z!futKdwy_{53SsR(%DeWm{K%v$MDVd7c3zW3PsK3xB%;nXvl+Tk1I^A;;0mlzndDJ z(O^ksYk-V>jO|32^XE!jM!P{R7bJL4OjL8KAta zmcezlbU+Yw&~{m3fb)Os`|s#-UcB)d-=+tjh>cU{<3ld7njR|=dOtHWpA8hNN`(|u zG4xzzXoE{^i9S@@!vHW^rku;GlYz|5FcW#%n5CUh0;V182Wf-plR;Y@Xs<04><)WG z<4yn0WilJXLIJTW1pO4>1x%*-s+?V6{;iD+$D)tost;9VUJ3;k_WYZ5R^*t}nxJwp z;2XyLYup~tyKY@}^A9OT4sj?->%^?<*|Lq+PJUAiHH-#jN`w9v`4`dsb|PDiDv9bl z&Rkt!C9)~i+`d+@o}Hue{Wsd1og}D4F$Zmen-oUb$v>t+Oi^RJ=0|@xf^4SSL`sY6 z#PaFQSD_A=!U{Js>v1^KK+^7Us^^%gKt_V~73Jhg#NWd-eHC+VmDn|oaXjBBfUXO% zcvtv$RNU!k&^FGZz+?3L*oj7((cv$d9+Gae>!cI7T;E--#3tLmGee?@Pw%q+xI~0d zR-=89Xsibna+$Aq@e)Nv#n^%CfH`2gRgLU^`R{=5(MW@tt@o!=B9*RV8; zd_}TuB6sN!+zE5hEh&wdXf<Vk_w{;Y=t6Ba?{S*;3rMh;PCCiD@nyu*Pn zl3|Y)<57%b1ZqD%SwFq#M?%4m1Z7G{!3YwwA97m`^tJ#}y~(dk&B&qtZe-*b9TX2pl%bfuXCgkMpgweGP2&0L0cU}2nBS74#CvWh64JOBt2gK`poQf( zGZ)n|mrrxiiSZRXL>gRnRu^^8a*=8MW)WSbv$z(p6lLkMKr`DuZDuax?*`l?a_rtc z=9$$tv5z+5@gO)Z2)pBCz3aJNplrfxk%?>&C4i@wrGw`e{Q>lQh3D#JW9>Ly?ykc| zqm6p>9WEup(gGdwX&WN~*wAO6a_!!&9s)RP(SS%nO~RUCS&7{w~4&K2KCfE6qv z7%YVHKIj<}`JM@^8kJ9p33Z}`R@CVy|FkugwL1qh5N2~Vjrp{opu5sQGe&5ZjG^YV zL3W2hDZkM~s!~XxNhC8M3k!p8pkkvO7QW+1PM2r>#ogGDU^;B`J))M(`Qbg_hcS0OP{~ zW)SkqQxV3gpwASLYAQmJ0t#eHi)qF1%=qEI@^D_!R-Ba{-G^=zAtS5KX(v` zPEFq51keeO^GT-4m!m}9cE)`Ti0iRYZ%-52T(`}%@{M3cyx-^X{>j-wD9JhDnBtKh ze5Lr}qvBu#UQ`ta*|RQU+=p@$@8orb{?NXB6j@meul)|KbJq{2dp2uwD6hpd4Io`s ziU;;V>tyKv7}JStk?k*o^V4Y_ygAxg=0g(JmVvQ_B^siSeUkOgym%nQrf|)nZa>!K z>@v9YtKifO`vS5mCwalhKgQ^hnTeA{Ij0x$3MDs~0{@c6eYXR^MM2*El^lYV{ne8P zhr}OY5s?&v-Os4^L>GusrCv&_d4Q-)Uer8k(_*D)l-;vk9qdp4WB?@=?nY^eq z?vK6PH4NQk-Na@TIOFn-M2&!mbFInwiZwE3qxoi+!TF@>1X8ucLV(MVj{Z&?fK4zq zsDT3ITlWFxjZlBMTR6eJFTQH%xK3JOxOBn>S*6Ve@@wDu7-eGY% z0JsK7b-|CI62IHeN!PDJfmurl1!wCXiKIs?9+wvWNa$mwC+vjqn8SGq`bac1YKa%c ziuVoSmDz{pY>4SU=C_RYDnwn?bqX-@&3szN(`-xFH~3NEtxGZe zd4370NAEQila)``i3>MjJS(@yn|H?j7OFTQs4~s{84qsB%z5bkyxy?9tUsJx}2?y{QHa)8#%*g3h!QhY|-MY;#lR z$X%MrS&p6OLESM%)OJ9UZ&Tf>s5_}?vE=zZ8BQ4rG>8dF5CZuF$}IqA^K}i~LwI6P zrMFT%k+1r`8a+$K>n9T@M^<4Ys}ad0;NU8(T5oa^^J3-ugTsl*!^iTx98s5giST{^z%G2~ioeQPg3n1~TyK-c zd}0CiNJ9(B$5tPQ9UKRSqS0V0I&gctOO^uv0U&u?GITrknX;* zav(XXBHE__T;Uh?)vSF(&{5MwpJiw5X}Z(|o^2};BCPS8^Htg=(S&Em7+JJ*9A`9p z-bu)fcp|yp1E`!NXdgG+Q!q9~09^h%2VpGs*l=zTI3Wa{`NMNgfb(0@oV|e5Z3+jL z#52GDw6q@2#60`@8_FV?CR6+>?=6=@qizp-q6_`5l#gC!;U)-@? zFbDaED%WeVnzD{QVxcdHgskYl)^NU?~r{Jr_LnbfZZPb0b1}ke9d&WXo zC?9hdaP(gmgFGX_^3x}i8CLhKSW^bU%DZj#7~#kS`zP{OxxT^0d>;1pPfI<$jztoA z@EQ@rLAT7WEu9N`{?$95G&i(EFsJiiDuA>55He}z?b+(5bzIkeUHYmi1rJdE;hTDI z25OsOCMGE=B`D(ef^^CEi3=K5o87A@xSl}Dh(}eZN4eX%;Z7!i{a&~U4Gz;k@_CU= z@Z&=9@6{d$DBW_dR`_eEpmtIU93OP#j3aohH$!5oAdiTNsbYOGc(2S_&Nq75nheo} zIlvYPe|TMz)G*0A6W`d0ni4jaBgE_^e${dQ=L8!{DNY~%+NVnfzouIsI zVQ|kO)5~&qRyWh~E|yHtOA?pG*1o+A2cU}vS($6N^P3j6oq^|sX>kmmP{ts%554p7 zx+CSn$7l?LW)J}L9B_5G6(f+qo+;1dsRqE&tU;$gyfXlv&<{N1O*3M0Uip2i% z9ryPewpwA8@2_5e_5;1WN`cr=KsT;`rL=t|q1N5zf_$EJUr^yy=WUEn>RL6}1Q zDbix3;hNLkl#6lblDrfBZGErnthma^8S(iy&75@(_5m;UyUf{Ll7FXX@ozu8hyU1z z*qyCCvtjp3!e`6^GUr&n$>1gc;O4}K=6Fu1G}7Wpth|q4-w?~rd>z*Y)reDW!YH<|zm#3yUvVw+l0E)UEzl9!TVCNm=&E+J51&6_gRGvGDuy zy29eUUnV7JjjLKO8J@vZ8UR&m$Rual;F7@hcity^i6%NKan!#zvo-mV`|AD$jpD|o z-pNHVIBF{cc@?(MA<}YEEv)9-qz3~Pa8&c5*^S=S>bf1##l3L8&Ge1#yM^Z^+1eQ| zCnM%}hq<&d7M&qqEd_WTv~~RPC6Me}+*e9B#|ze+#gETA@)-E4Ar}j*^Pj7oO!Uti@qo|GXqS0;2Fz+qntCgRYwL`_#$$K_YKh@IG%TbWXaBWHX z)MEUyMZ|}W919Vr{nw0=Sfk`f^}-(Zvz)8XKB1JQ%})L8A>RXnGo(ShuneLC6ejy* zjTip7huZ(|PctP8d4e1G@KfX~2G@yIR-mv?FQX<4CWf2NIqKa`f~e(lfhnTh{jEs} zq0O~}DnYdo=6m{2UPyoglbx)%F2>e!r93Zfkjr@9^NuHFPZ}q3NfAo{TwGJzd7kM62+$nRRFZtz>GA zJ#A5yq%420JZY!G`fa05Q&7#95Jh4^sDH=Zs-|5DchYpN>Vto$Csg3ce0I0hLg%*@ z)H=nuG=2LFC)@gp*Q`2-X6>2NB3`!Pl~+2a!EJ6Lw9S<39W}*hZ8Ko&9juL=f4-f! zLBQ%9>IzP8CA!h!#PYR28j$_a0vvjCxAlh=e_20Bbhq*rF3IGJq8!HgIkuh}&3vbJ zN`__1d;4qmv>*D1^IXc)pX=rwrvQH+^;0I#5S)TNx6*GH+xYp+ z=HJbKJx#PApKhpGQGDK55&O$;u3AyRbeWMD;U~7Cd5mj4>3w6ICy$!>S6BaKQCr z%614GZDc8_oNPTTi#K8)1-@#@(mzH)0Fpgen$LzWe*udft4@Vk)6J6q`HFyDSkS~_ zLW)3)*Hs$^&dE3fuJT*-@dlCOEwh;i+5~t4!pY>_90-tZW{&C|*3!SF*}V4kyBWGA zfwgbo+C_Ov7{ExQ#j-FuTL+JOMB z$DJDGlV$GOzp!AqqPbWQ1L}V^-O?25n9SV-Uuy&Vjy5qWor4Atz>%ggZ>zGk4Zg@bf8# zf=BInYgWEp2cDNf0cdr&W`Ke2^7V9_jBMz3s@?D!&($MWb$vK*eknF$J*rbLV47!s z8vrOk<&|gTWCyLT%m>tt=$`ithGqMs7kxR@nWJV2Px_aBd5l}Bx4}w>aO+3X*=~Qn z-M?C&g*{FIE)D28Lz7&?zpZ){CE|1fmx#&47_kp-dxN9Rjn`RGZnSZq>9jkX#X+^vERuVWaA`3i!5v4e0>{g zRT`~q{1P<8*6}gs3>EnR;@ib{2`J#HMqfO#sEJy4h7(SykAw(?nP4ZLK-#pceh%7`Nac~SX8uJ!0P4c7F!$p<}M}sNd*&I%YFA-Ou zI3)$H(^E1XoKKa*eRNc8EJl9jRklzScbsU0SjYBk`e4&)NUxN9gA-_*Xu@<~lGnVsUo#t++ec-m!?qHuANWTV~v-Z@;w|)p#>-IdEoU~Mpd5YFs zs1{Vu;nU4>KO^;gX6i);E)>n${PpkHK)K_jNx6qJ3Hem!9V@su_g#K&VQbRq z;i~~pH(SsUu{&SYTT;oUH+XDPelKk>@KY6DTE&Sf^yC~WxqH!=WKz3QlN;xzNPXPpMal4;U8sus9_Yr9b%(?1Y|E@IZpZAvV+-^gt${`7MO)gOj zw>tZzwtN&{$7{YCsM7B0t+Nf@v!I$6St=bOb&MGm$$Ai`G_u_bQ@e&ixXipTyxc`S zmGW~crMNAySp>CJPR6C2E3sgUrhIFy#M${i9AD4&H-nNe);Ls0x&U>e3T@b`%+Mr@ePxIvm)a+)OX(FLxG ztIdozorJ6NR|gl1=8$4@WaXB@I)}uWZH9oJGMMsE6Y&;-R13fjhl7F$wUxTX(2dB9 zf=CCp`TV02mmgzAD$bc8mJbn1sg0RZf@jeHe1Crv$K*7GTFX8ll7L?! zAn~dM-k2;-355rh=22v&|6L2 z#6`lS=Jv!G-U}g6z9e+)Q$VhfY&Rwzrn~!oS0=T}a2k*Mb9qF3zN?^;DS!a7Zj}`K zXA&Z8z$#ewGPKjE`XTufD(D)jT=kWetmH*f4XYX z46Gq3IokwO6ByG$+ylwTk6FS+>iAW&yai#4&V|cxRxBd)@!$gYU}}D1xjvQI=*4>< zQl}wadyLF#Ql;;}co5TO?B|;GEWW*tD#oW1IGQ7`uv^ryuR$g(V2O{1rjMOS z%HhU$$QQ|?w-3WI$S9qYtthRQu# zZ7A*03|-l~#>z8*HR6btd6WD|51*F7Jp#nvBD&RN?bCZ?OPabS6NX9bm;()PtfI>a z$r%DogyGTdEfJFHfoE0jq*-b3Y(TENNKU>q*vrR6vOZ8ufB;Vs1NABJ(&QeaXki5P zLM4N`0^(}EyX!uG^AjP)XyKWdgOkD0m5_I+7RL7N7SJ9a>?_g?F%6RThh``=IEPWz z54|uEwlbBLehhJVOcsy(?)c#Lame;v@u~uQx^8~>s?AWz_~Y}l;VI3~4c{C!eru|S zn9`0PqkB{z!W@t2{e5c80j)(}gp?0^0_|i4P03dP0RoQkKHe(IT~)+ExRe$DwL)59 zhJ^Xh#kq|ic)l*FjrrVKy`ksZ<_^vzs|T9#(rUeN-PE1)ICj8Zic;HOr+bi%1`)<_ z;U=47WZ~f~;o%CKW#Qw&2G7lEreSM-*oC*ZZfQ^9S$Y5{4|(b<<3*zB0?&2j%bq>; zN_mOhJa6`^_t=@yVFDeS0kzYscNoDKev*8iD1Nh1r!{t2){$5p;Cv3h=0xmBean7k zAUsGw6ekm_WD`}U0*^`3ms4%jo4GHmrRtIV;+0%zApiKJBxLcnVLx?oA%p(B;E_M< zHWUDqy{l0zNO*DnL_Hu}W0c)U*HM7a{JnVvk5pWK(teid|^6L+Gy zo!W?Jt2|bGSzZ$bE44+*mT9*Kv9$lh$^p6bW)l zN4MJ`%av?aS5jF_h$K}qb{e9ni(oAY0m{OizF3`+5{w}}oru+d%p9w;D`}0;Ocrvm z!796w#XVkfK1|_GHkX_}8o@u%L=0MjO|PYoL&Lv?ncqH`^@4FV4M%}sK2E=sR6a@l z%nV(mJwLOWm06~IXoK_LaR;W&%i3#TJ5v*iZ{Of*skt$_>q}n*Z~x4_1G(jb zZDiV$_8P0ZW1nFIBDHZ&@?;d!k;z3C1Up|!_cJ);3N?ifwU-;h5oo`Ac@Ya%BffYG zTvR@QdCj+ovk$h8!MP1h$qT`2$CuZz8G*m7M{;|xxF1f#CCgDxiNH3jXF-o-mnVGQ z239N+a@@{LI(%@lLN5k;*~GJfZ%JulHfY8g`%AY34hN>#kL7JRE3T`h8)=;M_guH9 zZNl%}Jp0#s?ML7!$zqAu;=aDD$}jO3a2;B46f|pfW$HATvTv_Lg+qt-y9_=gdED+12A+P6t)>$G5d^<})XFK!jO4*{ka}FAr+NZBm_%A@<>u zG27*gaIv|&dLSGKtYkY0L4R;FwG!6ihR3|fsBD@Qj?oC`$JnnsW8cir)QYa zm$PHU;B^!+1#LxjS4#n`2ZG~!YrWEY;cb|RhXxx+Yk>nkzDp0TTQqQbz?98={NCJ@ zNSn!7mzzy>FG}F>0Rb&w41YE;c8|*477W1B;xOqM}ItkI6vfE*CEfZrp=REMc2dA-ZdFK@ATkZhn89$nd?5Cr%!yPsi&Rc z_5y`UgT9RCyP~OIh zvfu#W@G^3)D!P#>f7{Tqrt$YxM+@2p$9DNgx0AA79jL52g7kGG{W`=+>%2MkGDlm- zwl(to_41#O6+)5M-Sdy9Z365gYtfPt>~jsRlq5HU%aoke<>Oq>X-+RD(#GmOi8nq0 z;0i9y7grRQ?GB4f`%p!tVPX}$WG|h!NViXFF3Hlufr(8pgP(*X(Gjmn#62e?Xvz1g z)>FOTXYyem^s}nH*H`mAJ&@^VXUPD-+!mcQv)qqd*ok5>uuk$IO`{7SO`6RRYS(s_ zj2&+!G;Zf+>$PcvL|^OG)C&FkAh9du&gDs~e2QF`zG||x&T@oB;joDv&1}{B)Dw?m z@EDPNon(uxO+DSn_o);c((s;*Dk^8aYTT$uP_%@fy0I&5ht;Dc113?zyvizj3u}@l z`!xB9UQ3GAN6ld-&=;99i|zQ!)kF=$Ui*ULOD~!%x90HzKjeuN*Jz{D8G(-H z^tY_iuv7xsJ2Igw=Lf82NmJsEM5n4q=A8oQcx3xJXmVR_z3ZpR6HH{|EdJU{1#ikD zZ~5{8Kl4N%l!mL?^yDE`y%?;@dryw4RB8u#e-tvCgKnmDCnln`OQ!~K?WnqfeRDe2ZBv6>cFx%3DY?(}(;^`c+5}6#%rjIZ&ZpQD zR7x@h857Ckey$XDchlM!TE?jP1h^mUkqh=sy%wG#oz%TuW1p&{y}z^K+f+`+<+pw@ zV0ZCVI#5o)kHtpFUw7M)zhxL-Pk2d* zHCL)DlA{7vj!~sQ8BsUUaCS$}t!Wy(lJZu+ozkfIiA3PdhR2VlLnz{BQzCMmnSw%1 zE+;!-);gE0Y<$>P8-+L1kDE!|kJ4Usps)*$#T8g=Hm4xrw_aIv$`r@^IkDj}L`0`y z@8oK%*?gdj1mrh%cVLsDCzRww`tdO=%R^PU@J{DKALF zuJL--Nk;H-btZOy$x(W(ZT?jPW^+uG=av<)pliC9`pT@MF`R)uD14UU+Sq!-l9)tn ze%G3%Xh~~kUAoRYu;5953Z@}LPVHw(;lQ1d1J2_zizb?`UnwF1>vagnYP0GyXprw) zpI>EKB7>}ULqEI!Kc^uAUuVw68eRZvEy#R{z47|rvg6+`kf4ziouZL#}! z`Q!@nk5s|g+}Dy59_dau$$41^g{ZH?Y#Mf!hJfo?YCE&IXEvNfi`uhAO`AvB8#xUV zNkQk_6KlkB=EyGWPC4|G*^tr0YzjNf=tgB_R4s#plaG|pZ=uu-@2VAtu2Ud)4NNv| z4qFZj^BEy|>iigr?SWxdWt-~Q^OSLknxw#oJJitJ&v^nbPmp?6p*TC4^%shA?jwN} zyt)rD-J)aERW47V3E^L4dW|ge$d(l|I2OdSkO3+@M3Kwk!w{B$uOg0%zQo)Un@_L1>>waDC zC}dtc8<_seTwkymv&{)8;|Z!|#m_Zf7vz*+g79T2qn5Sc$|^2yYc~MHf)wjEB<=78 zXlt3YA;%v#^;|{4RxVhx{>f2Zm>BwE>C1`WncHOo(&qsO8rZChDe)RYs6s249q8J{ znM6HOD|ZHwBgrO5s}2GUKWz6CeY_LV7+!SD3)^%|?Gco&QDsS2+j~*WNQfnly*?Jy zF8koE&w0F885#5l3jI5!dPgqPFcx5@u$tJpjL1slN5#Gpx`XkmV!>{CFKi~7Z{lkM zkZT$X^vUP26iO-QO&z%a$|2vrSLe1~X4^YmsIdaHBqS0UR`$)Buq-hqvhnDH3Fa@g zs7mcgihEAar7KQB*1`*W7^BwQRY+l#_fVyfdbs{LO#0%pU+lu*&ih@oeM>HvXSVrT z_{o)7`AXWYuVOBmg7y$I{Al{~L4NDX!+5ERAI|6}Fg^XO1g-Q6A&l3R${6GxqEM0c zHT@_TFXv4uFQP@of@wuA06g)`U@hc|Eza@r_qJsMC5&S*c&y{maUtd}Y| zK9R}atCA%)A{lYWa)?@1n8I@D5$^ysy!p(@wbz?sLHSb$iDWIcLyYjJ`y3 zDQlqaxr_FEY7y($`Jp%>B>&-pGx*?btwozDyolpS1^lGSwYD&@qYGWP?Eu5XEX6zc zl)|1>VagRqS`!6>82y51mpO`wtL!8o({3RkQ6hyLhback)T&ny+^DcKP=yRgMRB^ z!*@*W?o3dPs1i}~Z`3#daU<~}a+A?h1R{r&;l}gkBQv@4{1VU1SRw?xG*_xbkLPcQ zC%w_@(9$>qJiO!)KC*_##MX79p=i%JPtTTMv?H*wr&6C4)kD{?amIwpe62dt`O~x{ z=3TvOsJe7wEQ5_ws*gKPg?1LsQ(a#m@6Dy?x;KF23{B-?;h%BpFKyf`IJ*s!ugC7B zBr?HBN9Yh)OZd2ul?)FH14ZkW<|y3D__&T8H0AhGCAf2Rn6ppJxpK8fXU2!B5e6(a zTE0(#(AA8OoIrTA%S;-P8Tus|aIcTCWE+h$?SzeZ_e;jB`Gmb{i>E9D-wg1*uW)TH zco3FyRF<*fM@nQm;bVh*xUl3k`@uQdl1F+k5fUV9rsGVO#Mgdi1HkWVex^l~n4RG+;6j6HhHYupU10yR+2#vvg}^q)llS4xqEZJn*|}Dg}ksbvftVeFb~RH zWbKDs3|%wqXo)|h^Cf|O&;3yn9Y-A5hm_x^p-Uu=M}p%1TFb0KC*m~_SoFB-vaZN6 z{G~Z)otl(>W>fFhH9lF2(#oN?XmY$j!kuURBp?u}e&UYMG-{kN@Mk@7TYa0tNNZ=h zn2owRmL*`CzI{K%29Q?Uz~QNgL|Eg5vfOw~f-8%WcF->h+s#xs89^%Y zFvelxzz!TWD&EW70(S2i^e=oDDz0nav=Oq5)%x;=(;#!+em+i0QjMm#$?7;HsdGAw znLtN#H!NC;zTqUlkz;a)$H+bXh}`p8X(|$TJ=XWL-M3MHs(qHtVV=?W=u@QRp5_73 zyhY6w=w}f`GZ`B3md-YdWDm|M)Ao=rXvkL*9zVYeGAY^?uXppETZAf%H_MI5xM;U< zv-Yw6tX~cFq5XEk4UxogOyBa{UveCBJ4_pWUjBTkwTy_*E@MnxPN%G6a%$ksG6O3Y5nvS%R?hNmE6Jwl3O<*n`4oj+ z6G<$NwrG8Xc*gy{v#>tgBnO#DoYGpxlsc{eOyZT&EzkRNX}@%t%g#t~3To%6@yqJ; zK+^LSgGWCZ`-@ew(n>uXmlRYB9xgJ@mBZTplt_Gm57&$+HzvV)4LLyVZdy9U!domw zh2}=-ybGarB(%|R`lXj$nQgAWn_KNOE=f<};rx4?+~JJpq~-(DWq9|NY+vU(>{`G+ zT^@gWJ8a{kX_K!SE`L3wgXLsLgm5DdO>-AoPFOU8p ztKp#(*4G*bL_IGB7H z%zTrAHA82K02M6sCH5!0&*VcVIs!xeX%4Q450-Eok@@W|4KxkwK_7Drt6< zS?H?TBV^h|86rsxiIZ_4QLKy&nV-AL-6^MCWR7^#mu*0m7dIbkmDd z_1hv?3n09734LM9R?kt&uKi}@^c`~123yA2wq-4XiKg74H7BVx!P@5YG#LKJ* zcYUOpQot3J)$MutZhW_TeU)vLG0cAAKq<$@226t@kZ|xqWdIq#uJuhG@-u6A-MV_EdG5!muExIpVyMkXL^00P{YC6zqZj$h zAr5PQfh}L?W>7b%Sj6V8!h287seU*`WOR}20TJ%fprl1(%&=I?I7$mNoNP{{k;3D~ zC#}HQBRBEb^iNC*D1KWMLisR`#|NOAR5Yoc{8>a?Dr7Cy1otW{jmhVY=9F2Rcg}lE zLxp%h3U02@8S7u9)y)pn$6gm|P%!;Hu97%XNJPD{SHe(p9CgE@yKw^+gANW!t~zTj zJA3Lo5q>-sYT-aoQ9tz6ob3XI_jaqO%F7V<-FAU_ZR*z0@0NP_ zCiUQb4tn>)y<9Kd?<+d5jleRYs~Tn6mS2e)# zQn)Qr>68UdVWPM7F|qfp4(kOjXaC7%oLyYGpt`19#F+M@9cUq+Q_{}O{Xp2VgpfuQ zc(bGF#(V^!Bes`bN`fr=U{ndW?&7h#&M(Qs?8)~+sCMc1t+A2pTcn&R1C&#X=b)5S zY@Tc>HD?$f$Fx?2f4^%5_HyI5AtLFhxEvkUZkNrVf%yt5N zfV1O$4n+kT`8gn5i7dfUd3$3f+WQkg4=k6)MFR3A&}N8M`_e4zk5dKw~?$Ye3gm2Z{mkX5_liIf61#U|4*V~(r>vpXG`Mg?~K<3V&T zH9sMsEuwJ0C!rj@%jYR9&v+?iE5V|wxIY$cO8CuHQ1qFCnkj)Ulu#rU2uYw(QB|3b zR$0sn`l*-NF6O}&JDM%mIJtLHa5p%tPgWa^ zr1NOJy?EF3P8UmrzvXx{8_yRgh2v5`T`^34CWIpSdE?WMXb znl2S$GSrV%;@`=fXAK-?4a4G6Zm)iutfdx)F{dxlhCme*jDbr^!m_yD{gL;gaPMc@ z*GZDN7FkFXFe2(5cyZCt8B8;?=?zWLln@a}#`bN`4-a=Kq8puVg)S%b%M)=RB03O# zW+WDWAVCDmI}oIB?2}GzdbnW|J#V6EPb4v6O>dv-aCzgH zi+R}qk%CUuAQ>iVm<-C|M0MzJv9)s0rQ^Vud z2o&9lH;6mT$3%RJyu*)B4<_r47ws`7@JHGL=)_(*==zDh1CbfV(ST79!ojo&)(y`d zgSPH_^1h0oWsX=yCKyTdAgy*lh*jHbBb-1G?35d)yL6b6$`4s31{Z}= zm2a0c*^rp&LeWUc+Nugo)!&xISXR-&5i(MW25q;;G}+@^oK_k`Dc#a_(nz0<2wh#4 z9KOdm@dfc%Kd~{3gwj+%tMq9~)nqt{aZ2)M>J65(uKHk=ZbeaB;WkJX>k z#a>=4|9EHe8*6H9{bAPe&-$aB4U!AHCbNpp>yBx^%WK^Q5=}%86CqVWwak}H1m>xO z_*mPg$k;Ijaq_^Zq#y!5Z-|0yAF`8z?o`Ox%Irkm}#lwP>(<#_>b z)OWZx79Zre1HowVB1GXau_=fCaM^E=jk4l6*16j(XjNp7N!AQ-jYNUqEeF6V zG3vc65RSnbjk|Z~a=h`hjddXg2ao{c5Cd1pNac3Gyz~jY;b1`EV-9$cm?C}Qm^MCc zv=PD9oPdJgJQH}Pm=x#A@di&rlzn^B__UhP$0$x2R^3#{rAlGwoH5$d@CB`&Enh$;jTM)QdPUAiks(hL(1z)zT0p@}LwpD4uO zlOFE?(M4zgzbFW5EpLI4utMCEWUkXRq>>4OQu~6YjpS_@{9BIL;7$klIf5jtDY$v7 zji@-AZcE6_k;2?&?04aL_C^&t4u3m;#+3{_AOt?HL4rBB?{X2c4MPHGkU*50Gc6nR z@B*vqK?mQqq$~qF;9v5b;rplKlW42L=_KF zj~8TUN+2&1wG_yt-vhMD2}hMc*!Tt-3l&L({%}ny?;*?%gd8OX1UaRE>EnEQfQl^4 zTV#r7el%$hhS(y-BIDysoh<6M*5Djb+gxHbSx4^zf9eyIDMp z{h(5T1<<(Ug765)(G4UBKLv{-KSD&>&1CX9ZSdo02FOm*FbM#=7PO6tHqu$l{4CS( z$23ywV*om`{YE%Lp|&Vj^c}^~G3WH$BS79VHIQg+$q4^(F#GIvDF5rGc=A$I6_#;O zVd_Mg9l^CCkZoaGA$^Dcb_i&v89M< zN!>UK#ZPQ%1rRV4>m3%n?T^Hvm^&#S znYwm{)!FiU#pF1VoyI3O8y>dxN40qU@rgmf~OFm~!%f+U)LW#;u$&qsoD*Bp-{eD2-i5x|6kR{5{7|dP{T&K3RV85nAwKbE~eh8`O9+V35KVTo9l_WHV8aR$f;?a;L=w zSEd$zlb#v^!3QS}96k!q82d>_IJkq2D3>ylXSbBo_X2ImAnkOQ35&#o$5&S6!^iBF zq0G&>4FmgAq5Ia0#XGaC5-Agd=>C;4z>m{gPSn-L1oLa0cB3OFhqBUz6ANFdnaJm9 z%pq_v1>u#Zd^ntQ(aG%c=2~RjY_uT` z>3a78-S!ZI%{XeF!i;Gy&CPk~E}oQ`b<~GAKk)kewbM zqhHjbEV?>&l-5&=V(EMN6v)0FI_;z&hhZ};h)KoWIdSBknhPAtIaECmZr*1(Q3 z;4J6hECB?4*GLu!=t{k$fVQP0M>?T&Grmbv4b0`j(Yh0zkk_~pf$ohaK;D8WK2y)lK&b2| zQ{xht%?7IBBC1X0!jS>0dJOG#T@gSx$4)3g1z3V16>MyBmuq=FYLV+7dA7pFpIK~u&88pW|Zi?Oj{ zK~SYNd`{KT*|Z?!S~28w6LvxHGn7!prn3{clfwnLPPd#>lnJ&vqtZE3K%L3Mg)=SfQ(Fm&NiN=YM)_S zIV*SyMy?3V1|j!o3NCP0JrwfH!U;UE6wD9YMsD zs`0==kO4@WgJ2|Ymx{+qyDc|OI4Ar?NPg%2RPAIcdBlqlcNhOfY8XU%v!DW}^aS*b zz8=nQQ-65VNrwLOnBz{tHIW~NRt8;xzQ>S$J`K49)ggYdZ!}uzq+k_7`M4=oAfU}5@B&~Aq@YB3R0yn zT?8yZgN9kWGz7w1)poKzv}#27BzskH#@fau_H5uZ;TM`DG`DX;_HlGL&!R(JCu=OG zIQ6nHqa}AERQJ~K0;iF-M>a#Ilm)?y65%D3lxzAjb@~!crgSyF(OA@zFjA~d#qcVY za(Hq+g1|%~wlBUzFW(G`w29-%cH7+a*aA%wuZBr}h_(AO&YQ;gSlg0X$#?n!D<&bM zvGX3X$@$KlvCHj}wght)+Lcz==|zB?2@dErDWFAmb1YhNgpV!&gf6R_HtKr|ljst1 z5wJsu2$AT{?I?hupHto*fqo_6%n}JA(uF`I=>q}liwmVy1Ff&Cs*@GRf3Oug=)2LD zku5sO+M$Q0jJe0){oE}(GG+eR5gv~a4l2JyAlJ|e2nc{vRstNtGW?1yT^|D=I1&Ru zRst9V1pop90-*jUf*Qb|8uG_;H32J2djm^*Ek$Q*13L{GCkyk@1PQBUI+*_RR}}wp zff6E%X?xMBZrprsmxD1M?ddR^d0o2C!DdS9c`5qJDzih4U5$?RmJ{?RWOV2kMy7k^z^|fPx40bUtrx5HVp*qORn|vX zwL5ON3Bq0&M}U-AV@spSmCV0a#tumD<+tUyB)##z9myc9(B$P2vgcNp-ER~HbpJ$@ zM1+8p%EzL}$<0>2yLeTboVL~HWJtxvRPvHux@J!@JVzI)UNEn%9u%$Bc7?9;0j z&FluRTNK_&zlhRLkm1xap7F-bLl~Q^+3C4C{hsu=>ASQ9fdbd%$G;$EjbU8 zs0@;53Bgbb$*_u~uR21`AK5sFom(rXmq$^WFBfMoOLLf^KFQaZ=TnvCV=Dk|AO*e~ z2Pdw96j&kYvOag!A3iR|c!~7N25Jq_$p#;f53MTZelek zqcx^>H64FpxblAc@bmiVbo#N_C0wuOm7>2KQFH*rNa@-+5{2OWL_EN`u6d!NsJHzY z__tYw4+Y+a3IqUvhyn01s{nye0RHd1I;DdBdhjuyrayiT{iiwh$5Sm^19LlCn%^G( zZU{-G3gQI_0C4vk_%DX|AK%rt(v!8dvbLkuv$8e#ZF2tIyiT@`hT!9kdmmp2e=*|vJPLk?RfdH^8T>?O%4CI@q+xxTJO7^y_LnU0DR_*G;$xtQosNo!T57? z2L%AIwzj9Wwl%Q((3g(AiIwHA2qZ8PI`1C@3@`uy{67N#5WxQ+*qNK?8%XKc*&Eo} z(f;WL{jYG}ht`6DK5%s(##Dd7X+r)2_s78e9s0|G!fd1bvHcO#MVP;LwF&AEvc0i^ zg#qpFkH7TI^Bz7P;-j09)PL{lI_#f(lhkpx`u=f_&+lIS@#2@bn_hbS;*Th+lKmaW z@-Y;@#r{u(zu*{t6*=%o^16}_-1q;$(P8~}9OJKW$%GxVsUJ9r|G-h={dXMGuW&q~ zLLF-#bMofX-#d#=^51dHzrvYB3qc%yct^tacbp*Qf5)->3a9F04#M{_ve0~g$GOq} zcO2`la5kk0U+q6SYw?k2{;CO>4}bsL$g=$kC!LU6iv5A({FoMh#f@|QcO3h#aF#nT z0hb@KtN+j!!CxfC{?Yya<{drVuXvoUy`#z>!9!>GJI_Vr|H1pEE*5qLl#4(7A_4q+ z3c!>81@BKO;7?-vWeWIbGO^6RA^)zs|B*}~`)|m;Fg=Q2ICI-|<3&{R=Ef^-q5Of6M1D^9>0ymk!BCKBUI`JEBhWKM}uNduNN1G&nxGBaifV#Ap5g zMEr8SJ>dtjFZt-eZ&~ldkw3K*?!<_b3v&awR%$Oz284`jT>UueIVX1}a- zR8Z&$1wIf@9|ieeXQZUM`|C%%|GKA`a`*%Bn>K#mSo~^1{`2nn zqh$C~8+QD|+`>TLM2FVILdVE}p2o<;@b9~lKkt { switch (snapshot.connectionState) { case ConnectionState.none: case ConnectionState.waiting: - return CircularProgressIndicator(); + return Center(child: CircularProgressIndicator()); case ConnectionState.active: case ConnectionState.done: { diff --git a/wien_talks/wien_talks_flutter/lib/location_mgr.dart b/wien_talks/wien_talks_flutter/lib/location_mgr.dart index 451870c..0893c5c 100644 --- a/wien_talks/wien_talks_flutter/lib/location_mgr.dart +++ b/wien_talks/wien_talks_flutter/lib/location_mgr.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:location/location.dart'; import 'package:mapsforge_flutter/core.dart'; @@ -34,7 +35,7 @@ class LocationMgr { final SymbolCache symbolCache = FileSymbolCache(); - final JobRenderer jobRenderer = MapOnlineRenderer(); + final JobRenderer jobRenderer = kIsWeb ? MapOnlineRendererWeb() : MapOnlineRenderer(); final MarkerByItemDataStore markerDataStore = MarkerByItemDataStore(); From 9d1a61885c8c1c6c27ab16fefa8812a1dbc6ea58 Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 22:52:06 +0200 Subject: [PATCH 38/49] server: docker: fix traefik not being able to discover server tl;dr: Since the server is in both the postgres instance's isolated "backend" network and the public-facing "docker-net", traefik unfortunately happened to decide to use the "backend" network for its proxying purposes. This led to the server not being reachable at all. This commit fixes that by explicitly telling traefik which network to use. Signed-off-by: Max R. Carrara --- wien_talks/wien_talks_server/docker-compose.deploy.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/wien_talks/wien_talks_server/docker-compose.deploy.yaml b/wien_talks/wien_talks_server/docker-compose.deploy.yaml index 1028fcd..9847ee1 100644 --- a/wien_talks/wien_talks_server/docker-compose.deploy.yaml +++ b/wien_talks/wien_talks_server/docker-compose.deploy.yaml @@ -62,6 +62,7 @@ services: - "traefik.http.routers.wien-talks-web.entrypoints=secure" - "traefik.http.routers.wien-talks-web.service=wien-talks-web-service" - "traefik.http.services.wien-talks-web-service.loadbalancer.server.port=${SERVERPOD_WEB_SERVER_PORT}" + - "traefik.docker.network=docker-net" volumes: db: From cbc788b33e7c25a8b6626809199fae65b3c5314c Mon Sep 17 00:00:00 2001 From: "Max R. Carrara" Date: Sat, 16 Aug 2025 23:26:01 +0200 Subject: [PATCH 39/49] readme: update readme in order to test deployment Signed-off-by: Max R. Carrara --- wien_talks/wien_talks_server/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wien_talks/wien_talks_server/README.md b/wien_talks/wien_talks_server/README.md index e4d5962..d632aba 100644 --- a/wien_talks/wien_talks_server/README.md +++ b/wien_talks/wien_talks_server/README.md @@ -1,4 +1,4 @@ -# wien_talks_server +# Wien Talks: Server ## Local Development Environment From 9219a046147940daecb6fe73d7985529d7d4b8c6 Mon Sep 17 00:00:00 2001 From: tk Date: Sat, 16 Aug 2025 22:28:51 +0200 Subject: [PATCH 40/49] add auth skeleton --- .../lib/helper/auth_service.dart | 30 +++++++++++ .../lib/helper/go_router.dart | 28 +++++++++-- .../wien_talks_flutter/lib/login_page.dart | 50 +++++++++++++++++++ 3 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 wien_talks/wien_talks_flutter/lib/helper/auth_service.dart create mode 100644 wien_talks/wien_talks_flutter/lib/login_page.dart diff --git a/wien_talks/wien_talks_flutter/lib/helper/auth_service.dart b/wien_talks/wien_talks_flutter/lib/helper/auth_service.dart new file mode 100644 index 0000000..0445f78 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/helper/auth_service.dart @@ -0,0 +1,30 @@ +import 'package:google_sign_in/google_sign_in.dart'; + +class AuthService { + static final _google = GoogleSignIn.instance; + + static AuthService? _instance; + + AuthService._() { + _google.initialize(); + } + factory AuthService() { + if (_instance != null) return _instance!; + _instance = AuthService._(); + + return _instance!; + } + + static Stream get onUserChanged => + _google.authenticationEvents; + + static Future signIn() async { + try { + return await _google.authenticate(); + } catch (_) { + return null; + } + } + + static Future signOut() => _google.disconnect(); +} diff --git a/wien_talks/wien_talks_flutter/lib/helper/go_router.dart b/wien_talks/wien_talks_flutter/lib/helper/go_router.dart index bdc24c1..bca0dc4 100644 --- a/wien_talks/wien_talks_flutter/lib/helper/go_router.dart +++ b/wien_talks/wien_talks_flutter/lib/helper/go_router.dart @@ -1,13 +1,31 @@ +import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:wien_talks_flutter/create_event_screen.dart'; -import 'package:wien_talks_flutter/home_screen.dart'; +import 'package:wien_talks_flutter/helper/auth_service.dart'; +import 'package:wien_talks_flutter/login_page.dart'; +import 'package:wien_talks_flutter/news_screen.dart'; final router = GoRouter( + redirect: (context, state) { + final loggedIn = AuthService.user != null; + final atLogin = state.matchedLocation == '/login'; + if (!loggedIn && !atLogin) return '/login'; + if (loggedIn && atLogin) return '/'; + return null; + }, + refreshListenable: AuthChangeNotifier(), routes: [ + GoRoute(path: '/login', builder: (c, s) => const LoginScreen()), + GoRoute(path: '/', builder: (c, s) => NewsScreen()), GoRoute( - path: '/', - builder: (context, state) => HomeScreen(), - ), - GoRoute(path: '/create_event', name: 'create_event', builder: (context, state) => CreateEventScreen()), + path: '/create_event', + name: 'create_event', + builder: (c, s) => CreateEventScreen()), ], ); + +class AuthChangeNotifier extends ChangeNotifier { + AuthChangeNotifier() { + AuthService.onUserChanged.listen((_) => notifyListeners()); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/login_page.dart b/wien_talks/wien_talks_flutter/lib/login_page.dart new file mode 100644 index 0000000..1eff639 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/login_page.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:wien_talks_flutter/helper/auth_service.dart'; + +class LoginScreen extends StatelessWidget { + const LoginScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [Color(0xff2193b0), Color(0xff6dd5ed)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + alignment: Alignment.center, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Wien Talks', + style: GoogleFonts.poppins( + fontSize: 42, + fontWeight: FontWeight.bold, + color: Colors.white)), + const SizedBox(height: 60), + FilledButton.icon( + onPressed: () async => await AuthService.signIn(), + style: FilledButton.styleFrom( + backgroundColor: Colors.white, + foregroundColor: Colors.black87, + padding: + const EdgeInsets.symmetric(horizontal: 24, vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30)), + elevation: 6, + ), + icon: Icon( + Icons.lock, + ), + label: const Text('Sign in with Google'), + ), + ], + ), + ), + ); + } +} From 595b4e730ec4f13cd13e8548e572fe10716499c3 Mon Sep 17 00:00:00 2001 From: tk Date: Sun, 17 Aug 2025 00:33:44 +0200 Subject: [PATCH 41/49] resolved protocol resolution issue --- .../lib/src/protocol/client.dart | 73 +- .../protocol/{quotes => }/create_quote.dart | 0 .../lib/src/protocol/health.dart | 96 + .../lib/src/protocol/protocol.dart | 85 +- .../lib/src/protocol/{quotes => }/quote.dart | 0 .../lib/src/protocol/{votes => }/vote.dart | 22 +- .../lib/src/protocol/votes/vote_request.dart | 108 - .../lib/helper/go_router.dart | 2 +- wien_talks/wien_talks_server/lib/server.dart | 16 +- .../generated/{quotes => }/create_quote.dart | 0 .../lib/src/generated/endpoints.dart | 111 +- .../{votes/vote_request.dart => health.dart} | 273 ++- .../lib/src/generated/protocol.dart | 189 +- .../lib/src/generated/protocol.yaml | 7 +- .../lib/src/generated/{quotes => }/quote.dart | 0 .../lib/src/generated/{votes => }/vote.dart | 32 +- .../lib/src/health/health-endpoint.dart | 23 + .../{quotes => models}/create_quote.spy.yaml | 0 .../lib/src/models/health.spy.yaml | 5 + .../lib/src/{quotes => models}/quote.spy.yaml | 0 .../lib/src/{votes => models}/vote.spy.yaml | 2 +- .../lib/src/quotes/quotes_endpoint.dart | 11 +- .../lib/src/votes/vote_request.spy.yaml | 6 - .../lib/src/votes/votes_endpoint.dart | 35 +- .../20250816095813247/definition_project.json | 11 - .../20250816122625449/migration.json | 676 ------ .../20250816122625449/migration.sql | 158 -- .../20250816212658542/definition.json | 1855 ++++++++++++++++ .../20250816212658542/definition.sql | 405 ++++ .../20250816212658542/definition_project.json | 162 ++ .../migration.json | 728 +++++++ .../migration.sql | 152 +- .../20250816212959541/definition.json | 1855 ++++++++++++++++ .../20250816212959541/definition.sql | 405 ++++ .../20250816212959541/definition_project.json | 162 ++ .../migration.json | 0 .../migration.sql | 4 +- .../definition.json | 51 +- .../definition.sql | 14 +- .../definition_project.json | 49 + .../20250816214717668/migration.json | 43 + .../20250816214717668/migration.sql | 33 + .../definition.json | 51 +- .../definition.sql | 14 +- .../definition_project.json | 49 + .../20250816215043551/migration.json | 5 + .../20250816215043551/migration.sql | 29 + .../definition.json | 698 +++++- .../definition.sql | 151 +- .../20250816215049795/definition_project.json | 156 ++ .../20250816215049795/migration.json | 5 + .../20250816215049795/migration.sql | 29 + .../20250816215102447/definition.json | 1849 ++++++++++++++++ .../20250816215102447/definition.sql | 404 ++++ .../20250816215102447/definition_project.json | 156 ++ .../20250816215102447/migration.json | 5 + .../20250816215102447/migration.sql | 29 + .../20250816220051483/definition.json | 1898 +++++++++++++++++ .../20250816220051483/definition.sql | 414 ++++ .../20250816220051483/definition_project.json | 205 ++ .../20250816220051483/migration.json | 124 ++ .../20250816220051483/migration.sql | 54 + .../migrations/migration_registry.txt | 10 +- .../test_tools/serverpod_test_tools.dart | 205 +- 64 files changed, 12995 insertions(+), 1404 deletions(-) rename wien_talks/wien_talks_client/lib/src/protocol/{quotes => }/create_quote.dart (100%) create mode 100644 wien_talks/wien_talks_client/lib/src/protocol/health.dart rename wien_talks/wien_talks_client/lib/src/protocol/{quotes => }/quote.dart (100%) rename wien_talks/wien_talks_client/lib/src/protocol/{votes => }/vote.dart (87%) delete mode 100644 wien_talks/wien_talks_client/lib/src/protocol/votes/vote_request.dart rename wien_talks/wien_talks_server/lib/src/generated/{quotes => }/create_quote.dart (100%) rename wien_talks/wien_talks_server/lib/src/generated/{votes/vote_request.dart => health.dart} (50%) rename wien_talks/wien_talks_server/lib/src/generated/{quotes => }/quote.dart (100%) rename wien_talks/wien_talks_server/lib/src/generated/{votes => }/vote.dart (95%) create mode 100644 wien_talks/wien_talks_server/lib/src/health/health-endpoint.dart rename wien_talks/wien_talks_server/lib/src/{quotes => models}/create_quote.spy.yaml (100%) create mode 100644 wien_talks/wien_talks_server/lib/src/models/health.spy.yaml rename wien_talks/wien_talks_server/lib/src/{quotes => models}/quote.spy.yaml (100%) rename wien_talks/wien_talks_server/lib/src/{votes => models}/vote.spy.yaml (84%) delete mode 100644 wien_talks/wien_talks_server/lib/src/votes/vote_request.spy.yaml delete mode 100644 wien_talks/wien_talks_server/migrations/20250816095813247/definition_project.json delete mode 100644 wien_talks/wien_talks_server/migrations/20250816122625449/migration.json delete mode 100644 wien_talks/wien_talks_server/migrations/20250816122625449/migration.sql create mode 100644 wien_talks/wien_talks_server/migrations/20250816212658542/definition.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816212658542/definition.sql create mode 100644 wien_talks/wien_talks_server/migrations/20250816212658542/definition_project.json rename wien_talks/wien_talks_server/migrations/{20250816095813247 => 20250816212658542}/migration.json (62%) rename wien_talks/wien_talks_server/migrations/{20250816095813247 => 20250816212658542}/migration.sql (63%) create mode 100644 wien_talks/wien_talks_server/migrations/20250816212959541/definition.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816212959541/definition.sql create mode 100644 wien_talks/wien_talks_server/migrations/20250816212959541/definition_project.json rename wien_talks/wien_talks_server/migrations/{20250816171653001 => 20250816212959541}/migration.json (100%) rename wien_talks/wien_talks_server/migrations/{20250816171653001 => 20250816212959541}/migration.sql (85%) rename wien_talks/wien_talks_server/migrations/{20250816122625449 => 20250816214717668}/definition.json (97%) rename wien_talks/wien_talks_server/migrations/{20250816171653001 => 20250816214717668}/definition.sql (97%) rename wien_talks/wien_talks_server/migrations/{20250816122625449 => 20250816214717668}/definition_project.json (68%) create mode 100644 wien_talks/wien_talks_server/migrations/20250816214717668/migration.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816214717668/migration.sql rename wien_talks/wien_talks_server/migrations/{20250816171653001 => 20250816215043551}/definition.json (97%) rename wien_talks/wien_talks_server/migrations/{20250816122625449 => 20250816215043551}/definition.sql (97%) rename wien_talks/wien_talks_server/migrations/{20250816171653001 => 20250816215043551}/definition_project.json (68%) create mode 100644 wien_talks/wien_talks_server/migrations/20250816215043551/migration.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816215043551/migration.sql rename wien_talks/wien_talks_server/migrations/{20250816095813247 => 20250816215049795}/definition.json (62%) rename wien_talks/wien_talks_server/migrations/{20250816095813247 => 20250816215049795}/definition.sql (63%) create mode 100644 wien_talks/wien_talks_server/migrations/20250816215049795/definition_project.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816215049795/migration.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816215049795/migration.sql create mode 100644 wien_talks/wien_talks_server/migrations/20250816215102447/definition.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816215102447/definition.sql create mode 100644 wien_talks/wien_talks_server/migrations/20250816215102447/definition_project.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816215102447/migration.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816215102447/migration.sql create mode 100644 wien_talks/wien_talks_server/migrations/20250816220051483/definition.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816220051483/definition.sql create mode 100644 wien_talks/wien_talks_server/migrations/20250816220051483/definition_project.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816220051483/migration.json create mode 100644 wien_talks/wien_talks_server/migrations/20250816220051483/migration.sql diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index dcae10e..431e580 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -11,13 +11,35 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod_client/serverpod_client.dart' as _i1; import 'dart:async' as _i2; -import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i3; -import 'package:wien_talks_client/src/protocol/quotes/create_quote.dart' as _i4; -import 'package:wien_talks_client/src/protocol/votes/vote.dart' as _i5; -import 'package:wien_talks_client/src/protocol/votes/vote_request.dart' as _i6; +import 'package:wien_talks_client/src/protocol/health.dart' as _i3; +import 'package:wien_talks_client/src/protocol/quote.dart' as _i4; +import 'package:wien_talks_client/src/protocol/create_quote.dart' as _i5; +import 'package:wien_talks_client/src/protocol/vote.dart' as _i6; import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i7; import 'protocol.dart' as _i8; +/// {@category Endpoint} +class EndpointHealth extends _i1.EndpointRef { + EndpointHealth(_i1.EndpointCaller caller) : super(caller); + + @override + String get name => 'health'; + + _i2.Future<_i3.Health> ping({String? note}) => + caller.callServerEndpoint<_i3.Health>( + 'health', + 'ping', + {'note': note}, + ); + + _i2.Future> all() => + caller.callServerEndpoint>( + 'health', + 'all', + {}, + ); +} + /// {@category Endpoint} class EndpointQuote extends _i1.EndpointRef { EndpointQuote(_i1.EndpointCaller caller) : super(caller); @@ -25,22 +47,28 @@ class EndpointQuote extends _i1.EndpointRef { @override String get name => 'quote'; - _i2.Future<_i3.Quote> createQuote(_i4.CreateQuoteRequest req) => - caller.callServerEndpoint<_i3.Quote>( + _i2.Future dbPing() => caller.callServerEndpoint( + 'quote', + 'dbPing', + {}, + ); + + _i2.Future<_i4.Quote> createQuote(_i5.CreateQuoteRequest req) => + caller.callServerEndpoint<_i4.Quote>( 'quote', 'createQuote', {'req': req}, ); - _i2.Future updateQuote(_i3.Quote quote) => + _i2.Future updateQuote(_i4.Quote quote) => caller.callServerEndpoint( 'quote', 'updateQuote', {'quote': quote}, ); - _i2.Future> getAllQuotes() => - caller.callServerEndpoint>( + _i2.Future> getAllQuotes() => + caller.callServerEndpoint>( 'quote', 'getAllQuotes', {}, @@ -54,19 +82,24 @@ class EndpointVotes extends _i1.EndpointRef { @override String get name => 'votes'; - _i2.Future<_i5.Vote> postVote(_i6.VoteRequest voteRequest) => - caller.callServerEndpoint<_i5.Vote>( - 'votes', - 'postVote', - {'voteRequest': voteRequest}, - ); - - _i2.Future> getAllVotes() => - caller.callServerEndpoint>( + _i2.Future> getAllVotes() => + caller.callServerEndpoint>( 'votes', 'getAllVotes', {}, ); + + _i2.Future createVote() => caller.callServerEndpoint( + 'votes', + 'createVote', + {}, + ); + + _i2.Future sayHello() => caller.callServerEndpoint( + 'votes', + 'sayHello', + {}, + ); } class Modules { @@ -103,11 +136,14 @@ class Client extends _i1.ServerpodClientShared { disconnectStreamsOnLostInternetConnection: disconnectStreamsOnLostInternetConnection, ) { + health = EndpointHealth(this); quote = EndpointQuote(this); votes = EndpointVotes(this); modules = Modules(this); } + late final EndpointHealth health; + late final EndpointQuote quote; late final EndpointVotes votes; @@ -116,6 +152,7 @@ class Client extends _i1.ServerpodClientShared { @override Map get endpointRefLookup => { + 'health': health, 'quote': quote, 'votes': votes, }; diff --git a/wien_talks/wien_talks_client/lib/src/protocol/quotes/create_quote.dart b/wien_talks/wien_talks_client/lib/src/protocol/create_quote.dart similarity index 100% rename from wien_talks/wien_talks_client/lib/src/protocol/quotes/create_quote.dart rename to wien_talks/wien_talks_client/lib/src/protocol/create_quote.dart diff --git a/wien_talks/wien_talks_client/lib/src/protocol/health.dart b/wien_talks/wien_talks_client/lib/src/protocol/health.dart new file mode 100644 index 0000000..e16054f --- /dev/null +++ b/wien_talks/wien_talks_client/lib/src/protocol/health.dart @@ -0,0 +1,96 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: implementation_imports +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: public_member_api_docs +// ignore_for_file: type_literal_in_constant_pattern +// ignore_for_file: use_super_parameters + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod_client/serverpod_client.dart' as _i1; + +abstract class Health implements _i1.SerializableModel { + Health._({ + this.id, + required this.createdAt, + this.note, + }); + + factory Health({ + int? id, + required DateTime createdAt, + String? note, + }) = _HealthImpl; + + factory Health.fromJson(Map jsonSerialization) { + return Health( + id: jsonSerialization['id'] as int?, + createdAt: + _i1.DateTimeJsonExtension.fromJson(jsonSerialization['createdAt']), + note: jsonSerialization['note'] as String?, + ); + } + + /// The database id, set if the object has been inserted into the + /// database or if it has been fetched from the database. Otherwise, + /// the id will be null. + int? id; + + DateTime createdAt; + + String? note; + + /// Returns a shallow copy of this [Health] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + Health copyWith({ + int? id, + DateTime? createdAt, + String? note, + }); + @override + Map toJson() { + return { + if (id != null) 'id': id, + 'createdAt': createdAt.toJson(), + if (note != null) 'note': note, + }; + } + + @override + String toString() { + return _i1.SerializationManager.encode(this); + } +} + +class _Undefined {} + +class _HealthImpl extends Health { + _HealthImpl({ + int? id, + required DateTime createdAt, + String? note, + }) : super._( + id: id, + createdAt: createdAt, + note: note, + ); + + /// Returns a shallow copy of this [Health] + /// with some or all fields replaced by the given arguments. + @_i1.useResult + @override + Health copyWith({ + Object? id = _Undefined, + DateTime? createdAt, + Object? note = _Undefined, + }) { + return Health( + id: id is int? ? id : this.id, + createdAt: createdAt ?? this.createdAt, + note: note is String? ? note : this.note, + ); + } +} diff --git a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart index b709655..23f8d65 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/protocol.dart @@ -10,17 +10,18 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod_client/serverpod_client.dart' as _i1; -import 'quotes/create_quote.dart' as _i2; -import 'quotes/quote.dart' as _i3; -import 'votes/vote.dart' as _i4; -import 'votes/vote_request.dart' as _i5; -import 'package:wien_talks_client/src/protocol/quotes/quote.dart' as _i6; -import 'package:wien_talks_client/src/protocol/votes/vote.dart' as _i7; -import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i8; -export 'quotes/create_quote.dart'; -export 'quotes/quote.dart'; -export 'votes/vote.dart'; -export 'votes/vote_request.dart'; +import 'create_quote.dart' as _i2; +import 'health.dart' as _i3; +import 'quote.dart' as _i4; +import 'vote.dart' as _i5; +import 'package:wien_talks_client/src/protocol/health.dart' as _i6; +import 'package:wien_talks_client/src/protocol/quote.dart' as _i7; +import 'package:wien_talks_client/src/protocol/vote.dart' as _i8; +import 'package:serverpod_auth_client/serverpod_auth_client.dart' as _i9; +export 'create_quote.dart'; +export 'health.dart'; +export 'quote.dart'; +export 'vote.dart'; export 'client.dart'; class Protocol extends _i1.SerializationManager { @@ -39,26 +40,26 @@ class Protocol extends _i1.SerializationManager { if (t == _i2.CreateQuoteRequest) { return _i2.CreateQuoteRequest.fromJson(data) as T; } - if (t == _i3.Quote) { - return _i3.Quote.fromJson(data) as T; + if (t == _i3.Health) { + return _i3.Health.fromJson(data) as T; } - if (t == _i4.Vote) { - return _i4.Vote.fromJson(data) as T; + if (t == _i4.Quote) { + return _i4.Quote.fromJson(data) as T; } - if (t == _i5.VoteRequest) { - return _i5.VoteRequest.fromJson(data) as T; + if (t == _i5.Vote) { + return _i5.Vote.fromJson(data) as T; } if (t == _i1.getType<_i2.CreateQuoteRequest?>()) { return (data != null ? _i2.CreateQuoteRequest.fromJson(data) : null) as T; } - if (t == _i1.getType<_i3.Quote?>()) { - return (data != null ? _i3.Quote.fromJson(data) : null) as T; + if (t == _i1.getType<_i3.Health?>()) { + return (data != null ? _i3.Health.fromJson(data) : null) as T; } - if (t == _i1.getType<_i4.Vote?>()) { - return (data != null ? _i4.Vote.fromJson(data) : null) as T; + if (t == _i1.getType<_i4.Quote?>()) { + return (data != null ? _i4.Quote.fromJson(data) : null) as T; } - if (t == _i1.getType<_i5.VoteRequest?>()) { - return (data != null ? _i5.VoteRequest.fromJson(data) : null) as T; + if (t == _i1.getType<_i5.Vote?>()) { + return (data != null ? _i5.Vote.fromJson(data) : null) as T; } if (t == _i1.getType?>()) { return (data != null @@ -70,14 +71,18 @@ class Protocol extends _i1.SerializationManager { ? (data as List).map((e) => deserialize(e)).toList() : null) as T; } - if (t == List<_i6.Quote>) { - return (data as List).map((e) => deserialize<_i6.Quote>(e)).toList() as T; + if (t == List<_i6.Health>) { + return (data as List).map((e) => deserialize<_i6.Health>(e)).toList() + as T; } - if (t == List<_i7.Vote>) { - return (data as List).map((e) => deserialize<_i7.Vote>(e)).toList() as T; + if (t == List<_i7.Quote>) { + return (data as List).map((e) => deserialize<_i7.Quote>(e)).toList() as T; + } + if (t == List<_i8.Vote>) { + return (data as List).map((e) => deserialize<_i8.Vote>(e)).toList() as T; } try { - return _i8.Protocol().deserialize(data, t); + return _i9.Protocol().deserialize(data, t); } on _i1.DeserializationTypeNotFoundException catch (_) {} return super.deserialize(data, t); } @@ -89,16 +94,16 @@ class Protocol extends _i1.SerializationManager { if (data is _i2.CreateQuoteRequest) { return 'CreateQuoteRequest'; } - if (data is _i3.Quote) { + if (data is _i3.Health) { + return 'Health'; + } + if (data is _i4.Quote) { return 'Quote'; } - if (data is _i4.Vote) { + if (data is _i5.Vote) { return 'Vote'; } - if (data is _i5.VoteRequest) { - return 'VoteRequest'; - } - className = _i8.Protocol().getClassNameForObject(data); + className = _i9.Protocol().getClassNameForObject(data); if (className != null) { return 'serverpod_auth.$className'; } @@ -114,18 +119,18 @@ class Protocol extends _i1.SerializationManager { if (dataClassName == 'CreateQuoteRequest') { return deserialize<_i2.CreateQuoteRequest>(data['data']); } + if (dataClassName == 'Health') { + return deserialize<_i3.Health>(data['data']); + } if (dataClassName == 'Quote') { - return deserialize<_i3.Quote>(data['data']); + return deserialize<_i4.Quote>(data['data']); } if (dataClassName == 'Vote') { - return deserialize<_i4.Vote>(data['data']); - } - if (dataClassName == 'VoteRequest') { - return deserialize<_i5.VoteRequest>(data['data']); + return deserialize<_i5.Vote>(data['data']); } if (dataClassName.startsWith('serverpod_auth.')) { data['className'] = dataClassName.substring(15); - return _i8.Protocol().deserializeByClassName(data); + return _i9.Protocol().deserializeByClassName(data); } return super.deserializeByClassName(data); } diff --git a/wien_talks/wien_talks_client/lib/src/protocol/quotes/quote.dart b/wien_talks/wien_talks_client/lib/src/protocol/quote.dart similarity index 100% rename from wien_talks/wien_talks_client/lib/src/protocol/quotes/quote.dart rename to wien_talks/wien_talks_client/lib/src/protocol/quote.dart diff --git a/wien_talks/wien_talks_client/lib/src/protocol/votes/vote.dart b/wien_talks/wien_talks_client/lib/src/protocol/vote.dart similarity index 87% rename from wien_talks/wien_talks_client/lib/src/protocol/votes/vote.dart rename to wien_talks/wien_talks_client/lib/src/protocol/vote.dart index 5e969f1..3bb8102 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/votes/vote.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/vote.dart @@ -10,14 +10,13 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod_client/serverpod_client.dart' as _i1; -import '../quotes/quote.dart' as _i2; abstract class Vote implements _i1.SerializableModel { Vote._({ this.id, required this.userId, required this.createdAt, - required this.quote, + required this.quoteId, required this.upvote, }); @@ -25,7 +24,7 @@ abstract class Vote implements _i1.SerializableModel { int? id, required int userId, required DateTime createdAt, - required _i2.Quote quote, + required int quoteId, required bool upvote, }) = _VoteImpl; @@ -35,8 +34,7 @@ abstract class Vote implements _i1.SerializableModel { userId: jsonSerialization['userId'] as int, createdAt: _i1.DateTimeJsonExtension.fromJson(jsonSerialization['createdAt']), - quote: _i2.Quote.fromJson( - (jsonSerialization['quote'] as Map)), + quoteId: jsonSerialization['quoteId'] as int, upvote: jsonSerialization['upvote'] as bool, ); } @@ -50,7 +48,7 @@ abstract class Vote implements _i1.SerializableModel { DateTime createdAt; - _i2.Quote quote; + int quoteId; bool upvote; @@ -61,7 +59,7 @@ abstract class Vote implements _i1.SerializableModel { int? id, int? userId, DateTime? createdAt, - _i2.Quote? quote, + int? quoteId, bool? upvote, }); @override @@ -70,7 +68,7 @@ abstract class Vote implements _i1.SerializableModel { if (id != null) 'id': id, 'userId': userId, 'createdAt': createdAt.toJson(), - 'quote': quote.toJson(), + 'quoteId': quoteId, 'upvote': upvote, }; } @@ -88,13 +86,13 @@ class _VoteImpl extends Vote { int? id, required int userId, required DateTime createdAt, - required _i2.Quote quote, + required int quoteId, required bool upvote, }) : super._( id: id, userId: userId, createdAt: createdAt, - quote: quote, + quoteId: quoteId, upvote: upvote, ); @@ -106,14 +104,14 @@ class _VoteImpl extends Vote { Object? id = _Undefined, int? userId, DateTime? createdAt, - _i2.Quote? quote, + int? quoteId, bool? upvote, }) { return Vote( id: id is int? ? id : this.id, userId: userId ?? this.userId, createdAt: createdAt ?? this.createdAt, - quote: quote ?? this.quote.copyWith(), + quoteId: quoteId ?? this.quoteId, upvote: upvote ?? this.upvote, ); } diff --git a/wien_talks/wien_talks_client/lib/src/protocol/votes/vote_request.dart b/wien_talks/wien_talks_client/lib/src/protocol/votes/vote_request.dart deleted file mode 100644 index baf48e9..0000000 --- a/wien_talks/wien_talks_client/lib/src/protocol/votes/vote_request.dart +++ /dev/null @@ -1,108 +0,0 @@ -/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ -/* To generate run: "serverpod generate" */ - -// ignore_for_file: implementation_imports -// ignore_for_file: library_private_types_in_public_api -// ignore_for_file: non_constant_identifier_names -// ignore_for_file: public_member_api_docs -// ignore_for_file: type_literal_in_constant_pattern -// ignore_for_file: use_super_parameters - -// ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:serverpod_client/serverpod_client.dart' as _i1; -import '../quotes/quote.dart' as _i2; - -abstract class VoteRequest implements _i1.SerializableModel { - VoteRequest._({ - this.id, - required this.userId, - required this.quote, - required this.upvote, - }); - - factory VoteRequest({ - int? id, - required int userId, - required _i2.Quote quote, - required bool upvote, - }) = _VoteRequestImpl; - - factory VoteRequest.fromJson(Map jsonSerialization) { - return VoteRequest( - id: jsonSerialization['id'] as int?, - userId: jsonSerialization['userId'] as int, - quote: _i2.Quote.fromJson( - (jsonSerialization['quote'] as Map)), - upvote: jsonSerialization['upvote'] as bool, - ); - } - - /// The database id, set if the object has been inserted into the - /// database or if it has been fetched from the database. Otherwise, - /// the id will be null. - int? id; - - int userId; - - _i2.Quote quote; - - bool upvote; - - /// Returns a shallow copy of this [VoteRequest] - /// with some or all fields replaced by the given arguments. - @_i1.useResult - VoteRequest copyWith({ - int? id, - int? userId, - _i2.Quote? quote, - bool? upvote, - }); - @override - Map toJson() { - return { - if (id != null) 'id': id, - 'userId': userId, - 'quote': quote.toJson(), - 'upvote': upvote, - }; - } - - @override - String toString() { - return _i1.SerializationManager.encode(this); - } -} - -class _Undefined {} - -class _VoteRequestImpl extends VoteRequest { - _VoteRequestImpl({ - int? id, - required int userId, - required _i2.Quote quote, - required bool upvote, - }) : super._( - id: id, - userId: userId, - quote: quote, - upvote: upvote, - ); - - /// Returns a shallow copy of this [VoteRequest] - /// with some or all fields replaced by the given arguments. - @_i1.useResult - @override - VoteRequest copyWith({ - Object? id = _Undefined, - int? userId, - _i2.Quote? quote, - bool? upvote, - }) { - return VoteRequest( - id: id is int? ? id : this.id, - userId: userId ?? this.userId, - quote: quote ?? this.quote.copyWith(), - upvote: upvote ?? this.upvote, - ); - } -} diff --git a/wien_talks/wien_talks_flutter/lib/helper/go_router.dart b/wien_talks/wien_talks_flutter/lib/helper/go_router.dart index bca0dc4..2c3c38b 100644 --- a/wien_talks/wien_talks_flutter/lib/helper/go_router.dart +++ b/wien_talks/wien_talks_flutter/lib/helper/go_router.dart @@ -7,7 +7,7 @@ import 'package:wien_talks_flutter/news_screen.dart'; final router = GoRouter( redirect: (context, state) { - final loggedIn = AuthService.user != null; + final loggedIn = true; // AuthService.user != null; final atLogin = state.matchedLocation == '/login'; if (!loggedIn && !atLogin) return '/login'; if (loggedIn && atLogin) return '/'; diff --git a/wien_talks/wien_talks_server/lib/server.dart b/wien_talks/wien_talks_server/lib/server.dart index e79820c..f324003 100644 --- a/wien_talks/wien_talks_server/lib/server.dart +++ b/wien_talks/wien_talks_server/lib/server.dart @@ -1,20 +1,20 @@ -import 'package:serverpod/serverpod.dart'; -import 'package:serverpod_auth_server/serverpod_auth_server.dart' as auth; -import 'package:wien_talks_server/src/web/routes/root.dart'; - -import 'src/generated/endpoints.dart'; - // This is the starting point of your Serverpod server. In most cases, you will // only need to make additions to this file if you add future calls, are // configuring Relic (Serverpod's web-server), or need custom setup work. +import 'package:serverpod/serverpod.dart'; + +import 'src/generated/endpoints.dart'; +import 'src/generated/protocol.dart'; +import 'src/web/routes/root.dart'; + void run(List args) async { // Initialize Serverpod and connect it with your generated code. final pod = Serverpod( args, - auth.Protocol(), + Protocol(), Endpoints(), - authenticationHandler: auth.authenticationHandler, + // authenticationHandler: authenticationHandler, ); // Setup a default page at the web root. diff --git a/wien_talks/wien_talks_server/lib/src/generated/quotes/create_quote.dart b/wien_talks/wien_talks_server/lib/src/generated/create_quote.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/generated/quotes/create_quote.dart rename to wien_talks/wien_talks_server/lib/src/generated/create_quote.dart diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index c6cdd86..d7bddaf 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -10,41 +10,88 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; -import '../quotes/quotes_endpoint.dart' as _i2; -import '../votes/votes_endpoint.dart' as _i3; -import 'package:wien_talks_server/src/generated/quotes/create_quote.dart' - as _i4; -import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i5; -import 'package:wien_talks_server/src/generated/votes/vote_request.dart' as _i6; +import '../health/health-endpoint.dart' as _i2; +import '../quotes/quotes_endpoint.dart' as _i3; +import '../votes/votes_endpoint.dart' as _i4; +import 'package:wien_talks_server/src/generated/create_quote.dart' as _i5; +import 'package:wien_talks_server/src/generated/quote.dart' as _i6; import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i7; class Endpoints extends _i1.EndpointDispatch { @override void initializeEndpoints(_i1.Server server) { var endpoints = { - 'quote': _i2.QuoteEndpoint() + 'health': _i2.HealthEndpoint() + ..initialize( + server, + 'health', + null, + ), + 'quote': _i3.QuoteEndpoint() ..initialize( server, 'quote', null, ), - 'votes': _i3.VotesEndpoint() + 'votes': _i4.VotesEndpoint() ..initialize( server, 'votes', null, ), }; + connectors['health'] = _i1.EndpointConnector( + name: 'health', + endpoint: endpoints['health']!, + methodConnectors: { + 'ping': _i1.MethodConnector( + name: 'ping', + params: { + 'note': _i1.ParameterDescription( + name: 'note', + type: _i1.getType(), + nullable: true, + ) + }, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['health'] as _i2.HealthEndpoint).ping( + session, + note: params['note'], + ), + ), + 'all': _i1.MethodConnector( + name: 'all', + params: {}, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['health'] as _i2.HealthEndpoint).all(session), + ), + }, + ); connectors['quote'] = _i1.EndpointConnector( name: 'quote', endpoint: endpoints['quote']!, methodConnectors: { + 'dbPing': _i1.MethodConnector( + name: 'dbPing', + params: {}, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['quote'] as _i3.QuoteEndpoint).dbPing(session), + ), 'createQuote': _i1.MethodConnector( name: 'createQuote', params: { 'req': _i1.ParameterDescription( name: 'req', - type: _i1.getType<_i4.CreateQuoteRequest>(), + type: _i1.getType<_i5.CreateQuoteRequest>(), nullable: false, ) }, @@ -52,7 +99,7 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i2.QuoteEndpoint).createQuote( + (endpoints['quote'] as _i3.QuoteEndpoint).createQuote( session, params['req'], ), @@ -62,7 +109,7 @@ class Endpoints extends _i1.EndpointDispatch { params: { 'quote': _i1.ParameterDescription( name: 'quote', - type: _i1.getType<_i5.Quote>(), + type: _i1.getType<_i6.Quote>(), nullable: false, ) }, @@ -70,7 +117,7 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i2.QuoteEndpoint).updateQuote( + (endpoints['quote'] as _i3.QuoteEndpoint).updateQuote( session, params['quote'], ), @@ -82,7 +129,7 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['quote'] as _i2.QuoteEndpoint).getAllQuotes(session), + (endpoints['quote'] as _i3.QuoteEndpoint).getAllQuotes(session), ), }, ); @@ -90,24 +137,6 @@ class Endpoints extends _i1.EndpointDispatch { name: 'votes', endpoint: endpoints['votes']!, methodConnectors: { - 'postVote': _i1.MethodConnector( - name: 'postVote', - params: { - 'voteRequest': _i1.ParameterDescription( - name: 'voteRequest', - type: _i1.getType<_i6.VoteRequest>(), - nullable: false, - ) - }, - call: ( - _i1.Session session, - Map params, - ) async => - (endpoints['votes'] as _i3.VotesEndpoint).postVote( - session, - params['voteRequest'], - ), - ), 'getAllVotes': _i1.MethodConnector( name: 'getAllVotes', params: {}, @@ -115,7 +144,25 @@ class Endpoints extends _i1.EndpointDispatch { _i1.Session session, Map params, ) async => - (endpoints['votes'] as _i3.VotesEndpoint).getAllVotes(session), + (endpoints['votes'] as _i4.VotesEndpoint).getAllVotes(session), + ), + 'createVote': _i1.MethodConnector( + name: 'createVote', + params: {}, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['votes'] as _i4.VotesEndpoint).createVote(session), + ), + 'sayHello': _i1.MethodConnector( + name: 'sayHello', + params: {}, + call: ( + _i1.Session session, + Map params, + ) async => + (endpoints['votes'] as _i4.VotesEndpoint).sayHello(session), ), }, ); diff --git a/wien_talks/wien_talks_server/lib/src/generated/votes/vote_request.dart b/wien_talks/wien_talks_server/lib/src/generated/health.dart similarity index 50% rename from wien_talks/wien_talks_server/lib/src/generated/votes/vote_request.dart rename to wien_talks/wien_talks_server/lib/src/generated/health.dart index 4c03e8a..246819f 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/votes/vote_request.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/health.dart @@ -10,66 +10,57 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; -import '../quotes/quote.dart' as _i2; -abstract class VoteRequest - implements _i1.TableRow, _i1.ProtocolSerialization { - VoteRequest._({ +abstract class Health implements _i1.TableRow, _i1.ProtocolSerialization { + Health._({ this.id, - required this.userId, - required this.quote, - required this.upvote, + required this.createdAt, + this.note, }); - factory VoteRequest({ + factory Health({ int? id, - required int userId, - required _i2.Quote quote, - required bool upvote, - }) = _VoteRequestImpl; + required DateTime createdAt, + String? note, + }) = _HealthImpl; - factory VoteRequest.fromJson(Map jsonSerialization) { - return VoteRequest( + factory Health.fromJson(Map jsonSerialization) { + return Health( id: jsonSerialization['id'] as int?, - userId: jsonSerialization['userId'] as int, - quote: _i2.Quote.fromJson( - (jsonSerialization['quote'] as Map)), - upvote: jsonSerialization['upvote'] as bool, + createdAt: + _i1.DateTimeJsonExtension.fromJson(jsonSerialization['createdAt']), + note: jsonSerialization['note'] as String?, ); } - static final t = VoteRequestTable(); + static final t = HealthTable(); - static const db = VoteRequestRepository._(); + static const db = HealthRepository._(); @override int? id; - int userId; + DateTime createdAt; - _i2.Quote quote; - - bool upvote; + String? note; @override _i1.Table get table => t; - /// Returns a shallow copy of this [VoteRequest] + /// Returns a shallow copy of this [Health] /// with some or all fields replaced by the given arguments. @_i1.useResult - VoteRequest copyWith({ + Health copyWith({ int? id, - int? userId, - _i2.Quote? quote, - bool? upvote, + DateTime? createdAt, + String? note, }); @override Map toJson() { return { if (id != null) 'id': id, - 'userId': userId, - 'quote': quote.toJson(), - 'upvote': upvote, + 'createdAt': createdAt.toJson(), + if (note != null) 'note': note, }; } @@ -77,32 +68,31 @@ abstract class VoteRequest Map toJsonForProtocol() { return { if (id != null) 'id': id, - 'userId': userId, - 'quote': quote.toJsonForProtocol(), - 'upvote': upvote, + 'createdAt': createdAt.toJson(), + if (note != null) 'note': note, }; } - static VoteRequestInclude include() { - return VoteRequestInclude._(); + static HealthInclude include() { + return HealthInclude._(); } - static VoteRequestIncludeList includeList({ - _i1.WhereExpressionBuilder? where, + static HealthIncludeList includeList({ + _i1.WhereExpressionBuilder? where, int? limit, int? offset, - _i1.OrderByBuilder? orderBy, + _i1.OrderByBuilder? orderBy, bool orderDescending = false, - _i1.OrderByListBuilder? orderByList, - VoteRequestInclude? include, + _i1.OrderByListBuilder? orderByList, + HealthInclude? include, }) { - return VoteRequestIncludeList._( + return HealthIncludeList._( where: where, limit: limit, offset: offset, - orderBy: orderBy?.call(VoteRequest.t), + orderBy: orderBy?.call(Health.t), orderDescending: orderDescending, - orderByList: orderByList?.call(VoteRequest.t), + orderByList: orderByList?.call(Health.t), include: include, ); } @@ -115,82 +105,71 @@ abstract class VoteRequest class _Undefined {} -class _VoteRequestImpl extends VoteRequest { - _VoteRequestImpl({ +class _HealthImpl extends Health { + _HealthImpl({ int? id, - required int userId, - required _i2.Quote quote, - required bool upvote, + required DateTime createdAt, + String? note, }) : super._( id: id, - userId: userId, - quote: quote, - upvote: upvote, + createdAt: createdAt, + note: note, ); - /// Returns a shallow copy of this [VoteRequest] + /// Returns a shallow copy of this [Health] /// with some or all fields replaced by the given arguments. @_i1.useResult @override - VoteRequest copyWith({ + Health copyWith({ Object? id = _Undefined, - int? userId, - _i2.Quote? quote, - bool? upvote, + DateTime? createdAt, + Object? note = _Undefined, }) { - return VoteRequest( + return Health( id: id is int? ? id : this.id, - userId: userId ?? this.userId, - quote: quote ?? this.quote.copyWith(), - upvote: upvote ?? this.upvote, + createdAt: createdAt ?? this.createdAt, + note: note is String? ? note : this.note, ); } } -class VoteRequestTable extends _i1.Table { - VoteRequestTable({super.tableRelation}) : super(tableName: 'vote_request') { - userId = _i1.ColumnInt( - 'userId', +class HealthTable extends _i1.Table { + HealthTable({super.tableRelation}) : super(tableName: 'health') { + createdAt = _i1.ColumnDateTime( + 'createdAt', this, ); - quote = _i1.ColumnSerializable( - 'quote', - this, - ); - upvote = _i1.ColumnBool( - 'upvote', + note = _i1.ColumnString( + 'note', this, ); } - late final _i1.ColumnInt userId; + late final _i1.ColumnDateTime createdAt; - late final _i1.ColumnSerializable quote; - - late final _i1.ColumnBool upvote; + late final _i1.ColumnString note; @override List<_i1.Column> get columns => [ id, - userId, - quote, - upvote, + createdAt, + note, ]; } -class VoteRequestInclude extends _i1.IncludeObject { - VoteRequestInclude._(); +class HealthInclude extends _i1.IncludeObject { + HealthInclude._(); @override Map get includes => {}; @override - _i1.Table get table => VoteRequest.t; + _i1.Table get table => Health.t; } -class VoteRequestIncludeList extends _i1.IncludeList { - VoteRequestIncludeList._({ - _i1.WhereExpressionBuilder? where, +class HealthIncludeList extends _i1.IncludeList { + HealthIncludeList._({ + _i1.WhereExpressionBuilder? where, super.limit, super.offset, super.orderBy, @@ -198,20 +177,20 @@ class VoteRequestIncludeList extends _i1.IncludeList { super.orderByList, super.include, }) { - super.where = where?.call(VoteRequest.t); + super.where = where?.call(Health.t); } @override Map get includes => include?.includes ?? {}; @override - _i1.Table get table => VoteRequest.t; + _i1.Table get table => Health.t; } -class VoteRequestRepository { - const VoteRequestRepository._(); +class HealthRepository { + const HealthRepository._(); - /// Returns a list of [VoteRequest]s matching the given query parameters. + /// Returns a list of [Health]s matching the given query parameters. /// /// Use [where] to specify which items to include in the return value. /// If none is specified, all items will be returned. @@ -233,20 +212,20 @@ class VoteRequestRepository { /// limit: 100, /// ); /// ``` - Future> find( + Future> find( _i1.Session session, { - _i1.WhereExpressionBuilder? where, + _i1.WhereExpressionBuilder? where, int? limit, int? offset, - _i1.OrderByBuilder? orderBy, + _i1.OrderByBuilder? orderBy, bool orderDescending = false, - _i1.OrderByListBuilder? orderByList, + _i1.OrderByListBuilder? orderByList, _i1.Transaction? transaction, }) async { - return session.db.find( - where: where?.call(VoteRequest.t), - orderBy: orderBy?.call(VoteRequest.t), - orderByList: orderByList?.call(VoteRequest.t), + return session.db.find( + where: where?.call(Health.t), + orderBy: orderBy?.call(Health.t), + orderByList: orderByList?.call(Health.t), orderDescending: orderDescending, limit: limit, offset: offset, @@ -254,7 +233,7 @@ class VoteRequestRepository { ); } - /// Returns the first matching [VoteRequest] matching the given query parameters. + /// Returns the first matching [Health] matching the given query parameters. /// /// Use [where] to specify which items to include in the return value. /// If none is specified, all items will be returned. @@ -271,136 +250,136 @@ class VoteRequestRepository { /// orderBy: (t) => t.age, /// ); /// ``` - Future findFirstRow( + Future findFirstRow( _i1.Session session, { - _i1.WhereExpressionBuilder? where, + _i1.WhereExpressionBuilder? where, int? offset, - _i1.OrderByBuilder? orderBy, + _i1.OrderByBuilder? orderBy, bool orderDescending = false, - _i1.OrderByListBuilder? orderByList, + _i1.OrderByListBuilder? orderByList, _i1.Transaction? transaction, }) async { - return session.db.findFirstRow( - where: where?.call(VoteRequest.t), - orderBy: orderBy?.call(VoteRequest.t), - orderByList: orderByList?.call(VoteRequest.t), + return session.db.findFirstRow( + where: where?.call(Health.t), + orderBy: orderBy?.call(Health.t), + orderByList: orderByList?.call(Health.t), orderDescending: orderDescending, offset: offset, transaction: transaction, ); } - /// Finds a single [VoteRequest] by its [id] or null if no such row exists. - Future findById( + /// Finds a single [Health] by its [id] or null if no such row exists. + Future findById( _i1.Session session, int id, { _i1.Transaction? transaction, }) async { - return session.db.findById( + return session.db.findById( id, transaction: transaction, ); } - /// Inserts all [VoteRequest]s in the list and returns the inserted rows. + /// Inserts all [Health]s in the list and returns the inserted rows. /// - /// The returned [VoteRequest]s will have their `id` fields set. + /// The returned [Health]s will have their `id` fields set. /// /// This is an atomic operation, meaning that if one of the rows fails to /// insert, none of the rows will be inserted. - Future> insert( + Future> insert( _i1.Session session, - List rows, { + List rows, { _i1.Transaction? transaction, }) async { - return session.db.insert( + return session.db.insert( rows, transaction: transaction, ); } - /// Inserts a single [VoteRequest] and returns the inserted row. + /// Inserts a single [Health] and returns the inserted row. /// - /// The returned [VoteRequest] will have its `id` field set. - Future insertRow( + /// The returned [Health] will have its `id` field set. + Future insertRow( _i1.Session session, - VoteRequest row, { + Health row, { _i1.Transaction? transaction, }) async { - return session.db.insertRow( + return session.db.insertRow( row, transaction: transaction, ); } - /// Updates all [VoteRequest]s in the list and returns the updated rows. If + /// Updates all [Health]s in the list and returns the updated rows. If /// [columns] is provided, only those columns will be updated. Defaults to /// all columns. /// This is an atomic operation, meaning that if one of the rows fails to /// update, none of the rows will be updated. - Future> update( + Future> update( _i1.Session session, - List rows, { - _i1.ColumnSelections? columns, + List rows, { + _i1.ColumnSelections? columns, _i1.Transaction? transaction, }) async { - return session.db.update( + return session.db.update( rows, - columns: columns?.call(VoteRequest.t), + columns: columns?.call(Health.t), transaction: transaction, ); } - /// Updates a single [VoteRequest]. The row needs to have its id set. + /// Updates a single [Health]. The row needs to have its id set. /// Optionally, a list of [columns] can be provided to only update those /// columns. Defaults to all columns. - Future updateRow( + Future updateRow( _i1.Session session, - VoteRequest row, { - _i1.ColumnSelections? columns, + Health row, { + _i1.ColumnSelections? columns, _i1.Transaction? transaction, }) async { - return session.db.updateRow( + return session.db.updateRow( row, - columns: columns?.call(VoteRequest.t), + columns: columns?.call(Health.t), transaction: transaction, ); } - /// Deletes all [VoteRequest]s in the list and returns the deleted rows. + /// Deletes all [Health]s in the list and returns the deleted rows. /// This is an atomic operation, meaning that if one of the rows fail to /// be deleted, none of the rows will be deleted. - Future> delete( + Future> delete( _i1.Session session, - List rows, { + List rows, { _i1.Transaction? transaction, }) async { - return session.db.delete( + return session.db.delete( rows, transaction: transaction, ); } - /// Deletes a single [VoteRequest]. - Future deleteRow( + /// Deletes a single [Health]. + Future deleteRow( _i1.Session session, - VoteRequest row, { + Health row, { _i1.Transaction? transaction, }) async { - return session.db.deleteRow( + return session.db.deleteRow( row, transaction: transaction, ); } /// Deletes all rows matching the [where] expression. - Future> deleteWhere( + Future> deleteWhere( _i1.Session session, { - required _i1.WhereExpressionBuilder where, + required _i1.WhereExpressionBuilder where, _i1.Transaction? transaction, }) async { - return session.db.deleteWhere( - where: where(VoteRequest.t), + return session.db.deleteWhere( + where: where(Health.t), transaction: transaction, ); } @@ -409,12 +388,12 @@ class VoteRequestRepository { /// will return the count of all rows in the table. Future count( _i1.Session session, { - _i1.WhereExpressionBuilder? where, + _i1.WhereExpressionBuilder? where, int? limit, _i1.Transaction? transaction, }) async { - return session.db.count( - where: where?.call(VoteRequest.t), + return session.db.count( + where: where?.call(Health.t), limit: limit, transaction: transaction, ); diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart index b3ad4db..2cb9d22 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.dart @@ -12,16 +12,17 @@ import 'package:serverpod/serverpod.dart' as _i1; import 'package:serverpod/protocol.dart' as _i2; import 'package:serverpod_auth_server/serverpod_auth_server.dart' as _i3; -import 'quotes/create_quote.dart' as _i4; -import 'quotes/quote.dart' as _i5; -import 'votes/vote.dart' as _i6; -import 'votes/vote_request.dart' as _i7; -import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i8; -import 'package:wien_talks_server/src/generated/votes/vote.dart' as _i9; -export 'quotes/create_quote.dart'; -export 'quotes/quote.dart'; -export 'votes/vote.dart'; -export 'votes/vote_request.dart'; +import 'create_quote.dart' as _i4; +import 'health.dart' as _i5; +import 'quote.dart' as _i6; +import 'vote.dart' as _i7; +import 'package:wien_talks_server/src/generated/health.dart' as _i8; +import 'package:wien_talks_server/src/generated/quote.dart' as _i9; +import 'package:wien_talks_server/src/generated/vote.dart' as _i10; +export 'create_quote.dart'; +export 'health.dart'; +export 'quote.dart'; +export 'vote.dart'; class Protocol extends _i1.SerializationManagerServer { Protocol._(); @@ -31,6 +32,50 @@ class Protocol extends _i1.SerializationManagerServer { static final Protocol _instance = Protocol._(); static final List<_i2.TableDefinition> targetTableDefinitions = [ + _i2.TableDefinition( + name: 'health', + dartName: 'Health', + schema: 'public', + module: 'wien_talks', + columns: [ + _i2.ColumnDefinition( + name: 'id', + columnType: _i2.ColumnType.bigint, + isNullable: false, + dartType: 'int?', + columnDefault: 'nextval(\'health_id_seq\'::regclass)', + ), + _i2.ColumnDefinition( + name: 'createdAt', + columnType: _i2.ColumnType.timestampWithoutTimeZone, + isNullable: false, + dartType: 'DateTime', + ), + _i2.ColumnDefinition( + name: 'note', + columnType: _i2.ColumnType.text, + isNullable: true, + dartType: 'String?', + ), + ], + foreignKeys: [], + indexes: [ + _i2.IndexDefinition( + indexName: 'health_pkey', + tableSpace: null, + elements: [ + _i2.IndexElementDefinition( + type: _i2.IndexElementDefinitionType.column, + definition: 'id', + ) + ], + type: 'btree', + isUnique: true, + isPrimary: true, + ) + ], + managed: true, + ), _i2.TableDefinition( name: 'quote', dartName: 'Quote', @@ -149,10 +194,10 @@ class Protocol extends _i1.SerializationManagerServer { dartType: 'DateTime', ), _i2.ColumnDefinition( - name: 'quote', - columnType: _i2.ColumnType.json, + name: 'quoteId', + columnType: _i2.ColumnType.bigint, isNullable: false, - dartType: 'protocol:Quote', + dartType: 'int', ), _i2.ColumnDefinition( name: 'upvote', @@ -179,56 +224,6 @@ class Protocol extends _i1.SerializationManagerServer { ], managed: true, ), - _i2.TableDefinition( - name: 'vote_request', - dartName: 'VoteRequest', - schema: 'public', - module: 'wien_talks', - columns: [ - _i2.ColumnDefinition( - name: 'id', - columnType: _i2.ColumnType.bigint, - isNullable: false, - dartType: 'int?', - columnDefault: 'nextval(\'vote_request_id_seq\'::regclass)', - ), - _i2.ColumnDefinition( - name: 'userId', - columnType: _i2.ColumnType.bigint, - isNullable: false, - dartType: 'int', - ), - _i2.ColumnDefinition( - name: 'quote', - columnType: _i2.ColumnType.json, - isNullable: false, - dartType: 'protocol:Quote', - ), - _i2.ColumnDefinition( - name: 'upvote', - columnType: _i2.ColumnType.boolean, - isNullable: false, - dartType: 'bool', - ), - ], - foreignKeys: [], - indexes: [ - _i2.IndexDefinition( - indexName: 'vote_request_pkey', - tableSpace: null, - elements: [ - _i2.IndexElementDefinition( - type: _i2.IndexElementDefinitionType.column, - definition: 'id', - ) - ], - type: 'btree', - isUnique: true, - isPrimary: true, - ) - ], - managed: true, - ), ..._i3.Protocol.targetTableDefinitions, ..._i2.Protocol.targetTableDefinitions, ]; @@ -242,26 +237,26 @@ class Protocol extends _i1.SerializationManagerServer { if (t == _i4.CreateQuoteRequest) { return _i4.CreateQuoteRequest.fromJson(data) as T; } - if (t == _i5.Quote) { - return _i5.Quote.fromJson(data) as T; + if (t == _i5.Health) { + return _i5.Health.fromJson(data) as T; } - if (t == _i6.Vote) { - return _i6.Vote.fromJson(data) as T; + if (t == _i6.Quote) { + return _i6.Quote.fromJson(data) as T; } - if (t == _i7.VoteRequest) { - return _i7.VoteRequest.fromJson(data) as T; + if (t == _i7.Vote) { + return _i7.Vote.fromJson(data) as T; } if (t == _i1.getType<_i4.CreateQuoteRequest?>()) { return (data != null ? _i4.CreateQuoteRequest.fromJson(data) : null) as T; } - if (t == _i1.getType<_i5.Quote?>()) { - return (data != null ? _i5.Quote.fromJson(data) : null) as T; + if (t == _i1.getType<_i5.Health?>()) { + return (data != null ? _i5.Health.fromJson(data) : null) as T; } - if (t == _i1.getType<_i6.Vote?>()) { - return (data != null ? _i6.Vote.fromJson(data) : null) as T; + if (t == _i1.getType<_i6.Quote?>()) { + return (data != null ? _i6.Quote.fromJson(data) : null) as T; } - if (t == _i1.getType<_i7.VoteRequest?>()) { - return (data != null ? _i7.VoteRequest.fromJson(data) : null) as T; + if (t == _i1.getType<_i7.Vote?>()) { + return (data != null ? _i7.Vote.fromJson(data) : null) as T; } if (t == _i1.getType?>()) { return (data != null @@ -273,11 +268,15 @@ class Protocol extends _i1.SerializationManagerServer { ? (data as List).map((e) => deserialize(e)).toList() : null) as T; } - if (t == List<_i8.Quote>) { - return (data as List).map((e) => deserialize<_i8.Quote>(e)).toList() as T; + if (t == List<_i8.Health>) { + return (data as List).map((e) => deserialize<_i8.Health>(e)).toList() + as T; } - if (t == List<_i9.Vote>) { - return (data as List).map((e) => deserialize<_i9.Vote>(e)).toList() as T; + if (t == List<_i9.Quote>) { + return (data as List).map((e) => deserialize<_i9.Quote>(e)).toList() as T; + } + if (t == List<_i10.Vote>) { + return (data as List).map((e) => deserialize<_i10.Vote>(e)).toList() as T; } try { return _i3.Protocol().deserialize(data, t); @@ -295,15 +294,15 @@ class Protocol extends _i1.SerializationManagerServer { if (data is _i4.CreateQuoteRequest) { return 'CreateQuoteRequest'; } - if (data is _i5.Quote) { + if (data is _i5.Health) { + return 'Health'; + } + if (data is _i6.Quote) { return 'Quote'; } - if (data is _i6.Vote) { + if (data is _i7.Vote) { return 'Vote'; } - if (data is _i7.VoteRequest) { - return 'VoteRequest'; - } className = _i2.Protocol().getClassNameForObject(data); if (className != null) { return 'serverpod.$className'; @@ -324,14 +323,14 @@ class Protocol extends _i1.SerializationManagerServer { if (dataClassName == 'CreateQuoteRequest') { return deserialize<_i4.CreateQuoteRequest>(data['data']); } + if (dataClassName == 'Health') { + return deserialize<_i5.Health>(data['data']); + } if (dataClassName == 'Quote') { - return deserialize<_i5.Quote>(data['data']); + return deserialize<_i6.Quote>(data['data']); } if (dataClassName == 'Vote') { - return deserialize<_i6.Vote>(data['data']); - } - if (dataClassName == 'VoteRequest') { - return deserialize<_i7.VoteRequest>(data['data']); + return deserialize<_i7.Vote>(data['data']); } if (dataClassName.startsWith('serverpod.')) { data['className'] = dataClassName.substring(10); @@ -359,12 +358,12 @@ class Protocol extends _i1.SerializationManagerServer { } } switch (t) { - case _i5.Quote: - return _i5.Quote.t; - case _i6.Vote: - return _i6.Vote.t; - case _i7.VoteRequest: - return _i7.VoteRequest.t; + case _i5.Health: + return _i5.Health.t; + case _i6.Quote: + return _i6.Quote.t; + case _i7.Vote: + return _i7.Vote.t; } return null; } diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml index 4628fc9..1e633c7 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml @@ -1,7 +1,12 @@ +health: + - ping: + - all: quote: + - dbPing: - createQuote: - updateQuote: - getAllQuotes: votes: - - postVote: - getAllVotes: + - createVote: + - sayHello: diff --git a/wien_talks/wien_talks_server/lib/src/generated/quotes/quote.dart b/wien_talks/wien_talks_server/lib/src/generated/quote.dart similarity index 100% rename from wien_talks/wien_talks_server/lib/src/generated/quotes/quote.dart rename to wien_talks/wien_talks_server/lib/src/generated/quote.dart diff --git a/wien_talks/wien_talks_server/lib/src/generated/votes/vote.dart b/wien_talks/wien_talks_server/lib/src/generated/vote.dart similarity index 95% rename from wien_talks/wien_talks_server/lib/src/generated/votes/vote.dart rename to wien_talks/wien_talks_server/lib/src/generated/vote.dart index a150695..5a7d1ed 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/votes/vote.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/vote.dart @@ -10,14 +10,13 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; -import '../quotes/quote.dart' as _i2; abstract class Vote implements _i1.TableRow, _i1.ProtocolSerialization { Vote._({ this.id, required this.userId, required this.createdAt, - required this.quote, + required this.quoteId, required this.upvote, }); @@ -25,7 +24,7 @@ abstract class Vote implements _i1.TableRow, _i1.ProtocolSerialization { int? id, required int userId, required DateTime createdAt, - required _i2.Quote quote, + required int quoteId, required bool upvote, }) = _VoteImpl; @@ -35,8 +34,7 @@ abstract class Vote implements _i1.TableRow, _i1.ProtocolSerialization { userId: jsonSerialization['userId'] as int, createdAt: _i1.DateTimeJsonExtension.fromJson(jsonSerialization['createdAt']), - quote: _i2.Quote.fromJson( - (jsonSerialization['quote'] as Map)), + quoteId: jsonSerialization['quoteId'] as int, upvote: jsonSerialization['upvote'] as bool, ); } @@ -52,7 +50,7 @@ abstract class Vote implements _i1.TableRow, _i1.ProtocolSerialization { DateTime createdAt; - _i2.Quote quote; + int quoteId; bool upvote; @@ -66,7 +64,7 @@ abstract class Vote implements _i1.TableRow, _i1.ProtocolSerialization { int? id, int? userId, DateTime? createdAt, - _i2.Quote? quote, + int? quoteId, bool? upvote, }); @override @@ -75,7 +73,7 @@ abstract class Vote implements _i1.TableRow, _i1.ProtocolSerialization { if (id != null) 'id': id, 'userId': userId, 'createdAt': createdAt.toJson(), - 'quote': quote.toJson(), + 'quoteId': quoteId, 'upvote': upvote, }; } @@ -86,7 +84,7 @@ abstract class Vote implements _i1.TableRow, _i1.ProtocolSerialization { if (id != null) 'id': id, 'userId': userId, 'createdAt': createdAt.toJson(), - 'quote': quote.toJsonForProtocol(), + 'quoteId': quoteId, 'upvote': upvote, }; } @@ -128,13 +126,13 @@ class _VoteImpl extends Vote { int? id, required int userId, required DateTime createdAt, - required _i2.Quote quote, + required int quoteId, required bool upvote, }) : super._( id: id, userId: userId, createdAt: createdAt, - quote: quote, + quoteId: quoteId, upvote: upvote, ); @@ -146,14 +144,14 @@ class _VoteImpl extends Vote { Object? id = _Undefined, int? userId, DateTime? createdAt, - _i2.Quote? quote, + int? quoteId, bool? upvote, }) { return Vote( id: id is int? ? id : this.id, userId: userId ?? this.userId, createdAt: createdAt ?? this.createdAt, - quote: quote ?? this.quote.copyWith(), + quoteId: quoteId ?? this.quoteId, upvote: upvote ?? this.upvote, ); } @@ -169,8 +167,8 @@ class VoteTable extends _i1.Table { 'createdAt', this, ); - quote = _i1.ColumnSerializable( - 'quote', + quoteId = _i1.ColumnInt( + 'quoteId', this, ); upvote = _i1.ColumnBool( @@ -183,7 +181,7 @@ class VoteTable extends _i1.Table { late final _i1.ColumnDateTime createdAt; - late final _i1.ColumnSerializable quote; + late final _i1.ColumnInt quoteId; late final _i1.ColumnBool upvote; @@ -192,7 +190,7 @@ class VoteTable extends _i1.Table { id, userId, createdAt, - quote, + quoteId, upvote, ]; } diff --git a/wien_talks/wien_talks_server/lib/src/health/health-endpoint.dart b/wien_talks/wien_talks_server/lib/src/health/health-endpoint.dart new file mode 100644 index 0000000..c98d76e --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/health/health-endpoint.dart @@ -0,0 +1,23 @@ +import 'package:serverpod/serverpod.dart'; +import 'package:wien_talks_server/src/generated/protocol.dart'; + +class HealthEndpoint extends Endpoint { + Future ping(Session session, {String? note}) async { + final row = await Health.db.insertRow( + session, + Health( + createdAt: DateTime.now().toUtc(), + note: note, + ), + ); + return row; + } + + Future> all(Session session) { + return Health.db.find( + session, + orderBy: (h) => h.createdAt, + orderDescending: true, + ); + } +} diff --git a/wien_talks/wien_talks_server/lib/src/quotes/create_quote.spy.yaml b/wien_talks/wien_talks_server/lib/src/models/create_quote.spy.yaml similarity index 100% rename from wien_talks/wien_talks_server/lib/src/quotes/create_quote.spy.yaml rename to wien_talks/wien_talks_server/lib/src/models/create_quote.spy.yaml diff --git a/wien_talks/wien_talks_server/lib/src/models/health.spy.yaml b/wien_talks/wien_talks_server/lib/src/models/health.spy.yaml new file mode 100644 index 0000000..779e344 --- /dev/null +++ b/wien_talks/wien_talks_server/lib/src/models/health.spy.yaml @@ -0,0 +1,5 @@ +class: Health +table: health +fields: + createdAt: DateTime + note: String? diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quote.spy.yaml b/wien_talks/wien_talks_server/lib/src/models/quote.spy.yaml similarity index 100% rename from wien_talks/wien_talks_server/lib/src/quotes/quote.spy.yaml rename to wien_talks/wien_talks_server/lib/src/models/quote.spy.yaml diff --git a/wien_talks/wien_talks_server/lib/src/votes/vote.spy.yaml b/wien_talks/wien_talks_server/lib/src/models/vote.spy.yaml similarity index 84% rename from wien_talks/wien_talks_server/lib/src/votes/vote.spy.yaml rename to wien_talks/wien_talks_server/lib/src/models/vote.spy.yaml index 072b1b8..2f1e878 100644 --- a/wien_talks/wien_talks_server/lib/src/votes/vote.spy.yaml +++ b/wien_talks/wien_talks_server/lib/src/models/vote.spy.yaml @@ -3,5 +3,5 @@ table: vote fields: userId: int createdAt: DateTime - quote: Quote + quoteId: int upvote: bool diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart index f242d1c..b86f3eb 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -8,6 +8,13 @@ import 'package:wien_talks_server/src/quotes/quote_util.dart'; class QuoteEndpoint extends Endpoint { static const _channelQuoteUpdates = 'quote-updates'; + Future dbPing(Session session) async { + await session.db.unsafeQuery('SELECT 1;'); // connectivity + await session.db + .unsafeQuery('SELECT 1 FROM public.quote LIMIT 1;'); // table visible + return 'ok'; + } + Future createQuote(Session session, CreateQuoteRequest req) async { final authInfo = await session.authenticated; final userId = authInfo?.userId; @@ -44,8 +51,8 @@ class QuoteEndpoint extends Endpoint { final quoteList = await Quote.db.find( session, // where: (t) => t.visibility.equals(0), - // orderBy: (t) => t.createdAt, - // orderDescending: true, + orderBy: (t) => t.createdAt, + orderDescending: true, ); for (var element in quoteList) { diff --git a/wien_talks/wien_talks_server/lib/src/votes/vote_request.spy.yaml b/wien_talks/wien_talks_server/lib/src/votes/vote_request.spy.yaml deleted file mode 100644 index e6f5cf5..0000000 --- a/wien_talks/wien_talks_server/lib/src/votes/vote_request.spy.yaml +++ /dev/null @@ -1,6 +0,0 @@ -class: VoteRequest -table: vote_request -fields: - userId: int - quote: Quote - upvote: bool diff --git a/wien_talks/wien_talks_server/lib/src/votes/votes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/votes/votes_endpoint.dart index 1e0d874..99b153c 100644 --- a/wien_talks/wien_talks_server/lib/src/votes/votes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/votes/votes_endpoint.dart @@ -1,21 +1,30 @@ +import 'dart:math'; + import 'package:serverpod/serverpod.dart'; import 'package:wien_talks_server/src/generated/protocol.dart'; class VotesEndpoint extends Endpoint { - Future postVote(Session session, VoteRequest voteRequest) async { - final row = Vote( - createdAt: DateTime.now(), - quote: voteRequest.quote, - upvote: voteRequest.upvote, - userId: voteRequest.userId); - - final persistedVote = await Vote.db.insertRow(session, row); - - return persistedVote; + Future> getAllVotes(Session session) async { + return await Vote.db.find( + session, + orderBy: (v) => v.createdAt, + orderDescending: true, + ); } - Future> getAllVotes(Session session) async { - final rows = Vote.db.find(session, limit: 50); - return rows; + Future createVote(Session session) async { + final vote = await Vote.db.insertRow( + session, + Vote( + userId: Random().nextInt(122), + createdAt: DateTime.now(), + quoteId: Random().nextInt(122), + upvote: true)); + + return '${vote.id}'; + } + + Future sayHello(Session session) async { + return 'hello'; } } diff --git a/wien_talks/wien_talks_server/migrations/20250816095813247/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816095813247/definition_project.json deleted file mode 100644 index e5cbb31..0000000 --- a/wien_talks/wien_talks_server/migrations/20250816095813247/definition_project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "moduleName": "wien_talks", - "tables": [], - "installedModules": [ - { - "module": "serverpod", - "version": "20240516151843329" - } - ], - "migrationApiVersion": 1 -} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816122625449/migration.json b/wien_talks/wien_talks_server/migrations/20250816122625449/migration.json deleted file mode 100644 index c35478a..0000000 --- a/wien_talks/wien_talks_server/migrations/20250816122625449/migration.json +++ /dev/null @@ -1,676 +0,0 @@ -{ - "actions": [ - { - "type": "createTable", - "createTable": { - "name": "quote", - "dartName": "Quote", - "module": "wien_talks", - "schema": "public", - "columns": [ - { - "name": "id", - "columnType": 6, - "isNullable": false, - "columnDefault": "nextval('quote_id_seq'::regclass)", - "dartType": "int?" - }, - { - "name": "userId", - "columnType": 6, - "isNullable": false, - "dartType": "int" - }, - { - "name": "text", - "columnType": 0, - "isNullable": false, - "dartType": "String" - }, - { - "name": "authorName", - "columnType": 0, - "isNullable": true, - "dartType": "String?" - }, - { - "name": "lat", - "columnType": 3, - "isNullable": false, - "dartType": "double" - }, - { - "name": "long", - "columnType": 3, - "isNullable": false, - "dartType": "double" - }, - { - "name": "createdAt", - "columnType": 4, - "isNullable": false, - "dartType": "DateTime" - }, - { - "name": "visibility", - "columnType": 6, - "isNullable": false, - "dartType": "int" - }, - { - "name": "upvotes", - "columnType": 6, - "isNullable": false, - "dartType": "int" - }, - { - "name": "downvotes", - "columnType": 6, - "isNullable": false, - "dartType": "int" - }, - { - "name": "tags", - "columnType": 8, - "isNullable": true, - "dartType": "List?" - } - ], - "foreignKeys": [], - "indexes": [ - { - "indexName": "quote_pkey", - "elements": [ - { - "type": 0, - "definition": "id" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": true - } - ], - "managed": true - } - }, - { - "type": "createTable", - "createTable": { - "name": "serverpod_auth_key", - "dartName": "AuthKey", - "module": "serverpod_auth", - "schema": "public", - "columns": [ - { - "name": "id", - "columnType": 6, - "isNullable": false, - "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", - "dartType": "int?" - }, - { - "name": "userId", - "columnType": 6, - "isNullable": false, - "dartType": "int" - }, - { - "name": "hash", - "columnType": 0, - "isNullable": false, - "dartType": "String" - }, - { - "name": "scopeNames", - "columnType": 8, - "isNullable": false, - "dartType": "List" - }, - { - "name": "method", - "columnType": 0, - "isNullable": false, - "dartType": "String" - } - ], - "foreignKeys": [], - "indexes": [ - { - "indexName": "serverpod_auth_key_pkey", - "elements": [ - { - "type": 0, - "definition": "id" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": true - }, - { - "indexName": "serverpod_auth_key_userId_idx", - "elements": [ - { - "type": 0, - "definition": "userId" - } - ], - "type": "btree", - "isUnique": false, - "isPrimary": false - } - ], - "managed": true - } - }, - { - "type": "createTable", - "createTable": { - "name": "serverpod_email_auth", - "dartName": "EmailAuth", - "module": "serverpod_auth", - "schema": "public", - "columns": [ - { - "name": "id", - "columnType": 6, - "isNullable": false, - "columnDefault": "nextval('serverpod_email_auth_id_seq'::regclass)", - "dartType": "int?" - }, - { - "name": "userId", - "columnType": 6, - "isNullable": false, - "dartType": "int" - }, - { - "name": "email", - "columnType": 0, - "isNullable": false, - "dartType": "String" - }, - { - "name": "hash", - "columnType": 0, - "isNullable": false, - "dartType": "String" - } - ], - "foreignKeys": [], - "indexes": [ - { - "indexName": "serverpod_email_auth_pkey", - "elements": [ - { - "type": 0, - "definition": "id" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": true - }, - { - "indexName": "serverpod_email_auth_email", - "elements": [ - { - "type": 0, - "definition": "email" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": false - } - ], - "managed": true - } - }, - { - "type": "createTable", - "createTable": { - "name": "serverpod_email_create_request", - "dartName": "EmailCreateAccountRequest", - "module": "serverpod_auth", - "schema": "public", - "columns": [ - { - "name": "id", - "columnType": 6, - "isNullable": false, - "columnDefault": "nextval('serverpod_email_create_request_id_seq'::regclass)", - "dartType": "int?" - }, - { - "name": "userName", - "columnType": 0, - "isNullable": false, - "dartType": "String" - }, - { - "name": "email", - "columnType": 0, - "isNullable": false, - "dartType": "String" - }, - { - "name": "hash", - "columnType": 0, - "isNullable": false, - "dartType": "String" - }, - { - "name": "verificationCode", - "columnType": 0, - "isNullable": false, - "dartType": "String" - } - ], - "foreignKeys": [], - "indexes": [ - { - "indexName": "serverpod_email_create_request_pkey", - "elements": [ - { - "type": 0, - "definition": "id" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": true - }, - { - "indexName": "serverpod_email_auth_create_account_request_idx", - "elements": [ - { - "type": 0, - "definition": "email" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": false - } - ], - "managed": true - } - }, - { - "type": "createTable", - "createTable": { - "name": "serverpod_email_failed_sign_in", - "dartName": "EmailFailedSignIn", - "module": "serverpod_auth", - "schema": "public", - "columns": [ - { - "name": "id", - "columnType": 6, - "isNullable": false, - "columnDefault": "nextval('serverpod_email_failed_sign_in_id_seq'::regclass)", - "dartType": "int?" - }, - { - "name": "email", - "columnType": 0, - "isNullable": false, - "dartType": "String" - }, - { - "name": "time", - "columnType": 4, - "isNullable": false, - "dartType": "DateTime" - }, - { - "name": "ipAddress", - "columnType": 0, - "isNullable": false, - "dartType": "String" - } - ], - "foreignKeys": [], - "indexes": [ - { - "indexName": "serverpod_email_failed_sign_in_pkey", - "elements": [ - { - "type": 0, - "definition": "id" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": true - }, - { - "indexName": "serverpod_email_failed_sign_in_email_idx", - "elements": [ - { - "type": 0, - "definition": "email" - } - ], - "type": "btree", - "isUnique": false, - "isPrimary": false - }, - { - "indexName": "serverpod_email_failed_sign_in_time_idx", - "elements": [ - { - "type": 0, - "definition": "time" - } - ], - "type": "btree", - "isUnique": false, - "isPrimary": false - } - ], - "managed": true - } - }, - { - "type": "createTable", - "createTable": { - "name": "serverpod_email_reset", - "dartName": "EmailReset", - "module": "serverpod_auth", - "schema": "public", - "columns": [ - { - "name": "id", - "columnType": 6, - "isNullable": false, - "columnDefault": "nextval('serverpod_email_reset_id_seq'::regclass)", - "dartType": "int?" - }, - { - "name": "userId", - "columnType": 6, - "isNullable": false, - "dartType": "int" - }, - { - "name": "verificationCode", - "columnType": 0, - "isNullable": false, - "dartType": "String" - }, - { - "name": "expiration", - "columnType": 4, - "isNullable": false, - "dartType": "DateTime" - } - ], - "foreignKeys": [], - "indexes": [ - { - "indexName": "serverpod_email_reset_pkey", - "elements": [ - { - "type": 0, - "definition": "id" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": true - }, - { - "indexName": "serverpod_email_reset_verification_idx", - "elements": [ - { - "type": 0, - "definition": "verificationCode" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": false - } - ], - "managed": true - } - }, - { - "type": "createTable", - "createTable": { - "name": "serverpod_google_refresh_token", - "dartName": "GoogleRefreshToken", - "module": "serverpod_auth", - "schema": "public", - "columns": [ - { - "name": "id", - "columnType": 6, - "isNullable": false, - "columnDefault": "nextval('serverpod_google_refresh_token_id_seq'::regclass)", - "dartType": "int?" - }, - { - "name": "userId", - "columnType": 6, - "isNullable": false, - "dartType": "int" - }, - { - "name": "refreshToken", - "columnType": 0, - "isNullable": false, - "dartType": "String" - } - ], - "foreignKeys": [], - "indexes": [ - { - "indexName": "serverpod_google_refresh_token_pkey", - "elements": [ - { - "type": 0, - "definition": "id" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": true - }, - { - "indexName": "serverpod_google_refresh_token_userId_idx", - "elements": [ - { - "type": 0, - "definition": "userId" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": false - } - ], - "managed": true - } - }, - { - "type": "createTable", - "createTable": { - "name": "serverpod_user_image", - "dartName": "UserImage", - "module": "serverpod_auth", - "schema": "public", - "columns": [ - { - "name": "id", - "columnType": 6, - "isNullable": false, - "columnDefault": "nextval('serverpod_user_image_id_seq'::regclass)", - "dartType": "int?" - }, - { - "name": "userId", - "columnType": 6, - "isNullable": false, - "dartType": "int" - }, - { - "name": "version", - "columnType": 6, - "isNullable": false, - "dartType": "int" - }, - { - "name": "url", - "columnType": 0, - "isNullable": false, - "dartType": "String" - } - ], - "foreignKeys": [], - "indexes": [ - { - "indexName": "serverpod_user_image_pkey", - "elements": [ - { - "type": 0, - "definition": "id" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": true - }, - { - "indexName": "serverpod_user_image_user_id", - "elements": [ - { - "type": 0, - "definition": "userId" - }, - { - "type": 0, - "definition": "version" - } - ], - "type": "btree", - "isUnique": false, - "isPrimary": false - } - ], - "managed": true - } - }, - { - "type": "createTable", - "createTable": { - "name": "serverpod_user_info", - "dartName": "UserInfo", - "module": "serverpod_auth", - "schema": "public", - "columns": [ - { - "name": "id", - "columnType": 6, - "isNullable": false, - "columnDefault": "nextval('serverpod_user_info_id_seq'::regclass)", - "dartType": "int?" - }, - { - "name": "userIdentifier", - "columnType": 0, - "isNullable": false, - "dartType": "String" - }, - { - "name": "userName", - "columnType": 0, - "isNullable": true, - "dartType": "String?" - }, - { - "name": "fullName", - "columnType": 0, - "isNullable": true, - "dartType": "String?" - }, - { - "name": "email", - "columnType": 0, - "isNullable": true, - "dartType": "String?" - }, - { - "name": "created", - "columnType": 4, - "isNullable": false, - "dartType": "DateTime" - }, - { - "name": "imageUrl", - "columnType": 0, - "isNullable": true, - "dartType": "String?" - }, - { - "name": "scopeNames", - "columnType": 8, - "isNullable": false, - "dartType": "List" - }, - { - "name": "blocked", - "columnType": 1, - "isNullable": false, - "dartType": "bool" - } - ], - "foreignKeys": [], - "indexes": [ - { - "indexName": "serverpod_user_info_pkey", - "elements": [ - { - "type": 0, - "definition": "id" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": true - }, - { - "indexName": "serverpod_user_info_user_identifier", - "elements": [ - { - "type": 0, - "definition": "userIdentifier" - } - ], - "type": "btree", - "isUnique": true, - "isPrimary": false - }, - { - "indexName": "serverpod_user_info_email", - "elements": [ - { - "type": 0, - "definition": "email" - } - ], - "type": "btree", - "isUnique": false, - "isPrimary": false - } - ], - "managed": true - } - } - ], - "warnings": [], - "migrationApiVersion": 1 -} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816122625449/migration.sql b/wien_talks/wien_talks_server/migrations/20250816122625449/migration.sql deleted file mode 100644 index a0392e6..0000000 --- a/wien_talks/wien_talks_server/migrations/20250816122625449/migration.sql +++ /dev/null @@ -1,158 +0,0 @@ -BEGIN; - --- --- ACTION CREATE TABLE --- -CREATE TABLE "quote" ( - "id" bigserial PRIMARY KEY, - "userId" bigint NOT NULL, - "text" text NOT NULL, - "authorName" text, - "lat" double precision NOT NULL, - "long" double precision NOT NULL, - "createdAt" timestamp without time zone NOT NULL, - "visibility" bigint NOT NULL, - "upvotes" bigint NOT NULL, - "downvotes" bigint NOT NULL, - "tags" json -); - --- --- ACTION CREATE TABLE --- -CREATE TABLE "serverpod_auth_key" ( - "id" bigserial PRIMARY KEY, - "userId" bigint NOT NULL, - "hash" text NOT NULL, - "scopeNames" json NOT NULL, - "method" text NOT NULL -); - --- Indexes -CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); - --- --- ACTION CREATE TABLE --- -CREATE TABLE "serverpod_email_auth" ( - "id" bigserial PRIMARY KEY, - "userId" bigint NOT NULL, - "email" text NOT NULL, - "hash" text NOT NULL -); - --- Indexes -CREATE UNIQUE INDEX "serverpod_email_auth_email" ON "serverpod_email_auth" USING btree ("email"); - --- --- ACTION CREATE TABLE --- -CREATE TABLE "serverpod_email_create_request" ( - "id" bigserial PRIMARY KEY, - "userName" text NOT NULL, - "email" text NOT NULL, - "hash" text NOT NULL, - "verificationCode" text NOT NULL -); - --- Indexes -CREATE UNIQUE INDEX "serverpod_email_auth_create_account_request_idx" ON "serverpod_email_create_request" USING btree ("email"); - --- --- ACTION CREATE TABLE --- -CREATE TABLE "serverpod_email_failed_sign_in" ( - "id" bigserial PRIMARY KEY, - "email" text NOT NULL, - "time" timestamp without time zone NOT NULL, - "ipAddress" text NOT NULL -); - --- Indexes -CREATE INDEX "serverpod_email_failed_sign_in_email_idx" ON "serverpod_email_failed_sign_in" USING btree ("email"); -CREATE INDEX "serverpod_email_failed_sign_in_time_idx" ON "serverpod_email_failed_sign_in" USING btree ("time"); - --- --- ACTION CREATE TABLE --- -CREATE TABLE "serverpod_email_reset" ( - "id" bigserial PRIMARY KEY, - "userId" bigint NOT NULL, - "verificationCode" text NOT NULL, - "expiration" timestamp without time zone NOT NULL -); - --- Indexes -CREATE UNIQUE INDEX "serverpod_email_reset_verification_idx" ON "serverpod_email_reset" USING btree ("verificationCode"); - --- --- ACTION CREATE TABLE --- -CREATE TABLE "serverpod_google_refresh_token" ( - "id" bigserial PRIMARY KEY, - "userId" bigint NOT NULL, - "refreshToken" text NOT NULL -); - --- Indexes -CREATE UNIQUE INDEX "serverpod_google_refresh_token_userId_idx" ON "serverpod_google_refresh_token" USING btree ("userId"); - --- --- ACTION CREATE TABLE --- -CREATE TABLE "serverpod_user_image" ( - "id" bigserial PRIMARY KEY, - "userId" bigint NOT NULL, - "version" bigint NOT NULL, - "url" text NOT NULL -); - --- Indexes -CREATE INDEX "serverpod_user_image_user_id" ON "serverpod_user_image" USING btree ("userId", "version"); - --- --- ACTION CREATE TABLE --- -CREATE TABLE "serverpod_user_info" ( - "id" bigserial PRIMARY KEY, - "userIdentifier" text NOT NULL, - "userName" text, - "fullName" text, - "email" text, - "created" timestamp without time zone NOT NULL, - "imageUrl" text, - "scopeNames" json NOT NULL, - "blocked" boolean NOT NULL -); - --- Indexes -CREATE UNIQUE INDEX "serverpod_user_info_user_identifier" ON "serverpod_user_info" USING btree ("userIdentifier"); -CREATE INDEX "serverpod_user_info_email" ON "serverpod_user_info" USING btree ("email"); - - --- --- MIGRATION VERSION FOR wien_talks --- -INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") - VALUES ('wien_talks', '20250816122625449', now()) - ON CONFLICT ("module") - DO UPDATE SET "version" = '20250816122625449', "timestamp" = now(); - --- --- MIGRATION VERSION FOR serverpod --- -INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") - VALUES ('serverpod', '20240516151843329', now()) - ON CONFLICT ("module") - DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); - --- --- MIGRATION VERSION FOR serverpod_auth --- -INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") - VALUES ('serverpod_auth', '20240520102713718', now()) - ON CONFLICT ("module") - DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); - - -COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816212658542/definition.json b/wien_talks/wien_talks_server/migrations/20250816212658542/definition.json new file mode 100644 index 0000000..a90fc50 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816212658542/definition.json @@ -0,0 +1,1855 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "quote", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:Quote" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage", + "dartName": "CloudStorageEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "addedTime", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + }, + { + "name": "byteData", + "columnType": 5, + "isNullable": false, + "dartType": "dart:typed_data:ByteData" + }, + { + "name": "verified", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_path_idx", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_cloud_storage_expiration", + "elements": [ + { + "type": 0, + "definition": "expiration" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage_direct_upload", + "dartName": "CloudStorageDirectUploadEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_direct_upload_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "authKey", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_direct_upload_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_direct_upload_storage_path", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_future_call", + "dartName": "FutureCallEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_future_call_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "serializedObject", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "identifier", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_future_call_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_future_call_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_serverId_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_identifier_idx", + "elements": [ + { + "type": 0, + "definition": "identifier" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_connection_info", + "dartName": "ServerHealthConnectionInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_connection_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "active", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "closing", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "idle", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_connection_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_connection_info_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_metric", + "dartName": "ServerHealthMetric", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_metric_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "isHealthy", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "value", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_metric_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_metric_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "name" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_log", + "dartName": "LogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "reference", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "logLevel", + "columnType": 6, + "isNullable": false, + "dartType": "protocol:LogLevel" + }, + { + "name": "message", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_message_log", + "dartName": "MessageLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_message_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_message_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_message_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_method", + "dartName": "MethodInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_method_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_method_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_method_endpoint_method_idx", + "elements": [ + { + "type": 0, + "definition": "endpoint" + }, + { + "type": 0, + "definition": "method" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_migrations", + "dartName": "DatabaseMigrationVersion", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_migrations_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "module", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "version", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_migrations_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_migrations_ids", + "elements": [ + { + "type": 0, + "definition": "module" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_query_log", + "dartName": "QueryLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_query_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "query", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "numRows", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_query_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_query_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_query_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_readwrite_test", + "dartName": "ReadWriteTestEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_readwrite_test_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "number", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_readwrite_test_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_runtime_settings", + "dartName": "RuntimeSettings", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_runtime_settings_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "logSettings", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:LogSettings" + }, + { + "name": "logSettingsOverrides", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "logServiceCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "logMalformedCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_runtime_settings_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_session_log", + "dartName": "SessionLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_session_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "module", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "method", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": true, + "dartType": "double?" + }, + { + "name": "numQueries", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "authenticatedUserId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "isOpen", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "touched", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_session_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_session_log_serverid_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_touched_idx", + "elements": [ + { + "type": 0, + "definition": "touched" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_isopen_idx", + "elements": [ + { + "type": 0, + "definition": "isOpen" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_auth", + "dartName": "EmailAuth", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_auth_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_auth_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_create_request", + "dartName": "EmailCreateAccountRequest", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_create_request_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_create_request_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_create_account_request_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_failed_sign_in", + "dartName": "EmailFailedSignIn", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_failed_sign_in_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "ipAddress", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_failed_sign_in_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_failed_sign_in_email_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_email_failed_sign_in_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_reset", + "dartName": "EmailReset", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_reset_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_reset_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_reset_verification_idx", + "elements": [ + { + "type": 0, + "definition": "verificationCode" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_google_refresh_token", + "dartName": "GoogleRefreshToken", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_google_refresh_token_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "refreshToken", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_google_refresh_token_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_google_refresh_token_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_image", + "dartName": "UserImage", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_image_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "version", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "url", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_image_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_image_user_id", + "elements": [ + { + "type": 0, + "definition": "userId" + }, + { + "type": 0, + "definition": "version" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_info", + "dartName": "UserInfo", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userIdentifier", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "fullName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "created", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "imageUrl", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "blocked", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_info_user_identifier", + "elements": [ + { + "type": 0, + "definition": "userIdentifier" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_user_info_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "wien_talks", + "version": "20250816212658542" + }, + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816212658542/definition.sql b/wien_talks/wien_talks_server/migrations/20250816212658542/definition.sql new file mode 100644 index 0000000..391f78e --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816212658542/definition.sql @@ -0,0 +1,405 @@ +BEGIN; + +-- +-- Class Quote as table quote +-- +CREATE TABLE "quote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "text" text NOT NULL, + "authorName" text, + "lat" double precision NOT NULL, + "long" double precision NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "visibility" bigint NOT NULL, + "upvotes" bigint NOT NULL, + "downvotes" bigint NOT NULL, + "tags" json +); + +-- +-- Class Vote as table vote +-- +CREATE TABLE "vote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "quote" json NOT NULL, + "upvote" boolean NOT NULL +); + +-- +-- Class CloudStorageEntry as table serverpod_cloud_storage +-- +CREATE TABLE "serverpod_cloud_storage" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "addedTime" timestamp without time zone NOT NULL, + "expiration" timestamp without time zone, + "byteData" bytea NOT NULL, + "verified" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_path_idx" ON "serverpod_cloud_storage" USING btree ("storageId", "path"); +CREATE INDEX "serverpod_cloud_storage_expiration" ON "serverpod_cloud_storage" USING btree ("expiration"); + +-- +-- Class CloudStorageDirectUploadEntry as table serverpod_cloud_storage_direct_upload +-- +CREATE TABLE "serverpod_cloud_storage_direct_upload" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "expiration" timestamp without time zone NOT NULL, + "authKey" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_direct_upload_storage_path" ON "serverpod_cloud_storage_direct_upload" USING btree ("storageId", "path"); + +-- +-- Class FutureCallEntry as table serverpod_future_call +-- +CREATE TABLE "serverpod_future_call" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "serializedObject" text, + "serverId" text NOT NULL, + "identifier" text +); + +-- Indexes +CREATE INDEX "serverpod_future_call_time_idx" ON "serverpod_future_call" USING btree ("time"); +CREATE INDEX "serverpod_future_call_serverId_idx" ON "serverpod_future_call" USING btree ("serverId"); +CREATE INDEX "serverpod_future_call_identifier_idx" ON "serverpod_future_call" USING btree ("identifier"); + +-- +-- Class ServerHealthConnectionInfo as table serverpod_health_connection_info +-- +CREATE TABLE "serverpod_health_connection_info" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "active" bigint NOT NULL, + "closing" bigint NOT NULL, + "idle" bigint NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_connection_info_timestamp_idx" ON "serverpod_health_connection_info" USING btree ("timestamp", "serverId", "granularity"); + +-- +-- Class ServerHealthMetric as table serverpod_health_metric +-- +CREATE TABLE "serverpod_health_metric" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "isHealthy" boolean NOT NULL, + "value" double precision NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_metric_timestamp_idx" ON "serverpod_health_metric" USING btree ("timestamp", "serverId", "name", "granularity"); + +-- +-- Class LogEntry as table serverpod_log +-- +CREATE TABLE "serverpod_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "reference" text, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "logLevel" bigint NOT NULL, + "message" text NOT NULL, + "error" text, + "stackTrace" text, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_log_sessionLogId_idx" ON "serverpod_log" USING btree ("sessionLogId"); + +-- +-- Class MessageLogEntry as table serverpod_message_log +-- +CREATE TABLE "serverpod_message_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "serverId" text NOT NULL, + "messageId" bigint NOT NULL, + "endpoint" text NOT NULL, + "messageName" text NOT NULL, + "duration" double precision NOT NULL, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- +-- Class MethodInfo as table serverpod_method +-- +CREATE TABLE "serverpod_method" ( + "id" bigserial PRIMARY KEY, + "endpoint" text NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_method_endpoint_method_idx" ON "serverpod_method" USING btree ("endpoint", "method"); + +-- +-- Class DatabaseMigrationVersion as table serverpod_migrations +-- +CREATE TABLE "serverpod_migrations" ( + "id" bigserial PRIMARY KEY, + "module" text NOT NULL, + "version" text NOT NULL, + "timestamp" timestamp without time zone +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_migrations_ids" ON "serverpod_migrations" USING btree ("module"); + +-- +-- Class QueryLogEntry as table serverpod_query_log +-- +CREATE TABLE "serverpod_query_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "query" text NOT NULL, + "duration" double precision NOT NULL, + "numRows" bigint, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_query_log_sessionLogId_idx" ON "serverpod_query_log" USING btree ("sessionLogId"); + +-- +-- Class ReadWriteTestEntry as table serverpod_readwrite_test +-- +CREATE TABLE "serverpod_readwrite_test" ( + "id" bigserial PRIMARY KEY, + "number" bigint NOT NULL +); + +-- +-- Class RuntimeSettings as table serverpod_runtime_settings +-- +CREATE TABLE "serverpod_runtime_settings" ( + "id" bigserial PRIMARY KEY, + "logSettings" json NOT NULL, + "logSettingsOverrides" json NOT NULL, + "logServiceCalls" boolean NOT NULL, + "logMalformedCalls" boolean NOT NULL +); + +-- +-- Class SessionLogEntry as table serverpod_session_log +-- +CREATE TABLE "serverpod_session_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "module" text, + "endpoint" text, + "method" text, + "duration" double precision, + "numQueries" bigint, + "slow" boolean, + "error" text, + "stackTrace" text, + "authenticatedUserId" bigint, + "isOpen" boolean, + "touched" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USING btree ("serverId"); +CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); +CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); + +-- +-- Class AuthKey as table serverpod_auth_key +-- +CREATE TABLE "serverpod_auth_key" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- Class EmailAuth as table serverpod_email_auth +-- +CREATE TABLE "serverpod_email_auth" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_email" ON "serverpod_email_auth" USING btree ("email"); + +-- +-- Class EmailCreateAccountRequest as table serverpod_email_create_request +-- +CREATE TABLE "serverpod_email_create_request" ( + "id" bigserial PRIMARY KEY, + "userName" text NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL, + "verificationCode" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_create_account_request_idx" ON "serverpod_email_create_request" USING btree ("email"); + +-- +-- Class EmailFailedSignIn as table serverpod_email_failed_sign_in +-- +CREATE TABLE "serverpod_email_failed_sign_in" ( + "id" bigserial PRIMARY KEY, + "email" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "ipAddress" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_email_failed_sign_in_email_idx" ON "serverpod_email_failed_sign_in" USING btree ("email"); +CREATE INDEX "serverpod_email_failed_sign_in_time_idx" ON "serverpod_email_failed_sign_in" USING btree ("time"); + +-- +-- Class EmailReset as table serverpod_email_reset +-- +CREATE TABLE "serverpod_email_reset" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "verificationCode" text NOT NULL, + "expiration" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_reset_verification_idx" ON "serverpod_email_reset" USING btree ("verificationCode"); + +-- +-- Class GoogleRefreshToken as table serverpod_google_refresh_token +-- +CREATE TABLE "serverpod_google_refresh_token" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "refreshToken" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_google_refresh_token_userId_idx" ON "serverpod_google_refresh_token" USING btree ("userId"); + +-- +-- Class UserImage as table serverpod_user_image +-- +CREATE TABLE "serverpod_user_image" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "version" bigint NOT NULL, + "url" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_user_image_user_id" ON "serverpod_user_image" USING btree ("userId", "version"); + +-- +-- Class UserInfo as table serverpod_user_info +-- +CREATE TABLE "serverpod_user_info" ( + "id" bigserial PRIMARY KEY, + "userIdentifier" text NOT NULL, + "userName" text, + "fullName" text, + "email" text, + "created" timestamp without time zone NOT NULL, + "imageUrl" text, + "scopeNames" json NOT NULL, + "blocked" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_user_info_user_identifier" ON "serverpod_user_info" USING btree ("userIdentifier"); +CREATE INDEX "serverpod_user_info_email" ON "serverpod_user_info" USING btree ("email"); + +-- +-- Foreign relations for "serverpod_log" table +-- +ALTER TABLE ONLY "serverpod_log" + ADD CONSTRAINT "serverpod_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_message_log" table +-- +ALTER TABLE ONLY "serverpod_message_log" + ADD CONSTRAINT "serverpod_message_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_query_log" table +-- +ALTER TABLE ONLY "serverpod_query_log" + ADD CONSTRAINT "serverpod_query_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816212658542', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816212658542', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816212658542/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816212658542/definition_project.json new file mode 100644 index 0000000..a405534 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816212658542/definition_project.json @@ -0,0 +1,162 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "quote", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:Quote" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816095813247/migration.json b/wien_talks/wien_talks_server/migrations/20250816212658542/migration.json similarity index 62% rename from wien_talks/wien_talks_server/migrations/20250816095813247/migration.json rename to wien_talks/wien_talks_server/migrations/20250816212658542/migration.json index 9e98e44..3c6760d 100644 --- a/wien_talks/wien_talks_server/migrations/20250816095813247/migration.json +++ b/wien_talks/wien_talks_server/migrations/20250816212658542/migration.json @@ -1,5 +1,157 @@ { "actions": [ + { + "type": "createTable", + "createTable": { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "quote", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:Quote" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, { "type": "createTable", "createTable": { @@ -1175,6 +1327,582 @@ ], "managed": true } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_email_auth", + "dartName": "EmailAuth", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_auth_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_auth_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_email_create_request", + "dartName": "EmailCreateAccountRequest", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_create_request_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_create_request_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_create_account_request_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_email_failed_sign_in", + "dartName": "EmailFailedSignIn", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_failed_sign_in_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "ipAddress", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_failed_sign_in_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_failed_sign_in_email_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_email_failed_sign_in_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_email_reset", + "dartName": "EmailReset", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_reset_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_reset_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_reset_verification_idx", + "elements": [ + { + "type": 0, + "definition": "verificationCode" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_google_refresh_token", + "dartName": "GoogleRefreshToken", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_google_refresh_token_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "refreshToken", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_google_refresh_token_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_google_refresh_token_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_user_image", + "dartName": "UserImage", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_image_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "version", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "url", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_image_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_image_user_id", + "elements": [ + { + "type": 0, + "definition": "userId" + }, + { + "type": 0, + "definition": "version" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "serverpod_user_info", + "dartName": "UserInfo", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userIdentifier", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "fullName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "created", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "imageUrl", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "blocked", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_info_user_identifier", + "elements": [ + { + "type": 0, + "definition": "userIdentifier" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_user_info_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } } ], "warnings": [], diff --git a/wien_talks/wien_talks_server/migrations/20250816095813247/migration.sql b/wien_talks/wien_talks_server/migrations/20250816212658542/migration.sql similarity index 63% rename from wien_talks/wien_talks_server/migrations/20250816095813247/migration.sql rename to wien_talks/wien_talks_server/migrations/20250816212658542/migration.sql index 47258dd..4570684 100644 --- a/wien_talks/wien_talks_server/migrations/20250816095813247/migration.sql +++ b/wien_talks/wien_talks_server/migrations/20250816212658542/migration.sql @@ -1,5 +1,33 @@ BEGIN; +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "quote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "text" text NOT NULL, + "authorName" text, + "lat" double precision NOT NULL, + "long" double precision NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "visibility" bigint NOT NULL, + "upvotes" bigint NOT NULL, + "downvotes" bigint NOT NULL, + "tags" json +); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "vote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "quote" json NOT NULL, + "upvote" boolean NOT NULL +); + -- -- ACTION CREATE TABLE -- @@ -206,6 +234,118 @@ CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USI CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_auth_key" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_email_auth" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_email" ON "serverpod_email_auth" USING btree ("email"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_email_create_request" ( + "id" bigserial PRIMARY KEY, + "userName" text NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL, + "verificationCode" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_create_account_request_idx" ON "serverpod_email_create_request" USING btree ("email"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_email_failed_sign_in" ( + "id" bigserial PRIMARY KEY, + "email" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "ipAddress" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_email_failed_sign_in_email_idx" ON "serverpod_email_failed_sign_in" USING btree ("email"); +CREATE INDEX "serverpod_email_failed_sign_in_time_idx" ON "serverpod_email_failed_sign_in" USING btree ("time"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_email_reset" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "verificationCode" text NOT NULL, + "expiration" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_reset_verification_idx" ON "serverpod_email_reset" USING btree ("verificationCode"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_google_refresh_token" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "refreshToken" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_google_refresh_token_userId_idx" ON "serverpod_google_refresh_token" USING btree ("userId"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_user_image" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "version" bigint NOT NULL, + "url" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_user_image_user_id" ON "serverpod_user_image" USING btree ("userId", "version"); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "serverpod_user_info" ( + "id" bigserial PRIMARY KEY, + "userIdentifier" text NOT NULL, + "userName" text, + "fullName" text, + "email" text, + "created" timestamp without time zone NOT NULL, + "imageUrl" text, + "scopeNames" json NOT NULL, + "blocked" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_user_info_user_identifier" ON "serverpod_user_info" USING btree ("userIdentifier"); +CREATE INDEX "serverpod_user_info_email" ON "serverpod_user_info" USING btree ("email"); + -- -- ACTION CREATE FOREIGN KEY -- @@ -241,9 +381,9 @@ ALTER TABLE ONLY "serverpod_query_log" -- MIGRATION VERSION FOR wien_talks -- INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") - VALUES ('wien_talks', '20250816095813247', now()) + VALUES ('wien_talks', '20250816212658542', now()) ON CONFLICT ("module") - DO UPDATE SET "version" = '20250816095813247', "timestamp" = now(); + DO UPDATE SET "version" = '20250816212658542', "timestamp" = now(); -- -- MIGRATION VERSION FOR serverpod @@ -253,5 +393,13 @@ INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") ON CONFLICT ("module") DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816212959541/definition.json b/wien_talks/wien_talks_server/migrations/20250816212959541/definition.json new file mode 100644 index 0000000..2f07479 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816212959541/definition.json @@ -0,0 +1,1855 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "quote", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:Quote" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage", + "dartName": "CloudStorageEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "addedTime", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + }, + { + "name": "byteData", + "columnType": 5, + "isNullable": false, + "dartType": "dart:typed_data:ByteData" + }, + { + "name": "verified", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_path_idx", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_cloud_storage_expiration", + "elements": [ + { + "type": 0, + "definition": "expiration" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage_direct_upload", + "dartName": "CloudStorageDirectUploadEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_direct_upload_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "authKey", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_direct_upload_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_direct_upload_storage_path", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_future_call", + "dartName": "FutureCallEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_future_call_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "serializedObject", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "identifier", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_future_call_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_future_call_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_serverId_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_identifier_idx", + "elements": [ + { + "type": 0, + "definition": "identifier" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_connection_info", + "dartName": "ServerHealthConnectionInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_connection_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "active", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "closing", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "idle", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_connection_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_connection_info_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_metric", + "dartName": "ServerHealthMetric", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_metric_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "isHealthy", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "value", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_metric_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_metric_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "name" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_log", + "dartName": "LogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "reference", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "logLevel", + "columnType": 6, + "isNullable": false, + "dartType": "protocol:LogLevel" + }, + { + "name": "message", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_message_log", + "dartName": "MessageLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_message_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_message_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_message_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_method", + "dartName": "MethodInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_method_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_method_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_method_endpoint_method_idx", + "elements": [ + { + "type": 0, + "definition": "endpoint" + }, + { + "type": 0, + "definition": "method" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_migrations", + "dartName": "DatabaseMigrationVersion", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_migrations_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "module", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "version", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_migrations_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_migrations_ids", + "elements": [ + { + "type": 0, + "definition": "module" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_query_log", + "dartName": "QueryLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_query_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "query", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "numRows", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_query_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_query_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_query_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_readwrite_test", + "dartName": "ReadWriteTestEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_readwrite_test_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "number", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_readwrite_test_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_runtime_settings", + "dartName": "RuntimeSettings", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_runtime_settings_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "logSettings", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:LogSettings" + }, + { + "name": "logSettingsOverrides", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "logServiceCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "logMalformedCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_runtime_settings_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_session_log", + "dartName": "SessionLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_session_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "module", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "method", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": true, + "dartType": "double?" + }, + { + "name": "numQueries", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "authenticatedUserId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "isOpen", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "touched", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_session_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_session_log_serverid_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_touched_idx", + "elements": [ + { + "type": 0, + "definition": "touched" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_isopen_idx", + "elements": [ + { + "type": 0, + "definition": "isOpen" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_auth", + "dartName": "EmailAuth", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_auth_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_auth_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_create_request", + "dartName": "EmailCreateAccountRequest", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_create_request_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_create_request_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_create_account_request_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_failed_sign_in", + "dartName": "EmailFailedSignIn", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_failed_sign_in_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "ipAddress", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_failed_sign_in_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_failed_sign_in_email_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_email_failed_sign_in_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_reset", + "dartName": "EmailReset", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_reset_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_reset_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_reset_verification_idx", + "elements": [ + { + "type": 0, + "definition": "verificationCode" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_google_refresh_token", + "dartName": "GoogleRefreshToken", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_google_refresh_token_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "refreshToken", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_google_refresh_token_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_google_refresh_token_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_image", + "dartName": "UserImage", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_image_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "version", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "url", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_image_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_image_user_id", + "elements": [ + { + "type": 0, + "definition": "userId" + }, + { + "type": 0, + "definition": "version" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_info", + "dartName": "UserInfo", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userIdentifier", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "fullName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "created", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "imageUrl", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "blocked", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_info_user_identifier", + "elements": [ + { + "type": 0, + "definition": "userIdentifier" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_user_info_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "wien_talks", + "version": "20250816212959541" + }, + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816212959541/definition.sql b/wien_talks/wien_talks_server/migrations/20250816212959541/definition.sql new file mode 100644 index 0000000..e8fd79c --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816212959541/definition.sql @@ -0,0 +1,405 @@ +BEGIN; + +-- +-- Class Quote as table quote +-- +CREATE TABLE "quote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "text" text NOT NULL, + "authorName" text, + "lat" double precision NOT NULL, + "long" double precision NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "visibility" bigint NOT NULL, + "upvotes" bigint NOT NULL, + "downvotes" bigint NOT NULL, + "tags" json +); + +-- +-- Class Vote as table vote +-- +CREATE TABLE "vote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "quote" json NOT NULL, + "upvote" boolean NOT NULL +); + +-- +-- Class CloudStorageEntry as table serverpod_cloud_storage +-- +CREATE TABLE "serverpod_cloud_storage" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "addedTime" timestamp without time zone NOT NULL, + "expiration" timestamp without time zone, + "byteData" bytea NOT NULL, + "verified" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_path_idx" ON "serverpod_cloud_storage" USING btree ("storageId", "path"); +CREATE INDEX "serverpod_cloud_storage_expiration" ON "serverpod_cloud_storage" USING btree ("expiration"); + +-- +-- Class CloudStorageDirectUploadEntry as table serverpod_cloud_storage_direct_upload +-- +CREATE TABLE "serverpod_cloud_storage_direct_upload" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "expiration" timestamp without time zone NOT NULL, + "authKey" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_direct_upload_storage_path" ON "serverpod_cloud_storage_direct_upload" USING btree ("storageId", "path"); + +-- +-- Class FutureCallEntry as table serverpod_future_call +-- +CREATE TABLE "serverpod_future_call" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "serializedObject" text, + "serverId" text NOT NULL, + "identifier" text +); + +-- Indexes +CREATE INDEX "serverpod_future_call_time_idx" ON "serverpod_future_call" USING btree ("time"); +CREATE INDEX "serverpod_future_call_serverId_idx" ON "serverpod_future_call" USING btree ("serverId"); +CREATE INDEX "serverpod_future_call_identifier_idx" ON "serverpod_future_call" USING btree ("identifier"); + +-- +-- Class ServerHealthConnectionInfo as table serverpod_health_connection_info +-- +CREATE TABLE "serverpod_health_connection_info" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "active" bigint NOT NULL, + "closing" bigint NOT NULL, + "idle" bigint NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_connection_info_timestamp_idx" ON "serverpod_health_connection_info" USING btree ("timestamp", "serverId", "granularity"); + +-- +-- Class ServerHealthMetric as table serverpod_health_metric +-- +CREATE TABLE "serverpod_health_metric" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "isHealthy" boolean NOT NULL, + "value" double precision NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_metric_timestamp_idx" ON "serverpod_health_metric" USING btree ("timestamp", "serverId", "name", "granularity"); + +-- +-- Class LogEntry as table serverpod_log +-- +CREATE TABLE "serverpod_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "reference" text, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "logLevel" bigint NOT NULL, + "message" text NOT NULL, + "error" text, + "stackTrace" text, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_log_sessionLogId_idx" ON "serverpod_log" USING btree ("sessionLogId"); + +-- +-- Class MessageLogEntry as table serverpod_message_log +-- +CREATE TABLE "serverpod_message_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "serverId" text NOT NULL, + "messageId" bigint NOT NULL, + "endpoint" text NOT NULL, + "messageName" text NOT NULL, + "duration" double precision NOT NULL, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- +-- Class MethodInfo as table serverpod_method +-- +CREATE TABLE "serverpod_method" ( + "id" bigserial PRIMARY KEY, + "endpoint" text NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_method_endpoint_method_idx" ON "serverpod_method" USING btree ("endpoint", "method"); + +-- +-- Class DatabaseMigrationVersion as table serverpod_migrations +-- +CREATE TABLE "serverpod_migrations" ( + "id" bigserial PRIMARY KEY, + "module" text NOT NULL, + "version" text NOT NULL, + "timestamp" timestamp without time zone +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_migrations_ids" ON "serverpod_migrations" USING btree ("module"); + +-- +-- Class QueryLogEntry as table serverpod_query_log +-- +CREATE TABLE "serverpod_query_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "query" text NOT NULL, + "duration" double precision NOT NULL, + "numRows" bigint, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_query_log_sessionLogId_idx" ON "serverpod_query_log" USING btree ("sessionLogId"); + +-- +-- Class ReadWriteTestEntry as table serverpod_readwrite_test +-- +CREATE TABLE "serverpod_readwrite_test" ( + "id" bigserial PRIMARY KEY, + "number" bigint NOT NULL +); + +-- +-- Class RuntimeSettings as table serverpod_runtime_settings +-- +CREATE TABLE "serverpod_runtime_settings" ( + "id" bigserial PRIMARY KEY, + "logSettings" json NOT NULL, + "logSettingsOverrides" json NOT NULL, + "logServiceCalls" boolean NOT NULL, + "logMalformedCalls" boolean NOT NULL +); + +-- +-- Class SessionLogEntry as table serverpod_session_log +-- +CREATE TABLE "serverpod_session_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "module" text, + "endpoint" text, + "method" text, + "duration" double precision, + "numQueries" bigint, + "slow" boolean, + "error" text, + "stackTrace" text, + "authenticatedUserId" bigint, + "isOpen" boolean, + "touched" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USING btree ("serverId"); +CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); +CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); + +-- +-- Class AuthKey as table serverpod_auth_key +-- +CREATE TABLE "serverpod_auth_key" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- Class EmailAuth as table serverpod_email_auth +-- +CREATE TABLE "serverpod_email_auth" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_email" ON "serverpod_email_auth" USING btree ("email"); + +-- +-- Class EmailCreateAccountRequest as table serverpod_email_create_request +-- +CREATE TABLE "serverpod_email_create_request" ( + "id" bigserial PRIMARY KEY, + "userName" text NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL, + "verificationCode" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_create_account_request_idx" ON "serverpod_email_create_request" USING btree ("email"); + +-- +-- Class EmailFailedSignIn as table serverpod_email_failed_sign_in +-- +CREATE TABLE "serverpod_email_failed_sign_in" ( + "id" bigserial PRIMARY KEY, + "email" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "ipAddress" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_email_failed_sign_in_email_idx" ON "serverpod_email_failed_sign_in" USING btree ("email"); +CREATE INDEX "serverpod_email_failed_sign_in_time_idx" ON "serverpod_email_failed_sign_in" USING btree ("time"); + +-- +-- Class EmailReset as table serverpod_email_reset +-- +CREATE TABLE "serverpod_email_reset" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "verificationCode" text NOT NULL, + "expiration" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_reset_verification_idx" ON "serverpod_email_reset" USING btree ("verificationCode"); + +-- +-- Class GoogleRefreshToken as table serverpod_google_refresh_token +-- +CREATE TABLE "serverpod_google_refresh_token" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "refreshToken" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_google_refresh_token_userId_idx" ON "serverpod_google_refresh_token" USING btree ("userId"); + +-- +-- Class UserImage as table serverpod_user_image +-- +CREATE TABLE "serverpod_user_image" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "version" bigint NOT NULL, + "url" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_user_image_user_id" ON "serverpod_user_image" USING btree ("userId", "version"); + +-- +-- Class UserInfo as table serverpod_user_info +-- +CREATE TABLE "serverpod_user_info" ( + "id" bigserial PRIMARY KEY, + "userIdentifier" text NOT NULL, + "userName" text, + "fullName" text, + "email" text, + "created" timestamp without time zone NOT NULL, + "imageUrl" text, + "scopeNames" json NOT NULL, + "blocked" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_user_info_user_identifier" ON "serverpod_user_info" USING btree ("userIdentifier"); +CREATE INDEX "serverpod_user_info_email" ON "serverpod_user_info" USING btree ("email"); + +-- +-- Foreign relations for "serverpod_log" table +-- +ALTER TABLE ONLY "serverpod_log" + ADD CONSTRAINT "serverpod_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_message_log" table +-- +ALTER TABLE ONLY "serverpod_message_log" + ADD CONSTRAINT "serverpod_message_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_query_log" table +-- +ALTER TABLE ONLY "serverpod_query_log" + ADD CONSTRAINT "serverpod_query_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816212959541', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816212959541', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816212959541/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816212959541/definition_project.json new file mode 100644 index 0000000..a405534 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816212959541/definition_project.json @@ -0,0 +1,162 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "quote", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:Quote" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816171653001/migration.json b/wien_talks/wien_talks_server/migrations/20250816212959541/migration.json similarity index 100% rename from wien_talks/wien_talks_server/migrations/20250816171653001/migration.json rename to wien_talks/wien_talks_server/migrations/20250816212959541/migration.json diff --git a/wien_talks/wien_talks_server/migrations/20250816171653001/migration.sql b/wien_talks/wien_talks_server/migrations/20250816212959541/migration.sql similarity index 85% rename from wien_talks/wien_talks_server/migrations/20250816171653001/migration.sql rename to wien_talks/wien_talks_server/migrations/20250816212959541/migration.sql index c1ccc46..17506d8 100644 --- a/wien_talks/wien_talks_server/migrations/20250816171653001/migration.sql +++ b/wien_talks/wien_talks_server/migrations/20250816212959541/migration.sql @@ -5,9 +5,9 @@ BEGIN; -- MIGRATION VERSION FOR wien_talks -- INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") - VALUES ('wien_talks', '20250816171653001', now()) + VALUES ('wien_talks', '20250816212959541', now()) ON CONFLICT ("module") - DO UPDATE SET "version" = '20250816171653001', "timestamp" = now(); + DO UPDATE SET "version" = '20250816212959541', "timestamp" = now(); -- -- MIGRATION VERSION FOR serverpod diff --git a/wien_talks/wien_talks_server/migrations/20250816122625449/definition.json b/wien_talks/wien_talks_server/migrations/20250816214717668/definition.json similarity index 97% rename from wien_talks/wien_talks_server/migrations/20250816122625449/definition.json rename to wien_talks/wien_talks_server/migrations/20250816214717668/definition.json index 025915f..d798718 100644 --- a/wien_talks/wien_talks_server/migrations/20250816122625449/definition.json +++ b/wien_talks/wien_talks_server/migrations/20250816214717668/definition.json @@ -92,6 +92,55 @@ ], "managed": true }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, { "name": "serverpod_cloud_storage", "dartName": "CloudStorageEntry", @@ -1785,7 +1834,7 @@ "installedModules": [ { "module": "wien_talks", - "version": "20250816122625449" + "version": "20250816214717668" }, { "module": "serverpod", diff --git a/wien_talks/wien_talks_server/migrations/20250816171653001/definition.sql b/wien_talks/wien_talks_server/migrations/20250816214717668/definition.sql similarity index 97% rename from wien_talks/wien_talks_server/migrations/20250816171653001/definition.sql rename to wien_talks/wien_talks_server/migrations/20250816214717668/definition.sql index c3b22fd..5b0a366 100644 --- a/wien_talks/wien_talks_server/migrations/20250816171653001/definition.sql +++ b/wien_talks/wien_talks_server/migrations/20250816214717668/definition.sql @@ -17,6 +17,16 @@ CREATE TABLE "quote" ( "tags" json ); +-- +-- Class Vote as table vote +-- +CREATE TABLE "vote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "upvote" boolean NOT NULL +); + -- -- Class CloudStorageEntry as table serverpod_cloud_storage -- @@ -370,9 +380,9 @@ ALTER TABLE ONLY "serverpod_query_log" -- MIGRATION VERSION FOR wien_talks -- INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") - VALUES ('wien_talks', '20250816171653001', now()) + VALUES ('wien_talks', '20250816214717668', now()) ON CONFLICT ("module") - DO UPDATE SET "version" = '20250816171653001', "timestamp" = now(); + DO UPDATE SET "version" = '20250816214717668', "timestamp" = now(); -- -- MIGRATION VERSION FOR serverpod diff --git a/wien_talks/wien_talks_server/migrations/20250816122625449/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816214717668/definition_project.json similarity index 68% rename from wien_talks/wien_talks_server/migrations/20250816122625449/definition_project.json rename to wien_talks/wien_talks_server/migrations/20250816214717668/definition_project.json index d649d10..29120e1 100644 --- a/wien_talks/wien_talks_server/migrations/20250816122625449/definition_project.json +++ b/wien_talks/wien_talks_server/migrations/20250816214717668/definition_project.json @@ -91,6 +91,55 @@ } ], "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true } ], "installedModules": [ diff --git a/wien_talks/wien_talks_server/migrations/20250816214717668/migration.json b/wien_talks/wien_talks_server/migrations/20250816214717668/migration.json new file mode 100644 index 0000000..c267325 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816214717668/migration.json @@ -0,0 +1,43 @@ +{ + "actions": [ + { + "type": "alterTable", + "alterTable": { + "name": "vote", + "schema": "public", + "addColumns": [], + "deleteColumns": [ + "quote" + ], + "modifyColumns": [], + "addIndexes": [], + "deleteIndexes": [], + "addForeignKeys": [], + "deleteForeignKeys": [], + "warnings": [ + { + "type": "columnDropped", + "message": "Column \"quote\" of table \"vote\" will be dropped.", + "table": "vote", + "columns": [ + "quote" + ], + "destrucive": true + } + ] + } + } + ], + "warnings": [ + { + "type": "columnDropped", + "message": "Column \"quote\" of table \"vote\" will be dropped.", + "table": "vote", + "columns": [ + "quote" + ], + "destrucive": true + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816214717668/migration.sql b/wien_talks/wien_talks_server/migrations/20250816214717668/migration.sql new file mode 100644 index 0000000..e6a6930 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816214717668/migration.sql @@ -0,0 +1,33 @@ +BEGIN; + +-- +-- ACTION ALTER TABLE +-- +ALTER TABLE "vote" DROP COLUMN "quote"; + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816214717668', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816214717668', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816171653001/definition.json b/wien_talks/wien_talks_server/migrations/20250816215043551/definition.json similarity index 97% rename from wien_talks/wien_talks_server/migrations/20250816171653001/definition.json rename to wien_talks/wien_talks_server/migrations/20250816215043551/definition.json index 9efa77a..ef49ab3 100644 --- a/wien_talks/wien_talks_server/migrations/20250816171653001/definition.json +++ b/wien_talks/wien_talks_server/migrations/20250816215043551/definition.json @@ -92,6 +92,55 @@ ], "managed": true }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, { "name": "serverpod_cloud_storage", "dartName": "CloudStorageEntry", @@ -1785,7 +1834,7 @@ "installedModules": [ { "module": "wien_talks", - "version": "20250816171653001" + "version": "20250816215043551" }, { "module": "serverpod", diff --git a/wien_talks/wien_talks_server/migrations/20250816122625449/definition.sql b/wien_talks/wien_talks_server/migrations/20250816215043551/definition.sql similarity index 97% rename from wien_talks/wien_talks_server/migrations/20250816122625449/definition.sql rename to wien_talks/wien_talks_server/migrations/20250816215043551/definition.sql index 93fb32c..2f0363a 100644 --- a/wien_talks/wien_talks_server/migrations/20250816122625449/definition.sql +++ b/wien_talks/wien_talks_server/migrations/20250816215043551/definition.sql @@ -17,6 +17,16 @@ CREATE TABLE "quote" ( "tags" json ); +-- +-- Class Vote as table vote +-- +CREATE TABLE "vote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "upvote" boolean NOT NULL +); + -- -- Class CloudStorageEntry as table serverpod_cloud_storage -- @@ -370,9 +380,9 @@ ALTER TABLE ONLY "serverpod_query_log" -- MIGRATION VERSION FOR wien_talks -- INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") - VALUES ('wien_talks', '20250816122625449', now()) + VALUES ('wien_talks', '20250816215043551', now()) ON CONFLICT ("module") - DO UPDATE SET "version" = '20250816122625449', "timestamp" = now(); + DO UPDATE SET "version" = '20250816215043551', "timestamp" = now(); -- -- MIGRATION VERSION FOR serverpod diff --git a/wien_talks/wien_talks_server/migrations/20250816171653001/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816215043551/definition_project.json similarity index 68% rename from wien_talks/wien_talks_server/migrations/20250816171653001/definition_project.json rename to wien_talks/wien_talks_server/migrations/20250816215043551/definition_project.json index d649d10..29120e1 100644 --- a/wien_talks/wien_talks_server/migrations/20250816171653001/definition_project.json +++ b/wien_talks/wien_talks_server/migrations/20250816215043551/definition_project.json @@ -91,6 +91,55 @@ } ], "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true } ], "installedModules": [ diff --git a/wien_talks/wien_talks_server/migrations/20250816215043551/migration.json b/wien_talks/wien_talks_server/migrations/20250816215043551/migration.json new file mode 100644 index 0000000..056118b --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816215043551/migration.json @@ -0,0 +1,5 @@ +{ + "actions": [], + "warnings": [], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816215043551/migration.sql b/wien_talks/wien_talks_server/migrations/20250816215043551/migration.sql new file mode 100644 index 0000000..654d41e --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816215043551/migration.sql @@ -0,0 +1,29 @@ +BEGIN; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816215043551', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816215043551', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816095813247/definition.json b/wien_talks/wien_talks_server/migrations/20250816215049795/definition.json similarity index 62% rename from wien_talks/wien_talks_server/migrations/20250816095813247/definition.json rename to wien_talks/wien_talks_server/migrations/20250816215049795/definition.json index 47337a1..7aba8ce 100644 --- a/wien_talks/wien_talks_server/migrations/20250816095813247/definition.json +++ b/wien_talks/wien_talks_server/migrations/20250816215049795/definition.json @@ -1,6 +1,146 @@ { "moduleName": "wien_talks", "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, { "name": "serverpod_cloud_storage", "dartName": "CloudStorageEntry", @@ -1137,16 +1277,572 @@ } ], "managed": true + }, + { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_auth", + "dartName": "EmailAuth", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_auth_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_auth_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_create_request", + "dartName": "EmailCreateAccountRequest", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_create_request_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_create_request_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_create_account_request_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_failed_sign_in", + "dartName": "EmailFailedSignIn", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_failed_sign_in_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "ipAddress", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_failed_sign_in_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_failed_sign_in_email_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_email_failed_sign_in_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_reset", + "dartName": "EmailReset", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_reset_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_reset_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_reset_verification_idx", + "elements": [ + { + "type": 0, + "definition": "verificationCode" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_google_refresh_token", + "dartName": "GoogleRefreshToken", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_google_refresh_token_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "refreshToken", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_google_refresh_token_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_google_refresh_token_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_image", + "dartName": "UserImage", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_image_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "version", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "url", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_image_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_image_user_id", + "elements": [ + { + "type": 0, + "definition": "userId" + }, + { + "type": 0, + "definition": "version" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_info", + "dartName": "UserInfo", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userIdentifier", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "fullName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "created", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "imageUrl", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "blocked", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_info_user_identifier", + "elements": [ + { + "type": 0, + "definition": "userIdentifier" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_user_info_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true } ], "installedModules": [ { "module": "wien_talks", - "version": "20250816095813247" + "version": "20250816215049795" }, { "module": "serverpod", "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" } ], "migrationApiVersion": 1 diff --git a/wien_talks/wien_talks_server/migrations/20250816095813247/definition.sql b/wien_talks/wien_talks_server/migrations/20250816215049795/definition.sql similarity index 63% rename from wien_talks/wien_talks_server/migrations/20250816095813247/definition.sql rename to wien_talks/wien_talks_server/migrations/20250816215049795/definition.sql index a5506ab..fea42e4 100644 --- a/wien_talks/wien_talks_server/migrations/20250816095813247/definition.sql +++ b/wien_talks/wien_talks_server/migrations/20250816215049795/definition.sql @@ -1,5 +1,32 @@ BEGIN; +-- +-- Class Quote as table quote +-- +CREATE TABLE "quote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "text" text NOT NULL, + "authorName" text, + "lat" double precision NOT NULL, + "long" double precision NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "visibility" bigint NOT NULL, + "upvotes" bigint NOT NULL, + "downvotes" bigint NOT NULL, + "tags" json +); + +-- +-- Class Vote as table vote +-- +CREATE TABLE "vote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "upvote" boolean NOT NULL +); + -- -- Class CloudStorageEntry as table serverpod_cloud_storage -- @@ -206,6 +233,118 @@ CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USI CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); +-- +-- Class AuthKey as table serverpod_auth_key +-- +CREATE TABLE "serverpod_auth_key" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- Class EmailAuth as table serverpod_email_auth +-- +CREATE TABLE "serverpod_email_auth" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_email" ON "serverpod_email_auth" USING btree ("email"); + +-- +-- Class EmailCreateAccountRequest as table serverpod_email_create_request +-- +CREATE TABLE "serverpod_email_create_request" ( + "id" bigserial PRIMARY KEY, + "userName" text NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL, + "verificationCode" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_create_account_request_idx" ON "serverpod_email_create_request" USING btree ("email"); + +-- +-- Class EmailFailedSignIn as table serverpod_email_failed_sign_in +-- +CREATE TABLE "serverpod_email_failed_sign_in" ( + "id" bigserial PRIMARY KEY, + "email" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "ipAddress" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_email_failed_sign_in_email_idx" ON "serverpod_email_failed_sign_in" USING btree ("email"); +CREATE INDEX "serverpod_email_failed_sign_in_time_idx" ON "serverpod_email_failed_sign_in" USING btree ("time"); + +-- +-- Class EmailReset as table serverpod_email_reset +-- +CREATE TABLE "serverpod_email_reset" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "verificationCode" text NOT NULL, + "expiration" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_reset_verification_idx" ON "serverpod_email_reset" USING btree ("verificationCode"); + +-- +-- Class GoogleRefreshToken as table serverpod_google_refresh_token +-- +CREATE TABLE "serverpod_google_refresh_token" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "refreshToken" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_google_refresh_token_userId_idx" ON "serverpod_google_refresh_token" USING btree ("userId"); + +-- +-- Class UserImage as table serverpod_user_image +-- +CREATE TABLE "serverpod_user_image" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "version" bigint NOT NULL, + "url" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_user_image_user_id" ON "serverpod_user_image" USING btree ("userId", "version"); + +-- +-- Class UserInfo as table serverpod_user_info +-- +CREATE TABLE "serverpod_user_info" ( + "id" bigserial PRIMARY KEY, + "userIdentifier" text NOT NULL, + "userName" text, + "fullName" text, + "email" text, + "created" timestamp without time zone NOT NULL, + "imageUrl" text, + "scopeNames" json NOT NULL, + "blocked" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_user_info_user_identifier" ON "serverpod_user_info" USING btree ("userIdentifier"); +CREATE INDEX "serverpod_user_info_email" ON "serverpod_user_info" USING btree ("email"); + -- -- Foreign relations for "serverpod_log" table -- @@ -241,9 +380,9 @@ ALTER TABLE ONLY "serverpod_query_log" -- MIGRATION VERSION FOR wien_talks -- INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") - VALUES ('wien_talks', '20250816095813247', now()) + VALUES ('wien_talks', '20250816215049795', now()) ON CONFLICT ("module") - DO UPDATE SET "version" = '20250816095813247', "timestamp" = now(); + DO UPDATE SET "version" = '20250816215049795', "timestamp" = now(); -- -- MIGRATION VERSION FOR serverpod @@ -253,5 +392,13 @@ INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") ON CONFLICT ("module") DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816215049795/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816215049795/definition_project.json new file mode 100644 index 0000000..29120e1 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816215049795/definition_project.json @@ -0,0 +1,156 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816215049795/migration.json b/wien_talks/wien_talks_server/migrations/20250816215049795/migration.json new file mode 100644 index 0000000..056118b --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816215049795/migration.json @@ -0,0 +1,5 @@ +{ + "actions": [], + "warnings": [], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816215049795/migration.sql b/wien_talks/wien_talks_server/migrations/20250816215049795/migration.sql new file mode 100644 index 0000000..327442d --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816215049795/migration.sql @@ -0,0 +1,29 @@ +BEGIN; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816215049795', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816215049795', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816215102447/definition.json b/wien_talks/wien_talks_server/migrations/20250816215102447/definition.json new file mode 100644 index 0000000..6bc981d --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816215102447/definition.json @@ -0,0 +1,1849 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage", + "dartName": "CloudStorageEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "addedTime", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + }, + { + "name": "byteData", + "columnType": 5, + "isNullable": false, + "dartType": "dart:typed_data:ByteData" + }, + { + "name": "verified", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_path_idx", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_cloud_storage_expiration", + "elements": [ + { + "type": 0, + "definition": "expiration" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage_direct_upload", + "dartName": "CloudStorageDirectUploadEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_direct_upload_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "authKey", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_direct_upload_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_direct_upload_storage_path", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_future_call", + "dartName": "FutureCallEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_future_call_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "serializedObject", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "identifier", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_future_call_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_future_call_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_serverId_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_identifier_idx", + "elements": [ + { + "type": 0, + "definition": "identifier" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_connection_info", + "dartName": "ServerHealthConnectionInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_connection_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "active", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "closing", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "idle", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_connection_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_connection_info_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_metric", + "dartName": "ServerHealthMetric", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_metric_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "isHealthy", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "value", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_metric_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_metric_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "name" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_log", + "dartName": "LogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "reference", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "logLevel", + "columnType": 6, + "isNullable": false, + "dartType": "protocol:LogLevel" + }, + { + "name": "message", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_message_log", + "dartName": "MessageLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_message_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_message_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_message_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_method", + "dartName": "MethodInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_method_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_method_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_method_endpoint_method_idx", + "elements": [ + { + "type": 0, + "definition": "endpoint" + }, + { + "type": 0, + "definition": "method" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_migrations", + "dartName": "DatabaseMigrationVersion", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_migrations_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "module", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "version", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_migrations_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_migrations_ids", + "elements": [ + { + "type": 0, + "definition": "module" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_query_log", + "dartName": "QueryLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_query_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "query", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "numRows", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_query_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_query_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_query_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_readwrite_test", + "dartName": "ReadWriteTestEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_readwrite_test_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "number", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_readwrite_test_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_runtime_settings", + "dartName": "RuntimeSettings", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_runtime_settings_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "logSettings", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:LogSettings" + }, + { + "name": "logSettingsOverrides", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "logServiceCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "logMalformedCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_runtime_settings_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_session_log", + "dartName": "SessionLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_session_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "module", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "method", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": true, + "dartType": "double?" + }, + { + "name": "numQueries", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "authenticatedUserId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "isOpen", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "touched", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_session_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_session_log_serverid_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_touched_idx", + "elements": [ + { + "type": 0, + "definition": "touched" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_isopen_idx", + "elements": [ + { + "type": 0, + "definition": "isOpen" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_auth", + "dartName": "EmailAuth", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_auth_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_auth_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_create_request", + "dartName": "EmailCreateAccountRequest", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_create_request_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_create_request_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_create_account_request_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_failed_sign_in", + "dartName": "EmailFailedSignIn", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_failed_sign_in_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "ipAddress", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_failed_sign_in_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_failed_sign_in_email_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_email_failed_sign_in_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_reset", + "dartName": "EmailReset", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_reset_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_reset_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_reset_verification_idx", + "elements": [ + { + "type": 0, + "definition": "verificationCode" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_google_refresh_token", + "dartName": "GoogleRefreshToken", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_google_refresh_token_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "refreshToken", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_google_refresh_token_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_google_refresh_token_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_image", + "dartName": "UserImage", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_image_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "version", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "url", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_image_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_image_user_id", + "elements": [ + { + "type": 0, + "definition": "userId" + }, + { + "type": 0, + "definition": "version" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_info", + "dartName": "UserInfo", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userIdentifier", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "fullName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "created", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "imageUrl", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "blocked", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_info_user_identifier", + "elements": [ + { + "type": 0, + "definition": "userIdentifier" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_user_info_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "wien_talks", + "version": "20250816215102447" + }, + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816215102447/definition.sql b/wien_talks/wien_talks_server/migrations/20250816215102447/definition.sql new file mode 100644 index 0000000..386eb66 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816215102447/definition.sql @@ -0,0 +1,404 @@ +BEGIN; + +-- +-- Class Quote as table quote +-- +CREATE TABLE "quote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "text" text NOT NULL, + "authorName" text, + "lat" double precision NOT NULL, + "long" double precision NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "visibility" bigint NOT NULL, + "upvotes" bigint NOT NULL, + "downvotes" bigint NOT NULL, + "tags" json +); + +-- +-- Class Vote as table vote +-- +CREATE TABLE "vote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "upvote" boolean NOT NULL +); + +-- +-- Class CloudStorageEntry as table serverpod_cloud_storage +-- +CREATE TABLE "serverpod_cloud_storage" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "addedTime" timestamp without time zone NOT NULL, + "expiration" timestamp without time zone, + "byteData" bytea NOT NULL, + "verified" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_path_idx" ON "serverpod_cloud_storage" USING btree ("storageId", "path"); +CREATE INDEX "serverpod_cloud_storage_expiration" ON "serverpod_cloud_storage" USING btree ("expiration"); + +-- +-- Class CloudStorageDirectUploadEntry as table serverpod_cloud_storage_direct_upload +-- +CREATE TABLE "serverpod_cloud_storage_direct_upload" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "expiration" timestamp without time zone NOT NULL, + "authKey" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_direct_upload_storage_path" ON "serverpod_cloud_storage_direct_upload" USING btree ("storageId", "path"); + +-- +-- Class FutureCallEntry as table serverpod_future_call +-- +CREATE TABLE "serverpod_future_call" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "serializedObject" text, + "serverId" text NOT NULL, + "identifier" text +); + +-- Indexes +CREATE INDEX "serverpod_future_call_time_idx" ON "serverpod_future_call" USING btree ("time"); +CREATE INDEX "serverpod_future_call_serverId_idx" ON "serverpod_future_call" USING btree ("serverId"); +CREATE INDEX "serverpod_future_call_identifier_idx" ON "serverpod_future_call" USING btree ("identifier"); + +-- +-- Class ServerHealthConnectionInfo as table serverpod_health_connection_info +-- +CREATE TABLE "serverpod_health_connection_info" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "active" bigint NOT NULL, + "closing" bigint NOT NULL, + "idle" bigint NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_connection_info_timestamp_idx" ON "serverpod_health_connection_info" USING btree ("timestamp", "serverId", "granularity"); + +-- +-- Class ServerHealthMetric as table serverpod_health_metric +-- +CREATE TABLE "serverpod_health_metric" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "isHealthy" boolean NOT NULL, + "value" double precision NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_metric_timestamp_idx" ON "serverpod_health_metric" USING btree ("timestamp", "serverId", "name", "granularity"); + +-- +-- Class LogEntry as table serverpod_log +-- +CREATE TABLE "serverpod_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "reference" text, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "logLevel" bigint NOT NULL, + "message" text NOT NULL, + "error" text, + "stackTrace" text, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_log_sessionLogId_idx" ON "serverpod_log" USING btree ("sessionLogId"); + +-- +-- Class MessageLogEntry as table serverpod_message_log +-- +CREATE TABLE "serverpod_message_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "serverId" text NOT NULL, + "messageId" bigint NOT NULL, + "endpoint" text NOT NULL, + "messageName" text NOT NULL, + "duration" double precision NOT NULL, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- +-- Class MethodInfo as table serverpod_method +-- +CREATE TABLE "serverpod_method" ( + "id" bigserial PRIMARY KEY, + "endpoint" text NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_method_endpoint_method_idx" ON "serverpod_method" USING btree ("endpoint", "method"); + +-- +-- Class DatabaseMigrationVersion as table serverpod_migrations +-- +CREATE TABLE "serverpod_migrations" ( + "id" bigserial PRIMARY KEY, + "module" text NOT NULL, + "version" text NOT NULL, + "timestamp" timestamp without time zone +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_migrations_ids" ON "serverpod_migrations" USING btree ("module"); + +-- +-- Class QueryLogEntry as table serverpod_query_log +-- +CREATE TABLE "serverpod_query_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "query" text NOT NULL, + "duration" double precision NOT NULL, + "numRows" bigint, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_query_log_sessionLogId_idx" ON "serverpod_query_log" USING btree ("sessionLogId"); + +-- +-- Class ReadWriteTestEntry as table serverpod_readwrite_test +-- +CREATE TABLE "serverpod_readwrite_test" ( + "id" bigserial PRIMARY KEY, + "number" bigint NOT NULL +); + +-- +-- Class RuntimeSettings as table serverpod_runtime_settings +-- +CREATE TABLE "serverpod_runtime_settings" ( + "id" bigserial PRIMARY KEY, + "logSettings" json NOT NULL, + "logSettingsOverrides" json NOT NULL, + "logServiceCalls" boolean NOT NULL, + "logMalformedCalls" boolean NOT NULL +); + +-- +-- Class SessionLogEntry as table serverpod_session_log +-- +CREATE TABLE "serverpod_session_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "module" text, + "endpoint" text, + "method" text, + "duration" double precision, + "numQueries" bigint, + "slow" boolean, + "error" text, + "stackTrace" text, + "authenticatedUserId" bigint, + "isOpen" boolean, + "touched" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USING btree ("serverId"); +CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); +CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); + +-- +-- Class AuthKey as table serverpod_auth_key +-- +CREATE TABLE "serverpod_auth_key" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- Class EmailAuth as table serverpod_email_auth +-- +CREATE TABLE "serverpod_email_auth" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_email" ON "serverpod_email_auth" USING btree ("email"); + +-- +-- Class EmailCreateAccountRequest as table serverpod_email_create_request +-- +CREATE TABLE "serverpod_email_create_request" ( + "id" bigserial PRIMARY KEY, + "userName" text NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL, + "verificationCode" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_create_account_request_idx" ON "serverpod_email_create_request" USING btree ("email"); + +-- +-- Class EmailFailedSignIn as table serverpod_email_failed_sign_in +-- +CREATE TABLE "serverpod_email_failed_sign_in" ( + "id" bigserial PRIMARY KEY, + "email" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "ipAddress" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_email_failed_sign_in_email_idx" ON "serverpod_email_failed_sign_in" USING btree ("email"); +CREATE INDEX "serverpod_email_failed_sign_in_time_idx" ON "serverpod_email_failed_sign_in" USING btree ("time"); + +-- +-- Class EmailReset as table serverpod_email_reset +-- +CREATE TABLE "serverpod_email_reset" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "verificationCode" text NOT NULL, + "expiration" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_reset_verification_idx" ON "serverpod_email_reset" USING btree ("verificationCode"); + +-- +-- Class GoogleRefreshToken as table serverpod_google_refresh_token +-- +CREATE TABLE "serverpod_google_refresh_token" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "refreshToken" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_google_refresh_token_userId_idx" ON "serverpod_google_refresh_token" USING btree ("userId"); + +-- +-- Class UserImage as table serverpod_user_image +-- +CREATE TABLE "serverpod_user_image" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "version" bigint NOT NULL, + "url" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_user_image_user_id" ON "serverpod_user_image" USING btree ("userId", "version"); + +-- +-- Class UserInfo as table serverpod_user_info +-- +CREATE TABLE "serverpod_user_info" ( + "id" bigserial PRIMARY KEY, + "userIdentifier" text NOT NULL, + "userName" text, + "fullName" text, + "email" text, + "created" timestamp without time zone NOT NULL, + "imageUrl" text, + "scopeNames" json NOT NULL, + "blocked" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_user_info_user_identifier" ON "serverpod_user_info" USING btree ("userIdentifier"); +CREATE INDEX "serverpod_user_info_email" ON "serverpod_user_info" USING btree ("email"); + +-- +-- Foreign relations for "serverpod_log" table +-- +ALTER TABLE ONLY "serverpod_log" + ADD CONSTRAINT "serverpod_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_message_log" table +-- +ALTER TABLE ONLY "serverpod_message_log" + ADD CONSTRAINT "serverpod_message_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_query_log" table +-- +ALTER TABLE ONLY "serverpod_query_log" + ADD CONSTRAINT "serverpod_query_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816215102447', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816215102447', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816215102447/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816215102447/definition_project.json new file mode 100644 index 0000000..29120e1 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816215102447/definition_project.json @@ -0,0 +1,156 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816215102447/migration.json b/wien_talks/wien_talks_server/migrations/20250816215102447/migration.json new file mode 100644 index 0000000..056118b --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816215102447/migration.json @@ -0,0 +1,5 @@ +{ + "actions": [], + "warnings": [], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816215102447/migration.sql b/wien_talks/wien_talks_server/migrations/20250816215102447/migration.sql new file mode 100644 index 0000000..87e7234 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816215102447/migration.sql @@ -0,0 +1,29 @@ +BEGIN; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816215102447', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816215102447', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816220051483/definition.json b/wien_talks/wien_talks_server/migrations/20250816220051483/definition.json new file mode 100644 index 0000000..15189fb --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816220051483/definition.json @@ -0,0 +1,1898 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "health", + "dartName": "Health", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('health_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "note", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "health_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "quoteId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage", + "dartName": "CloudStorageEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "addedTime", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + }, + { + "name": "byteData", + "columnType": 5, + "isNullable": false, + "dartType": "dart:typed_data:ByteData" + }, + { + "name": "verified", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_path_idx", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_cloud_storage_expiration", + "elements": [ + { + "type": 0, + "definition": "expiration" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage_direct_upload", + "dartName": "CloudStorageDirectUploadEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_direct_upload_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "authKey", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_direct_upload_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_direct_upload_storage_path", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_future_call", + "dartName": "FutureCallEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_future_call_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "serializedObject", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "identifier", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_future_call_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_future_call_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_serverId_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_identifier_idx", + "elements": [ + { + "type": 0, + "definition": "identifier" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_connection_info", + "dartName": "ServerHealthConnectionInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_connection_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "active", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "closing", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "idle", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_connection_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_connection_info_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_metric", + "dartName": "ServerHealthMetric", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_metric_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "isHealthy", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "value", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "granularity", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_metric_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_metric_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "name" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_log", + "dartName": "LogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "reference", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "logLevel", + "columnType": 6, + "isNullable": false, + "dartType": "protocol:LogLevel" + }, + { + "name": "message", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_message_log", + "dartName": "MessageLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_message_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_message_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_message_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_method", + "dartName": "MethodInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_method_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_method_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_method_endpoint_method_idx", + "elements": [ + { + "type": 0, + "definition": "endpoint" + }, + { + "type": 0, + "definition": "method" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_migrations", + "dartName": "DatabaseMigrationVersion", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_migrations_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "module", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "version", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_migrations_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_migrations_ids", + "elements": [ + { + "type": 0, + "definition": "module" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_query_log", + "dartName": "QueryLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_query_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "sessionLogId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "query", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "numRows", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_query_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_query_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_query_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_readwrite_test", + "dartName": "ReadWriteTestEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_readwrite_test_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "number", + "columnType": 6, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_readwrite_test_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_runtime_settings", + "dartName": "RuntimeSettings", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_runtime_settings_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "logSettings", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:LogSettings" + }, + { + "name": "logSettingsOverrides", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "logServiceCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "logMalformedCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_runtime_settings_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_session_log", + "dartName": "SessionLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_session_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "module", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "method", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": true, + "dartType": "double?" + }, + { + "name": "numQueries", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "authenticatedUserId", + "columnType": 6, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "isOpen", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "touched", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_session_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_session_log_serverid_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_touched_idx", + "elements": [ + { + "type": 0, + "definition": "touched" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_isopen_idx", + "elements": [ + { + "type": 0, + "definition": "isOpen" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_auth", + "dartName": "EmailAuth", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_auth_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_auth_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_create_request", + "dartName": "EmailCreateAccountRequest", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_create_request_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_create_request_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_auth_create_account_request_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_failed_sign_in", + "dartName": "EmailFailedSignIn", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_failed_sign_in_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "ipAddress", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_failed_sign_in_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_failed_sign_in_email_idx", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_email_failed_sign_in_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_email_reset", + "dartName": "EmailReset", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_email_reset_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "verificationCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_email_reset_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_email_reset_verification_idx", + "elements": [ + { + "type": 0, + "definition": "verificationCode" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_google_refresh_token", + "dartName": "GoogleRefreshToken", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_google_refresh_token_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "refreshToken", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_google_refresh_token_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_google_refresh_token_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_image", + "dartName": "UserImage", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_image_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "version", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "url", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_image_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_image_user_id", + "elements": [ + { + "type": 0, + "definition": "userId" + }, + { + "type": 0, + "definition": "version" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_user_info", + "dartName": "UserInfo", + "module": "serverpod_auth", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('serverpod_user_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userIdentifier", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "userName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "fullName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "email", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "created", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "imageUrl", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "blocked", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_user_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_user_info_user_identifier", + "elements": [ + { + "type": 0, + "definition": "userIdentifier" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_user_info_email", + "elements": [ + { + "type": 0, + "definition": "email" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "wien_talks", + "version": "20250816220051483" + }, + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816220051483/definition.sql b/wien_talks/wien_talks_server/migrations/20250816220051483/definition.sql new file mode 100644 index 0000000..a916057 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816220051483/definition.sql @@ -0,0 +1,414 @@ +BEGIN; + +-- +-- Class Health as table health +-- +CREATE TABLE "health" ( + "id" bigserial PRIMARY KEY, + "createdAt" timestamp without time zone NOT NULL, + "note" text +); + +-- +-- Class Quote as table quote +-- +CREATE TABLE "quote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "text" text NOT NULL, + "authorName" text, + "lat" double precision NOT NULL, + "long" double precision NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "visibility" bigint NOT NULL, + "upvotes" bigint NOT NULL, + "downvotes" bigint NOT NULL, + "tags" json +); + +-- +-- Class Vote as table vote +-- +CREATE TABLE "vote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "quoteId" bigint NOT NULL, + "upvote" boolean NOT NULL +); + +-- +-- Class CloudStorageEntry as table serverpod_cloud_storage +-- +CREATE TABLE "serverpod_cloud_storage" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "addedTime" timestamp without time zone NOT NULL, + "expiration" timestamp without time zone, + "byteData" bytea NOT NULL, + "verified" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_path_idx" ON "serverpod_cloud_storage" USING btree ("storageId", "path"); +CREATE INDEX "serverpod_cloud_storage_expiration" ON "serverpod_cloud_storage" USING btree ("expiration"); + +-- +-- Class CloudStorageDirectUploadEntry as table serverpod_cloud_storage_direct_upload +-- +CREATE TABLE "serverpod_cloud_storage_direct_upload" ( + "id" bigserial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "expiration" timestamp without time zone NOT NULL, + "authKey" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_direct_upload_storage_path" ON "serverpod_cloud_storage_direct_upload" USING btree ("storageId", "path"); + +-- +-- Class FutureCallEntry as table serverpod_future_call +-- +CREATE TABLE "serverpod_future_call" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "serializedObject" text, + "serverId" text NOT NULL, + "identifier" text +); + +-- Indexes +CREATE INDEX "serverpod_future_call_time_idx" ON "serverpod_future_call" USING btree ("time"); +CREATE INDEX "serverpod_future_call_serverId_idx" ON "serverpod_future_call" USING btree ("serverId"); +CREATE INDEX "serverpod_future_call_identifier_idx" ON "serverpod_future_call" USING btree ("identifier"); + +-- +-- Class ServerHealthConnectionInfo as table serverpod_health_connection_info +-- +CREATE TABLE "serverpod_health_connection_info" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "active" bigint NOT NULL, + "closing" bigint NOT NULL, + "idle" bigint NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_connection_info_timestamp_idx" ON "serverpod_health_connection_info" USING btree ("timestamp", "serverId", "granularity"); + +-- +-- Class ServerHealthMetric as table serverpod_health_metric +-- +CREATE TABLE "serverpod_health_metric" ( + "id" bigserial PRIMARY KEY, + "name" text NOT NULL, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "isHealthy" boolean NOT NULL, + "value" double precision NOT NULL, + "granularity" bigint NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_metric_timestamp_idx" ON "serverpod_health_metric" USING btree ("timestamp", "serverId", "name", "granularity"); + +-- +-- Class LogEntry as table serverpod_log +-- +CREATE TABLE "serverpod_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "reference" text, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "logLevel" bigint NOT NULL, + "message" text NOT NULL, + "error" text, + "stackTrace" text, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_log_sessionLogId_idx" ON "serverpod_log" USING btree ("sessionLogId"); + +-- +-- Class MessageLogEntry as table serverpod_message_log +-- +CREATE TABLE "serverpod_message_log" ( + "id" bigserial PRIMARY KEY, + "sessionLogId" bigint NOT NULL, + "serverId" text NOT NULL, + "messageId" bigint NOT NULL, + "endpoint" text NOT NULL, + "messageName" text NOT NULL, + "duration" double precision NOT NULL, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- +-- Class MethodInfo as table serverpod_method +-- +CREATE TABLE "serverpod_method" ( + "id" bigserial PRIMARY KEY, + "endpoint" text NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_method_endpoint_method_idx" ON "serverpod_method" USING btree ("endpoint", "method"); + +-- +-- Class DatabaseMigrationVersion as table serverpod_migrations +-- +CREATE TABLE "serverpod_migrations" ( + "id" bigserial PRIMARY KEY, + "module" text NOT NULL, + "version" text NOT NULL, + "timestamp" timestamp without time zone +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_migrations_ids" ON "serverpod_migrations" USING btree ("module"); + +-- +-- Class QueryLogEntry as table serverpod_query_log +-- +CREATE TABLE "serverpod_query_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "sessionLogId" bigint NOT NULL, + "messageId" bigint, + "query" text NOT NULL, + "duration" double precision NOT NULL, + "numRows" bigint, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" bigint NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_query_log_sessionLogId_idx" ON "serverpod_query_log" USING btree ("sessionLogId"); + +-- +-- Class ReadWriteTestEntry as table serverpod_readwrite_test +-- +CREATE TABLE "serverpod_readwrite_test" ( + "id" bigserial PRIMARY KEY, + "number" bigint NOT NULL +); + +-- +-- Class RuntimeSettings as table serverpod_runtime_settings +-- +CREATE TABLE "serverpod_runtime_settings" ( + "id" bigserial PRIMARY KEY, + "logSettings" json NOT NULL, + "logSettingsOverrides" json NOT NULL, + "logServiceCalls" boolean NOT NULL, + "logMalformedCalls" boolean NOT NULL +); + +-- +-- Class SessionLogEntry as table serverpod_session_log +-- +CREATE TABLE "serverpod_session_log" ( + "id" bigserial PRIMARY KEY, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "module" text, + "endpoint" text, + "method" text, + "duration" double precision, + "numQueries" bigint, + "slow" boolean, + "error" text, + "stackTrace" text, + "authenticatedUserId" bigint, + "isOpen" boolean, + "touched" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USING btree ("serverId"); +CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); +CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); + +-- +-- Class AuthKey as table serverpod_auth_key +-- +CREATE TABLE "serverpod_auth_key" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- Class EmailAuth as table serverpod_email_auth +-- +CREATE TABLE "serverpod_email_auth" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_email" ON "serverpod_email_auth" USING btree ("email"); + +-- +-- Class EmailCreateAccountRequest as table serverpod_email_create_request +-- +CREATE TABLE "serverpod_email_create_request" ( + "id" bigserial PRIMARY KEY, + "userName" text NOT NULL, + "email" text NOT NULL, + "hash" text NOT NULL, + "verificationCode" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_auth_create_account_request_idx" ON "serverpod_email_create_request" USING btree ("email"); + +-- +-- Class EmailFailedSignIn as table serverpod_email_failed_sign_in +-- +CREATE TABLE "serverpod_email_failed_sign_in" ( + "id" bigserial PRIMARY KEY, + "email" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "ipAddress" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_email_failed_sign_in_email_idx" ON "serverpod_email_failed_sign_in" USING btree ("email"); +CREATE INDEX "serverpod_email_failed_sign_in_time_idx" ON "serverpod_email_failed_sign_in" USING btree ("time"); + +-- +-- Class EmailReset as table serverpod_email_reset +-- +CREATE TABLE "serverpod_email_reset" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "verificationCode" text NOT NULL, + "expiration" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_email_reset_verification_idx" ON "serverpod_email_reset" USING btree ("verificationCode"); + +-- +-- Class GoogleRefreshToken as table serverpod_google_refresh_token +-- +CREATE TABLE "serverpod_google_refresh_token" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "refreshToken" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_google_refresh_token_userId_idx" ON "serverpod_google_refresh_token" USING btree ("userId"); + +-- +-- Class UserImage as table serverpod_user_image +-- +CREATE TABLE "serverpod_user_image" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "version" bigint NOT NULL, + "url" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_user_image_user_id" ON "serverpod_user_image" USING btree ("userId", "version"); + +-- +-- Class UserInfo as table serverpod_user_info +-- +CREATE TABLE "serverpod_user_info" ( + "id" bigserial PRIMARY KEY, + "userIdentifier" text NOT NULL, + "userName" text, + "fullName" text, + "email" text, + "created" timestamp without time zone NOT NULL, + "imageUrl" text, + "scopeNames" json NOT NULL, + "blocked" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_user_info_user_identifier" ON "serverpod_user_info" USING btree ("userIdentifier"); +CREATE INDEX "serverpod_user_info_email" ON "serverpod_user_info" USING btree ("email"); + +-- +-- Foreign relations for "serverpod_log" table +-- +ALTER TABLE ONLY "serverpod_log" + ADD CONSTRAINT "serverpod_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_message_log" table +-- +ALTER TABLE ONLY "serverpod_message_log" + ADD CONSTRAINT "serverpod_message_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_query_log" table +-- +ALTER TABLE ONLY "serverpod_query_log" + ADD CONSTRAINT "serverpod_query_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816220051483', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816220051483', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/20250816220051483/definition_project.json b/wien_talks/wien_talks_server/migrations/20250816220051483/definition_project.json new file mode 100644 index 0000000..9bcbc1f --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816220051483/definition_project.json @@ -0,0 +1,205 @@ +{ + "moduleName": "wien_talks", + "tables": [ + { + "name": "health", + "dartName": "Health", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('health_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "note", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "health_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "quote", + "dartName": "Quote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('quote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "text", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "authorName", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "lat", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "long", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "visibility", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "downvotes", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "tags", + "columnType": 8, + "isNullable": true, + "dartType": "List?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "quote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "quoteId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "serverpod", + "version": "20240516151843329" + }, + { + "module": "serverpod_auth", + "version": "20240520102713718" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816220051483/migration.json b/wien_talks/wien_talks_server/migrations/20250816220051483/migration.json new file mode 100644 index 0000000..f940f22 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816220051483/migration.json @@ -0,0 +1,124 @@ +{ + "actions": [ + { + "type": "createTable", + "createTable": { + "name": "health", + "dartName": "Health", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('health_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "note", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "health_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, + { + "type": "deleteTable", + "deleteTable": "vote" + }, + { + "type": "createTable", + "createTable": { + "name": "vote", + "dartName": "Vote", + "module": "wien_talks", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 6, + "isNullable": false, + "columnDefault": "nextval('vote_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "createdAt", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "quoteId", + "columnType": 6, + "isNullable": false, + "dartType": "int" + }, + { + "name": "upvote", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "vote_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + } + ], + "warnings": [ + { + "type": "tableDropped", + "message": "One or more columns are added to table \"vote\" which cannot be added in a table migration. The complete table will be deleted and recreated.", + "table": "vote", + "columns": [ + "quoteId" + ], + "destrucive": true + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/wien_talks/wien_talks_server/migrations/20250816220051483/migration.sql b/wien_talks/wien_talks_server/migrations/20250816220051483/migration.sql new file mode 100644 index 0000000..72fd386 --- /dev/null +++ b/wien_talks/wien_talks_server/migrations/20250816220051483/migration.sql @@ -0,0 +1,54 @@ +BEGIN; + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "health" ( + "id" bigserial PRIMARY KEY, + "createdAt" timestamp without time zone NOT NULL, + "note" text +); + +-- +-- ACTION DROP TABLE +-- +DROP TABLE "vote" CASCADE; + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "vote" ( + "id" bigserial PRIMARY KEY, + "userId" bigint NOT NULL, + "createdAt" timestamp without time zone NOT NULL, + "quoteId" bigint NOT NULL, + "upvote" boolean NOT NULL +); + + +-- +-- MIGRATION VERSION FOR wien_talks +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('wien_talks', '20250816220051483', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20250816220051483', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240516151843329', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240516151843329', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod_auth +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod_auth', '20240520102713718', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240520102713718', "timestamp" = now(); + + +COMMIT; diff --git a/wien_talks/wien_talks_server/migrations/migration_registry.txt b/wien_talks/wien_talks_server/migrations/migration_registry.txt index 106c539..a52cc5d 100644 --- a/wien_talks/wien_talks_server/migrations/migration_registry.txt +++ b/wien_talks/wien_talks_server/migrations/migration_registry.txt @@ -4,6 +4,10 @@ ### manually. If a collision is detected in this file when doing a code merge, resolve ### the conflict by removing and recreating the conflicting migration. -20250816095813247 -20250816122625449 -20250816171653001 +20250816212658542 +20250816212959541 +20250816214717668 +20250816215043551 +20250816215049795 +20250816215102447 +20250816220051483 diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index e2e9136..d4fe81d 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -14,11 +14,10 @@ import 'package:serverpod_test/serverpod_test.dart' as _i1; import 'package:serverpod/serverpod.dart' as _i2; import 'dart:async' as _i3; -import 'package:wien_talks_server/src/generated/quotes/quote.dart' as _i4; -import 'package:wien_talks_server/src/generated/quotes/create_quote.dart' - as _i5; -import 'package:wien_talks_server/src/generated/votes/vote.dart' as _i6; -import 'package:wien_talks_server/src/generated/votes/vote_request.dart' as _i7; +import 'package:wien_talks_server/src/generated/health.dart' as _i4; +import 'package:wien_talks_server/src/generated/quote.dart' as _i5; +import 'package:wien_talks_server/src/generated/create_quote.dart' as _i6; +import 'package:wien_talks_server/src/generated/vote.dart' as _i7; import 'package:wien_talks_server/src/generated/protocol.dart'; import 'package:wien_talks_server/src/generated/endpoints.dart'; export 'package:serverpod_test/serverpod_test_public_exports.dart'; @@ -105,6 +104,8 @@ void withServerpod( } class TestEndpoints { + late final _HealthEndpoint health; + late final _QuoteEndpoint quote; late final _VotesEndpoint votes; @@ -117,6 +118,10 @@ class _InternalTestEndpoints extends TestEndpoints _i2.SerializationManager serializationManager, _i2.EndpointDispatch endpoints, ) { + health = _HealthEndpoint( + endpoints, + serializationManager, + ); quote = _QuoteEndpoint( endpoints, serializationManager, @@ -128,6 +133,73 @@ class _InternalTestEndpoints extends TestEndpoints } } +class _HealthEndpoint { + _HealthEndpoint( + this._endpointDispatch, + this._serializationManager, + ); + + final _i2.EndpointDispatch _endpointDispatch; + + final _i2.SerializationManager _serializationManager; + + _i3.Future<_i4.Health> ping( + _i1.TestSessionBuilder sessionBuilder, { + String? note, + }) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'health', + method: 'ping', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'health', + methodName: 'ping', + parameters: _i1.testObjectToJson({'note': note}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future<_i4.Health>); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } + + _i3.Future> all( + _i1.TestSessionBuilder sessionBuilder) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'health', + method: 'all', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'health', + methodName: 'all', + parameters: _i1.testObjectToJson({}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future>); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } +} + class _QuoteEndpoint { _QuoteEndpoint( this._endpointDispatch, @@ -138,9 +210,35 @@ class _QuoteEndpoint { final _i2.SerializationManager _serializationManager; - _i3.Future<_i4.Quote> createQuote( + _i3.Future dbPing(_i1.TestSessionBuilder sessionBuilder) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'quote', + method: 'dbPing', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'quote', + methodName: 'dbPing', + parameters: _i1.testObjectToJson({}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } + + _i3.Future<_i5.Quote> createQuote( _i1.TestSessionBuilder sessionBuilder, - _i5.CreateQuoteRequest req, + _i6.CreateQuoteRequest req, ) async { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = @@ -159,7 +257,7 @@ class _QuoteEndpoint { var _localReturnValue = await (_localCallContext.method.call( _localUniqueSession, _localCallContext.arguments, - ) as _i3.Future<_i4.Quote>); + ) as _i3.Future<_i5.Quote>); return _localReturnValue; } finally { await _localUniqueSession.close(); @@ -169,7 +267,7 @@ class _QuoteEndpoint { _i3.Future updateQuote( _i1.TestSessionBuilder sessionBuilder, - _i4.Quote quote, + _i5.Quote quote, ) async { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = @@ -196,7 +294,7 @@ class _QuoteEndpoint { }); } - _i3.Future> getAllQuotes( + _i3.Future> getAllQuotes( _i1.TestSessionBuilder sessionBuilder) async { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = @@ -215,7 +313,7 @@ class _QuoteEndpoint { var _localReturnValue = await (_localCallContext.method.call( _localUniqueSession, _localCallContext.arguments, - ) as _i3.Future>); + ) as _i3.Future>); return _localReturnValue; } finally { await _localUniqueSession.close(); @@ -234,36 +332,7 @@ class _VotesEndpoint { final _i2.SerializationManager _serializationManager; - _i3.Future<_i6.Vote> postVote( - _i1.TestSessionBuilder sessionBuilder, - _i7.VoteRequest voteRequest, - ) async { - return _i1.callAwaitableFunctionAndHandleExceptions(() async { - var _localUniqueSession = - (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'votes', - method: 'postVote', - ); - try { - var _localCallContext = await _endpointDispatch.getMethodCallContext( - createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'votes', - methodName: 'postVote', - parameters: _i1.testObjectToJson({'voteRequest': voteRequest}), - serializationManager: _serializationManager, - ); - var _localReturnValue = await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) as _i3.Future<_i6.Vote>); - return _localReturnValue; - } finally { - await _localUniqueSession.close(); - } - }); - } - - _i3.Future> getAllVotes( + _i3.Future> getAllVotes( _i1.TestSessionBuilder sessionBuilder) async { return _i1.callAwaitableFunctionAndHandleExceptions(() async { var _localUniqueSession = @@ -282,7 +351,59 @@ class _VotesEndpoint { var _localReturnValue = await (_localCallContext.method.call( _localUniqueSession, _localCallContext.arguments, - ) as _i3.Future>); + ) as _i3.Future>); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } + + _i3.Future createVote(_i1.TestSessionBuilder sessionBuilder) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'votes', + method: 'createVote', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'votes', + methodName: 'createVote', + parameters: _i1.testObjectToJson({}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future); + return _localReturnValue; + } finally { + await _localUniqueSession.close(); + } + }); + } + + _i3.Future sayHello(_i1.TestSessionBuilder sessionBuilder) async { + return _i1.callAwaitableFunctionAndHandleExceptions(() async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'votes', + method: 'sayHello', + ); + try { + var _localCallContext = await _endpointDispatch.getMethodCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'votes', + methodName: 'sayHello', + parameters: _i1.testObjectToJson({}), + serializationManager: _serializationManager, + ); + var _localReturnValue = await (_localCallContext.method.call( + _localUniqueSession, + _localCallContext.arguments, + ) as _i3.Future); return _localReturnValue; } finally { await _localUniqueSession.close(); From 39e4f1142fef2195126723de60d0b0c75e47605c Mon Sep 17 00:00:00 2001 From: tk Date: Sun, 17 Aug 2025 01:07:32 +0200 Subject: [PATCH 42/49] restyle quote list --- .../lib/helper/funmap_mgr.dart | 8 +- .../lib/helper/go_router.dart | 22 +-- .../lib/{ => helper}/location_mgr.dart | 20 ++- .../lib/mapfile_widget.dart | 2 +- .../{ => screens}/create_event_screen.dart | 12 +- .../lib/{ => screens}/home_screen.dart | 13 +- .../lib/{ => screens}/login_page.dart | 0 .../lib/{ => screens}/news_screen.dart | 4 +- .../lib/screens/show_latest_news_widget.dart | 143 ++++++++++++++++++ .../lib/show_latest_news_widget.dart | 57 ------- .../lib/{ => widgets}/carousel_widget.dart | 0 .../{ => widgets}/get_location_widget.dart | 5 +- .../lib/{ => widgets}/news_input_form.dart | 15 +- .../lib/widgets/quote_card.dart | 121 +++++++++++++++ .../lib/widgets/rail_divider.dart | 17 +++ .../lib/widgets/vote_button.dart | 50 ++++++ wien_talks/wien_talks_server/Makefile | 12 +- 17 files changed, 394 insertions(+), 107 deletions(-) rename wien_talks/wien_talks_flutter/lib/{ => helper}/location_mgr.dart (80%) rename wien_talks/wien_talks_flutter/lib/{ => screens}/create_event_screen.dart (68%) rename wien_talks/wien_talks_flutter/lib/{ => screens}/home_screen.dart (80%) rename wien_talks/wien_talks_flutter/lib/{ => screens}/login_page.dart (100%) rename wien_talks/wien_talks_flutter/lib/{ => screens}/news_screen.dart (86%) create mode 100644 wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart delete mode 100644 wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart rename wien_talks/wien_talks_flutter/lib/{ => widgets}/carousel_widget.dart (100%) rename wien_talks/wien_talks_flutter/lib/{ => widgets}/get_location_widget.dart (86%) rename wien_talks/wien_talks_flutter/lib/{ => widgets}/news_input_form.dart (83%) create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/quote_card.dart create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/rail_divider.dart create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/vote_button.dart diff --git a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart b/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart index e213c4e..426d5f7 100644 --- a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart +++ b/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart @@ -10,7 +10,7 @@ class FunmapMgr { late Client client; - late final serverUrl; + late final String serverUrl; factory FunmapMgr() { if (_instance != null) return _instance!; @@ -26,9 +26,11 @@ class FunmapMgr { // E.g. `flutter run --dart-define=SERVER_URL=https://api.example.com/` const serverUrlFromEnv = String.fromEnvironment('SERVER_URL'); - serverUrl = serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; + serverUrl = + serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; - client = Client(serverUrl, connectionTimeout: const Duration(seconds: 5))..connectivityMonitor = FlutterConnectivityMonitor(); + client = Client(serverUrl, connectionTimeout: const Duration(seconds: 5)) + ..connectivityMonitor = FlutterConnectivityMonitor(); client.openStreamingConnection(); } diff --git a/wien_talks/wien_talks_flutter/lib/helper/go_router.dart b/wien_talks/wien_talks_flutter/lib/helper/go_router.dart index 2c3c38b..679cd7e 100644 --- a/wien_talks/wien_talks_flutter/lib/helper/go_router.dart +++ b/wien_talks/wien_talks_flutter/lib/helper/go_router.dart @@ -1,19 +1,9 @@ -import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:wien_talks_flutter/create_event_screen.dart'; -import 'package:wien_talks_flutter/helper/auth_service.dart'; -import 'package:wien_talks_flutter/login_page.dart'; -import 'package:wien_talks_flutter/news_screen.dart'; +import 'package:wien_talks_flutter/screens/create_event_screen.dart'; +import 'package:wien_talks_flutter/screens/login_page.dart'; +import 'package:wien_talks_flutter/screens/news_screen.dart'; final router = GoRouter( - redirect: (context, state) { - final loggedIn = true; // AuthService.user != null; - final atLogin = state.matchedLocation == '/login'; - if (!loggedIn && !atLogin) return '/login'; - if (loggedIn && atLogin) return '/'; - return null; - }, - refreshListenable: AuthChangeNotifier(), routes: [ GoRoute(path: '/login', builder: (c, s) => const LoginScreen()), GoRoute(path: '/', builder: (c, s) => NewsScreen()), @@ -23,9 +13,3 @@ final router = GoRouter( builder: (c, s) => CreateEventScreen()), ], ); - -class AuthChangeNotifier extends ChangeNotifier { - AuthChangeNotifier() { - AuthService.onUserChanged.listen((_) => notifyListeners()); - } -} diff --git a/wien_talks/wien_talks_flutter/lib/location_mgr.dart b/wien_talks/wien_talks_flutter/lib/helper/location_mgr.dart similarity index 80% rename from wien_talks/wien_talks_flutter/lib/location_mgr.dart rename to wien_talks/wien_talks_flutter/lib/helper/location_mgr.dart index 0893c5c..3dbcfb3 100644 --- a/wien_talks/wien_talks_flutter/lib/location_mgr.dart +++ b/wien_talks/wien_talks_flutter/lib/helper/location_mgr.dart @@ -35,7 +35,8 @@ class LocationMgr { final SymbolCache symbolCache = FileSymbolCache(); - final JobRenderer jobRenderer = kIsWeb ? MapOnlineRendererWeb() : MapOnlineRenderer(); + final JobRenderer jobRenderer = + kIsWeb ? MapOnlineRendererWeb() : MapOnlineRenderer(); final MarkerByItemDataStore markerDataStore = MarkerByItemDataStore(); @@ -44,7 +45,7 @@ class LocationMgr { return _instance!; } - LocationMgr._() {} + LocationMgr._(); Future startup() async { serviceEnabled = await location.serviceEnabled(); @@ -70,18 +71,23 @@ class LocationMgr { ); mapModel?.markerDataStores.add(markerDataStore); viewModel = ViewModel(displayModel: displayModel); - _subscription = location.onLocationChanged.listen((LocationData currentLocation) { + _subscription = + location.onLocationChanged.listen((LocationData currentLocation) { _lastLocationData = currentLocation; - if (currentLocation.latitude != null && currentLocation.longitude != null) { - viewModel?.setMapViewPosition(currentLocation.latitude!, currentLocation.longitude!); + if (currentLocation.latitude != null && + currentLocation.longitude != null) { + viewModel?.setMapViewPosition( + currentLocation.latitude!, currentLocation.longitude!); if (iconMarker == null) { iconMarker ??= IconMarker( fontSize: 30, icon: Icons.gps_fixed, color: Colors.red, - center: LatLong(currentLocation.latitude!, currentLocation.longitude!), + center: LatLong( + currentLocation.latitude!, currentLocation.longitude!), displayModel: displayModel); - mapModel?.markerDataStores.add(MarkerDataStore()..addMarker(iconMarker!)); + mapModel?.markerDataStores + .add(MarkerDataStore()..addMarker(iconMarker!)); } } _subject.add(currentLocation); diff --git a/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart b/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart index 477e2a5..c8c1958 100644 --- a/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/mapfile_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:mapsforge_flutter/core.dart'; -import 'package:wien_talks_flutter/location_mgr.dart'; +import 'package:wien_talks_flutter/helper/location_mgr.dart'; class MapfileWidget extends StatefulWidget { const MapfileWidget({super.key}); diff --git a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart b/wien_talks/wien_talks_flutter/lib/screens/create_event_screen.dart similarity index 68% rename from wien_talks/wien_talks_flutter/lib/create_event_screen.dart rename to wien_talks/wien_talks_flutter/lib/screens/create_event_screen.dart index 8aa88ab..d31166f 100644 --- a/wien_talks/wien_talks_flutter/lib/create_event_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/screens/create_event_screen.dart @@ -1,13 +1,13 @@ import 'package:flutter/cupertino.dart'; import 'package:location/location.dart'; import 'package:wien_talks_client/wien_talks_client.dart'; -import 'package:wien_talks_flutter/get_location_widget.dart'; +import 'package:wien_talks_flutter/widgets/get_location_widget.dart'; import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; import 'package:wien_talks_flutter/mapfile_widget.dart'; -import 'package:wien_talks_flutter/news_input_form.dart'; +import 'package:wien_talks_flutter/widgets/news_input_form.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; -import 'location_mgr.dart'; +import '../helper/location_mgr.dart'; class CreateEventScreen extends StatelessWidget { const CreateEventScreen({super.key}); @@ -24,7 +24,11 @@ class CreateEventScreen extends StatelessWidget { ), StreamBuilder( stream: LocationMgr().stream, - builder: (BuildContext context, AsyncSnapshot snapshot) => snapshot.data != null ? Text(snapshot.data.toString()) : SizedBox()), + builder: + (BuildContext context, AsyncSnapshot snapshot) => + snapshot.data != null + ? Text(snapshot.data.toString()) + : SizedBox()), Expanded( child: GetLocationWidget( child: MapfileWidget(), diff --git a/wien_talks/wien_talks_flutter/lib/home_screen.dart b/wien_talks/wien_talks_flutter/lib/screens/home_screen.dart similarity index 80% rename from wien_talks/wien_talks_flutter/lib/home_screen.dart rename to wien_talks/wien_talks_flutter/lib/screens/home_screen.dart index ac051f4..e5de7a2 100644 --- a/wien_talks/wien_talks_flutter/lib/home_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/screens/home_screen.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; -import 'package:wien_talks_flutter/show_latest_news_widget.dart'; +import 'package:wien_talks_flutter/screens/show_latest_news_widget.dart'; import 'package:wien_talks_flutter/widgets/intro_text_widget.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; -import 'carousel_widget.dart'; +import '../widgets/carousel_widget.dart'; class HomeScreen extends StatelessWidget { const HomeScreen({ @@ -29,8 +29,10 @@ class HomeScreen extends StatelessWidget { Expanded( child: ElevatedButton( style: ButtonStyle( - backgroundColor: WidgetStateProperty.all(Theme.of(context).primaryColor), - foregroundColor: WidgetStateProperty.all(Theme.of(context).colorScheme.onPrimary)), + backgroundColor: WidgetStateProperty.all( + Theme.of(context).primaryColor), + foregroundColor: WidgetStateProperty.all( + Theme.of(context).colorScheme.onPrimary)), onPressed: () { context.pushNamed("create_event"); }, @@ -45,7 +47,8 @@ class HomeScreen extends StatelessWidget { Row( children: [ Spacer(), - Text(FunmapMgr().serverUrl, style: Theme.of(context).textTheme.bodySmall), + Text(FunmapMgr().serverUrl, + style: Theme.of(context).textTheme.bodySmall), ], ) ], diff --git a/wien_talks/wien_talks_flutter/lib/login_page.dart b/wien_talks/wien_talks_flutter/lib/screens/login_page.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/login_page.dart rename to wien_talks/wien_talks_flutter/lib/screens/login_page.dart diff --git a/wien_talks/wien_talks_flutter/lib/news_screen.dart b/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart similarity index 86% rename from wien_talks/wien_talks_flutter/lib/news_screen.dart rename to wien_talks/wien_talks_flutter/lib/screens/news_screen.dart index 84507cb..3701beb 100644 --- a/wien_talks/wien_talks_flutter/lib/news_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:wien_talks_flutter/show_latest_news_widget.dart'; +import 'package:wien_talks_flutter/screens/show_latest_news_widget.dart'; import 'package:wien_talks_flutter/widgets/heading_text.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart'; @@ -16,7 +16,7 @@ class NewsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - HeadingText(text: "Latest news"), + HeadingText(text: "What's being said"), ShowLatestNewsWidget(), SizedBox( height: 30, diff --git a/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart new file mode 100644 index 0000000..14fbb22 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart @@ -0,0 +1,143 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; +import 'package:wien_talks_flutter/widgets/quote_card.dart'; + +class ShowLatestNewsWidget extends StatefulWidget { + const ShowLatestNewsWidget({super.key}); + + @override + State createState() => _ShowLatestNewsWidgetState(); +} + +class _ShowLatestNewsWidgetState extends State { + List? _quotes; + Object? _error; + bool _loading = true; + + @override + void initState() { + super.initState(); + _fetch(); + } + + Future _fetch() async { + setState(() { + _loading = true; + _error = null; + }); + try { + final list = await FunmapMgr().client.quote.getAllQuotes(); + final quotes = list.whereType().toList(growable: false); + quotes.sort((a, b) => (b.createdAt).compareTo(a.createdAt)); + setState(() { + _quotes = quotes; + }); + } catch (e) { + setState(() => _error = e); + } finally { + if (mounted) setState(() => _loading = false); + } + } + + Future _refresh() => _fetch(); + + Future _vote(Quote quote, bool up) async { + if (_quotes == null) return; + final idx = _quotes!.indexWhere((q) => q.id == quote.id); + if (idx < 0) return; + + final original = _quotes![idx]; + final updated = original.copyWith( + upvotes: up ? original.upvotes + 1 : original.upvotes, + downvotes: up ? original.downvotes : original.downvotes + 1, + ); + + setState(() { + final copy = List.from(_quotes!); + copy[idx] = updated; + _quotes = copy; + }); + + try { + await FunmapMgr().client.quote.updateQuote(updated); + } catch (e) { + setState(() { + final copy = List.from(_quotes!); + copy[idx] = original; + _quotes = copy; + }); + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Vote failed: $e')), + ); + } + } + + String _timeAgo(DateTime? dt) { + final d = (dt ?? DateTime.fromMillisecondsSinceEpoch(0)).toLocal(); + final diff = DateTime.now().difference(d); + if (diff.inSeconds < 60) return 'just now'; + if (diff.inMinutes < 60) return '${diff.inMinutes}m ago'; + if (diff.inHours < 24) return '${diff.inHours}h ago'; + if (diff.inDays < 7) return '${diff.inDays}d ago'; + final m = d.month.toString().padLeft(2, '0'); + final day = d.day.toString().padLeft(2, '0'); + return '${d.year}-$m-$day'; + } + + @override + Widget build(BuildContext context) { + if (_loading) { + return const Center(child: CircularProgressIndicator()); + } + if (_error != null) { + return Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text('Error: $_error'), + ), + ); + } + final quotes = _quotes ?? const []; + if (quotes.isEmpty) { + return const Center(child: Text('No quotes yet.')); + } + + return LayoutBuilder( + builder: (context, constraints) { + final unboundedHeight = constraints.maxHeight == double.infinity; + + final list = ListView.separated( + padding: const EdgeInsets.symmetric(vertical: 8), + shrinkWrap: unboundedHeight, + physics: unboundedHeight + ? const NeverScrollableScrollPhysics() + : const AlwaysScrollableScrollPhysics(), + itemCount: quotes.length, + separatorBuilder: (_, __) => const SizedBox(height: 6), + itemBuilder: (context, i) { + final q = quotes[i]; + final author = (q.authorName ?? '').trim(); + final meta = [ + if (author.isNotEmpty) author, + _timeAgo(q.createdAt), + ].join(' · '); + + return QuoteCard( + quote: q, + meta: meta, + onVoteUp: () => _vote(q, true), + onVoteDown: () => _vote(q, false), + ); + }, + ); + + if (unboundedHeight) return list; + return RefreshIndicator(onRefresh: _refresh, child: list); + }, + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart deleted file mode 100644 index 9938649..0000000 --- a/wien_talks/wien_talks_flutter/lib/show_latest_news_widget.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:wien_talks_client/wien_talks_client.dart'; -import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; - -class ShowLatestNewsWidget extends StatelessWidget { - const ShowLatestNewsWidget({super.key}); - - Future> _load() async { - final list = await FunmapMgr().client.quote.getAllQuotes(); - return list.whereType().toList(growable: false); - } - - @override - Widget build(BuildContext context) { - return FutureBuilder>( - future: _load(), - builder: (context, snap) { - if (snap.connectionState != ConnectionState.done) { - return const Center(child: CircularProgressIndicator()); - } - if (snap.hasError) { - return Center( - child: Padding( - padding: const EdgeInsets.all(16), - child: Text('Error: ${snap.error}'), - ), - ); - } - final quotes = snap.data ?? const []; - if (quotes.isEmpty) { - return const Center(child: Text('No quotes yet.')); - } - - return ListView.separated( - itemCount: quotes.length, - separatorBuilder: (_, __) => const Divider(height: 1), - itemBuilder: (context, i) { - final q = quotes[i]; - final author = (q.authorName ?? '').trim(); - final when = (q.createdAt ?? DateTime.fromMillisecondsSinceEpoch(0)) - .toLocal() - .toString(); - return ListTile( - title: Text(q.text), - subtitle: Text([ - if (author.isNotEmpty) author, - when, - ].join(' · ')), - ); - }, - ); - }, - ); - } -} diff --git a/wien_talks/wien_talks_flutter/lib/carousel_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/carousel_widget.dart similarity index 100% rename from wien_talks/wien_talks_flutter/lib/carousel_widget.dart rename to wien_talks/wien_talks_flutter/lib/widgets/carousel_widget.dart diff --git a/wien_talks/wien_talks_flutter/lib/get_location_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/get_location_widget.dart similarity index 86% rename from wien_talks/wien_talks_flutter/lib/get_location_widget.dart rename to wien_talks/wien_talks_flutter/lib/widgets/get_location_widget.dart index 9fe8008..c7d738d 100644 --- a/wien_talks/wien_talks_flutter/lib/get_location_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/get_location_widget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:wien_talks_flutter/location_mgr.dart'; +import 'package:wien_talks_flutter/helper/location_mgr.dart'; class GetLocationWidget extends StatefulWidget { final Widget child; @@ -31,7 +31,8 @@ class _GetLocationWidgetState extends State { { if (snapshot.hasData) { // Error occured - return Text(snapshot.data.toString(), style: TextStyle(color: Colors.red)); + return Text(snapshot.data.toString(), + style: TextStyle(color: Colors.red)); } else { return widget.child; } diff --git a/wien_talks/wien_talks_flutter/lib/news_input_form.dart b/wien_talks/wien_talks_flutter/lib/widgets/news_input_form.dart similarity index 83% rename from wien_talks/wien_talks_flutter/lib/news_input_form.dart rename to wien_talks/wien_talks_flutter/lib/widgets/news_input_form.dart index 3e63217..9c9a5f0 100644 --- a/wien_talks/wien_talks_flutter/lib/news_input_form.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/news_input_form.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:location/location.dart'; import 'package:wien_talks_client/wien_talks_client.dart'; -import 'package:wien_talks_flutter/location_mgr.dart'; +import 'package:wien_talks_flutter/helper/location_mgr.dart'; import 'package:wien_talks_flutter/widgets/error_snackbar.dart'; typedef OnSubmit = Future Function(CreateQuoteRequest request); @@ -28,8 +28,11 @@ class _NewsInputFormState extends State { void _submitForm() async { LocationData? locationData = LocationMgr().lastLocation; - if (locationData == null || locationData.latitude == null || locationData.longitude == null) { - ErrorSnackbar().show(context, "No location available, please retry later"); + if (locationData == null || + locationData.latitude == null || + locationData.longitude == null) { + ErrorSnackbar() + .show(context, "No location available, please retry later"); return; } if (_formKey.currentState!.validate()) { @@ -79,8 +82,10 @@ class _NewsInputFormState extends State { const SizedBox(height: 16.0), ElevatedButton( style: ButtonStyle( - backgroundColor: WidgetStateProperty.all(Theme.of(context).primaryColor), - foregroundColor: WidgetStateProperty.all(Theme.of(context).colorScheme.onPrimary)), + backgroundColor: + WidgetStateProperty.all(Theme.of(context).primaryColor), + foregroundColor: WidgetStateProperty.all( + Theme.of(context).colorScheme.onPrimary)), onPressed: _submitForm, child: const Text('Submit News'), ), diff --git a/wien_talks/wien_talks_flutter/lib/widgets/quote_card.dart b/wien_talks/wien_talks_flutter/lib/widgets/quote_card.dart new file mode 100644 index 0000000..65f3832 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/quote_card.dart @@ -0,0 +1,121 @@ +import 'package:flutter/material.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/widgets/vote_button.dart'; + +class QuoteCard extends StatefulWidget { + const QuoteCard({ + super.key, + required this.quote, + required this.meta, + required this.onVoteUp, + required this.onVoteDown, + }); + + final Quote quote; + final String meta; + final VoidCallback onVoteUp; + final VoidCallback onVoteDown; + + @override + State createState() => _QuoteCardState(); +} + +class _QuoteCardState extends State { + static const int _collapsedMaxLines = 4; + static const int _lengthHintForMore = 160; + + bool _expanded = false; + + @override + Widget build(BuildContext context) { + final t = Theme.of(context); + final baseSmall = t.textTheme.bodySmall; + final baseSmallColor = baseSmall?.color; + final metaColor = baseSmallColor?.withValues(alpha: 0.70); + + final showMoreToggle = widget.quote.text.length > _lengthHintForMore; + + return Card( + elevation: 1, + margin: const EdgeInsets.symmetric(horizontal: 12), + clipBehavior: Clip.antiAlias, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.quote.text, + style: t.textTheme.bodyLarge, + softWrap: true, + maxLines: _expanded ? null : _collapsedMaxLines, + overflow: _expanded + ? TextOverflow.visible + : TextOverflow.ellipsis, + ), + const SizedBox(height: 6), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Text( + widget.meta, + style: baseSmall?.copyWith(color: metaColor), + overflow: TextOverflow.ellipsis, + ), + ), + if (showMoreToggle) ...[ + const SizedBox(width: 8), + TextButton( + onPressed: () => + setState(() => _expanded = !_expanded), + style: TextButton.styleFrom( + padding: EdgeInsets.zero, + minimumSize: const Size(0, 0), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + child: Text(_expanded ? 'Less' : 'More'), + ), + ], + ], + ), + ], + ), + ), + const SizedBox(width: 10), + ConstrainedBox( + constraints: const BoxConstraints.tightFor(width: 56), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // RailDivider(), + const SizedBox(height: 4), + //todo(timo) michi hauepl icon + VoteButton( + icon: Icons.arrow_upward, + semantics: 'Upvote', + count: widget.quote.upvotes, + onPressed: widget.onVoteUp, + color: t.colorScheme.primary, + ), + const SizedBox(height: 4), + VoteButton( + icon: Icons.arrow_downward, + semantics: 'Downvote', + count: widget.quote.downvotes, + onPressed: widget.onVoteDown, + color: t.colorScheme.error, + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/rail_divider.dart b/wien_talks/wien_talks_flutter/lib/widgets/rail_divider.dart new file mode 100644 index 0000000..07a20f5 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/rail_divider.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class RailDivider extends StatelessWidget { + const RailDivider({super.key}); + + @override + Widget build(BuildContext context) { + final c = Theme.of(context).dividerColor.withValues(alpha: 0.40); + return Container( + height: 18, + width: 1, + margin: const EdgeInsets.only(bottom: 6), + color: c, + alignment: Alignment.topRight, + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/vote_button.dart b/wien_talks/wien_talks_flutter/lib/widgets/vote_button.dart new file mode 100644 index 0000000..92c242f --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/vote_button.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; + +class VoteButton extends StatelessWidget { + const VoteButton({ + super.key, + required this.icon, + required this.semantics, + required this.count, + required this.onPressed, + required this.color, + }); + + final IconData icon; + final String semantics; + final int count; + final VoidCallback onPressed; + final Color color; + + @override + Widget build(BuildContext context) { + final t = Theme.of(context); + return Column( + children: [ + IconButton( + onPressed: onPressed, + icon: Icon(icon), + tooltip: semantics, + color: color, + iconSize: 20, + constraints: const BoxConstraints.tightFor(width: 36, height: 36), + padding: EdgeInsets.zero, + splashRadius: 20, + visualDensity: VisualDensity.compact, + ), + AnimatedSwitcher( + duration: const Duration(milliseconds: 150), + transitionBuilder: (child, anim) => + ScaleTransition(scale: anim, child: child), + child: Text( + '$count', + key: ValueKey(count), + style: t.textTheme.labelSmall, + textAlign: TextAlign.center, + ), + ), + ], + ); + } +} diff --git a/wien_talks/wien_talks_server/Makefile b/wien_talks/wien_talks_server/Makefile index ab420e8..194a388 100644 --- a/wien_talks/wien_talks_server/Makefile +++ b/wien_talks/wien_talks_server/Makefile @@ -23,14 +23,13 @@ DEPLOY_NETWORK = docker-net .PHONY: local local-env local-stop local-down local-clean local: .env docker compose -f $(COMPOSE_FILE_LOCAL) up -d - local-env: .env local-stop: docker compose -f $(COMPOSE_FILE_LOCAL) stop local-down: - docker compose -f $(COMPOSE_FILE_LOCAL) down + docker compose -f $(COMPOSE_FILE_LOCAL) down -v local-clean: local-down for VOLUME in $(shell docker compose -f $(COMPOSE_FILE_LOCAL) volumes -q); \ @@ -66,3 +65,12 @@ deploy-clean: deploy-down if test -n "$$(docker network ls -q --filter name=$(DEPLOY_NETWORK))"; then \ docker network rm $(DEPLOY_NETWORK) > /dev/null; fi +codegen: + rm -rf lib/src/generated + serverpod generate + +migrate: + dart run bin/main.dart --role maintenance --apply-migrations + +recreate-db: local-down local codegen migrate + @echo "DB recreated & migrations applied." \ No newline at end of file From bf28ff429a56d90f85e31ffc259730a9affd4581 Mon Sep 17 00:00:00 2001 From: tk Date: Sun, 17 Aug 2025 01:44:23 +0200 Subject: [PATCH 43/49] introduce bottom modal for quote entry --- .../lib/widgets/add_quote_fab.dart | 190 +++++++++++++++++- .../lib/widgets/screen_widget.dart | 24 ++- 2 files changed, 205 insertions(+), 9 deletions(-) diff --git a/wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart b/wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart index 054493b..28af240 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart @@ -1,17 +1,199 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:location/location.dart'; import 'package:wien_talks_client/wien_talks_client.dart'; import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; +class QuoteDraft { + final String text; + final String? author; + const QuoteDraft({required this.text, this.author}); +} + +typedef QuoteSubmit = FutureOr Function(QuoteDraft draft); + +/// If Simon reads this I'm sorry class AddQuoteFab extends StatelessWidget { const AddQuoteFab({ super.key, + this.tooltip = 'Add quote', + this.icon = Icons.format_quote_rounded, + this.mini = false, }); + final String tooltip; + final IconData icon; + final bool mini; + + Future onSubmit(QuoteDraft draft) async { + final fix = await _getHackyLocation(); + if (fix == null || fix.latitude == null) { + return; + } + + await FunmapMgr().client.quote.createQuote( + CreateQuoteRequest( + text: draft.text, + authorName: draft.author, + lat: fix.latitude!, + lng: fix.longitude!, + ), + ); + } + + Future _getHackyLocation() async { + final loc = Location(); + + if (!await loc.serviceEnabled()) { + if (!await loc.requestService()) return null; + } + + var perm = await loc.hasPermission(); + if (perm == PermissionStatus.denied) { + perm = await loc.requestPermission(); + if (perm != PermissionStatus.granted) return null; + } + + return await loc.getLocation(); + } + @override Widget build(BuildContext context) { - return FloatingActionButton(onPressed: () { - FunmapMgr().client.quote.createQuote( - CreateQuoteRequest(text: 'Quote Text', lat: 22, lng: 140)); - }); + return FloatingActionButton( + mini: mini, + tooltip: tooltip, + onPressed: () async { + final draft = await showQuoteEditor(context); + if (draft != null) { + await onSubmit(draft); + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Quote saved')), + ); + } + } + }, + child: Icon(icon), + ); } } + +Future showQuoteEditor( + BuildContext context, { + String? initialText, + String? initialAuthor, +}) async { + final textCtrl = TextEditingController(text: initialText ?? ''); + final authorCtrl = TextEditingController(text: initialAuthor ?? ''); + const maxChars = 500; + + return showModalBottomSheet( + context: context, + isScrollControlled: true, + useSafeArea: true, + showDragHandle: true, + builder: (ctx) { + bool canSave() { + final t = textCtrl.text.trim(); + return t.isNotEmpty && t.length <= maxChars; + } + + return Padding( + padding: EdgeInsets.only( + bottom: MediaQuery.of(ctx).viewInsets.bottom, + ), + child: StatefulBuilder( + builder: (ctx, setSheetState) { + void onChanged(_) => setSheetState(() {}); + final remaining = maxChars - textCtrl.text.characters.length; + + return SingleChildScrollView( + padding: const EdgeInsets.fromLTRB(16, 8, 16, 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + Text('New quote', style: Theme.of(ctx).textTheme.titleMedium), + const SizedBox(height: 8), + TextField( + controller: textCtrl, + onChanged: onChanged, + autofocus: true, + maxLines: null, + minLines: 3, + textInputAction: TextInputAction.newline, + decoration: InputDecoration( + labelText: 'Quote text', + hintText: 'How is Vienna surprising you today', + helperText: 'Max $maxChars characters', + counterText: + '${textCtrl.text.characters.length}/$maxChars', + border: const OutlineInputBorder(), + ), + maxLength: maxChars, + maxLengthEnforcement: MaxLengthEnforcement.enforced, + ), + const SizedBox(height: 12), + TextField( + controller: authorCtrl, + textInputAction: TextInputAction.done, + decoration: const InputDecoration( + labelText: 'Author (optional)', + hintText: 'e.g., Schmausi Wamperl', + border: OutlineInputBorder(), + ), + ), + const SizedBox(height: 12), + Row( + children: [ + Expanded( + child: OutlinedButton( + onPressed: () => Navigator.of(ctx).pop(null), + child: const Text('Cancel'), + ), + ), + const SizedBox(width: 12), + Expanded( + child: FilledButton.icon( + onPressed: canSave() + ? () => Navigator.of(ctx).pop( + QuoteDraft( + text: textCtrl.text.trim(), + author: authorCtrl.text.trim().isEmpty + ? null + : authorCtrl.text.trim(), + ), + ) + : null, + icon: const Icon(Icons.check), + label: const Text('Save'), + ), + ), + ], + ), + const SizedBox(height: 8), + Align( + alignment: Alignment.centerRight, + child: Text( + remaining >= 0 + ? '$remaining characters left' + : '${-remaining} over limit', + style: Theme.of(ctx).textTheme.labelSmall?.copyWith( + color: Theme.of(ctx) + .colorScheme + .onSurface + .withValues(alpha: 0.7), + ), + ), + ), + ], + ), + ); + }, + ), + ); + }, + ); +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart index 49613cd..d24fbc5 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:loader_overlay/loader_overlay.dart'; +import 'package:wien_talks_flutter/widgets/add_quote_fab.dart'; class ScreenWidget extends StatelessWidget { final Widget child; @@ -15,7 +16,16 @@ class ScreenWidget extends StatelessWidget { appBar: AppBar( title: const Text('FunMap'), ), -// floatingActionButton: AddQuoteFab(), + floatingActionButton: AddQuoteFab( + // onSubmit: (draft) { + // FunmapMgr().client.quote.createQuote(CreateQuoteRequest( + // text: draft.text, + // authorName: draft.author, + // lat: LocationMgr().lastLocation!.latitude!, + // lng: LocationMgr().lastLocation!.longitude!, + // )); + // }, + ), body: SafeArea( child: Padding( padding: const EdgeInsets.all(8.0), @@ -28,7 +38,8 @@ class ScreenWidget extends StatelessWidget { ); case 1: return Center( - child: SpinKitCubeGrid(size: 50, color: Theme.of(context).primaryColor), + child: SpinKitCubeGrid( + size: 50, color: Theme.of(context).primaryColor), ); case 2: return Center( @@ -36,15 +47,18 @@ class ScreenWidget extends StatelessWidget { ); case 3: return Center( - child: SpinKitHourGlass(color: Theme.of(context).primaryColor), + child: + SpinKitHourGlass(color: Theme.of(context).primaryColor), ); case 4: return Center( - child: SpinKitFadingCircle(color: Theme.of(context).primaryColor), + child: SpinKitFadingCircle( + color: Theme.of(context).primaryColor), ); default: return Center( - child: SpinKitPulsingGrid(color: Theme.of(context).primaryColor), + child: SpinKitPulsingGrid( + color: Theme.of(context).primaryColor), ); } }, From 47cfb949ac1c7d157531147e90da06ad67a9247d Mon Sep 17 00:00:00 2001 From: tk Date: Sun, 17 Aug 2025 02:28:19 +0200 Subject: [PATCH 44/49] improve quote list performance --- .../lib/src/protocol/client.dart | 14 ++- .../wien_talks_flutter/devtools_options.yaml | 3 + .../lib/helper/funmap_mgr.dart | 2 +- .../lib/helper/time_util.dart | 17 +++ .../lib/screens/home_screen.dart | 2 +- .../lib/screens/news_screen.dart | 2 +- .../lib/screens/show_latest_news_widget.dart | 110 +++++++++--------- .../lib/widgets/add_quote_fab.dart | 2 +- .../lib/widgets/screen_widget.dart | 11 +- .../lib/src/generated/endpoints.dart | 30 +++-- .../lib/src/generated/protocol.yaml | 2 +- .../lib/src/quotes/quotes_endpoint.dart | 30 ++--- .../test_tools/serverpod_test_tools.dart | 58 ++++----- 13 files changed, 151 insertions(+), 132 deletions(-) create mode 100644 wien_talks/wien_talks_flutter/devtools_options.yaml create mode 100644 wien_talks/wien_talks_flutter/lib/helper/time_util.dart diff --git a/wien_talks/wien_talks_client/lib/src/protocol/client.dart b/wien_talks/wien_talks_client/lib/src/protocol/client.dart index 431e580..80b8565 100644 --- a/wien_talks/wien_talks_client/lib/src/protocol/client.dart +++ b/wien_talks/wien_talks_client/lib/src/protocol/client.dart @@ -47,12 +47,6 @@ class EndpointQuote extends _i1.EndpointRef { @override String get name => 'quote'; - _i2.Future dbPing() => caller.callServerEndpoint( - 'quote', - 'dbPing', - {}, - ); - _i2.Future<_i4.Quote> createQuote(_i5.CreateQuoteRequest req) => caller.callServerEndpoint<_i4.Quote>( 'quote', @@ -73,6 +67,14 @@ class EndpointQuote extends _i1.EndpointRef { 'getAllQuotes', {}, ); + + _i2.Stream<_i4.Quote> streamAllQuotes({required int limit}) => + caller.callStreamingServerEndpoint<_i2.Stream<_i4.Quote>, _i4.Quote>( + 'quote', + 'streamAllQuotes', + {'limit': limit}, + {}, + ); } /// {@category Endpoint} diff --git a/wien_talks/wien_talks_flutter/devtools_options.yaml b/wien_talks/wien_talks_flutter/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/wien_talks/wien_talks_flutter/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart b/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart index 426d5f7..846e1ad 100644 --- a/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart +++ b/wien_talks/wien_talks_flutter/lib/helper/funmap_mgr.dart @@ -29,7 +29,7 @@ class FunmapMgr { serverUrl = serverUrlFromEnv.isEmpty ? 'http://$localhost:8080/' : serverUrlFromEnv; - client = Client(serverUrl, connectionTimeout: const Duration(seconds: 5)) + client = Client(serverUrl, connectionTimeout: const Duration(seconds: 2)) ..connectivityMonitor = FlutterConnectivityMonitor(); client.openStreamingConnection(); diff --git a/wien_talks/wien_talks_flutter/lib/helper/time_util.dart b/wien_talks/wien_talks_flutter/lib/helper/time_util.dart new file mode 100644 index 0000000..e7e8c68 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/helper/time_util.dart @@ -0,0 +1,17 @@ +// Clanker code, I caved +String timeAgo(DateTime? dt) { + final d = + (dt ?? DateTime.fromMillisecondsSinceEpoch(0, isUtc: true)).toLocal(); + final now = DateTime.now(); + final diff = now.isBefore(d) ? Duration.zero : now.difference(d); + + return switch (diff.inSeconds) { + < 60 => 'just now', + < 3600 => '${diff.inMinutes}m ago', + < 86400 => '${diff.inHours}h ago', + < 604800 => '${diff.inDays}d ago', + _ => '${d.year.toString().padLeft(4, '0')}-' + '${d.month.toString().padLeft(2, '0')}-' + '${d.day.toString().padLeft(2, '0')}', + }; +} diff --git a/wien_talks/wien_talks_flutter/lib/screens/home_screen.dart b/wien_talks/wien_talks_flutter/lib/screens/home_screen.dart index e5de7a2..7b56d8d 100644 --- a/wien_talks/wien_talks_flutter/lib/screens/home_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/screens/home_screen.dart @@ -20,7 +20,7 @@ class HomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ IntroTextWidget(), - SizedBox(height: 200, child: ShowLatestNewsWidget()), + SizedBox(height: 200, child: LatestQuotesScreen()), SizedBox( height: 30, ), diff --git a/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart b/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart index 3701beb..4ec3a2a 100644 --- a/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart @@ -17,7 +17,7 @@ class NewsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ HeadingText(text: "What's being said"), - ShowLatestNewsWidget(), + LatestQuotesScreen(), SizedBox( height: 30, ), diff --git a/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart index 14fbb22..ec8db6d 100644 --- a/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart @@ -3,97 +3,91 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:wien_talks_client/wien_talks_client.dart'; import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; +import 'package:wien_talks_flutter/helper/time_util.dart'; import 'package:wien_talks_flutter/widgets/quote_card.dart'; -class ShowLatestNewsWidget extends StatefulWidget { - const ShowLatestNewsWidget({super.key}); +class LatestQuotesScreen extends StatefulWidget { + const LatestQuotesScreen({super.key}); @override - State createState() => _ShowLatestNewsWidgetState(); + State createState() => _LatestQuotesScreenState(); } -class _ShowLatestNewsWidgetState extends State { - List? _quotes; +class _LatestQuotesScreenState extends State { + final List _quotes = []; + StreamSubscription? _sub; + Object? _error; - bool _loading = true; @override void initState() { super.initState(); - _fetch(); + _connectStream(); } - Future _fetch() async { - setState(() { - _loading = true; - _error = null; - }); - try { - final list = await FunmapMgr().client.quote.getAllQuotes(); - final quotes = list.whereType().toList(growable: false); - quotes.sort((a, b) => (b.createdAt).compareTo(a.createdAt)); - setState(() { - _quotes = quotes; - }); - } catch (e) { - setState(() => _error = e); - } finally { - if (mounted) setState(() => _loading = false); - } + @override + void dispose() { + _sub?.cancel(); + super.dispose(); } - Future _refresh() => _fetch(); + void _connectStream() { + _sub?.cancel(); + _sub = FunmapMgr().client.quote.streamAllQuotes(limit: 50).listen( + (q) => setState(() => _upsert(q)), + onError: (e) => setState(() => _error = e), + onDone: () => Future.delayed(const Duration(seconds: 2), () { + if (mounted) _connectStream(); + }), + cancelOnError: false, + ); + } + + void _upsert(Quote q) { + final i = _quotes.indexWhere((x) => x.id == q.id); + if (i >= 0) + _quotes[i] = q; + else + _quotes.add(q); + _quotes.sort((a, b) => b.createdAt.compareTo(a.createdAt)); + } + + void _sortDesc() { + _quotes.sort((a, b) => b.createdAt.compareTo(a.createdAt)); + } Future _vote(Quote quote, bool up) async { - if (_quotes == null) return; - final idx = _quotes!.indexWhere((q) => q.id == quote.id); + final idx = _quotes.indexWhere((q) => q.id == quote.id); if (idx < 0) return; - final original = _quotes![idx]; + final original = _quotes[idx]; final updated = original.copyWith( upvotes: up ? original.upvotes + 1 : original.upvotes, downvotes: up ? original.downvotes : original.downvotes + 1, ); setState(() { - final copy = List.from(_quotes!); - copy[idx] = updated; - _quotes = copy; + _quotes[idx] = updated; + _sortDesc(); }); try { await FunmapMgr().client.quote.updateQuote(updated); } catch (e) { - setState(() { - final copy = List.from(_quotes!); - copy[idx] = original; - _quotes = copy; - }); if (!mounted) return; + setState(() => _quotes[idx] = original); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Vote failed: $e')), ); } } - String _timeAgo(DateTime? dt) { - final d = (dt ?? DateTime.fromMillisecondsSinceEpoch(0)).toLocal(); - final diff = DateTime.now().difference(d); - if (diff.inSeconds < 60) return 'just now'; - if (diff.inMinutes < 60) return '${diff.inMinutes}m ago'; - if (diff.inHours < 24) return '${diff.inHours}h ago'; - if (diff.inDays < 7) return '${diff.inDays}d ago'; - final m = d.month.toString().padLeft(2, '0'); - final day = d.day.toString().padLeft(2, '0'); - return '${d.year}-$m-$day'; - } - @override Widget build(BuildContext context) { - if (_loading) { + if (_quotes.isEmpty && _error == null) { return const Center(child: CircularProgressIndicator()); } - if (_error != null) { + if (_error != null && _quotes.isEmpty) { return Center( child: Padding( padding: const EdgeInsets.all(16), @@ -101,9 +95,8 @@ class _ShowLatestNewsWidgetState extends State { ), ); } - final quotes = _quotes ?? const []; - if (quotes.isEmpty) { - return const Center(child: Text('No quotes yet.')); + if (_quotes.isEmpty) { + return const Center(child: Text('Nix da. Sag halt was')); } return LayoutBuilder( @@ -116,14 +109,14 @@ class _ShowLatestNewsWidgetState extends State { physics: unboundedHeight ? const NeverScrollableScrollPhysics() : const AlwaysScrollableScrollPhysics(), - itemCount: quotes.length, + itemCount: _quotes.length, separatorBuilder: (_, __) => const SizedBox(height: 6), itemBuilder: (context, i) { - final q = quotes[i]; + final q = _quotes[i]; final author = (q.authorName ?? '').trim(); final meta = [ if (author.isNotEmpty) author, - _timeAgo(q.createdAt), + timeAgo(q.createdAt), ].join(' · '); return QuoteCard( @@ -135,8 +128,9 @@ class _ShowLatestNewsWidgetState extends State { }, ); - if (unboundedHeight) return list; - return RefreshIndicator(onRefresh: _refresh, child: list); + return unboundedHeight + ? list + : RefreshIndicator(onRefresh: () async {}, child: list); }, ); } diff --git a/wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart b/wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart index 28af240..848344f 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/add_quote_fab.dart @@ -125,7 +125,7 @@ Future showQuoteEditor( minLines: 3, textInputAction: TextInputAction.newline, decoration: InputDecoration( - labelText: 'Quote text', + labelText: 'Vienna`s finest', hintText: 'How is Vienna surprising you today', helperText: 'Max $maxChars characters', counterText: diff --git a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart index d24fbc5..981a777 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart @@ -16,16 +16,7 @@ class ScreenWidget extends StatelessWidget { appBar: AppBar( title: const Text('FunMap'), ), - floatingActionButton: AddQuoteFab( - // onSubmit: (draft) { - // FunmapMgr().client.quote.createQuote(CreateQuoteRequest( - // text: draft.text, - // authorName: draft.author, - // lat: LocationMgr().lastLocation!.latitude!, - // lng: LocationMgr().lastLocation!.longitude!, - // )); - // }, - ), + floatingActionButton: AddQuoteFab(), body: SafeArea( child: Padding( padding: const EdgeInsets.all(8.0), diff --git a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart index d7bddaf..9f25b92 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart +++ b/wien_talks/wien_talks_server/lib/src/generated/endpoints.dart @@ -77,15 +77,6 @@ class Endpoints extends _i1.EndpointDispatch { name: 'quote', endpoint: endpoints['quote']!, methodConnectors: { - 'dbPing': _i1.MethodConnector( - name: 'dbPing', - params: {}, - call: ( - _i1.Session session, - Map params, - ) async => - (endpoints['quote'] as _i3.QuoteEndpoint).dbPing(session), - ), 'createQuote': _i1.MethodConnector( name: 'createQuote', params: { @@ -131,6 +122,27 @@ class Endpoints extends _i1.EndpointDispatch { ) async => (endpoints['quote'] as _i3.QuoteEndpoint).getAllQuotes(session), ), + 'streamAllQuotes': _i1.MethodStreamConnector( + name: 'streamAllQuotes', + params: { + 'limit': _i1.ParameterDescription( + name: 'limit', + type: _i1.getType(), + nullable: false, + ) + }, + streamParams: {}, + returnType: _i1.MethodStreamReturnType.streamType, + call: ( + _i1.Session session, + Map params, + Map streamParams, + ) => + (endpoints['quote'] as _i3.QuoteEndpoint).streamAllQuotes( + session, + limit: params['limit'], + ), + ), }, ); connectors['votes'] = _i1.EndpointConnector( diff --git a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml index 1e633c7..1183893 100644 --- a/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml +++ b/wien_talks/wien_talks_server/lib/src/generated/protocol.yaml @@ -2,10 +2,10 @@ health: - ping: - all: quote: - - dbPing: - createQuote: - updateQuote: - getAllQuotes: + - streamAllQuotes: votes: - getAllVotes: - createVote: diff --git a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart index b86f3eb..fd501e2 100644 --- a/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart +++ b/wien_talks/wien_talks_server/lib/src/quotes/quotes_endpoint.dart @@ -8,13 +8,6 @@ import 'package:wien_talks_server/src/quotes/quote_util.dart'; class QuoteEndpoint extends Endpoint { static const _channelQuoteUpdates = 'quote-updates'; - Future dbPing(Session session) async { - await session.db.unsafeQuery('SELECT 1;'); // connectivity - await session.db - .unsafeQuery('SELECT 1 FROM public.quote LIMIT 1;'); // table visible - return 'ok'; - } - Future createQuote(Session session, CreateQuoteRequest req) async { final authInfo = await session.authenticated; final userId = authInfo?.userId; @@ -50,7 +43,6 @@ class QuoteEndpoint extends Endpoint { final quoteList = await Quote.db.find( session, - // where: (t) => t.visibility.equals(0), orderBy: (t) => t.createdAt, orderDescending: true, ); @@ -62,13 +54,12 @@ class QuoteEndpoint extends Endpoint { return quoteList; } - Future> streamAllQuotes(StreamingSession session, - {int limit = 200}) async { - if (limit <= 0 || limit > 500) limit = 200; - + Stream streamAllQuotes(Session session, {int limit = 50}) { final controller = StreamController(); final live = session.messages.createStream(_channelQuoteUpdates); - final liveSub = live.listen( + + StreamSubscription? sub; + sub = live.listen( (q) { if (q.visibility == 0) controller.add(q); }, @@ -76,10 +67,9 @@ class QuoteEndpoint extends Endpoint { onDone: () { if (!controller.isClosed) controller.close(); }, - cancelOnError: false, ); - () async* { + () async { try { final snapshot = await Quote.db.find( session, @@ -89,18 +79,22 @@ class QuoteEndpoint extends Endpoint { limit: limit, ); + var i = 0; for (final q in snapshot.reversed) { controller.add(q); + if ((++i % 25) == 0) { + await Future.delayed(Duration.zero); + } } } catch (e, st) { controller.addError(e, st); } }(); - await session.close().then((_) async { - await liveSub.cancel(); + controller.onCancel = () async { + await sub?.cancel(); await controller.close(); - }); + }; return controller.stream; } diff --git a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart index d4fe81d..a54a450 100644 --- a/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart +++ b/wien_talks/wien_talks_server/test/integration/test_tools/serverpod_test_tools.dart @@ -210,32 +210,6 @@ class _QuoteEndpoint { final _i2.SerializationManager _serializationManager; - _i3.Future dbPing(_i1.TestSessionBuilder sessionBuilder) async { - return _i1.callAwaitableFunctionAndHandleExceptions(() async { - var _localUniqueSession = - (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( - endpoint: 'quote', - method: 'dbPing', - ); - try { - var _localCallContext = await _endpointDispatch.getMethodCallContext( - createSessionCallback: (_) => _localUniqueSession, - endpointPath: 'quote', - methodName: 'dbPing', - parameters: _i1.testObjectToJson({}), - serializationManager: _serializationManager, - ); - var _localReturnValue = await (_localCallContext.method.call( - _localUniqueSession, - _localCallContext.arguments, - ) as _i3.Future); - return _localReturnValue; - } finally { - await _localUniqueSession.close(); - } - }); - } - _i3.Future<_i5.Quote> createQuote( _i1.TestSessionBuilder sessionBuilder, _i6.CreateQuoteRequest req, @@ -320,6 +294,38 @@ class _QuoteEndpoint { } }); } + + _i3.Stream<_i5.Quote> streamAllQuotes( + _i1.TestSessionBuilder sessionBuilder, { + required int limit, + }) { + var _localTestStreamManager = _i1.TestStreamManager<_i5.Quote>(); + _i1.callStreamFunctionAndHandleExceptions( + () async { + var _localUniqueSession = + (sessionBuilder as _i1.InternalTestSessionBuilder).internalBuild( + endpoint: 'quote', + method: 'streamAllQuotes', + ); + var _localCallContext = + await _endpointDispatch.getMethodStreamCallContext( + createSessionCallback: (_) => _localUniqueSession, + endpointPath: 'quote', + methodName: 'streamAllQuotes', + arguments: {'limit': limit}, + requestedInputStreams: [], + serializationManager: _serializationManager, + ); + await _localTestStreamManager.callStreamMethod( + _localCallContext, + _localUniqueSession, + {}, + ); + }, + _localTestStreamManager.outputStreamController, + ); + return _localTestStreamManager.outputStreamController.stream; + } } class _VotesEndpoint { From 37fbaf4f72f39d720baac31a4b2bedb869e4a8b1 Mon Sep 17 00:00:00 2001 From: tk Date: Sun, 17 Aug 2025 02:32:19 +0200 Subject: [PATCH 45/49] address linter warnigns --- .../lib/screens/show_latest_news_widget.dart | 11 ++++------- .../lib/widgets/news_input_form.dart | 3 ++- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart index ec8db6d..ce4cb54 100644 --- a/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart @@ -45,10 +45,11 @@ class _LatestQuotesScreenState extends State { void _upsert(Quote q) { final i = _quotes.indexWhere((x) => x.id == q.id); - if (i >= 0) + if (i >= 0) { _quotes[i] = q; - else + } else { _quotes.add(q); + } _quotes.sort((a, b) => b.createdAt.compareTo(a.createdAt)); } @@ -103,7 +104,7 @@ class _LatestQuotesScreenState extends State { builder: (context, constraints) { final unboundedHeight = constraints.maxHeight == double.infinity; - final list = ListView.separated( + return ListView.separated( padding: const EdgeInsets.symmetric(vertical: 8), shrinkWrap: unboundedHeight, physics: unboundedHeight @@ -127,10 +128,6 @@ class _LatestQuotesScreenState extends State { ); }, ); - - return unboundedHeight - ? list - : RefreshIndicator(onRefresh: () async {}, child: list); }, ); } diff --git a/wien_talks/wien_talks_flutter/lib/widgets/news_input_form.dart b/wien_talks/wien_talks_flutter/lib/widgets/news_input_form.dart index 9c9a5f0..56b9bdb 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/news_input_form.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/news_input_form.dart @@ -13,6 +13,7 @@ class NewsInputForm extends StatefulWidget { const NewsInputForm({super.key, required this.onSubmit}); @override + // ignore: library_private_types_in_public_api _NewsInputFormState createState() => _NewsInputFormState(); } @@ -45,7 +46,7 @@ class _NewsInputFormState extends State { try { await widget.onSubmit(newsData); } catch (error) { - if (context.mounted) { + if (mounted) { ErrorSnackbar().show(context, error.toString()); } } finally { From 424722d31e63e289e084610070c8c2fc84db07f3 Mon Sep 17 00:00:00 2001 From: tk Date: Sun, 17 Aug 2025 02:53:59 +0200 Subject: [PATCH 46/49] admit defeat and use clanker code --- .../lib/widgets/ubahn_tape.dart | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart diff --git a/wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart b/wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart new file mode 100644 index 0000000..66a4c4a --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart @@ -0,0 +1,193 @@ +import 'dart:math' as math; + +import 'package:flutter/material.dart'; + +class UbahnTape extends StatelessWidget { + const UbahnTape({ + super.key, + this.lat, + this.lon, + this.rotationDeg = -6, + this.maxLinesShown = 1, + this.stations = kViennaStationsSample, + }); + + final double? lat; + final double? lon; + final double rotationDeg; + final int maxLinesShown; + final List stations; + + @override + Widget build(BuildContext context) { + final lines = _resolveLines(); + final primary = lines.isNotEmpty + ? (kUbahnLineColors[lines.first] ?? _kNeutral) + : _kNeutral; + + final bg = primary.withValues(alpha: 0.30); + + return Transform.rotate( + angle: rotationDeg * math.pi / 180, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3), + decoration: BoxDecoration( + color: bg, + borderRadius: BorderRadius.circular(3), + boxShadow: const [ + BoxShadow( + color: Color(0x33000000), + blurRadius: 4, + offset: Offset(0, 2), + ), + ], + border: Border.all( + color: primary.withValues(alpha: 0.35), + width: 1, + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 14, + height: 14, + alignment: Alignment.center, + decoration: BoxDecoration( + color: _U_BLUE, + borderRadius: BorderRadius.circular(3), + ), + child: const Text( + 'U', + style: TextStyle( + fontWeight: FontWeight.w800, + fontSize: 10, + height: 1.0, + color: Colors.white, + ), + ), + ), + const SizedBox(width: 6), + if (lines.isNotEmpty) + ...lines.take(maxLinesShown).expand((line) => [ + _LineChip(line: line), + const SizedBox(width: 4), + ]), + ], + ), + ), + ); + } + + List _resolveLines() { + if (lat == null || lon == null) return const []; + final nearest = _nearestStation(stations, lat!, lon!); + return nearest?.lines ?? const []; + } +} + +class _LineChip extends StatelessWidget { + const _LineChip({required this.line}); + final String line; + + @override + Widget build(BuildContext context) { + final color = kUbahnLineColors[line] ?? _kNeutral; + final on = _onColor(color); + return Container( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.circular(999), + ), + child: Text( + line, + style: TextStyle( + color: on, + fontSize: 10, + fontWeight: FontWeight.w700, + height: 1.0, + letterSpacing: 0.2, + ), + ), + ); + } +} + +Color _onColor(Color bg) { + return ThemeData.estimateBrightnessForColor(bg) == Brightness.dark + ? Colors.white + : const Color(0xFF111111); +} + +const _U_BLUE = Color(0xFF1E88E5); // Vienna U sign-ish blue +const _kNeutral = Color(0xFF9E9E9E); + +// Official-ish line colors +const Map kUbahnLineColors = { + 'U1': Color(0xFFE20613), // red + 'U2': Color(0xFFA762A3), // purple + 'U3': Color(0xFFF29400), // orange + 'U4': Color(0xFF009640), // green + 'U5': Color(0xFF63318F), // violet (future) + 'U6': Color(0xFF8D5B2D), // brown +}; + +class UbahnStation { + const UbahnStation(this.name, this.lat, this.lon, this.lines); + final String name; + final double lat; + final double lon; + final List lines; // e.g., ['U1','U3'] +} + +UbahnStation? _nearestStation( + List stations, + double lat, + double lon, +) { + if (stations.isEmpty) return null; + UbahnStation best = stations.first; + double bestD = _haversine(best.lat, best.lon, lat, lon); + for (var i = 1; i < stations.length; i++) { + final s = stations[i]; + final d = _haversine(s.lat, s.lon, lat, lon); + if (d < bestD) { + best = s; + bestD = d; + } + } + return best; +} + +double _haversine(double lat1, double lon1, double lat2, double lon2) { + const R = 6371000.0; + final dLat = (lat2 - lat1) * (math.pi / 180.0); + final dLon = (lon2 - lon1) * (math.pi / 180.0); + final a = math.sin(dLat / 2) * math.sin(dLat / 2) + + math.cos(lat1 * (math.pi / 180.0)) * + math.cos(lat2 * (math.pi / 180.0)) * + math.sin(dLon / 2) * + math.sin(dLon / 2); + final c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)); + return R * c; +} + +// Compact central sample; swap in full dataset when ready +const List kViennaStationsSample = [ + UbahnStation('Stephansplatz', 48.2084, 16.3731, ['U1', 'U3']), + UbahnStation('Karlsplatz', 48.2000, 16.3690, ['U1', 'U2', 'U4']), + UbahnStation('Schwedenplatz', 48.2111, 16.3776, ['U1', 'U4']), + UbahnStation('Praterstern', 48.2169, 16.3909, ['U1', 'U2']), + UbahnStation('Schottenring', 48.2152, 16.3720, ['U2', 'U4']), + UbahnStation('Volkstheater', 48.2078, 16.3604, ['U2', 'U3']), + UbahnStation('Museumsquartier', 48.2026, 16.3614, ['U2']), + UbahnStation('Westbahnhof', 48.1967, 16.3378, ['U3', 'U6']), + UbahnStation('Wien Mitte/Landstraße', 48.2070, 16.3834, ['U3', 'U4']), + UbahnStation('Spittelau', 48.2409, 16.3585, ['U4', 'U6']), + UbahnStation('Längenfeldgasse', 48.1848, 16.3299, ['U4', 'U6']), + UbahnStation('Erdberg', 48.1907, 16.4196, ['U3']), + UbahnStation('Kaisermühlen VIC', 48.2348, 16.4130, ['U1']), + UbahnStation('Floridsdorf', 48.2570, 16.4030, ['U6']), + UbahnStation('Ottakring', 48.2120, 16.3080, ['U3']), +]; From 75813426a1c6b3c7fff736f3d92d1fb0eb5bcf3e Mon Sep 17 00:00:00 2001 From: tk Date: Sun, 17 Aug 2025 03:51:47 +0200 Subject: [PATCH 47/49] add dotenv to client --- wien_talks/wien_talks_flutter/.gitignore | 2 ++ wien_talks/wien_talks_flutter/pubspec.yaml | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/wien_talks/wien_talks_flutter/.gitignore b/wien_talks/wien_talks_flutter/.gitignore index 22546e2..734b7b3 100644 --- a/wien_talks/wien_talks_flutter/.gitignore +++ b/wien_talks/wien_talks_flutter/.gitignore @@ -45,3 +45,5 @@ app.*.map.json /android/app/profile /android/app/release + +.env \ No newline at end of file diff --git a/wien_talks/wien_talks_flutter/pubspec.yaml b/wien_talks/wien_talks_flutter/pubspec.yaml index 3d8952c..e5c9b8d 100644 --- a/wien_talks/wien_talks_flutter/pubspec.yaml +++ b/wien_talks/wien_talks_flutter/pubspec.yaml @@ -52,6 +52,9 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 google_sign_in: ^7.1.1 + flutter_staggered_grid_view: ^0.7.0 + cached_network_image: ^3.4.1 + flutter_dotenv: ^5.2.1 dev_dependencies: flutter_lints: '>=3.0.0 <7.0.0' @@ -71,6 +74,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: + - .env - assets/funny_images/ - assets/render_themes/ - packages/mapsforge_flutter/assets/patterns/dark_farmland.svg From 1f2934146eb7eec04fef01b08d4698a386273510 Mon Sep 17 00:00:00 2001 From: tk Date: Sun, 17 Aug 2025 04:30:47 +0200 Subject: [PATCH 48/49] add map previews to grid cards --- .../lib/helper/location_util.dart | 29 +++ wien_talks/wien_talks_flutter/lib/main.dart | 6 +- .../lib/screens/news_screen.dart | 33 ++- .../lib/screens/show_latest_news_widget.dart | 30 ++- .../lib/widgets/card_contenty.dart | 224 ++++++++++++++++++ .../lib/widgets/flamboyant_quote_card.dart | 101 ++++++++ .../lib/widgets/map_preview_widget.dart | 92 +++++++ 7 files changed, 480 insertions(+), 35 deletions(-) create mode 100644 wien_talks/wien_talks_flutter/lib/helper/location_util.dart create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/card_contenty.dart create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/flamboyant_quote_card.dart create mode 100644 wien_talks/wien_talks_flutter/lib/widgets/map_preview_widget.dart diff --git a/wien_talks/wien_talks_flutter/lib/helper/location_util.dart b/wien_talks/wien_talks_flutter/lib/helper/location_util.dart new file mode 100644 index 0000000..22b390f --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/helper/location_util.dart @@ -0,0 +1,29 @@ +import 'package:flutter_dotenv/flutter_dotenv.dart'; + +String gStaticMap( + double lat, + double lon, { + int w = 600, + int h = 360, + int zoom = 15, + int scale = 2, + String markerHex = 'E53935', + String maptype = 'roadmap', + String language = 'de', + String region = 'AT', +}) { + final mapsApiKey = dotenv.env['MAPS_KEY'] ?? ''; + final qp = { + 'center': '$lat,$lon', + 'zoom': '$zoom', + 'size': '${w}x$h', + 'scale': '$scale', + 'maptype': maptype, + 'format': 'png', + 'language': language, + 'region': region, + 'markers': 'color:0x$markerHex|$lat,$lon', + 'key': mapsApiKey, + }; + return Uri.https('maps.googleapis.com', '/maps/api/staticmap', qp).toString(); +} diff --git a/wien_talks/wien_talks_flutter/lib/main.dart b/wien_talks/wien_talks_flutter/lib/main.dart index 0842ce8..1f585ca 100644 --- a/wien_talks/wien_talks_flutter/lib/main.dart +++ b/wien_talks/wien_talks_flutter/lib/main.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:wien_talks_flutter/helper/go_router.dart'; -void main() { +Future main() async { + await dotenv.load(fileName: '.env'); runApp(const MyApp()); } @@ -11,7 +13,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp.router( - title: 'Wien Talks FunMap', + title: 'Wien Talks', theme: ThemeData(primarySwatch: Colors.green), routerConfig: router, ); diff --git a/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart b/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart index 4ec3a2a..79d2c14 100644 --- a/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart +++ b/wien_talks/wien_talks_flutter/lib/screens/news_screen.dart @@ -11,24 +11,23 @@ class NewsScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return ScreenWidget( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - HeadingText(text: "What's being said"), - LatestQuotesScreen(), - SizedBox( - height: 30, - ), - ElevatedButton( - onPressed: () { - context.pushNamed("create_event"); - }, - child: Text("Submit your own event")), - ], + var column = Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + HeadingText(text: "What's being said"), + LatestQuotesScreen(), + SizedBox( + height: 30, ), - ), + ElevatedButton( + onPressed: () { + context.pushNamed("create_event"); + }, + child: Text("Submit your own event")), + ], + ); + return ScreenWidget( + child: LatestQuotesScreen(), ); } } diff --git a/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart b/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart index ce4cb54..062b24b 100644 --- a/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/screens/show_latest_news_widget.dart @@ -1,10 +1,12 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:wien_talks_client/wien_talks_client.dart'; import 'package:wien_talks_flutter/helper/funmap_mgr.dart'; +import 'package:wien_talks_flutter/helper/location_util.dart'; import 'package:wien_talks_flutter/helper/time_util.dart'; -import 'package:wien_talks_flutter/widgets/quote_card.dart'; +import 'package:wien_talks_flutter/widgets/flamboyant_quote_card.dart'; class LatestQuotesScreen extends StatefulWidget { const LatestQuotesScreen({super.key}); @@ -102,16 +104,12 @@ class _LatestQuotesScreenState extends State { return LayoutBuilder( builder: (context, constraints) { - final unboundedHeight = constraints.maxHeight == double.infinity; - - return ListView.separated( - padding: const EdgeInsets.symmetric(vertical: 8), - shrinkWrap: unboundedHeight, - physics: unboundedHeight - ? const NeverScrollableScrollPhysics() - : const AlwaysScrollableScrollPhysics(), + return MasonryGridView.count( + crossAxisCount: 2, + mainAxisSpacing: 8, + crossAxisSpacing: 8, + padding: const EdgeInsets.fromLTRB(12, 8, 12, 12), itemCount: _quotes.length, - separatorBuilder: (_, __) => const SizedBox(height: 6), itemBuilder: (context, i) { final q = _quotes[i]; final author = (q.authorName ?? '').trim(); @@ -120,12 +118,12 @@ class _LatestQuotesScreenState extends State { timeAgo(q.createdAt), ].join(' · '); - return QuoteCard( - quote: q, - meta: meta, - onVoteUp: () => _vote(q, true), - onVoteDown: () => _vote(q, false), - ); + return FlamboyantQuoteCard( + quote: q, + meta: meta, + onVoteUp: () => _vote(q, true), + onVoteDown: () => _vote(q, false), + staticMapUrlBuilder: gStaticMap); }, ); }, diff --git a/wien_talks/wien_talks_flutter/lib/widgets/card_contenty.dart b/wien_talks/wien_talks_flutter/lib/widgets/card_contenty.dart new file mode 100644 index 0000000..2e8e211 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/card_contenty.dart @@ -0,0 +1,224 @@ +import 'package:flutter/material.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/widgets/flamboyant_quote_card.dart'; +import 'package:wien_talks_flutter/widgets/map_preview_widget.dart'; + +class CardContenty extends StatelessWidget { + const CardContenty({ + super.key, + required this.quote, + required this.staticMapUrlBuilder, + required this.meta, + required this.onVoteUp, + required this.onVoteDown, + required this.context, + required this.variant, + required this.accent, + required this.metaStyle, + }); + + final Quote quote; + final StaticMapUrlBuilder? staticMapUrlBuilder; + final String meta; + final VoidCallback onVoteUp; + final VoidCallback onVoteDown; + final BuildContext context; + final int variant; + final Color accent; + final TextStyle? metaStyle; + + @override + Widget build(BuildContext context) { + final hasMap = (variant != 0); + final map = hasMap + ? Padding( + padding: const EdgeInsets.only(bottom: 8), + child: MapPreview( + lat: quote.lat, + lon: quote.long, + accent: accent, + staticMapUrlBuilder: staticMapUrlBuilder, + ), + ) + : const SizedBox.shrink(); + + final textBlock = _ContentText( + quote: quote, + meta: meta, + metaStyle: metaStyle, + onVoteUp: onVoteUp, + onVoteDown: onVoteDown, + accent: accent); + + stacked() => Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [map, textBlock], + ); + + return switch (variant) { + 1 when hasMap => stacked(), + 2 when hasMap => LayoutBuilder( + builder: (context, c) { + final wide = c.maxWidth >= 420; + return wide + ? Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible( + flex: 5, + child: Padding( + padding: const EdgeInsets.fromLTRB(12, 10, 8, 12), + child: MapPreview( + lat: quote.lat, + lon: quote.long, + accent: accent, + staticMapUrlBuilder: staticMapUrlBuilder, + aspect: 4 / 3, + ), + ), + ), + Flexible(flex: 7, child: textBlock), + ], + ) + : stacked(); + }, + ), + _ => textBlock, + }; + } +} + +class _ContentText extends StatelessWidget { + const _ContentText({ + required this.quote, + required this.meta, + required this.metaStyle, + required this.onVoteUp, + required this.onVoteDown, + required this.accent, + }); + + final Quote quote; + final String meta; + final TextStyle? metaStyle; + final VoidCallback onVoteUp; + final VoidCallback onVoteDown; + final Color accent; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.fromLTRB(12, 10, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + quote.text, + style: Theme.of(context).textTheme.bodyLarge, + ), + const SizedBox(height: 8), + Row( + children: [ + Expanded( + child: Text(meta, + style: metaStyle, overflow: TextOverflow.ellipsis)), + const SizedBox(width: 8), + _VotePills( + up: quote.upvotes, + down: quote.downvotes, + onUp: onVoteUp, + onDown: onVoteDown, + accent: accent, + ), + ], + ), + ], + ), + ); + } +} + +class _VotePills extends StatelessWidget { + const _VotePills({ + required this.up, + required this.down, + required this.onUp, + required this.onDown, + required this.accent, + }); + + final int up; + final int down; + final VoidCallback onUp; + final VoidCallback onDown; + final Color accent; + + @override + Widget build(BuildContext context) { + final t = Theme.of(context); + final bg = t.colorScheme.surfaceContainerHighest.withValues(alpha: 0.55); + final onBg = ThemeData.estimateBrightnessForColor(bg) == Brightness.dark + ? Colors.white + : const Color(0xFF1A1A1A); + final pillStyle = t.textTheme.labelSmall?.copyWith(color: onBg); + + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + _Pill( + icon: Icons.arrow_upward, + color: accent, + text: '$up', + onTap: onUp, + textStyle: pillStyle, + ), + const SizedBox(width: 6), + _Pill( + icon: Icons.arrow_downward, + color: const Color(0xFFD32F2F), + text: '$down', + onTap: onDown, + textStyle: pillStyle, + ), + ], + ); + } +} + +class _Pill extends StatelessWidget { + const _Pill({ + required this.icon, + required this.color, + required this.text, + required this.onTap, + required this.textStyle, + }); + + final IconData icon; + final Color color; + final String text; + final VoidCallback onTap; + final TextStyle? textStyle; + + @override + Widget build(BuildContext context) { + return Material( + color: color.withValues(alpha: 0.12), + borderRadius: BorderRadius.circular(999), + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(999), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + child: Row( + children: [ + Icon(icon, size: 16, color: color), + const SizedBox(width: 6), + Text(text, style: textStyle), + ], + ), + ), + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/flamboyant_quote_card.dart b/wien_talks/wien_talks_flutter/lib/widgets/flamboyant_quote_card.dart new file mode 100644 index 0000000..5ac0f3b --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/flamboyant_quote_card.dart @@ -0,0 +1,101 @@ +import 'dart:math' as math; + +import 'package:flutter/material.dart'; +import 'package:wien_talks_client/wien_talks_client.dart'; +import 'package:wien_talks_flutter/widgets/card_contenty.dart'; +import 'package:wien_talks_flutter/widgets/ubahn_tape.dart'; + +typedef StaticMapUrlBuilder = String Function( + double lat, + double lon, { + int w, + int h, + int zoom, +}); + +class FlamboyantQuoteCard extends StatelessWidget { + const FlamboyantQuoteCard({ + super.key, + required this.quote, + required this.meta, + required this.onVoteUp, + required this.onVoteDown, + this.staticMapUrlBuilder, + }); + + final Quote quote; + final String meta; + final VoidCallback onVoteUp; + final VoidCallback onVoteDown; + final StaticMapUrlBuilder? staticMapUrlBuilder; + + @override + Widget build(BuildContext context) { + final seed = (quote.id ?? quote.text.hashCode) & 0x7fffffff; + final rng = math.Random(seed); + + final variant = (rng.nextInt(3)); + + // Subtle tilt and accent + final tiltDeg = [-2.2, -1.4, -0.6, 0, 0.6, 1.2, 2.0][rng.nextInt(7)]; + final tiltRad = tiltDeg * math.pi / 180.0; + final accents = [ + const Color(0xFFE53935), // red + const Color(0xFF3949AB), // indigo + const Color(0xFF00897B), // teal + ]; + final accent = accents[seed % accents.length]; + + final t = Theme.of(context); + final metaStyle = t.textTheme.bodySmall?.copyWith( + color: (t.textTheme.bodySmall?.color ?? t.colorScheme.onSurface) + .withValues(alpha: 0.70), + ); + + final card = Container( + decoration: BoxDecoration( + color: t.colorScheme.surface, + borderRadius: BorderRadius.circular(14), + boxShadow: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 12, + offset: Offset(0, 6), + ), + ], + border: Border.all(color: accent.withValues(alpha: 0.25), width: 1), + ), + child: CardContenty( + quote: quote, + staticMapUrlBuilder: staticMapUrlBuilder, + meta: meta, + onVoteUp: onVoteUp, + onVoteDown: onVoteDown, + context: context, + variant: variant, + accent: accent, + metaStyle: metaStyle), + ); + + return Padding( + padding: const EdgeInsets.only(top: 6, bottom: 2), + child: Stack( + clipBehavior: Clip.none, + children: [ + Transform.rotate( + angle: tiltRad, + child: card, + ), + Positioned( + top: -8, + right: 16, + child: UbahnTape( + lat: quote.lat, + lon: quote.long, + ), + ), + ], + ), + ); + } +} diff --git a/wien_talks/wien_talks_flutter/lib/widgets/map_preview_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/map_preview_widget.dart new file mode 100644 index 0000000..f6f5117 --- /dev/null +++ b/wien_talks/wien_talks_flutter/lib/widgets/map_preview_widget.dart @@ -0,0 +1,92 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:wien_talks_flutter/widgets/flamboyant_quote_card.dart'; + +class MapPreview extends StatelessWidget { + const MapPreview({ + super.key, + required this.lat, + required this.lon, + required this.accent, + this.staticMapUrlBuilder, + this.aspect = 16 / 9, + }); + + final double lat; + final double lon; + final double aspect; + final Color accent; + final StaticMapUrlBuilder? staticMapUrlBuilder; + + @override + Widget build(BuildContext context) { + final border = Border.all(color: accent.withValues(alpha: 0.25), width: 1); + final r = BorderRadius.circular(12); + + final urlBuilder = staticMapUrlBuilder; + final w = + (MediaQuery.of(context).size.width / 2).clamp(280.0, 600.0).toInt(); + final h = (w / aspect).round(); + + Widget content; + if (urlBuilder != null) { + final url = urlBuilder(lat, lon, w: w, h: h, zoom: 15); + + content = ClipRRect( + borderRadius: r, + child: CachedNetworkImage( + imageUrl: url, + width: double.infinity, + height: h.toDouble(), + fit: BoxFit.cover, + ), + ); + } else { + content = + _MapPlaceholder(accent: accent, height: h.toDouble(), radius: r); + } + + return DecoratedBox( + decoration: BoxDecoration(border: border, borderRadius: r), + child: content, + ); + } +} + +class _MapPlaceholder extends StatelessWidget { + const _MapPlaceholder({required this.accent, this.height, this.radius}); + + final Color accent; + final double? height; + final BorderRadius? radius; + + @override + Widget build(BuildContext context) { + final t = Theme.of(context); + return ClipRRect( + borderRadius: radius ?? BorderRadius.circular(12), + child: Container( + height: height, + alignment: Alignment.center, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + t.colorScheme.surfaceContainerHighest.withValues(alpha: 0.50), + t.colorScheme.surfaceContainerHighest.withValues(alpha: 0.20), + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.location_on, color: accent), + const SizedBox(width: 8), + Text('Map preview', style: t.textTheme.labelMedium), + ], + ), + ), + ); + } +} From eb5264a5533a4f4e2bbd8e2898ba02a1df6cd85a Mon Sep 17 00:00:00 2001 From: tk Date: Sun, 17 Aug 2025 04:31:12 +0200 Subject: [PATCH 49/49] display ubahn tapes on grid cards --- .../wien_talks_flutter/lib/widgets/screen_widget.dart | 3 --- wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart | 6 +++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart index 981a777..e1e43bb 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/screen_widget.dart @@ -13,9 +13,6 @@ class ScreenWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('FunMap'), - ), floatingActionButton: AddQuoteFab(), body: SafeArea( child: Padding( diff --git a/wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart b/wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart index 66a4c4a..59a2d6f 100644 --- a/wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart +++ b/wien_talks/wien_talks_flutter/lib/widgets/ubahn_tape.dart @@ -7,7 +7,7 @@ class UbahnTape extends StatelessWidget { super.key, this.lat, this.lon, - this.rotationDeg = -6, + this.rotationDeg = 6, this.maxLinesShown = 1, this.stations = kViennaStationsSample, }); @@ -54,7 +54,7 @@ class UbahnTape extends StatelessWidget { height: 14, alignment: Alignment.center, decoration: BoxDecoration( - color: _U_BLUE, + color: _uBlue, borderRadius: BorderRadius.circular(3), ), child: const Text( @@ -120,7 +120,7 @@ Color _onColor(Color bg) { : const Color(0xFF111111); } -const _U_BLUE = Color(0xFF1E88E5); // Vienna U sign-ish blue +const _uBlue = Color(0xFF1E88E5); // Vienna U sign-ish blue const _kNeutral = Color(0xFF9E9E9E); // Official-ish line colors
  • 5PcjE~eBuT{uMB+C|ciwN$^ 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�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ͧ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