From 7b106409aeb46cc00c29e08a424fac9bc5bb17f0 Mon Sep 17 00:00:00 2001 From: Samuel Zielke Date: Thu, 19 Jun 2025 03:27:57 +0200 Subject: [PATCH] FirstCommit - PubBeta - It Works - Create and Join Game - Start and Stop rounds --- .gitignore | 2 + NIP_APP/asgi.py | 16 +++ NIP_APP/settings.py | 128 +++++++++++++++++++++ NIP_APP/urls.py | 23 ++++ NIP_APP/wsgi.py | 16 +++ app/admin.py | 6 + app/apps.py | 6 + app/migrations/0001_initial.py | 23 ++++ app/migrations/0002_player.py | 22 ++++ app/migrations/0003_player_leader.py | 18 +++ app/migrations/0004_answer.py | 22 ++++ app/migrations/0005_games_round_open.py | 18 +++ app/migrations/0006_answer_akey.py | 18 +++ app/migrations/0007_alter_answer_answer.py | 18 +++ app/models.py | 27 +++++ app/static/nip-app.png | Bin 0 -> 44797 bytes app/templates/app/game.html | 114 ++++++++++++++++++ app/templates/app/home.html | 79 +++++++++++++ app/tests.py | 3 + app/urls.py | 7 ++ app/views.py | 106 +++++++++++++++++ db.sqlite3 | Bin 0 -> 167936 bytes manage.py | 22 ++++ 23 files changed, 694 insertions(+) create mode 100644 .gitignore create mode 100644 NIP_APP/asgi.py create mode 100644 NIP_APP/settings.py create mode 100644 NIP_APP/urls.py create mode 100644 NIP_APP/wsgi.py create mode 100644 app/admin.py create mode 100644 app/apps.py create mode 100644 app/migrations/0001_initial.py create mode 100644 app/migrations/0002_player.py create mode 100644 app/migrations/0003_player_leader.py create mode 100644 app/migrations/0004_answer.py create mode 100644 app/migrations/0005_games_round_open.py create mode 100644 app/migrations/0006_answer_akey.py create mode 100644 app/migrations/0007_alter_answer_answer.py create mode 100644 app/models.py create mode 100644 app/static/nip-app.png create mode 100644 app/templates/app/game.html create mode 100644 app/templates/app/home.html create mode 100644 app/tests.py create mode 100644 app/urls.py create mode 100644 app/views.py create mode 100644 db.sqlite3 create mode 100755 manage.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..72dc365 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +venv/ +__init__.py \ No newline at end of file diff --git a/NIP_APP/asgi.py b/NIP_APP/asgi.py new file mode 100644 index 0000000..69183e1 --- /dev/null +++ b/NIP_APP/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for NIP_APP project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NIP_APP.settings') + +application = get_asgi_application() diff --git a/NIP_APP/settings.py b/NIP_APP/settings.py new file mode 100644 index 0000000..b0bf5c2 --- /dev/null +++ b/NIP_APP/settings.py @@ -0,0 +1,128 @@ +""" +Django settings for NIP_APP project. + +Generated by 'django-admin startproject' using Django 4.2.23. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.2/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-kk922joxhefnfkzxvg_aqecsq546)ae8o22#33+6h))_3^nm#!' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + +STATIC_URL = '/static/' + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + + # CUSTOMS + 'app', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'NIP_APP.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'NIP_APP.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.2/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/NIP_APP/urls.py b/NIP_APP/urls.py new file mode 100644 index 0000000..a18eaed --- /dev/null +++ b/NIP_APP/urls.py @@ -0,0 +1,23 @@ +""" +URL configuration for NIP_APP project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', include('app.urls')), # APP-URLs Einbindung +] diff --git a/NIP_APP/wsgi.py b/NIP_APP/wsgi.py new file mode 100644 index 0000000..16326dd --- /dev/null +++ b/NIP_APP/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for NIP_APP project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NIP_APP.settings') + +application = get_wsgi_application() diff --git a/app/admin.py b/app/admin.py new file mode 100644 index 0000000..6954e90 --- /dev/null +++ b/app/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from app.models import games, Player, answer + +admin.site.register(games) +admin.site.register(Player) +admin.site.register(answer) diff --git a/app/apps.py b/app/apps.py new file mode 100644 index 0000000..ed327d2 --- /dev/null +++ b/app/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AppConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'app' diff --git a/app/migrations/0001_initial.py b/app/migrations/0001_initial.py new file mode 100644 index 0000000..d2f7a63 --- /dev/null +++ b/app/migrations/0001_initial.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.23 on 2025-06-18 23:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='games', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(max_length=14, unique=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('state', models.BooleanField(default=True)), + ], + ), + ] diff --git a/app/migrations/0002_player.py b/app/migrations/0002_player.py new file mode 100644 index 0000000..14e3d21 --- /dev/null +++ b/app/migrations/0002_player.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.23 on 2025-06-18 23:40 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Player', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('game', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='players', to='app.games')), + ], + ), + ] diff --git a/app/migrations/0003_player_leader.py b/app/migrations/0003_player_leader.py new file mode 100644 index 0000000..a27da3b --- /dev/null +++ b/app/migrations/0003_player_leader.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.23 on 2025-06-18 23:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0002_player'), + ] + + operations = [ + migrations.AddField( + model_name='player', + name='leader', + field=models.BooleanField(default=False), + ), + ] diff --git a/app/migrations/0004_answer.py b/app/migrations/0004_answer.py new file mode 100644 index 0000000..df6ad75 --- /dev/null +++ b/app/migrations/0004_answer.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.23 on 2025-06-19 00:12 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0003_player_leader'), + ] + + operations = [ + migrations.CreateModel( + name='answer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('answer', models.CharField(max_length=250, unique=True)), + ('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='app.player')), + ], + ), + ] diff --git a/app/migrations/0005_games_round_open.py b/app/migrations/0005_games_round_open.py new file mode 100644 index 0000000..9d9be4e --- /dev/null +++ b/app/migrations/0005_games_round_open.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.23 on 2025-06-19 00:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0004_answer'), + ] + + operations = [ + migrations.AddField( + model_name='games', + name='round_open', + field=models.BooleanField(default=False), + ), + ] diff --git a/app/migrations/0006_answer_akey.py b/app/migrations/0006_answer_akey.py new file mode 100644 index 0000000..0e8264b --- /dev/null +++ b/app/migrations/0006_answer_akey.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.23 on 2025-06-19 00:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0005_games_round_open'), + ] + + operations = [ + migrations.AddField( + model_name='answer', + name='akey', + field=models.CharField(max_length=1, null=True), + ), + ] diff --git a/app/migrations/0007_alter_answer_answer.py b/app/migrations/0007_alter_answer_answer.py new file mode 100644 index 0000000..41c19bd --- /dev/null +++ b/app/migrations/0007_alter_answer_answer.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.23 on 2025-06-19 01:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0006_answer_akey'), + ] + + operations = [ + migrations.AlterField( + model_name='answer', + name='answer', + field=models.CharField(max_length=250), + ), + ] diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..04f44a9 --- /dev/null +++ b/app/models.py @@ -0,0 +1,27 @@ +from django.db import models + +# Create your models here. +class games(models.Model): + key = models.CharField(max_length=14, unique=True) + created_at = models.DateTimeField(auto_now_add=True) + state = models.BooleanField(default=True) + round_open = models.BooleanField(default=False) + + def __str__(self): + return self.key + +class Player(models.Model): + name = models.CharField(max_length=100) + game = models.ForeignKey(games, on_delete=models.CASCADE, related_name='players') + leader = models.BooleanField(default=False) + + def __str__(self): + return f"{self.name} ({self.game.key})" + +class answer(models.Model): + answer = models.CharField(max_length=250, unique=False, null=False) + player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name='answers') + akey = models.CharField(max_length=1, null=True, unique=False) + + def __str__(self): + return f"{self.answer}" \ No newline at end of file diff --git a/app/static/nip-app.png b/app/static/nip-app.png new file mode 100644 index 0000000000000000000000000000000000000000..87a5ba7cb25d5764f92522819541e5681583c9cd GIT binary patch literal 44797 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 z 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 + + + + Spielseite + + + + + + + + Logo + + {% if has_name %} + +

