diff --git a/Makefile b/Makefile
index 6efea5a..48c328f 100644
--- a/Makefile
+++ b/Makefile
@@ -96,6 +96,12 @@ proto:
./proto/*.proto
cd ..
+proto_app:
+ cd frontend/app && \
+ rm -f lib/pb/*.dart && \
+ protoc -I=../../bff/proto --dart_out=lib/pb ../../bff/proto/*.proto
+ cd ../..
+
evans:
evans --host localhost --port 9090 --package pb -r repl
diff --git a/frontend/app/.gitignore b/frontend/app/.gitignore
new file mode 100644
index 0000000..7c46a55
--- /dev/null
+++ b/frontend/app/.gitignore
@@ -0,0 +1,861 @@
+# Miscellaneous
+*.class
+#*.lock
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# Visual Studio Code related
+.classpath
+.project
+.settings/
+.vscode/
+
+# Flutter repo-specific
+/bin/cache/
+/bin/internal/bootstrap.bat
+/bin/internal/bootstrap.sh
+/bin/mingit/
+/dev/benchmarks/mega_gallery/
+/dev/bots/.recipe_deps
+/dev/bots/android_tools/
+/dev/devicelab/ABresults*.json
+/dev/docs/doc/
+/dev/docs/flutter.docs.zip
+/dev/docs/lib/
+/dev/docs/pubspec.yaml
+/dev/integration_tests/**/xcuserdata
+/dev/integration_tests/**/Pods
+/packages/flutter/coverage/
+version
+analysis_benchmark.json
+
+# packages file containing multi-root paths
+.packages.generated
+
+# Flutter/Dart/Pub related
+**/doc/api/
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+**/generated_plugin_registrant.dart
+.packages
+.pub-cache/
+.pub/
+build/
+flutter_*.png
+linked_*.ds
+unlinked.ds
+unlinked_spec.ds
+
+# Android related
+**/android/**/gradle-wrapper.jar
+.gradle/
+**/android/captures/
+**/android/gradlew
+**/android/gradlew.bat
+**/android/local.properties
+**/android/**/GeneratedPluginRegistrant.java
+**/android/key.properties
+# *.jks
+
+# iOS/XCode related
+**/ios/**/*.mode1v3
+**/ios/**/*.mode2v3
+**/ios/**/*.moved-aside
+**/ios/**/*.pbxuser
+**/ios/**/*.perspectivev3
+**/ios/**/*sync/
+**/ios/**/.sconsign.dblite
+**/ios/**/.tags*
+**/ios/**/.vagrant/
+**/ios/**/DerivedData/
+**/ios/**/Icon?
+**/ios/**/Pods/
+**/ios/**/.symlinks/
+**/ios/**/profile
+**/ios/**/xcuserdata
+**/ios/.generated/
+**/ios/Flutter/.last_build_id
+**/ios/Flutter/App.framework
+**/ios/Flutter/Flutter.framework
+**/ios/Flutter/Flutter.podspec
+**/ios/Flutter/Generated.xcconfig
+**/ios/Flutter/ephemeral
+**/ios/Flutter/app.flx
+**/ios/Flutter/app.zip
+**/ios/Flutter/flutter_assets/
+**/ios/Flutter/flutter_export_environment.sh
+**/ios/ServiceDefinitions.json
+**/ios/Runner/GeneratedPluginRegistrant.*
+
+# macOS
+**/macos/Flutter/GeneratedPluginRegistrant.swift
+
+# Coverage
+coverage/
+
+# Symbols
+app.*.symbols
+
+# Exceptions to above rules.
+!**/ios/**/default.mode1v3
+!**/ios/**/default.mode2v3
+!**/ios/**/default.pbxuser
+!**/ios/**/default.perspectivev3
+!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
+!/dev/ci/**/Gemfile.lock
+
+
+## Related .gitignores ##
+
+# Firebase configuration files / Google Services (e.g. APIs or Firebase)
+ios/Runner/GoogleService-Info.plist
+android/app/google-services.json
+
+# Google Maps API
+google_maps_api.xml
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# Obfuscation related
+app.*.map.json
+
+
+### --------------------------- Dart.gitignore ------------------------- ###
+
+# See https://www.dartlang.org/guides/libraries/private-files
+
+# Files and directories created by pub
+#.dart_tool/
+#.packages
+#build/
+# If you're building an application, you may want to check-in your pubspec.lock
+#pubspec.lock
+
+# Directory created by dartdoc
+# If you don't generate documentation locally you can remove this line.
+doc/api/
+
+# dotenv environment variables file
+.env*
+
+# Avoid committing generated Javascript files:
+*.dart.js
+*.info.json # Produced by the --dump-info flag.
+*.js # When generated by dart2js. Don't specify *.js if your
+ # project includes source files written in JavaScript.
+*.js_
+*.js.deps
+*.js.map
+
+#.flutter-plugins
+#.flutter-plugins-dependencies
+
+
+### -------------------------- Swift.gitignore ------------------------ ###
+
+# Xcode
+#
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## User settings
+#xcuserdata/
+
+## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
+#*.xcscmblueprint
+#*.xccheckout
+
+## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
+#build/
+#DerivedData/
+#*.moved-aside
+#*.pbxuser
+#!default.pbxuser
+#*.mode1v3
+#!default.mode1v3
+#*.mode2v3
+#!default.mode2v3
+#*.perspectivev3
+#!default.perspectivev3
+
+## Obj-C/Swift specific
+*.hmap
+
+## App packaging
+*.ipa
+*.dSYM.zip
+*.dSYM
+
+## Playgrounds
+timeline.xctimeline
+playground.xcworkspace
+
+# Swift Package Manager
+
+# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
+ Packages/
+ Package.pins
+ Package.resolved
+ *.xcodeproj
+
+# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
+# hence it is not needed unless you have added a package configuration file to your project
+ .swiftpm
+
+.build/
+
+# CocoaPods
+#
+# We recommend against adding the Pods directory to your .gitignore. However
+# you should judge for yourself, the pros and cons are mentioned at:
+# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
+#
+# Pods/
+#
+# Add this line if you want to avoid checking in source code from the Xcode workspace
+# *.xcworkspace
+
+# Carthage
+#
+# Add this line if you want to avoid checking in source code from Carthage dependencies.
+# Carthage/Checkouts
+
+Carthage/Build/
+
+# Accio dependency management
+Dependencies/
+.accio/
+
+# fastlane
+#
+# It is recommended to not store the screenshots in the git repo.
+# Instead, use fastlane to re-generate the screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://docs.fastlane.tools/best-practices/source-control/#source-control
+
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots/**/*.png
+fastlane/test_output
+
+# Code Injection
+#
+# After new code Injection tools there's a generated folder /iOSInjectionProject
+# https://github.com/johnno1962/injectionforxcode
+
+iOSInjectionProject/
+
+
+### -------------------------- Java.gitignore -------------------------- ###
+
+# Compiled class file
+#*.class
+
+# Log file
+#*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+#*.jar
+*.war
+*.nar
+*.ear
+#*.zip
+*.tar.gz
+#*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+replay_pid*
+
+
+### -------------------------- Kotlin.gitignore ------------------------ ###
+
+#.DS_Store
+.idea/shelf
+/confluence/target
+/dependencies/repo
+/android.tests.dependencies
+/dependencies/android.tests.dependencies
+/dist
+/local
+/gh-pages
+/ideaSDK
+/clionSDK
+/android-studio/sdk
+#out/
+/tmp
+/intellij
+workspace.xml
+*.versionsBackup
+/idea/testData/debugger/tinyApp/classes*
+/jps-plugin/testData/kannotator
+/js/js.translator/testData/out/
+/js/js.translator/testData/out-min/
+/js/js.translator/testData/out-pir/
+#.gradle/
+#build/
+!**/src/**/build
+!**/test/**/build
+#*.iml
+!**/testData/**/*.iml
+.idea/remote-targets.xml
+.idea/libraries/Gradle*.xml
+.idea/libraries/Maven*.xml
+.idea/artifacts/PILL_*.xml
+.idea/artifacts/KotlinPlugin.xml
+#.idea/modules
+.idea/runConfigurations/JPS_*.xml
+.idea/runConfigurations/PILL_*.xml
+.idea/runConfigurations/_FP_*.xml
+.idea/runConfigurations/_MT_*.xml
+#.idea/libraries
+#.idea/modules.xml
+#.idea/gradle.xml
+#.idea/compiler.xml
+.idea/inspectionProfiles/profiles_settings.xml
+.idea/.name
+.idea/artifacts/dist_auto_*
+.idea/artifacts/dist.xml
+.idea/artifacts/ideaPlugin.xml
+.idea/artifacts/kotlinc.xml
+.idea/artifacts/kotlin_compiler_jar.xml
+.idea/artifacts/kotlin_plugin_jar.xml
+.idea/artifacts/kotlin_jps_plugin_jar.xml
+.idea/artifacts/kotlin_daemon_client_jar.xml
+.idea/artifacts/kotlin_imports_dumper_compiler_plugin_jar.xml
+.idea/artifacts/kotlin_main_kts_jar.xml
+.idea/artifacts/kotlin_compiler_client_embeddable_jar.xml
+.idea/artifacts/kotlin_reflect_jar.xml
+.idea/artifacts/kotlin_stdlib_js_ir_*
+.idea/artifacts/kotlin_test_js_ir_*
+.idea/artifacts/kotlin_stdlib_wasm_*
+.idea/artifacts/kotlinx_atomicfu_runtime_*
+#.idea/jarRepositories.xml
+.idea/csv-plugin.xml
+.idea/libraries-with-intellij-classes.xml
+.idea/misc.xml
+node_modules/
+.rpt2_cache/
+libraries/tools/kotlin-test-js-runner/lib/
+#local.properties
+buildSrcTmp/
+distTmp/
+outTmp/
+/test.output
+/kotlin-native/dist
+kotlin-ide/
+
+
+### ------------------------- Android.gitignore ------------------------ ###
+
+# Built application files
+*.apk
+*.ap_
+
+# Files for the ART/Dalvik VM
+*.dex
+
+# Generated files
+bin/
+gen/
+out/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# IntelliJ
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/gradle.xml
+.idea/assetWizardSettings.xml
+.idea/dictionaries
+.idea/libraries
+.idea/caches
+
+# External native build folder generated in Android Studio 2.2 and later
+.externalNativeBuild
+
+# Freeline
+freeline.py
+freeline/
+freeline_project_description.json
+
+# fastlane
+#fastlane/report.xml
+#fastlane/Preview.html
+fastlane/screenshots
+#fastlane/test_output
+fastlane/readme.md
+
+# Keystore files
+*.jks
+*.keystore
+
+
+### ------------------------- Gradle.gitignore ------------------------- ###
+
+.gradle
+**/build/
+!src/**/build/
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+# Cache of project
+.gradletasknamecache
+
+# Eclipse Gradle plugin generated files
+# Eclipse Core
+#.project
+# JDT-specific (Eclipse Java Development Tools)
+#.classpath
+
+
+### ------------------------- Maven.gitignore -------------------------- ###
+
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+# Eclipse m2e generated files
+# Eclipse Core
+#.project
+# JDT-specific (Eclipse Java Development Tools)
+#.classpath
+
+
+### ------------------------ JetBrains.gitignore ----------------------- ###
+
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+ .idea/artifacts
+ .idea/compiler.xml
+ .idea/jarRepositories.xml
+ .idea/modules.xml
+ .idea/*.iml
+ .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+#*.iws
+
+# IntelliJ
+#out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+
+### ------------------------- Xcode.gitignore -------------------------- ###
+
+# Xcode
+#
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## User settings
+xcuserdata/
+
+## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
+*.xcscmblueprint
+*.xccheckout
+
+## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
+#build/
+DerivedData/
+*.moved-aside
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+
+## Gcc Patch
+/*.gcno
+
+
+### -------------------- VisualStudioCode.gitignore ------------------- ###
+
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+!.vscode/*.code-snippets
+
+# Local History for Visual Studio Code
+.history/
+
+# Built Visual Studio Code Extensions
+*.vsix
+
+
+### ----------------------- SublimeText.gitignore ---------------------- ###
+
+# Cache files for Sublime Text
+*.tmlanguage.cache
+*.tmPreferences.cache
+*.stTheme.cache
+
+# Workspace files are user-specific
+*.sublime-workspace
+
+# Project files should be checked into the repository, unless a significant
+# proportion of contributors will probably not be using Sublime Text
+# *.sublime-project
+
+# SFTP configuration file
+sftp-config.json
+sftp-config-alt*.json
+
+# Package control specific files
+Package Control.last-run
+Package Control.ca-list
+Package Control.ca-bundle
+Package Control.system-ca-bundle
+Package Control.cache/
+Package Control.ca-certs/
+Package Control.merged-ca-bundle
+Package Control.user-ca-bundle
+oscrypto-ca-bundle.crt
+bh_unicode_properties.cache
+
+# Sublime-github package stores a github token in this file
+# https://packagecontrol.io/packages/sublime-github
+GitHub.sublime-settings
+
+
+### -------------------------- Emacs.gitignore ------------------------- ###
+
+# -*- mode: gitignore; -*-
+#*~
+\#*\#
+/.emacs.desktop
+/.emacs.desktop.lock
+*.elc
+auto-save-list
+tramp
+.\#*
+
+# Org-mode
+.org-id-locations
+*_archive
+
+# flymake-mode
+*_flymake.*
+
+# eshell files
+/eshell/history
+/eshell/lastdir
+
+# elpa packages
+/elpa/
+
+# reftex files
+*.rel
+
+# AUCTeX auto folder
+/auto/
+
+# cask packages
+.cask/
+dist/
+
+# Flycheck
+flycheck_*.el
+
+# server auth directory
+/server/
+
+# projectiles files
+.projectile
+
+# directory configuration
+.dir-locals.el
+
+# network security
+/network-security.data
+
+
+### -------------------------- Vim.gitignore -------------------------- ###
+
+# Swap
+[._]*.s[a-v][a-z]
+!*.svg # comment out if you don't need vector files
+[._]*.sw[a-p]
+[._]s[a-rt-v][a-z]
+[._]ss[a-gi-z]
+[._]sw[a-p]
+
+# Session
+Session.vim
+Sessionx.vim
+
+# Temporary
+.netrwhist
+#*~
+# Auto-generated tag files
+tags
+# Persistent undo
+[._]*.un~
+
+
+### ------------------------ Windows.gitignore ------------------------ ###
+
+# Windows thumbnail cache files
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+
+### ------------------------- macOS.gitignore -------------------------- ###
+
+# General
+#.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+
+### -------------------------- Linux.gitignore ------------------------- ###
+
+*~
+
+# temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# .nfs files are created when an open file is removed but is still being accessed
+.nfs*
+
+
+### ------------------------ Archives.gitignore ------------------------ ###
+
+# It's better to unpack these files and commit the raw source because
+# git has its own built in compression methods.
+*.7z
+*.jar
+*.rar
+*.zip
+*.gz
+*.gzip
+*.tgz
+*.bzip
+*.bzip2
+*.bz2
+*.xz
+*.lzma
+#*.cab
+*.xar
+
+# Packing-only formats
+*.iso
+*.tar
+
+# Package management formats
+*.dmg
+*.xpi
+*.gem
+*.egg
+*.deb
+*.rpm
+#*.msi
+#*.msm
+#*.msp
+*.txz
+
+
+### ------------------------- Backup.gitignore ------------------------- ###
+
+*.bak
+*.gho
+*.ori
+*.orig
+*.tmp
+
+
+### -------------------------- JEnv.gitignore -------------------------- ###
+
+# JEnv local Java version configuration file
+.java-version
+
+# Used by previous versions of JEnv
+.jenv-version
+
+
+### ------------------------- Project Specific ------------------------- ###
+
+# Include any specific files here.
+
+
+### ---------------------------- References ---------------------------- ###
+
+# Flutter - https://github.com/flutter/flutter/blob/master/.gitignore
+# Dart - https://github.com/github/gitignore/blob/main/Dart.gitignore
+# Swift - https://github.com/github/gitignore/blob/main/Swift.gitignore
+# Java - https://github.com/github/gitignore/blob/main/Java.gitignore
+# Kotlin - https://github.com/JetBrains/kotlin/blob/master/.gitignore
+# Android - https://github.com/github/gitignore/blob/main/Android.gitignore
+# Gradle - https://github.com/github/gitignore/blob/main/Gradle.gitignore
+# Maven - https://github.com/github/gitignore/blob/main/Maven.gitignore
+
+# JetBrains - https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# Xcode - https://github.com/github/gitignore/blob/main/Global/Xcode.gitignore
+# VisualStudioCode - https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
+# SublimeText - https://github.com/github/gitignore/blob/main/Global/SublimeText.gitignore
+# Emacs - https://github.com/github/gitignore/blob/main/Global/Emacs.gitignore
+# Vim - https://github.com/github/gitignore/blob/main/Global/Vim.gitignore
+
+# Windows - https://github.com/github/gitignore/blob/main/Global/Windows.gitignore
+# macOS - https://github.com/github/gitignore/blob/main/Global/macOS.gitignore
+# Linux - https://github.com/github/gitignore/blob/main/Global/Linux.gitignore
+
+# Archives - https://github.com/github/gitignore/blob/main/Global/Archives.gitignore
+# Backup - https://github.com/github/gitignore/blob/main/Global/Backup.gitignore
+# JEnv - https://github.com/github/gitignore/blob/main/Global/JEnv.gitignore
\ No newline at end of file
diff --git a/frontend/app/.metadata b/frontend/app/.metadata
new file mode 100644
index 0000000..acfc1cf
--- /dev/null
+++ b/frontend/app/.metadata
@@ -0,0 +1,45 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: "6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ - platform: android
+ create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ - platform: ios
+ create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ - platform: linux
+ create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ - platform: macos
+ create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ - platform: web
+ create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ - platform: windows
+ create_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+ base_revision: 6c4930c4ac86fb286f30e31d0ec8bffbcbb9953e
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/frontend/app/README.md b/frontend/app/README.md
new file mode 100644
index 0000000..b73cfb0
--- /dev/null
+++ b/frontend/app/README.md
@@ -0,0 +1,16 @@
+# app
+
+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/frontend/app/analysis_options.yaml b/frontend/app/analysis_options.yaml
new file mode 100644
index 0000000..0d29021
--- /dev/null
+++ b/frontend/app/analysis_options.yaml
@@ -0,0 +1,28 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+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.
+ #
+ # 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
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ 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/frontend/app/android/.gitignore b/frontend/app/android/.gitignore
new file mode 100644
index 0000000..6f56801
--- /dev/null
+++ b/frontend/app/android/.gitignore
@@ -0,0 +1,13 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
+**/*.keystore
+**/*.jks
diff --git a/frontend/app/android/app/build.gradle b/frontend/app/android/app/build.gradle
new file mode 100644
index 0000000..d6f6037
--- /dev/null
+++ b/frontend/app/android/app/build.gradle
@@ -0,0 +1,67 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ id "dev.flutter.flutter-gradle-plugin"
+}
+
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+android {
+ namespace "com.example.app"
+ compileSdkVersion flutter.compileSdkVersion
+ ndkVersion flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId "com.example.app"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
+ minSdkVersion flutter.minSdkVersion
+ targetSdkVersion flutter.targetSdkVersion
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ }
+
+ buildTypes {
+ release {
+ // TODO: Add your own signing config for the release build.
+ // Signing with the debug keys for now, so `flutter run --release` works.
+ signingConfig signingConfigs.debug
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {}
diff --git a/frontend/app/android/app/src/debug/AndroidManifest.xml b/frontend/app/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..399f698
--- /dev/null
+++ b/frontend/app/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/frontend/app/android/app/src/main/AndroidManifest.xml b/frontend/app/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e8847cc
--- /dev/null
+++ b/frontend/app/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/app/android/app/src/main/kotlin/com/example/app/MainActivity.kt b/frontend/app/android/app/src/main/kotlin/com/example/app/MainActivity.kt
new file mode 100644
index 0000000..461fcfb
--- /dev/null
+++ b/frontend/app/android/app/src/main/kotlin/com/example/app/MainActivity.kt
@@ -0,0 +1,6 @@
+package com.example.app
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+}
diff --git a/frontend/app/android/app/src/main/res/drawable-v21/launch_background.xml b/frontend/app/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 0000000..f74085f
--- /dev/null
+++ b/frontend/app/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/frontend/app/android/app/src/main/res/drawable/launch_background.xml b/frontend/app/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 0000000..304732f
--- /dev/null
+++ b/frontend/app/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/frontend/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..db77bb4
Binary files /dev/null and b/frontend/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/frontend/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/frontend/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..17987b7
Binary files /dev/null and b/frontend/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/frontend/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/frontend/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..09d4391
Binary files /dev/null and b/frontend/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/frontend/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..d5f1c8d
Binary files /dev/null and b/frontend/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/frontend/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/frontend/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..4d6372e
Binary files /dev/null and b/frontend/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/frontend/app/android/app/src/main/res/values-night/styles.xml b/frontend/app/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 0000000..06952be
--- /dev/null
+++ b/frontend/app/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/frontend/app/android/app/src/main/res/values/styles.xml b/frontend/app/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..cb1ef88
--- /dev/null
+++ b/frontend/app/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/frontend/app/android/app/src/profile/AndroidManifest.xml b/frontend/app/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 0000000..399f698
--- /dev/null
+++ b/frontend/app/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/frontend/app/android/build.gradle b/frontend/app/android/build.gradle
new file mode 100644
index 0000000..f7eb7f6
--- /dev/null
+++ b/frontend/app/android/build.gradle
@@ -0,0 +1,31 @@
+buildscript {
+ ext.kotlin_version = '1.7.10'
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:7.3.0'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+tasks.register("clean", Delete) {
+ delete rootProject.buildDir
+}
diff --git a/frontend/app/android/gradle.properties b/frontend/app/android/gradle.properties
new file mode 100644
index 0000000..94adc3a
--- /dev/null
+++ b/frontend/app/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx1536M
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/frontend/app/android/gradle/wrapper/gradle-wrapper.properties b/frontend/app/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..3c472b9
--- /dev/null
+++ b/frontend/app/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
diff --git a/frontend/app/android/settings.gradle b/frontend/app/android/settings.gradle
new file mode 100644
index 0000000..55c4ca8
--- /dev/null
+++ b/frontend/app/android/settings.gradle
@@ -0,0 +1,20 @@
+pluginManagement {
+ def flutterSdkPath = {
+ def properties = new Properties()
+ file("local.properties").withInputStream { properties.load(it) }
+ def flutterSdkPath = properties.getProperty("flutter.sdk")
+ assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+ return flutterSdkPath
+ }
+ settings.ext.flutterSdkPath = flutterSdkPath()
+
+ includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
+
+ plugins {
+ id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false
+ }
+}
+
+include ":app"
+
+apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/frontend/app/ios/.gitignore b/frontend/app/ios/.gitignore
new file mode 100644
index 0000000..7a7f987
--- /dev/null
+++ b/frontend/app/ios/.gitignore
@@ -0,0 +1,34 @@
+**/dgph
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/ephemeral/
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/frontend/app/ios/Flutter/AppFrameworkInfo.plist b/frontend/app/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 0000000..9625e10
--- /dev/null
+++ b/frontend/app/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 11.0
+
+
diff --git a/frontend/app/ios/Flutter/Debug.xcconfig b/frontend/app/ios/Flutter/Debug.xcconfig
new file mode 100644
index 0000000..592ceee
--- /dev/null
+++ b/frontend/app/ios/Flutter/Debug.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/frontend/app/ios/Flutter/Release.xcconfig b/frontend/app/ios/Flutter/Release.xcconfig
new file mode 100644
index 0000000..592ceee
--- /dev/null
+++ b/frontend/app/ios/Flutter/Release.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/frontend/app/ios/Runner.xcodeproj/project.pbxproj b/frontend/app/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..e806580
--- /dev/null
+++ b/frontend/app/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,614 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 97C146E61CF9000F007C117D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 97C146ED1CF9000F007C117D;
+ remoteInfo = Runner;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 331C8082294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C807B294A618700263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 331C8082294A63A400263BE5 /* RunnerTests */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C8080294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 331C807D294A63A400263BE5 /* Sources */,
+ 331C807E294A63A400263BE5 /* Frameworks */,
+ 331C807F294A63A400263BE5 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 1430;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C8080294A63A400263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 97C146ED1CF9000F007C117D;
+ };
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ 331C8080294A63A400263BE5 /* RunnerTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C807F294A63A400263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C807D294A63A400263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 97C146ED1CF9000F007C117D /* Runner */;
+ targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 331C8088294A63A400263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Debug;
+ };
+ 331C8089294A63A400263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Release;
+ };
+ 331C808A294A63A400263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C8088294A63A400263BE5 /* Debug */,
+ 331C8089294A63A400263BE5 /* Release */,
+ 331C808A294A63A400263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/frontend/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/frontend/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/frontend/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/frontend/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/frontend/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/frontend/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/frontend/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/frontend/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000..87131a0
--- /dev/null
+++ b/frontend/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/app/ios/Runner.xcworkspace/contents.xcworkspacedata b/frontend/app/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..1d526a1
--- /dev/null
+++ b/frontend/app/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/frontend/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/frontend/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/frontend/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/frontend/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/frontend/app/ios/Runner/AppDelegate.swift b/frontend/app/ios/Runner/AppDelegate.swift
new file mode 100644
index 0000000..70693e4
--- /dev/null
+++ b/frontend/app/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..d36b1fa
--- /dev/null
+++ b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images" : [
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-83.5x83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "Icon-App-1024x1024@1x.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 0000000..dc9ada4
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 0000000..7353c41
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 0000000..797d452
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 0000000..6ed2d93
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 0000000..4cd7b00
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 0000000..fe73094
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 0000000..321773c
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 0000000..797d452
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 0000000..502f463
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 0000000..0ec3034
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 0000000..0ec3034
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 0000000..e9f5fea
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 0000000..84ac32a
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000..8953cba
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000..0467bf1
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000..0bedcf2
--- /dev/null
+++ b/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 0000000..89c2725
--- /dev/null
+++ b/frontend/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/frontend/app/ios/Runner/Base.lproj/LaunchScreen.storyboard b/frontend/app/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..f2e259c
--- /dev/null
+++ b/frontend/app/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/app/ios/Runner/Base.lproj/Main.storyboard b/frontend/app/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..f3c2851
--- /dev/null
+++ b/frontend/app/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/app/ios/Runner/Info.plist b/frontend/app/ios/Runner/Info.plist
new file mode 100644
index 0000000..c2e05c5
--- /dev/null
+++ b/frontend/app/ios/Runner/Info.plist
@@ -0,0 +1,49 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ App
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ app
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/frontend/app/ios/Runner/Runner-Bridging-Header.h b/frontend/app/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000..308a2a5
--- /dev/null
+++ b/frontend/app/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/frontend/app/ios/RunnerTests/RunnerTests.swift b/frontend/app/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 0000000..86a7c3b
--- /dev/null
+++ b/frontend/app/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/frontend/app/lib/gapi/client.dart b/frontend/app/lib/gapi/client.dart
new file mode 100644
index 0000000..8ffe047
--- /dev/null
+++ b/frontend/app/lib/gapi/client.dart
@@ -0,0 +1,45 @@
+import 'package:app/pb/rpc_login.pbserver.dart';
+
+import 'package:app/pb/service_df.pbserver.dart';
+
+import 'package:grpc/grpc.dart';
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'package:app/pb/service_df.pb.dart';
+
+class Client {
+ late dfApi stub;
+
+// Future main(List args) async {
+// final channel = ClientChannel('127.0.0.1',
+// port: 8080,
+// options:
+// const ChannelOptions(credentials: ChannelCredentials.insecure()));
+// stub = dfServiceBase(channel,
+// options: CallOptions(timeout: Duration(seconds: 30)));
+// // Run all of the demos in order.
+// try {
+// await runGetFeature();
+// await runListFeatures();
+// await runRecordRoute();
+// await runRouteChat();
+// } catch (e) {
+// print('Caught error: $e');
+// }
+// await channel.shutdown();
+// }
+ // Future login(
+ // $pb.ServerContext ctx, LoginRequest request) async {}
+ // final channel = ClientChannel(
+ // '127.0.0.1',
+ // port: 9090,
+ // options: const ChannelOptions(
+ // credentials: ChannelCredentials.insecure(),
+ // ),
+ // );
+
+ // dfApi stub = dfApi(
+ // channel,
+ // );
+}
diff --git a/frontend/app/lib/main.dart b/frontend/app/lib/main.dart
new file mode 100644
index 0000000..697c294
--- /dev/null
+++ b/frontend/app/lib/main.dart
@@ -0,0 +1,7 @@
+import 'package:flutter/material.dart';
+
+import 'package:app/pages/main_screen.dart';
+
+void main() {
+ runApp(const MainScreen());
+}
diff --git a/frontend/app/lib/pages/main_screen.dart b/frontend/app/lib/pages/main_screen.dart
new file mode 100644
index 0000000..932bc0c
--- /dev/null
+++ b/frontend/app/lib/pages/main_screen.dart
@@ -0,0 +1,16 @@
+import 'package:flutter/material.dart';
+
+class MainScreen extends StatelessWidget {
+ const MainScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return const Scaffold(
+ body: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [],
+ ),
+ );
+ }
+}
diff --git a/frontend/app/lib/pb/account.pb.dart b/frontend/app/lib/pb/account.pb.dart
new file mode 100644
index 0000000..dbf09e2
--- /dev/null
+++ b/frontend/app/lib/pb/account.pb.dart
@@ -0,0 +1,159 @@
+//
+// Generated code. Do not modify.
+// source: account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class Account extends $pb.GeneratedMessage {
+ factory Account({
+ $fixnum.Int64? id,
+ $core.String? email,
+ $core.String? secretKey,
+ $0.Timestamp? emailVerifiedTime,
+ $core.bool? emailVerified,
+ $0.Timestamp? privacyAcceptedDate,
+ $core.int? permissionLevel,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ if (email != null) {
+ $result.email = email;
+ }
+ if (secretKey != null) {
+ $result.secretKey = secretKey;
+ }
+ if (emailVerifiedTime != null) {
+ $result.emailVerifiedTime = emailVerifiedTime;
+ }
+ if (emailVerified != null) {
+ $result.emailVerified = emailVerified;
+ }
+ if (privacyAcceptedDate != null) {
+ $result.privacyAcceptedDate = privacyAcceptedDate;
+ }
+ if (permissionLevel != null) {
+ $result.permissionLevel = permissionLevel;
+ }
+ return $result;
+ }
+ Account._() : super();
+ factory Account.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory Account.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Account', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(2, _omitFieldNames ? '' : 'email')
+ ..aOS(3, _omitFieldNames ? '' : 'secretKey')
+ ..aOM<$0.Timestamp>(9, _omitFieldNames ? '' : 'emailVerifiedTime', subBuilder: $0.Timestamp.create)
+ ..aOB(10, _omitFieldNames ? '' : 'emailVerified')
+ ..aOM<$0.Timestamp>(12, _omitFieldNames ? '' : 'privacyAcceptedDate', subBuilder: $0.Timestamp.create)
+ ..a<$core.int>(13, _omitFieldNames ? '' : 'permissionLevel', $pb.PbFieldType.O3)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ Account clone() => Account()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ Account copyWith(void Function(Account) updates) => super.copyWith((message) => updates(message as Account)) as Account;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static Account create() => Account._();
+ Account createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static Account getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static Account? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.String get email => $_getSZ(1);
+ @$pb.TagNumber(2)
+ set email($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasEmail() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearEmail() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $core.String get secretKey => $_getSZ(2);
+ @$pb.TagNumber(3)
+ set secretKey($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasSecretKey() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearSecretKey() => clearField(3);
+
+ @$pb.TagNumber(9)
+ $0.Timestamp get emailVerifiedTime => $_getN(3);
+ @$pb.TagNumber(9)
+ set emailVerifiedTime($0.Timestamp v) { setField(9, v); }
+ @$pb.TagNumber(9)
+ $core.bool hasEmailVerifiedTime() => $_has(3);
+ @$pb.TagNumber(9)
+ void clearEmailVerifiedTime() => clearField(9);
+ @$pb.TagNumber(9)
+ $0.Timestamp ensureEmailVerifiedTime() => $_ensure(3);
+
+ @$pb.TagNumber(10)
+ $core.bool get emailVerified => $_getBF(4);
+ @$pb.TagNumber(10)
+ set emailVerified($core.bool v) { $_setBool(4, v); }
+ @$pb.TagNumber(10)
+ $core.bool hasEmailVerified() => $_has(4);
+ @$pb.TagNumber(10)
+ void clearEmailVerified() => clearField(10);
+
+ @$pb.TagNumber(12)
+ $0.Timestamp get privacyAcceptedDate => $_getN(5);
+ @$pb.TagNumber(12)
+ set privacyAcceptedDate($0.Timestamp v) { setField(12, v); }
+ @$pb.TagNumber(12)
+ $core.bool hasPrivacyAcceptedDate() => $_has(5);
+ @$pb.TagNumber(12)
+ void clearPrivacyAcceptedDate() => clearField(12);
+ @$pb.TagNumber(12)
+ $0.Timestamp ensurePrivacyAcceptedDate() => $_ensure(5);
+
+ @$pb.TagNumber(13)
+ $core.int get permissionLevel => $_getIZ(6);
+ @$pb.TagNumber(13)
+ set permissionLevel($core.int v) { $_setSignedInt32(6, v); }
+ @$pb.TagNumber(13)
+ $core.bool hasPermissionLevel() => $_has(6);
+ @$pb.TagNumber(13)
+ void clearPermissionLevel() => clearField(13);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/account.pbenum.dart b/frontend/app/lib/pb/account.pbenum.dart
new file mode 100644
index 0000000..3612eb7
--- /dev/null
+++ b/frontend/app/lib/pb/account.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/account.pbjson.dart b/frontend/app/lib/pb/account.pbjson.dart
new file mode 100644
index 0000000..0c3e1fb
--- /dev/null
+++ b/frontend/app/lib/pb/account.pbjson.dart
@@ -0,0 +1,52 @@
+//
+// Generated code. Do not modify.
+// source: account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use accountDescriptor instead')
+const Account$json = {
+ '1': 'Account',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ {'1': 'email', '3': 2, '4': 1, '5': 9, '10': 'email'},
+ {'1': 'secret_key', '3': 3, '4': 1, '5': 9, '9': 0, '10': 'secretKey', '17': true},
+ {'1': 'email_verified_time', '3': 9, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'emailVerifiedTime'},
+ {'1': 'email_verified', '3': 10, '4': 1, '5': 8, '10': 'emailVerified'},
+ {'1': 'privacy_accepted_date', '3': 12, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'privacyAcceptedDate'},
+ {'1': 'permission_level', '3': 13, '4': 1, '5': 5, '8': {}, '10': 'permissionLevel'},
+ ],
+ '7': {},
+ '8': [
+ {'1': '_secret_key'},
+ ],
+};
+
+/// Descriptor for `Account`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List accountDescriptor = $convert.base64Decode(
+ 'CgdBY2NvdW50Eg4KAmlkGAEgASgEUgJpZBIUCgVlbWFpbBgCIAEoCVIFZW1haWwSIgoKc2Vjcm'
+ 'V0X2tleRgDIAEoCUgAUglzZWNyZXRLZXmIAQESZwoTZW1haWxfdmVyaWZpZWRfdGltZRgJIAEo'
+ 'CzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCG5JBGEoWIjIwMjMtMTAtMDVUMDA6MDA6MD'
+ 'BaIlIRZW1haWxWZXJpZmllZFRpbWUSJQoOZW1haWxfdmVyaWZpZWQYCiABKAhSDWVtYWlsVmVy'
+ 'aWZpZWQSawoVcHJpdmFjeV9hY2NlcHRlZF9kYXRlGAwgASgLMhouZ29vZ2xlLnByb3RvYnVmLl'
+ 'RpbWVzdGFtcEIbkkEYShYiMjAyMy0xMC0wNVQwMDowMDowMFoiUhNwcml2YWN5QWNjZXB0ZWRE'
+ 'YXRlEk4KEHBlcm1pc3Npb25fbGV2ZWwYDSABKAVCI5JBIDIeRGVmYXVsdCBpcyAwIChub24tcH'
+ 'JpdmlsZWRnZWQpUg9wZXJtaXNzaW9uTGV2ZWw6vQOSQbkDCgkqB0FjY291bnQyqwN7ImlkIjog'
+ 'IjEiLCJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIsICJmaXJzdG5hbWUiOiAiSm9obi'
+ 'IsICJsYXN0bmFtZSI6ICJEb2UiLCAicGhvbmUiOiAiIiwgInN0cmVldCI6ICJEZWF0aCBTdGFy'
+ 'IDIiLCAiemlwIjogIjA4MTUiLCAiY2l0eSI6ICJOZXcgWW9yayIsICJjb3VudHJ5IjogIlVTQS'
+ 'IsICJiaXJ0aGRheSI6ICIxOTkwLTEwLTA1VDAwOjAwOjAwWiIsICJwcml2YWN5X2FjY2VwdGVk'
+ 'IjogZmFsc2UsICJwcml2YWN5X2FjY2VwdGVkX2RhdGUiOiAiMDAwMS0wMS0wMVQwMDowMDowMF'
+ 'oiLCAiY3JlYXRvciI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIsICJjcmVhdGVkIjogIjIwMjMt'
+ 'MTAtMDVUMDI6MzA6NTNaIiwgImNoYW5nZXIiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iLCAiY2'
+ 'hhbmdlZCI6ICIyMDIzLTEwLTA1VDAyOjMwOjUzWiJ9Qg0KC19zZWNyZXRfa2V5');
+
diff --git a/frontend/app/lib/pb/account.pbserver.dart b/frontend/app/lib/pb/account.pbserver.dart
new file mode 100644
index 0000000..50774a9
--- /dev/null
+++ b/frontend/app/lib/pb/account.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'account.pb.dart';
+
diff --git a/frontend/app/lib/pb/account_info.pb.dart b/frontend/app/lib/pb/account_info.pb.dart
new file mode 100644
index 0000000..38089b9
--- /dev/null
+++ b/frontend/app/lib/pb/account_info.pb.dart
@@ -0,0 +1,289 @@
+//
+// Generated code. Do not modify.
+// source: account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class AccountInfo extends $pb.GeneratedMessage {
+ factory AccountInfo({
+ $fixnum.Int64? accountId,
+ $core.String? firstname,
+ $core.String? lastname,
+ $core.String? street,
+ $core.String? city,
+ $core.String? zip,
+ $core.String? country,
+ $0.Timestamp? birthday,
+ $core.String? phone,
+ $core.bool? privacyAccepted,
+ $0.Timestamp? privacyAcceptedDate,
+ $core.int? permissionLevel,
+ $core.String? creator,
+ $0.Timestamp? created,
+ $core.String? changer,
+ $0.Timestamp? changed,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (firstname != null) {
+ $result.firstname = firstname;
+ }
+ if (lastname != null) {
+ $result.lastname = lastname;
+ }
+ if (street != null) {
+ $result.street = street;
+ }
+ if (city != null) {
+ $result.city = city;
+ }
+ if (zip != null) {
+ $result.zip = zip;
+ }
+ if (country != null) {
+ $result.country = country;
+ }
+ if (birthday != null) {
+ $result.birthday = birthday;
+ }
+ if (phone != null) {
+ $result.phone = phone;
+ }
+ if (privacyAccepted != null) {
+ $result.privacyAccepted = privacyAccepted;
+ }
+ if (privacyAcceptedDate != null) {
+ $result.privacyAcceptedDate = privacyAcceptedDate;
+ }
+ if (permissionLevel != null) {
+ $result.permissionLevel = permissionLevel;
+ }
+ if (creator != null) {
+ $result.creator = creator;
+ }
+ if (created != null) {
+ $result.created = created;
+ }
+ if (changer != null) {
+ $result.changer = changer;
+ }
+ if (changed != null) {
+ $result.changed = changed;
+ }
+ return $result;
+ }
+ AccountInfo._() : super();
+ factory AccountInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory AccountInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'AccountInfo', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(3, _omitFieldNames ? '' : 'firstname')
+ ..aOS(4, _omitFieldNames ? '' : 'lastname')
+ ..aOS(5, _omitFieldNames ? '' : 'street')
+ ..aOS(6, _omitFieldNames ? '' : 'city')
+ ..aOS(7, _omitFieldNames ? '' : 'zip')
+ ..aOS(8, _omitFieldNames ? '' : 'country')
+ ..aOM<$0.Timestamp>(9, _omitFieldNames ? '' : 'birthday', subBuilder: $0.Timestamp.create)
+ ..aOS(10, _omitFieldNames ? '' : 'phone')
+ ..aOB(11, _omitFieldNames ? '' : 'privacyAccepted')
+ ..aOM<$0.Timestamp>(12, _omitFieldNames ? '' : 'privacyAcceptedDate', subBuilder: $0.Timestamp.create)
+ ..a<$core.int>(13, _omitFieldNames ? '' : 'permissionLevel', $pb.PbFieldType.O3)
+ ..aOS(14, _omitFieldNames ? '' : 'creator')
+ ..aOM<$0.Timestamp>(15, _omitFieldNames ? '' : 'created', subBuilder: $0.Timestamp.create)
+ ..aOS(16, _omitFieldNames ? '' : 'changer')
+ ..aOM<$0.Timestamp>(17, _omitFieldNames ? '' : 'changed', subBuilder: $0.Timestamp.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ AccountInfo clone() => AccountInfo()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ AccountInfo copyWith(void Function(AccountInfo) updates) => super.copyWith((message) => updates(message as AccountInfo)) as AccountInfo;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static AccountInfo create() => AccountInfo._();
+ AccountInfo createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static AccountInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static AccountInfo? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+
+ @$pb.TagNumber(3)
+ $core.String get firstname => $_getSZ(1);
+ @$pb.TagNumber(3)
+ set firstname($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasFirstname() => $_has(1);
+ @$pb.TagNumber(3)
+ void clearFirstname() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get lastname => $_getSZ(2);
+ @$pb.TagNumber(4)
+ set lastname($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasLastname() => $_has(2);
+ @$pb.TagNumber(4)
+ void clearLastname() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get street => $_getSZ(3);
+ @$pb.TagNumber(5)
+ set street($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasStreet() => $_has(3);
+ @$pb.TagNumber(5)
+ void clearStreet() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $core.String get city => $_getSZ(4);
+ @$pb.TagNumber(6)
+ set city($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasCity() => $_has(4);
+ @$pb.TagNumber(6)
+ void clearCity() => clearField(6);
+
+ @$pb.TagNumber(7)
+ $core.String get zip => $_getSZ(5);
+ @$pb.TagNumber(7)
+ set zip($core.String v) { $_setString(5, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasZip() => $_has(5);
+ @$pb.TagNumber(7)
+ void clearZip() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $core.String get country => $_getSZ(6);
+ @$pb.TagNumber(8)
+ set country($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasCountry() => $_has(6);
+ @$pb.TagNumber(8)
+ void clearCountry() => clearField(8);
+
+ @$pb.TagNumber(9)
+ $0.Timestamp get birthday => $_getN(7);
+ @$pb.TagNumber(9)
+ set birthday($0.Timestamp v) { setField(9, v); }
+ @$pb.TagNumber(9)
+ $core.bool hasBirthday() => $_has(7);
+ @$pb.TagNumber(9)
+ void clearBirthday() => clearField(9);
+ @$pb.TagNumber(9)
+ $0.Timestamp ensureBirthday() => $_ensure(7);
+
+ @$pb.TagNumber(10)
+ $core.String get phone => $_getSZ(8);
+ @$pb.TagNumber(10)
+ set phone($core.String v) { $_setString(8, v); }
+ @$pb.TagNumber(10)
+ $core.bool hasPhone() => $_has(8);
+ @$pb.TagNumber(10)
+ void clearPhone() => clearField(10);
+
+ @$pb.TagNumber(11)
+ $core.bool get privacyAccepted => $_getBF(9);
+ @$pb.TagNumber(11)
+ set privacyAccepted($core.bool v) { $_setBool(9, v); }
+ @$pb.TagNumber(11)
+ $core.bool hasPrivacyAccepted() => $_has(9);
+ @$pb.TagNumber(11)
+ void clearPrivacyAccepted() => clearField(11);
+
+ @$pb.TagNumber(12)
+ $0.Timestamp get privacyAcceptedDate => $_getN(10);
+ @$pb.TagNumber(12)
+ set privacyAcceptedDate($0.Timestamp v) { setField(12, v); }
+ @$pb.TagNumber(12)
+ $core.bool hasPrivacyAcceptedDate() => $_has(10);
+ @$pb.TagNumber(12)
+ void clearPrivacyAcceptedDate() => clearField(12);
+ @$pb.TagNumber(12)
+ $0.Timestamp ensurePrivacyAcceptedDate() => $_ensure(10);
+
+ @$pb.TagNumber(13)
+ $core.int get permissionLevel => $_getIZ(11);
+ @$pb.TagNumber(13)
+ set permissionLevel($core.int v) { $_setSignedInt32(11, v); }
+ @$pb.TagNumber(13)
+ $core.bool hasPermissionLevel() => $_has(11);
+ @$pb.TagNumber(13)
+ void clearPermissionLevel() => clearField(13);
+
+ @$pb.TagNumber(14)
+ $core.String get creator => $_getSZ(12);
+ @$pb.TagNumber(14)
+ set creator($core.String v) { $_setString(12, v); }
+ @$pb.TagNumber(14)
+ $core.bool hasCreator() => $_has(12);
+ @$pb.TagNumber(14)
+ void clearCreator() => clearField(14);
+
+ @$pb.TagNumber(15)
+ $0.Timestamp get created => $_getN(13);
+ @$pb.TagNumber(15)
+ set created($0.Timestamp v) { setField(15, v); }
+ @$pb.TagNumber(15)
+ $core.bool hasCreated() => $_has(13);
+ @$pb.TagNumber(15)
+ void clearCreated() => clearField(15);
+ @$pb.TagNumber(15)
+ $0.Timestamp ensureCreated() => $_ensure(13);
+
+ @$pb.TagNumber(16)
+ $core.String get changer => $_getSZ(14);
+ @$pb.TagNumber(16)
+ set changer($core.String v) { $_setString(14, v); }
+ @$pb.TagNumber(16)
+ $core.bool hasChanger() => $_has(14);
+ @$pb.TagNumber(16)
+ void clearChanger() => clearField(16);
+
+ @$pb.TagNumber(17)
+ $0.Timestamp get changed => $_getN(15);
+ @$pb.TagNumber(17)
+ set changed($0.Timestamp v) { setField(17, v); }
+ @$pb.TagNumber(17)
+ $core.bool hasChanged() => $_has(15);
+ @$pb.TagNumber(17)
+ void clearChanged() => clearField(17);
+ @$pb.TagNumber(17)
+ $0.Timestamp ensureChanged() => $_ensure(15);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/account_info.pbenum.dart b/frontend/app/lib/pb/account_info.pbenum.dart
new file mode 100644
index 0000000..70cea58
--- /dev/null
+++ b/frontend/app/lib/pb/account_info.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/account_info.pbjson.dart b/frontend/app/lib/pb/account_info.pbjson.dart
new file mode 100644
index 0000000..79b0e54
--- /dev/null
+++ b/frontend/app/lib/pb/account_info.pbjson.dart
@@ -0,0 +1,64 @@
+//
+// Generated code. Do not modify.
+// source: account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use accountInfoDescriptor instead')
+const AccountInfo$json = {
+ '1': 'AccountInfo',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '10': 'accountId'},
+ {'1': 'firstname', '3': 3, '4': 1, '5': 9, '10': 'firstname'},
+ {'1': 'lastname', '3': 4, '4': 1, '5': 9, '10': 'lastname'},
+ {'1': 'street', '3': 5, '4': 1, '5': 9, '10': 'street'},
+ {'1': 'city', '3': 6, '4': 1, '5': 9, '10': 'city'},
+ {'1': 'zip', '3': 7, '4': 1, '5': 9, '10': 'zip'},
+ {'1': 'country', '3': 8, '4': 1, '5': 9, '10': 'country'},
+ {'1': 'birthday', '3': 9, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'birthday'},
+ {'1': 'phone', '3': 10, '4': 1, '5': 9, '10': 'phone'},
+ {'1': 'privacy_accepted', '3': 11, '4': 1, '5': 8, '10': 'privacyAccepted'},
+ {'1': 'privacy_accepted_date', '3': 12, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'privacyAcceptedDate'},
+ {'1': 'permission_level', '3': 13, '4': 1, '5': 5, '8': {}, '10': 'permissionLevel'},
+ {'1': 'creator', '3': 14, '4': 1, '5': 9, '10': 'creator'},
+ {'1': 'created', '3': 15, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'created'},
+ {'1': 'changer', '3': 16, '4': 1, '5': 9, '10': 'changer'},
+ {'1': 'changed', '3': 17, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'changed'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `AccountInfo`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List accountInfoDescriptor = $convert.base64Decode(
+ 'CgtBY2NvdW50SW5mbxIdCgphY2NvdW50X2lkGAEgASgEUglhY2NvdW50SWQSHAoJZmlyc3RuYW'
+ '1lGAMgASgJUglmaXJzdG5hbWUSGgoIbGFzdG5hbWUYBCABKAlSCGxhc3RuYW1lEhYKBnN0cmVl'
+ 'dBgFIAEoCVIGc3RyZWV0EhIKBGNpdHkYBiABKAlSBGNpdHkSEAoDemlwGAcgASgJUgN6aXASGA'
+ 'oHY291bnRyeRgIIAEoCVIHY291bnRyeRJTCghiaXJ0aGRheRgJIAEoCzIaLmdvb2dsZS5wcm90'
+ 'b2J1Zi5UaW1lc3RhbXBCG5JBGEoWIjE5OTAtMTAtMDVUMDA6MDA6MDBaIlIIYmlydGhkYXkSFA'
+ 'oFcGhvbmUYCiABKAlSBXBob25lEikKEHByaXZhY3lfYWNjZXB0ZWQYCyABKAhSD3ByaXZhY3lB'
+ 'Y2NlcHRlZBJrChVwcml2YWN5X2FjY2VwdGVkX2RhdGUYDCABKAsyGi5nb29nbGUucHJvdG9idW'
+ 'YuVGltZXN0YW1wQhuSQRhKFiIyMDIzLTEwLTA1VDAwOjAwOjAwWiJSE3ByaXZhY3lBY2NlcHRl'
+ 'ZERhdGUSTgoQcGVybWlzc2lvbl9sZXZlbBgNIAEoBUIjkkEgMh5EZWZhdWx0IGlzIDAgKG5vbi'
+ '1wcml2aWxlZGdlZClSD3Blcm1pc3Npb25MZXZlbBIYCgdjcmVhdG9yGA4gASgJUgdjcmVhdG9y'
+ 'ElEKB2NyZWF0ZWQYDyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQhuSQRhKFiIyMD'
+ 'IzLTEwLTA1VDAwOjAwOjAwWiJSB2NyZWF0ZWQSGAoHY2hhbmdlchgQIAEoCVIHY2hhbmdlchJR'
+ 'CgdjaGFuZ2VkGBEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIbkkEYShYiMjAyMy'
+ '0xMC0wNVQwMDowMDowMFoiUgdjaGFuZ2VkOqkDkkGlAwoNKgtBY2NvdW50SW5mbzKTA3siYWNj'
+ 'b3VudF9pZCI6ICIxIiwgImZpcnN0bmFtZSI6ICJKb2huIiwgImxhc3RuYW1lIjogIkRvZSIsIC'
+ 'JwaG9uZSI6ICIiLCAic3RyZWV0IjogIkRlYXRoIFN0YXIgMiIsICJ6aXAiOiAiMDgxNSIsICJj'
+ 'aXR5IjogIk5ldyBZb3JrIiwgImNvdW50cnkiOiAiVVNBIiwgImJpcnRoZGF5IjogIjE5OTAtMT'
+ 'AtMDVUMDA6MDA6MDBaIiwgInByaXZhY3lfYWNjZXB0ZWQiOiBmYWxzZSwgInByaXZhY3lfYWNj'
+ 'ZXB0ZWRfZGF0ZSI6ICIwMDAxLTAxLTAxVDAwOjAwOjAwWiIsICJjcmVhdG9yIjogImpvaG4uZG'
+ '9lQGV4YW1wbGUuY29tIiwgImNyZWF0ZWQiOiAiMjAyMy0xMC0wNVQwMjozMDo1M1oiLCAiY2hh'
+ 'bmdlciI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIsICJjaGFuZ2VkIjogIjIwMjMtMTAtMDVUMD'
+ 'I6MzA6NTNaIn0=');
+
diff --git a/frontend/app/lib/pb/account_info.pbserver.dart b/frontend/app/lib/pb/account_info.pbserver.dart
new file mode 100644
index 0000000..0f19252
--- /dev/null
+++ b/frontend/app/lib/pb/account_info.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'account_info.pb.dart';
+
diff --git a/frontend/app/lib/pb/document.pb.dart b/frontend/app/lib/pb/document.pb.dart
new file mode 100644
index 0000000..3aa549b
--- /dev/null
+++ b/frontend/app/lib/pb/document.pb.dart
@@ -0,0 +1,259 @@
+//
+// Generated code. Do not modify.
+// source: document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class Document extends $pb.GeneratedMessage {
+ factory Document({
+ $fixnum.Int64? personId,
+ $fixnum.Int64? mailId,
+ $core.String? name,
+ $core.String? type,
+ $core.String? path,
+ $core.String? url,
+ $core.bool? valid,
+ $core.String? validatedBy,
+ $0.Timestamp? validDate,
+ $core.String? creator,
+ $0.Timestamp? created,
+ $core.String? changer,
+ $0.Timestamp? changed,
+ $fixnum.Int64? id,
+ }) {
+ final $result = create();
+ if (personId != null) {
+ $result.personId = personId;
+ }
+ if (mailId != null) {
+ $result.mailId = mailId;
+ }
+ if (name != null) {
+ $result.name = name;
+ }
+ if (type != null) {
+ $result.type = type;
+ }
+ if (path != null) {
+ $result.path = path;
+ }
+ if (url != null) {
+ $result.url = url;
+ }
+ if (valid != null) {
+ $result.valid = valid;
+ }
+ if (validatedBy != null) {
+ $result.validatedBy = validatedBy;
+ }
+ if (validDate != null) {
+ $result.validDate = validDate;
+ }
+ if (creator != null) {
+ $result.creator = creator;
+ }
+ if (created != null) {
+ $result.created = created;
+ }
+ if (changer != null) {
+ $result.changer = changer;
+ }
+ if (changed != null) {
+ $result.changed = changed;
+ }
+ if (id != null) {
+ $result.id = id;
+ }
+ return $result;
+ }
+ Document._() : super();
+ factory Document.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory Document.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Document', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'personId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'mailId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(3, _omitFieldNames ? '' : 'name')
+ ..aOS(4, _omitFieldNames ? '' : 'type')
+ ..aOS(5, _omitFieldNames ? '' : 'path')
+ ..aOS(6, _omitFieldNames ? '' : 'url')
+ ..aOB(7, _omitFieldNames ? '' : 'valid')
+ ..aOS(8, _omitFieldNames ? '' : 'validatedBy')
+ ..aOM<$0.Timestamp>(9, _omitFieldNames ? '' : 'validDate', subBuilder: $0.Timestamp.create)
+ ..aOS(10, _omitFieldNames ? '' : 'creator')
+ ..aOM<$0.Timestamp>(11, _omitFieldNames ? '' : 'created', subBuilder: $0.Timestamp.create)
+ ..aOS(12, _omitFieldNames ? '' : 'changer')
+ ..aOM<$0.Timestamp>(13, _omitFieldNames ? '' : 'changed', subBuilder: $0.Timestamp.create)
+ ..a<$fixnum.Int64>(14, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ Document clone() => Document()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ Document copyWith(void Function(Document) updates) => super.copyWith((message) => updates(message as Document)) as Document;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static Document create() => Document._();
+ Document createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static Document getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static Document? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get personId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set personId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasPersonId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearPersonId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $fixnum.Int64 get mailId => $_getI64(1);
+ @$pb.TagNumber(2)
+ set mailId($fixnum.Int64 v) { $_setInt64(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasMailId() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearMailId() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $core.String get name => $_getSZ(2);
+ @$pb.TagNumber(3)
+ set name($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasName() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearName() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get type => $_getSZ(3);
+ @$pb.TagNumber(4)
+ set type($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasType() => $_has(3);
+ @$pb.TagNumber(4)
+ void clearType() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get path => $_getSZ(4);
+ @$pb.TagNumber(5)
+ set path($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasPath() => $_has(4);
+ @$pb.TagNumber(5)
+ void clearPath() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $core.String get url => $_getSZ(5);
+ @$pb.TagNumber(6)
+ set url($core.String v) { $_setString(5, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasUrl() => $_has(5);
+ @$pb.TagNumber(6)
+ void clearUrl() => clearField(6);
+
+ @$pb.TagNumber(7)
+ $core.bool get valid => $_getBF(6);
+ @$pb.TagNumber(7)
+ set valid($core.bool v) { $_setBool(6, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasValid() => $_has(6);
+ @$pb.TagNumber(7)
+ void clearValid() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $core.String get validatedBy => $_getSZ(7);
+ @$pb.TagNumber(8)
+ set validatedBy($core.String v) { $_setString(7, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasValidatedBy() => $_has(7);
+ @$pb.TagNumber(8)
+ void clearValidatedBy() => clearField(8);
+
+ @$pb.TagNumber(9)
+ $0.Timestamp get validDate => $_getN(8);
+ @$pb.TagNumber(9)
+ set validDate($0.Timestamp v) { setField(9, v); }
+ @$pb.TagNumber(9)
+ $core.bool hasValidDate() => $_has(8);
+ @$pb.TagNumber(9)
+ void clearValidDate() => clearField(9);
+ @$pb.TagNumber(9)
+ $0.Timestamp ensureValidDate() => $_ensure(8);
+
+ @$pb.TagNumber(10)
+ $core.String get creator => $_getSZ(9);
+ @$pb.TagNumber(10)
+ set creator($core.String v) { $_setString(9, v); }
+ @$pb.TagNumber(10)
+ $core.bool hasCreator() => $_has(9);
+ @$pb.TagNumber(10)
+ void clearCreator() => clearField(10);
+
+ @$pb.TagNumber(11)
+ $0.Timestamp get created => $_getN(10);
+ @$pb.TagNumber(11)
+ set created($0.Timestamp v) { setField(11, v); }
+ @$pb.TagNumber(11)
+ $core.bool hasCreated() => $_has(10);
+ @$pb.TagNumber(11)
+ void clearCreated() => clearField(11);
+ @$pb.TagNumber(11)
+ $0.Timestamp ensureCreated() => $_ensure(10);
+
+ @$pb.TagNumber(12)
+ $core.String get changer => $_getSZ(11);
+ @$pb.TagNumber(12)
+ set changer($core.String v) { $_setString(11, v); }
+ @$pb.TagNumber(12)
+ $core.bool hasChanger() => $_has(11);
+ @$pb.TagNumber(12)
+ void clearChanger() => clearField(12);
+
+ @$pb.TagNumber(13)
+ $0.Timestamp get changed => $_getN(12);
+ @$pb.TagNumber(13)
+ set changed($0.Timestamp v) { setField(13, v); }
+ @$pb.TagNumber(13)
+ $core.bool hasChanged() => $_has(12);
+ @$pb.TagNumber(13)
+ void clearChanged() => clearField(13);
+ @$pb.TagNumber(13)
+ $0.Timestamp ensureChanged() => $_ensure(12);
+
+ @$pb.TagNumber(14)
+ $fixnum.Int64 get id => $_getI64(13);
+ @$pb.TagNumber(14)
+ set id($fixnum.Int64 v) { $_setInt64(13, v); }
+ @$pb.TagNumber(14)
+ $core.bool hasId() => $_has(13);
+ @$pb.TagNumber(14)
+ void clearId() => clearField(14);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/document.pbenum.dart b/frontend/app/lib/pb/document.pbenum.dart
new file mode 100644
index 0000000..64c9c9d
--- /dev/null
+++ b/frontend/app/lib/pb/document.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/document.pbjson.dart b/frontend/app/lib/pb/document.pbjson.dart
new file mode 100644
index 0000000..98d8737
--- /dev/null
+++ b/frontend/app/lib/pb/document.pbjson.dart
@@ -0,0 +1,55 @@
+//
+// Generated code. Do not modify.
+// source: document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use documentDescriptor instead')
+const Document$json = {
+ '1': 'Document',
+ '2': [
+ {'1': 'person_id', '3': 1, '4': 1, '5': 4, '9': 0, '10': 'personId', '17': true},
+ {'1': 'mail_id', '3': 2, '4': 1, '5': 4, '9': 1, '10': 'mailId', '17': true},
+ {'1': 'name', '3': 3, '4': 1, '5': 9, '10': 'name'},
+ {'1': 'type', '3': 4, '4': 1, '5': 9, '10': 'type'},
+ {'1': 'path', '3': 5, '4': 1, '5': 9, '10': 'path'},
+ {'1': 'url', '3': 6, '4': 1, '5': 9, '10': 'url'},
+ {'1': 'valid', '3': 7, '4': 1, '5': 8, '10': 'valid'},
+ {'1': 'validated_by', '3': 8, '4': 1, '5': 9, '10': 'validatedBy'},
+ {'1': 'valid_date', '3': 9, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'validDate'},
+ {'1': 'creator', '3': 10, '4': 1, '5': 9, '10': 'creator'},
+ {'1': 'created', '3': 11, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'created'},
+ {'1': 'changer', '3': 12, '4': 1, '5': 9, '10': 'changer'},
+ {'1': 'changed', '3': 13, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'changed'},
+ {'1': 'id', '3': 14, '4': 1, '5': 4, '10': 'id'},
+ ],
+ '7': {},
+ '8': [
+ {'1': '_person_id'},
+ {'1': '_mail_id'},
+ ],
+};
+
+/// Descriptor for `Document`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List documentDescriptor = $convert.base64Decode(
+ 'CghEb2N1bWVudBIgCglwZXJzb25faWQYASABKARIAFIIcGVyc29uSWSIAQESHAoHbWFpbF9pZB'
+ 'gCIAEoBEgBUgZtYWlsSWSIAQESEgoEbmFtZRgDIAEoCVIEbmFtZRISCgR0eXBlGAQgASgJUgR0'
+ 'eXBlEhIKBHBhdGgYBSABKAlSBHBhdGgSEAoDdXJsGAYgASgJUgN1cmwSFAoFdmFsaWQYByABKA'
+ 'hSBXZhbGlkEiEKDHZhbGlkYXRlZF9ieRgIIAEoCVILdmFsaWRhdGVkQnkSVgoKdmFsaWRfZGF0'
+ 'ZRgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCG5JBGEoWIjIwMjMtMTAtMDVUMD'
+ 'A6MDA6MDBaIlIJdmFsaWREYXRlEhgKB2NyZWF0b3IYCiABKAlSB2NyZWF0b3ISUQoHY3JlYXRl'
+ 'ZBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCG5JBGEoWIjIwMjMtMTAtMDVUMD'
+ 'A6MDA6MDBaIlIHY3JlYXRlZBIYCgdjaGFuZ2VyGAwgASgJUgdjaGFuZ2VyElEKB2NoYW5nZWQY'
+ 'DSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQhuSQRhKFiIyMDIzLTEwLTA1VDAwOj'
+ 'AwOjAwWiJSB2NoYW5nZWQSDgoCaWQYDiABKARSAmlkOg+SQQwKCioIRG9jdW1lbnRCDAoKX3Bl'
+ 'cnNvbl9pZEIKCghfbWFpbF9pZA==');
+
diff --git a/frontend/app/lib/pb/document.pbserver.dart b/frontend/app/lib/pb/document.pbserver.dart
new file mode 100644
index 0000000..532039c
--- /dev/null
+++ b/frontend/app/lib/pb/document.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'document.pb.dart';
+
diff --git a/frontend/app/lib/pb/google/protobuf/timestamp.pb.dart b/frontend/app/lib/pb/google/protobuf/timestamp.pb.dart
new file mode 100644
index 0000000..dc49c14
--- /dev/null
+++ b/frontend/app/lib/pb/google/protobuf/timestamp.pb.dart
@@ -0,0 +1,188 @@
+//
+// Generated code. Do not modify.
+// source: timestamp.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin;
+
+/// A Timestamp represents a point in time independent of any time zone or local
+/// calendar, encoded as a count of seconds and fractions of seconds at
+/// nanosecond resolution. The count is relative to an epoch at UTC midnight on
+/// January 1, 1970, in the proleptic Gregorian calendar which extends the
+/// Gregorian calendar backwards to year one.
+///
+/// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+/// second table is needed for interpretation, using a [24-hour linear
+/// smear](https://developers.google.com/time/smear).
+///
+/// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+/// restricting to that range, we ensure that we can convert to and from [RFC
+/// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+///
+/// # Examples
+///
+/// Example 1: Compute Timestamp from POSIX `time()`.
+///
+/// Timestamp timestamp;
+/// timestamp.set_seconds(time(NULL));
+/// timestamp.set_nanos(0);
+///
+/// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
+///
+/// struct timeval tv;
+/// gettimeofday(&tv, NULL);
+///
+/// Timestamp timestamp;
+/// timestamp.set_seconds(tv.tv_sec);
+/// timestamp.set_nanos(tv.tv_usec * 1000);
+///
+/// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
+///
+/// FILETIME ft;
+/// GetSystemTimeAsFileTime(&ft);
+/// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
+///
+/// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
+/// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
+/// Timestamp timestamp;
+/// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
+/// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
+///
+/// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
+///
+/// long millis = System.currentTimeMillis();
+///
+/// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
+/// .setNanos((int) ((millis % 1000) * 1000000)).build();
+///
+/// Example 5: Compute Timestamp from Java `Instant.now()`.
+///
+/// Instant now = Instant.now();
+///
+/// Timestamp timestamp =
+/// Timestamp.newBuilder().setSeconds(now.getEpochSecond())
+/// .setNanos(now.getNano()).build();
+///
+/// Example 6: Compute Timestamp from current time in Python.
+///
+/// timestamp = Timestamp()
+/// timestamp.GetCurrentTime()
+///
+/// # JSON Mapping
+///
+/// In JSON format, the Timestamp type is encoded as a string in the
+/// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
+/// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
+/// where {year} is always expressed using four digits while {month}, {day},
+/// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
+/// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
+/// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
+/// is required. A proto3 JSON serializer should always use UTC (as indicated by
+/// "Z") when printing the Timestamp type and a proto3 JSON parser should be
+/// able to accept both UTC and other timezones (as indicated by an offset).
+///
+/// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
+/// 01:30 UTC on January 15, 2017.
+///
+/// In JavaScript, one can convert a Date object to this format using the
+/// standard
+/// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
+/// method. In Python, a standard `datetime.datetime` object can be converted
+/// to this format using
+/// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
+/// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
+/// the Joda Time's [`ISODateTimeFormat.dateTime()`](
+/// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
+/// ) to obtain a formatter capable of generating timestamps in this format.
+class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin {
+ factory Timestamp({
+ $fixnum.Int64? seconds,
+ $core.int? nanos,
+ }) {
+ final $result = create();
+ if (seconds != null) {
+ $result.seconds = seconds;
+ }
+ if (nanos != null) {
+ $result.nanos = nanos;
+ }
+ return $result;
+ }
+ Timestamp._() : super();
+ factory Timestamp.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory Timestamp.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Timestamp', package: const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), createEmptyInstance: create, toProto3Json: $mixin.TimestampMixin.toProto3JsonHelper, fromProto3Json: $mixin.TimestampMixin.fromProto3JsonHelper)
+ ..aInt64(1, _omitFieldNames ? '' : 'seconds')
+ ..a<$core.int>(2, _omitFieldNames ? '' : 'nanos', $pb.PbFieldType.O3)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ Timestamp clone() => Timestamp()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ Timestamp copyWith(void Function(Timestamp) updates) => super.copyWith((message) => updates(message as Timestamp)) as Timestamp;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static Timestamp create() => Timestamp._();
+ Timestamp createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static Timestamp getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static Timestamp? _defaultInstance;
+
+ /// Represents seconds of UTC time since Unix epoch
+ /// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+ /// 9999-12-31T23:59:59Z inclusive.
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get seconds => $_getI64(0);
+ @$pb.TagNumber(1)
+ set seconds($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasSeconds() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearSeconds() => clearField(1);
+
+ /// Non-negative fractions of a second at nanosecond resolution. Negative
+ /// second values with fractions must still have non-negative nanos values
+ /// that count forward in time. Must be from 0 to 999,999,999
+ /// inclusive.
+ @$pb.TagNumber(2)
+ $core.int get nanos => $_getIZ(1);
+ @$pb.TagNumber(2)
+ set nanos($core.int v) { $_setSignedInt32(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasNanos() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearNanos() => clearField(2);
+ /// Creates a new instance from [dateTime].
+ ///
+ /// Time zone information will not be preserved.
+ static Timestamp fromDateTime($core.DateTime dateTime) {
+ final result = create();
+ $mixin.TimestampMixin.setFromDateTime(result, dateTime);
+ return result;
+ }
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/google/protobuf/timestamp.pbenum.dart b/frontend/app/lib/pb/google/protobuf/timestamp.pbenum.dart
new file mode 100644
index 0000000..d77b416
--- /dev/null
+++ b/frontend/app/lib/pb/google/protobuf/timestamp.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: timestamp.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/google/protobuf/timestamp.pbjson.dart b/frontend/app/lib/pb/google/protobuf/timestamp.pbjson.dart
new file mode 100644
index 0000000..0af4c77
--- /dev/null
+++ b/frontend/app/lib/pb/google/protobuf/timestamp.pbjson.dart
@@ -0,0 +1,29 @@
+//
+// Generated code. Do not modify.
+// source: timestamp.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use timestampDescriptor instead')
+const Timestamp$json = {
+ '1': 'Timestamp',
+ '2': [
+ {'1': 'seconds', '3': 1, '4': 1, '5': 3, '10': 'seconds'},
+ {'1': 'nanos', '3': 2, '4': 1, '5': 5, '10': 'nanos'},
+ ],
+};
+
+/// Descriptor for `Timestamp`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List timestampDescriptor = $convert.base64Decode(
+ 'CglUaW1lc3RhbXASGAoHc2Vjb25kcxgBIAEoA1IHc2Vjb25kcxIUCgVuYW5vcxgCIAEoBVIFbm'
+ 'Fub3M=');
+
diff --git a/frontend/app/lib/pb/google/protobuf/timestamp.proto b/frontend/app/lib/pb/google/protobuf/timestamp.proto
new file mode 100644
index 0000000..d0698db
--- /dev/null
+++ b/frontend/app/lib/pb/google/protobuf/timestamp.proto
@@ -0,0 +1,144 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/timestamppb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "TimestampProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// A Timestamp represents a point in time independent of any time zone or local
+// calendar, encoded as a count of seconds and fractions of seconds at
+// nanosecond resolution. The count is relative to an epoch at UTC midnight on
+// January 1, 1970, in the proleptic Gregorian calendar which extends the
+// Gregorian calendar backwards to year one.
+//
+// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+// second table is needed for interpretation, using a [24-hour linear
+// smear](https://developers.google.com/time/smear).
+//
+// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+// restricting to that range, we ensure that we can convert to and from [RFC
+// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+//
+// # Examples
+//
+// Example 1: Compute Timestamp from POSIX `time()`.
+//
+// Timestamp timestamp;
+// timestamp.set_seconds(time(NULL));
+// timestamp.set_nanos(0);
+//
+// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
+//
+// struct timeval tv;
+// gettimeofday(&tv, NULL);
+//
+// Timestamp timestamp;
+// timestamp.set_seconds(tv.tv_sec);
+// timestamp.set_nanos(tv.tv_usec * 1000);
+//
+// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
+//
+// FILETIME ft;
+// GetSystemTimeAsFileTime(&ft);
+// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
+//
+// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
+// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
+// Timestamp timestamp;
+// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
+// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
+//
+// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
+//
+// long millis = System.currentTimeMillis();
+//
+// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
+// .setNanos((int) ((millis % 1000) * 1000000)).build();
+//
+// Example 5: Compute Timestamp from Java `Instant.now()`.
+//
+// Instant now = Instant.now();
+//
+// Timestamp timestamp =
+// Timestamp.newBuilder().setSeconds(now.getEpochSecond())
+// .setNanos(now.getNano()).build();
+//
+// Example 6: Compute Timestamp from current time in Python.
+//
+// timestamp = Timestamp()
+// timestamp.GetCurrentTime()
+//
+// # JSON Mapping
+//
+// In JSON format, the Timestamp type is encoded as a string in the
+// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
+// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
+// where {year} is always expressed using four digits while {month}, {day},
+// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
+// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
+// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
+// is required. A proto3 JSON serializer should always use UTC (as indicated by
+// "Z") when printing the Timestamp type and a proto3 JSON parser should be
+// able to accept both UTC and other timezones (as indicated by an offset).
+//
+// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
+// 01:30 UTC on January 15, 2017.
+//
+// In JavaScript, one can convert a Date object to this format using the
+// standard
+// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
+// method. In Python, a standard `datetime.datetime` object can be converted
+// to this format using
+// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
+// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
+// the Joda Time's [`ISODateTimeFormat.dateTime()`](
+// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
+// ) to obtain a formatter capable of generating timestamps in this format.
+//
+message Timestamp {
+ // Represents seconds of UTC time since Unix epoch
+ // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+ // 9999-12-31T23:59:59Z inclusive.
+ int64 seconds = 1;
+
+ // Non-negative fractions of a second at nanosecond resolution. Negative
+ // second values with fractions must still have non-negative nanos values
+ // that count forward in time. Must be from 0 to 999,999,999
+ // inclusive.
+ int32 nanos = 2;
+}
\ No newline at end of file
diff --git a/frontend/app/lib/pb/payment.pb.dart b/frontend/app/lib/pb/payment.pb.dart
new file mode 100644
index 0000000..29a550b
--- /dev/null
+++ b/frontend/app/lib/pb/payment.pb.dart
@@ -0,0 +1,257 @@
+//
+// Generated code. Do not modify.
+// source: payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class Payment extends $pb.GeneratedMessage {
+ factory Payment({
+ $fixnum.Int64? id,
+ $fixnum.Int64? accountId,
+ $core.String? paymentCategory,
+ $core.String? bankname,
+ $core.String? iBAN,
+ $core.String? bIC,
+ $core.String? paypalAccount,
+ $core.String? paypalId,
+ $core.String? paymentSystem,
+ $core.String? type,
+ $core.String? creator,
+ $0.Timestamp? created,
+ $core.String? changer,
+ $0.Timestamp? changed,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (paymentCategory != null) {
+ $result.paymentCategory = paymentCategory;
+ }
+ if (bankname != null) {
+ $result.bankname = bankname;
+ }
+ if (iBAN != null) {
+ $result.iBAN = iBAN;
+ }
+ if (bIC != null) {
+ $result.bIC = bIC;
+ }
+ if (paypalAccount != null) {
+ $result.paypalAccount = paypalAccount;
+ }
+ if (paypalId != null) {
+ $result.paypalId = paypalId;
+ }
+ if (paymentSystem != null) {
+ $result.paymentSystem = paymentSystem;
+ }
+ if (type != null) {
+ $result.type = type;
+ }
+ if (creator != null) {
+ $result.creator = creator;
+ }
+ if (created != null) {
+ $result.created = created;
+ }
+ if (changer != null) {
+ $result.changer = changer;
+ }
+ if (changed != null) {
+ $result.changed = changed;
+ }
+ return $result;
+ }
+ Payment._() : super();
+ factory Payment.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory Payment.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Payment', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(3, _omitFieldNames ? '' : 'paymentCategory')
+ ..aOS(4, _omitFieldNames ? '' : 'bankname')
+ ..aOS(5, _omitFieldNames ? '' : 'IBAN', protoName: 'IBAN')
+ ..aOS(6, _omitFieldNames ? '' : 'BIC', protoName: 'BIC')
+ ..aOS(7, _omitFieldNames ? '' : 'paypalAccount')
+ ..aOS(8, _omitFieldNames ? '' : 'paypalId')
+ ..aOS(9, _omitFieldNames ? '' : 'paymentSystem')
+ ..aOS(10, _omitFieldNames ? '' : 'type')
+ ..aOS(11, _omitFieldNames ? '' : 'creator')
+ ..aOM<$0.Timestamp>(12, _omitFieldNames ? '' : 'created', subBuilder: $0.Timestamp.create)
+ ..aOS(13, _omitFieldNames ? '' : 'changer')
+ ..aOM<$0.Timestamp>(14, _omitFieldNames ? '' : 'changed', subBuilder: $0.Timestamp.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ Payment clone() => Payment()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ Payment copyWith(void Function(Payment) updates) => super.copyWith((message) => updates(message as Payment)) as Payment;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static Payment create() => Payment._();
+ Payment createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static Payment getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static Payment? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $fixnum.Int64 get accountId => $_getI64(1);
+ @$pb.TagNumber(2)
+ set accountId($fixnum.Int64 v) { $_setInt64(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasAccountId() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearAccountId() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $core.String get paymentCategory => $_getSZ(2);
+ @$pb.TagNumber(3)
+ set paymentCategory($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasPaymentCategory() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearPaymentCategory() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get bankname => $_getSZ(3);
+ @$pb.TagNumber(4)
+ set bankname($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasBankname() => $_has(3);
+ @$pb.TagNumber(4)
+ void clearBankname() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get iBAN => $_getSZ(4);
+ @$pb.TagNumber(5)
+ set iBAN($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasIBAN() => $_has(4);
+ @$pb.TagNumber(5)
+ void clearIBAN() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $core.String get bIC => $_getSZ(5);
+ @$pb.TagNumber(6)
+ set bIC($core.String v) { $_setString(5, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasBIC() => $_has(5);
+ @$pb.TagNumber(6)
+ void clearBIC() => clearField(6);
+
+ @$pb.TagNumber(7)
+ $core.String get paypalAccount => $_getSZ(6);
+ @$pb.TagNumber(7)
+ set paypalAccount($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasPaypalAccount() => $_has(6);
+ @$pb.TagNumber(7)
+ void clearPaypalAccount() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $core.String get paypalId => $_getSZ(7);
+ @$pb.TagNumber(8)
+ set paypalId($core.String v) { $_setString(7, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasPaypalId() => $_has(7);
+ @$pb.TagNumber(8)
+ void clearPaypalId() => clearField(8);
+
+ @$pb.TagNumber(9)
+ $core.String get paymentSystem => $_getSZ(8);
+ @$pb.TagNumber(9)
+ set paymentSystem($core.String v) { $_setString(8, v); }
+ @$pb.TagNumber(9)
+ $core.bool hasPaymentSystem() => $_has(8);
+ @$pb.TagNumber(9)
+ void clearPaymentSystem() => clearField(9);
+
+ @$pb.TagNumber(10)
+ $core.String get type => $_getSZ(9);
+ @$pb.TagNumber(10)
+ set type($core.String v) { $_setString(9, v); }
+ @$pb.TagNumber(10)
+ $core.bool hasType() => $_has(9);
+ @$pb.TagNumber(10)
+ void clearType() => clearField(10);
+
+ @$pb.TagNumber(11)
+ $core.String get creator => $_getSZ(10);
+ @$pb.TagNumber(11)
+ set creator($core.String v) { $_setString(10, v); }
+ @$pb.TagNumber(11)
+ $core.bool hasCreator() => $_has(10);
+ @$pb.TagNumber(11)
+ void clearCreator() => clearField(11);
+
+ @$pb.TagNumber(12)
+ $0.Timestamp get created => $_getN(11);
+ @$pb.TagNumber(12)
+ set created($0.Timestamp v) { setField(12, v); }
+ @$pb.TagNumber(12)
+ $core.bool hasCreated() => $_has(11);
+ @$pb.TagNumber(12)
+ void clearCreated() => clearField(12);
+ @$pb.TagNumber(12)
+ $0.Timestamp ensureCreated() => $_ensure(11);
+
+ @$pb.TagNumber(13)
+ $core.String get changer => $_getSZ(12);
+ @$pb.TagNumber(13)
+ set changer($core.String v) { $_setString(12, v); }
+ @$pb.TagNumber(13)
+ $core.bool hasChanger() => $_has(12);
+ @$pb.TagNumber(13)
+ void clearChanger() => clearField(13);
+
+ @$pb.TagNumber(14)
+ $0.Timestamp get changed => $_getN(13);
+ @$pb.TagNumber(14)
+ set changed($0.Timestamp v) { setField(14, v); }
+ @$pb.TagNumber(14)
+ $core.bool hasChanged() => $_has(13);
+ @$pb.TagNumber(14)
+ void clearChanged() => clearField(14);
+ @$pb.TagNumber(14)
+ $0.Timestamp ensureChanged() => $_ensure(13);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/payment.pbenum.dart b/frontend/app/lib/pb/payment.pbenum.dart
new file mode 100644
index 0000000..771e456
--- /dev/null
+++ b/frontend/app/lib/pb/payment.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/payment.pbjson.dart b/frontend/app/lib/pb/payment.pbjson.dart
new file mode 100644
index 0000000..8e66d40
--- /dev/null
+++ b/frontend/app/lib/pb/payment.pbjson.dart
@@ -0,0 +1,66 @@
+//
+// Generated code. Do not modify.
+// source: payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use paymentDescriptor instead')
+const Payment$json = {
+ '1': 'Payment',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ {'1': 'account_id', '3': 2, '4': 1, '5': 4, '10': 'accountId'},
+ {'1': 'payment_category', '3': 3, '4': 1, '5': 9, '10': 'paymentCategory'},
+ {'1': 'bankname', '3': 4, '4': 1, '5': 9, '9': 0, '10': 'bankname', '17': true},
+ {'1': 'IBAN', '3': 5, '4': 1, '5': 9, '9': 1, '10': 'IBAN', '17': true},
+ {'1': 'BIC', '3': 6, '4': 1, '5': 9, '9': 2, '10': 'BIC', '17': true},
+ {'1': 'paypal_account', '3': 7, '4': 1, '5': 9, '9': 3, '10': 'paypalAccount', '17': true},
+ {'1': 'paypal_id', '3': 8, '4': 1, '5': 9, '9': 4, '10': 'paypalId', '17': true},
+ {'1': 'payment_system', '3': 9, '4': 1, '5': 9, '9': 5, '10': 'paymentSystem', '17': true},
+ {'1': 'type', '3': 10, '4': 1, '5': 9, '10': 'type'},
+ {'1': 'creator', '3': 11, '4': 1, '5': 9, '10': 'creator'},
+ {'1': 'created', '3': 12, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'created'},
+ {'1': 'changer', '3': 13, '4': 1, '5': 9, '10': 'changer'},
+ {'1': 'changed', '3': 14, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'changed'},
+ ],
+ '7': {},
+ '8': [
+ {'1': '_bankname'},
+ {'1': '_IBAN'},
+ {'1': '_BIC'},
+ {'1': '_paypal_account'},
+ {'1': '_paypal_id'},
+ {'1': '_payment_system'},
+ ],
+};
+
+/// Descriptor for `Payment`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List paymentDescriptor = $convert.base64Decode(
+ 'CgdQYXltZW50Eg4KAmlkGAEgASgEUgJpZBIdCgphY2NvdW50X2lkGAIgASgEUglhY2NvdW50SW'
+ 'QSKQoQcGF5bWVudF9jYXRlZ29yeRgDIAEoCVIPcGF5bWVudENhdGVnb3J5Eh8KCGJhbmtuYW1l'
+ 'GAQgASgJSABSCGJhbmtuYW1liAEBEhcKBElCQU4YBSABKAlIAVIESUJBTogBARIVCgNCSUMYBi'
+ 'ABKAlIAlIDQklDiAEBEioKDnBheXBhbF9hY2NvdW50GAcgASgJSANSDXBheXBhbEFjY291bnSI'
+ 'AQESIAoJcGF5cGFsX2lkGAggASgJSARSCHBheXBhbElkiAEBEioKDnBheW1lbnRfc3lzdGVtGA'
+ 'kgASgJSAVSDXBheW1lbnRTeXN0ZW2IAQESEgoEdHlwZRgKIAEoCVIEdHlwZRIYCgdjcmVhdG9y'
+ 'GAsgASgJUgdjcmVhdG9yElEKB2NyZWF0ZWQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZX'
+ 'N0YW1wQhuSQRhKFiIyMDIzLTEwLTA1VDAwOjAwOjAwWiJSB2NyZWF0ZWQSGAoHY2hhbmdlchgN'
+ 'IAEoCVIHY2hhbmdlchJRCgdjaGFuZ2VkGA4gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdG'
+ 'FtcEIbkkEYShYiMjAyMy0xMC0wNVQwMDowMDowMFoiUgdjaGFuZ2VkOu4CkkHqAgoJKgdQYXlt'
+ 'ZW50MtwCeyJpZCI6ICIxIiwiYWNjb3VudF9pZCI6ICIxIiwgInBheW1lbnRfY2F0ZWdvcnkiOi'
+ 'AiVEJEOiBwYXlwYWwiLCAicGF5cGFsX2FjY291bnQiOiAiam9obi5kb2VAZXhhbXBsZS5jb20i'
+ 'LCAicGF5cGFsX2lkIjogInRoaXMtaXMtYS1wYXlwYWwtaWQiLCAicGF5bWVudF9zeXN0ZW0iOi'
+ 'AiVEJEOiBwYXlwYWwgc3lzdGVtIiwgInR5cGUiOiAiVEJEOiBzb21lIHR5cGUiLCAiY3JlYXRv'
+ 'ciI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIsICJjcmVhdGVkIjogIjIwMjMtMTAtMDVUMDI6Mz'
+ 'A6NTNaIiwgImNoYW5nZXIiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iLCAiY2hhbmdlZCI6ICIy'
+ 'MDIzLTEwLTA1VDAyOjMwOjUzWiJ9QgsKCV9iYW5rbmFtZUIHCgVfSUJBTkIGCgRfQklDQhEKD1'
+ '9wYXlwYWxfYWNjb3VudEIMCgpfcGF5cGFsX2lkQhEKD19wYXltZW50X3N5c3RlbQ==');
+
diff --git a/frontend/app/lib/pb/payment.pbserver.dart b/frontend/app/lib/pb/payment.pbserver.dart
new file mode 100644
index 0000000..da6b450
--- /dev/null
+++ b/frontend/app/lib/pb/payment.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'payment.pb.dart';
+
diff --git a/frontend/app/lib/pb/person.pb.dart b/frontend/app/lib/pb/person.pb.dart
new file mode 100644
index 0000000..62a8d88
--- /dev/null
+++ b/frontend/app/lib/pb/person.pb.dart
@@ -0,0 +1,245 @@
+//
+// Generated code. Do not modify.
+// source: person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class Person extends $pb.GeneratedMessage {
+ factory Person({
+ $fixnum.Int64? id,
+ $fixnum.Int64? accountId,
+ $core.String? firstname,
+ $core.String? lastname,
+ $core.String? street,
+ $core.String? city,
+ $core.String? zip,
+ $core.String? country,
+ $0.Timestamp? birthday,
+ $core.String? creator,
+ $0.Timestamp? created,
+ $core.String? changer,
+ $0.Timestamp? changed,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (firstname != null) {
+ $result.firstname = firstname;
+ }
+ if (lastname != null) {
+ $result.lastname = lastname;
+ }
+ if (street != null) {
+ $result.street = street;
+ }
+ if (city != null) {
+ $result.city = city;
+ }
+ if (zip != null) {
+ $result.zip = zip;
+ }
+ if (country != null) {
+ $result.country = country;
+ }
+ if (birthday != null) {
+ $result.birthday = birthday;
+ }
+ if (creator != null) {
+ $result.creator = creator;
+ }
+ if (created != null) {
+ $result.created = created;
+ }
+ if (changer != null) {
+ $result.changer = changer;
+ }
+ if (changed != null) {
+ $result.changed = changed;
+ }
+ return $result;
+ }
+ Person._() : super();
+ factory Person.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory Person.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Person', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(3, _omitFieldNames ? '' : 'firstname')
+ ..aOS(4, _omitFieldNames ? '' : 'lastname')
+ ..aOS(5, _omitFieldNames ? '' : 'street')
+ ..aOS(6, _omitFieldNames ? '' : 'city')
+ ..aOS(7, _omitFieldNames ? '' : 'zip')
+ ..aOS(8, _omitFieldNames ? '' : 'country')
+ ..aOM<$0.Timestamp>(9, _omitFieldNames ? '' : 'birthday', subBuilder: $0.Timestamp.create)
+ ..aOS(10, _omitFieldNames ? '' : 'creator')
+ ..aOM<$0.Timestamp>(11, _omitFieldNames ? '' : 'created', subBuilder: $0.Timestamp.create)
+ ..aOS(12, _omitFieldNames ? '' : 'changer')
+ ..aOM<$0.Timestamp>(13, _omitFieldNames ? '' : 'changed', subBuilder: $0.Timestamp.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ Person clone() => Person()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ Person copyWith(void Function(Person) updates) => super.copyWith((message) => updates(message as Person)) as Person;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static Person create() => Person._();
+ Person createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static Person getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static Person? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $fixnum.Int64 get accountId => $_getI64(1);
+ @$pb.TagNumber(2)
+ set accountId($fixnum.Int64 v) { $_setInt64(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasAccountId() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearAccountId() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $core.String get firstname => $_getSZ(2);
+ @$pb.TagNumber(3)
+ set firstname($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasFirstname() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearFirstname() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get lastname => $_getSZ(3);
+ @$pb.TagNumber(4)
+ set lastname($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasLastname() => $_has(3);
+ @$pb.TagNumber(4)
+ void clearLastname() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get street => $_getSZ(4);
+ @$pb.TagNumber(5)
+ set street($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasStreet() => $_has(4);
+ @$pb.TagNumber(5)
+ void clearStreet() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $core.String get city => $_getSZ(5);
+ @$pb.TagNumber(6)
+ set city($core.String v) { $_setString(5, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasCity() => $_has(5);
+ @$pb.TagNumber(6)
+ void clearCity() => clearField(6);
+
+ @$pb.TagNumber(7)
+ $core.String get zip => $_getSZ(6);
+ @$pb.TagNumber(7)
+ set zip($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasZip() => $_has(6);
+ @$pb.TagNumber(7)
+ void clearZip() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $core.String get country => $_getSZ(7);
+ @$pb.TagNumber(8)
+ set country($core.String v) { $_setString(7, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasCountry() => $_has(7);
+ @$pb.TagNumber(8)
+ void clearCountry() => clearField(8);
+
+ @$pb.TagNumber(9)
+ $0.Timestamp get birthday => $_getN(8);
+ @$pb.TagNumber(9)
+ set birthday($0.Timestamp v) { setField(9, v); }
+ @$pb.TagNumber(9)
+ $core.bool hasBirthday() => $_has(8);
+ @$pb.TagNumber(9)
+ void clearBirthday() => clearField(9);
+ @$pb.TagNumber(9)
+ $0.Timestamp ensureBirthday() => $_ensure(8);
+
+ @$pb.TagNumber(10)
+ $core.String get creator => $_getSZ(9);
+ @$pb.TagNumber(10)
+ set creator($core.String v) { $_setString(9, v); }
+ @$pb.TagNumber(10)
+ $core.bool hasCreator() => $_has(9);
+ @$pb.TagNumber(10)
+ void clearCreator() => clearField(10);
+
+ @$pb.TagNumber(11)
+ $0.Timestamp get created => $_getN(10);
+ @$pb.TagNumber(11)
+ set created($0.Timestamp v) { setField(11, v); }
+ @$pb.TagNumber(11)
+ $core.bool hasCreated() => $_has(10);
+ @$pb.TagNumber(11)
+ void clearCreated() => clearField(11);
+ @$pb.TagNumber(11)
+ $0.Timestamp ensureCreated() => $_ensure(10);
+
+ @$pb.TagNumber(12)
+ $core.String get changer => $_getSZ(11);
+ @$pb.TagNumber(12)
+ set changer($core.String v) { $_setString(11, v); }
+ @$pb.TagNumber(12)
+ $core.bool hasChanger() => $_has(11);
+ @$pb.TagNumber(12)
+ void clearChanger() => clearField(12);
+
+ @$pb.TagNumber(13)
+ $0.Timestamp get changed => $_getN(12);
+ @$pb.TagNumber(13)
+ set changed($0.Timestamp v) { setField(13, v); }
+ @$pb.TagNumber(13)
+ $core.bool hasChanged() => $_has(12);
+ @$pb.TagNumber(13)
+ void clearChanged() => clearField(13);
+ @$pb.TagNumber(13)
+ $0.Timestamp ensureChanged() => $_ensure(12);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/person.pbenum.dart b/frontend/app/lib/pb/person.pbenum.dart
new file mode 100644
index 0000000..3d2a943
--- /dev/null
+++ b/frontend/app/lib/pb/person.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/person.pbjson.dart b/frontend/app/lib/pb/person.pbjson.dart
new file mode 100644
index 0000000..0594753
--- /dev/null
+++ b/frontend/app/lib/pb/person.pbjson.dart
@@ -0,0 +1,57 @@
+//
+// Generated code. Do not modify.
+// source: person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use personDescriptor instead')
+const Person$json = {
+ '1': 'Person',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ {'1': 'account_id', '3': 2, '4': 1, '5': 4, '10': 'accountId'},
+ {'1': 'firstname', '3': 3, '4': 1, '5': 9, '10': 'firstname'},
+ {'1': 'lastname', '3': 4, '4': 1, '5': 9, '10': 'lastname'},
+ {'1': 'street', '3': 5, '4': 1, '5': 9, '10': 'street'},
+ {'1': 'city', '3': 6, '4': 1, '5': 9, '10': 'city'},
+ {'1': 'zip', '3': 7, '4': 1, '5': 9, '10': 'zip'},
+ {'1': 'country', '3': 8, '4': 1, '5': 9, '10': 'country'},
+ {'1': 'birthday', '3': 9, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'birthday'},
+ {'1': 'creator', '3': 10, '4': 1, '5': 9, '10': 'creator'},
+ {'1': 'created', '3': 11, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'created'},
+ {'1': 'changer', '3': 12, '4': 1, '5': 9, '10': 'changer'},
+ {'1': 'changed', '3': 13, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'changed'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `Person`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List personDescriptor = $convert.base64Decode(
+ 'CgZQZXJzb24SDgoCaWQYASABKARSAmlkEh0KCmFjY291bnRfaWQYAiABKARSCWFjY291bnRJZB'
+ 'IcCglmaXJzdG5hbWUYAyABKAlSCWZpcnN0bmFtZRIaCghsYXN0bmFtZRgEIAEoCVIIbGFzdG5h'
+ 'bWUSFgoGc3RyZWV0GAUgASgJUgZzdHJlZXQSEgoEY2l0eRgGIAEoCVIEY2l0eRIQCgN6aXAYBy'
+ 'ABKAlSA3ppcBIYCgdjb3VudHJ5GAggASgJUgdjb3VudHJ5ElMKCGJpcnRoZGF5GAkgASgLMhou'
+ 'Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIbkkEYShYiMTk5MC0xMC0wNVQwMDowMDowMFoiUg'
+ 'hiaXJ0aGRheRIYCgdjcmVhdG9yGAogASgJUgdjcmVhdG9yElEKB2NyZWF0ZWQYCyABKAsyGi5n'
+ 'b29nbGUucHJvdG9idWYuVGltZXN0YW1wQhuSQRhKFiIyMDIzLTEwLTA1VDAwOjAwOjAwWiJSB2'
+ 'NyZWF0ZWQSGAoHY2hhbmdlchgMIAEoCVIHY2hhbmdlchJRCgdjaGFuZ2VkGA0gASgLMhouZ29v'
+ 'Z2xlLnByb3RvYnVmLlRpbWVzdGFtcEIbkkEYShYiMjAyMy0xMC0wNVQwMDowMDowMFoiUgdjaG'
+ 'FuZ2VkOrwDkkG4AwoIKgZQZXJzb24yqwN7ImlkIjogIjEiLCJlbWFpbCI6ICJqb2huLmRvZUBl'
+ 'eGFtcGxlLmNvbSIsICJmaXJzdG5hbWUiOiAiSm9obiIsICJsYXN0bmFtZSI6ICJEb2UiLCAicG'
+ 'hvbmUiOiAiIiwgInN0cmVldCI6ICJEZWF0aCBTdGFyIDIiLCAiemlwIjogIjA4MTUiLCAiY2l0'
+ 'eSI6ICJOZXcgWW9yayIsICJjb3VudHJ5IjogIlVTQSIsICJiaXJ0aGRheSI6ICIxOTkwLTEwLT'
+ 'A1VDAwOjAwOjAwWiIsICJwcml2YWN5X2FjY2VwdGVkIjogZmFsc2UsICJwcml2YWN5X2FjY2Vw'
+ 'dGVkX2RhdGUiOiAiMDAwMS0wMS0wMVQwMDowMDowMFoiLCAiY3JlYXRvciI6ICJqb2huLmRvZU'
+ 'BleGFtcGxlLmNvbSIsICJjcmVhdGVkIjogIjIwMjMtMTAtMDVUMDI6MzA6NTNaIiwgImNoYW5n'
+ 'ZXIiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iLCAiY2hhbmdlZCI6ICIyMDIzLTEwLTA1VDAyOj'
+ 'MwOjUzWiJ9');
+
diff --git a/frontend/app/lib/pb/person.pbserver.dart b/frontend/app/lib/pb/person.pbserver.dart
new file mode 100644
index 0000000..659fc7a
--- /dev/null
+++ b/frontend/app/lib/pb/person.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'person.pb.dart';
+
diff --git a/frontend/app/lib/pb/returns_log.pb.dart b/frontend/app/lib/pb/returns_log.pb.dart
new file mode 100644
index 0000000..d365d08
--- /dev/null
+++ b/frontend/app/lib/pb/returns_log.pb.dart
@@ -0,0 +1,173 @@
+//
+// Generated code. Do not modify.
+// source: returns_log.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class ReturnsLog extends $pb.GeneratedMessage {
+ factory ReturnsLog({
+ $fixnum.Int64? id,
+ $fixnum.Int64? returnId,
+ $fixnum.Int64? mailId,
+ $core.String? status,
+ $core.String? creator,
+ $0.Timestamp? created,
+ $core.String? changer,
+ $0.Timestamp? changed,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ if (returnId != null) {
+ $result.returnId = returnId;
+ }
+ if (mailId != null) {
+ $result.mailId = mailId;
+ }
+ if (status != null) {
+ $result.status = status;
+ }
+ if (creator != null) {
+ $result.creator = creator;
+ }
+ if (created != null) {
+ $result.created = created;
+ }
+ if (changer != null) {
+ $result.changer = changer;
+ }
+ if (changed != null) {
+ $result.changed = changed;
+ }
+ return $result;
+ }
+ ReturnsLog._() : super();
+ factory ReturnsLog.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ReturnsLog.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ReturnsLog', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'returnId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'mailId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(4, _omitFieldNames ? '' : 'status')
+ ..aOS(5, _omitFieldNames ? '' : 'creator')
+ ..aOM<$0.Timestamp>(6, _omitFieldNames ? '' : 'created', subBuilder: $0.Timestamp.create)
+ ..aOS(7, _omitFieldNames ? '' : 'changer')
+ ..aOM<$0.Timestamp>(8, _omitFieldNames ? '' : 'changed', subBuilder: $0.Timestamp.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ReturnsLog clone() => ReturnsLog()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ReturnsLog copyWith(void Function(ReturnsLog) updates) => super.copyWith((message) => updates(message as ReturnsLog)) as ReturnsLog;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ReturnsLog create() => ReturnsLog._();
+ ReturnsLog createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ReturnsLog getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ReturnsLog? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $fixnum.Int64 get returnId => $_getI64(1);
+ @$pb.TagNumber(2)
+ set returnId($fixnum.Int64 v) { $_setInt64(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasReturnId() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearReturnId() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $fixnum.Int64 get mailId => $_getI64(2);
+ @$pb.TagNumber(3)
+ set mailId($fixnum.Int64 v) { $_setInt64(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasMailId() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearMailId() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get status => $_getSZ(3);
+ @$pb.TagNumber(4)
+ set status($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasStatus() => $_has(3);
+ @$pb.TagNumber(4)
+ void clearStatus() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get creator => $_getSZ(4);
+ @$pb.TagNumber(5)
+ set creator($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasCreator() => $_has(4);
+ @$pb.TagNumber(5)
+ void clearCreator() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $0.Timestamp get created => $_getN(5);
+ @$pb.TagNumber(6)
+ set created($0.Timestamp v) { setField(6, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasCreated() => $_has(5);
+ @$pb.TagNumber(6)
+ void clearCreated() => clearField(6);
+ @$pb.TagNumber(6)
+ $0.Timestamp ensureCreated() => $_ensure(5);
+
+ @$pb.TagNumber(7)
+ $core.String get changer => $_getSZ(6);
+ @$pb.TagNumber(7)
+ set changer($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasChanger() => $_has(6);
+ @$pb.TagNumber(7)
+ void clearChanger() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $0.Timestamp get changed => $_getN(7);
+ @$pb.TagNumber(8)
+ set changed($0.Timestamp v) { setField(8, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasChanged() => $_has(7);
+ @$pb.TagNumber(8)
+ void clearChanged() => clearField(8);
+ @$pb.TagNumber(8)
+ $0.Timestamp ensureChanged() => $_ensure(7);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/returns_log.pbenum.dart b/frontend/app/lib/pb/returns_log.pbenum.dart
new file mode 100644
index 0000000..be0cc3e
--- /dev/null
+++ b/frontend/app/lib/pb/returns_log.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: returns_log.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/returns_log.pbjson.dart b/frontend/app/lib/pb/returns_log.pbjson.dart
new file mode 100644
index 0000000..6dda1c4
--- /dev/null
+++ b/frontend/app/lib/pb/returns_log.pbjson.dart
@@ -0,0 +1,48 @@
+//
+// Generated code. Do not modify.
+// source: returns_log.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use returnsLogDescriptor instead')
+const ReturnsLog$json = {
+ '1': 'ReturnsLog',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ {'1': 'return_id', '3': 2, '4': 1, '5': 4, '10': 'returnId'},
+ {'1': 'mail_id', '3': 3, '4': 1, '5': 4, '10': 'mailId'},
+ {'1': 'status', '3': 4, '4': 1, '5': 9, '10': 'status'},
+ {'1': 'creator', '3': 5, '4': 1, '5': 9, '10': 'creator'},
+ {'1': 'created', '3': 6, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'created'},
+ {'1': 'changer', '3': 7, '4': 1, '5': 9, '10': 'changer'},
+ {'1': 'changed', '3': 8, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'changed'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ReturnsLog`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List returnsLogDescriptor = $convert.base64Decode(
+ 'CgpSZXR1cm5zTG9nEg4KAmlkGAEgASgEUgJpZBIbCglyZXR1cm5faWQYAiABKARSCHJldHVybk'
+ 'lkEhcKB21haWxfaWQYAyABKARSBm1haWxJZBIWCgZzdGF0dXMYBCABKAlSBnN0YXR1cxIYCgdj'
+ 'cmVhdG9yGAUgASgJUgdjcmVhdG9yElEKB2NyZWF0ZWQYBiABKAsyGi5nb29nbGUucHJvdG9idW'
+ 'YuVGltZXN0YW1wQhuSQRhKFiIyMDIzLTEwLTA1VDAwOjAwOjAwWiJSB2NyZWF0ZWQSGAoHY2hh'
+ 'bmdlchgHIAEoCVIHY2hhbmdlchJRCgdjaGFuZ2VkGAggASgLMhouZ29vZ2xlLnByb3RvYnVmLl'
+ 'RpbWVzdGFtcEIbkkEYShYiMjAyMy0xMC0wNVQwMDowMDowMFoiUgdjaGFuZ2VkOsADkkG8AwoM'
+ 'KgpSZXR1cm5zTG9nMqsDeyJpZCI6ICIxIiwiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb2'
+ '0iLCAiZmlyc3RuYW1lIjogIkpvaG4iLCAibGFzdG5hbWUiOiAiRG9lIiwgInBob25lIjogIiIs'
+ 'ICJzdHJlZXQiOiAiRGVhdGggU3RhciAyIiwgInppcCI6ICIwODE1IiwgImNpdHkiOiAiTmV3IF'
+ 'lvcmsiLCAiY291bnRyeSI6ICJVU0EiLCAiYmlydGhkYXkiOiAiMTk5MC0xMC0wNVQwMDowMDow'
+ 'MFoiLCAicHJpdmFjeV9hY2NlcHRlZCI6IGZhbHNlLCAicHJpdmFjeV9hY2NlcHRlZF9kYXRlIj'
+ 'ogIjAwMDEtMDEtMDFUMDA6MDA6MDBaIiwgImNyZWF0b3IiOiAiam9obi5kb2VAZXhhbXBsZS5j'
+ 'b20iLCAiY3JlYXRlZCI6ICIyMDIzLTEwLTA1VDAyOjMwOjUzWiIsICJjaGFuZ2VyIjogImpvaG'
+ '4uZG9lQGV4YW1wbGUuY29tIiwgImNoYW5nZWQiOiAiMjAyMy0xMC0wNVQwMjozMDo1M1oifQ==');
+
diff --git a/frontend/app/lib/pb/returns_log.pbserver.dart b/frontend/app/lib/pb/returns_log.pbserver.dart
new file mode 100644
index 0000000..ca8149a
--- /dev/null
+++ b/frontend/app/lib/pb/returns_log.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: returns_log.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'returns_log.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_block_session.pb.dart b/frontend/app/lib/pb/rpc_block_session.pb.dart
new file mode 100644
index 0000000..e26c2a5
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_block_session.pb.dart
@@ -0,0 +1,132 @@
+//
+// Generated code. Do not modify.
+// source: rpc_block_session.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class BlockSessionRequest extends $pb.GeneratedMessage {
+ factory BlockSessionRequest({
+ $core.String? sessionId,
+ }) {
+ final $result = create();
+ if (sessionId != null) {
+ $result.sessionId = sessionId;
+ }
+ return $result;
+ }
+ BlockSessionRequest._() : super();
+ factory BlockSessionRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory BlockSessionRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BlockSessionRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOS(1, _omitFieldNames ? '' : 'sessionId')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ BlockSessionRequest clone() => BlockSessionRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ BlockSessionRequest copyWith(void Function(BlockSessionRequest) updates) => super.copyWith((message) => updates(message as BlockSessionRequest)) as BlockSessionRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static BlockSessionRequest create() => BlockSessionRequest._();
+ BlockSessionRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static BlockSessionRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static BlockSessionRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.String get sessionId => $_getSZ(0);
+ @$pb.TagNumber(1)
+ set sessionId($core.String v) { $_setString(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasSessionId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearSessionId() => clearField(1);
+}
+
+class BlockSessionResponse extends $pb.GeneratedMessage {
+ factory BlockSessionResponse({
+ $core.String? sessionId,
+ $core.bool? blocked,
+ }) {
+ final $result = create();
+ if (sessionId != null) {
+ $result.sessionId = sessionId;
+ }
+ if (blocked != null) {
+ $result.blocked = blocked;
+ }
+ return $result;
+ }
+ BlockSessionResponse._() : super();
+ factory BlockSessionResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory BlockSessionResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BlockSessionResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOS(1, _omitFieldNames ? '' : 'sessionId')
+ ..aOB(2, _omitFieldNames ? '' : 'blocked')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ BlockSessionResponse clone() => BlockSessionResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ BlockSessionResponse copyWith(void Function(BlockSessionResponse) updates) => super.copyWith((message) => updates(message as BlockSessionResponse)) as BlockSessionResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static BlockSessionResponse create() => BlockSessionResponse._();
+ BlockSessionResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static BlockSessionResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static BlockSessionResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.String get sessionId => $_getSZ(0);
+ @$pb.TagNumber(1)
+ set sessionId($core.String v) { $_setString(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasSessionId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearSessionId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.bool get blocked => $_getBF(1);
+ @$pb.TagNumber(2)
+ set blocked($core.bool v) { $_setBool(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasBlocked() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearBlocked() => clearField(2);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_block_session.pbenum.dart b/frontend/app/lib/pb/rpc_block_session.pbenum.dart
new file mode 100644
index 0000000..aa684ed
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_block_session.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_block_session.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_block_session.pbjson.dart b/frontend/app/lib/pb/rpc_block_session.pbjson.dart
new file mode 100644
index 0000000..6c0074e
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_block_session.pbjson.dart
@@ -0,0 +1,49 @@
+//
+// Generated code. Do not modify.
+// source: rpc_block_session.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use blockSessionRequestDescriptor instead')
+const BlockSessionRequest$json = {
+ '1': 'BlockSessionRequest',
+ '2': [
+ {'1': 'session_id', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'sessionId'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `BlockSessionRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List blockSessionRequestDescriptor = $convert.base64Decode(
+ 'ChNCbG9ja1Nlc3Npb25SZXF1ZXN0ElEKCnNlc3Npb25faWQYASABKAlCMpJBL0omIjVlMWQ2N2'
+ 'RhLTdjOWItNDM2NS1hNGQ1LTNjYzBhMDUxMjQxZSKiAgR1dWlkUglzZXNzaW9uSWQ6apJBZwot'
+ 'Kg1CbG9jayBTZXNzaW9uMg9CbG9jayBhIFNlc3Npb27SAQpzZXNzaW9uX2lkMjZ7InNlc3Npb2'
+ '5faWQiOiAiNWUxZDY3ZGEtN2M5Yi00MzY1LWE0ZDUtM2NjMGEwNTEyNDFlIn0=');
+
+@$core.Deprecated('Use blockSessionResponseDescriptor instead')
+const BlockSessionResponse$json = {
+ '1': 'BlockSessionResponse',
+ '2': [
+ {'1': 'session_id', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'sessionId'},
+ {'1': 'blocked', '3': 2, '4': 1, '5': 8, '8': {}, '10': 'blocked'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `BlockSessionResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List blockSessionResponseDescriptor = $convert.base64Decode(
+ 'ChRCbG9ja1Nlc3Npb25SZXNwb25zZRJRCgpzZXNzaW9uX2lkGAEgASgJQjKSQS9KJiI1ZTFkNj'
+ 'dkYS03YzliLTQzNjUtYTRkNS0zY2MwYTA1MTI0MWUiogIEdXVpZFIJc2Vzc2lvbklkEiMKB2Js'
+ 'b2NrZWQYAiABKAhCCZJBBkoEdHJ1ZVIHYmxvY2tlZDpfkkFcChEqD0Jsb2NrZWQgU2Vzc2lvbj'
+ 'JHeyJzZXNzaW9uX2lkIjogIjVlMWQ2N2RhLTdjOWItNDM2NS1hNGQ1LTNjYzBhMDUxMjQxZSIs'
+ 'ICJibG9ja2VkIjogdHJ1ZX0=');
+
diff --git a/frontend/app/lib/pb/rpc_block_session.pbserver.dart b/frontend/app/lib/pb/rpc_block_session.pbserver.dart
new file mode 100644
index 0000000..57b2eee
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_block_session.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_block_session.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_block_session.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_create_account.pb.dart b/frontend/app/lib/pb/rpc_create_account.pb.dart
new file mode 100644
index 0000000..15e65df
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_account.pb.dart
@@ -0,0 +1,136 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'account.pb.dart' as $2;
+
+class CreateAccountRequest extends $pb.GeneratedMessage {
+ factory CreateAccountRequest({
+ $core.String? email,
+ $core.String? password,
+ }) {
+ final $result = create();
+ if (email != null) {
+ $result.email = email;
+ }
+ if (password != null) {
+ $result.password = password;
+ }
+ return $result;
+ }
+ CreateAccountRequest._() : super();
+ factory CreateAccountRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory CreateAccountRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateAccountRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOS(1, _omitFieldNames ? '' : 'email')
+ ..aOS(2, _omitFieldNames ? '' : 'password')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ CreateAccountRequest clone() => CreateAccountRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ CreateAccountRequest copyWith(void Function(CreateAccountRequest) updates) => super.copyWith((message) => updates(message as CreateAccountRequest)) as CreateAccountRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static CreateAccountRequest create() => CreateAccountRequest._();
+ CreateAccountRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static CreateAccountRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static CreateAccountRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.String get email => $_getSZ(0);
+ @$pb.TagNumber(1)
+ set email($core.String v) { $_setString(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasEmail() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearEmail() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.String get password => $_getSZ(1);
+ @$pb.TagNumber(2)
+ set password($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasPassword() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearPassword() => clearField(2);
+}
+
+class CreateAccountResponse extends $pb.GeneratedMessage {
+ factory CreateAccountResponse({
+ $2.Account? account,
+ }) {
+ final $result = create();
+ if (account != null) {
+ $result.account = account;
+ }
+ return $result;
+ }
+ CreateAccountResponse._() : super();
+ factory CreateAccountResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory CreateAccountResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateAccountResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$2.Account>(1, _omitFieldNames ? '' : 'account', subBuilder: $2.Account.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ CreateAccountResponse clone() => CreateAccountResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ CreateAccountResponse copyWith(void Function(CreateAccountResponse) updates) => super.copyWith((message) => updates(message as CreateAccountResponse)) as CreateAccountResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static CreateAccountResponse create() => CreateAccountResponse._();
+ CreateAccountResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static CreateAccountResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static CreateAccountResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $2.Account get account => $_getN(0);
+ @$pb.TagNumber(1)
+ set account($2.Account v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccount() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccount() => clearField(1);
+ @$pb.TagNumber(1)
+ $2.Account ensureAccount() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_create_account.pbenum.dart b/frontend/app/lib/pb/rpc_create_account.pbenum.dart
new file mode 100644
index 0000000..6e09c97
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_account.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_create_account.pbjson.dart b/frontend/app/lib/pb/rpc_create_account.pbjson.dart
new file mode 100644
index 0000000..3a99698
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_account.pbjson.dart
@@ -0,0 +1,47 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use createAccountRequestDescriptor instead')
+const CreateAccountRequest$json = {
+ '1': 'CreateAccountRequest',
+ '2': [
+ {'1': 'email', '3': 1, '4': 1, '5': 9, '10': 'email'},
+ {'1': 'password', '3': 2, '4': 1, '5': 9, '10': 'password'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `CreateAccountRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List createAccountRequestDescriptor = $convert.base64Decode(
+ 'ChRDcmVhdGVBY2NvdW50UmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSGgoIcGFzc3dvcm'
+ 'QYAiABKAlSCHBhc3N3b3JkOoQBkkGAAQo2Kg5DcmVhdGUgQWNjb3VudDIRQ3JlYXRlIGFuIEFj'
+ 'Y291bnTSAQVlbWFpbNIBCHBhc3N3b3JkMkZ7ImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY2'
+ '9tIiwgInBhc3N3b3JkIjogIk1heVRoZUZvcmNlQmVXaXRoWW91ISJ9');
+
+@$core.Deprecated('Use createAccountResponseDescriptor instead')
+const CreateAccountResponse$json = {
+ '1': 'CreateAccountResponse',
+ '2': [
+ {'1': 'account', '3': 1, '4': 1, '5': 11, '6': '.pb.Account', '8': {}, '10': 'account'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `CreateAccountResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List createAccountResponseDescriptor = $convert.base64Decode(
+ 'ChVDcmVhdGVBY2NvdW50UmVzcG9uc2USKgoHYWNjb3VudBgBIAEoCzILLnBiLkFjY291bnRCA5'
+ 'JBAFIHYWNjb3VudDozkkEwCi4qD0NyZWF0ZWQgQWNjb3VudDIbUmV0dXJucyB0aGUgY3JlYXRl'
+ 'ZCBBY2NvdW50');
+
diff --git a/frontend/app/lib/pb/rpc_create_account.pbserver.dart b/frontend/app/lib/pb/rpc_create_account.pbserver.dart
new file mode 100644
index 0000000..533f0eb
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_account.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_create_account.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_create_account_info.pb.dart b/frontend/app/lib/pb/rpc_create_account_info.pb.dart
new file mode 100644
index 0000000..2ae91f1
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_account_info.pb.dart
@@ -0,0 +1,252 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'account_info.pb.dart' as $1;
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class CreateAccountInfoRequest extends $pb.GeneratedMessage {
+ factory CreateAccountInfoRequest({
+ $fixnum.Int64? accountId,
+ $core.String? firstname,
+ $core.String? lastname,
+ $core.String? street,
+ $core.String? city,
+ $core.String? zip,
+ $core.String? country,
+ $core.String? phone,
+ $0.Timestamp? birthday,
+ $core.bool? privacyAccepted,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (firstname != null) {
+ $result.firstname = firstname;
+ }
+ if (lastname != null) {
+ $result.lastname = lastname;
+ }
+ if (street != null) {
+ $result.street = street;
+ }
+ if (city != null) {
+ $result.city = city;
+ }
+ if (zip != null) {
+ $result.zip = zip;
+ }
+ if (country != null) {
+ $result.country = country;
+ }
+ if (phone != null) {
+ $result.phone = phone;
+ }
+ if (birthday != null) {
+ $result.birthday = birthday;
+ }
+ if (privacyAccepted != null) {
+ $result.privacyAccepted = privacyAccepted;
+ }
+ return $result;
+ }
+ CreateAccountInfoRequest._() : super();
+ factory CreateAccountInfoRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory CreateAccountInfoRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateAccountInfoRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(3, _omitFieldNames ? '' : 'firstname')
+ ..aOS(4, _omitFieldNames ? '' : 'lastname')
+ ..aOS(5, _omitFieldNames ? '' : 'street')
+ ..aOS(6, _omitFieldNames ? '' : 'city')
+ ..aOS(7, _omitFieldNames ? '' : 'zip')
+ ..aOS(8, _omitFieldNames ? '' : 'country')
+ ..aOS(9, _omitFieldNames ? '' : 'phone')
+ ..aOM<$0.Timestamp>(10, _omitFieldNames ? '' : 'birthday', subBuilder: $0.Timestamp.create)
+ ..aOB(11, _omitFieldNames ? '' : 'privacyAccepted')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ CreateAccountInfoRequest clone() => CreateAccountInfoRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ CreateAccountInfoRequest copyWith(void Function(CreateAccountInfoRequest) updates) => super.copyWith((message) => updates(message as CreateAccountInfoRequest)) as CreateAccountInfoRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static CreateAccountInfoRequest create() => CreateAccountInfoRequest._();
+ CreateAccountInfoRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static CreateAccountInfoRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static CreateAccountInfoRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+
+ @$pb.TagNumber(3)
+ $core.String get firstname => $_getSZ(1);
+ @$pb.TagNumber(3)
+ set firstname($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasFirstname() => $_has(1);
+ @$pb.TagNumber(3)
+ void clearFirstname() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get lastname => $_getSZ(2);
+ @$pb.TagNumber(4)
+ set lastname($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasLastname() => $_has(2);
+ @$pb.TagNumber(4)
+ void clearLastname() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get street => $_getSZ(3);
+ @$pb.TagNumber(5)
+ set street($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasStreet() => $_has(3);
+ @$pb.TagNumber(5)
+ void clearStreet() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $core.String get city => $_getSZ(4);
+ @$pb.TagNumber(6)
+ set city($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasCity() => $_has(4);
+ @$pb.TagNumber(6)
+ void clearCity() => clearField(6);
+
+ @$pb.TagNumber(7)
+ $core.String get zip => $_getSZ(5);
+ @$pb.TagNumber(7)
+ set zip($core.String v) { $_setString(5, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasZip() => $_has(5);
+ @$pb.TagNumber(7)
+ void clearZip() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $core.String get country => $_getSZ(6);
+ @$pb.TagNumber(8)
+ set country($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasCountry() => $_has(6);
+ @$pb.TagNumber(8)
+ void clearCountry() => clearField(8);
+
+ @$pb.TagNumber(9)
+ $core.String get phone => $_getSZ(7);
+ @$pb.TagNumber(9)
+ set phone($core.String v) { $_setString(7, v); }
+ @$pb.TagNumber(9)
+ $core.bool hasPhone() => $_has(7);
+ @$pb.TagNumber(9)
+ void clearPhone() => clearField(9);
+
+ @$pb.TagNumber(10)
+ $0.Timestamp get birthday => $_getN(8);
+ @$pb.TagNumber(10)
+ set birthday($0.Timestamp v) { setField(10, v); }
+ @$pb.TagNumber(10)
+ $core.bool hasBirthday() => $_has(8);
+ @$pb.TagNumber(10)
+ void clearBirthday() => clearField(10);
+ @$pb.TagNumber(10)
+ $0.Timestamp ensureBirthday() => $_ensure(8);
+
+ @$pb.TagNumber(11)
+ $core.bool get privacyAccepted => $_getBF(9);
+ @$pb.TagNumber(11)
+ set privacyAccepted($core.bool v) { $_setBool(9, v); }
+ @$pb.TagNumber(11)
+ $core.bool hasPrivacyAccepted() => $_has(9);
+ @$pb.TagNumber(11)
+ void clearPrivacyAccepted() => clearField(11);
+}
+
+class CreateAccountInfoResponse extends $pb.GeneratedMessage {
+ factory CreateAccountInfoResponse({
+ $1.AccountInfo? accountInfo,
+ }) {
+ final $result = create();
+ if (accountInfo != null) {
+ $result.accountInfo = accountInfo;
+ }
+ return $result;
+ }
+ CreateAccountInfoResponse._() : super();
+ factory CreateAccountInfoResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory CreateAccountInfoResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateAccountInfoResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$1.AccountInfo>(1, _omitFieldNames ? '' : 'accountInfo', subBuilder: $1.AccountInfo.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ CreateAccountInfoResponse clone() => CreateAccountInfoResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ CreateAccountInfoResponse copyWith(void Function(CreateAccountInfoResponse) updates) => super.copyWith((message) => updates(message as CreateAccountInfoResponse)) as CreateAccountInfoResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static CreateAccountInfoResponse create() => CreateAccountInfoResponse._();
+ CreateAccountInfoResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static CreateAccountInfoResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static CreateAccountInfoResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $1.AccountInfo get accountInfo => $_getN(0);
+ @$pb.TagNumber(1)
+ set accountInfo($1.AccountInfo v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountInfo() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountInfo() => clearField(1);
+ @$pb.TagNumber(1)
+ $1.AccountInfo ensureAccountInfo() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_create_account_info.pbenum.dart b/frontend/app/lib/pb/rpc_create_account_info.pbenum.dart
new file mode 100644
index 0000000..f60d4eb
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_account_info.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_create_account_info.pbjson.dart b/frontend/app/lib/pb/rpc_create_account_info.pbjson.dart
new file mode 100644
index 0000000..f5ff3e6
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_account_info.pbjson.dart
@@ -0,0 +1,67 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use createAccountInfoRequestDescriptor instead')
+const CreateAccountInfoRequest$json = {
+ '1': 'CreateAccountInfoRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '10': 'accountId'},
+ {'1': 'firstname', '3': 3, '4': 1, '5': 9, '10': 'firstname'},
+ {'1': 'lastname', '3': 4, '4': 1, '5': 9, '10': 'lastname'},
+ {'1': 'street', '3': 5, '4': 1, '5': 9, '10': 'street'},
+ {'1': 'city', '3': 6, '4': 1, '5': 9, '10': 'city'},
+ {'1': 'zip', '3': 7, '4': 1, '5': 9, '10': 'zip'},
+ {'1': 'country', '3': 8, '4': 1, '5': 9, '10': 'country'},
+ {'1': 'phone', '3': 9, '4': 1, '5': 9, '10': 'phone'},
+ {'1': 'birthday', '3': 10, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'birthday'},
+ {'1': 'privacy_accepted', '3': 11, '4': 1, '5': 8, '8': {}, '9': 0, '10': 'privacyAccepted', '17': true},
+ ],
+ '7': {},
+ '8': [
+ {'1': '_privacy_accepted'},
+ ],
+};
+
+/// Descriptor for `CreateAccountInfoRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List createAccountInfoRequestDescriptor = $convert.base64Decode(
+ 'ChhDcmVhdGVBY2NvdW50SW5mb1JlcXVlc3QSHQoKYWNjb3VudF9pZBgBIAEoBFIJYWNjb3VudE'
+ 'lkEhwKCWZpcnN0bmFtZRgDIAEoCVIJZmlyc3RuYW1lEhoKCGxhc3RuYW1lGAQgASgJUghsYXN0'
+ 'bmFtZRIWCgZzdHJlZXQYBSABKAlSBnN0cmVldBISCgRjaXR5GAYgASgJUgRjaXR5EhAKA3ppcB'
+ 'gHIAEoCVIDemlwEhgKB2NvdW50cnkYCCABKAlSB2NvdW50cnkSFAoFcGhvbmUYCSABKAlSBXBo'
+ 'b25lElMKCGJpcnRoZGF5GAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIbkkEYSh'
+ 'YiMTk5MC0xMC0wNVQwMDowMDowMFoiUghiaXJ0aGRheRI5ChBwcml2YWN5X2FjY2VwdGVkGAsg'
+ 'ASgIQgmSQQZKBHRydWVIAFIPcHJpdmFjeUFjY2VwdGVkiAEBOrICkkGuAgp6KhJDcmVhdGUgQW'
+ 'Njb3VudEluZm8yFUNyZWF0ZSBhbiBBY2NvdW50SW5mb9IBCmFjY291bnRfaWTSAQlmaXJzdG5h'
+ 'bWXSAQhsYXN0bmFtZdIBBnN0cmVldNIBBGNpdHnSAQN6aXDSAQdjb3VudHJ50gEIYmlydGhkYX'
+ 'kyrwF7ImFjY291bnRfaWQiOiAiMSIsICJmaXJzdG5hbWUiOiAiSm9obiIsICJsYXN0bmFtZSI6'
+ 'ICJEb2UiLCAic3RyZWV0IjogIk1haW4gU3RyZWV0IDEiLCAiemlwIjogIjA4MTUiLCAiY2l0eS'
+ 'I6ICJOZXcgWW9yayIsICJjb3VudHJ5IjogIlVTQSIsICJiaXJ0aGRheSI6ICIxOTkwLTEwLTA1'
+ 'VDAwOjAwOjAwWiJ9QhMKEV9wcml2YWN5X2FjY2VwdGVk');
+
+@$core.Deprecated('Use createAccountInfoResponseDescriptor instead')
+const CreateAccountInfoResponse$json = {
+ '1': 'CreateAccountInfoResponse',
+ '2': [
+ {'1': 'account_info', '3': 1, '4': 1, '5': 11, '6': '.pb.AccountInfo', '8': {}, '10': 'accountInfo'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `CreateAccountInfoResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List createAccountInfoResponseDescriptor = $convert.base64Decode(
+ 'ChlDcmVhdGVBY2NvdW50SW5mb1Jlc3BvbnNlEjcKDGFjY291bnRfaW5mbxgBIAEoCzIPLnBiLk'
+ 'FjY291bnRJbmZvQgOSQQBSC2FjY291bnRJbmZvOjuSQTgKNioTQ3JlYXRlZCBBY2NvdW50SW5m'
+ 'bzIfUmV0dXJucyB0aGUgY3JlYXRlZCBBY2NvdW50SW5mbw==');
+
diff --git a/frontend/app/lib/pb/rpc_create_account_info.pbserver.dart b/frontend/app/lib/pb/rpc_create_account_info.pbserver.dart
new file mode 100644
index 0000000..36d73df
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_account_info.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_create_account_info.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_create_payment.pb.dart b/frontend/app/lib/pb/rpc_create_payment.pb.dart
new file mode 100644
index 0000000..bed6474
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_payment.pb.dart
@@ -0,0 +1,235 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'payment.pb.dart' as $3;
+
+class CreatePaymentRequest extends $pb.GeneratedMessage {
+ factory CreatePaymentRequest({
+ $fixnum.Int64? accountId,
+ $core.String? paymentCategory,
+ $core.String? bankname,
+ $core.String? iBAN,
+ $core.String? bIC,
+ $core.String? paypalAccount,
+ $core.String? paypalId,
+ $core.String? paymentSystem,
+ $core.String? type,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (paymentCategory != null) {
+ $result.paymentCategory = paymentCategory;
+ }
+ if (bankname != null) {
+ $result.bankname = bankname;
+ }
+ if (iBAN != null) {
+ $result.iBAN = iBAN;
+ }
+ if (bIC != null) {
+ $result.bIC = bIC;
+ }
+ if (paypalAccount != null) {
+ $result.paypalAccount = paypalAccount;
+ }
+ if (paypalId != null) {
+ $result.paypalId = paypalId;
+ }
+ if (paymentSystem != null) {
+ $result.paymentSystem = paymentSystem;
+ }
+ if (type != null) {
+ $result.type = type;
+ }
+ return $result;
+ }
+ CreatePaymentRequest._() : super();
+ factory CreatePaymentRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory CreatePaymentRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreatePaymentRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(2, _omitFieldNames ? '' : 'paymentCategory')
+ ..aOS(3, _omitFieldNames ? '' : 'bankname')
+ ..aOS(4, _omitFieldNames ? '' : 'IBAN', protoName: 'IBAN')
+ ..aOS(5, _omitFieldNames ? '' : 'BIC', protoName: 'BIC')
+ ..aOS(6, _omitFieldNames ? '' : 'paypalAccount')
+ ..aOS(7, _omitFieldNames ? '' : 'paypalId')
+ ..aOS(8, _omitFieldNames ? '' : 'paymentSystem')
+ ..aOS(9, _omitFieldNames ? '' : 'type')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ CreatePaymentRequest clone() => CreatePaymentRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ CreatePaymentRequest copyWith(void Function(CreatePaymentRequest) updates) => super.copyWith((message) => updates(message as CreatePaymentRequest)) as CreatePaymentRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static CreatePaymentRequest create() => CreatePaymentRequest._();
+ CreatePaymentRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static CreatePaymentRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static CreatePaymentRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.String get paymentCategory => $_getSZ(1);
+ @$pb.TagNumber(2)
+ set paymentCategory($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasPaymentCategory() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearPaymentCategory() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $core.String get bankname => $_getSZ(2);
+ @$pb.TagNumber(3)
+ set bankname($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasBankname() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearBankname() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get iBAN => $_getSZ(3);
+ @$pb.TagNumber(4)
+ set iBAN($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasIBAN() => $_has(3);
+ @$pb.TagNumber(4)
+ void clearIBAN() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get bIC => $_getSZ(4);
+ @$pb.TagNumber(5)
+ set bIC($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasBIC() => $_has(4);
+ @$pb.TagNumber(5)
+ void clearBIC() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $core.String get paypalAccount => $_getSZ(5);
+ @$pb.TagNumber(6)
+ set paypalAccount($core.String v) { $_setString(5, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasPaypalAccount() => $_has(5);
+ @$pb.TagNumber(6)
+ void clearPaypalAccount() => clearField(6);
+
+ @$pb.TagNumber(7)
+ $core.String get paypalId => $_getSZ(6);
+ @$pb.TagNumber(7)
+ set paypalId($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasPaypalId() => $_has(6);
+ @$pb.TagNumber(7)
+ void clearPaypalId() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $core.String get paymentSystem => $_getSZ(7);
+ @$pb.TagNumber(8)
+ set paymentSystem($core.String v) { $_setString(7, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasPaymentSystem() => $_has(7);
+ @$pb.TagNumber(8)
+ void clearPaymentSystem() => clearField(8);
+
+ @$pb.TagNumber(9)
+ $core.String get type => $_getSZ(8);
+ @$pb.TagNumber(9)
+ set type($core.String v) { $_setString(8, v); }
+ @$pb.TagNumber(9)
+ $core.bool hasType() => $_has(8);
+ @$pb.TagNumber(9)
+ void clearType() => clearField(9);
+}
+
+class CreatePaymentResponse extends $pb.GeneratedMessage {
+ factory CreatePaymentResponse({
+ $3.Payment? payment,
+ }) {
+ final $result = create();
+ if (payment != null) {
+ $result.payment = payment;
+ }
+ return $result;
+ }
+ CreatePaymentResponse._() : super();
+ factory CreatePaymentResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory CreatePaymentResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreatePaymentResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$3.Payment>(1, _omitFieldNames ? '' : 'payment', subBuilder: $3.Payment.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ CreatePaymentResponse clone() => CreatePaymentResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ CreatePaymentResponse copyWith(void Function(CreatePaymentResponse) updates) => super.copyWith((message) => updates(message as CreatePaymentResponse)) as CreatePaymentResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static CreatePaymentResponse create() => CreatePaymentResponse._();
+ CreatePaymentResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static CreatePaymentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static CreatePaymentResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $3.Payment get payment => $_getN(0);
+ @$pb.TagNumber(1)
+ set payment($3.Payment v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasPayment() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearPayment() => clearField(1);
+ @$pb.TagNumber(1)
+ $3.Payment ensurePayment() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_create_payment.pbenum.dart b/frontend/app/lib/pb/rpc_create_payment.pbenum.dart
new file mode 100644
index 0000000..30d4bb1
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_payment.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_create_payment.pbjson.dart b/frontend/app/lib/pb/rpc_create_payment.pbjson.dart
new file mode 100644
index 0000000..ffe63b1
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_payment.pbjson.dart
@@ -0,0 +1,71 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use createPaymentRequestDescriptor instead')
+const CreatePaymentRequest$json = {
+ '1': 'CreatePaymentRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '10': 'accountId'},
+ {'1': 'payment_category', '3': 2, '4': 1, '5': 9, '10': 'paymentCategory'},
+ {'1': 'bankname', '3': 3, '4': 1, '5': 9, '9': 0, '10': 'bankname', '17': true},
+ {'1': 'IBAN', '3': 4, '4': 1, '5': 9, '9': 1, '10': 'IBAN', '17': true},
+ {'1': 'BIC', '3': 5, '4': 1, '5': 9, '9': 2, '10': 'BIC', '17': true},
+ {'1': 'paypal_account', '3': 6, '4': 1, '5': 9, '9': 3, '10': 'paypalAccount', '17': true},
+ {'1': 'paypal_id', '3': 7, '4': 1, '5': 9, '9': 4, '10': 'paypalId', '17': true},
+ {'1': 'payment_system', '3': 8, '4': 1, '5': 9, '9': 5, '10': 'paymentSystem', '17': true},
+ {'1': 'type', '3': 9, '4': 1, '5': 9, '10': 'type'},
+ ],
+ '7': {},
+ '8': [
+ {'1': '_bankname'},
+ {'1': '_IBAN'},
+ {'1': '_BIC'},
+ {'1': '_paypal_account'},
+ {'1': '_paypal_id'},
+ {'1': '_payment_system'},
+ ],
+};
+
+/// Descriptor for `CreatePaymentRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List createPaymentRequestDescriptor = $convert.base64Decode(
+ 'ChRDcmVhdGVQYXltZW50UmVxdWVzdBIdCgphY2NvdW50X2lkGAEgASgEUglhY2NvdW50SWQSKQ'
+ 'oQcGF5bWVudF9jYXRlZ29yeRgCIAEoCVIPcGF5bWVudENhdGVnb3J5Eh8KCGJhbmtuYW1lGAMg'
+ 'ASgJSABSCGJhbmtuYW1liAEBEhcKBElCQU4YBCABKAlIAVIESUJBTogBARIVCgNCSUMYBSABKA'
+ 'lIAlIDQklDiAEBEioKDnBheXBhbF9hY2NvdW50GAYgASgJSANSDXBheXBhbEFjY291bnSIAQES'
+ 'IAoJcGF5cGFsX2lkGAcgASgJSARSCHBheXBhbElkiAEBEioKDnBheW1lbnRfc3lzdGVtGAggAS'
+ 'gJSAVSDXBheW1lbnRTeXN0ZW2IAQESEgoEdHlwZRgJIAEoCVIEdHlwZTqZApJBlQIKSioOQ3Jl'
+ 'YXRlIFBheW1lbnQyEUNyZWF0ZSBhbiBQYXltZW500gEKYWNjb3VudF9pZNIBEHBheW1lbnRfY2'
+ 'F0ZWdvcnnSAQR0eXBlMsYBeyJhY2NvdW50X2lkIjogIjEiLCAicGF5bWVudF9jYXRlZ29yeSI6'
+ 'ICJUQkQ6IHBheXBhbCIsICJwYXlwYWxfYWNjb3VudCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbS'
+ 'IsICJwYXlwYWxfaWQiOiAidGhpcy1pcy1hLXBheXBhbC1pZCIsICJwYXltZW50X3N5c3RlbSI6'
+ 'ICJUQkQ6IHBheXBhbCBzeXN0ZW0iLCAidHlwZSI6ICJUQkQ6IHNvbWUgdHlwZSJ9QgsKCV9iYW'
+ '5rbmFtZUIHCgVfSUJBTkIGCgRfQklDQhEKD19wYXlwYWxfYWNjb3VudEIMCgpfcGF5cGFsX2lk'
+ 'QhEKD19wYXltZW50X3N5c3RlbQ==');
+
+@$core.Deprecated('Use createPaymentResponseDescriptor instead')
+const CreatePaymentResponse$json = {
+ '1': 'CreatePaymentResponse',
+ '2': [
+ {'1': 'payment', '3': 1, '4': 1, '5': 11, '6': '.pb.Payment', '8': {}, '10': 'payment'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `CreatePaymentResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List createPaymentResponseDescriptor = $convert.base64Decode(
+ 'ChVDcmVhdGVQYXltZW50UmVzcG9uc2USKgoHcGF5bWVudBgBIAEoCzILLnBiLlBheW1lbnRCA5'
+ 'JBAFIHcGF5bWVudDozkkEwCi4qD0NyZWF0ZWQgUGF5bWVudDIbUmV0dXJucyB0aGUgY3JlYXRl'
+ 'ZCBQYXltZW50');
+
diff --git a/frontend/app/lib/pb/rpc_create_payment.pbserver.dart b/frontend/app/lib/pb/rpc_create_payment.pbserver.dart
new file mode 100644
index 0000000..c732f6e
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_payment.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_create_payment.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_create_person.pb.dart b/frontend/app/lib/pb/rpc_create_person.pb.dart
new file mode 100644
index 0000000..35dcb1a
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_person.pb.dart
@@ -0,0 +1,224 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+import 'person.pb.dart' as $4;
+
+class CreatePersonRequest extends $pb.GeneratedMessage {
+ factory CreatePersonRequest({
+ $fixnum.Int64? accountId,
+ $core.String? firstname,
+ $core.String? lastname,
+ $core.String? street,
+ $core.String? city,
+ $core.String? zip,
+ $core.String? country,
+ $0.Timestamp? birthday,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (firstname != null) {
+ $result.firstname = firstname;
+ }
+ if (lastname != null) {
+ $result.lastname = lastname;
+ }
+ if (street != null) {
+ $result.street = street;
+ }
+ if (city != null) {
+ $result.city = city;
+ }
+ if (zip != null) {
+ $result.zip = zip;
+ }
+ if (country != null) {
+ $result.country = country;
+ }
+ if (birthday != null) {
+ $result.birthday = birthday;
+ }
+ return $result;
+ }
+ CreatePersonRequest._() : super();
+ factory CreatePersonRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory CreatePersonRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreatePersonRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(2, _omitFieldNames ? '' : 'firstname')
+ ..aOS(3, _omitFieldNames ? '' : 'lastname')
+ ..aOS(4, _omitFieldNames ? '' : 'street')
+ ..aOS(5, _omitFieldNames ? '' : 'city')
+ ..aOS(6, _omitFieldNames ? '' : 'zip')
+ ..aOS(7, _omitFieldNames ? '' : 'country')
+ ..aOM<$0.Timestamp>(8, _omitFieldNames ? '' : 'birthday', subBuilder: $0.Timestamp.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ CreatePersonRequest clone() => CreatePersonRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ CreatePersonRequest copyWith(void Function(CreatePersonRequest) updates) => super.copyWith((message) => updates(message as CreatePersonRequest)) as CreatePersonRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static CreatePersonRequest create() => CreatePersonRequest._();
+ CreatePersonRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static CreatePersonRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static CreatePersonRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.String get firstname => $_getSZ(1);
+ @$pb.TagNumber(2)
+ set firstname($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasFirstname() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearFirstname() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $core.String get lastname => $_getSZ(2);
+ @$pb.TagNumber(3)
+ set lastname($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasLastname() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearLastname() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get street => $_getSZ(3);
+ @$pb.TagNumber(4)
+ set street($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasStreet() => $_has(3);
+ @$pb.TagNumber(4)
+ void clearStreet() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get city => $_getSZ(4);
+ @$pb.TagNumber(5)
+ set city($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasCity() => $_has(4);
+ @$pb.TagNumber(5)
+ void clearCity() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $core.String get zip => $_getSZ(5);
+ @$pb.TagNumber(6)
+ set zip($core.String v) { $_setString(5, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasZip() => $_has(5);
+ @$pb.TagNumber(6)
+ void clearZip() => clearField(6);
+
+ @$pb.TagNumber(7)
+ $core.String get country => $_getSZ(6);
+ @$pb.TagNumber(7)
+ set country($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasCountry() => $_has(6);
+ @$pb.TagNumber(7)
+ void clearCountry() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $0.Timestamp get birthday => $_getN(7);
+ @$pb.TagNumber(8)
+ set birthday($0.Timestamp v) { setField(8, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasBirthday() => $_has(7);
+ @$pb.TagNumber(8)
+ void clearBirthday() => clearField(8);
+ @$pb.TagNumber(8)
+ $0.Timestamp ensureBirthday() => $_ensure(7);
+}
+
+class CreatePersonResponse extends $pb.GeneratedMessage {
+ factory CreatePersonResponse({
+ $4.Person? person,
+ }) {
+ final $result = create();
+ if (person != null) {
+ $result.person = person;
+ }
+ return $result;
+ }
+ CreatePersonResponse._() : super();
+ factory CreatePersonResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory CreatePersonResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreatePersonResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$4.Person>(1, _omitFieldNames ? '' : 'person', subBuilder: $4.Person.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ CreatePersonResponse clone() => CreatePersonResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ CreatePersonResponse copyWith(void Function(CreatePersonResponse) updates) => super.copyWith((message) => updates(message as CreatePersonResponse)) as CreatePersonResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static CreatePersonResponse create() => CreatePersonResponse._();
+ CreatePersonResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static CreatePersonResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static CreatePersonResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $4.Person get person => $_getN(0);
+ @$pb.TagNumber(1)
+ set person($4.Person v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasPerson() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearPerson() => clearField(1);
+ @$pb.TagNumber(1)
+ $4.Person ensurePerson() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_create_person.pbenum.dart b/frontend/app/lib/pb/rpc_create_person.pbenum.dart
new file mode 100644
index 0000000..3af5c20
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_person.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_create_person.pbjson.dart b/frontend/app/lib/pb/rpc_create_person.pbjson.dart
new file mode 100644
index 0000000..5f7b61b
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_person.pbjson.dart
@@ -0,0 +1,60 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use createPersonRequestDescriptor instead')
+const CreatePersonRequest$json = {
+ '1': 'CreatePersonRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '10': 'accountId'},
+ {'1': 'firstname', '3': 2, '4': 1, '5': 9, '10': 'firstname'},
+ {'1': 'lastname', '3': 3, '4': 1, '5': 9, '10': 'lastname'},
+ {'1': 'street', '3': 4, '4': 1, '5': 9, '10': 'street'},
+ {'1': 'city', '3': 5, '4': 1, '5': 9, '10': 'city'},
+ {'1': 'zip', '3': 6, '4': 1, '5': 9, '10': 'zip'},
+ {'1': 'country', '3': 7, '4': 1, '5': 9, '10': 'country'},
+ {'1': 'birthday', '3': 8, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'birthday'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `CreatePersonRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List createPersonRequestDescriptor = $convert.base64Decode(
+ 'ChNDcmVhdGVQZXJzb25SZXF1ZXN0Eh0KCmFjY291bnRfaWQYASABKARSCWFjY291bnRJZBIcCg'
+ 'lmaXJzdG5hbWUYAiABKAlSCWZpcnN0bmFtZRIaCghsYXN0bmFtZRgDIAEoCVIIbGFzdG5hbWUS'
+ 'FgoGc3RyZWV0GAQgASgJUgZzdHJlZXQSEgoEY2l0eRgFIAEoCVIEY2l0eRIQCgN6aXAYBiABKA'
+ 'lSA3ppcBIYCgdjb3VudHJ5GAcgASgJUgdjb3VudHJ5ElMKCGJpcnRoZGF5GAggASgLMhouZ29v'
+ 'Z2xlLnByb3RvYnVmLlRpbWVzdGFtcEIbkkEYShYiMTk5MC0xMC0wNVQwMDowMDowMFoiUghiaX'
+ 'J0aGRheTqpApJBpQIKcCoNQ3JlYXRlIFBlcnNvbjIQQ3JlYXRlIGFuIFBlcnNvbtIBCmFjY291'
+ 'bnRfaWTSAQlmaXJzdG5hbWXSAQhsYXN0bmFtZdIBBnN0cmVldNIBBGNpdHnSAQN6aXDSAQdjb3'
+ 'VudHJ50gEIYmlydGhkYXkysAF7ICJhY2NvdW50X2lkIjogIjEiLCAiZmlyc3RuYW1lIjogIkpv'
+ 'aG4iLCAibGFzdG5hbWUiOiAiRG9lIiwgInN0cmVldCI6ICJNYWluIFN0cmVldCAxIiwgInppcC'
+ 'I6ICIwODE1IiwgImNpdHkiOiAiTmV3IFlvcmsiLCAiY291bnRyeSI6ICJVU0EiLCAiYmlydGhk'
+ 'YXkiOiAiMTk5MC0xMC0wNVQwMDowMDowMFoifQ==');
+
+@$core.Deprecated('Use createPersonResponseDescriptor instead')
+const CreatePersonResponse$json = {
+ '1': 'CreatePersonResponse',
+ '2': [
+ {'1': 'person', '3': 1, '4': 1, '5': 11, '6': '.pb.Person', '8': {}, '10': 'person'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `CreatePersonResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List createPersonResponseDescriptor = $convert.base64Decode(
+ 'ChRDcmVhdGVQZXJzb25SZXNwb25zZRInCgZwZXJzb24YASABKAsyCi5wYi5QZXJzb25CA5JBAF'
+ 'IGcGVyc29uOjGSQS4KLCoOQ3JlYXRlZCBQZXJzb24yGlJldHVybnMgdGhlIGNyZWF0ZWQgUGVy'
+ 'c29u');
+
diff --git a/frontend/app/lib/pb/rpc_create_person.pbserver.dart b/frontend/app/lib/pb/rpc_create_person.pbserver.dart
new file mode 100644
index 0000000..2b5f8fd
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_create_person.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_create_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_create_person.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_delete_document.pb.dart b/frontend/app/lib/pb/rpc_delete_document.pb.dart
new file mode 100644
index 0000000..b471494
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_document.pb.dart
@@ -0,0 +1,133 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class DeleteDocumentRequest extends $pb.GeneratedMessage {
+ factory DeleteDocumentRequest({
+ $fixnum.Int64? id,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ return $result;
+ }
+ DeleteDocumentRequest._() : super();
+ factory DeleteDocumentRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory DeleteDocumentRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'DeleteDocumentRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ DeleteDocumentRequest clone() => DeleteDocumentRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ DeleteDocumentRequest copyWith(void Function(DeleteDocumentRequest) updates) => super.copyWith((message) => updates(message as DeleteDocumentRequest)) as DeleteDocumentRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static DeleteDocumentRequest create() => DeleteDocumentRequest._();
+ DeleteDocumentRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static DeleteDocumentRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static DeleteDocumentRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+}
+
+class DeleteDocumentResponse extends $pb.GeneratedMessage {
+ factory DeleteDocumentResponse({
+ $fixnum.Int64? id,
+ $core.bool? deleted,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ if (deleted != null) {
+ $result.deleted = deleted;
+ }
+ return $result;
+ }
+ DeleteDocumentResponse._() : super();
+ factory DeleteDocumentResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory DeleteDocumentResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'DeleteDocumentResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOB(2, _omitFieldNames ? '' : 'deleted')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ DeleteDocumentResponse clone() => DeleteDocumentResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ DeleteDocumentResponse copyWith(void Function(DeleteDocumentResponse) updates) => super.copyWith((message) => updates(message as DeleteDocumentResponse)) as DeleteDocumentResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static DeleteDocumentResponse create() => DeleteDocumentResponse._();
+ DeleteDocumentResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static DeleteDocumentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static DeleteDocumentResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.bool get deleted => $_getBF(1);
+ @$pb.TagNumber(2)
+ set deleted($core.bool v) { $_setBool(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasDeleted() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearDeleted() => clearField(2);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_delete_document.pbenum.dart b/frontend/app/lib/pb/rpc_delete_document.pbenum.dart
new file mode 100644
index 0000000..56c8377
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_document.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_delete_document.pbjson.dart b/frontend/app/lib/pb/rpc_delete_document.pbjson.dart
new file mode 100644
index 0000000..35c319c
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_document.pbjson.dart
@@ -0,0 +1,45 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use deleteDocumentRequestDescriptor instead')
+const DeleteDocumentRequest$json = {
+ '1': 'DeleteDocumentRequest',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `DeleteDocumentRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List deleteDocumentRequestDescriptor = $convert.base64Decode(
+ 'ChVEZWxldGVEb2N1bWVudFJlcXVlc3QSDgoCaWQYASABKARSAmlkOjuSQTgKKSoPRGVsZXRlIE'
+ 'RvY3VtZW50MhFEZWxldGUgYSBEb2N1bWVudNIBAmlkMgt7ImlkIjogIjEifQ==');
+
+@$core.Deprecated('Use deleteDocumentResponseDescriptor instead')
+const DeleteDocumentResponse$json = {
+ '1': 'DeleteDocumentResponse',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ {'1': 'deleted', '3': 2, '4': 1, '5': 8, '10': 'deleted'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `DeleteDocumentResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List deleteDocumentResponseDescriptor = $convert.base64Decode(
+ 'ChZEZWxldGVEb2N1bWVudFJlc3BvbnNlEg4KAmlkGAEgASgEUgJpZBIYCgdkZWxldGVkGAIgAS'
+ 'gIUgdkZWxldGVkOj2SQToKGioYRGVsZXRlIERvY3VtZW50IFJlc3BvbnNlMhx7ImlkIjogIjEi'
+ 'LCAiZGVsZXRlZCI6IHRydWV9');
+
diff --git a/frontend/app/lib/pb/rpc_delete_document.pbserver.dart b/frontend/app/lib/pb/rpc_delete_document.pbserver.dart
new file mode 100644
index 0000000..57d37b6
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_document.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_delete_document.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_delete_payment.pb.dart b/frontend/app/lib/pb/rpc_delete_payment.pb.dart
new file mode 100644
index 0000000..62cdcac
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_payment.pb.dart
@@ -0,0 +1,133 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class DeletePaymentRequest extends $pb.GeneratedMessage {
+ factory DeletePaymentRequest({
+ $fixnum.Int64? id,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ return $result;
+ }
+ DeletePaymentRequest._() : super();
+ factory DeletePaymentRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory DeletePaymentRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'DeletePaymentRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ DeletePaymentRequest clone() => DeletePaymentRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ DeletePaymentRequest copyWith(void Function(DeletePaymentRequest) updates) => super.copyWith((message) => updates(message as DeletePaymentRequest)) as DeletePaymentRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static DeletePaymentRequest create() => DeletePaymentRequest._();
+ DeletePaymentRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static DeletePaymentRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static DeletePaymentRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+}
+
+class DeletePaymentResponse extends $pb.GeneratedMessage {
+ factory DeletePaymentResponse({
+ $fixnum.Int64? id,
+ $core.bool? deleted,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ if (deleted != null) {
+ $result.deleted = deleted;
+ }
+ return $result;
+ }
+ DeletePaymentResponse._() : super();
+ factory DeletePaymentResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory DeletePaymentResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'DeletePaymentResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOB(2, _omitFieldNames ? '' : 'deleted')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ DeletePaymentResponse clone() => DeletePaymentResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ DeletePaymentResponse copyWith(void Function(DeletePaymentResponse) updates) => super.copyWith((message) => updates(message as DeletePaymentResponse)) as DeletePaymentResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static DeletePaymentResponse create() => DeletePaymentResponse._();
+ DeletePaymentResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static DeletePaymentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static DeletePaymentResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.bool get deleted => $_getBF(1);
+ @$pb.TagNumber(2)
+ set deleted($core.bool v) { $_setBool(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasDeleted() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearDeleted() => clearField(2);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_delete_payment.pbenum.dart b/frontend/app/lib/pb/rpc_delete_payment.pbenum.dart
new file mode 100644
index 0000000..13f3a74
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_payment.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_delete_payment.pbjson.dart b/frontend/app/lib/pb/rpc_delete_payment.pbjson.dart
new file mode 100644
index 0000000..5571a0f
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_payment.pbjson.dart
@@ -0,0 +1,45 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use deletePaymentRequestDescriptor instead')
+const DeletePaymentRequest$json = {
+ '1': 'DeletePaymentRequest',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `DeletePaymentRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List deletePaymentRequestDescriptor = $convert.base64Decode(
+ 'ChREZWxldGVQYXltZW50UmVxdWVzdBIOCgJpZBgBIAEoBFICaWQ6OZJBNgonKg5EZWxldGUgUG'
+ 'F5bWVudDIQRGVsZXRlIGEgUGF5bWVudNIBAmlkMgt7ImlkIjogIjEifQ==');
+
+@$core.Deprecated('Use deletePaymentResponseDescriptor instead')
+const DeletePaymentResponse$json = {
+ '1': 'DeletePaymentResponse',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ {'1': 'deleted', '3': 2, '4': 1, '5': 8, '10': 'deleted'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `DeletePaymentResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List deletePaymentResponseDescriptor = $convert.base64Decode(
+ 'ChVEZWxldGVQYXltZW50UmVzcG9uc2USDgoCaWQYASABKARSAmlkEhgKB2RlbGV0ZWQYAiABKA'
+ 'hSB2RlbGV0ZWQ6PJJBOQoZKhdEZWxldGUgUGF5bWVudCBSZXNwb25zZTIceyJpZCI6ICIxIiwg'
+ 'ImRlbGV0ZWQiOiB0cnVlfQ==');
+
diff --git a/frontend/app/lib/pb/rpc_delete_payment.pbserver.dart b/frontend/app/lib/pb/rpc_delete_payment.pbserver.dart
new file mode 100644
index 0000000..4e22b6f
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_payment.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_delete_payment.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_delete_person.pb.dart b/frontend/app/lib/pb/rpc_delete_person.pb.dart
new file mode 100644
index 0000000..693d2a0
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_person.pb.dart
@@ -0,0 +1,133 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class DeletePersonRequest extends $pb.GeneratedMessage {
+ factory DeletePersonRequest({
+ $fixnum.Int64? id,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ return $result;
+ }
+ DeletePersonRequest._() : super();
+ factory DeletePersonRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory DeletePersonRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'DeletePersonRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ DeletePersonRequest clone() => DeletePersonRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ DeletePersonRequest copyWith(void Function(DeletePersonRequest) updates) => super.copyWith((message) => updates(message as DeletePersonRequest)) as DeletePersonRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static DeletePersonRequest create() => DeletePersonRequest._();
+ DeletePersonRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static DeletePersonRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static DeletePersonRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+}
+
+class DeletePersonResponse extends $pb.GeneratedMessage {
+ factory DeletePersonResponse({
+ $fixnum.Int64? id,
+ $core.bool? deleted,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ if (deleted != null) {
+ $result.deleted = deleted;
+ }
+ return $result;
+ }
+ DeletePersonResponse._() : super();
+ factory DeletePersonResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory DeletePersonResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'DeletePersonResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOB(2, _omitFieldNames ? '' : 'deleted')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ DeletePersonResponse clone() => DeletePersonResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ DeletePersonResponse copyWith(void Function(DeletePersonResponse) updates) => super.copyWith((message) => updates(message as DeletePersonResponse)) as DeletePersonResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static DeletePersonResponse create() => DeletePersonResponse._();
+ DeletePersonResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static DeletePersonResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static DeletePersonResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.bool get deleted => $_getBF(1);
+ @$pb.TagNumber(2)
+ set deleted($core.bool v) { $_setBool(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasDeleted() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearDeleted() => clearField(2);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_delete_person.pbenum.dart b/frontend/app/lib/pb/rpc_delete_person.pbenum.dart
new file mode 100644
index 0000000..9425fb1
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_person.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_delete_person.pbjson.dart b/frontend/app/lib/pb/rpc_delete_person.pbjson.dart
new file mode 100644
index 0000000..d77eafe
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_person.pbjson.dart
@@ -0,0 +1,45 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use deletePersonRequestDescriptor instead')
+const DeletePersonRequest$json = {
+ '1': 'DeletePersonRequest',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `DeletePersonRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List deletePersonRequestDescriptor = $convert.base64Decode(
+ 'ChNEZWxldGVQZXJzb25SZXF1ZXN0Eg4KAmlkGAEgASgEUgJpZDo3kkE0CiUqDURlbGV0ZSBQZX'
+ 'Jzb24yD0RlbGV0ZSBhIFBlcnNvbtIBAmlkMgt7ImlkIjogIjEifQ==');
+
+@$core.Deprecated('Use deletePersonResponseDescriptor instead')
+const DeletePersonResponse$json = {
+ '1': 'DeletePersonResponse',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ {'1': 'deleted', '3': 2, '4': 1, '5': 8, '10': 'deleted'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `DeletePersonResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List deletePersonResponseDescriptor = $convert.base64Decode(
+ 'ChREZWxldGVQZXJzb25SZXNwb25zZRIOCgJpZBgBIAEoBFICaWQSGAoHZGVsZXRlZBgCIAEoCF'
+ 'IHZGVsZXRlZDo7kkE4ChgqFkRlbGV0ZSBQZXJzb24gUmVzcG9uc2UyHHsiaWQiOiAiMSIsICJk'
+ 'ZWxldGVkIjogdHJ1ZX0=');
+
diff --git a/frontend/app/lib/pb/rpc_delete_person.pbserver.dart b/frontend/app/lib/pb/rpc_delete_person.pbserver.dart
new file mode 100644
index 0000000..1fd5c66
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_delete_person.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_delete_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_delete_person.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_get_account.pb.dart b/frontend/app/lib/pb/rpc_get_account.pb.dart
new file mode 100644
index 0000000..8d129d1
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_account.pb.dart
@@ -0,0 +1,123 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'account.pb.dart' as $2;
+
+class GetAccountRequest extends $pb.GeneratedMessage {
+ factory GetAccountRequest({
+ $fixnum.Int64? id,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ return $result;
+ }
+ GetAccountRequest._() : super();
+ factory GetAccountRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory GetAccountRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GetAccountRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ GetAccountRequest clone() => GetAccountRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ GetAccountRequest copyWith(void Function(GetAccountRequest) updates) => super.copyWith((message) => updates(message as GetAccountRequest)) as GetAccountRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static GetAccountRequest create() => GetAccountRequest._();
+ GetAccountRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static GetAccountRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static GetAccountRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+}
+
+class GetAccountResponse extends $pb.GeneratedMessage {
+ factory GetAccountResponse({
+ $2.Account? account,
+ }) {
+ final $result = create();
+ if (account != null) {
+ $result.account = account;
+ }
+ return $result;
+ }
+ GetAccountResponse._() : super();
+ factory GetAccountResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory GetAccountResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GetAccountResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$2.Account>(1, _omitFieldNames ? '' : 'account', subBuilder: $2.Account.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ GetAccountResponse clone() => GetAccountResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ GetAccountResponse copyWith(void Function(GetAccountResponse) updates) => super.copyWith((message) => updates(message as GetAccountResponse)) as GetAccountResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static GetAccountResponse create() => GetAccountResponse._();
+ GetAccountResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static GetAccountResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static GetAccountResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $2.Account get account => $_getN(0);
+ @$pb.TagNumber(1)
+ set account($2.Account v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccount() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccount() => clearField(1);
+ @$pb.TagNumber(1)
+ $2.Account ensureAccount() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_get_account.pbenum.dart b/frontend/app/lib/pb/rpc_get_account.pbenum.dart
new file mode 100644
index 0000000..0292510
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_account.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_get_account.pbjson.dart b/frontend/app/lib/pb/rpc_get_account.pbjson.dart
new file mode 100644
index 0000000..bf5309a
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_account.pbjson.dart
@@ -0,0 +1,44 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use getAccountRequestDescriptor instead')
+const GetAccountRequest$json = {
+ '1': 'GetAccountRequest',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `GetAccountRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List getAccountRequestDescriptor = $convert.base64Decode(
+ 'ChFHZXRBY2NvdW50UmVxdWVzdBIOCgJpZBgBIAEoBFICaWQ6Q5JBQAowKgpHZXRBY2NvdW50Mh'
+ '1HZXQgQWNjb3VudEluZm8gYnkgYWNjb3VudF9pZNIBAmlkMgx7ImlkIjogIjEiIH0=');
+
+@$core.Deprecated('Use getAccountResponseDescriptor instead')
+const GetAccountResponse$json = {
+ '1': 'GetAccountResponse',
+ '2': [
+ {'1': 'account', '3': 1, '4': 1, '5': 11, '6': '.pb.Account', '8': {}, '10': 'account'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `GetAccountResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List getAccountResponseDescriptor = $convert.base64Decode(
+ 'ChJHZXRBY2NvdW50UmVzcG9uc2USKgoHYWNjb3VudBgBIAEoCzILLnBiLkFjY291bnRCA5JBAF'
+ 'IHYWNjb3VudDozkkEwCi4qE0dldEFjY291bnQgUmVzcG9uc2UyF1JldHVybnMgdGhlIEFjY291'
+ 'bnRJbmZv');
+
diff --git a/frontend/app/lib/pb/rpc_get_account.pbserver.dart b/frontend/app/lib/pb/rpc_get_account.pbserver.dart
new file mode 100644
index 0000000..d2c87f6
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_account.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_get_account.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_get_account_info.pb.dart b/frontend/app/lib/pb/rpc_get_account_info.pb.dart
new file mode 100644
index 0000000..d11787f
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_account_info.pb.dart
@@ -0,0 +1,123 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'account_info.pb.dart' as $1;
+
+class GetAccountInfoRequest extends $pb.GeneratedMessage {
+ factory GetAccountInfoRequest({
+ $fixnum.Int64? accountId,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ return $result;
+ }
+ GetAccountInfoRequest._() : super();
+ factory GetAccountInfoRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory GetAccountInfoRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GetAccountInfoRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ GetAccountInfoRequest clone() => GetAccountInfoRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ GetAccountInfoRequest copyWith(void Function(GetAccountInfoRequest) updates) => super.copyWith((message) => updates(message as GetAccountInfoRequest)) as GetAccountInfoRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static GetAccountInfoRequest create() => GetAccountInfoRequest._();
+ GetAccountInfoRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static GetAccountInfoRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static GetAccountInfoRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+}
+
+class GetAccountInfoResponse extends $pb.GeneratedMessage {
+ factory GetAccountInfoResponse({
+ $1.AccountInfo? accountInfo,
+ }) {
+ final $result = create();
+ if (accountInfo != null) {
+ $result.accountInfo = accountInfo;
+ }
+ return $result;
+ }
+ GetAccountInfoResponse._() : super();
+ factory GetAccountInfoResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory GetAccountInfoResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GetAccountInfoResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$1.AccountInfo>(1, _omitFieldNames ? '' : 'accountInfo', subBuilder: $1.AccountInfo.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ GetAccountInfoResponse clone() => GetAccountInfoResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ GetAccountInfoResponse copyWith(void Function(GetAccountInfoResponse) updates) => super.copyWith((message) => updates(message as GetAccountInfoResponse)) as GetAccountInfoResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static GetAccountInfoResponse create() => GetAccountInfoResponse._();
+ GetAccountInfoResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static GetAccountInfoResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static GetAccountInfoResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $1.AccountInfo get accountInfo => $_getN(0);
+ @$pb.TagNumber(1)
+ set accountInfo($1.AccountInfo v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountInfo() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountInfo() => clearField(1);
+ @$pb.TagNumber(1)
+ $1.AccountInfo ensureAccountInfo() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_get_account_info.pbenum.dart b/frontend/app/lib/pb/rpc_get_account_info.pbenum.dart
new file mode 100644
index 0000000..2a2b0b3
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_account_info.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_get_account_info.pbjson.dart b/frontend/app/lib/pb/rpc_get_account_info.pbjson.dart
new file mode 100644
index 0000000..1d19aec
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_account_info.pbjson.dart
@@ -0,0 +1,45 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use getAccountInfoRequestDescriptor instead')
+const GetAccountInfoRequest$json = {
+ '1': 'GetAccountInfoRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '10': 'accountId'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `GetAccountInfoRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List getAccountInfoRequestDescriptor = $convert.base64Decode(
+ 'ChVHZXRBY2NvdW50SW5mb1JlcXVlc3QSHQoKYWNjb3VudF9pZBgBIAEoBFIJYWNjb3VudElkOl'
+ 'eSQVQKPCoOR2V0QWNjb3VudEluZm8yHUdldCBBY2NvdW50SW5mbyBieSBhY2NvdW50X2lk0gEK'
+ 'YWNjb3VudF9pZDIUeyJhY2NvdW50X2lkIjogIjEiIH0=');
+
+@$core.Deprecated('Use getAccountInfoResponseDescriptor instead')
+const GetAccountInfoResponse$json = {
+ '1': 'GetAccountInfoResponse',
+ '2': [
+ {'1': 'account_info', '3': 1, '4': 1, '5': 11, '6': '.pb.AccountInfo', '8': {}, '10': 'accountInfo'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `GetAccountInfoResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List getAccountInfoResponseDescriptor = $convert.base64Decode(
+ 'ChZHZXRBY2NvdW50SW5mb1Jlc3BvbnNlEjcKDGFjY291bnRfaW5mbxgBIAEoCzIPLnBiLkFjY2'
+ '91bnRJbmZvQgOSQQBSC2FjY291bnRJbmZvOjeSQTQKMioXR2V0QWNjb3VudEluZm8gUmVzcG9u'
+ 'c2UyF1JldHVybnMgdGhlIEFjY291bnRJbmZv');
+
diff --git a/frontend/app/lib/pb/rpc_get_account_info.pbserver.dart b/frontend/app/lib/pb/rpc_get_account_info.pbserver.dart
new file mode 100644
index 0000000..82075ad
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_account_info.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_get_account_info.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_get_payment.pb.dart b/frontend/app/lib/pb/rpc_get_payment.pb.dart
new file mode 100644
index 0000000..526b590
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_payment.pb.dart
@@ -0,0 +1,123 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'payment.pb.dart' as $3;
+
+class GetPaymentRequest extends $pb.GeneratedMessage {
+ factory GetPaymentRequest({
+ $fixnum.Int64? id,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ return $result;
+ }
+ GetPaymentRequest._() : super();
+ factory GetPaymentRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory GetPaymentRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GetPaymentRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ GetPaymentRequest clone() => GetPaymentRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ GetPaymentRequest copyWith(void Function(GetPaymentRequest) updates) => super.copyWith((message) => updates(message as GetPaymentRequest)) as GetPaymentRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static GetPaymentRequest create() => GetPaymentRequest._();
+ GetPaymentRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static GetPaymentRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static GetPaymentRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+}
+
+class GetPaymentResponse extends $pb.GeneratedMessage {
+ factory GetPaymentResponse({
+ $3.Payment? payment,
+ }) {
+ final $result = create();
+ if (payment != null) {
+ $result.payment = payment;
+ }
+ return $result;
+ }
+ GetPaymentResponse._() : super();
+ factory GetPaymentResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory GetPaymentResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GetPaymentResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$3.Payment>(1, _omitFieldNames ? '' : 'payment', subBuilder: $3.Payment.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ GetPaymentResponse clone() => GetPaymentResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ GetPaymentResponse copyWith(void Function(GetPaymentResponse) updates) => super.copyWith((message) => updates(message as GetPaymentResponse)) as GetPaymentResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static GetPaymentResponse create() => GetPaymentResponse._();
+ GetPaymentResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static GetPaymentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static GetPaymentResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $3.Payment get payment => $_getN(0);
+ @$pb.TagNumber(1)
+ set payment($3.Payment v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasPayment() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearPayment() => clearField(1);
+ @$pb.TagNumber(1)
+ $3.Payment ensurePayment() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_get_payment.pbenum.dart b/frontend/app/lib/pb/rpc_get_payment.pbenum.dart
new file mode 100644
index 0000000..cfd3cde
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_payment.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_get_payment.pbjson.dart b/frontend/app/lib/pb/rpc_get_payment.pbjson.dart
new file mode 100644
index 0000000..d43eb5d
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_payment.pbjson.dart
@@ -0,0 +1,44 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use getPaymentRequestDescriptor instead')
+const GetPaymentRequest$json = {
+ '1': 'GetPaymentRequest',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `GetPaymentRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List getPaymentRequestDescriptor = $convert.base64Decode(
+ 'ChFHZXRQYXltZW50UmVxdWVzdBIOCgJpZBgBIAEoBFICaWQ6OpJBNwonKgpHZXRQYXltZW50Mh'
+ 'RHZXQgYW4gUGF5bWVudCBieSBJRNIBAmlkMgx7ImlkIjogIjEiIH0=');
+
+@$core.Deprecated('Use getPaymentResponseDescriptor instead')
+const GetPaymentResponse$json = {
+ '1': 'GetPaymentResponse',
+ '2': [
+ {'1': 'payment', '3': 1, '4': 1, '5': 11, '6': '.pb.Payment', '8': {}, '10': 'payment'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `GetPaymentResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List getPaymentResponseDescriptor = $convert.base64Decode(
+ 'ChJHZXRQYXltZW50UmVzcG9uc2USKgoHcGF5bWVudBgBIAEoCzILLnBiLlBheW1lbnRCA5JBAF'
+ 'IHcGF5bWVudDovkkEsCioqE0dldFBheW1lbnQgUmVzcG9uc2UyE1JldHVybnMgdGhlIFBheW1l'
+ 'bnQ=');
+
diff --git a/frontend/app/lib/pb/rpc_get_payment.pbserver.dart b/frontend/app/lib/pb/rpc_get_payment.pbserver.dart
new file mode 100644
index 0000000..b758155
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_payment.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_get_payment.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_get_person.pb.dart b/frontend/app/lib/pb/rpc_get_person.pb.dart
new file mode 100644
index 0000000..5b5badf
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_person.pb.dart
@@ -0,0 +1,123 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'person.pb.dart' as $4;
+
+class GetPersonRequest extends $pb.GeneratedMessage {
+ factory GetPersonRequest({
+ $fixnum.Int64? id,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ return $result;
+ }
+ GetPersonRequest._() : super();
+ factory GetPersonRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory GetPersonRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GetPersonRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ GetPersonRequest clone() => GetPersonRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ GetPersonRequest copyWith(void Function(GetPersonRequest) updates) => super.copyWith((message) => updates(message as GetPersonRequest)) as GetPersonRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static GetPersonRequest create() => GetPersonRequest._();
+ GetPersonRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static GetPersonRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static GetPersonRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+}
+
+class GetPersonResponse extends $pb.GeneratedMessage {
+ factory GetPersonResponse({
+ $4.Person? person,
+ }) {
+ final $result = create();
+ if (person != null) {
+ $result.person = person;
+ }
+ return $result;
+ }
+ GetPersonResponse._() : super();
+ factory GetPersonResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory GetPersonResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GetPersonResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$4.Person>(1, _omitFieldNames ? '' : 'person', subBuilder: $4.Person.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ GetPersonResponse clone() => GetPersonResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ GetPersonResponse copyWith(void Function(GetPersonResponse) updates) => super.copyWith((message) => updates(message as GetPersonResponse)) as GetPersonResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static GetPersonResponse create() => GetPersonResponse._();
+ GetPersonResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static GetPersonResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static GetPersonResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $4.Person get person => $_getN(0);
+ @$pb.TagNumber(1)
+ set person($4.Person v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasPerson() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearPerson() => clearField(1);
+ @$pb.TagNumber(1)
+ $4.Person ensurePerson() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_get_person.pbenum.dart b/frontend/app/lib/pb/rpc_get_person.pbenum.dart
new file mode 100644
index 0000000..5912e89
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_person.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_get_person.pbjson.dart b/frontend/app/lib/pb/rpc_get_person.pbjson.dart
new file mode 100644
index 0000000..25ecf45
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_person.pbjson.dart
@@ -0,0 +1,43 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use getPersonRequestDescriptor instead')
+const GetPersonRequest$json = {
+ '1': 'GetPersonRequest',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `GetPersonRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List getPersonRequestDescriptor = $convert.base64Decode(
+ 'ChBHZXRQZXJzb25SZXF1ZXN0Eg4KAmlkGAEgASgEUgJpZDo4kkE1CiUqCUdldFBlcnNvbjITR2'
+ 'V0IGFuIFBlcnNvbiBieSBJRNIBAmlkMgx7ImlkIjogIjEiIH0=');
+
+@$core.Deprecated('Use getPersonResponseDescriptor instead')
+const GetPersonResponse$json = {
+ '1': 'GetPersonResponse',
+ '2': [
+ {'1': 'person', '3': 1, '4': 1, '5': 11, '6': '.pb.Person', '8': {}, '10': 'person'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `GetPersonResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List getPersonResponseDescriptor = $convert.base64Decode(
+ 'ChFHZXRQZXJzb25SZXNwb25zZRInCgZwZXJzb24YASABKAsyCi5wYi5QZXJzb25CA5JBAFIGcG'
+ 'Vyc29uOi2SQSoKKCoSR2V0UGVyc29uIFJlc3BvbnNlMhJSZXR1cm5zIHRoZSBQZXJzb24=');
+
diff --git a/frontend/app/lib/pb/rpc_get_person.pbserver.dart b/frontend/app/lib/pb/rpc_get_person.pbserver.dart
new file mode 100644
index 0000000..d182110
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_get_person.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_get_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_get_person.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_list_account_info.pb.dart b/frontend/app/lib/pb/rpc_list_account_info.pb.dart
new file mode 100644
index 0000000..9e12410
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_account_info.pb.dart
@@ -0,0 +1,128 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'account_info.pb.dart' as $1;
+
+class ListAccountInfoRequest extends $pb.GeneratedMessage {
+ factory ListAccountInfoRequest({
+ $core.int? pageId,
+ $core.int? pageSize,
+ }) {
+ final $result = create();
+ if (pageId != null) {
+ $result.pageId = pageId;
+ }
+ if (pageSize != null) {
+ $result.pageSize = pageSize;
+ }
+ return $result;
+ }
+ ListAccountInfoRequest._() : super();
+ factory ListAccountInfoRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListAccountInfoRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListAccountInfoRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$core.int>(1, _omitFieldNames ? '' : 'pageId', $pb.PbFieldType.OU3)
+ ..a<$core.int>(2, _omitFieldNames ? '' : 'pageSize', $pb.PbFieldType.OU3)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListAccountInfoRequest clone() => ListAccountInfoRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListAccountInfoRequest copyWith(void Function(ListAccountInfoRequest) updates) => super.copyWith((message) => updates(message as ListAccountInfoRequest)) as ListAccountInfoRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListAccountInfoRequest create() => ListAccountInfoRequest._();
+ ListAccountInfoRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListAccountInfoRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListAccountInfoRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.int get pageId => $_getIZ(0);
+ @$pb.TagNumber(1)
+ set pageId($core.int v) { $_setUnsignedInt32(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasPageId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearPageId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.int get pageSize => $_getIZ(1);
+ @$pb.TagNumber(2)
+ set pageSize($core.int v) { $_setUnsignedInt32(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasPageSize() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearPageSize() => clearField(2);
+}
+
+class ListAccountInfoResponse extends $pb.GeneratedMessage {
+ factory ListAccountInfoResponse({
+ $core.Iterable<$1.AccountInfo>? accountInfo,
+ }) {
+ final $result = create();
+ if (accountInfo != null) {
+ $result.accountInfo.addAll(accountInfo);
+ }
+ return $result;
+ }
+ ListAccountInfoResponse._() : super();
+ factory ListAccountInfoResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListAccountInfoResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListAccountInfoResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..pc<$1.AccountInfo>(1, _omitFieldNames ? '' : 'accountInfo', $pb.PbFieldType.PM, subBuilder: $1.AccountInfo.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListAccountInfoResponse clone() => ListAccountInfoResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListAccountInfoResponse copyWith(void Function(ListAccountInfoResponse) updates) => super.copyWith((message) => updates(message as ListAccountInfoResponse)) as ListAccountInfoResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListAccountInfoResponse create() => ListAccountInfoResponse._();
+ ListAccountInfoResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListAccountInfoResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListAccountInfoResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.List<$1.AccountInfo> get accountInfo => $_getList(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_list_account_info.pbenum.dart b/frontend/app/lib/pb/rpc_list_account_info.pbenum.dart
new file mode 100644
index 0000000..25f91fb
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_account_info.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_list_account_info.pbjson.dart b/frontend/app/lib/pb/rpc_list_account_info.pbjson.dart
new file mode 100644
index 0000000..6d5c4d3
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_account_info.pbjson.dart
@@ -0,0 +1,47 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use listAccountInfoRequestDescriptor instead')
+const ListAccountInfoRequest$json = {
+ '1': 'ListAccountInfoRequest',
+ '2': [
+ {'1': 'page_id', '3': 1, '4': 1, '5': 13, '10': 'pageId'},
+ {'1': 'page_size', '3': 2, '4': 1, '5': 13, '10': 'pageSize'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListAccountInfoRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listAccountInfoRequestDescriptor = $convert.base64Decode(
+ 'ChZMaXN0QWNjb3VudEluZm9SZXF1ZXN0EhcKB3BhZ2VfaWQYASABKA1SBnBhZ2VJZBIbCglwYW'
+ 'dlX3NpemUYAiABKA1SCHBhZ2VTaXplOmqSQWcKQyoPTGlzdEFjY291bnRJbmZvMhpSZXR1cm5z'
+ 'IGEgTGlzdCBvZiBBY2NvdW50c9IBB3BhZ2VfaWTSAQlwYWdlX3NpemUyIHsicGFnZV9pZCI6ID'
+ 'EsICJwYWdlX3NpemUiOiAxMCB9');
+
+@$core.Deprecated('Use listAccountInfoResponseDescriptor instead')
+const ListAccountInfoResponse$json = {
+ '1': 'ListAccountInfoResponse',
+ '2': [
+ {'1': 'account_info', '3': 1, '4': 3, '5': 11, '6': '.pb.AccountInfo', '8': {}, '10': 'accountInfo'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListAccountInfoResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listAccountInfoResponseDescriptor = $convert.base64Decode(
+ 'ChdMaXN0QWNjb3VudEluZm9SZXNwb25zZRI3CgxhY2NvdW50X2luZm8YASADKAsyDy5wYi5BY2'
+ 'NvdW50SW5mb0IDkkEAUgthY2NvdW50SW5mbzo4kkE1CjMqGExpc3RBY2NvdW50SW5mbyBSZXNw'
+ 'b25zZTIXUmV0dXJucyB0aGUgQWNjb3VudEluZm8=');
+
diff --git a/frontend/app/lib/pb/rpc_list_account_info.pbserver.dart b/frontend/app/lib/pb/rpc_list_account_info.pbserver.dart
new file mode 100644
index 0000000..c519635
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_account_info.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_list_account_info.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_list_accounts.pb.dart b/frontend/app/lib/pb/rpc_list_accounts.pb.dart
new file mode 100644
index 0000000..9dd20a2
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_accounts.pb.dart
@@ -0,0 +1,128 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_accounts.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'account.pb.dart' as $2;
+
+class ListAccountsRequest extends $pb.GeneratedMessage {
+ factory ListAccountsRequest({
+ $core.int? pageId,
+ $core.int? pageSize,
+ }) {
+ final $result = create();
+ if (pageId != null) {
+ $result.pageId = pageId;
+ }
+ if (pageSize != null) {
+ $result.pageSize = pageSize;
+ }
+ return $result;
+ }
+ ListAccountsRequest._() : super();
+ factory ListAccountsRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListAccountsRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListAccountsRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$core.int>(1, _omitFieldNames ? '' : 'pageId', $pb.PbFieldType.OU3)
+ ..a<$core.int>(2, _omitFieldNames ? '' : 'pageSize', $pb.PbFieldType.OU3)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListAccountsRequest clone() => ListAccountsRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListAccountsRequest copyWith(void Function(ListAccountsRequest) updates) => super.copyWith((message) => updates(message as ListAccountsRequest)) as ListAccountsRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListAccountsRequest create() => ListAccountsRequest._();
+ ListAccountsRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListAccountsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListAccountsRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.int get pageId => $_getIZ(0);
+ @$pb.TagNumber(1)
+ set pageId($core.int v) { $_setUnsignedInt32(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasPageId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearPageId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.int get pageSize => $_getIZ(1);
+ @$pb.TagNumber(2)
+ set pageSize($core.int v) { $_setUnsignedInt32(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasPageSize() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearPageSize() => clearField(2);
+}
+
+class ListAccountsResponse extends $pb.GeneratedMessage {
+ factory ListAccountsResponse({
+ $core.Iterable<$2.Account>? accounts,
+ }) {
+ final $result = create();
+ if (accounts != null) {
+ $result.accounts.addAll(accounts);
+ }
+ return $result;
+ }
+ ListAccountsResponse._() : super();
+ factory ListAccountsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListAccountsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListAccountsResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..pc<$2.Account>(1, _omitFieldNames ? '' : 'accounts', $pb.PbFieldType.PM, subBuilder: $2.Account.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListAccountsResponse clone() => ListAccountsResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListAccountsResponse copyWith(void Function(ListAccountsResponse) updates) => super.copyWith((message) => updates(message as ListAccountsResponse)) as ListAccountsResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListAccountsResponse create() => ListAccountsResponse._();
+ ListAccountsResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListAccountsResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListAccountsResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.List<$2.Account> get accounts => $_getList(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_list_accounts.pbenum.dart b/frontend/app/lib/pb/rpc_list_accounts.pbenum.dart
new file mode 100644
index 0000000..d18fe94
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_accounts.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_accounts.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_list_accounts.pbjson.dart b/frontend/app/lib/pb/rpc_list_accounts.pbjson.dart
new file mode 100644
index 0000000..8617af7
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_accounts.pbjson.dart
@@ -0,0 +1,47 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_accounts.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use listAccountsRequestDescriptor instead')
+const ListAccountsRequest$json = {
+ '1': 'ListAccountsRequest',
+ '2': [
+ {'1': 'page_id', '3': 1, '4': 1, '5': 13, '10': 'pageId'},
+ {'1': 'page_size', '3': 2, '4': 1, '5': 13, '10': 'pageSize'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListAccountsRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listAccountsRequestDescriptor = $convert.base64Decode(
+ 'ChNMaXN0QWNjb3VudHNSZXF1ZXN0EhcKB3BhZ2VfaWQYASABKA1SBnBhZ2VJZBIbCglwYWdlX3'
+ 'NpemUYAiABKA1SCHBhZ2VTaXplOmeSQWQKQCoMTGlzdEFjY291bnRzMhpSZXR1cm5zIGEgTGlz'
+ 'dCBvZiBBY2NvdW50c9IBB3BhZ2VfaWTSAQlwYWdlX3NpemUyIHsicGFnZV9pZCI6IDEsICJwYW'
+ 'dlX3NpemUiOiAxMCB9');
+
+@$core.Deprecated('Use listAccountsResponseDescriptor instead')
+const ListAccountsResponse$json = {
+ '1': 'ListAccountsResponse',
+ '2': [
+ {'1': 'accounts', '3': 1, '4': 3, '5': 11, '6': '.pb.Account', '8': {}, '10': 'accounts'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListAccountsResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listAccountsResponseDescriptor = $convert.base64Decode(
+ 'ChRMaXN0QWNjb3VudHNSZXNwb25zZRIsCghhY2NvdW50cxgBIAMoCzILLnBiLkFjY291bnRCA5'
+ 'JBAFIIYWNjb3VudHM6MZJBLgosKhVMaXN0QWNjb3VudHMgUmVzcG9uc2UyE1JldHVybnMgdGhl'
+ 'IEFjY291bnQ=');
+
diff --git a/frontend/app/lib/pb/rpc_list_accounts.pbserver.dart b/frontend/app/lib/pb/rpc_list_accounts.pbserver.dart
new file mode 100644
index 0000000..8182a04
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_accounts.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_accounts.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_list_accounts.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_list_payments.pb.dart b/frontend/app/lib/pb/rpc_list_payments.pb.dart
new file mode 100644
index 0000000..a7110a6
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_payments.pb.dart
@@ -0,0 +1,115 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_payments.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'payment.pb.dart' as $3;
+
+class ListPaymentsRequest extends $pb.GeneratedMessage {
+ factory ListPaymentsRequest({
+ $fixnum.Int64? accountId,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ return $result;
+ }
+ ListPaymentsRequest._() : super();
+ factory ListPaymentsRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListPaymentsRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListPaymentsRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListPaymentsRequest clone() => ListPaymentsRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListPaymentsRequest copyWith(void Function(ListPaymentsRequest) updates) => super.copyWith((message) => updates(message as ListPaymentsRequest)) as ListPaymentsRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListPaymentsRequest create() => ListPaymentsRequest._();
+ ListPaymentsRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListPaymentsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListPaymentsRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+}
+
+class ListPaymentsResponse extends $pb.GeneratedMessage {
+ factory ListPaymentsResponse({
+ $core.Iterable<$3.Payment>? payments,
+ }) {
+ final $result = create();
+ if (payments != null) {
+ $result.payments.addAll(payments);
+ }
+ return $result;
+ }
+ ListPaymentsResponse._() : super();
+ factory ListPaymentsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListPaymentsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListPaymentsResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..pc<$3.Payment>(1, _omitFieldNames ? '' : 'payments', $pb.PbFieldType.PM, subBuilder: $3.Payment.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListPaymentsResponse clone() => ListPaymentsResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListPaymentsResponse copyWith(void Function(ListPaymentsResponse) updates) => super.copyWith((message) => updates(message as ListPaymentsResponse)) as ListPaymentsResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListPaymentsResponse create() => ListPaymentsResponse._();
+ ListPaymentsResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListPaymentsResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListPaymentsResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.List<$3.Payment> get payments => $_getList(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_list_payments.pbenum.dart b/frontend/app/lib/pb/rpc_list_payments.pbenum.dart
new file mode 100644
index 0000000..60975d1
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_payments.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_payments.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_list_payments.pbjson.dart b/frontend/app/lib/pb/rpc_list_payments.pbjson.dart
new file mode 100644
index 0000000..1055398
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_payments.pbjson.dart
@@ -0,0 +1,45 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_payments.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use listPaymentsRequestDescriptor instead')
+const ListPaymentsRequest$json = {
+ '1': 'ListPaymentsRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '10': 'accountId'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListPaymentsRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listPaymentsRequestDescriptor = $convert.base64Decode(
+ 'ChNMaXN0UGF5bWVudHNSZXF1ZXN0Eh0KCmFjY291bnRfaWQYASABKARSCWFjY291bnRJZDpQkk'
+ 'FNCjcqDExpc3RQYXltZW50czIaUmV0dXJucyBhIExpc3Qgb2YgUGF5bWVudHPSAQphY2NvdW50'
+ 'X2lkMhJ7ImFjY291bnRfaWQiOiAxIH0=');
+
+@$core.Deprecated('Use listPaymentsResponseDescriptor instead')
+const ListPaymentsResponse$json = {
+ '1': 'ListPaymentsResponse',
+ '2': [
+ {'1': 'payments', '3': 1, '4': 3, '5': 11, '6': '.pb.Payment', '8': {}, '10': 'payments'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListPaymentsResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listPaymentsResponseDescriptor = $convert.base64Decode(
+ 'ChRMaXN0UGF5bWVudHNSZXNwb25zZRIsCghwYXltZW50cxgBIAMoCzILLnBiLlBheW1lbnRCA5'
+ 'JBAFIIcGF5bWVudHM6MZJBLgosKhVMaXN0UGF5bWVudHMgUmVzcG9uc2UyE1JldHVybnMgdGhl'
+ 'IFBheW1lbnQ=');
+
diff --git a/frontend/app/lib/pb/rpc_list_payments.pbserver.dart b/frontend/app/lib/pb/rpc_list_payments.pbserver.dart
new file mode 100644
index 0000000..3447e3d
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_payments.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_payments.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_list_payments.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_list_persons.pb.dart b/frontend/app/lib/pb/rpc_list_persons.pb.dart
new file mode 100644
index 0000000..bfac765
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_persons.pb.dart
@@ -0,0 +1,115 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_persons.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'person.pb.dart' as $4;
+
+class ListPersonsRequest extends $pb.GeneratedMessage {
+ factory ListPersonsRequest({
+ $fixnum.Int64? accountId,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ return $result;
+ }
+ ListPersonsRequest._() : super();
+ factory ListPersonsRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListPersonsRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListPersonsRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListPersonsRequest clone() => ListPersonsRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListPersonsRequest copyWith(void Function(ListPersonsRequest) updates) => super.copyWith((message) => updates(message as ListPersonsRequest)) as ListPersonsRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListPersonsRequest create() => ListPersonsRequest._();
+ ListPersonsRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListPersonsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListPersonsRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+}
+
+class ListPersonsResponse extends $pb.GeneratedMessage {
+ factory ListPersonsResponse({
+ $core.Iterable<$4.Person>? persons,
+ }) {
+ final $result = create();
+ if (persons != null) {
+ $result.persons.addAll(persons);
+ }
+ return $result;
+ }
+ ListPersonsResponse._() : super();
+ factory ListPersonsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListPersonsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListPersonsResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..pc<$4.Person>(1, _omitFieldNames ? '' : 'persons', $pb.PbFieldType.PM, subBuilder: $4.Person.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListPersonsResponse clone() => ListPersonsResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListPersonsResponse copyWith(void Function(ListPersonsResponse) updates) => super.copyWith((message) => updates(message as ListPersonsResponse)) as ListPersonsResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListPersonsResponse create() => ListPersonsResponse._();
+ ListPersonsResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListPersonsResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListPersonsResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.List<$4.Person> get persons => $_getList(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_list_persons.pbenum.dart b/frontend/app/lib/pb/rpc_list_persons.pbenum.dart
new file mode 100644
index 0000000..2b664c4
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_persons.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_persons.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_list_persons.pbjson.dart b/frontend/app/lib/pb/rpc_list_persons.pbjson.dart
new file mode 100644
index 0000000..bc10ba9
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_persons.pbjson.dart
@@ -0,0 +1,45 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_persons.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use listPersonsRequestDescriptor instead')
+const ListPersonsRequest$json = {
+ '1': 'ListPersonsRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '10': 'accountId'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListPersonsRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listPersonsRequestDescriptor = $convert.base64Decode(
+ 'ChJMaXN0UGVyc29uc1JlcXVlc3QSHQoKYWNjb3VudF9pZBgBIAEoBFIJYWNjb3VudElkOk6SQU'
+ 'sKNSoLTGlzdFBlcnNvbnMyGVJldHVybnMgYSBMaXN0IG9mIFBlcnNvbnPSAQphY2NvdW50X2lk'
+ 'MhJ7ImFjY291bnRfaWQiOiAxIH0=');
+
+@$core.Deprecated('Use listPersonsResponseDescriptor instead')
+const ListPersonsResponse$json = {
+ '1': 'ListPersonsResponse',
+ '2': [
+ {'1': 'persons', '3': 1, '4': 3, '5': 11, '6': '.pb.Person', '8': {}, '10': 'persons'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListPersonsResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listPersonsResponseDescriptor = $convert.base64Decode(
+ 'ChNMaXN0UGVyc29uc1Jlc3BvbnNlEikKB3BlcnNvbnMYASADKAsyCi5wYi5QZXJzb25CA5JBAF'
+ 'IHcGVyc29uczovkkEsCioqFExpc3RQZXJzb25zIFJlc3BvbnNlMhJSZXR1cm5zIHRoZSBQZXJz'
+ 'b24=');
+
diff --git a/frontend/app/lib/pb/rpc_list_persons.pbserver.dart b/frontend/app/lib/pb/rpc_list_persons.pbserver.dart
new file mode 100644
index 0000000..f7e01f9
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_persons.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_persons.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_list_persons.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pb.dart b/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pb.dart
new file mode 100644
index 0000000..61fbff1
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pb.dart
@@ -0,0 +1,115 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_returns_log_by_person_id.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'returns_log.pb.dart' as $5;
+
+class ListReturnsLogRequest extends $pb.GeneratedMessage {
+ factory ListReturnsLogRequest({
+ $fixnum.Int64? personId,
+ }) {
+ final $result = create();
+ if (personId != null) {
+ $result.personId = personId;
+ }
+ return $result;
+ }
+ ListReturnsLogRequest._() : super();
+ factory ListReturnsLogRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListReturnsLogRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListReturnsLogRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'personId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListReturnsLogRequest clone() => ListReturnsLogRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListReturnsLogRequest copyWith(void Function(ListReturnsLogRequest) updates) => super.copyWith((message) => updates(message as ListReturnsLogRequest)) as ListReturnsLogRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListReturnsLogRequest create() => ListReturnsLogRequest._();
+ ListReturnsLogRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListReturnsLogRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListReturnsLogRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get personId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set personId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasPersonId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearPersonId() => clearField(1);
+}
+
+class ListReturnsLogResponse extends $pb.GeneratedMessage {
+ factory ListReturnsLogResponse({
+ $core.Iterable<$5.ReturnsLog>? returnsLog,
+ }) {
+ final $result = create();
+ if (returnsLog != null) {
+ $result.returnsLog.addAll(returnsLog);
+ }
+ return $result;
+ }
+ ListReturnsLogResponse._() : super();
+ factory ListReturnsLogResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListReturnsLogResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListReturnsLogResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..pc<$5.ReturnsLog>(1, _omitFieldNames ? '' : 'returnsLog', $pb.PbFieldType.PM, subBuilder: $5.ReturnsLog.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListReturnsLogResponse clone() => ListReturnsLogResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListReturnsLogResponse copyWith(void Function(ListReturnsLogResponse) updates) => super.copyWith((message) => updates(message as ListReturnsLogResponse)) as ListReturnsLogResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListReturnsLogResponse create() => ListReturnsLogResponse._();
+ ListReturnsLogResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListReturnsLogResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListReturnsLogResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.List<$5.ReturnsLog> get returnsLog => $_getList(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pbenum.dart b/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pbenum.dart
new file mode 100644
index 0000000..4a25147
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_returns_log_by_person_id.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pbjson.dart b/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pbjson.dart
new file mode 100644
index 0000000..925ac54
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pbjson.dart
@@ -0,0 +1,45 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_returns_log_by_person_id.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use listReturnsLogRequestDescriptor instead')
+const ListReturnsLogRequest$json = {
+ '1': 'ListReturnsLogRequest',
+ '2': [
+ {'1': 'person_id', '3': 1, '4': 1, '5': 4, '10': 'personId'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListReturnsLogRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listReturnsLogRequestDescriptor = $convert.base64Decode(
+ 'ChVMaXN0UmV0dXJuc0xvZ1JlcXVlc3QSGwoJcGVyc29uX2lkGAEgASgEUghwZXJzb25JZDpSkk'
+ 'FPCjoqDkxpc3RSZXR1cm5zTG9nMhxSZXR1cm5zIGEgTGlzdCBvZiBSZXR1cm5zTG9n0gEJcGVy'
+ 'c29uX2lkMhF7InBlcnNvbl9pZCI6IDEgfQ==');
+
+@$core.Deprecated('Use listReturnsLogResponseDescriptor instead')
+const ListReturnsLogResponse$json = {
+ '1': 'ListReturnsLogResponse',
+ '2': [
+ {'1': 'returns_log', '3': 1, '4': 3, '5': 11, '6': '.pb.ReturnsLog', '8': {}, '10': 'returnsLog'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListReturnsLogResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listReturnsLogResponseDescriptor = $convert.base64Decode(
+ 'ChZMaXN0UmV0dXJuc0xvZ1Jlc3BvbnNlEjQKC3JldHVybnNfbG9nGAEgAygLMg4ucGIuUmV0dX'
+ 'Juc0xvZ0IDkkEAUgpyZXR1cm5zTG9nOjaSQTMKMSoXTGlzdFJldHVybnNMb2cgUmVzcG9uc2Uy'
+ 'FlJldHVybnMgdGhlIFJldHVybnNMb2c=');
+
diff --git a/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pbserver.dart b/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pbserver.dart
new file mode 100644
index 0000000..8498af0
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_returns_log_by_person_id.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_returns_log_by_person_id.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_list_returns_log_by_person_id.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_list_sessions.pb.dart b/frontend/app/lib/pb/rpc_list_sessions.pb.dart
new file mode 100644
index 0000000..1a9f5af
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_sessions.pb.dart
@@ -0,0 +1,115 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_sessions.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'session.pb.dart' as $6;
+
+class ListSessionsRequest extends $pb.GeneratedMessage {
+ factory ListSessionsRequest({
+ $fixnum.Int64? accountId,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ return $result;
+ }
+ ListSessionsRequest._() : super();
+ factory ListSessionsRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListSessionsRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListSessionsRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListSessionsRequest clone() => ListSessionsRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListSessionsRequest copyWith(void Function(ListSessionsRequest) updates) => super.copyWith((message) => updates(message as ListSessionsRequest)) as ListSessionsRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListSessionsRequest create() => ListSessionsRequest._();
+ ListSessionsRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListSessionsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListSessionsRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+}
+
+class ListSessionsResponse extends $pb.GeneratedMessage {
+ factory ListSessionsResponse({
+ $core.Iterable<$6.Session>? sessions,
+ }) {
+ final $result = create();
+ if (sessions != null) {
+ $result.sessions.addAll(sessions);
+ }
+ return $result;
+ }
+ ListSessionsResponse._() : super();
+ factory ListSessionsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory ListSessionsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListSessionsResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..pc<$6.Session>(1, _omitFieldNames ? '' : 'sessions', $pb.PbFieldType.PM, subBuilder: $6.Session.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ ListSessionsResponse clone() => ListSessionsResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ ListSessionsResponse copyWith(void Function(ListSessionsResponse) updates) => super.copyWith((message) => updates(message as ListSessionsResponse)) as ListSessionsResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static ListSessionsResponse create() => ListSessionsResponse._();
+ ListSessionsResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static ListSessionsResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static ListSessionsResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.List<$6.Session> get sessions => $_getList(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_list_sessions.pbenum.dart b/frontend/app/lib/pb/rpc_list_sessions.pbenum.dart
new file mode 100644
index 0000000..1c4fe8a
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_sessions.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_sessions.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_list_sessions.pbjson.dart b/frontend/app/lib/pb/rpc_list_sessions.pbjson.dart
new file mode 100644
index 0000000..e86eae8
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_sessions.pbjson.dart
@@ -0,0 +1,45 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_sessions.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use listSessionsRequestDescriptor instead')
+const ListSessionsRequest$json = {
+ '1': 'ListSessionsRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '8': {}, '10': 'accountId'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListSessionsRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listSessionsRequestDescriptor = $convert.base64Decode(
+ 'ChNMaXN0U2Vzc2lvbnNSZXF1ZXN0Ei0KCmFjY291bnRfaWQYASABKARCDpJBC0oBMaICBWludD'
+ 'Y0UglhY2NvdW50SWQ6UpJBTwo3KgxMaXN0U2Vzc2lvbnMyGlJldHVybnMgYSBMaXN0IG9mIEFj'
+ 'Y291bnRz0gEKYWNjb3VudF9pZDIUeyJhY2NvdW50X2lkIjogIjEiIH0=');
+
+@$core.Deprecated('Use listSessionsResponseDescriptor instead')
+const ListSessionsResponse$json = {
+ '1': 'ListSessionsResponse',
+ '2': [
+ {'1': 'sessions', '3': 1, '4': 3, '5': 11, '6': '.pb.Session', '8': {}, '10': 'sessions'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `ListSessionsResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listSessionsResponseDescriptor = $convert.base64Decode(
+ 'ChRMaXN0U2Vzc2lvbnNSZXNwb25zZRIsCghzZXNzaW9ucxgBIAMoCzILLnBiLlNlc3Npb25CA5'
+ 'JBAFIIc2Vzc2lvbnM6MpJBLwotKhVMaXN0U2Vzc2lvbnMgUmVzcG9uc2UyFFJldHVybnMgdGhl'
+ 'IFNlc3Npb25z');
+
diff --git a/frontend/app/lib/pb/rpc_list_sessions.pbserver.dart b/frontend/app/lib/pb/rpc_list_sessions.pbserver.dart
new file mode 100644
index 0000000..e4bcfda
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_list_sessions.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_list_sessions.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_list_sessions.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_login.pb.dart b/frontend/app/lib/pb/rpc_login.pb.dart
new file mode 100644
index 0000000..30ded55
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_login.pb.dart
@@ -0,0 +1,209 @@
+//
+// Generated code. Do not modify.
+// source: rpc_login.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class LoginRequest extends $pb.GeneratedMessage {
+ factory LoginRequest({
+ $core.String? email,
+ $core.String? password,
+ }) {
+ final $result = create();
+ if (email != null) {
+ $result.email = email;
+ }
+ if (password != null) {
+ $result.password = password;
+ }
+ return $result;
+ }
+ LoginRequest._() : super();
+ factory LoginRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory LoginRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'LoginRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOS(1, _omitFieldNames ? '' : 'email')
+ ..aOS(2, _omitFieldNames ? '' : 'password')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ LoginRequest clone() => LoginRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ LoginRequest copyWith(void Function(LoginRequest) updates) => super.copyWith((message) => updates(message as LoginRequest)) as LoginRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static LoginRequest create() => LoginRequest._();
+ LoginRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static LoginRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static LoginRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.String get email => $_getSZ(0);
+ @$pb.TagNumber(1)
+ set email($core.String v) { $_setString(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasEmail() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearEmail() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.String get password => $_getSZ(1);
+ @$pb.TagNumber(2)
+ set password($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasPassword() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearPassword() => clearField(2);
+}
+
+class LoginResponse extends $pb.GeneratedMessage {
+ factory LoginResponse({
+ $core.String? sessionId,
+ $core.String? accessToken,
+ $0.Timestamp? accessTokenExpiresAt,
+ $core.String? refreshToken,
+ $0.Timestamp? refreshTokenExpiresAt,
+ $fixnum.Int64? accountId,
+ }) {
+ final $result = create();
+ if (sessionId != null) {
+ $result.sessionId = sessionId;
+ }
+ if (accessToken != null) {
+ $result.accessToken = accessToken;
+ }
+ if (accessTokenExpiresAt != null) {
+ $result.accessTokenExpiresAt = accessTokenExpiresAt;
+ }
+ if (refreshToken != null) {
+ $result.refreshToken = refreshToken;
+ }
+ if (refreshTokenExpiresAt != null) {
+ $result.refreshTokenExpiresAt = refreshTokenExpiresAt;
+ }
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ return $result;
+ }
+ LoginResponse._() : super();
+ factory LoginResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory LoginResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'LoginResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOS(1, _omitFieldNames ? '' : 'sessionId')
+ ..aOS(2, _omitFieldNames ? '' : 'accessToken')
+ ..aOM<$0.Timestamp>(3, _omitFieldNames ? '' : 'accessTokenExpiresAt', subBuilder: $0.Timestamp.create)
+ ..aOS(4, _omitFieldNames ? '' : 'refreshToken')
+ ..aOM<$0.Timestamp>(5, _omitFieldNames ? '' : 'refreshTokenExpiresAt', subBuilder: $0.Timestamp.create)
+ ..a<$fixnum.Int64>(6, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ LoginResponse clone() => LoginResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ LoginResponse copyWith(void Function(LoginResponse) updates) => super.copyWith((message) => updates(message as LoginResponse)) as LoginResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static LoginResponse create() => LoginResponse._();
+ LoginResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static LoginResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static LoginResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.String get sessionId => $_getSZ(0);
+ @$pb.TagNumber(1)
+ set sessionId($core.String v) { $_setString(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasSessionId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearSessionId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.String get accessToken => $_getSZ(1);
+ @$pb.TagNumber(2)
+ set accessToken($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasAccessToken() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearAccessToken() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $0.Timestamp get accessTokenExpiresAt => $_getN(2);
+ @$pb.TagNumber(3)
+ set accessTokenExpiresAt($0.Timestamp v) { setField(3, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasAccessTokenExpiresAt() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearAccessTokenExpiresAt() => clearField(3);
+ @$pb.TagNumber(3)
+ $0.Timestamp ensureAccessTokenExpiresAt() => $_ensure(2);
+
+ @$pb.TagNumber(4)
+ $core.String get refreshToken => $_getSZ(3);
+ @$pb.TagNumber(4)
+ set refreshToken($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasRefreshToken() => $_has(3);
+ @$pb.TagNumber(4)
+ void clearRefreshToken() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $0.Timestamp get refreshTokenExpiresAt => $_getN(4);
+ @$pb.TagNumber(5)
+ set refreshTokenExpiresAt($0.Timestamp v) { setField(5, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasRefreshTokenExpiresAt() => $_has(4);
+ @$pb.TagNumber(5)
+ void clearRefreshTokenExpiresAt() => clearField(5);
+ @$pb.TagNumber(5)
+ $0.Timestamp ensureRefreshTokenExpiresAt() => $_ensure(4);
+
+ @$pb.TagNumber(6)
+ $fixnum.Int64 get accountId => $_getI64(5);
+ @$pb.TagNumber(6)
+ set accountId($fixnum.Int64 v) { $_setInt64(5, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasAccountId() => $_has(5);
+ @$pb.TagNumber(6)
+ void clearAccountId() => clearField(6);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_login.pbenum.dart b/frontend/app/lib/pb/rpc_login.pbenum.dart
new file mode 100644
index 0000000..4b431da
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_login.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_login.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_login.pbjson.dart b/frontend/app/lib/pb/rpc_login.pbjson.dart
new file mode 100644
index 0000000..800e0ac
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_login.pbjson.dart
@@ -0,0 +1,70 @@
+//
+// Generated code. Do not modify.
+// source: rpc_login.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use loginRequestDescriptor instead')
+const LoginRequest$json = {
+ '1': 'LoginRequest',
+ '2': [
+ {'1': 'email', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'email'},
+ {'1': 'password', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'password'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `LoginRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List loginRequestDescriptor = $convert.base64Decode(
+ 'CgxMb2dpblJlcXVlc3QSMQoFZW1haWwYASABKAlCG5JBGEoWImpvaG4uZG9lQGV4YW1wbGUuY2'
+ '9tIlIFZW1haWwSQwoIcGFzc3dvcmQYAiABKAlCJ5JBJEoXIk1heVRoZUZvcmNlQmVXaXRoWW91'
+ 'ISKiAghwYXNzd29yZFIIcGFzc3dvcmQ6eZJBdgosKgVMb2dpbjIQTG9naW4gYW4gQWNjb3VudN'
+ 'IBBWVtYWls0gEIcGFzc3dvcmQyRnsiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iLCAi'
+ 'cGFzc3dvcmQiOiAiTWF5VGhlRm9yY2VCZVdpdGhZb3UhIn0=');
+
+@$core.Deprecated('Use loginResponseDescriptor instead')
+const LoginResponse$json = {
+ '1': 'LoginResponse',
+ '2': [
+ {'1': 'session_id', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'sessionId'},
+ {'1': 'access_token', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'accessToken'},
+ {'1': 'access_token_expires_at', '3': 3, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '10': 'accessTokenExpiresAt'},
+ {'1': 'refresh_token', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'refreshToken'},
+ {'1': 'refresh_token_expires_at', '3': 5, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '10': 'refreshTokenExpiresAt'},
+ {'1': 'account_id', '3': 6, '4': 1, '5': 4, '8': {}, '10': 'accountId'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `LoginResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List loginResponseDescriptor = $convert.base64Decode(
+ 'Cg1Mb2dpblJlc3BvbnNlElEKCnNlc3Npb25faWQYASABKAlCMpJBL0omIjVlMWQ2N2RhLTdjOW'
+ 'ItNDM2NS1hNGQ1LTNjYzBhMDUxMjQxZSKiAgR1dWlkUglzZXNzaW9uSWQS6QIKDGFjY2Vzc190'
+ 'b2tlbhgCIAEoCULFApJBwQJKvgIidjQucHVibGljLmV5SmxiV0ZwYkNJNkltRXlRR0l1WkdVaU'
+ 'xDSmxlSEFpT2lJeU1ESXpMVEV3TFRBMVZEQXhPakUzT2pBNUt6QXlPakF3SWl3aWFXRjBJam9p'
+ 'TWpBeU15MHhNQzB3TlZRd01Ub3dNam93T1Nzd01qb3dNQ0lzSW1sa0lqb2laamxoTWpFMk9XUX'
+ 'RNV1l4WVMwMFlUaGlMVGd6WldFdE56a3hNelk1WWpZM1ptWXhJaXdpYm1KbUlqb2lNakF5TXkw'
+ 'eE1DMHdOVlF3TVRvd01qb3dPU3N3TWpvd01DSjlBaDBiVmJ4OVMxTFItcGY4aExXVlJRUFVmSz'
+ 'l6ckhadkE3QXBKNWFaWHdoQTdIMWota0hoY2NCak9BR1lYWlFULXRzN0pxM1NKbHpvNXZ0VWpH'
+ 'QnREZyJSC2FjY2Vzc1Rva2VuElEKF2FjY2Vzc190b2tlbl9leHBpcmVzX2F0GAMgASgLMhouZ2'
+ '9vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIUYWNjZXNzVG9rZW5FeHBpcmVzQXQS6wIKDXJlZnJl'
+ 'c2hfdG9rZW4YBCABKAlCxQKSQcECSr4CInY0LnB1YmxpYy5leUpsYldGcGJDSTZJbUV5UUdJdV'
+ 'pHVWlMQ0psZUhBaU9pSXlNREl6TFRFd0xUQTJWREF4T2pBeU9qQTVLekF5T2pBd0lpd2lhV0Yw'
+ 'SWpvaU1qQXlNeTB4TUMwd05WUXdNVG93TWpvd09Tc3dNam93TUNJc0ltbGtJam9pTldVeFpEWT'
+ 'NaR0V0TjJNNVlpMDBNelkxTFdFMFpEVXRNMk5qTUdFd05URXlOREZsSWl3aWJtSm1Jam9pTWpB'
+ 'eU15MHhNQzB3TlZRd01Ub3dNam93T1Nzd01qb3dNQ0o5Qm9YMzZ3MHBvMXZ2SFNqc0JQX0tXZU'
+ 'Z4VjF4UmJRYXlxYkp1SW9LMmpLcXkxQnQyUm9IeUpiTG9DRU8xNUNSVDVEblE2UDBBSGxCempz'
+ 'WHQ2MWFERHciUgxyZWZyZXNoVG9rZW4SUwoYcmVmcmVzaF90b2tlbl9leHBpcmVzX2F0GAUgAS'
+ 'gLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIVcmVmcmVzaFRva2VuRXhwaXJlc0F0EicK'
+ 'CmFjY291bnRfaWQYBiABKARCCJJBBUoDIjEiUglhY2NvdW50SWQ6FZJBEgoQKg5Mb2dpbiBSZX'
+ 'Nwb25zZQ==');
+
diff --git a/frontend/app/lib/pb/rpc_login.pbserver.dart b/frontend/app/lib/pb/rpc_login.pbserver.dart
new file mode 100644
index 0000000..c90dce9
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_login.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_login.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_login.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_refresh_token.pb.dart b/frontend/app/lib/pb/rpc_refresh_token.pb.dart
new file mode 100644
index 0000000..a7780c3
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_refresh_token.pb.dart
@@ -0,0 +1,136 @@
+//
+// Generated code. Do not modify.
+// source: rpc_refresh_token.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class RefreshTokenRequest extends $pb.GeneratedMessage {
+ factory RefreshTokenRequest({
+ $core.String? refreshToken,
+ }) {
+ final $result = create();
+ if (refreshToken != null) {
+ $result.refreshToken = refreshToken;
+ }
+ return $result;
+ }
+ RefreshTokenRequest._() : super();
+ factory RefreshTokenRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory RefreshTokenRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'RefreshTokenRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOS(1, _omitFieldNames ? '' : 'refreshToken')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ RefreshTokenRequest clone() => RefreshTokenRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ RefreshTokenRequest copyWith(void Function(RefreshTokenRequest) updates) => super.copyWith((message) => updates(message as RefreshTokenRequest)) as RefreshTokenRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static RefreshTokenRequest create() => RefreshTokenRequest._();
+ RefreshTokenRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static RefreshTokenRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static RefreshTokenRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.String get refreshToken => $_getSZ(0);
+ @$pb.TagNumber(1)
+ set refreshToken($core.String v) { $_setString(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasRefreshToken() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearRefreshToken() => clearField(1);
+}
+
+class RefreshTokenResponse extends $pb.GeneratedMessage {
+ factory RefreshTokenResponse({
+ $core.String? accessToken,
+ $0.Timestamp? accessTokenExpiresAt,
+ }) {
+ final $result = create();
+ if (accessToken != null) {
+ $result.accessToken = accessToken;
+ }
+ if (accessTokenExpiresAt != null) {
+ $result.accessTokenExpiresAt = accessTokenExpiresAt;
+ }
+ return $result;
+ }
+ RefreshTokenResponse._() : super();
+ factory RefreshTokenResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory RefreshTokenResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'RefreshTokenResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOS(1, _omitFieldNames ? '' : 'accessToken')
+ ..aOM<$0.Timestamp>(2, _omitFieldNames ? '' : 'accessTokenExpiresAt', subBuilder: $0.Timestamp.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ RefreshTokenResponse clone() => RefreshTokenResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ RefreshTokenResponse copyWith(void Function(RefreshTokenResponse) updates) => super.copyWith((message) => updates(message as RefreshTokenResponse)) as RefreshTokenResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static RefreshTokenResponse create() => RefreshTokenResponse._();
+ RefreshTokenResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static RefreshTokenResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static RefreshTokenResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.String get accessToken => $_getSZ(0);
+ @$pb.TagNumber(1)
+ set accessToken($core.String v) { $_setString(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccessToken() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccessToken() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $0.Timestamp get accessTokenExpiresAt => $_getN(1);
+ @$pb.TagNumber(2)
+ set accessTokenExpiresAt($0.Timestamp v) { setField(2, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasAccessTokenExpiresAt() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearAccessTokenExpiresAt() => clearField(2);
+ @$pb.TagNumber(2)
+ $0.Timestamp ensureAccessTokenExpiresAt() => $_ensure(1);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_refresh_token.pbenum.dart b/frontend/app/lib/pb/rpc_refresh_token.pbenum.dart
new file mode 100644
index 0000000..7499f0c
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_refresh_token.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_refresh_token.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_refresh_token.pbjson.dart b/frontend/app/lib/pb/rpc_refresh_token.pbjson.dart
new file mode 100644
index 0000000..875d1b7
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_refresh_token.pbjson.dart
@@ -0,0 +1,72 @@
+//
+// Generated code. Do not modify.
+// source: rpc_refresh_token.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use refreshTokenRequestDescriptor instead')
+const RefreshTokenRequest$json = {
+ '1': 'RefreshTokenRequest',
+ '2': [
+ {'1': 'refresh_token', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'refreshToken'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `RefreshTokenRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List refreshTokenRequestDescriptor = $convert.base64Decode(
+ 'ChNSZWZyZXNoVG9rZW5SZXF1ZXN0EvoCCg1yZWZyZXNoX3Rva2VuGAEgASgJQtQCkkHQAioNUm'
+ 'VmcmVzaCBUb2tlbkq+AiJ2NC5wdWJsaWMuZXlKbGJXRnBiQ0k2SW1FeVFHSXVaR1VpTENKbGVI'
+ 'QWlPaUl5TURJekxURXdMVEEyVkRBeE9qQXlPakE1S3pBeU9qQXdJaXdpYVdGMElqb2lNakF5TX'
+ 'kweE1DMHdOVlF3TVRvd01qb3dPU3N3TWpvd01DSXNJbWxrSWpvaU5XVXhaRFkzWkdFdE4yTTVZ'
+ 'aTAwTXpZMUxXRTBaRFV0TTJOak1HRXdOVEV5TkRGbElpd2libUptSWpvaU1qQXlNeTB4TUMwd0'
+ '5WUXdNVG93TWpvd09Tc3dNam93TUNKOUJvWDM2dzBwbzF2dkhTanNCUF9LV2VGeFYxeFJiUWF5'
+ 'cWJKdUlvSzJqS3F5MUJ0MlJvSHlKYkxvQ0VPMTVDUlQ1RG5RNlAwQUhsQnpqc1h0NjFhRER3Il'
+ 'IMcmVmcmVzaFRva2VuOrkDkkG1AwpfKhVSZWZyZXNoIFRva2VuIFJlcXVlc3QyNkdldCBhIG5l'
+ 'dyBBY2Nlc3MgVG9rZW4gYnkgc3VibWl0dGluZyB0aGUgUmVmcmVzaCBUb2tlbtIBDXJlZnJlc2'
+ 'hfdG9rZW4y0QJ7InJlZnJlc2hfdG9rZW4iOiAidjQucHVibGljLmV5SmxiV0ZwYkNJNkltRXlR'
+ 'R0l1WkdVaUxDSmxlSEFpT2lJeU1ESXpMVEV3TFRBMlZEQXhPakF5T2pBNUt6QXlPakF3SWl3aW'
+ 'FXRjBJam9pTWpBeU15MHhNQzB3TlZRd01Ub3dNam93T1Nzd01qb3dNQ0lzSW1sa0lqb2lOV1V4'
+ 'WkRZM1pHRXROMk01WWkwME16WTFMV0UwWkRVdE0yTmpNR0V3TlRFeU5ERmxJaXdpYm1KbUlqb2'
+ 'lNakF5TXkweE1DMHdOVlF3TVRvd01qb3dPU3N3TWpvd01DSjlCb1gzNncwcG8xdnZIU2pzQlBf'
+ 'S1dlRnhWMXhSYlFheXFiSnVJb0syaktxeTFCdDJSb0h5SmJMb0NFTzE1Q1JUNURuUTZQMEFIbE'
+ 'J6anNYdDYxYUREdyJ9');
+
+@$core.Deprecated('Use refreshTokenResponseDescriptor instead')
+const RefreshTokenResponse$json = {
+ '1': 'RefreshTokenResponse',
+ '2': [
+ {'1': 'access_token', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'accessToken'},
+ {'1': 'access_token_expires_at', '3': 2, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '10': 'accessTokenExpiresAt'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `RefreshTokenResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List refreshTokenResponseDescriptor = $convert.base64Decode(
+ 'ChRSZWZyZXNoVG9rZW5SZXNwb25zZRL3AgoMYWNjZXNzX3Rva2VuGAEgASgJQtMCkkHPAioMQW'
+ 'NjZXNzIFRva2VuSr4CInY0LnB1YmxpYy5leUpsYldGcGJDSTZJbUV5UUdJdVpHVWlMQ0psZUhB'
+ 'aU9pSXlNREl6TFRFd0xUQTFWREF4T2pFM09qQTVLekF5T2pBd0lpd2lhV0YwSWpvaU1qQXlNeT'
+ 'B4TUMwd05WUXdNVG93TWpvd09Tc3dNam93TUNJc0ltbGtJam9pWmpsaE1qRTJPV1F0TVdZeFlT'
+ 'MDBZVGhpTFRnelpXRXROemt4TXpZNVlqWTNabVl4SWl3aWJtSm1Jam9pTWpBeU15MHhNQzB3Tl'
+ 'ZRd01Ub3dNam93T1Nzd01qb3dNQ0o5QWgwYlZieDlTMUxSLXBmOGhMV1ZSUVBVZks5enJIWnZB'
+ 'N0FwSjVhWlh3aEE3SDFqLWtIaGNjQmpPQUdZWFpRVC10czdKcTNTSmx6bzV2dFVqR0J0RGciUg'
+ 'thY2Nlc3NUb2tlbhJRChdhY2Nlc3NfdG9rZW5fZXhwaXJlc19hdBgCIAEoCzIaLmdvb2dsZS5w'
+ 'cm90b2J1Zi5UaW1lc3RhbXBSFGFjY2Vzc1Rva2VuRXhwaXJlc0F0OvECkkHtAgoYKhZSZWZyZX'
+ 'NoIFRva2VuIFJlc3BvbnNlMtACeyJhY2Nlc3NfdG9rZW4iOiAidjQucHVibGljLmV5SmxiV0Zw'
+ 'YkNJNkltRXlRR0l1WkdVaUxDSmxlSEFpT2lJeU1ESXpMVEV3TFRBMVZEQXhPakUzT2pBNUt6QX'
+ 'lPakF3SWl3aWFXRjBJam9pTWpBeU15MHhNQzB3TlZRd01Ub3dNam93T1Nzd01qb3dNQ0lzSW1s'
+ 'a0lqb2laamxoTWpFMk9XUXRNV1l4WVMwMFlUaGlMVGd6WldFdE56a3hNelk1WWpZM1ptWXhJaX'
+ 'dpYm1KbUlqb2lNakF5TXkweE1DMHdOVlF3TVRvd01qb3dPU3N3TWpvd01DSjlBaDBiVmJ4OVMx'
+ 'TFItcGY4aExXVlJRUFVmSzl6ckhadkE3QXBKNWFaWHdoQTdIMWota0hoY2NCak9BR1lYWlFULX'
+ 'RzN0pxM1NKbHpvNXZ0VWpHQnREZyJ9');
+
diff --git a/frontend/app/lib/pb/rpc_refresh_token.pbserver.dart b/frontend/app/lib/pb/rpc_refresh_token.pbserver.dart
new file mode 100644
index 0000000..df1bd59
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_refresh_token.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_refresh_token.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_refresh_token.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_update_account.pb.dart b/frontend/app/lib/pb/rpc_update_account.pb.dart
new file mode 100644
index 0000000..049177b
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account.pb.dart
@@ -0,0 +1,151 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'account.pb.dart' as $2;
+
+class UpdateAccountRequest extends $pb.GeneratedMessage {
+ factory UpdateAccountRequest({
+ $fixnum.Int64? accountId,
+ $core.String? email,
+ $core.String? password,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (email != null) {
+ $result.email = email;
+ }
+ if (password != null) {
+ $result.password = password;
+ }
+ return $result;
+ }
+ UpdateAccountRequest._() : super();
+ factory UpdateAccountRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UpdateAccountRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdateAccountRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(2, _omitFieldNames ? '' : 'email')
+ ..aOS(3, _omitFieldNames ? '' : 'password')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountRequest clone() => UpdateAccountRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountRequest copyWith(void Function(UpdateAccountRequest) updates) => super.copyWith((message) => updates(message as UpdateAccountRequest)) as UpdateAccountRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountRequest create() => UpdateAccountRequest._();
+ UpdateAccountRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UpdateAccountRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.String get email => $_getSZ(1);
+ @$pb.TagNumber(2)
+ set email($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasEmail() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearEmail() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $core.String get password => $_getSZ(2);
+ @$pb.TagNumber(3)
+ set password($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasPassword() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearPassword() => clearField(3);
+}
+
+class UpdateAccountResponse extends $pb.GeneratedMessage {
+ factory UpdateAccountResponse({
+ $2.Account? account,
+ }) {
+ final $result = create();
+ if (account != null) {
+ $result.account = account;
+ }
+ return $result;
+ }
+ UpdateAccountResponse._() : super();
+ factory UpdateAccountResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UpdateAccountResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdateAccountResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$2.Account>(1, _omitFieldNames ? '' : 'account', subBuilder: $2.Account.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountResponse clone() => UpdateAccountResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountResponse copyWith(void Function(UpdateAccountResponse) updates) => super.copyWith((message) => updates(message as UpdateAccountResponse)) as UpdateAccountResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountResponse create() => UpdateAccountResponse._();
+ UpdateAccountResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UpdateAccountResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $2.Account get account => $_getN(0);
+ @$pb.TagNumber(1)
+ set account($2.Account v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccount() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccount() => clearField(1);
+ @$pb.TagNumber(1)
+ $2.Account ensureAccount() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_update_account.pbenum.dart b/frontend/app/lib/pb/rpc_update_account.pbenum.dart
new file mode 100644
index 0000000..3001d6b
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_update_account.pbjson.dart b/frontend/app/lib/pb/rpc_update_account.pbjson.dart
new file mode 100644
index 0000000..dbf5c0d
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account.pbjson.dart
@@ -0,0 +1,53 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use updateAccountRequestDescriptor instead')
+const UpdateAccountRequest$json = {
+ '1': 'UpdateAccountRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '10': 'accountId'},
+ {'1': 'email', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'email', '17': true},
+ {'1': 'password', '3': 3, '4': 1, '5': 9, '9': 1, '10': 'password', '17': true},
+ ],
+ '7': {},
+ '8': [
+ {'1': '_email'},
+ {'1': '_password'},
+ ],
+};
+
+/// Descriptor for `UpdateAccountRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List updateAccountRequestDescriptor = $convert.base64Decode(
+ 'ChRVcGRhdGVBY2NvdW50UmVxdWVzdBIdCgphY2NvdW50X2lkGAEgASgEUglhY2NvdW50SWQSGQ'
+ 'oFZW1haWwYAiABKAlIAFIFZW1haWyIAQESHwoIcGFzc3dvcmQYAyABKAlIAVIIcGFzc3dvcmSI'
+ 'AQE6cZJBbgo2Kg5VcGRhdGUgQWNjb3VudDIRVXBkYXRlIGFuIEFjY291bnTSAQVlbWFpbNIBCH'
+ 'Bhc3N3b3JkMjR7ImFjY291bnRfaWQiOiAiMSIsICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxl'
+ 'LmNvbSJ9QggKBl9lbWFpbEILCglfcGFzc3dvcmQ=');
+
+@$core.Deprecated('Use updateAccountResponseDescriptor instead')
+const UpdateAccountResponse$json = {
+ '1': 'UpdateAccountResponse',
+ '2': [
+ {'1': 'account', '3': 1, '4': 1, '5': 11, '6': '.pb.Account', '8': {}, '10': 'account'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `UpdateAccountResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List updateAccountResponseDescriptor = $convert.base64Decode(
+ 'ChVVcGRhdGVBY2NvdW50UmVzcG9uc2USKgoHYWNjb3VudBgBIAEoCzILLnBiLkFjY291bnRCA5'
+ 'JBAFIHYWNjb3VudDozkkEwCi4qD1VwZGF0ZWQgQWNjb3VudDIbUmV0dXJucyB0aGUgdXBkYXRl'
+ 'ZCBBY2NvdW50');
+
diff --git a/frontend/app/lib/pb/rpc_update_account.pbserver.dart b/frontend/app/lib/pb/rpc_update_account.pbserver.dart
new file mode 100644
index 0000000..8268e1e
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_update_account.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_update_account_info.pb.dart b/frontend/app/lib/pb/rpc_update_account_info.pb.dart
new file mode 100644
index 0000000..f7066bf
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account_info.pb.dart
@@ -0,0 +1,238 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'account_info.pb.dart' as $1;
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class UpdateAccountInfoRequest extends $pb.GeneratedMessage {
+ factory UpdateAccountInfoRequest({
+ $fixnum.Int64? accountId,
+ $core.String? firstname,
+ $core.String? lastname,
+ $core.String? street,
+ $core.String? city,
+ $core.String? zip,
+ $core.String? country,
+ $core.String? phone,
+ $0.Timestamp? birthday,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (firstname != null) {
+ $result.firstname = firstname;
+ }
+ if (lastname != null) {
+ $result.lastname = lastname;
+ }
+ if (street != null) {
+ $result.street = street;
+ }
+ if (city != null) {
+ $result.city = city;
+ }
+ if (zip != null) {
+ $result.zip = zip;
+ }
+ if (country != null) {
+ $result.country = country;
+ }
+ if (phone != null) {
+ $result.phone = phone;
+ }
+ if (birthday != null) {
+ $result.birthday = birthday;
+ }
+ return $result;
+ }
+ UpdateAccountInfoRequest._() : super();
+ factory UpdateAccountInfoRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UpdateAccountInfoRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdateAccountInfoRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(4, _omitFieldNames ? '' : 'firstname')
+ ..aOS(5, _omitFieldNames ? '' : 'lastname')
+ ..aOS(6, _omitFieldNames ? '' : 'street')
+ ..aOS(7, _omitFieldNames ? '' : 'city')
+ ..aOS(8, _omitFieldNames ? '' : 'zip')
+ ..aOS(9, _omitFieldNames ? '' : 'country')
+ ..aOS(10, _omitFieldNames ? '' : 'phone')
+ ..aOM<$0.Timestamp>(11, _omitFieldNames ? '' : 'birthday', subBuilder: $0.Timestamp.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountInfoRequest clone() => UpdateAccountInfoRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountInfoRequest copyWith(void Function(UpdateAccountInfoRequest) updates) => super.copyWith((message) => updates(message as UpdateAccountInfoRequest)) as UpdateAccountInfoRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountInfoRequest create() => UpdateAccountInfoRequest._();
+ UpdateAccountInfoRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountInfoRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UpdateAccountInfoRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+
+ @$pb.TagNumber(4)
+ $core.String get firstname => $_getSZ(1);
+ @$pb.TagNumber(4)
+ set firstname($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasFirstname() => $_has(1);
+ @$pb.TagNumber(4)
+ void clearFirstname() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get lastname => $_getSZ(2);
+ @$pb.TagNumber(5)
+ set lastname($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasLastname() => $_has(2);
+ @$pb.TagNumber(5)
+ void clearLastname() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $core.String get street => $_getSZ(3);
+ @$pb.TagNumber(6)
+ set street($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasStreet() => $_has(3);
+ @$pb.TagNumber(6)
+ void clearStreet() => clearField(6);
+
+ @$pb.TagNumber(7)
+ $core.String get city => $_getSZ(4);
+ @$pb.TagNumber(7)
+ set city($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasCity() => $_has(4);
+ @$pb.TagNumber(7)
+ void clearCity() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $core.String get zip => $_getSZ(5);
+ @$pb.TagNumber(8)
+ set zip($core.String v) { $_setString(5, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasZip() => $_has(5);
+ @$pb.TagNumber(8)
+ void clearZip() => clearField(8);
+
+ @$pb.TagNumber(9)
+ $core.String get country => $_getSZ(6);
+ @$pb.TagNumber(9)
+ set country($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(9)
+ $core.bool hasCountry() => $_has(6);
+ @$pb.TagNumber(9)
+ void clearCountry() => clearField(9);
+
+ @$pb.TagNumber(10)
+ $core.String get phone => $_getSZ(7);
+ @$pb.TagNumber(10)
+ set phone($core.String v) { $_setString(7, v); }
+ @$pb.TagNumber(10)
+ $core.bool hasPhone() => $_has(7);
+ @$pb.TagNumber(10)
+ void clearPhone() => clearField(10);
+
+ @$pb.TagNumber(11)
+ $0.Timestamp get birthday => $_getN(8);
+ @$pb.TagNumber(11)
+ set birthday($0.Timestamp v) { setField(11, v); }
+ @$pb.TagNumber(11)
+ $core.bool hasBirthday() => $_has(8);
+ @$pb.TagNumber(11)
+ void clearBirthday() => clearField(11);
+ @$pb.TagNumber(11)
+ $0.Timestamp ensureBirthday() => $_ensure(8);
+}
+
+class UpdateAccountInfoResponse extends $pb.GeneratedMessage {
+ factory UpdateAccountInfoResponse({
+ $1.AccountInfo? accountInfo,
+ }) {
+ final $result = create();
+ if (accountInfo != null) {
+ $result.accountInfo = accountInfo;
+ }
+ return $result;
+ }
+ UpdateAccountInfoResponse._() : super();
+ factory UpdateAccountInfoResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UpdateAccountInfoResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdateAccountInfoResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$1.AccountInfo>(1, _omitFieldNames ? '' : 'accountInfo', subBuilder: $1.AccountInfo.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountInfoResponse clone() => UpdateAccountInfoResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountInfoResponse copyWith(void Function(UpdateAccountInfoResponse) updates) => super.copyWith((message) => updates(message as UpdateAccountInfoResponse)) as UpdateAccountInfoResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountInfoResponse create() => UpdateAccountInfoResponse._();
+ UpdateAccountInfoResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountInfoResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UpdateAccountInfoResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $1.AccountInfo get accountInfo => $_getN(0);
+ @$pb.TagNumber(1)
+ set accountInfo($1.AccountInfo v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountInfo() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountInfo() => clearField(1);
+ @$pb.TagNumber(1)
+ $1.AccountInfo ensureAccountInfo() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_update_account_info.pbenum.dart b/frontend/app/lib/pb/rpc_update_account_info.pbenum.dart
new file mode 100644
index 0000000..3522522
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account_info.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_update_account_info.pbjson.dart b/frontend/app/lib/pb/rpc_update_account_info.pbjson.dart
new file mode 100644
index 0000000..284aca0
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account_info.pbjson.dart
@@ -0,0 +1,70 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use updateAccountInfoRequestDescriptor instead')
+const UpdateAccountInfoRequest$json = {
+ '1': 'UpdateAccountInfoRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '10': 'accountId'},
+ {'1': 'firstname', '3': 4, '4': 1, '5': 9, '9': 0, '10': 'firstname', '17': true},
+ {'1': 'lastname', '3': 5, '4': 1, '5': 9, '9': 1, '10': 'lastname', '17': true},
+ {'1': 'street', '3': 6, '4': 1, '5': 9, '9': 2, '10': 'street', '17': true},
+ {'1': 'city', '3': 7, '4': 1, '5': 9, '9': 3, '10': 'city', '17': true},
+ {'1': 'zip', '3': 8, '4': 1, '5': 9, '9': 4, '10': 'zip', '17': true},
+ {'1': 'country', '3': 9, '4': 1, '5': 9, '9': 5, '10': 'country', '17': true},
+ {'1': 'phone', '3': 10, '4': 1, '5': 9, '9': 6, '10': 'phone', '17': true},
+ {'1': 'birthday', '3': 11, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '9': 7, '10': 'birthday', '17': true},
+ ],
+ '7': {},
+ '8': [
+ {'1': '_firstname'},
+ {'1': '_lastname'},
+ {'1': '_street'},
+ {'1': '_city'},
+ {'1': '_zip'},
+ {'1': '_country'},
+ {'1': '_phone'},
+ {'1': '_birthday'},
+ ],
+};
+
+/// Descriptor for `UpdateAccountInfoRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List updateAccountInfoRequestDescriptor = $convert.base64Decode(
+ 'ChhVcGRhdGVBY2NvdW50SW5mb1JlcXVlc3QSHQoKYWNjb3VudF9pZBgBIAEoBFIJYWNjb3VudE'
+ 'lkEiEKCWZpcnN0bmFtZRgEIAEoCUgAUglmaXJzdG5hbWWIAQESHwoIbGFzdG5hbWUYBSABKAlI'
+ 'AVIIbGFzdG5hbWWIAQESGwoGc3RyZWV0GAYgASgJSAJSBnN0cmVldIgBARIXCgRjaXR5GAcgAS'
+ 'gJSANSBGNpdHmIAQESFQoDemlwGAggASgJSARSA3ppcIgBARIdCgdjb3VudHJ5GAkgASgJSAVS'
+ 'B2NvdW50cnmIAQESGQoFcGhvbmUYCiABKAlIBlIFcGhvbmWIAQESWAoIYmlydGhkYXkYCyABKA'
+ 'syGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQhuSQRhKFiIxOTkwLTEwLTA1VDAwOjAwOjAw'
+ 'WiJIB1IIYmlydGhkYXmIAQE6ZJJBYQowKhJVcGRhdGUgQWNjb3VudEluZm8yFVVwZGF0ZSBhbi'
+ 'BBY2NvdW50SW5mb9IBAmlkMi17ImFjY291bnRfaWQiOiAiMSIsICJzdHJlZXQiOiAiRGVhdGgg'
+ 'U3RhciAyIn1CDAoKX2ZpcnN0bmFtZUILCglfbGFzdG5hbWVCCQoHX3N0cmVldEIHCgVfY2l0eU'
+ 'IGCgRfemlwQgoKCF9jb3VudHJ5QggKBl9waG9uZUILCglfYmlydGhkYXk=');
+
+@$core.Deprecated('Use updateAccountInfoResponseDescriptor instead')
+const UpdateAccountInfoResponse$json = {
+ '1': 'UpdateAccountInfoResponse',
+ '2': [
+ {'1': 'account_info', '3': 1, '4': 1, '5': 11, '6': '.pb.AccountInfo', '8': {}, '10': 'accountInfo'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `UpdateAccountInfoResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List updateAccountInfoResponseDescriptor = $convert.base64Decode(
+ 'ChlVcGRhdGVBY2NvdW50SW5mb1Jlc3BvbnNlEjcKDGFjY291bnRfaW5mbxgBIAEoCzIPLnBiLk'
+ 'FjY291bnRJbmZvQgOSQQBSC2FjY291bnRJbmZvOjOSQTAKLioPVXBkYXRlZCBBY2NvdW50MhtS'
+ 'ZXR1cm5zIHRoZSB1cGRhdGVkIEFjY291bnQ=');
+
diff --git a/frontend/app/lib/pb/rpc_update_account_info.pbserver.dart b/frontend/app/lib/pb/rpc_update_account_info.pbserver.dart
new file mode 100644
index 0000000..181645c
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account_info.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account_info.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_update_account_info.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_update_account_privacy.pb.dart b/frontend/app/lib/pb/rpc_update_account_privacy.pb.dart
new file mode 100644
index 0000000..68719c9
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account_privacy.pb.dart
@@ -0,0 +1,137 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account_privacy.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'account_info.pb.dart' as $1;
+
+class UpdateAccountPrivacyRequest extends $pb.GeneratedMessage {
+ factory UpdateAccountPrivacyRequest({
+ $fixnum.Int64? accountId,
+ $core.bool? privacyAccepted,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (privacyAccepted != null) {
+ $result.privacyAccepted = privacyAccepted;
+ }
+ return $result;
+ }
+ UpdateAccountPrivacyRequest._() : super();
+ factory UpdateAccountPrivacyRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UpdateAccountPrivacyRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdateAccountPrivacyRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOB(2, _omitFieldNames ? '' : 'privacyAccepted')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountPrivacyRequest clone() => UpdateAccountPrivacyRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountPrivacyRequest copyWith(void Function(UpdateAccountPrivacyRequest) updates) => super.copyWith((message) => updates(message as UpdateAccountPrivacyRequest)) as UpdateAccountPrivacyRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountPrivacyRequest create() => UpdateAccountPrivacyRequest._();
+ UpdateAccountPrivacyRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountPrivacyRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UpdateAccountPrivacyRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.bool get privacyAccepted => $_getBF(1);
+ @$pb.TagNumber(2)
+ set privacyAccepted($core.bool v) { $_setBool(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasPrivacyAccepted() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearPrivacyAccepted() => clearField(2);
+}
+
+class UpdateAccountPrivacyResponse extends $pb.GeneratedMessage {
+ factory UpdateAccountPrivacyResponse({
+ $1.AccountInfo? accountInfo,
+ }) {
+ final $result = create();
+ if (accountInfo != null) {
+ $result.accountInfo = accountInfo;
+ }
+ return $result;
+ }
+ UpdateAccountPrivacyResponse._() : super();
+ factory UpdateAccountPrivacyResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UpdateAccountPrivacyResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdateAccountPrivacyResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$1.AccountInfo>(1, _omitFieldNames ? '' : 'accountInfo', subBuilder: $1.AccountInfo.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountPrivacyResponse clone() => UpdateAccountPrivacyResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UpdateAccountPrivacyResponse copyWith(void Function(UpdateAccountPrivacyResponse) updates) => super.copyWith((message) => updates(message as UpdateAccountPrivacyResponse)) as UpdateAccountPrivacyResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountPrivacyResponse create() => UpdateAccountPrivacyResponse._();
+ UpdateAccountPrivacyResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UpdateAccountPrivacyResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UpdateAccountPrivacyResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $1.AccountInfo get accountInfo => $_getN(0);
+ @$pb.TagNumber(1)
+ set accountInfo($1.AccountInfo v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountInfo() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountInfo() => clearField(1);
+ @$pb.TagNumber(1)
+ $1.AccountInfo ensureAccountInfo() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_update_account_privacy.pbenum.dart b/frontend/app/lib/pb/rpc_update_account_privacy.pbenum.dart
new file mode 100644
index 0000000..1e47f94
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account_privacy.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account_privacy.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_update_account_privacy.pbjson.dart b/frontend/app/lib/pb/rpc_update_account_privacy.pbjson.dart
new file mode 100644
index 0000000..55d4116
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account_privacy.pbjson.dart
@@ -0,0 +1,49 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account_privacy.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use updateAccountPrivacyRequestDescriptor instead')
+const UpdateAccountPrivacyRequest$json = {
+ '1': 'UpdateAccountPrivacyRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '8': {}, '10': 'accountId'},
+ {'1': 'privacy_accepted', '3': 2, '4': 1, '5': 8, '8': {}, '10': 'privacyAccepted'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `UpdateAccountPrivacyRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List updateAccountPrivacyRequestDescriptor = $convert.base64Decode(
+ 'ChtVcGRhdGVBY2NvdW50UHJpdmFjeVJlcXVlc3QSLQoKYWNjb3VudF9pZBgBIAEoBEIOkkELSg'
+ 'ExogIFaW50NjRSCWFjY291bnRJZBI1ChBwcml2YWN5X2FjY2VwdGVkGAIgASgIQgqSQQdKBWZh'
+ 'bHNlUg9wcml2YWN5QWNjZXB0ZWQ6oQGSQZ0BCmsqI1VwZGF0ZSBBY2NvdW50IEluZm8gUHJpdm'
+ 'FjeSBDb25zZW50MixVcGRhdGUgdGhlIFByaXZhY3kgQ29uc2VudCBvZiBhbiBBY2NvdW50SW5m'
+ 'b9IBAmlk0gEQcHJpdmFjeV9hY2NlcHRlZDIueyJhY2NvdW50X2lkIjogIjEiLCAicHJpdmFjeV'
+ '9hY2NlcHRlZCI6IHRydWUgfQ==');
+
+@$core.Deprecated('Use updateAccountPrivacyResponseDescriptor instead')
+const UpdateAccountPrivacyResponse$json = {
+ '1': 'UpdateAccountPrivacyResponse',
+ '2': [
+ {'1': 'account_info', '3': 1, '4': 1, '5': 11, '6': '.pb.AccountInfo', '8': {}, '10': 'accountInfo'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `UpdateAccountPrivacyResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List updateAccountPrivacyResponseDescriptor = $convert.base64Decode(
+ 'ChxVcGRhdGVBY2NvdW50UHJpdmFjeVJlc3BvbnNlEkwKDGFjY291bnRfaW5mbxgBIAEoCzIPLn'
+ 'BiLkFjY291bnRJbmZvQhiSQRUqE1VwZGF0ZWQgQWNjb3VudEluZm9SC2FjY291bnRJbmZvOiuS'
+ 'QSgKJiokVXBkYXRlIEFjY291bnQgSW5mbyBQcml2YWN5IFJlc3BvbnNl');
+
diff --git a/frontend/app/lib/pb/rpc_update_account_privacy.pbserver.dart b/frontend/app/lib/pb/rpc_update_account_privacy.pbserver.dart
new file mode 100644
index 0000000..2b7d3b6
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_account_privacy.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_account_privacy.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_update_account_privacy.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_update_payment.pb.dart b/frontend/app/lib/pb/rpc_update_payment.pb.dart
new file mode 100644
index 0000000..42a8739
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_payment.pb.dart
@@ -0,0 +1,235 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'payment.pb.dart' as $3;
+
+class UpdatePaymentRequest extends $pb.GeneratedMessage {
+ factory UpdatePaymentRequest({
+ $fixnum.Int64? id,
+ $core.String? paymentCategory,
+ $core.String? bankname,
+ $core.String? iBAN,
+ $core.String? bIC,
+ $core.String? paypalAccount,
+ $core.String? paypalId,
+ $core.String? paymentSystem,
+ $core.String? type,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ if (paymentCategory != null) {
+ $result.paymentCategory = paymentCategory;
+ }
+ if (bankname != null) {
+ $result.bankname = bankname;
+ }
+ if (iBAN != null) {
+ $result.iBAN = iBAN;
+ }
+ if (bIC != null) {
+ $result.bIC = bIC;
+ }
+ if (paypalAccount != null) {
+ $result.paypalAccount = paypalAccount;
+ }
+ if (paypalId != null) {
+ $result.paypalId = paypalId;
+ }
+ if (paymentSystem != null) {
+ $result.paymentSystem = paymentSystem;
+ }
+ if (type != null) {
+ $result.type = type;
+ }
+ return $result;
+ }
+ UpdatePaymentRequest._() : super();
+ factory UpdatePaymentRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UpdatePaymentRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdatePaymentRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(2, _omitFieldNames ? '' : 'paymentCategory')
+ ..aOS(3, _omitFieldNames ? '' : 'bankname')
+ ..aOS(4, _omitFieldNames ? '' : 'IBAN', protoName: 'IBAN')
+ ..aOS(5, _omitFieldNames ? '' : 'BIC', protoName: 'BIC')
+ ..aOS(6, _omitFieldNames ? '' : 'paypalAccount')
+ ..aOS(7, _omitFieldNames ? '' : 'paypalId')
+ ..aOS(8, _omitFieldNames ? '' : 'paymentSystem')
+ ..aOS(9, _omitFieldNames ? '' : 'type')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UpdatePaymentRequest clone() => UpdatePaymentRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UpdatePaymentRequest copyWith(void Function(UpdatePaymentRequest) updates) => super.copyWith((message) => updates(message as UpdatePaymentRequest)) as UpdatePaymentRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UpdatePaymentRequest create() => UpdatePaymentRequest._();
+ UpdatePaymentRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UpdatePaymentRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UpdatePaymentRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.String get paymentCategory => $_getSZ(1);
+ @$pb.TagNumber(2)
+ set paymentCategory($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasPaymentCategory() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearPaymentCategory() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $core.String get bankname => $_getSZ(2);
+ @$pb.TagNumber(3)
+ set bankname($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasBankname() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearBankname() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get iBAN => $_getSZ(3);
+ @$pb.TagNumber(4)
+ set iBAN($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasIBAN() => $_has(3);
+ @$pb.TagNumber(4)
+ void clearIBAN() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get bIC => $_getSZ(4);
+ @$pb.TagNumber(5)
+ set bIC($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasBIC() => $_has(4);
+ @$pb.TagNumber(5)
+ void clearBIC() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $core.String get paypalAccount => $_getSZ(5);
+ @$pb.TagNumber(6)
+ set paypalAccount($core.String v) { $_setString(5, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasPaypalAccount() => $_has(5);
+ @$pb.TagNumber(6)
+ void clearPaypalAccount() => clearField(6);
+
+ @$pb.TagNumber(7)
+ $core.String get paypalId => $_getSZ(6);
+ @$pb.TagNumber(7)
+ set paypalId($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasPaypalId() => $_has(6);
+ @$pb.TagNumber(7)
+ void clearPaypalId() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $core.String get paymentSystem => $_getSZ(7);
+ @$pb.TagNumber(8)
+ set paymentSystem($core.String v) { $_setString(7, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasPaymentSystem() => $_has(7);
+ @$pb.TagNumber(8)
+ void clearPaymentSystem() => clearField(8);
+
+ @$pb.TagNumber(9)
+ $core.String get type => $_getSZ(8);
+ @$pb.TagNumber(9)
+ set type($core.String v) { $_setString(8, v); }
+ @$pb.TagNumber(9)
+ $core.bool hasType() => $_has(8);
+ @$pb.TagNumber(9)
+ void clearType() => clearField(9);
+}
+
+class UpdatePaymentResponse extends $pb.GeneratedMessage {
+ factory UpdatePaymentResponse({
+ $3.Payment? payment,
+ }) {
+ final $result = create();
+ if (payment != null) {
+ $result.payment = payment;
+ }
+ return $result;
+ }
+ UpdatePaymentResponse._() : super();
+ factory UpdatePaymentResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UpdatePaymentResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdatePaymentResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$3.Payment>(1, _omitFieldNames ? '' : 'payment', subBuilder: $3.Payment.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UpdatePaymentResponse clone() => UpdatePaymentResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UpdatePaymentResponse copyWith(void Function(UpdatePaymentResponse) updates) => super.copyWith((message) => updates(message as UpdatePaymentResponse)) as UpdatePaymentResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UpdatePaymentResponse create() => UpdatePaymentResponse._();
+ UpdatePaymentResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UpdatePaymentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UpdatePaymentResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $3.Payment get payment => $_getN(0);
+ @$pb.TagNumber(1)
+ set payment($3.Payment v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasPayment() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearPayment() => clearField(1);
+ @$pb.TagNumber(1)
+ $3.Payment ensurePayment() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_update_payment.pbenum.dart b/frontend/app/lib/pb/rpc_update_payment.pbenum.dart
new file mode 100644
index 0000000..450d71c
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_payment.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_update_payment.pbjson.dart b/frontend/app/lib/pb/rpc_update_payment.pbjson.dart
new file mode 100644
index 0000000..ae8f9ad
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_payment.pbjson.dart
@@ -0,0 +1,73 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use updatePaymentRequestDescriptor instead')
+const UpdatePaymentRequest$json = {
+ '1': 'UpdatePaymentRequest',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ {'1': 'payment_category', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'paymentCategory', '17': true},
+ {'1': 'bankname', '3': 3, '4': 1, '5': 9, '9': 1, '10': 'bankname', '17': true},
+ {'1': 'IBAN', '3': 4, '4': 1, '5': 9, '9': 2, '10': 'IBAN', '17': true},
+ {'1': 'BIC', '3': 5, '4': 1, '5': 9, '9': 3, '10': 'BIC', '17': true},
+ {'1': 'paypal_account', '3': 6, '4': 1, '5': 9, '9': 4, '10': 'paypalAccount', '17': true},
+ {'1': 'paypal_id', '3': 7, '4': 1, '5': 9, '9': 5, '10': 'paypalId', '17': true},
+ {'1': 'payment_system', '3': 8, '4': 1, '5': 9, '9': 6, '10': 'paymentSystem', '17': true},
+ {'1': 'type', '3': 9, '4': 1, '5': 9, '9': 7, '10': 'type', '17': true},
+ ],
+ '7': {},
+ '8': [
+ {'1': '_payment_category'},
+ {'1': '_bankname'},
+ {'1': '_IBAN'},
+ {'1': '_BIC'},
+ {'1': '_paypal_account'},
+ {'1': '_paypal_id'},
+ {'1': '_payment_system'},
+ {'1': '_type'},
+ ],
+};
+
+/// Descriptor for `UpdatePaymentRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List updatePaymentRequestDescriptor = $convert.base64Decode(
+ 'ChRVcGRhdGVQYXltZW50UmVxdWVzdBIOCgJpZBgBIAEoBFICaWQSLgoQcGF5bWVudF9jYXRlZ2'
+ '9yeRgCIAEoCUgAUg9wYXltZW50Q2F0ZWdvcnmIAQESHwoIYmFua25hbWUYAyABKAlIAVIIYmFu'
+ 'a25hbWWIAQESFwoESUJBThgEIAEoCUgCUgRJQkFOiAEBEhUKA0JJQxgFIAEoCUgDUgNCSUOIAQ'
+ 'ESKgoOcGF5cGFsX2FjY291bnQYBiABKAlIBFINcGF5cGFsQWNjb3VudIgBARIgCglwYXlwYWxf'
+ 'aWQYByABKAlIBVIIcGF5cGFsSWSIAQESKgoOcGF5bWVudF9zeXN0ZW0YCCABKAlIBlINcGF5bW'
+ 'VudFN5c3RlbYgBARIXCgR0eXBlGAkgASgJSAdSBHR5cGWIAQE67wGSQesBCigqDlVwZGF0ZSBQ'
+ 'YXltZW50MhFVcGRhdGUgYW4gUGF5bWVudNIBAmlkMr4BeyJpZCI6ICIxIiwgInBheW1lbnRfY2'
+ 'F0ZWdvcnkiOiAiVEJEOiBwYXlwYWwiLCAicGF5cGFsX2FjY291bnQiOiAiam9obi5kb2VAZXhh'
+ 'bXBsZS5jb20iLCAicGF5cGFsX2lkIjogInRoaXMtaXMtYS1wYXlwYWwtaWQiLCAicGF5bWVudF'
+ '9zeXN0ZW0iOiAiVEJEOiBwYXlwYWwgc3lzdGVtIiwgInR5cGUiOiAiVEJEOiBzb21lIHR5cGUi'
+ 'fUITChFfcGF5bWVudF9jYXRlZ29yeUILCglfYmFua25hbWVCBwoFX0lCQU5CBgoEX0JJQ0IRCg'
+ '9fcGF5cGFsX2FjY291bnRCDAoKX3BheXBhbF9pZEIRCg9fcGF5bWVudF9zeXN0ZW1CBwoFX3R5'
+ 'cGU=');
+
+@$core.Deprecated('Use updatePaymentResponseDescriptor instead')
+const UpdatePaymentResponse$json = {
+ '1': 'UpdatePaymentResponse',
+ '2': [
+ {'1': 'payment', '3': 1, '4': 1, '5': 11, '6': '.pb.Payment', '8': {}, '10': 'payment'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `UpdatePaymentResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List updatePaymentResponseDescriptor = $convert.base64Decode(
+ 'ChVVcGRhdGVQYXltZW50UmVzcG9uc2USKgoHcGF5bWVudBgBIAEoCzILLnBiLlBheW1lbnRCA5'
+ 'JBAFIHcGF5bWVudDozkkEwCi4qD1VwZGF0ZWQgUGF5bWVudDIbUmV0dXJucyB0aGUgdXBkYXRl'
+ 'ZCBQYXltZW50');
+
diff --git a/frontend/app/lib/pb/rpc_update_payment.pbserver.dart b/frontend/app/lib/pb/rpc_update_payment.pbserver.dart
new file mode 100644
index 0000000..b3179bb
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_payment.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_payment.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_update_payment.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_update_person.pb.dart b/frontend/app/lib/pb/rpc_update_person.pb.dart
new file mode 100644
index 0000000..d904eba
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_person.pb.dart
@@ -0,0 +1,224 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+import 'person.pb.dart' as $4;
+
+class UpdatePersonRequest extends $pb.GeneratedMessage {
+ factory UpdatePersonRequest({
+ $fixnum.Int64? id,
+ $core.String? firstname,
+ $core.String? lastname,
+ $core.String? street,
+ $core.String? city,
+ $core.String? zip,
+ $core.String? country,
+ $0.Timestamp? birthday,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ if (firstname != null) {
+ $result.firstname = firstname;
+ }
+ if (lastname != null) {
+ $result.lastname = lastname;
+ }
+ if (street != null) {
+ $result.street = street;
+ }
+ if (city != null) {
+ $result.city = city;
+ }
+ if (zip != null) {
+ $result.zip = zip;
+ }
+ if (country != null) {
+ $result.country = country;
+ }
+ if (birthday != null) {
+ $result.birthday = birthday;
+ }
+ return $result;
+ }
+ UpdatePersonRequest._() : super();
+ factory UpdatePersonRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UpdatePersonRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdatePersonRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(2, _omitFieldNames ? '' : 'firstname')
+ ..aOS(3, _omitFieldNames ? '' : 'lastname')
+ ..aOS(4, _omitFieldNames ? '' : 'street')
+ ..aOS(5, _omitFieldNames ? '' : 'city')
+ ..aOS(6, _omitFieldNames ? '' : 'zip')
+ ..aOS(7, _omitFieldNames ? '' : 'country')
+ ..aOM<$0.Timestamp>(8, _omitFieldNames ? '' : 'birthday', subBuilder: $0.Timestamp.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UpdatePersonRequest clone() => UpdatePersonRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UpdatePersonRequest copyWith(void Function(UpdatePersonRequest) updates) => super.copyWith((message) => updates(message as UpdatePersonRequest)) as UpdatePersonRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UpdatePersonRequest create() => UpdatePersonRequest._();
+ UpdatePersonRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UpdatePersonRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UpdatePersonRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get id => $_getI64(0);
+ @$pb.TagNumber(1)
+ set id($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.String get firstname => $_getSZ(1);
+ @$pb.TagNumber(2)
+ set firstname($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasFirstname() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearFirstname() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $core.String get lastname => $_getSZ(2);
+ @$pb.TagNumber(3)
+ set lastname($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasLastname() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearLastname() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get street => $_getSZ(3);
+ @$pb.TagNumber(4)
+ set street($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasStreet() => $_has(3);
+ @$pb.TagNumber(4)
+ void clearStreet() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.String get city => $_getSZ(4);
+ @$pb.TagNumber(5)
+ set city($core.String v) { $_setString(4, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasCity() => $_has(4);
+ @$pb.TagNumber(5)
+ void clearCity() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $core.String get zip => $_getSZ(5);
+ @$pb.TagNumber(6)
+ set zip($core.String v) { $_setString(5, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasZip() => $_has(5);
+ @$pb.TagNumber(6)
+ void clearZip() => clearField(6);
+
+ @$pb.TagNumber(7)
+ $core.String get country => $_getSZ(6);
+ @$pb.TagNumber(7)
+ set country($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasCountry() => $_has(6);
+ @$pb.TagNumber(7)
+ void clearCountry() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $0.Timestamp get birthday => $_getN(7);
+ @$pb.TagNumber(8)
+ set birthday($0.Timestamp v) { setField(8, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasBirthday() => $_has(7);
+ @$pb.TagNumber(8)
+ void clearBirthday() => clearField(8);
+ @$pb.TagNumber(8)
+ $0.Timestamp ensureBirthday() => $_ensure(7);
+}
+
+class UpdatePersonResponse extends $pb.GeneratedMessage {
+ factory UpdatePersonResponse({
+ $4.Person? person,
+ }) {
+ final $result = create();
+ if (person != null) {
+ $result.person = person;
+ }
+ return $result;
+ }
+ UpdatePersonResponse._() : super();
+ factory UpdatePersonResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UpdatePersonResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdatePersonResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$4.Person>(1, _omitFieldNames ? '' : 'person', subBuilder: $4.Person.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UpdatePersonResponse clone() => UpdatePersonResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UpdatePersonResponse copyWith(void Function(UpdatePersonResponse) updates) => super.copyWith((message) => updates(message as UpdatePersonResponse)) as UpdatePersonResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UpdatePersonResponse create() => UpdatePersonResponse._();
+ UpdatePersonResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UpdatePersonResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UpdatePersonResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $4.Person get person => $_getN(0);
+ @$pb.TagNumber(1)
+ set person($4.Person v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasPerson() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearPerson() => clearField(1);
+ @$pb.TagNumber(1)
+ $4.Person ensurePerson() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_update_person.pbenum.dart b/frontend/app/lib/pb/rpc_update_person.pbenum.dart
new file mode 100644
index 0000000..50c3824
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_person.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_update_person.pbjson.dart b/frontend/app/lib/pb/rpc_update_person.pbjson.dart
new file mode 100644
index 0000000..5df2656
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_person.pbjson.dart
@@ -0,0 +1,70 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use updatePersonRequestDescriptor instead')
+const UpdatePersonRequest$json = {
+ '1': 'UpdatePersonRequest',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},
+ {'1': 'firstname', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'firstname', '17': true},
+ {'1': 'lastname', '3': 3, '4': 1, '5': 9, '9': 1, '10': 'lastname', '17': true},
+ {'1': 'street', '3': 4, '4': 1, '5': 9, '9': 2, '10': 'street', '17': true},
+ {'1': 'city', '3': 5, '4': 1, '5': 9, '9': 3, '10': 'city', '17': true},
+ {'1': 'zip', '3': 6, '4': 1, '5': 9, '9': 4, '10': 'zip', '17': true},
+ {'1': 'country', '3': 7, '4': 1, '5': 9, '9': 5, '10': 'country', '17': true},
+ {'1': 'birthday', '3': 8, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '9': 6, '10': 'birthday', '17': true},
+ ],
+ '7': {},
+ '8': [
+ {'1': '_firstname'},
+ {'1': '_lastname'},
+ {'1': '_street'},
+ {'1': '_city'},
+ {'1': '_zip'},
+ {'1': '_country'},
+ {'1': '_birthday'},
+ ],
+};
+
+/// Descriptor for `UpdatePersonRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List updatePersonRequestDescriptor = $convert.base64Decode(
+ 'ChNVcGRhdGVQZXJzb25SZXF1ZXN0Eg4KAmlkGAEgASgEUgJpZBIhCglmaXJzdG5hbWUYAiABKA'
+ 'lIAFIJZmlyc3RuYW1liAEBEh8KCGxhc3RuYW1lGAMgASgJSAFSCGxhc3RuYW1liAEBEhsKBnN0'
+ 'cmVldBgEIAEoCUgCUgZzdHJlZXSIAQESFwoEY2l0eRgFIAEoCUgDUgRjaXR5iAEBEhUKA3ppcB'
+ 'gGIAEoCUgEUgN6aXCIAQESHQoHY291bnRyeRgHIAEoCUgFUgdjb3VudHJ5iAEBElgKCGJpcnRo'
+ 'ZGF5GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIbkkEYShYiMTk5MC0xMC0wNV'
+ 'QwMDowMDowMFoiSAZSCGJpcnRoZGF5iAEBOuUBkkHhAQomKg1VcGRhdGUgUGVyc29uMhBVcGRh'
+ 'dGUgYW4gUGVyc29u0gECaWQytgF7ImlkIjogIjEiLCAiZmlyc3RuYW1lIjogIkpvaG4iLCAibG'
+ 'FzdG5hbWUiOiAiRG9lIiwgInBob25lIjogIiIsICJzdHJlZXQiOiAiRGVhdGggU3RhciAzIiwg'
+ 'InppcCI6ICIwODE2IiwgImNpdHkiOiAiTW9udGFuYSIsICJjb3VudHJ5IjogIkNhbmFkYSIsIC'
+ 'JiaXJ0aGRheSI6ICIxOTkyLTEwLTA1VDAwOjAwOjAwWiIgfUIMCgpfZmlyc3RuYW1lQgsKCV9s'
+ 'YXN0bmFtZUIJCgdfc3RyZWV0QgcKBV9jaXR5QgYKBF96aXBCCgoIX2NvdW50cnlCCwoJX2Jpcn'
+ 'RoZGF5');
+
+@$core.Deprecated('Use updatePersonResponseDescriptor instead')
+const UpdatePersonResponse$json = {
+ '1': 'UpdatePersonResponse',
+ '2': [
+ {'1': 'person', '3': 1, '4': 1, '5': 11, '6': '.pb.Person', '8': {}, '10': 'person'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `UpdatePersonResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List updatePersonResponseDescriptor = $convert.base64Decode(
+ 'ChRVcGRhdGVQZXJzb25SZXNwb25zZRInCgZwZXJzb24YASABKAsyCi5wYi5QZXJzb25CA5JBAF'
+ 'IGcGVyc29uOjGSQS4KLCoOVXBkYXRlZCBQZXJzb24yGlJldHVybnMgdGhlIHVwZGF0ZWQgUGVy'
+ 'c29u');
+
diff --git a/frontend/app/lib/pb/rpc_update_person.pbserver.dart b/frontend/app/lib/pb/rpc_update_person.pbserver.dart
new file mode 100644
index 0000000..784dbe1
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_update_person.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_update_person.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_update_person.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_upload_document.pb.dart b/frontend/app/lib/pb/rpc_upload_document.pb.dart
new file mode 100644
index 0000000..d3cec63
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_upload_document.pb.dart
@@ -0,0 +1,151 @@
+//
+// Generated code. Do not modify.
+// source: rpc_upload_document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'document.pb.dart' as $7;
+
+class UploadDocumentRequest extends $pb.GeneratedMessage {
+ factory UploadDocumentRequest({
+ $core.List<$core.int>? file,
+ $fixnum.Int64? personId,
+ $fixnum.Int64? mailId,
+ }) {
+ final $result = create();
+ if (file != null) {
+ $result.file = file;
+ }
+ if (personId != null) {
+ $result.personId = personId;
+ }
+ if (mailId != null) {
+ $result.mailId = mailId;
+ }
+ return $result;
+ }
+ UploadDocumentRequest._() : super();
+ factory UploadDocumentRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UploadDocumentRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UploadDocumentRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'file', $pb.PbFieldType.OY)
+ ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'personId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'mailId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UploadDocumentRequest clone() => UploadDocumentRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UploadDocumentRequest copyWith(void Function(UploadDocumentRequest) updates) => super.copyWith((message) => updates(message as UploadDocumentRequest)) as UploadDocumentRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UploadDocumentRequest create() => UploadDocumentRequest._();
+ UploadDocumentRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UploadDocumentRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UploadDocumentRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.List<$core.int> get file => $_getN(0);
+ @$pb.TagNumber(1)
+ set file($core.List<$core.int> v) { $_setBytes(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasFile() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearFile() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $fixnum.Int64 get personId => $_getI64(1);
+ @$pb.TagNumber(2)
+ set personId($fixnum.Int64 v) { $_setInt64(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasPersonId() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearPersonId() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $fixnum.Int64 get mailId => $_getI64(2);
+ @$pb.TagNumber(3)
+ set mailId($fixnum.Int64 v) { $_setInt64(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasMailId() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearMailId() => clearField(3);
+}
+
+class UploadDocumentResponse extends $pb.GeneratedMessage {
+ factory UploadDocumentResponse({
+ $7.Document? document,
+ }) {
+ final $result = create();
+ if (document != null) {
+ $result.document = document;
+ }
+ return $result;
+ }
+ UploadDocumentResponse._() : super();
+ factory UploadDocumentResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory UploadDocumentResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UploadDocumentResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOM<$7.Document>(1, _omitFieldNames ? '' : 'document', subBuilder: $7.Document.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ UploadDocumentResponse clone() => UploadDocumentResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ UploadDocumentResponse copyWith(void Function(UploadDocumentResponse) updates) => super.copyWith((message) => updates(message as UploadDocumentResponse)) as UploadDocumentResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static UploadDocumentResponse create() => UploadDocumentResponse._();
+ UploadDocumentResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static UploadDocumentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static UploadDocumentResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $7.Document get document => $_getN(0);
+ @$pb.TagNumber(1)
+ set document($7.Document v) { setField(1, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasDocument() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearDocument() => clearField(1);
+ @$pb.TagNumber(1)
+ $7.Document ensureDocument() => $_ensure(0);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_upload_document.pbenum.dart b/frontend/app/lib/pb/rpc_upload_document.pbenum.dart
new file mode 100644
index 0000000..556406f
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_upload_document.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_upload_document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_upload_document.pbjson.dart b/frontend/app/lib/pb/rpc_upload_document.pbjson.dart
new file mode 100644
index 0000000..d5c90fa
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_upload_document.pbjson.dart
@@ -0,0 +1,52 @@
+//
+// Generated code. Do not modify.
+// source: rpc_upload_document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use uploadDocumentRequestDescriptor instead')
+const UploadDocumentRequest$json = {
+ '1': 'UploadDocumentRequest',
+ '2': [
+ {'1': 'file', '3': 1, '4': 1, '5': 12, '10': 'file'},
+ {'1': 'person_id', '3': 2, '4': 1, '5': 4, '9': 0, '10': 'personId', '17': true},
+ {'1': 'mail_id', '3': 3, '4': 1, '5': 4, '9': 1, '10': 'mailId', '17': true},
+ ],
+ '7': {},
+ '8': [
+ {'1': '_person_id'},
+ {'1': '_mail_id'},
+ ],
+};
+
+/// Descriptor for `UploadDocumentRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List uploadDocumentRequestDescriptor = $convert.base64Decode(
+ 'ChVVcGxvYWREb2N1bWVudFJlcXVlc3QSEgoEZmlsZRgBIAEoDFIEZmlsZRIgCglwZXJzb25faW'
+ 'QYAiABKARIAFIIcGVyc29uSWSIAQESHAoHbWFpbF9pZBgDIAEoBEgBUgZtYWlsSWSIAQE6XJJB'
+ 'WQpCKhpVcGxvYWREb2N1bWVudCBbb25seSBIVFRQXTIdVXBsb2FkIGEgRG9jdW1lbnQgW29ubH'
+ 'kgSFRUUF3SAQRmaWxlMhN7InBlcnNvbl9pZCI6ICIxIiB9QgwKCl9wZXJzb25faWRCCgoIX21h'
+ 'aWxfaWQ=');
+
+@$core.Deprecated('Use uploadDocumentResponseDescriptor instead')
+const UploadDocumentResponse$json = {
+ '1': 'UploadDocumentResponse',
+ '2': [
+ {'1': 'document', '3': 1, '4': 1, '5': 11, '6': '.pb.Document', '10': 'document'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `UploadDocumentResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List uploadDocumentResponseDescriptor = $convert.base64Decode(
+ 'ChZVcGxvYWREb2N1bWVudFJlc3BvbnNlEigKCGRvY3VtZW50GAEgASgLMgwucGIuRG9jdW1lbn'
+ 'RSCGRvY3VtZW50Oh6SQRsKGSoXVXBsb2FkRG9jdW1lbnQgUmVzcG9uc2U=');
+
diff --git a/frontend/app/lib/pb/rpc_upload_document.pbserver.dart b/frontend/app/lib/pb/rpc_upload_document.pbserver.dart
new file mode 100644
index 0000000..437b306
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_upload_document.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_upload_document.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_upload_document.pb.dart';
+
diff --git a/frontend/app/lib/pb/rpc_verify_email.pb.dart b/frontend/app/lib/pb/rpc_verify_email.pb.dart
new file mode 100644
index 0000000..8abd8d4
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_verify_email.pb.dart
@@ -0,0 +1,133 @@
+//
+// Generated code. Do not modify.
+// source: rpc_verify_email.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class VerifyEmailRequest extends $pb.GeneratedMessage {
+ factory VerifyEmailRequest({
+ $fixnum.Int64? accountId,
+ $core.String? secretKey,
+ }) {
+ final $result = create();
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (secretKey != null) {
+ $result.secretKey = secretKey;
+ }
+ return $result;
+ }
+ VerifyEmailRequest._() : super();
+ factory VerifyEmailRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory VerifyEmailRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'VerifyEmailRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(2, _omitFieldNames ? '' : 'secretKey')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ VerifyEmailRequest clone() => VerifyEmailRequest()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ VerifyEmailRequest copyWith(void Function(VerifyEmailRequest) updates) => super.copyWith((message) => updates(message as VerifyEmailRequest)) as VerifyEmailRequest;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static VerifyEmailRequest create() => VerifyEmailRequest._();
+ VerifyEmailRequest createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static VerifyEmailRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static VerifyEmailRequest? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $fixnum.Int64 get accountId => $_getI64(0);
+ @$pb.TagNumber(1)
+ set accountId($fixnum.Int64 v) { $_setInt64(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasAccountId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearAccountId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $core.String get secretKey => $_getSZ(1);
+ @$pb.TagNumber(2)
+ set secretKey($core.String v) { $_setString(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasSecretKey() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearSecretKey() => clearField(2);
+}
+
+class VerifyEmailResponse extends $pb.GeneratedMessage {
+ factory VerifyEmailResponse({
+ $core.bool? verified,
+ }) {
+ final $result = create();
+ if (verified != null) {
+ $result.verified = verified;
+ }
+ return $result;
+ }
+ VerifyEmailResponse._() : super();
+ factory VerifyEmailResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory VerifyEmailResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'VerifyEmailResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOB(1, _omitFieldNames ? '' : 'verified')
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ VerifyEmailResponse clone() => VerifyEmailResponse()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ VerifyEmailResponse copyWith(void Function(VerifyEmailResponse) updates) => super.copyWith((message) => updates(message as VerifyEmailResponse)) as VerifyEmailResponse;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static VerifyEmailResponse create() => VerifyEmailResponse._();
+ VerifyEmailResponse createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static VerifyEmailResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static VerifyEmailResponse? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.bool get verified => $_getBF(0);
+ @$pb.TagNumber(1)
+ set verified($core.bool v) { $_setBool(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasVerified() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearVerified() => clearField(1);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/rpc_verify_email.pbenum.dart b/frontend/app/lib/pb/rpc_verify_email.pbenum.dart
new file mode 100644
index 0000000..e28cbf3
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_verify_email.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: rpc_verify_email.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/rpc_verify_email.pbjson.dart b/frontend/app/lib/pb/rpc_verify_email.pbjson.dart
new file mode 100644
index 0000000..a96bf98
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_verify_email.pbjson.dart
@@ -0,0 +1,46 @@
+//
+// Generated code. Do not modify.
+// source: rpc_verify_email.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use verifyEmailRequestDescriptor instead')
+const VerifyEmailRequest$json = {
+ '1': 'VerifyEmailRequest',
+ '2': [
+ {'1': 'account_id', '3': 1, '4': 1, '5': 4, '10': 'accountId'},
+ {'1': 'secret_key', '3': 2, '4': 1, '5': 9, '10': 'secretKey'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `VerifyEmailRequest`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List verifyEmailRequestDescriptor = $convert.base64Decode(
+ 'ChJWZXJpZnlFbWFpbFJlcXVlc3QSHQoKYWNjb3VudF9pZBgBIAEoBFIJYWNjb3VudElkEh0KCn'
+ 'NlY3JldF9rZXkYAiABKAlSCXNlY3JldEtleTpckkFZCicqC1ZlcmlmeUVtYWls0gEKYWNjb3Vu'
+ 'dF9pZNIBCnNlY3JldF9rZXkyLnsiaWQiOiAiMSIsICJzZWNyZXRfa2V5IjogInRoaXNpc2FzZW'
+ 'NyZXRrZXkiIH0=');
+
+@$core.Deprecated('Use verifyEmailResponseDescriptor instead')
+const VerifyEmailResponse$json = {
+ '1': 'VerifyEmailResponse',
+ '2': [
+ {'1': 'verified', '3': 1, '4': 1, '5': 8, '8': {}, '10': 'verified'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `VerifyEmailResponse`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List verifyEmailResponseDescriptor = $convert.base64Decode(
+ 'ChNWZXJpZnlFbWFpbFJlc3BvbnNlEh8KCHZlcmlmaWVkGAEgASgIQgOSQQBSCHZlcmlmaWVkOh'
+ 'uSQRgKFioUVmVyaWZ5RW1haWwgUmVzcG9uc2U=');
+
diff --git a/frontend/app/lib/pb/rpc_verify_email.pbserver.dart b/frontend/app/lib/pb/rpc_verify_email.pbserver.dart
new file mode 100644
index 0000000..2c1e023
--- /dev/null
+++ b/frontend/app/lib/pb/rpc_verify_email.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: rpc_verify_email.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'rpc_verify_email.pb.dart';
+
diff --git a/frontend/app/lib/pb/service_df.pb.dart b/frontend/app/lib/pb/service_df.pb.dart
new file mode 100644
index 0000000..6ee0f7a
--- /dev/null
+++ b/frontend/app/lib/pb/service_df.pb.dart
@@ -0,0 +1,131 @@
+//
+// Generated code. Do not modify.
+// source: service_df.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:async' as $async;
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'rpc_block_session.pb.dart' as $11;
+import 'rpc_create_account.pb.dart' as $14;
+import 'rpc_create_account_info.pb.dart' as $18;
+import 'rpc_create_payment.pb.dart' as $26;
+import 'rpc_create_person.pb.dart' as $21;
+import 'rpc_delete_document.pb.dart' as $33;
+import 'rpc_delete_payment.pb.dart' as $28;
+import 'rpc_delete_person.pb.dart' as $24;
+import 'rpc_get_account.pb.dart' as $12;
+import 'rpc_get_account_info.pb.dart' as $16;
+import 'rpc_get_payment.pb.dart' as $27;
+import 'rpc_get_person.pb.dart' as $23;
+import 'rpc_list_account_info.pb.dart' as $17;
+import 'rpc_list_accounts.pb.dart' as $13;
+import 'rpc_list_payments.pb.dart' as $29;
+import 'rpc_list_persons.pb.dart' as $25;
+import 'rpc_list_returns_log_by_person_id.pb.dart' as $31;
+import 'rpc_list_sessions.pb.dart' as $10;
+import 'rpc_login.pb.dart' as $8;
+import 'rpc_refresh_token.pb.dart' as $9;
+import 'rpc_update_account.pb.dart' as $15;
+import 'rpc_update_account_info.pb.dart' as $19;
+import 'rpc_update_account_privacy.pb.dart' as $20;
+import 'rpc_update_payment.pb.dart' as $30;
+import 'rpc_update_person.pb.dart' as $22;
+import 'rpc_upload_document.pb.dart' as $32;
+import 'rpc_verify_email.pb.dart' as $34;
+
+class dfApi {
+ $pb.RpcClient _client;
+ dfApi(this._client);
+
+ $async.Future<$8.LoginResponse> login($pb.ClientContext? ctx, $8.LoginRequest request) =>
+ _client.invoke<$8.LoginResponse>(ctx, 'df', 'Login', request, $8.LoginResponse())
+ ;
+ $async.Future<$9.RefreshTokenResponse> refreshToken($pb.ClientContext? ctx, $9.RefreshTokenRequest request) =>
+ _client.invoke<$9.RefreshTokenResponse>(ctx, 'df', 'RefreshToken', request, $9.RefreshTokenResponse())
+ ;
+ $async.Future<$10.ListSessionsResponse> listSessions($pb.ClientContext? ctx, $10.ListSessionsRequest request) =>
+ _client.invoke<$10.ListSessionsResponse>(ctx, 'df', 'ListSessions', request, $10.ListSessionsResponse())
+ ;
+ $async.Future<$11.BlockSessionResponse> blockSession($pb.ClientContext? ctx, $11.BlockSessionRequest request) =>
+ _client.invoke<$11.BlockSessionResponse>(ctx, 'df', 'BlockSession', request, $11.BlockSessionResponse())
+ ;
+ $async.Future<$12.GetAccountResponse> getAccount($pb.ClientContext? ctx, $12.GetAccountRequest request) =>
+ _client.invoke<$12.GetAccountResponse>(ctx, 'df', 'GetAccount', request, $12.GetAccountResponse())
+ ;
+ $async.Future<$13.ListAccountsResponse> listAccounts($pb.ClientContext? ctx, $13.ListAccountsRequest request) =>
+ _client.invoke<$13.ListAccountsResponse>(ctx, 'df', 'ListAccounts', request, $13.ListAccountsResponse())
+ ;
+ $async.Future<$14.CreateAccountResponse> createAccount($pb.ClientContext? ctx, $14.CreateAccountRequest request) =>
+ _client.invoke<$14.CreateAccountResponse>(ctx, 'df', 'CreateAccount', request, $14.CreateAccountResponse())
+ ;
+ $async.Future<$15.UpdateAccountResponse> updateAccount($pb.ClientContext? ctx, $15.UpdateAccountRequest request) =>
+ _client.invoke<$15.UpdateAccountResponse>(ctx, 'df', 'UpdateAccount', request, $15.UpdateAccountResponse())
+ ;
+ $async.Future<$16.GetAccountInfoResponse> getAccountInfo($pb.ClientContext? ctx, $16.GetAccountInfoRequest request) =>
+ _client.invoke<$16.GetAccountInfoResponse>(ctx, 'df', 'GetAccountInfo', request, $16.GetAccountInfoResponse())
+ ;
+ $async.Future<$17.ListAccountInfoResponse> listAccountInfo($pb.ClientContext? ctx, $17.ListAccountInfoRequest request) =>
+ _client.invoke<$17.ListAccountInfoResponse>(ctx, 'df', 'ListAccountInfo', request, $17.ListAccountInfoResponse())
+ ;
+ $async.Future<$18.CreateAccountInfoResponse> createAccountInfo($pb.ClientContext? ctx, $18.CreateAccountInfoRequest request) =>
+ _client.invoke<$18.CreateAccountInfoResponse>(ctx, 'df', 'CreateAccountInfo', request, $18.CreateAccountInfoResponse())
+ ;
+ $async.Future<$19.UpdateAccountInfoResponse> updateAccountInfo($pb.ClientContext? ctx, $19.UpdateAccountInfoRequest request) =>
+ _client.invoke<$19.UpdateAccountInfoResponse>(ctx, 'df', 'UpdateAccountInfo', request, $19.UpdateAccountInfoResponse())
+ ;
+ $async.Future<$20.UpdateAccountPrivacyResponse> updateAccountPrivacy($pb.ClientContext? ctx, $20.UpdateAccountPrivacyRequest request) =>
+ _client.invoke<$20.UpdateAccountPrivacyResponse>(ctx, 'df', 'UpdateAccountPrivacy', request, $20.UpdateAccountPrivacyResponse())
+ ;
+ $async.Future<$21.CreatePersonResponse> createPerson($pb.ClientContext? ctx, $21.CreatePersonRequest request) =>
+ _client.invoke<$21.CreatePersonResponse>(ctx, 'df', 'CreatePerson', request, $21.CreatePersonResponse())
+ ;
+ $async.Future<$22.UpdatePersonResponse> updatePerson($pb.ClientContext? ctx, $22.UpdatePersonRequest request) =>
+ _client.invoke<$22.UpdatePersonResponse>(ctx, 'df', 'UpdatePerson', request, $22.UpdatePersonResponse())
+ ;
+ $async.Future<$23.GetPersonResponse> getPerson($pb.ClientContext? ctx, $23.GetPersonRequest request) =>
+ _client.invoke<$23.GetPersonResponse>(ctx, 'df', 'GetPerson', request, $23.GetPersonResponse())
+ ;
+ $async.Future<$24.DeletePersonResponse> deletePerson($pb.ClientContext? ctx, $24.DeletePersonRequest request) =>
+ _client.invoke<$24.DeletePersonResponse>(ctx, 'df', 'DeletePerson', request, $24.DeletePersonResponse())
+ ;
+ $async.Future<$25.ListPersonsResponse> listPersons($pb.ClientContext? ctx, $25.ListPersonsRequest request) =>
+ _client.invoke<$25.ListPersonsResponse>(ctx, 'df', 'ListPersons', request, $25.ListPersonsResponse())
+ ;
+ $async.Future<$26.CreatePaymentResponse> createPayment($pb.ClientContext? ctx, $26.CreatePaymentRequest request) =>
+ _client.invoke<$26.CreatePaymentResponse>(ctx, 'df', 'CreatePayment', request, $26.CreatePaymentResponse())
+ ;
+ $async.Future<$27.GetPaymentResponse> getPayment($pb.ClientContext? ctx, $27.GetPaymentRequest request) =>
+ _client.invoke<$27.GetPaymentResponse>(ctx, 'df', 'GetPayment', request, $27.GetPaymentResponse())
+ ;
+ $async.Future<$28.DeletePaymentResponse> deletePayment($pb.ClientContext? ctx, $28.DeletePaymentRequest request) =>
+ _client.invoke<$28.DeletePaymentResponse>(ctx, 'df', 'DeletePayment', request, $28.DeletePaymentResponse())
+ ;
+ $async.Future<$29.ListPaymentsResponse> listPayments($pb.ClientContext? ctx, $29.ListPaymentsRequest request) =>
+ _client.invoke<$29.ListPaymentsResponse>(ctx, 'df', 'ListPayments', request, $29.ListPaymentsResponse())
+ ;
+ $async.Future<$30.UpdatePaymentResponse> updatePayment($pb.ClientContext? ctx, $30.UpdatePaymentRequest request) =>
+ _client.invoke<$30.UpdatePaymentResponse>(ctx, 'df', 'UpdatePayment', request, $30.UpdatePaymentResponse())
+ ;
+ $async.Future<$31.ListReturnsLogResponse> listReturnsLog($pb.ClientContext? ctx, $31.ListReturnsLogRequest request) =>
+ _client.invoke<$31.ListReturnsLogResponse>(ctx, 'df', 'ListReturnsLog', request, $31.ListReturnsLogResponse())
+ ;
+ $async.Future<$32.UploadDocumentResponse> uploadDocument($pb.ClientContext? ctx, $32.UploadDocumentRequest request) =>
+ _client.invoke<$32.UploadDocumentResponse>(ctx, 'df', 'UploadDocument', request, $32.UploadDocumentResponse())
+ ;
+ $async.Future<$33.DeleteDocumentResponse> deleteDocument($pb.ClientContext? ctx, $33.DeleteDocumentRequest request) =>
+ _client.invoke<$33.DeleteDocumentResponse>(ctx, 'df', 'DeleteDocument', request, $33.DeleteDocumentResponse())
+ ;
+ $async.Future<$34.VerifyEmailResponse> verifyEmail($pb.ClientContext? ctx, $34.VerifyEmailRequest request) =>
+ _client.invoke<$34.VerifyEmailResponse>(ctx, 'df', 'VerifyEmail', request, $34.VerifyEmailResponse())
+ ;
+}
+
diff --git a/frontend/app/lib/pb/service_df.pbenum.dart b/frontend/app/lib/pb/service_df.pbenum.dart
new file mode 100644
index 0000000..0f470fe
--- /dev/null
+++ b/frontend/app/lib/pb/service_df.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: service_df.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/service_df.pbjson.dart b/frontend/app/lib/pb/service_df.pbjson.dart
new file mode 100644
index 0000000..1ff1c56
--- /dev/null
+++ b/frontend/app/lib/pb/service_df.pbjson.dart
@@ -0,0 +1,232 @@
+//
+// Generated code. Do not modify.
+// source: service_df.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+import 'account.pbjson.dart' as $2;
+import 'account_info.pbjson.dart' as $1;
+import 'document.pbjson.dart' as $7;
+import 'google/protobuf/timestamp.pbjson.dart' as $0;
+import 'payment.pbjson.dart' as $3;
+import 'person.pbjson.dart' as $4;
+import 'returns_log.pbjson.dart' as $5;
+import 'rpc_block_session.pbjson.dart' as $11;
+import 'rpc_create_account.pbjson.dart' as $14;
+import 'rpc_create_account_info.pbjson.dart' as $18;
+import 'rpc_create_payment.pbjson.dart' as $26;
+import 'rpc_create_person.pbjson.dart' as $21;
+import 'rpc_delete_document.pbjson.dart' as $33;
+import 'rpc_delete_payment.pbjson.dart' as $28;
+import 'rpc_delete_person.pbjson.dart' as $24;
+import 'rpc_get_account.pbjson.dart' as $12;
+import 'rpc_get_account_info.pbjson.dart' as $16;
+import 'rpc_get_payment.pbjson.dart' as $27;
+import 'rpc_get_person.pbjson.dart' as $23;
+import 'rpc_list_account_info.pbjson.dart' as $17;
+import 'rpc_list_accounts.pbjson.dart' as $13;
+import 'rpc_list_payments.pbjson.dart' as $29;
+import 'rpc_list_persons.pbjson.dart' as $25;
+import 'rpc_list_returns_log_by_person_id.pbjson.dart' as $31;
+import 'rpc_list_sessions.pbjson.dart' as $10;
+import 'rpc_login.pbjson.dart' as $8;
+import 'rpc_refresh_token.pbjson.dart' as $9;
+import 'rpc_update_account.pbjson.dart' as $15;
+import 'rpc_update_account_info.pbjson.dart' as $19;
+import 'rpc_update_account_privacy.pbjson.dart' as $20;
+import 'rpc_update_payment.pbjson.dart' as $30;
+import 'rpc_update_person.pbjson.dart' as $22;
+import 'rpc_upload_document.pbjson.dart' as $32;
+import 'rpc_verify_email.pbjson.dart' as $34;
+import 'session.pbjson.dart' as $6;
+
+const $core.Map<$core.String, $core.dynamic> dfServiceBase$json = {
+ '1': 'df',
+ '2': [
+ {'1': 'Login', '2': '.pb.LoginRequest', '3': '.pb.LoginResponse', '4': {}},
+ {'1': 'RefreshToken', '2': '.pb.RefreshTokenRequest', '3': '.pb.RefreshTokenResponse', '4': {}},
+ {'1': 'ListSessions', '2': '.pb.ListSessionsRequest', '3': '.pb.ListSessionsResponse', '4': {}},
+ {'1': 'BlockSession', '2': '.pb.BlockSessionRequest', '3': '.pb.BlockSessionResponse', '4': {}},
+ {'1': 'GetAccount', '2': '.pb.GetAccountRequest', '3': '.pb.GetAccountResponse', '4': {}},
+ {'1': 'ListAccounts', '2': '.pb.ListAccountsRequest', '3': '.pb.ListAccountsResponse', '4': {}},
+ {'1': 'CreateAccount', '2': '.pb.CreateAccountRequest', '3': '.pb.CreateAccountResponse', '4': {}},
+ {'1': 'UpdateAccount', '2': '.pb.UpdateAccountRequest', '3': '.pb.UpdateAccountResponse', '4': {}},
+ {'1': 'GetAccountInfo', '2': '.pb.GetAccountInfoRequest', '3': '.pb.GetAccountInfoResponse', '4': {}},
+ {'1': 'ListAccountInfo', '2': '.pb.ListAccountInfoRequest', '3': '.pb.ListAccountInfoResponse', '4': {}},
+ {'1': 'CreateAccountInfo', '2': '.pb.CreateAccountInfoRequest', '3': '.pb.CreateAccountInfoResponse', '4': {}},
+ {'1': 'UpdateAccountInfo', '2': '.pb.UpdateAccountInfoRequest', '3': '.pb.UpdateAccountInfoResponse', '4': {}},
+ {'1': 'UpdateAccountPrivacy', '2': '.pb.UpdateAccountPrivacyRequest', '3': '.pb.UpdateAccountPrivacyResponse', '4': {}},
+ {'1': 'CreatePerson', '2': '.pb.CreatePersonRequest', '3': '.pb.CreatePersonResponse', '4': {}},
+ {'1': 'UpdatePerson', '2': '.pb.UpdatePersonRequest', '3': '.pb.UpdatePersonResponse', '4': {}},
+ {'1': 'GetPerson', '2': '.pb.GetPersonRequest', '3': '.pb.GetPersonResponse', '4': {}},
+ {'1': 'DeletePerson', '2': '.pb.DeletePersonRequest', '3': '.pb.DeletePersonResponse', '4': {}},
+ {'1': 'ListPersons', '2': '.pb.ListPersonsRequest', '3': '.pb.ListPersonsResponse', '4': {}},
+ {'1': 'CreatePayment', '2': '.pb.CreatePaymentRequest', '3': '.pb.CreatePaymentResponse', '4': {}},
+ {'1': 'GetPayment', '2': '.pb.GetPaymentRequest', '3': '.pb.GetPaymentResponse', '4': {}},
+ {'1': 'DeletePayment', '2': '.pb.DeletePaymentRequest', '3': '.pb.DeletePaymentResponse', '4': {}},
+ {'1': 'ListPayments', '2': '.pb.ListPaymentsRequest', '3': '.pb.ListPaymentsResponse', '4': {}},
+ {'1': 'UpdatePayment', '2': '.pb.UpdatePaymentRequest', '3': '.pb.UpdatePaymentResponse', '4': {}},
+ {'1': 'ListReturnsLog', '2': '.pb.ListReturnsLogRequest', '3': '.pb.ListReturnsLogResponse', '4': {}},
+ {'1': 'UploadDocument', '2': '.pb.UploadDocumentRequest', '3': '.pb.UploadDocumentResponse', '4': {}},
+ {'1': 'DeleteDocument', '2': '.pb.DeleteDocumentRequest', '3': '.pb.DeleteDocumentResponse', '4': {}},
+ {'1': 'VerifyEmail', '2': '.pb.VerifyEmailRequest', '3': '.pb.VerifyEmailResponse', '4': {}},
+ ],
+ '3': {},
+};
+
+@$core.Deprecated('Use dfServiceDescriptor instead')
+const $core.Map<$core.String, $core.Map<$core.String, $core.dynamic>> dfServiceBase$messageJson = {
+ '.pb.LoginRequest': $8.LoginRequest$json,
+ '.pb.LoginResponse': $8.LoginResponse$json,
+ '.google.protobuf.Timestamp': $0.Timestamp$json,
+ '.pb.RefreshTokenRequest': $9.RefreshTokenRequest$json,
+ '.pb.RefreshTokenResponse': $9.RefreshTokenResponse$json,
+ '.pb.ListSessionsRequest': $10.ListSessionsRequest$json,
+ '.pb.ListSessionsResponse': $10.ListSessionsResponse$json,
+ '.pb.Session': $6.Session$json,
+ '.pb.BlockSessionRequest': $11.BlockSessionRequest$json,
+ '.pb.BlockSessionResponse': $11.BlockSessionResponse$json,
+ '.pb.GetAccountRequest': $12.GetAccountRequest$json,
+ '.pb.GetAccountResponse': $12.GetAccountResponse$json,
+ '.pb.Account': $2.Account$json,
+ '.pb.ListAccountsRequest': $13.ListAccountsRequest$json,
+ '.pb.ListAccountsResponse': $13.ListAccountsResponse$json,
+ '.pb.CreateAccountRequest': $14.CreateAccountRequest$json,
+ '.pb.CreateAccountResponse': $14.CreateAccountResponse$json,
+ '.pb.UpdateAccountRequest': $15.UpdateAccountRequest$json,
+ '.pb.UpdateAccountResponse': $15.UpdateAccountResponse$json,
+ '.pb.GetAccountInfoRequest': $16.GetAccountInfoRequest$json,
+ '.pb.GetAccountInfoResponse': $16.GetAccountInfoResponse$json,
+ '.pb.AccountInfo': $1.AccountInfo$json,
+ '.pb.ListAccountInfoRequest': $17.ListAccountInfoRequest$json,
+ '.pb.ListAccountInfoResponse': $17.ListAccountInfoResponse$json,
+ '.pb.CreateAccountInfoRequest': $18.CreateAccountInfoRequest$json,
+ '.pb.CreateAccountInfoResponse': $18.CreateAccountInfoResponse$json,
+ '.pb.UpdateAccountInfoRequest': $19.UpdateAccountInfoRequest$json,
+ '.pb.UpdateAccountInfoResponse': $19.UpdateAccountInfoResponse$json,
+ '.pb.UpdateAccountPrivacyRequest': $20.UpdateAccountPrivacyRequest$json,
+ '.pb.UpdateAccountPrivacyResponse': $20.UpdateAccountPrivacyResponse$json,
+ '.pb.CreatePersonRequest': $21.CreatePersonRequest$json,
+ '.pb.CreatePersonResponse': $21.CreatePersonResponse$json,
+ '.pb.Person': $4.Person$json,
+ '.pb.UpdatePersonRequest': $22.UpdatePersonRequest$json,
+ '.pb.UpdatePersonResponse': $22.UpdatePersonResponse$json,
+ '.pb.GetPersonRequest': $23.GetPersonRequest$json,
+ '.pb.GetPersonResponse': $23.GetPersonResponse$json,
+ '.pb.DeletePersonRequest': $24.DeletePersonRequest$json,
+ '.pb.DeletePersonResponse': $24.DeletePersonResponse$json,
+ '.pb.ListPersonsRequest': $25.ListPersonsRequest$json,
+ '.pb.ListPersonsResponse': $25.ListPersonsResponse$json,
+ '.pb.CreatePaymentRequest': $26.CreatePaymentRequest$json,
+ '.pb.CreatePaymentResponse': $26.CreatePaymentResponse$json,
+ '.pb.Payment': $3.Payment$json,
+ '.pb.GetPaymentRequest': $27.GetPaymentRequest$json,
+ '.pb.GetPaymentResponse': $27.GetPaymentResponse$json,
+ '.pb.DeletePaymentRequest': $28.DeletePaymentRequest$json,
+ '.pb.DeletePaymentResponse': $28.DeletePaymentResponse$json,
+ '.pb.ListPaymentsRequest': $29.ListPaymentsRequest$json,
+ '.pb.ListPaymentsResponse': $29.ListPaymentsResponse$json,
+ '.pb.UpdatePaymentRequest': $30.UpdatePaymentRequest$json,
+ '.pb.UpdatePaymentResponse': $30.UpdatePaymentResponse$json,
+ '.pb.ListReturnsLogRequest': $31.ListReturnsLogRequest$json,
+ '.pb.ListReturnsLogResponse': $31.ListReturnsLogResponse$json,
+ '.pb.ReturnsLog': $5.ReturnsLog$json,
+ '.pb.UploadDocumentRequest': $32.UploadDocumentRequest$json,
+ '.pb.UploadDocumentResponse': $32.UploadDocumentResponse$json,
+ '.pb.Document': $7.Document$json,
+ '.pb.DeleteDocumentRequest': $33.DeleteDocumentRequest$json,
+ '.pb.DeleteDocumentResponse': $33.DeleteDocumentResponse$json,
+ '.pb.VerifyEmailRequest': $34.VerifyEmailRequest$json,
+ '.pb.VerifyEmailResponse': $34.VerifyEmailResponse$json,
+};
+
+/// Descriptor for `df`. Decode as a `google.protobuf.ServiceDescriptorProto`.
+final $typed_data.Uint8List dfServiceDescriptor = $convert.base64Decode(
+ 'CgJkZhJCCgVMb2dpbhIQLnBiLkxvZ2luUmVxdWVzdBoRLnBiLkxvZ2luUmVzcG9uc2UiFILT5J'
+ 'MCDiIJL3YxL2xvZ2luOgEqEmgKDFJlZnJlc2hUb2tlbhIXLnBiLlJlZnJlc2hUb2tlblJlcXVl'
+ 'c3QaGC5wYi5SZWZyZXNoVG9rZW5SZXNwb25zZSIlgtPkkwIfIhovdjEvc2Vzc2lvbnMvcmVmcm'
+ 'VzaF90b2tlbjoBKhKkAQoMTGlzdFNlc3Npb25zEhcucGIuTGlzdFNlc3Npb25zUmVxdWVzdBoY'
+ 'LnBiLkxpc3RTZXNzaW9uc1Jlc3BvbnNlImGSQS8SG0xpc3QgU2Vzc2lvbnMgYnkgYWNjb3VudF'
+ '9pZGIQCg4KCkJlYXJlckF1dGgSAILT5JMCKRInL3YxL3Nlc3Npb25zL2xpc3Rfc2Vzc2lvbnMv'
+ 'e2FjY291bnRfaWR9EpIBCgxCbG9ja1Nlc3Npb24SFy5wYi5CbG9ja1Nlc3Npb25SZXF1ZXN0Gh'
+ 'gucGIuQmxvY2tTZXNzaW9uUmVzcG9uc2UiT5JBJxITQmxvY2sgU2Vzc2lvbiBieSBJRGIQCg4K'
+ 'CkJlYXJlckF1dGgSAILT5JMCHzIaL3YxL3Nlc3Npb25zL2Jsb2NrX3Nlc3Npb246ASoSkgEKCk'
+ 'dldEFjY291bnQSFS5wYi5HZXRBY2NvdW50UmVxdWVzdBoWLnBiLkdldEFjY291bnRSZXNwb25z'
+ 'ZSJVkkEtEhlHZXQgQWNjb3VudCBieSBhY2NvdW50X2lkYhAKDgoKQmVhcmVyQXV0aBIAgtPkkw'
+ 'IfEh0vdjEvYWNjb3VudHMvZ2V0X2FjY291bnQve2lkfRKWAQoMTGlzdEFjY291bnRzEhcucGIu'
+ 'TGlzdEFjY291bnRzUmVxdWVzdBoYLnBiLkxpc3RBY2NvdW50c1Jlc3BvbnNlIlOSQS4SGkxpc3'
+ 'QgQWNjb3VudHMgW2FkbWluIG9ubHldYhAKDgoKQmVhcmVyQXV0aBIAgtPkkwIcEhovdjEvYWNj'
+ 'b3VudHMvbGlzdF9hY2NvdW50cxKDAQoNQ3JlYXRlQWNjb3VudBIYLnBiLkNyZWF0ZUFjY291bn'
+ 'RSZXF1ZXN0GhkucGIuQ3JlYXRlQWNjb3VudFJlc3BvbnNlIj2SQRQSEkNyZWF0ZSBBY2NvdW50'
+ 'SW5mb4LT5JMCICIbL3YxL2FjY291bnRzL2NyZWF0ZV9hY2NvdW50OgEqEpEBCg1VcGRhdGVBY2'
+ 'NvdW50EhgucGIuVXBkYXRlQWNjb3VudFJlcXVlc3QaGS5wYi5VcGRhdGVBY2NvdW50UmVzcG9u'
+ 'c2UiS5JBIhIOVXBkYXRlIEFjY291bnRiEAoOCgpCZWFyZXJBdXRoEgCC0+STAiAyGy92MS9hY2'
+ 'NvdW50cy91cGRhdGVfYWNjb3VudDoBKhKvAQoOR2V0QWNjb3VudEluZm8SGS5wYi5HZXRBY2Nv'
+ 'dW50SW5mb1JlcXVlc3QaGi5wYi5HZXRBY2NvdW50SW5mb1Jlc3BvbnNlImaSQTESHUdldCBBY2'
+ 'NvdW50SW5mbyBieSBhY2NvdW50X2lkYhAKDgoKQmVhcmVyQXV0aBIAgtPkkwIsEiovdjEvYWNj'
+ 'b3VudHMvZ2V0X2FjY291bnRfaW5mby97YWNjb3VudF9pZH0SpwEKD0xpc3RBY2NvdW50SW5mbx'
+ 'IaLnBiLkxpc3RBY2NvdW50SW5mb1JlcXVlc3QaGy5wYi5MaXN0QWNjb3VudEluZm9SZXNwb25z'
+ 'ZSJbkkEyEh5MaXN0IEFjY291bnRJbmZvcyBbYWRtaW4gb25seV1iEAoOCgpCZWFyZXJBdXRoEg'
+ 'CC0+STAiASHi92MS9hY2NvdW50cy9saXN0X2FjY291bnRfaW5mbxKmAQoRQ3JlYXRlQWNjb3Vu'
+ 'dEluZm8SHC5wYi5DcmVhdGVBY2NvdW50SW5mb1JlcXVlc3QaHS5wYi5DcmVhdGVBY2NvdW50SW'
+ '5mb1Jlc3BvbnNlIlSSQSYSEkNyZWF0ZSBBY2NvdW50SW5mb2IQCg4KCkJlYXJlckF1dGgSAILT'
+ '5JMCJSIgL3YxL2FjY291bnRzL2NyZWF0ZV9hY2NvdW50X2luZm86ASoSpgEKEVVwZGF0ZUFjY2'
+ '91bnRJbmZvEhwucGIuVXBkYXRlQWNjb3VudEluZm9SZXF1ZXN0Gh0ucGIuVXBkYXRlQWNjb3Vu'
+ 'dEluZm9SZXNwb25zZSJUkkEmEhJVcGRhdGUgQWNjb3VudEluZm9iEAoOCgpCZWFyZXJBdXRoEg'
+ 'CC0+STAiUyIC92MS9hY2NvdW50cy91cGRhdGVfYWNjb3VudF9pbmZvOgEqEr8BChRVcGRhdGVB'
+ 'Y2NvdW50UHJpdmFjeRIfLnBiLlVwZGF0ZUFjY291bnRQcml2YWN5UmVxdWVzdBogLnBiLlVwZG'
+ 'F0ZUFjY291bnRQcml2YWN5UmVzcG9uc2UiZJJBMxIfVXBkYXRlIEFjY291bnQgUHJpdmFjeSBT'
+ 'ZXR0aW5nc2IQCg4KCkJlYXJlckF1dGgSAILT5JMCKDIjL3YxL2FjY291bnRzL3VwZGF0ZV9hY2'
+ 'NvdW50X3ByaXZhY3k6ASoSiwEKDENyZWF0ZVBlcnNvbhIXLnBiLkNyZWF0ZVBlcnNvblJlcXVl'
+ 'c3QaGC5wYi5DcmVhdGVQZXJzb25SZXNwb25zZSJIkkEhEg1DcmVhdGUgUGVyc29uYhAKDgoKQm'
+ 'VhcmVyQXV0aBIAgtPkkwIeIhkvdjEvcGVyc29ucy9jcmVhdGVfcGVyc29uOgEqEosBCgxVcGRh'
+ 'dGVQZXJzb24SFy5wYi5VcGRhdGVQZXJzb25SZXF1ZXN0GhgucGIuVXBkYXRlUGVyc29uUmVzcG'
+ '9uc2UiSJJBIRINVXBkYXRlIFBlcnNvbmIQCg4KCkJlYXJlckF1dGgSAILT5JMCHjIZL3YxL3Bl'
+ 'cnNvbnMvdXBkYXRlX3BlcnNvbjoBKhKEAQoJR2V0UGVyc29uEhQucGIuR2V0UGVyc29uUmVxdW'
+ 'VzdBoVLnBiLkdldFBlcnNvblJlc3BvbnNlIkqSQSQSEEdldCBQZXJzb24gYnkgSURiEAoOCgpC'
+ 'ZWFyZXJBdXRoEgCC0+STAh0SGy92MS9wZXJzb25zL2dldF9wZXJzb24ve2lkfRKTAQoMRGVsZX'
+ 'RlUGVyc29uEhcucGIuRGVsZXRlUGVyc29uUmVxdWVzdBoYLnBiLkRlbGV0ZVBlcnNvblJlc3Bv'
+ 'bnNlIlCSQScSE0RlbGV0ZSBQZXJzb24gYnkgSURiEAoOCgpCZWFyZXJBdXRoEgCC0+STAiAqHi'
+ '92MS9wZXJzb25zL2RlbGV0ZV9wZXJzb24ve2lkfRKeAQoLTGlzdFBlcnNvbnMSFi5wYi5MaXN0'
+ 'UGVyc29uc1JlcXVlc3QaFy5wYi5MaXN0UGVyc29uc1Jlc3BvbnNlIl6SQS4SGkxpc3QgUGVyc2'
+ '9ucyBieSBhY2NvdW50X2lkYhAKDgoKQmVhcmVyQXV0aBIAgtPkkwInEiUvdjEvcGVyc29ucy9s'
+ 'aXN0X3BlcnNvbnMve2FjY291bnRfaWR9EpEBCg1DcmVhdGVQYXltZW50EhgucGIuQ3JlYXRlUG'
+ 'F5bWVudFJlcXVlc3QaGS5wYi5DcmVhdGVQYXltZW50UmVzcG9uc2UiS5JBIhIOQ3JlYXRlIFBh'
+ 'eW1lbnRiEAoOCgpCZWFyZXJBdXRoEgCC0+STAiAiGy92MS9wYXltZW50cy9jcmVhdGVfcGF5bW'
+ 'VudDoBKhKKAQoKR2V0UGF5bWVudBIVLnBiLkdldFBheW1lbnRSZXF1ZXN0GhYucGIuR2V0UGF5'
+ 'bWVudFJlc3BvbnNlIk2SQSUSEUdldCBQYXltZW50IGJ5IElEYhAKDgoKQmVhcmVyQXV0aBIAgt'
+ 'PkkwIfEh0vdjEvcGF5bWVudHMvZ2V0X3BheW1lbnQve2lkfRKZAQoNRGVsZXRlUGF5bWVudBIY'
+ 'LnBiLkRlbGV0ZVBheW1lbnRSZXF1ZXN0GhkucGIuRGVsZXRlUGF5bWVudFJlc3BvbnNlIlOSQS'
+ 'gSFERlbGV0ZSBQYXltZW50IGJ5IElEYhAKDgoKQmVhcmVyQXV0aBIAgtPkkwIiKiAvdjEvcGF5'
+ 'bWVudHMvZGVsZXRlX3BheW1lbnQve2lkfRKkAQoMTGlzdFBheW1lbnRzEhcucGIuTGlzdFBheW'
+ '1lbnRzUmVxdWVzdBoYLnBiLkxpc3RQYXltZW50c1Jlc3BvbnNlImGSQS8SG0xpc3QgUGF5bWVu'
+ 'dHMgYnkgYWNjb3VudF9pZGIQCg4KCkJlYXJlckF1dGgSAILT5JMCKRInL3YxL3BheW1lbnRzL2'
+ 'xpc3RfcGF5bWVudHMve2FjY291bnRfaWR9EpEBCg1VcGRhdGVQYXltZW50EhgucGIuVXBkYXRl'
+ 'UGF5bWVudFJlcXVlc3QaGS5wYi5VcGRhdGVQYXltZW50UmVzcG9uc2UiS5JBIhIOVXBkYXRlIF'
+ 'BheW1lbnRiEAoOCgpCZWFyZXJBdXRoEgCC0+STAiAyGy92MS9wYXltZW50cy91cGRhdGVfcGF5'
+ 'bWVudDoBKhKwAQoOTGlzdFJldHVybnNMb2cSGS5wYi5MaXN0UmV0dXJuc0xvZ1JlcXVlc3QaGi'
+ '5wYi5MaXN0UmV0dXJuc0xvZ1Jlc3BvbnNlImeSQTASHExpc3QgUmV0dXJuc0xvZyBieSBwZXJz'
+ 'b25faWRiEAoOCgpCZWFyZXJBdXRoEgCC0+STAi4SLC92MS9yZXR1cm5zX2xvZy9saXN0X3JldH'
+ 'VybnNfbG9nL3twZXJzb25faWR9EsoCCg5VcGxvYWREb2N1bWVudBIZLnBiLlVwbG9hZERvY3Vt'
+ 'ZW50UmVxdWVzdBoaLnBiLlVwbG9hZERvY3VtZW50UmVzcG9uc2UigAKSQeABEhtVcGxvYWQgRG'
+ '9jdW1lbnQgW29ubHkgSFRUUF0argFUZXN0aW5nIHZpYSBzd2FnZ2VyIGlzIG5vdCBwb3NzaWJs'
+ 'ZS4gVHJ5IGBgYGN1cmwgLVggUE9TVCAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyIHt0b2tlbn'
+ '0iIC1GICJmaWxlPUAvcGF0aC90by9maWxlIiAtRiAicGVyc29uX2lkPTEiICJodHRwOi8ve3Nl'
+ 'cnZlclVSSX0vZG9jdW1lbnRzL3VwbG9hZCJgYGBiEAoOCgpCZWFyZXJBdXRoEgCC0+STAhYiES'
+ '9kb2N1bWVudHMvdXBsb2FkOgEqEp8BCg5EZWxldGVEb2N1bWVudBIZLnBiLkRlbGV0ZURvY3Vt'
+ 'ZW50UmVxdWVzdBoaLnBiLkRlbGV0ZURvY3VtZW50UmVzcG9uc2UiVpJBKRIVRGVsZXRlIERvY3'
+ 'VtZW50IGJ5IElEYhAKDgoKQmVhcmVyQXV0aBIAgtPkkwIkKiIvdjEvZG9jdW1lbnRzL2RlbGV0'
+ 'ZV9kb2N1bWVudC97aWR9EqIBCgtWZXJpZnlFbWFpbBIWLnBiLlZlcmlmeUVtYWlsUmVxdWVzdB'
+ 'oXLnBiLlZlcmlmeUVtYWlsUmVzcG9uc2UiYpJBLRIrVmVyaWZ5IEVtYWlsIHdpdGggYWNjb3Vu'
+ 'dF9pZCBhbmQgc2VjcmV0X2tleYLT5JMCLBIqL3YxL3ZlcmlmeV9lbWFpbC97YWNjb3VudF9pZH'
+ '0ve3NlY3JldF9rZXl9GgeSQQQSAmRm');
+
diff --git a/frontend/app/lib/pb/service_df.pbserver.dart b/frontend/app/lib/pb/service_df.pbserver.dart
new file mode 100644
index 0000000..6ed842d
--- /dev/null
+++ b/frontend/app/lib/pb/service_df.pbserver.dart
@@ -0,0 +1,147 @@
+//
+// Generated code. Do not modify.
+// source: service_df.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:async' as $async;
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'rpc_block_session.pb.dart' as $11;
+import 'rpc_create_account.pb.dart' as $14;
+import 'rpc_create_account_info.pb.dart' as $18;
+import 'rpc_create_payment.pb.dart' as $26;
+import 'rpc_create_person.pb.dart' as $21;
+import 'rpc_delete_document.pb.dart' as $33;
+import 'rpc_delete_payment.pb.dart' as $28;
+import 'rpc_delete_person.pb.dart' as $24;
+import 'rpc_get_account.pb.dart' as $12;
+import 'rpc_get_account_info.pb.dart' as $16;
+import 'rpc_get_payment.pb.dart' as $27;
+import 'rpc_get_person.pb.dart' as $23;
+import 'rpc_list_account_info.pb.dart' as $17;
+import 'rpc_list_accounts.pb.dart' as $13;
+import 'rpc_list_payments.pb.dart' as $29;
+import 'rpc_list_persons.pb.dart' as $25;
+import 'rpc_list_returns_log_by_person_id.pb.dart' as $31;
+import 'rpc_list_sessions.pb.dart' as $10;
+import 'rpc_login.pb.dart' as $8;
+import 'rpc_refresh_token.pb.dart' as $9;
+import 'rpc_update_account.pb.dart' as $15;
+import 'rpc_update_account_info.pb.dart' as $19;
+import 'rpc_update_account_privacy.pb.dart' as $20;
+import 'rpc_update_payment.pb.dart' as $30;
+import 'rpc_update_person.pb.dart' as $22;
+import 'rpc_upload_document.pb.dart' as $32;
+import 'rpc_verify_email.pb.dart' as $34;
+import 'service_df.pbjson.dart';
+
+export 'service_df.pb.dart';
+
+abstract class dfServiceBase extends $pb.GeneratedService {
+ $async.Future<$8.LoginResponse> login($pb.ServerContext ctx, $8.LoginRequest request);
+ $async.Future<$9.RefreshTokenResponse> refreshToken($pb.ServerContext ctx, $9.RefreshTokenRequest request);
+ $async.Future<$10.ListSessionsResponse> listSessions($pb.ServerContext ctx, $10.ListSessionsRequest request);
+ $async.Future<$11.BlockSessionResponse> blockSession($pb.ServerContext ctx, $11.BlockSessionRequest request);
+ $async.Future<$12.GetAccountResponse> getAccount($pb.ServerContext ctx, $12.GetAccountRequest request);
+ $async.Future<$13.ListAccountsResponse> listAccounts($pb.ServerContext ctx, $13.ListAccountsRequest request);
+ $async.Future<$14.CreateAccountResponse> createAccount($pb.ServerContext ctx, $14.CreateAccountRequest request);
+ $async.Future<$15.UpdateAccountResponse> updateAccount($pb.ServerContext ctx, $15.UpdateAccountRequest request);
+ $async.Future<$16.GetAccountInfoResponse> getAccountInfo($pb.ServerContext ctx, $16.GetAccountInfoRequest request);
+ $async.Future<$17.ListAccountInfoResponse> listAccountInfo($pb.ServerContext ctx, $17.ListAccountInfoRequest request);
+ $async.Future<$18.CreateAccountInfoResponse> createAccountInfo($pb.ServerContext ctx, $18.CreateAccountInfoRequest request);
+ $async.Future<$19.UpdateAccountInfoResponse> updateAccountInfo($pb.ServerContext ctx, $19.UpdateAccountInfoRequest request);
+ $async.Future<$20.UpdateAccountPrivacyResponse> updateAccountPrivacy($pb.ServerContext ctx, $20.UpdateAccountPrivacyRequest request);
+ $async.Future<$21.CreatePersonResponse> createPerson($pb.ServerContext ctx, $21.CreatePersonRequest request);
+ $async.Future<$22.UpdatePersonResponse> updatePerson($pb.ServerContext ctx, $22.UpdatePersonRequest request);
+ $async.Future<$23.GetPersonResponse> getPerson($pb.ServerContext ctx, $23.GetPersonRequest request);
+ $async.Future<$24.DeletePersonResponse> deletePerson($pb.ServerContext ctx, $24.DeletePersonRequest request);
+ $async.Future<$25.ListPersonsResponse> listPersons($pb.ServerContext ctx, $25.ListPersonsRequest request);
+ $async.Future<$26.CreatePaymentResponse> createPayment($pb.ServerContext ctx, $26.CreatePaymentRequest request);
+ $async.Future<$27.GetPaymentResponse> getPayment($pb.ServerContext ctx, $27.GetPaymentRequest request);
+ $async.Future<$28.DeletePaymentResponse> deletePayment($pb.ServerContext ctx, $28.DeletePaymentRequest request);
+ $async.Future<$29.ListPaymentsResponse> listPayments($pb.ServerContext ctx, $29.ListPaymentsRequest request);
+ $async.Future<$30.UpdatePaymentResponse> updatePayment($pb.ServerContext ctx, $30.UpdatePaymentRequest request);
+ $async.Future<$31.ListReturnsLogResponse> listReturnsLog($pb.ServerContext ctx, $31.ListReturnsLogRequest request);
+ $async.Future<$32.UploadDocumentResponse> uploadDocument($pb.ServerContext ctx, $32.UploadDocumentRequest request);
+ $async.Future<$33.DeleteDocumentResponse> deleteDocument($pb.ServerContext ctx, $33.DeleteDocumentRequest request);
+ $async.Future<$34.VerifyEmailResponse> verifyEmail($pb.ServerContext ctx, $34.VerifyEmailRequest request);
+
+ $pb.GeneratedMessage createRequest($core.String methodName) {
+ switch (methodName) {
+ case 'Login': return $8.LoginRequest();
+ case 'RefreshToken': return $9.RefreshTokenRequest();
+ case 'ListSessions': return $10.ListSessionsRequest();
+ case 'BlockSession': return $11.BlockSessionRequest();
+ case 'GetAccount': return $12.GetAccountRequest();
+ case 'ListAccounts': return $13.ListAccountsRequest();
+ case 'CreateAccount': return $14.CreateAccountRequest();
+ case 'UpdateAccount': return $15.UpdateAccountRequest();
+ case 'GetAccountInfo': return $16.GetAccountInfoRequest();
+ case 'ListAccountInfo': return $17.ListAccountInfoRequest();
+ case 'CreateAccountInfo': return $18.CreateAccountInfoRequest();
+ case 'UpdateAccountInfo': return $19.UpdateAccountInfoRequest();
+ case 'UpdateAccountPrivacy': return $20.UpdateAccountPrivacyRequest();
+ case 'CreatePerson': return $21.CreatePersonRequest();
+ case 'UpdatePerson': return $22.UpdatePersonRequest();
+ case 'GetPerson': return $23.GetPersonRequest();
+ case 'DeletePerson': return $24.DeletePersonRequest();
+ case 'ListPersons': return $25.ListPersonsRequest();
+ case 'CreatePayment': return $26.CreatePaymentRequest();
+ case 'GetPayment': return $27.GetPaymentRequest();
+ case 'DeletePayment': return $28.DeletePaymentRequest();
+ case 'ListPayments': return $29.ListPaymentsRequest();
+ case 'UpdatePayment': return $30.UpdatePaymentRequest();
+ case 'ListReturnsLog': return $31.ListReturnsLogRequest();
+ case 'UploadDocument': return $32.UploadDocumentRequest();
+ case 'DeleteDocument': return $33.DeleteDocumentRequest();
+ case 'VerifyEmail': return $34.VerifyEmailRequest();
+ default: throw $core.ArgumentError('Unknown method: $methodName');
+ }
+ }
+
+ $async.Future<$pb.GeneratedMessage> handleCall($pb.ServerContext ctx, $core.String methodName, $pb.GeneratedMessage request) {
+ switch (methodName) {
+ case 'Login': return this.login(ctx, request as $8.LoginRequest);
+ case 'RefreshToken': return this.refreshToken(ctx, request as $9.RefreshTokenRequest);
+ case 'ListSessions': return this.listSessions(ctx, request as $10.ListSessionsRequest);
+ case 'BlockSession': return this.blockSession(ctx, request as $11.BlockSessionRequest);
+ case 'GetAccount': return this.getAccount(ctx, request as $12.GetAccountRequest);
+ case 'ListAccounts': return this.listAccounts(ctx, request as $13.ListAccountsRequest);
+ case 'CreateAccount': return this.createAccount(ctx, request as $14.CreateAccountRequest);
+ case 'UpdateAccount': return this.updateAccount(ctx, request as $15.UpdateAccountRequest);
+ case 'GetAccountInfo': return this.getAccountInfo(ctx, request as $16.GetAccountInfoRequest);
+ case 'ListAccountInfo': return this.listAccountInfo(ctx, request as $17.ListAccountInfoRequest);
+ case 'CreateAccountInfo': return this.createAccountInfo(ctx, request as $18.CreateAccountInfoRequest);
+ case 'UpdateAccountInfo': return this.updateAccountInfo(ctx, request as $19.UpdateAccountInfoRequest);
+ case 'UpdateAccountPrivacy': return this.updateAccountPrivacy(ctx, request as $20.UpdateAccountPrivacyRequest);
+ case 'CreatePerson': return this.createPerson(ctx, request as $21.CreatePersonRequest);
+ case 'UpdatePerson': return this.updatePerson(ctx, request as $22.UpdatePersonRequest);
+ case 'GetPerson': return this.getPerson(ctx, request as $23.GetPersonRequest);
+ case 'DeletePerson': return this.deletePerson(ctx, request as $24.DeletePersonRequest);
+ case 'ListPersons': return this.listPersons(ctx, request as $25.ListPersonsRequest);
+ case 'CreatePayment': return this.createPayment(ctx, request as $26.CreatePaymentRequest);
+ case 'GetPayment': return this.getPayment(ctx, request as $27.GetPaymentRequest);
+ case 'DeletePayment': return this.deletePayment(ctx, request as $28.DeletePaymentRequest);
+ case 'ListPayments': return this.listPayments(ctx, request as $29.ListPaymentsRequest);
+ case 'UpdatePayment': return this.updatePayment(ctx, request as $30.UpdatePaymentRequest);
+ case 'ListReturnsLog': return this.listReturnsLog(ctx, request as $31.ListReturnsLogRequest);
+ case 'UploadDocument': return this.uploadDocument(ctx, request as $32.UploadDocumentRequest);
+ case 'DeleteDocument': return this.deleteDocument(ctx, request as $33.DeleteDocumentRequest);
+ case 'VerifyEmail': return this.verifyEmail(ctx, request as $34.VerifyEmailRequest);
+ default: throw $core.ArgumentError('Unknown method: $methodName');
+ }
+ }
+
+ $core.Map<$core.String, $core.dynamic> get $json => dfServiceBase$json;
+ $core.Map<$core.String, $core.Map<$core.String, $core.dynamic>> get $messageJson => dfServiceBase$messageJson;
+}
+
diff --git a/frontend/app/lib/pb/session.pb.dart b/frontend/app/lib/pb/session.pb.dart
new file mode 100644
index 0000000..d41a3ba
--- /dev/null
+++ b/frontend/app/lib/pb/session.pb.dart
@@ -0,0 +1,173 @@
+//
+// Generated code. Do not modify.
+// source: session.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'google/protobuf/timestamp.pb.dart' as $0;
+
+class Session extends $pb.GeneratedMessage {
+ factory Session({
+ $core.String? id,
+ $fixnum.Int64? accountId,
+ $core.String? userAgent,
+ $core.String? clientIp,
+ $core.bool? isBlocked,
+ $0.Timestamp? expiresAt,
+ $core.String? refreshToken,
+ $0.Timestamp? createdAt,
+ }) {
+ final $result = create();
+ if (id != null) {
+ $result.id = id;
+ }
+ if (accountId != null) {
+ $result.accountId = accountId;
+ }
+ if (userAgent != null) {
+ $result.userAgent = userAgent;
+ }
+ if (clientIp != null) {
+ $result.clientIp = clientIp;
+ }
+ if (isBlocked != null) {
+ $result.isBlocked = isBlocked;
+ }
+ if (expiresAt != null) {
+ $result.expiresAt = expiresAt;
+ }
+ if (refreshToken != null) {
+ $result.refreshToken = refreshToken;
+ }
+ if (createdAt != null) {
+ $result.createdAt = createdAt;
+ }
+ return $result;
+ }
+ Session._() : super();
+ factory Session.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+ factory Session.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+
+ static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Session', package: const $pb.PackageName(_omitMessageNames ? '' : 'pb'), createEmptyInstance: create)
+ ..aOS(1, _omitFieldNames ? '' : 'id')
+ ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'accountId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
+ ..aOS(3, _omitFieldNames ? '' : 'userAgent')
+ ..aOS(4, _omitFieldNames ? '' : 'clientIp')
+ ..aOB(5, _omitFieldNames ? '' : 'isBlocked')
+ ..aOM<$0.Timestamp>(6, _omitFieldNames ? '' : 'expiresAt', subBuilder: $0.Timestamp.create)
+ ..aOS(7, _omitFieldNames ? '' : 'refreshToken')
+ ..aOM<$0.Timestamp>(8, _omitFieldNames ? '' : 'createdAt', subBuilder: $0.Timestamp.create)
+ ..hasRequiredFields = false
+ ;
+
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+ 'Will be removed in next major version')
+ Session clone() => Session()..mergeFromMessage(this);
+ @$core.Deprecated(
+ 'Using this can add significant overhead to your binary. '
+ 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+ 'Will be removed in next major version')
+ Session copyWith(void Function(Session) updates) => super.copyWith((message) => updates(message as Session)) as Session;
+
+ $pb.BuilderInfo get info_ => _i;
+
+ @$core.pragma('dart2js:noInline')
+ static Session create() => Session._();
+ Session createEmptyInstance() => create();
+ static $pb.PbList createRepeated() => $pb.PbList();
+ @$core.pragma('dart2js:noInline')
+ static Session getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create);
+ static Session? _defaultInstance;
+
+ @$pb.TagNumber(1)
+ $core.String get id => $_getSZ(0);
+ @$pb.TagNumber(1)
+ set id($core.String v) { $_setString(0, v); }
+ @$pb.TagNumber(1)
+ $core.bool hasId() => $_has(0);
+ @$pb.TagNumber(1)
+ void clearId() => clearField(1);
+
+ @$pb.TagNumber(2)
+ $fixnum.Int64 get accountId => $_getI64(1);
+ @$pb.TagNumber(2)
+ set accountId($fixnum.Int64 v) { $_setInt64(1, v); }
+ @$pb.TagNumber(2)
+ $core.bool hasAccountId() => $_has(1);
+ @$pb.TagNumber(2)
+ void clearAccountId() => clearField(2);
+
+ @$pb.TagNumber(3)
+ $core.String get userAgent => $_getSZ(2);
+ @$pb.TagNumber(3)
+ set userAgent($core.String v) { $_setString(2, v); }
+ @$pb.TagNumber(3)
+ $core.bool hasUserAgent() => $_has(2);
+ @$pb.TagNumber(3)
+ void clearUserAgent() => clearField(3);
+
+ @$pb.TagNumber(4)
+ $core.String get clientIp => $_getSZ(3);
+ @$pb.TagNumber(4)
+ set clientIp($core.String v) { $_setString(3, v); }
+ @$pb.TagNumber(4)
+ $core.bool hasClientIp() => $_has(3);
+ @$pb.TagNumber(4)
+ void clearClientIp() => clearField(4);
+
+ @$pb.TagNumber(5)
+ $core.bool get isBlocked => $_getBF(4);
+ @$pb.TagNumber(5)
+ set isBlocked($core.bool v) { $_setBool(4, v); }
+ @$pb.TagNumber(5)
+ $core.bool hasIsBlocked() => $_has(4);
+ @$pb.TagNumber(5)
+ void clearIsBlocked() => clearField(5);
+
+ @$pb.TagNumber(6)
+ $0.Timestamp get expiresAt => $_getN(5);
+ @$pb.TagNumber(6)
+ set expiresAt($0.Timestamp v) { setField(6, v); }
+ @$pb.TagNumber(6)
+ $core.bool hasExpiresAt() => $_has(5);
+ @$pb.TagNumber(6)
+ void clearExpiresAt() => clearField(6);
+ @$pb.TagNumber(6)
+ $0.Timestamp ensureExpiresAt() => $_ensure(5);
+
+ @$pb.TagNumber(7)
+ $core.String get refreshToken => $_getSZ(6);
+ @$pb.TagNumber(7)
+ set refreshToken($core.String v) { $_setString(6, v); }
+ @$pb.TagNumber(7)
+ $core.bool hasRefreshToken() => $_has(6);
+ @$pb.TagNumber(7)
+ void clearRefreshToken() => clearField(7);
+
+ @$pb.TagNumber(8)
+ $0.Timestamp get createdAt => $_getN(7);
+ @$pb.TagNumber(8)
+ set createdAt($0.Timestamp v) { setField(8, v); }
+ @$pb.TagNumber(8)
+ $core.bool hasCreatedAt() => $_has(7);
+ @$pb.TagNumber(8)
+ void clearCreatedAt() => clearField(8);
+ @$pb.TagNumber(8)
+ $0.Timestamp ensureCreatedAt() => $_ensure(7);
+}
+
+
+const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
+const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/frontend/app/lib/pb/session.pbenum.dart b/frontend/app/lib/pb/session.pbenum.dart
new file mode 100644
index 0000000..d515787
--- /dev/null
+++ b/frontend/app/lib/pb/session.pbenum.dart
@@ -0,0 +1,11 @@
+//
+// Generated code. Do not modify.
+// source: session.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
diff --git a/frontend/app/lib/pb/session.pbjson.dart b/frontend/app/lib/pb/session.pbjson.dart
new file mode 100644
index 0000000..830202c
--- /dev/null
+++ b/frontend/app/lib/pb/session.pbjson.dart
@@ -0,0 +1,51 @@
+//
+// Generated code. Do not modify.
+// source: session.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+import 'dart:convert' as $convert;
+import 'dart:core' as $core;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use sessionDescriptor instead')
+const Session$json = {
+ '1': 'Session',
+ '2': [
+ {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
+ {'1': 'account_id', '3': 2, '4': 1, '5': 4, '10': 'accountId'},
+ {'1': 'user_agent', '3': 3, '4': 1, '5': 9, '10': 'userAgent'},
+ {'1': 'client_ip', '3': 4, '4': 1, '5': 9, '10': 'clientIp'},
+ {'1': 'is_blocked', '3': 5, '4': 1, '5': 8, '10': 'isBlocked'},
+ {'1': 'expires_at', '3': 6, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'expiresAt'},
+ {'1': 'created_at', '3': 8, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': {}, '10': 'createdAt'},
+ {'1': 'refresh_token', '3': 7, '4': 1, '5': 9, '10': 'refreshToken'},
+ ],
+ '7': {},
+};
+
+/// Descriptor for `Session`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List sessionDescriptor = $convert.base64Decode(
+ 'CgdTZXNzaW9uEg4KAmlkGAEgASgJUgJpZBIdCgphY2NvdW50X2lkGAIgASgEUglhY2NvdW50SW'
+ 'QSHQoKdXNlcl9hZ2VudBgDIAEoCVIJdXNlckFnZW50EhsKCWNsaWVudF9pcBgEIAEoCVIIY2xp'
+ 'ZW50SXASHQoKaXNfYmxvY2tlZBgFIAEoCFIJaXNCbG9ja2VkElYKCmV4cGlyZXNfYXQYBiABKA'
+ 'syGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQhuSQRhKFiIxOTkwLTEwLTA1VDAwOjAwOjAw'
+ 'WiJSCWV4cGlyZXNBdBJWCgpjcmVhdGVkX2F0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbW'
+ 'VzdGFtcEIbkkEYShYiMTk5MC0xMC0wNVQwMDowMDowMFoiUgljcmVhdGVkQXQSIwoNcmVmcmVz'
+ 'aF90b2tlbhgHIAEoCVIMcmVmcmVzaFRva2VuOp0EkkGZBAoJKgdTZXNzaW9uMosEeyJpZCI6IC'
+ 'IxIiwiYWNjb3VudF9pZCI6ICIxIiwgInJlZnJlc2hfdG9rZW4iOiAidjQucHVibGljLmV5Smxi'
+ 'V0ZwYkNJNkltRXlRR0l1WkdVaUxDSmxlSEFpT2lJeU1ESXpMVEV3TFRBMlZEQXhPakF5T2pBNU'
+ 't6QXlPakF3SWl3aWFXRjBJam9pTWpBeU15MHhNQzB3TlZRd01Ub3dNam93T1Nzd01qb3dNQ0lz'
+ 'SW1sa0lqb2lOV1V4WkRZM1pHRXROMk01WWkwME16WTFMV0UwWkRVdE0yTmpNR0V3TlRFeU5ERm'
+ 'xJaXdpYm1KbUlqb2lNakF5TXkweE1DMHdOVlF3TVRvd01qb3dPU3N3TWpvd01DSjlCb1gzNncw'
+ 'cG8xdnZIU2pzQlBfS1dlRnhWMXhSYlFheXFiSnVJb0syaktxeTFCdDJSb0h5SmJMb0NFTzE1Q1'
+ 'JUNURuUTZQMEFIbEJ6anNYdDYxYUREdyIsICJleHBpcmVzX2F0IjogIjIwMjMtMTAtMDVUMDI6'
+ 'MzA6NTNaIiwgImNyZWF0ZWRfYXQiOiAiMjAyMy0xMC0wNVQwMToyMDoxMVoiLCAiY2xpZW50X2'
+ 'lwIjogIjEwLjU2LjAuMTIiLCAidXNlcl9hZ2VudCI6ICJNb3ppbGxhIEZpcmVmb3giLCAiaXNf'
+ 'YmxvY2tlZCI6IGZhbHNlfQ==');
+
diff --git a/frontend/app/lib/pb/session.pbserver.dart b/frontend/app/lib/pb/session.pbserver.dart
new file mode 100644
index 0000000..79ba84d
--- /dev/null
+++ b/frontend/app/lib/pb/session.pbserver.dart
@@ -0,0 +1,14 @@
+//
+// Generated code. Do not modify.
+// source: session.proto
+//
+// @dart = 2.12
+
+// ignore_for_file: annotate_overrides, camel_case_types, comment_references
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_final_fields
+// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+
+export 'session.pb.dart';
+
diff --git a/frontend/app/linux/.gitignore b/frontend/app/linux/.gitignore
new file mode 100644
index 0000000..d3896c9
--- /dev/null
+++ b/frontend/app/linux/.gitignore
@@ -0,0 +1 @@
+flutter/ephemeral
diff --git a/frontend/app/linux/CMakeLists.txt b/frontend/app/linux/CMakeLists.txt
new file mode 100644
index 0000000..c21918f
--- /dev/null
+++ b/frontend/app/linux/CMakeLists.txt
@@ -0,0 +1,139 @@
+# Project-level configuration.
+cmake_minimum_required(VERSION 3.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 "app")
+# The unique GTK application identifier for this application. See:
+# https://wiki.gnome.org/HowDoI/ChooseApplicationID
+set(APPLICATION_ID "com.example.app")
+
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
+# versions of CMake.
+cmake_policy(SET CMP0063 NEW)
+
+# Load bundled libraries from the lib/ directory relative to the binary.
+set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
+
+# Root filesystem for cross-building.
+if(FLUTTER_TARGET_PLATFORM_SYSROOT)
+ set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+endif()
+
+# Define build configuration options.
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "Debug" CACHE
+ STRING "Flutter build mode" FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Profile" "Release")
+endif()
+
+# Compilation settings that should be applied to most targets.
+#
+# Be cautious about adding new options here, as plugins use this function by
+# default. In most cases, you should add new options to specific targets instead
+# of modifying this function.
+function(APPLY_STANDARD_SETTINGS TARGET)
+ target_compile_features(${TARGET} PUBLIC cxx_std_14)
+ target_compile_options(${TARGET} PRIVATE -Wall -Werror)
+ target_compile_options(${TARGET} PRIVATE "$<$>:-O3>")
+ target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>")
+endfunction()
+
+# Flutter library and tool build rules.
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+
+add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
+
+# Define the application target. To change its name, change BINARY_NAME above,
+# not the value here, or `flutter run` will no longer work.
+#
+# Any new source files that you add to the application should be added here.
+add_executable(${BINARY_NAME}
+ "main.cc"
+ "my_application.cc"
+ "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+)
+
+# Apply the standard set of build settings. This can be removed for applications
+# that need different build settings.
+apply_standard_settings(${BINARY_NAME})
+
+# Add dependency libraries. Add any application-specific dependencies here.
+target_link_libraries(${BINARY_NAME} PRIVATE flutter)
+target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
+
+# Run the Flutter tool portions of the build. This must not be removed.
+add_dependencies(${BINARY_NAME} flutter_assemble)
+
+# Only the install-generated bundle's copy of the executable will launch
+# correctly, since the resources must in the right relative locations. To avoid
+# people trying to run the unbundled copy, put it in a subdirectory instead of
+# the default top-level location.
+set_target_properties(${BINARY_NAME}
+ PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
+)
+
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# By default, "installing" just makes a relocatable bundle in the build
+# directory.
+set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+# Start with a clean build bundle directory every time.
+install(CODE "
+ file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
+ " COMPONENT Runtime)
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
+ install(FILES "${bundled_library}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endforeach(bundled_library)
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+ file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+ " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+ DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
+ install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endif()
diff --git a/frontend/app/linux/flutter/CMakeLists.txt b/frontend/app/linux/flutter/CMakeLists.txt
new file mode 100644
index 0000000..d5bd016
--- /dev/null
+++ b/frontend/app/linux/flutter/CMakeLists.txt
@@ -0,0 +1,88 @@
+# This file controls Flutter-level build steps. It should not be edited.
+cmake_minimum_required(VERSION 3.10)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+
+# Serves the same purpose as list(TRANSFORM ... PREPEND ...),
+# which isn't available in 3.10.
+function(list_prepend LIST_NAME PREFIX)
+ set(NEW_LIST "")
+ foreach(element ${${LIST_NAME}})
+ list(APPEND NEW_LIST "${PREFIX}${element}")
+ endforeach(element)
+ set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE)
+endfunction()
+
+# === Flutter Library ===
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
+pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
+
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+ "fl_basic_message_channel.h"
+ "fl_binary_codec.h"
+ "fl_binary_messenger.h"
+ "fl_dart_project.h"
+ "fl_engine.h"
+ "fl_json_message_codec.h"
+ "fl_json_method_codec.h"
+ "fl_message_codec.h"
+ "fl_method_call.h"
+ "fl_method_channel.h"
+ "fl_method_codec.h"
+ "fl_method_response.h"
+ "fl_plugin_registrar.h"
+ "fl_plugin_registry.h"
+ "fl_standard_message_codec.h"
+ "fl_standard_method_codec.h"
+ "fl_string_codec.h"
+ "fl_value.h"
+ "fl_view.h"
+ "flutter_linux.h"
+)
+list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+ "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}")
+target_link_libraries(flutter INTERFACE
+ PkgConfig::GTK
+ PkgConfig::GLIB
+ PkgConfig::GIO
+)
+add_dependencies(flutter flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+add_custom_command(
+ OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+ ${CMAKE_CURRENT_BINARY_DIR}/_phony_
+ COMMAND ${CMAKE_COMMAND} -E env
+ ${FLUTTER_TOOL_ENVIRONMENT}
+ "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
+ ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
+ VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+ "${FLUTTER_LIBRARY}"
+ ${FLUTTER_LIBRARY_HEADERS}
+)
diff --git a/frontend/app/linux/flutter/generated_plugin_registrant.cc b/frontend/app/linux/flutter/generated_plugin_registrant.cc
new file mode 100644
index 0000000..e71a16d
--- /dev/null
+++ b/frontend/app/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/frontend/app/linux/flutter/generated_plugin_registrant.h b/frontend/app/linux/flutter/generated_plugin_registrant.h
new file mode 100644
index 0000000..e0f0a47
--- /dev/null
+++ b/frontend/app/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/frontend/app/linux/flutter/generated_plugins.cmake b/frontend/app/linux/flutter/generated_plugins.cmake
new file mode 100644
index 0000000..2e1de87
--- /dev/null
+++ b/frontend/app/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/frontend/app/linux/main.cc b/frontend/app/linux/main.cc
new file mode 100644
index 0000000..e7c5c54
--- /dev/null
+++ b/frontend/app/linux/main.cc
@@ -0,0 +1,6 @@
+#include "my_application.h"
+
+int main(int argc, char** argv) {
+ g_autoptr(MyApplication) app = my_application_new();
+ return g_application_run(G_APPLICATION(app), argc, argv);
+}
diff --git a/frontend/app/linux/my_application.cc b/frontend/app/linux/my_application.cc
new file mode 100644
index 0000000..42d9b08
--- /dev/null
+++ b/frontend/app/linux/my_application.cc
@@ -0,0 +1,104 @@
+#include "my_application.h"
+
+#include
+#ifdef GDK_WINDOWING_X11
+#include
+#endif
+
+#include "flutter/generated_plugin_registrant.h"
+
+struct _MyApplication {
+ GtkApplication parent_instance;
+ char** dart_entrypoint_arguments;
+};
+
+G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
+
+// Implements GApplication::activate.
+static void my_application_activate(GApplication* application) {
+ MyApplication* self = MY_APPLICATION(application);
+ GtkWindow* window =
+ GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
+
+ // Use a header bar when running in GNOME as this is the common style used
+ // by applications and is the setup most users will be using (e.g. Ubuntu
+ // desktop).
+ // If running on X and not using GNOME then just use a traditional title bar
+ // in case the window manager does more exotic layout, e.g. tiling.
+ // If running on Wayland assume the header bar will work (may need changing
+ // if future cases occur).
+ gboolean use_header_bar = TRUE;
+#ifdef GDK_WINDOWING_X11
+ GdkScreen* screen = gtk_window_get_screen(window);
+ if (GDK_IS_X11_SCREEN(screen)) {
+ const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
+ if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
+ use_header_bar = FALSE;
+ }
+ }
+#endif
+ 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, "app");
+ 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, "app");
+ }
+
+ gtk_window_set_default_size(window, 1280, 720);
+ gtk_widget_show(GTK_WIDGET(window));
+
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
+
+ FlView* view = fl_view_new(project);
+ gtk_widget_show(GTK_WIDGET(view));
+ gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
+
+ fl_register_plugins(FL_PLUGIN_REGISTRY(view));
+
+ gtk_widget_grab_focus(GTK_WIDGET(view));
+}
+
+// Implements GApplication::local_command_line.
+static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
+ MyApplication* self = MY_APPLICATION(application);
+ // Strip out the first argument as it is the binary name.
+ self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
+
+ g_autoptr(GError) error = nullptr;
+ if (!g_application_register(application, nullptr, &error)) {
+ g_warning("Failed to register: %s", error->message);
+ *exit_status = 1;
+ return TRUE;
+ }
+
+ g_application_activate(application);
+ *exit_status = 0;
+
+ return TRUE;
+}
+
+// Implements GObject::dispose.
+static void my_application_dispose(GObject* object) {
+ MyApplication* self = MY_APPLICATION(object);
+ g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
+ G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
+}
+
+static void my_application_class_init(MyApplicationClass* klass) {
+ G_APPLICATION_CLASS(klass)->activate = my_application_activate;
+ G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
+ G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
+}
+
+static void my_application_init(MyApplication* self) {}
+
+MyApplication* my_application_new() {
+ return MY_APPLICATION(g_object_new(my_application_get_type(),
+ "application-id", APPLICATION_ID,
+ "flags", G_APPLICATION_NON_UNIQUE,
+ nullptr));
+}
diff --git a/frontend/app/linux/my_application.h b/frontend/app/linux/my_application.h
new file mode 100644
index 0000000..72271d5
--- /dev/null
+++ b/frontend/app/linux/my_application.h
@@ -0,0 +1,18 @@
+#ifndef FLUTTER_MY_APPLICATION_H_
+#define FLUTTER_MY_APPLICATION_H_
+
+#include
+
+G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
+ GtkApplication)
+
+/**
+ * my_application_new:
+ *
+ * Creates a new Flutter-based application.
+ *
+ * Returns: a new #MyApplication.
+ */
+MyApplication* my_application_new();
+
+#endif // FLUTTER_MY_APPLICATION_H_
diff --git a/frontend/app/macos/.gitignore b/frontend/app/macos/.gitignore
new file mode 100644
index 0000000..746adbb
--- /dev/null
+++ b/frontend/app/macos/.gitignore
@@ -0,0 +1,7 @@
+# Flutter-related
+**/Flutter/ephemeral/
+**/Pods/
+
+# Xcode-related
+**/dgph
+**/xcuserdata/
diff --git a/frontend/app/macos/Flutter/Flutter-Debug.xcconfig b/frontend/app/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 0000000..c2efd0b
--- /dev/null
+++ b/frontend/app/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/frontend/app/macos/Flutter/Flutter-Release.xcconfig b/frontend/app/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 0000000..c2efd0b
--- /dev/null
+++ b/frontend/app/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/frontend/app/macos/Runner.xcodeproj/project.pbxproj b/frontend/app/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..d20f4ef
--- /dev/null
+++ b/frontend/app/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,695 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+ buildPhases = (
+ 33CC111E2044C6BF0003C045 /* ShellScript */,
+ );
+ dependencies = (
+ );
+ name = "Flutter Assemble";
+ productName = FLX;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC10EC2044A3C60003C045;
+ remoteInfo = Runner;
+ };
+ 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+ remoteInfo = FLX;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 33CC110E2044A8840003C045 /* Bundle Framework */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Bundle Framework";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 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 /* app.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "app.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 = ""; };
+ 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; };
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; };
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; };
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; };
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; };
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; };
+ 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; };
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 331C80D2294CF70F00263BE5 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10EA2044A3C60003C045 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 331C80D6294CF71000263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C80D7294CF71000263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 33BA886A226E78AF003329D5 /* Configs */ = {
+ isa = PBXGroup;
+ children = (
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
+ );
+ path = Configs;
+ sourceTree = "";
+ };
+ 33CC10E42044A3C60003C045 = {
+ isa = PBXGroup;
+ children = (
+ 33FAB671232836740065AC1E /* Runner */,
+ 33CEB47122A05771004F2AC0 /* Flutter */,
+ 331C80D6294CF71000263BE5 /* RunnerTests */,
+ 33CC10EE2044A3C60003C045 /* Products */,
+ D73912EC22F37F3D000D13A0 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 33CC10EE2044A3C60003C045 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10ED2044A3C60003C045 /* app.app */,
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 33CC11242044D66E0003C045 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */,
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */,
+ 33CC10F72044A3C60003C045 /* Info.plist */,
+ );
+ name = Resources;
+ path = ..;
+ sourceTree = "";
+ };
+ 33CEB47122A05771004F2AC0 /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
+ );
+ path = Flutter;
+ sourceTree = "";
+ };
+ 33FAB671232836740065AC1E /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */,
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */,
+ 33E51914231749380026EE4D /* Release.entitlements */,
+ 33CC11242044D66E0003C045 /* Resources */,
+ 33BA886A226E78AF003329D5 /* Configs */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C80D4294CF70F00263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 331C80D1294CF70F00263BE5 /* Sources */,
+ 331C80D2294CF70F00263BE5 /* Frameworks */,
+ 331C80D3294CF70F00263BE5 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C80DA294CF71000263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 33CC10EC2044A3C60003C045 /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 33CC10E92044A3C60003C045 /* Sources */,
+ 33CC10EA2044A3C60003C045 /* Frameworks */,
+ 33CC10EB2044A3C60003C045 /* Resources */,
+ 33CC110E2044A8840003C045 /* Bundle Framework */,
+ 3399D490228B24CF009A79C7 /* ShellScript */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */,
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 33CC10ED2044A3C60003C045 /* app.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 33CC10E52044A3C60003C045 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 0920;
+ LastUpgradeCheck = 1430;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C80D4294CF70F00263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 33CC10EC2044A3C60003C045;
+ };
+ 33CC10EC2044A3C60003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ LastSwiftMigration = 1100;
+ ProvisioningStyle = Automatic;
+ SystemCapabilities = {
+ com.apple.Sandbox = {
+ enabled = 1;
+ };
+ };
+ };
+ 33CC111A2044C6BA0003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ ProvisioningStyle = Manual;
+ };
+ };
+ };
+ buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 33CC10E42044A3C60003C045;
+ productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 33CC10EC2044A3C60003C045 /* Runner */,
+ 331C80D4294CF70F00263BE5 /* RunnerTests */,
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C80D3294CF70F00263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10EB2044A3C60003C045 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3399D490228B24CF009A79C7 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
+ };
+ 33CC111E2044C6BF0003C045 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ Flutter/ephemeral/FlutterInputs.xcfilelist,
+ );
+ inputPaths = (
+ Flutter/ephemeral/tripwire,
+ );
+ outputFileListPaths = (
+ Flutter/ephemeral/FlutterOutputs.xcfilelist,
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C80D1294CF70F00263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10E92044A3C60003C045 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC10EC2044A3C60003C045 /* Runner */;
+ targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;
+ };
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
+ targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 33CC10F52044A3C60003C045 /* Base */,
+ );
+ name = MainMenu.xib;
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 331C80DB294CF71000263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/app";
+ };
+ name = Debug;
+ };
+ 331C80DC294CF71000263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/app";
+ };
+ name = Release;
+ };
+ 331C80DD294CF71000263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.app.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/app";
+ };
+ name = Profile;
+ };
+ 338D0CE9231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Profile;
+ };
+ 338D0CEA231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Profile;
+ };
+ 338D0CEB231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Profile;
+ };
+ 33CC10F92044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 33CC10FA2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Release;
+ };
+ 33CC10FC2044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ 33CC10FD2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+ 33CC111C2044C6BA0003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 33CC111D2044C6BA0003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C80DB294CF71000263BE5 /* Debug */,
+ 331C80DC294CF71000263BE5 /* Release */,
+ 331C80DD294CF71000263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10F92044A3C60003C045 /* Debug */,
+ 33CC10FA2044A3C60003C045 /* Release */,
+ 338D0CE9231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10FC2044A3C60003C045 /* Debug */,
+ 33CC10FD2044A3C60003C045 /* Release */,
+ 338D0CEA231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC111C2044C6BA0003C045 /* Debug */,
+ 33CC111D2044C6BA0003C045 /* Release */,
+ 338D0CEB231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 33CC10E52044A3C60003C045 /* Project object */;
+}
diff --git a/frontend/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/frontend/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/frontend/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000..2b285b4
--- /dev/null
+++ b/frontend/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/app/macos/Runner.xcworkspace/contents.xcworkspacedata b/frontend/app/macos/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..1d526a1
--- /dev/null
+++ b/frontend/app/macos/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/frontend/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/frontend/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/frontend/app/macos/Runner/AppDelegate.swift b/frontend/app/macos/Runner/AppDelegate.swift
new file mode 100644
index 0000000..d53ef64
--- /dev/null
+++ b/frontend/app/macos/Runner/AppDelegate.swift
@@ -0,0 +1,9 @@
+import Cocoa
+import FlutterMacOS
+
+@NSApplicationMain
+class AppDelegate: FlutterAppDelegate {
+ override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+ return true
+ }
+}
diff --git a/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..a2ec33f
--- /dev/null
+++ b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "images" : [
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_16.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_64.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_128.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_1024.png",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 0000000..82b6f9d
Binary files /dev/null and b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ
diff --git a/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
new file mode 100644
index 0000000..13b35eb
Binary files /dev/null and b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ
diff --git a/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
new file mode 100644
index 0000000..0a3f5fa
Binary files /dev/null and b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ
diff --git a/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
new file mode 100644
index 0000000..bdb5722
Binary files /dev/null and b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ
diff --git a/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
new file mode 100644
index 0000000..f083318
Binary files /dev/null and b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ
diff --git a/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
new file mode 100644
index 0000000..326c0e7
Binary files /dev/null and b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ
diff --git a/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
new file mode 100644
index 0000000..2f1632c
Binary files /dev/null and b/frontend/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ
diff --git a/frontend/app/macos/Runner/Base.lproj/MainMenu.xib b/frontend/app/macos/Runner/Base.lproj/MainMenu.xib
new file mode 100644
index 0000000..80e867a
--- /dev/null
+++ b/frontend/app/macos/Runner/Base.lproj/MainMenu.xib
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/app/macos/Runner/Configs/AppInfo.xcconfig b/frontend/app/macos/Runner/Configs/AppInfo.xcconfig
new file mode 100644
index 0000000..e7b0850
--- /dev/null
+++ b/frontend/app/macos/Runner/Configs/AppInfo.xcconfig
@@ -0,0 +1,14 @@
+// Application-level settings for the Runner target.
+//
+// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
+// future. If not, the values below would default to using the project name when this becomes a
+// 'flutter create' template.
+
+// The application's name. By default this is also the title of the Flutter window.
+PRODUCT_NAME = app
+
+// The application's bundle identifier
+PRODUCT_BUNDLE_IDENTIFIER = com.example.app
+
+// The copyright displayed in application information
+PRODUCT_COPYRIGHT = Copyright © 2023 com.example. All rights reserved.
diff --git a/frontend/app/macos/Runner/Configs/Debug.xcconfig b/frontend/app/macos/Runner/Configs/Debug.xcconfig
new file mode 100644
index 0000000..36b0fd9
--- /dev/null
+++ b/frontend/app/macos/Runner/Configs/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Debug.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/frontend/app/macos/Runner/Configs/Release.xcconfig b/frontend/app/macos/Runner/Configs/Release.xcconfig
new file mode 100644
index 0000000..dff4f49
--- /dev/null
+++ b/frontend/app/macos/Runner/Configs/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Release.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/frontend/app/macos/Runner/Configs/Warnings.xcconfig b/frontend/app/macos/Runner/Configs/Warnings.xcconfig
new file mode 100644
index 0000000..42bcbf4
--- /dev/null
+++ b/frontend/app/macos/Runner/Configs/Warnings.xcconfig
@@ -0,0 +1,13 @@
+WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
+GCC_WARN_UNDECLARED_SELECTOR = YES
+CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
+CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
+CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
+CLANG_WARN_PRAGMA_PACK = YES
+CLANG_WARN_STRICT_PROTOTYPES = YES
+CLANG_WARN_COMMA = YES
+GCC_WARN_STRICT_SELECTOR_MATCH = YES
+CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
+CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
+GCC_WARN_SHADOW = YES
+CLANG_WARN_UNREACHABLE_CODE = YES
diff --git a/frontend/app/macos/Runner/DebugProfile.entitlements b/frontend/app/macos/Runner/DebugProfile.entitlements
new file mode 100644
index 0000000..dddb8a3
--- /dev/null
+++ b/frontend/app/macos/Runner/DebugProfile.entitlements
@@ -0,0 +1,12 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.cs.allow-jit
+
+ com.apple.security.network.server
+
+
+
diff --git a/frontend/app/macos/Runner/Info.plist b/frontend/app/macos/Runner/Info.plist
new file mode 100644
index 0000000..4789daa
--- /dev/null
+++ b/frontend/app/macos/Runner/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSMinimumSystemVersion
+ $(MACOSX_DEPLOYMENT_TARGET)
+ NSHumanReadableCopyright
+ $(PRODUCT_COPYRIGHT)
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/frontend/app/macos/Runner/MainFlutterWindow.swift b/frontend/app/macos/Runner/MainFlutterWindow.swift
new file mode 100644
index 0000000..3cc05eb
--- /dev/null
+++ b/frontend/app/macos/Runner/MainFlutterWindow.swift
@@ -0,0 +1,15 @@
+import Cocoa
+import FlutterMacOS
+
+class MainFlutterWindow: NSWindow {
+ override func awakeFromNib() {
+ let flutterViewController = FlutterViewController()
+ let windowFrame = self.frame
+ self.contentViewController = flutterViewController
+ self.setFrame(windowFrame, display: true)
+
+ RegisterGeneratedPlugins(registry: flutterViewController)
+
+ super.awakeFromNib()
+ }
+}
diff --git a/frontend/app/macos/Runner/Release.entitlements b/frontend/app/macos/Runner/Release.entitlements
new file mode 100644
index 0000000..852fa1a
--- /dev/null
+++ b/frontend/app/macos/Runner/Release.entitlements
@@ -0,0 +1,8 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+
+
diff --git a/frontend/app/macos/RunnerTests/RunnerTests.swift b/frontend/app/macos/RunnerTests/RunnerTests.swift
new file mode 100644
index 0000000..5418c9f
--- /dev/null
+++ b/frontend/app/macos/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import FlutterMacOS
+import Cocoa
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/frontend/app/pubspec.lock b/frontend/app/pubspec.lock
new file mode 100644
index 0000000..687c22e
--- /dev/null
+++ b/frontend/app/pubspec.lock
@@ -0,0 +1,300 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+ archive:
+ dependency: transitive
+ description:
+ name: archive
+ sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.4.6"
+ args:
+ dependency: transitive
+ description:
+ name: args
+ sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.2"
+ async:
+ dependency: "direct main"
+ description:
+ name: async
+ sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.11.0"
+ boolean_selector:
+ dependency: transitive
+ description:
+ name: boolean_selector
+ sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ characters:
+ dependency: transitive
+ description:
+ name: characters
+ sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.0"
+ clock:
+ dependency: transitive
+ description:
+ name: clock
+ sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.1"
+ collection:
+ dependency: "direct main"
+ description:
+ name: collection
+ sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.17.2"
+ convert:
+ dependency: transitive
+ description:
+ name: convert
+ sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.1"
+ crypto:
+ dependency: transitive
+ description:
+ name: crypto
+ sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.3"
+ cupertino_icons:
+ dependency: "direct main"
+ description:
+ name: cupertino_icons
+ sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.6"
+ fake_async:
+ dependency: transitive
+ description:
+ name: fake_async
+ sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.1"
+ fixnum:
+ dependency: transitive
+ description:
+ name: fixnum
+ sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ flutter:
+ dependency: "direct main"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_lints:
+ dependency: "direct dev"
+ description:
+ name: flutter_lints
+ sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.3"
+ flutter_test:
+ dependency: "direct dev"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ googleapis_auth:
+ dependency: transitive
+ description:
+ name: googleapis_auth
+ sha256: af7c3a3edf9d0de2e1e0a77e994fae0a581c525fa7012af4fa0d4a52ed9484da
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.4.1"
+ grpc:
+ dependency: "direct main"
+ description:
+ name: grpc
+ sha256: e93ee3bce45c134bf44e9728119102358c7cd69de7832d9a874e2e74eb8cab40
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.2.4"
+ http:
+ dependency: transitive
+ description:
+ name: http
+ sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ http2:
+ dependency: transitive
+ description:
+ name: http2
+ sha256: "38db0c4aa9f1cd238a5d2e86aa0cc7cc91c77e0c6c94ba64bbe85e4ff732a952"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.0"
+ http_parser:
+ dependency: transitive
+ description:
+ name: http_parser
+ sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.2"
+ js:
+ dependency: transitive
+ description:
+ name: js
+ sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.7"
+ lints:
+ dependency: "direct dev"
+ description:
+ name: lints
+ sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.12.16"
+ material_color_utilities:
+ dependency: transitive
+ description:
+ name: material_color_utilities
+ sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.5.0"
+ meta:
+ dependency: transitive
+ description:
+ name: meta
+ sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.9.1"
+ path:
+ dependency: transitive
+ description:
+ name: path
+ sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.8.3"
+ pointycastle:
+ dependency: transitive
+ description:
+ name: pointycastle
+ sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.7.3"
+ protobuf:
+ dependency: "direct main"
+ description:
+ name: protobuf
+ sha256: "68645b24e0716782e58948f8467fd42a880f255096a821f9e7d0ec625b00c84d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.0"
+ sky_engine:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.99"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.10.0"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.11.0"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ string_scanner:
+ dependency: transitive
+ description:
+ name: string_scanner
+ sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.0"
+ term_glyph:
+ dependency: transitive
+ description:
+ name: term_glyph
+ sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.0"
+ typed_data:
+ dependency: transitive
+ description:
+ name: typed_data
+ sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.2"
+ vector_math:
+ dependency: transitive
+ description:
+ name: vector_math
+ sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
+ web:
+ dependency: transitive
+ description:
+ name: web
+ sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.1.4-beta"
+sdks:
+ dart: ">=3.1.4 <4.0.0"
diff --git a/frontend/app/pubspec.yaml b/frontend/app/pubspec.yaml
new file mode 100644
index 0000000..0372b7a
--- /dev/null
+++ b/frontend/app/pubspec.yaml
@@ -0,0 +1,95 @@
+name: app
+description: App for df
+# The following line prevents the package from being accidentally published to
+# pub.dev using `flutter 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.
+# A version number is three numbers separated by dots, like 1.2.43
+# followed by an optional build number separated by a +.
+# Both the version and the builder number may be overridden in flutter
+# 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.
+# 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.1.4 <4.0.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:
+ async: ^2.2.0
+ protobuf: ^3.0.0
+ collection: ^1.15.0-nullsafety.4
+ flutter:
+ sdk: flutter
+
+
+ # The following adds the Cupertino Icons font to your application.
+ # Use with the CupertinoIcons class for iOS style icons.
+ cupertino_icons: ^1.0.2
+ grpc: ^3.2.4
+
+dev_dependencies:
+ lints: ^2.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: ^2.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.
+flutter:
+
+ # The following line ensures that the Material Icons font is
+ # included with your application, so that you can use the icons in
+ # the material Icons class.
+ 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
+
+ # 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
diff --git a/frontend/app/web/favicon.png b/frontend/app/web/favicon.png
new file mode 100644
index 0000000..8aaa46a
Binary files /dev/null and b/frontend/app/web/favicon.png differ
diff --git a/frontend/app/web/icons/Icon-192.png b/frontend/app/web/icons/Icon-192.png
new file mode 100644
index 0000000..b749bfe
Binary files /dev/null and b/frontend/app/web/icons/Icon-192.png differ
diff --git a/frontend/app/web/icons/Icon-512.png b/frontend/app/web/icons/Icon-512.png
new file mode 100644
index 0000000..88cfd48
Binary files /dev/null and b/frontend/app/web/icons/Icon-512.png differ
diff --git a/frontend/app/web/icons/Icon-maskable-192.png b/frontend/app/web/icons/Icon-maskable-192.png
new file mode 100644
index 0000000..eb9b4d7
Binary files /dev/null and b/frontend/app/web/icons/Icon-maskable-192.png differ
diff --git a/frontend/app/web/icons/Icon-maskable-512.png b/frontend/app/web/icons/Icon-maskable-512.png
new file mode 100644
index 0000000..d69c566
Binary files /dev/null and b/frontend/app/web/icons/Icon-maskable-512.png differ
diff --git a/frontend/app/web/index.html b/frontend/app/web/index.html
new file mode 100644
index 0000000..fd44481
--- /dev/null
+++ b/frontend/app/web/index.html
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ app
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/app/web/manifest.json b/frontend/app/web/manifest.json
new file mode 100644
index 0000000..5620a33
--- /dev/null
+++ b/frontend/app/web/manifest.json
@@ -0,0 +1,35 @@
+{
+ "name": "app",
+ "short_name": "app",
+ "start_url": ".",
+ "display": "standalone",
+ "background_color": "#0175C2",
+ "theme_color": "#0175C2",
+ "description": "A new Flutter project.",
+ "orientation": "portrait-primary",
+ "prefer_related_applications": false,
+ "icons": [
+ {
+ "src": "icons/Icon-192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-maskable-192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "icons/Icon-maskable-512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ]
+}
diff --git a/frontend/app/windows/.gitignore b/frontend/app/windows/.gitignore
new file mode 100644
index 0000000..d492d0d
--- /dev/null
+++ b/frontend/app/windows/.gitignore
@@ -0,0 +1,17 @@
+flutter/ephemeral/
+
+# Visual Studio user-specific files.
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# Visual Studio build-related files.
+x64/
+x86/
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
diff --git a/frontend/app/windows/CMakeLists.txt b/frontend/app/windows/CMakeLists.txt
new file mode 100644
index 0000000..db76f0d
--- /dev/null
+++ b/frontend/app/windows/CMakeLists.txt
@@ -0,0 +1,102 @@
+# Project-level configuration.
+cmake_minimum_required(VERSION 3.14)
+project(app 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 "app")
+
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
+# versions of CMake.
+cmake_policy(VERSION 3.14...3.25)
+
+# Define build configuration option.
+get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+if(IS_MULTICONFIG)
+ set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
+ CACHE STRING "" FORCE)
+else()
+ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "Debug" CACHE
+ STRING "Flutter build mode" FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Profile" "Release")
+ endif()
+endif()
+# Define settings for the Profile build mode.
+set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
+set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
+set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
+set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
+
+# Use Unicode for all projects.
+add_definitions(-DUNICODE -D_UNICODE)
+
+# Compilation settings that should be applied to most targets.
+#
+# Be cautious about adding new options here, as plugins use this function by
+# default. In most cases, you should add new options to specific targets instead
+# of modifying this function.
+function(APPLY_STANDARD_SETTINGS TARGET)
+ target_compile_features(${TARGET} PUBLIC cxx_std_17)
+ target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
+ target_compile_options(${TARGET} PRIVATE /EHsc)
+ target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
+ target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>")
+endfunction()
+
+# Flutter library and tool build rules.
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# Application build; see runner/CMakeLists.txt.
+add_subdirectory("runner")
+
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# Support files are copied into place next to the executable, so that it can
+# run in place. This is done instead of making a separate bundle (as on Linux)
+# so that building and running from within Visual Studio will work.
+set(BUILD_BUNDLE_DIR "$")
+# Make the "install" step default, as it's required to run.
+set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+if(PLUGIN_BUNDLED_LIBRARIES)
+ install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endif()
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+ file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+ " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+ DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ CONFIGURATIONS Profile;Release
+ COMPONENT Runtime)
diff --git a/frontend/app/windows/flutter/CMakeLists.txt b/frontend/app/windows/flutter/CMakeLists.txt
new file mode 100644
index 0000000..930d207
--- /dev/null
+++ b/frontend/app/windows/flutter/CMakeLists.txt
@@ -0,0 +1,104 @@
+# This file controls Flutter-level build steps. It should not be edited.
+cmake_minimum_required(VERSION 3.14)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
+
+# === Flutter Library ===
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+ "flutter_export.h"
+ "flutter_windows.h"
+ "flutter_messenger.h"
+ "flutter_plugin_registrar.h"
+ "flutter_texture_registrar.h"
+)
+list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+ "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib")
+add_dependencies(flutter flutter_assemble)
+
+# === Wrapper ===
+list(APPEND CPP_WRAPPER_SOURCES_CORE
+ "core_implementations.cc"
+ "standard_codec.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_PLUGIN
+ "plugin_registrar.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_APP
+ "flutter_engine.cc"
+ "flutter_view_controller.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/")
+
+# Wrapper sources needed for a plugin.
+add_library(flutter_wrapper_plugin STATIC
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_PLUGIN}
+)
+apply_standard_settings(flutter_wrapper_plugin)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+ POSITION_INDEPENDENT_CODE ON)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+ CXX_VISIBILITY_PRESET hidden)
+target_link_libraries(flutter_wrapper_plugin PUBLIC flutter)
+target_include_directories(flutter_wrapper_plugin PUBLIC
+ "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_plugin flutter_assemble)
+
+# Wrapper sources needed for the runner.
+add_library(flutter_wrapper_app STATIC
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_APP}
+)
+apply_standard_settings(flutter_wrapper_app)
+target_link_libraries(flutter_wrapper_app PUBLIC flutter)
+target_include_directories(flutter_wrapper_app PUBLIC
+ "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_app flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_")
+set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE)
+add_custom_command(
+ OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+ ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
+ ${CPP_WRAPPER_SOURCES_APP}
+ ${PHONY_OUTPUT}
+ COMMAND ${CMAKE_COMMAND} -E env
+ ${FLUTTER_TOOL_ENVIRONMENT}
+ "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
+ windows-x64 $
+ VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+ "${FLUTTER_LIBRARY}"
+ ${FLUTTER_LIBRARY_HEADERS}
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_PLUGIN}
+ ${CPP_WRAPPER_SOURCES_APP}
+)
diff --git a/frontend/app/windows/flutter/generated_plugin_registrant.cc b/frontend/app/windows/flutter/generated_plugin_registrant.cc
new file mode 100644
index 0000000..8b6d468
--- /dev/null
+++ b/frontend/app/windows/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,11 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+
+void RegisterPlugins(flutter::PluginRegistry* registry) {
+}
diff --git a/frontend/app/windows/flutter/generated_plugin_registrant.h b/frontend/app/windows/flutter/generated_plugin_registrant.h
new file mode 100644
index 0000000..dc139d8
--- /dev/null
+++ b/frontend/app/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/frontend/app/windows/flutter/generated_plugins.cmake b/frontend/app/windows/flutter/generated_plugins.cmake
new file mode 100644
index 0000000..b93c4c3
--- /dev/null
+++ b/frontend/app/windows/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}/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/frontend/app/windows/runner/CMakeLists.txt b/frontend/app/windows/runner/CMakeLists.txt
new file mode 100644
index 0000000..394917c
--- /dev/null
+++ b/frontend/app/windows/runner/CMakeLists.txt
@@ -0,0 +1,40 @@
+cmake_minimum_required(VERSION 3.14)
+project(runner LANGUAGES CXX)
+
+# Define the application target. To change its name, change BINARY_NAME in the
+# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
+# work.
+#
+# Any new source files that you add to the application should be added here.
+add_executable(${BINARY_NAME} WIN32
+ "flutter_window.cpp"
+ "main.cpp"
+ "utils.cpp"
+ "win32_window.cpp"
+ "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+ "Runner.rc"
+ "runner.exe.manifest"
+)
+
+# Apply the standard set of build settings. This can be removed for applications
+# that need different build settings.
+apply_standard_settings(${BINARY_NAME})
+
+# Add preprocessor definitions for the build version.
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}")
+
+# Disable Windows macros that collide with C++ standard library functions.
+target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
+
+# Add dependency libraries and include directories. Add any application-specific
+# dependencies here.
+target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
+target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib")
+target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
+
+# Run the Flutter tool portions of the build. This must not be removed.
+add_dependencies(${BINARY_NAME} flutter_assemble)
diff --git a/frontend/app/windows/runner/Runner.rc b/frontend/app/windows/runner/Runner.rc
new file mode 100644
index 0000000..9466db6
--- /dev/null
+++ b/frontend/app/windows/runner/Runner.rc
@@ -0,0 +1,121 @@
+// Microsoft Visual C++ generated resource script.
+//
+#pragma code_page(65001)
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (United States) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""winres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_APP_ICON ICON "resources\\app_icon.ico"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)
+#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD
+#else
+#define VERSION_AS_NUMBER 1,0,0,0
+#endif
+
+#if defined(FLUTTER_VERSION)
+#define VERSION_AS_STRING FLUTTER_VERSION
+#else
+#define VERSION_AS_STRING "1.0.0"
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION VERSION_AS_NUMBER
+ PRODUCTVERSION VERSION_AS_NUMBER
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_APP
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904e4"
+ BEGIN
+ VALUE "CompanyName", "com.example" "\0"
+ VALUE "FileDescription", "app" "\0"
+ VALUE "FileVersion", VERSION_AS_STRING "\0"
+ VALUE "InternalName", "app" "\0"
+ VALUE "LegalCopyright", "Copyright (C) 2023 com.example. All rights reserved." "\0"
+ VALUE "OriginalFilename", "app.exe" "\0"
+ VALUE "ProductName", "app" "\0"
+ VALUE "ProductVersion", VERSION_AS_STRING "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
+#endif // English (United States) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/frontend/app/windows/runner/flutter_window.cpp b/frontend/app/windows/runner/flutter_window.cpp
new file mode 100644
index 0000000..955ee30
--- /dev/null
+++ b/frontend/app/windows/runner/flutter_window.cpp
@@ -0,0 +1,71 @@
+#include "flutter_window.h"
+
+#include
+
+#include "flutter/generated_plugin_registrant.h"
+
+FlutterWindow::FlutterWindow(const flutter::DartProject& project)
+ : project_(project) {}
+
+FlutterWindow::~FlutterWindow() {}
+
+bool FlutterWindow::OnCreate() {
+ if (!Win32Window::OnCreate()) {
+ return false;
+ }
+
+ RECT frame = GetClientArea();
+
+ // The size here must match the window dimensions to avoid unnecessary surface
+ // creation / destruction in the startup path.
+ flutter_controller_ = std::make_unique(
+ frame.right - frame.left, frame.bottom - frame.top, project_);
+ // Ensure that basic setup of the controller was successful.
+ if (!flutter_controller_->engine() || !flutter_controller_->view()) {
+ return false;
+ }
+ RegisterPlugins(flutter_controller_->engine());
+ SetChildContent(flutter_controller_->view()->GetNativeWindow());
+
+ flutter_controller_->engine()->SetNextFrameCallback([&]() {
+ this->Show();
+ });
+
+ // Flutter can complete the first frame before the "show window" callback is
+ // registered. The following call ensures a frame is pending to ensure the
+ // window is shown. It is a no-op if the first frame hasn't completed yet.
+ flutter_controller_->ForceRedraw();
+
+ return true;
+}
+
+void FlutterWindow::OnDestroy() {
+ if (flutter_controller_) {
+ flutter_controller_ = nullptr;
+ }
+
+ Win32Window::OnDestroy();
+}
+
+LRESULT
+FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ // Give Flutter, including plugins, an opportunity to handle window messages.
+ if (flutter_controller_) {
+ std::optional result =
+ flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
+ lparam);
+ if (result) {
+ return *result;
+ }
+ }
+
+ switch (message) {
+ case WM_FONTCHANGE:
+ flutter_controller_->engine()->ReloadSystemFonts();
+ break;
+ }
+
+ return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
+}
diff --git a/frontend/app/windows/runner/flutter_window.h b/frontend/app/windows/runner/flutter_window.h
new file mode 100644
index 0000000..6da0652
--- /dev/null
+++ b/frontend/app/windows/runner/flutter_window.h
@@ -0,0 +1,33 @@
+#ifndef RUNNER_FLUTTER_WINDOW_H_
+#define RUNNER_FLUTTER_WINDOW_H_
+
+#include
+#include
+
+#include
+
+#include "win32_window.h"
+
+// A window that does nothing but host a Flutter view.
+class FlutterWindow : public Win32Window {
+ public:
+ // Creates a new FlutterWindow hosting a Flutter view running |project|.
+ explicit FlutterWindow(const flutter::DartProject& project);
+ virtual ~FlutterWindow();
+
+ protected:
+ // Win32Window:
+ bool OnCreate() override;
+ void OnDestroy() override;
+ LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,
+ LPARAM const lparam) noexcept override;
+
+ private:
+ // The project to run.
+ flutter::DartProject project_;
+
+ // The Flutter instance hosted by this window.
+ std::unique_ptr flutter_controller_;
+};
+
+#endif // RUNNER_FLUTTER_WINDOW_H_
diff --git a/frontend/app/windows/runner/main.cpp b/frontend/app/windows/runner/main.cpp
new file mode 100644
index 0000000..bc9bfa3
--- /dev/null
+++ b/frontend/app/windows/runner/main.cpp
@@ -0,0 +1,43 @@
+#include
+#include