Spieler erkannt.
{{ player_data.name }}{% if player_data.leader %} - {{ countPlayers }} gesamt{% endif %}

+
+ + +
+
+ {% csrf_token %} + + + {% if player_data.leader %} + {% if round_open %} + + {% else %} + + + {% endif %} + {% endif %} + {% if round_open and not openAnswer %} +

+ + + {% endif %} +
+ {% else %} + +

Bitte Namen eingeben:

+
+ {% csrf_token %} + + +
+ {% endif %} + + + {% if player_data.leader %} + + + + + + + + + + + + + {% for answer in answers %} + + + + + + {% endfor %} + +
#SpielerAntwort
{{ answer.akey }}{{ answer.player.name }}{{ answer.answer }}
+ + {% endif %} + + + \ No newline at end of file diff --git a/app/templates/app/home.html b/app/templates/app/home.html new file mode 100644 index 0000000..5d62e9f --- /dev/null +++ b/app/templates/app/home.html @@ -0,0 +1,79 @@ +{% load static %} + + + + Nobody is Perfect | Die APP + + + + + + +
+ {% csrf_token %} + +
+ + + + + + + + + + + + {% for game in games %} + + + + + + + {% endfor %} + +
Spiel-IDKeyStatusAction
{{ game.id }}{{ game.key }}{{ game.state }}öffnen
+ + \ No newline at end of file diff --git a/app/tests.py b/app/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/app/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/app/urls.py b/app/urls.py new file mode 100644 index 0000000..6db7c8b --- /dev/null +++ b/app/urls.py @@ -0,0 +1,7 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.home, name='home'), + path('game', views.game, name='game'), +] \ No newline at end of file diff --git a/app/views.py b/app/views.py new file mode 100644 index 0000000..8e7aa83 --- /dev/null +++ b/app/views.py @@ -0,0 +1,106 @@ +from django.shortcuts import render, redirect +from django.urls import reverse +from django.utils.http import urlencode +import app.models as AppDB +import random +import string + +def random_alphabet(playerCount, listOfUsed): + full_alphabet = ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J") + game_alphabet = full_alphabet[:playerCount+1] + + # Verfügbare Buchstaben berechnen + available_letters = list(set(game_alphabet) - set(listOfUsed)) + + # Optional: sortieren (wenn Reihenfolge wichtig ist) + available_letters.sort() + + # Zufälligen Buchstaben wählen (falls verfügbar) + if available_letters: + chosen_letter = random.choice(available_letters) + print(f"Ausgewählter Buchstabe: {chosen_letter}") + return chosen_letter + else: + print("Keine Buchstaben mehr verfügbar.") + return "X" + + +def generate_key_view(): + key = ''.join(random.choices(string.ascii_uppercase + string.digits, k=14)) + + # Optional: Stelle sicher, dass der Key einzigartig ist + while AppDB.games.objects.filter(key=key).exists(): + key = ''.join(random.choices(string.ascii_uppercase + string.digits, k=14)) + + AppDB.games.objects.create(key=key) + + return key + +def home(request): + if request.method == "POST": + generate_key_view() + + requestGames = AppDB.games.objects.all() + return render(request, 'app/home.html', {'games':requestGames}) + +def game(request): + game_key = request.GET.get("key") + base_url = reverse("game") + query_string = urlencode({"key": game_key}) + game_instance = AppDB.games.objects.get(key=game_key) + player_name = request.session.get("device_name") + player_instance = AppDB.Player.objects.get(name=player_name) if player_name else None + openAnswer = True if AppDB.answer.objects.filter(player=player_instance).exists() else False + players_inGame = AppDB.Player.objects.filter(game=game_instance) + + if request.method == "POST": + if "btn_login_name" in request.POST: + input_PlayerName = request.POST.get("input_newPlayerName") + request.session["device_name"] = input_PlayerName + newEntry_Player = AppDB.Player() + + if not players_inGame.exists(): + newEntry_Player.leader = True + + newEntry_Player.game = game_instance + print(query_string) + newEntry_Player.name = input_PlayerName + newEntry_Player.save() + # Redirect mit key + return redirect(f"{base_url}?{query_string}") + + if "btn_logout" in request.POST: + toDeleteEntry = AppDB.Player.objects.get(name=player_name) + toDeleteEntry.delete() + request.session.flush() # oder: del request.session["device_name"] + return redirect(f"{base_url}?{query_string}") + + if "btn_start" in request.POST: + game_instance.round_open = True + game_instance.save() + + if "btn_stop" in request.POST: + game_instance.round_open = False + game_instance.save() + + if "btn_clear" in request.POST: + AppDB.answer.objects.filter(player__game=game_instance).delete() + + if "btn_sendAnswer" in request.POST: + sendAnswer = AppDB.answer() + sendAnswer.answer = request.POST.get("input_answer") + sendAnswer.player = player_instance + sendAnswer.akey = random_alphabet(players_inGame.count(), AppDB.answer.objects.filter(player__game=game_instance.id).values_list('akey', flat=True)) + sendAnswer.save() + openAnswer = False + return redirect(f"{base_url}?{query_string}") + + return render(request, "app/game.html", { + "has_name": player_name, + "game_key": game_key, + 'player_data': player_instance, + "round_open": game_instance.round_open, + "openAnswer": openAnswer, + "answers": AppDB.answer.objects.filter(player__game=game_instance.id).order_by("akey"), + 'countPlayers':players_inGame.count(), + }) \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..7c2cc4fd9cfc17491416b85dfb423a57e29e2993 GIT binary patch literal 167936 zcmeI5du$uYeaE>XC5n>BkuA$SpI?+L<;;^M?~^Z|lSr~`%Wqpc`{eY>uE>={n=g}; zWjVP3^4%qEUImgS=qtUnNRa|ffnHKHNUmv%1VP#cY0@HT-a*>{P4h<{4Vnj%6zI(C zlDmB9;cE_ea=)@Q;?Df$H{bcp>`?pLS#jp_xlF|fEfh*Qy%JJfy)Hp;y*3nbxm=&6 z-(mVaNWb0m`z-zT(C_M(P<^q%&(FHX@*iub1_JpxGYgtOHmHFj5C8!X009sH0T2KI z5C8!X009sHfnPF#{=I(cagXm?F7j#e9+D;lfqx0SEimE#AO8#f6~Ef^?Vjg)uJ-Kc z{#^I7-IuyUUH{efLf6~6X1Wg2D)<5c5C8!X009sH0T6g)5=iW6cl8|~*Na6_6r)K! zTQN#WJzrj_{g6dj8x6m@i$qY>GvRd24+{-|Sd zO^(JQV|~MW8h8Ml@*B_o+Cf{xxlh>YWTbebB6p2SqceJ~P zPmMbWj(LQX!LCXRu|Nu4dyN>WWgfT*ue61bVF&%|P!?SHIvsTD8t)7E3ydft2@jQDYxTy2$rPk~~H7G$*nSt-As z_wMrS-z!u%4p~1t_IZX63C$uOH?;Ru>Jo-U4QK&Und_TzfR^!g7gHw8TgC9djh4vg}_)~r~e23fAs&k z|5^X6|4`45d%n=~!JcP&eywMs=Ro(*y1&}}vF_jM&Uc^dKGNOM^{>=BM=&DcL|3^e77^kiuJs}q@EA4!;twa_s}6~@yJnM+Q=GoBfOc(Y|M9u6Jk?Q~jdY#U3B zWp%)`veejCmKrnTz<#c#lc}*ym>R2mA20WEHT(*rCWapk?xp3!qh3o(&BBsm+B|I9 zSW0R(mJoitk3L=^9DKyfbkq!(4ATRBfP}Wv!BtonH8ma9@vG^xGQJ)D8#GPhl>uH zd6p|H*27&nLP7g^h9mZ~Z>L8X7V3gMd(AA%5s%h9OgzFt!4Bo@;U;y#n}>FJgs{*M zs|lK!mMbgBvYU6u8HMTJ?GZ+Wrl`xVhdhELw1}_tnFW?xM`UDYzegAm8sjB9xOzJ@ z(#r)ngCWGsu^h69Mj+r3_6xOOho5tE#5a04fx3W3x0z)*;Sq^0-m)F8@Ns>O0gBF` zM>r}p2P3>@zU9!49CUE14FQJsogUvKLR~b$v&-Wf5gI}VZk}oRtX}@N^?H26e8yFC z*!_QjJmI4M@dW}P00JNY0w4eaAOHd&00JNY0w8do1lEQHziaLIxNq3+_xZ;C#rd1* z1vyz>(q%0&6rq2VP!xxhseCpvak+H2vV8TFc&<{In2=<7$hdq(o0y1QjorNvJ3l=e zzZ<)zi|5qn-RQ)^oog$xd0kVkoYu6`)#>BTzdEQSR4t)t^e>UpHq^47TQ;(HGe-8N z(PSly^zWOB@tDHy{|n>?F8Uu|AOHd&00JNY0w4eaAOHd&00JNY0uKlQ;vV)nBLnRI zzpM8F=^VNN0w4eaAOHd&00JNY0w4eaAOHd&(2{`P|GdlXf4D7h(*H2I>3_cG&E41u z(2^7~K>!3m00ck)1V8`;KmY_DTmoym+S|{sMaQ!@lv}q_g;h1W6whUsw7hX=RZXR% zOXaAPy1QC2R?pnL{>1g-oP2d*K6kQmeP%i`ee-&GUO7{oyQXFqE+?er8TtBLqHuXm zzdn0A7mr>X&78a#%`PQ#sY0Zr&Q0AuHG82nxpGCkbv+-AuB6Nj+tE=`4#`SFlM|vk zro|%k9|ivIR~+q_oLkJ!%VWlw zJ6CUXJ4)UA|FNZ%84mea@7s_iX2hadcAZ)9Uaf!x_wJt(wEg}CKg{QEUi{@^J-*1J)bQV z7Nd8i))VS#S%2bubuul@CN9sUu0_(Z(!}cB89g>rymj%0F{j-sTwS^~SBaG3E2B48 zi&}bg^vcbeBqbz@3Ho2s#+0Zmiki#SMc(OhlhZEp5ptUT-M<_;L=L^;rWXW(00@8p z2!H?xfB*=900@8p2!OyVgusydys%lMsGS>aa`o>eUv~{}+9~E~vtUab^)j@XC+z>< zj1bB}00ck)1V8`;KmY_l00ck)1VCW>6TtQV_8&v^00ck)1V8`;KmY_l00ck)1V8`; zHY33P{{Ijeb&+3?pO7Dt?~-qmeAWwJmw4bHzyLj5i)15rs z!BS5zPYF*0JoU5G-NVyvo_6un$I`Y=o_cxO!P9n++b4Kf;$}&k+wJq={{MELl+X_X zAOHd&00JNY0w4eaAOHd&00Ns6VE6y=`G1>pf&~bG00@8p2!H?xfB*=900@8p2yABp zxc=YHqX+FE00JNY0w4eaAOHd&00JNY0wAz80=WL)8YftR00@8p2!H?xfB*=900@8p z2!OzLCV=bz?L2zW4gw$m0w4eaAOHd&00JNY0w4eaTO)w$|E+O?6$pR;2!H?xfB*=9 z00@8p2!H?xY-a*~?~hzW__T`*1^(Ih#g0$-S9;#kv8(->=iS{u@x7*Vs{1kb-wB^? zyC}TV^?BFv?cCD`TKm&)-0KaFjtXx+TG8jTM*4=HUo0f`bS{%mW($jr#|I{_OpVV@ zg=WVm&P{~|8;b`+hX*t1!B8e&F&2$d=)%R>(1pj(oeN#MGJSsh%3SE|)Ldx%@!5;h z7pSB2Qx|5Bga!-qH;hyz$?8>%I~88R&Mq0n(qQPeUP>+LrNgo)hHGA_k)En#3i;$h zR$m+pm2-MFOPdZY=gXPJypgV1h9*x>O`fIV>g->AJS2vx6Y4p?Xe4t+xvVc5RTY+W zR$idp$ybt<)uO>=*1E^Kc4g}1)Rn0VlT$M_9?l9Dl5pq*v%A8%O<$OvogP1TZqCY_ zIzd}mE*qtK?^Srt7WC!HQj(c&*{{{*N+w6Umewl#MBdXsH)1h>Ul79@xn&c7y(-! zLl<6q%}#Id=BTh%Zs^Qnsjyrun=MoE{E+n`t}2?C5>v_LeCC#|&@}I}I`H^~>C2B# zg_`=YC8v$OFe@?b)d8ntU)4iu)mN*d_&-sY)ySBfZ|>lT`fqjl`RtDExUz7E|*J@z%O`Y)N;Mv&|$|D-4G3iQRnZ zd!~;seT}2vc-&*@v6jBZV(WaozooA_1)6L9-_H43C%533+gj>3S*60=uX0`bWxgG* zt@L*W*L>r`y`%Pw;ZS(uobnc`hKVYvdSpJL$PMRjW9^4FIg=ahYYT;~fUkMZ)*KU! zS8w#uaEjM?qUU+vE^qKMU8%H&j`QItJ65Quro}Z?ZJckrTbv$T!g>xG^_q4}C4a@& z&wCd-y}@`~cqVF}5@x9_zs!|1<@#Ej9!*9s>LjVj`{hn%y6oDWV!hvjd%MCGPZ)Z# z>~20`)?&N8!4!SZoog8U#yM1*hk9Hy^t3c@&w@tNJ?qVfM#CnbjT57>f^#B=*LwTB z!Haa>N)6KaDB16@5nYmvbj%^xG}yJC%ysHFiZjjXCEXx&5plFE;vZo_pHb*~Cn(Ha2V=D)Qz!k5}Q zf+His90yyzmCaO)WZAg2Y~)i$!=bwlVMF2Jyq+_T(3;`3Il&t|dQ`ZlbD!4LQZBPt z(%EH8xhbQq&TsYd%C7LDMno?b9T!lVR(Ao#w60%Dt7bC>T^gIO8*u->d0j^i2!H?x zfB*=900@8p2!H?xfB*kdf27CVJ=*mq-w%Bs@9gz{!#mXR z?T$I>Oz6EdDC=jQ9v4L)NdNAc1TR3;WB!gpXKxZ*d?;& z*ozRB9_t8B9TZ$V1Z_nGX$-c&kCUvki!{_$PD-_x;kD#3Z}8wj;c0)38Mmof9BwAY z4PF$m`d+Da6fk7QwP_DiC4=q{NGJ75i-;dBFIQ;sU}(Nj$ku4nYzcY-)kler#+p* zccR|lByE3Bt$nMIv1hHPRl|rWbn654U=|%}Zhf6PcH5=_YuoZmZwjtP%#-MNZ9ZDcsp<-Cc7i!4<>rz6EWMM(0{?Z>D7>~y@&;$Z!djeT zw?gA(x+jNi@G0`q5Fon7!$cId`izH4ATj4{Q0XbN4-Qi+Z`dQYg_o z6V;tzk{q*_G}`~HUaqhmY#F*J*>^9@l{`~UmY3=MA@c@Q-8`fle#?HJ4X$~-deQ<5Z2w$Dna`p)G5I*@&-My1|hsQG)Q+G zjnwTpvTyt)og4Ak$}KOb(TJg%ccpE+fF-;7=E3@Jm#*u@aU0jRW<70amM-iw1K!~3 zh;WaX?9;>GMid)9stnc0(PO=oWXSZKEdbtzB=qCvPYAndJ}d0Q_7+paE`3q+qY?AQH-)Vw)mh1Eb@R8ZTA%IZrs2J^ey+;SyR6~0 z(+BAmOGQ|Fz4NWjDTM!inAPWvY%)j3KAVh2=F>`AndbxFLb<2q;I}Z`*mK=mpi>Yd z!+z=Dn%Fi3E{jg&=>y)Nq6qim&UZ9t%@!K=*AIOQix)Ngw!U>o#Z=w8m~Lg+@7&5_ z$*OIAuI-aaX%W?!*CUMv`>bwRt43pSQ~f&FwPsk?t9vHGYlruFgGsu(=CX69)NGs2 zW_3Pg#EkjIw)bu#%{gFfT})Yi)|c2&V=#>S|Mz`ig9;!30w4eaAOHd&00JNY0w4ea zAh7KS;QD{t4H*Q300@8p2!H?xfB*=900@8p2!OzS6TtQVeIr8!5C8!X009sH0T2KI z5C8!X009u#b_Ce$RCn-li%ES-GpEe009sH0T2KI5C8!X009sH0T6gO2(-Hep)<(S-8}8*=`NP~ z`gppN=j`CGd--d^(*R4oexCO5oNku-x_Ij2X(vy;Jni6VJ4-t~JazN5&Epn)o#yrb zJ6z-!DB%>$ydl1$mhsE(ChubB`=V_B+ru%(ulwxk@u3{ChsEecsY=v zO%MP95C8!X009sH0T2KI5C8!Xcu)v<+&&@5lHDxnXUQ&>^s!_oOLnlNmnDQH0hah# z(!-K&mUOYi$C6H#cv;fHl6IDOSmI_$o7?U4`6)Ud`BfLa^8X6G-v2A|9C-_Q1If`W ze1QN6fB*=900@8p2!H?xfB*=900?Y}fZykF_3fdbaA1Dun7`9HG(YR9$4d``w3L7F zQeTJ1wSTYmc|T?A=iYXYYxt1$SNkigMWgI^-Q)4N`uo`jbg)kz@Vn_zkR9=lYT4OF z4+q$x{qY<-1dl7YpMMSk{YV`nUn#A!>;GWa2VL|&{~DPf?!XrV9|+tHTnG%(PXqj@ z|7rhuztHphJ;k2x?r(N~sJqe~>G~-(#}^2I00@8p2!H?xfB*=*jux6p9lM73+`eS8i~q}_SV!# zTd5c02~8YR)MzxOq=+p@`eh0dBdifwk+n$lOn?oBIjLGtgpDT^^(AX#aWN`KBdVWv zE^JP!lapu8#V$`=J#*&T#kuotuXB*Zgce~)6jf0aRqd(OlCMlppE)rnMNdthmDP#$ zYDtn7J=RTYnG-l>&Y}7i!}ar*Hz}%PbfCq!^k`RY6e7)|KyB%nB94g>H73U&_0?>( zmbP+2jgN_1T#7{>?X1~KEp4TQrjALX9En9oywuj5n<}$yn446DWlRODM>?qS9!^#{ zPd_s?Gf+R1#e^y*L@Gm4wOI5>d(B#IZLP!;k~|iVNlHXI?xEJlxNogG%hqQZ3&~1C zizYOAOjIM3=5cqedTo+!R$XOtCMHEGhU0Cu>hf%1KBLoBZHv_-swTf$pw*9?U`}QW zrHq~r9j>26&Y57Ux0+X!SQLN%?vi=pyfT zxygcye3C4XXUY4?DRTH_7X<+z00JNY0w4eaAOHd&00JNY0wAz02^?^b3+4up=%^_3 z9Rzfjjyk5rBJ^K-U9l1p=~f21Wrl9ziOQm=dC9-K4sOuxy4u{iswFgSOpYmXL}{Zn z53FCC?f-Z6x?J?H`_q5x+o1#mKmY_l00ck)1V8`;KmY_l00cl_+Y?|>f=B50tLXR8 zw(ku(00JNY0w4eaAOHd&00JNY0w4eaAW%o3`uson8ToJWy}BYCfB*=900@8p2!H?x zfB*=900@8p2s|JJYS;hYBi|!Gdq6scZh!y?fB*=900@8p2!H?xfB*=900`6(s6GGx zL-HTwOLav!009sH0T2KI5C8!X009sH0T2KI5O_ccRPX;kAl*SXKmY_l00ck)1V8`; zKmY_l00ck)1X>Wl^?wT}$N~Wn009sH0T2KI5C8!X009sHfd`BL+y5_+&%4Oy$@?C# zuAw_100JNY0w4eaAOHd&00JNY0wD0f5*TxLxWePU&bjO3Cojd6iIWj^=87zfvNkG4 zMx}U26cbt`A!%chC`(b9-TxQJcU|PW