From e4fa83dd745b4a3f6360ada77bd24984801738a6 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 10:29:53 -0800
Subject: [PATCH 01/50] Use BC Sans in app
---
app/client/src/App.css | 8 ++++++--
app/client/src/App.js | 2 ++
app/client/src/pages/Login.js | 3 ---
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/app/client/src/App.css b/app/client/src/App.css
index 40ef6a2..27cd020 100644
--- a/app/client/src/App.css
+++ b/app/client/src/App.css
@@ -1,11 +1,15 @@
+body,
+html {
+ font-family: var(--typography-font-families-bc-sans, "Arial", sans-serif);
+}
+
.App {
text-align: left;
- transition: background-color 0.3s, color 0.3s;
+ transition: background-color 0.3s, color 0.3s;
background-color: #ffffff;
color: #000000;
}
-
.bcds-header {
justify-content: normal !important;
}
diff --git a/app/client/src/App.js b/app/client/src/App.js
index 9e93c40..211d89a 100644
--- a/app/client/src/App.js
+++ b/app/client/src/App.js
@@ -4,6 +4,8 @@ import Login from "./pages/Login";
import FormList from "./pages/FormList";
import NotAuthorized from "./pages/NotAuthorized";
import { useSSO } from "@bcgov/citz-imb-sso-react";
+import "@bcgov/bc-sans/css/BC_Sans.css";
+import "./App.css"
const App = () => {
const { isAuthenticated, hasRoles } = useSSO();
diff --git a/app/client/src/pages/Login.js b/app/client/src/pages/Login.js
index da61935..ff31675 100644
--- a/app/client/src/pages/Login.js
+++ b/app/client/src/pages/Login.js
@@ -10,9 +10,6 @@ const Login = () => {
if (isAuthenticated) {
return ;
}
- console.log("REACT_APP_SSO_URL:", process.env.REACT_APP_SSO_URL);
- console.log("Type of URL:", typeof process.env.REACT_APP_SSO_URL);
- console.log("Value of URL:", process.env.REACT_APP_SSO_URL);
return (
From 4588bc8634d7d0773b19207f99115df4bcebd74f Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 10:39:41 -0800
Subject: [PATCH 02/50] Change to use a single .env file
---
README.md | 4 ++--
docker-compose.yaml | 4 +---
dockerfile | 5 +++--
3 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index 8374b76..3129a15 100644
--- a/README.md
+++ b/README.md
@@ -27,13 +27,13 @@ cd template-respository
## Configuration
-Copy and rename `.env.example` file to `.env` both in the root and in /app/client:
+Copy and rename `.env.example` file to `.env` both in the root:
```
Copy-Item .env.example .env
```
-Update variables in `.env` files with your credentials and congifurations.
+Update variables in `.env` file with your credentials and congifurations.
## Docker Deployment
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 3c5dd76..280b88a 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -9,8 +9,6 @@ services:
- db
volumes:
- .:/usr/src/app
- environment:
- - NODE_ENV=production
restart: always
command: >
sh -c "npx knex migrate:latest && node index.js"
@@ -24,7 +22,7 @@ services:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
ports:
- - "5434:5432"
+ - "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
diff --git a/dockerfile b/dockerfile
index 2382e74..5e6491a 100644
--- a/dockerfile
+++ b/dockerfile
@@ -2,6 +2,8 @@ FROM node:16
WORKDIR /usr/app
+COPY ./.env ./.env
+
# Express App
COPY ./app/src/package*.json ./src/
RUN npm install --prefix ./src
@@ -16,8 +18,8 @@ COPY ./app/client/package-lock.json ./package-lock.json
RUN npm install
COPY ./app/client/ .
-RUN npm run build
+RUN cp ../.env .env && npm run build
WORKDIR /usr/app/src
@@ -26,4 +28,3 @@ ENV APP_PORT=${APP_PORT}
EXPOSE ${APP_PORT}
CMD ["sh", "-c", "npx knex migrate:latest && node index.js"]
-
From 235b8d0f3efdb4108660fd95c0b44f45b27eca11 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 11:03:33 -0800
Subject: [PATCH 03/50] Created Helm charts
---
helm/Chart.yaml | 6 ++++++
helm/templates/deployment.yaml | 29 +++++++++++++++++++++++++++++
helm/templates/network-policy.yaml | 13 +++++++++++++
helm/templates/service.yaml | 13 +++++++++++++
helm/values.yaml | 21 +++++++++++++++++++++
5 files changed, 82 insertions(+)
create mode 100644 helm/Chart.yaml
create mode 100644 helm/templates/deployment.yaml
create mode 100644 helm/templates/network-policy.yaml
create mode 100644 helm/templates/service.yaml
create mode 100644 helm/values.yaml
diff --git a/helm/Chart.yaml b/helm/Chart.yaml
new file mode 100644
index 0000000..c5d25e6
--- /dev/null
+++ b/helm/Chart.yaml
@@ -0,0 +1,6 @@
+apiVersion: v2
+name: template-repository
+description: Helm chart for Template Repository application
+type: application
+version: 0.1.0
+
diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml
new file mode 100644
index 0000000..88ede42
--- /dev/null
+++ b/helm/templates/deployment.yaml
@@ -0,0 +1,29 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ include "template-repository.name" . }}
+ labels:
+ {{- include "template-repository.labels" . | nindent 4 }}
+spec:
+ replicas: {{ .Values.replicaCount }}
+ selector:
+ matchLabels:
+ app: {{ include "template-repository.name" . }}
+ template:
+ metadata:
+ labels:
+ app: {{ include "template-repository.name" . }}
+ spec:
+ containers:
+ - name: app
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ ports:
+ - containerPort: {{ .Values.app.port }}
+ resources:
+ requests:
+ memory: {{ .Values.resources.requests.memory }}
+ cpu: {{ .Values.resources.requests.cpu }}
+ limits:
+ memory: {{ .Values.resources.limits.memory }}
+ cpu: {{ .Values.resources.limits.cpu }}
diff --git a/helm/templates/network-policy.yaml b/helm/templates/network-policy.yaml
new file mode 100644
index 0000000..9c61a14
--- /dev/null
+++ b/helm/templates/network-policy.yaml
@@ -0,0 +1,13 @@
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: allow-from-openshift-ingress
+spec:
+ ingress:
+ - from:
+ - namespaceSelector:
+ matchLabels:
+ network.openshift.io/policy-group: ingress
+ podSelector: {}
+ policyTypes:
+ - Ingress
\ No newline at end of file
diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml
new file mode 100644
index 0000000..c801586
--- /dev/null
+++ b/helm/templates/service.yaml
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "template-repository.name" . }}
+ labels:
+ {{- include "template-repository.labels" . | nindent 4 }}
+spec:
+ type: ClusterIP
+ ports:
+ - port: {{ .Values.app.port }}
+ targetPort: {{ .Values.app.port }}
+ selector:
+ app: {{ include "template-repository.name" . }}
diff --git a/helm/values.yaml b/helm/values.yaml
new file mode 100644
index 0000000..f7584fa
--- /dev/null
+++ b/helm/values.yaml
@@ -0,0 +1,21 @@
+replicaCount: 2
+
+image:
+ repository: ghcr.io/bcgov/template-repository
+ tag: latest
+ pullPolicy: Always
+
+app:
+ port: 3000
+
+ingress:
+ enabled: true
+ hostname: template-repository.local
+
+resources:
+ requests:
+ memory: "256Mi"
+ cpu: "500m"
+ limits:
+ memory: "512Mi"
+ cpu: "1"
From 01ca18c284d786c39545ea9e5910f791c37989ae Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 11:38:03 -0800
Subject: [PATCH 04/50] Updated Helm charts
---
output.yaml | Bin 0 -> 3282 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 output.yaml
diff --git a/output.yaml b/output.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..658adcc7c105628a0b1489ac85dcc63841617ba6
GIT binary patch
literal 3282
zcmd6pTW`}q5QXO%iT_}Q=cE@@g!+bBB#@v)wCXEz)7+FRc9JSW{B__vyV>|sCvg##
zkmbbo&gIO^*_r+Qt7*Dk+6#MSkzL!&mX=t@x^~X{g8zxlZEUf7ZnD
xEIJ9X<*C;Jp%LVAzA6pRVB=lC3g!`uD9
z${6nvs{v7DJ%=;08&>ntMD~?0&AGdC-coSZz;{tTwt?1jl6Xg!_1#zj;Oe8XFnOHJs$Xsbjg`DYcz~aY5{=^$4yg
zUp_bMn$<2^7-F%H=E&ZXwU(>i5t%q~ag2DMQeoxos^Gbu^Q+uV+-i)hY80cPuMt-9Edqc28*EHmv|{%sp6;A(dO%0I#Tv9KG7u_}uWyq|DQ8R2sv^bs
zL%yYPPwyzl5!ny>xvfgx?#*U*l#wfkAHiCz!}D=F1#<%Tw9~sa*<8g`#h%%z&(89G
z%ld1`tvYXYm3>#)-=$^cF^luP=>qO8kr9%F+_ww$Qb(_X(*vG;K5uW^h(LXG%QvrkuyF9$Lkj%L=>yJ9GT>50g>Mh&Gd4
zRo`F9x}B?T#pSWQe~P_x_k;)>-Mzbl#8c4t9B8uSXGXBpfkEO7FBwGZgU#Np-<6
zCzN52p}fC>^bl6YZl6iE!P5Z$$#$~d@z%%p3Lcj8mGztadF~vx`}3aqfMNl{GpeW`%K=Go|ToyIo#J-$`-VDR|jTgIrmrg#V+l=
zedE63B(^Jx;A=&+>ZtzY*PwG~e%|v%^WC5Gc4yR|EV48Bp`1wmyYr?>9g-GC?THD9
sbZ+;%_srhdXOJC=tV1kIr*r1|{ba9(STN!KJ5*
Date: Fri, 20 Dec 2024 11:38:07 -0800
Subject: [PATCH 05/50] updated helm charts
---
helm/Chart.yaml | 4 ++--
helm/templates/deployment.yaml | 11 +++++++----
helm/templates/service.yaml | 6 +++---
3 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/helm/Chart.yaml b/helm/Chart.yaml
index c5d25e6..52bdbb0 100644
--- a/helm/Chart.yaml
+++ b/helm/Chart.yaml
@@ -1,6 +1,6 @@
apiVersion: v2
name: template-repository
-description: Helm chart for Template Repository application
+description: Helm chart for Template Repository application without helpers file
type: application
version: 0.1.0
-
+appVersion: "1.0.0"
diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml
index 88ede42..86536c5 100644
--- a/helm/templates/deployment.yaml
+++ b/helm/templates/deployment.yaml
@@ -1,18 +1,18 @@
apiVersion: apps/v1
kind: Deployment
metadata:
- name: {{ include "template-repository.name" . }}
+ name: {{ .Release.Name }}
labels:
- {{- include "template-repository.labels" . | nindent 4 }}
+ app: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
- app: {{ include "template-repository.name" . }}
+ app: {{ .Release.Name }}
template:
metadata:
labels:
- app: {{ include "template-repository.name" . }}
+ app: {{ .Release.Name }}
spec:
containers:
- name: app
@@ -20,6 +20,9 @@ spec:
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: {{ .Values.app.port }}
+ env:
+ - name: NODE_ENV
+ value: "production"
resources:
requests:
memory: {{ .Values.resources.requests.memory }}
diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml
index c801586..f66e8c9 100644
--- a/helm/templates/service.yaml
+++ b/helm/templates/service.yaml
@@ -1,13 +1,13 @@
apiVersion: v1
kind: Service
metadata:
- name: {{ include "template-repository.name" . }}
+ name: {{ .Release.Name }}
labels:
- {{- include "template-repository.labels" . | nindent 4 }}
+ app: {{ .Release.Name }}
spec:
type: ClusterIP
ports:
- port: {{ .Values.app.port }}
targetPort: {{ .Values.app.port }}
selector:
- app: {{ include "template-repository.name" . }}
+ app: {{ .Release.Name }}
From 67749695942dabb64a28207ffbafc0d858d0681f Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 11:54:10 -0800
Subject: [PATCH 06/50] Helm chart will use dockerfile
---
helm/values.yaml | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/helm/values.yaml b/helm/values.yaml
index f7584fa..274b6a8 100644
--- a/helm/values.yaml
+++ b/helm/values.yaml
@@ -5,6 +5,33 @@ image:
tag: latest
pullPolicy: Always
+deploy:
+ replicas: 1
+ applicationProperties:
+ enabled: false
+ mountPath: /deployments/config/
+ properties: '## Properties go here'
+ livenessProbe:
+ httpGet:
+ path: /
+ port: 3000
+ readinessProbe:
+ httpGet:
+ path: /
+ port: 3000
+ ports:
+ - name: http
+ port: 3000
+ protocol: TCP
+ targetPort: 3000
+ route:
+ enabled: true
+ targetPort: http
+ tls:
+ enabled: true
+ insecureEdgeTerminationPolicy: Redirect
+ termination: edge
+ serviceType: ClusterIP
app:
port: 3000
From 6ea308dd2752112e4387cfbc9bc84ad0af0ac79b Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 12:06:12 -0800
Subject: [PATCH 07/50] dockerfile for openshift
---
dockerfile-openshift | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
create mode 100644 dockerfile-openshift
diff --git a/dockerfile-openshift b/dockerfile-openshift
new file mode 100644
index 0000000..53ef224
--- /dev/null
+++ b/dockerfile-openshift
@@ -0,0 +1,30 @@
+FROM node:16
+
+WORKDIR /usr/app
+
+# Express App
+COPY ./app/src/package*.json ./src/
+RUN npm install --prefix ./src
+
+COPY ./app/src ./src
+
+# React App
+WORKDIR /usr/app/client
+
+COPY ./app/client/package*.json ./package.json
+COPY ./app/client/package-lock.json ./package-lock.json
+RUN npm install
+
+COPY ./app/client/ .
+
+RUN npm run build
+
+WORKDIR /usr/app/src
+
+# Environment Variables
+ARG APP_PORT
+ENV APP_PORT=${APP_PORT}
+EXPOSE ${APP_PORT}
+
+# Migrate the database and start the Node.js server
+CMD ["sh", "-c", "npx knex migrate:latest && node index.js"]
From a0c5927b95943a01869fa7fc227790916f5a176c Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 12:31:36 -0800
Subject: [PATCH 08/50] Updated node version
---
dockerfile | 2 +-
dockerfile-openshift | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dockerfile b/dockerfile
index 5e6491a..e9cc1c1 100644
--- a/dockerfile
+++ b/dockerfile
@@ -1,4 +1,4 @@
-FROM node:16
+FROM node:18
WORKDIR /usr/app
diff --git a/dockerfile-openshift b/dockerfile-openshift
index 53ef224..05595ea 100644
--- a/dockerfile-openshift
+++ b/dockerfile-openshift
@@ -1,4 +1,4 @@
-FROM node:16
+FROM node:18
WORKDIR /usr/app
From 703c3a2549ac3ec95630ad0fc7e32c9313fd50c0 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 13:46:58 -0800
Subject: [PATCH 09/50] Create deployment-dev.yml
---
.github/workflows/deployment-dev.yml | 72 ++++++++++++++++++++++++++++
1 file changed, 72 insertions(+)
create mode 100644 .github/workflows/deployment-dev.yml
diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml
new file mode 100644
index 0000000..b152efc
--- /dev/null
+++ b/.github/workflows/deployment-dev.yml
@@ -0,0 +1,72 @@
+name: Build and Deploy to DEV
+
+on:
+ push:
+ branches:
+ - dev
+
+env:
+ REGISTRY: ghcr.io
+ IMAGE_NAME: ${{ github.repository }}
+
+jobs:
+ build_and_push:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout the repository
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Log in to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Extract metadata for Docker
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+
+ outputs:
+ image_tag: ${{ steps.meta.outputs.tags }}
+
+ deploy_dev:
+ needs: build_and_push
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout the repository
+ uses: actions/checkout@v4
+
+ - name: Install oc CLI
+ uses: redhat-actions/oc-installer@v1
+
+ - name: Authenticate with OpenShift (DEV)
+ uses: redhat-actions/oc-login@v1
+ with:
+ openshift_server_url: ${{ secrets.OPENSHIFT_SERVER }}
+ namespace: ${{ secrets.OPENSHIFT_DEV_NAMESPACE }}
+ openshift_token: ${{ secrets.OPENSHIFT_DEV_TOKEN }}
+ insecure_skip_tls_verify: true
+
+ - name: Deploy with Helm
+ run: |
+ helm upgrade --install template-repository ./helm/app --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} --set image.tag=${{ needs.build_and_push.outputs.image_tag }}
+
+ - name: Trigger OpenShift Rollout
+ run: |
+ oc rollout restart deployment/template-repository -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }}
From ecff46c52dae3a9a54733251d89c4975c960deb7 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 13:53:26 -0800
Subject: [PATCH 10/50] added postgres helm charts
---
.env.example | 5 +++
helm/Chart.yaml | 6 ---
helm/app/Chart.yaml | 7 ++++
helm/app/templates/deployment.yaml | 37 +++++++++++++++++
helm/app/templates/service.yaml | 11 ++++++
helm/app/values.yaml | 10 +++++
helm/postgresql/Chart.yaml | 3 ++
helm/postgresql/templates/deployment.yaml | 24 ++++++++++++
helm/postgresql/templates/service.yaml | 11 ++++++
helm/postgresql/values.yaml | 8 ++++
helm/templates/deployment.yaml | 2 +-
helm/templates/network-policy.yaml | 13 ------
helm/templates/service.yaml | 13 ------
helm/values.yaml | 48 -----------------------
14 files changed, 117 insertions(+), 81 deletions(-)
delete mode 100644 helm/Chart.yaml
create mode 100644 helm/app/Chart.yaml
create mode 100644 helm/app/templates/deployment.yaml
create mode 100644 helm/app/templates/service.yaml
create mode 100644 helm/app/values.yaml
create mode 100644 helm/postgresql/Chart.yaml
create mode 100644 helm/postgresql/templates/deployment.yaml
create mode 100644 helm/postgresql/templates/service.yaml
create mode 100644 helm/postgresql/values.yaml
delete mode 100644 helm/templates/network-policy.yaml
delete mode 100644 helm/templates/service.yaml
delete mode 100644 helm/values.yaml
diff --git a/.env.example b/.env.example
index 520e1c4..6c2783c 100644
--- a/.env.example
+++ b/.env.example
@@ -2,6 +2,11 @@ FRONTEND_URL=http://localhost:3000
BACKEND_URL=http://localhost:3000
APP_PORT=3000
+REACT_APP_ENV=dev
+REACT_APP_SSO_URL=http://localhost:3000
+REACT_APP_KILN_PREVIEW_URL=http://localhost:4173/preview
+REACT_APP_KILN_URL=http://localhost:4173
+
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=form_templates
diff --git a/helm/Chart.yaml b/helm/Chart.yaml
deleted file mode 100644
index 52bdbb0..0000000
--- a/helm/Chart.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-apiVersion: v2
-name: template-repository
-description: Helm chart for Template Repository application without helpers file
-type: application
-version: 0.1.0
-appVersion: "1.0.0"
diff --git a/helm/app/Chart.yaml b/helm/app/Chart.yaml
new file mode 100644
index 0000000..b2c0386
--- /dev/null
+++ b/helm/app/Chart.yaml
@@ -0,0 +1,7 @@
+apiVersion: v2
+name: app
+version: 0.1.0
+dependencies:
+ - name: postgresql
+ version: 0.1.0
+ repository: file://../postgresql
diff --git a/helm/app/templates/deployment.yaml b/helm/app/templates/deployment.yaml
new file mode 100644
index 0000000..12a48e8
--- /dev/null
+++ b/helm/app/templates/deployment.yaml
@@ -0,0 +1,37 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Release.Name }}-app
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: {{ .Release.Name }}-app
+ template:
+ metadata:
+ labels:
+ app: {{ .Release.Name }}-app
+ spec:
+ containers:
+ - name: app
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ ports:
+ - containerPort: {{ .Values.env.APP_PORT }}
+ envFrom:
+ - configMapRef:
+ name: {{ .Values.configMapName }}
+ - secretRef:
+ name: {{ .Values.secretName }}
+ volumeMounts:
+ - name: env-volume
+ mountPath: /usr/app/.env
+ subPath: .env
+ command:
+ - sh
+ - -c
+ - |
+ cp /usr/app/.env ../client/.env && npm run build && npx knex migrate:latest && node index.js
+ volumes:
+ - name: env-volume
+ configMap:
+ name: {{ .Values.configMapName }}
diff --git a/helm/app/templates/service.yaml b/helm/app/templates/service.yaml
new file mode 100644
index 0000000..48a18a0
--- /dev/null
+++ b/helm/app/templates/service.yaml
@@ -0,0 +1,11 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Release.Name }}-app
+spec:
+ type: ClusterIP
+ ports:
+ - port: 3000
+ targetPort: 3000
+ selector:
+ app: {{ .Release.Name }}-app
diff --git a/helm/app/values.yaml b/helm/app/values.yaml
new file mode 100644
index 0000000..b32a471
--- /dev/null
+++ b/helm/app/values.yaml
@@ -0,0 +1,10 @@
+configMapName: template-repo-config
+secretName: template-repo-app-secrets
+
+image:
+ repository: my-app-image
+ tag: latest
+
+env:
+ APP_PORT: 3000
+ REACT_APP_ENV: dev
diff --git a/helm/postgresql/Chart.yaml b/helm/postgresql/Chart.yaml
new file mode 100644
index 0000000..a02b4f6
--- /dev/null
+++ b/helm/postgresql/Chart.yaml
@@ -0,0 +1,3 @@
+apiVersion: v2
+name: postgresql
+version: 0.1.0
diff --git a/helm/postgresql/templates/deployment.yaml b/helm/postgresql/templates/deployment.yaml
new file mode 100644
index 0000000..8e9b19f
--- /dev/null
+++ b/helm/postgresql/templates/deployment.yaml
@@ -0,0 +1,24 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Release.Name }}-postgresql
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: {{ .Release.Name }}-postgresql
+ template:
+ metadata:
+ labels:
+ app: {{ .Release.Name }}-postgresql
+ spec:
+ containers:
+ - name: postgresql
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ env:
+ - name: POSTGRES_USER
+ value: {{ .Values.postgresql.username }}
+ - name: POSTGRES_PASSWORD
+ value: {{ .Values.postgresql.password }}
+ - name: POSTGRES_DB
+ value: {{ .Values.postgresql.database }}
diff --git a/helm/postgresql/templates/service.yaml b/helm/postgresql/templates/service.yaml
new file mode 100644
index 0000000..21e5863
--- /dev/null
+++ b/helm/postgresql/templates/service.yaml
@@ -0,0 +1,11 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Release.Name }}-postgresql
+spec:
+ type: ClusterIP
+ ports:
+ - port: 5432
+ targetPort: 5432
+ selector:
+ app: {{ .Release.Name }}-postgresql
diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml
new file mode 100644
index 0000000..bd4d73b
--- /dev/null
+++ b/helm/postgresql/values.yaml
@@ -0,0 +1,8 @@
+image:
+ repository: postgres
+ tag: 13
+
+postgresql:
+ username: postgres
+ password: postgres
+ database: form_templates
diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml
index 86536c5..a8f727e 100644
--- a/helm/templates/deployment.yaml
+++ b/helm/templates/deployment.yaml
@@ -22,7 +22,7 @@ spec:
- containerPort: {{ .Values.app.port }}
env:
- name: NODE_ENV
- value: "production"
+ value: "dev"
resources:
requests:
memory: {{ .Values.resources.requests.memory }}
diff --git a/helm/templates/network-policy.yaml b/helm/templates/network-policy.yaml
deleted file mode 100644
index 9c61a14..0000000
--- a/helm/templates/network-policy.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-apiVersion: networking.k8s.io/v1
-kind: NetworkPolicy
-metadata:
- name: allow-from-openshift-ingress
-spec:
- ingress:
- - from:
- - namespaceSelector:
- matchLabels:
- network.openshift.io/policy-group: ingress
- podSelector: {}
- policyTypes:
- - Ingress
\ No newline at end of file
diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml
deleted file mode 100644
index f66e8c9..0000000
--- a/helm/templates/service.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
- name: {{ .Release.Name }}
- labels:
- app: {{ .Release.Name }}
-spec:
- type: ClusterIP
- ports:
- - port: {{ .Values.app.port }}
- targetPort: {{ .Values.app.port }}
- selector:
- app: {{ .Release.Name }}
diff --git a/helm/values.yaml b/helm/values.yaml
deleted file mode 100644
index 274b6a8..0000000
--- a/helm/values.yaml
+++ /dev/null
@@ -1,48 +0,0 @@
-replicaCount: 2
-
-image:
- repository: ghcr.io/bcgov/template-repository
- tag: latest
- pullPolicy: Always
-
-deploy:
- replicas: 1
- applicationProperties:
- enabled: false
- mountPath: /deployments/config/
- properties: '## Properties go here'
- livenessProbe:
- httpGet:
- path: /
- port: 3000
- readinessProbe:
- httpGet:
- path: /
- port: 3000
- ports:
- - name: http
- port: 3000
- protocol: TCP
- targetPort: 3000
- route:
- enabled: true
- targetPort: http
- tls:
- enabled: true
- insecureEdgeTerminationPolicy: Redirect
- termination: edge
- serviceType: ClusterIP
-app:
- port: 3000
-
-ingress:
- enabled: true
- hostname: template-repository.local
-
-resources:
- requests:
- memory: "256Mi"
- cpu: "500m"
- limits:
- memory: "512Mi"
- cpu: "1"
From cfe4f36fe29227e32864a3d46ec081c92057e443 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 13:57:37 -0800
Subject: [PATCH 11/50] added github action
---
.github/workflows/deployment-dev.yml | 72 ++++++++++++++++++++++++++++
1 file changed, 72 insertions(+)
create mode 100644 .github/workflows/deployment-dev.yml
diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml
new file mode 100644
index 0000000..b152efc
--- /dev/null
+++ b/.github/workflows/deployment-dev.yml
@@ -0,0 +1,72 @@
+name: Build and Deploy to DEV
+
+on:
+ push:
+ branches:
+ - dev
+
+env:
+ REGISTRY: ghcr.io
+ IMAGE_NAME: ${{ github.repository }}
+
+jobs:
+ build_and_push:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout the repository
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Log in to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Extract metadata for Docker
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+
+ outputs:
+ image_tag: ${{ steps.meta.outputs.tags }}
+
+ deploy_dev:
+ needs: build_and_push
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout the repository
+ uses: actions/checkout@v4
+
+ - name: Install oc CLI
+ uses: redhat-actions/oc-installer@v1
+
+ - name: Authenticate with OpenShift (DEV)
+ uses: redhat-actions/oc-login@v1
+ with:
+ openshift_server_url: ${{ secrets.OPENSHIFT_SERVER }}
+ namespace: ${{ secrets.OPENSHIFT_DEV_NAMESPACE }}
+ openshift_token: ${{ secrets.OPENSHIFT_DEV_TOKEN }}
+ insecure_skip_tls_verify: true
+
+ - name: Deploy with Helm
+ run: |
+ helm upgrade --install template-repository ./helm/app --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} --set image.tag=${{ needs.build_and_push.outputs.image_tag }}
+
+ - name: Trigger OpenShift Rollout
+ run: |
+ oc rollout restart deployment/template-repository -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }}
From 99b584a0da8cb7abab2928b74ec4151981ec1943 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 14:04:07 -0800
Subject: [PATCH 12/50] Update deployment-dev.yml
---
.github/workflows/deployment-dev.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml
index b152efc..d6e2f64 100644
--- a/.github/workflows/deployment-dev.yml
+++ b/.github/workflows/deployment-dev.yml
@@ -40,6 +40,8 @@ jobs:
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
+ build-args: |
+ APP_PORT=${{ secrets.APP_PORT }}
outputs:
image_tag: ${{ steps.meta.outputs.tags }}
From 58a3ebe04ee187012e314e4823524377fc03633f Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 14:05:47 -0800
Subject: [PATCH 13/50] updated dockerfiles for Github Actions
---
dockerfile | 8 +++-----
dockerfile-openshift => dockerfile-local | 6 +++---
2 files changed, 6 insertions(+), 8 deletions(-)
rename dockerfile-openshift => dockerfile-local (82%)
diff --git a/dockerfile b/dockerfile
index e9cc1c1..416bc66 100644
--- a/dockerfile
+++ b/dockerfile
@@ -2,15 +2,13 @@ FROM node:18
WORKDIR /usr/app
-COPY ./.env ./.env
-
-# Express App
+#Express app
COPY ./app/src/package*.json ./src/
RUN npm install --prefix ./src
COPY ./app/src ./src
-# React App
+#React app
WORKDIR /usr/app/client
COPY ./app/client/package*.json ./package.json
@@ -19,7 +17,7 @@ RUN npm install
COPY ./app/client/ .
-RUN cp ../.env .env && npm run build
+RUN npm run build
WORKDIR /usr/app/src
diff --git a/dockerfile-openshift b/dockerfile-local
similarity index 82%
rename from dockerfile-openshift
rename to dockerfile-local
index 05595ea..e9cc1c1 100644
--- a/dockerfile-openshift
+++ b/dockerfile-local
@@ -2,6 +2,8 @@ FROM node:18
WORKDIR /usr/app
+COPY ./.env ./.env
+
# Express App
COPY ./app/src/package*.json ./src/
RUN npm install --prefix ./src
@@ -17,14 +19,12 @@ RUN npm install
COPY ./app/client/ .
-RUN npm run build
+RUN cp ../.env .env && npm run build
WORKDIR /usr/app/src
-# Environment Variables
ARG APP_PORT
ENV APP_PORT=${APP_PORT}
EXPOSE ${APP_PORT}
-# Migrate the database and start the Node.js server
CMD ["sh", "-c", "npx knex migrate:latest && node index.js"]
From 8564a5a658a0f818c470e7f276b6e23183e8f7f3 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 14:15:13 -0800
Subject: [PATCH 14/50] Added postgres dependency
---
helm/app/Chart.lock | 6 ++++++
helm/app/charts/postgresql-0.1.0.tgz | Bin 0 -> 630 bytes
2 files changed, 6 insertions(+)
create mode 100644 helm/app/Chart.lock
create mode 100644 helm/app/charts/postgresql-0.1.0.tgz
diff --git a/helm/app/Chart.lock b/helm/app/Chart.lock
new file mode 100644
index 0000000..fe24a76
--- /dev/null
+++ b/helm/app/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: postgresql
+ repository: file://../postgresql
+ version: 0.1.0
+digest: sha256:7e4ef9dc694d5152e394135dfcaf1fa9fe6fc369f1a094f5586df6409e833cb5
+generated: "2024-12-20T14:13:21.3268297-08:00"
diff --git a/helm/app/charts/postgresql-0.1.0.tgz b/helm/app/charts/postgresql-0.1.0.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..8bdf521fe9c357ffb4c6e6ca7743b9a8f65775d8
GIT binary patch
literal 630
zcmV-+0*U<}iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc
zVQyr3R8em|NM&qo0PI&yZ<|06^%;r(Fv>k-0UM;fwQ*Ecsv66*=`ot%se`(Fbazc<
zMf~>)9Lz@}ktnX+58eeaW4|5nyf@=4ReCK+eHRy(_b9cs#aK)Z3&t4prqk-m80%jd
zoB0!a>bthm;*miy5abcf^6w(tnO(L+Upez>xkO=JfUNIkQp!$3PV0nz(5INXk+b=~QkT11RGf
z*BoruG)$vumg*ZDMY3xcWi&&jex!2MjjmAR9V+7RHI?zLrZ^L*%iO8o!2gYw{`bGh
z#fmbKZevOgvknaC-*)`I{=Jz!9rb?V~bE+BKFCUDjvw0_LCUUsStcDs}Cm=hYpD+0=Dv7tkozq!*odZ(cmh!%zKIM~oOT;?Kv=
Q00030{}>7az5o^g06WPo>i_@%
literal 0
HcmV?d00001
From 94e0d1c08f090501c13855b5a8925da2674150a1 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 14:27:14 -0800
Subject: [PATCH 15/50] Update app image name in helm chart
---
helm/app/values.yaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/helm/app/values.yaml b/helm/app/values.yaml
index b32a471..ae21ba1 100644
--- a/helm/app/values.yaml
+++ b/helm/app/values.yaml
@@ -2,8 +2,8 @@ configMapName: template-repo-config
secretName: template-repo-app-secrets
image:
- repository: my-app-image
- tag: latest
+ repository: ghcr.io/bcgov/template-repository
+ tag: dev
env:
APP_PORT: 3000
From 8284674db16038afb7c65c2139b7942afa950468 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 14:37:00 -0800
Subject: [PATCH 16/50] Helm chart updates
---
helm/postgresql/values.yaml | 3 +++
helm/templates/deployment.yaml | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml
index bd4d73b..2cca430 100644
--- a/helm/postgresql/values.yaml
+++ b/helm/postgresql/values.yaml
@@ -6,3 +6,6 @@ postgresql:
username: postgres
password: postgres
database: form_templates
+
+volumePermissions:
+ enabled: true
\ No newline at end of file
diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml
index a8f727e..cc019b4 100644
--- a/helm/templates/deployment.yaml
+++ b/helm/templates/deployment.yaml
@@ -1,7 +1,7 @@
apiVersion: apps/v1
kind: Deployment
metadata:
- name: {{ .Release.Name }}
+ name: {{ .Release.Name }}-app
labels:
app: {{ .Release.Name }}
spec:
From 3726a27e94fb0860f8a1217bae46de13be8887a5 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 14:48:51 -0800
Subject: [PATCH 17/50] Removed generic deployment
---
helm/postgresql/values.yaml | 5 +++--
helm/templates/deployment.yaml | 32 --------------------------------
2 files changed, 3 insertions(+), 34 deletions(-)
delete mode 100644 helm/templates/deployment.yaml
diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml
index 2cca430..360a42d 100644
--- a/helm/postgresql/values.yaml
+++ b/helm/postgresql/values.yaml
@@ -7,5 +7,6 @@ postgresql:
password: postgres
database: form_templates
-volumePermissions:
- enabled: true
\ No newline at end of file
+postgresql:
+ volumePermissions:
+ enabled: true
\ No newline at end of file
diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml
deleted file mode 100644
index cc019b4..0000000
--- a/helm/templates/deployment.yaml
+++ /dev/null
@@ -1,32 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: {{ .Release.Name }}-app
- labels:
- app: {{ .Release.Name }}
-spec:
- replicas: {{ .Values.replicaCount }}
- selector:
- matchLabels:
- app: {{ .Release.Name }}
- template:
- metadata:
- labels:
- app: {{ .Release.Name }}
- spec:
- containers:
- - name: app
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
- imagePullPolicy: {{ .Values.image.pullPolicy }}
- ports:
- - containerPort: {{ .Values.app.port }}
- env:
- - name: NODE_ENV
- value: "dev"
- resources:
- requests:
- memory: {{ .Values.resources.requests.memory }}
- cpu: {{ .Values.resources.requests.cpu }}
- limits:
- memory: {{ .Values.resources.limits.memory }}
- cpu: {{ .Values.resources.limits.cpu }}
From 9a25047c8ef5081f74492a2f87f02d90e6728566 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 14:59:58 -0800
Subject: [PATCH 18/50] Update deployment-dev.yml
---
.github/workflows/deployment-dev.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml
index d6e2f64..0bbccb7 100644
--- a/.github/workflows/deployment-dev.yml
+++ b/.github/workflows/deployment-dev.yml
@@ -71,4 +71,4 @@ jobs:
- name: Trigger OpenShift Rollout
run: |
- oc rollout restart deployment/template-repository -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }}
+ oc rollout restart deployment/template-repository-app -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }}
From 0fbedc7ce673e02e5f49c1b7bf37c67e307d54c3 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 15:15:01 -0800
Subject: [PATCH 19/50] Update deployment-dev.yml
---
.github/workflows/deployment-dev.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml
index 0bbccb7..d40dc16 100644
--- a/.github/workflows/deployment-dev.yml
+++ b/.github/workflows/deployment-dev.yml
@@ -67,7 +67,7 @@ jobs:
- name: Deploy with Helm
run: |
- helm upgrade --install template-repository ./helm/app --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} --set image.tag=${{ needs.build_and_push.outputs.image_tag }}
+ helm upgrade --install template-repository-app ./helm/app --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} --set image.tag=${{ needs.build_and_push.outputs.image_tag }}
- name: Trigger OpenShift Rollout
run: |
From 1ca5bf8e8172b0bf988f5cf435fdc9a39effa5e8 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 15:15:30 -0800
Subject: [PATCH 20/50] Updated postgres helm permissions
---
helm/postgresql/values.yaml | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml
index 360a42d..f7e99de 100644
--- a/helm/postgresql/values.yaml
+++ b/helm/postgresql/values.yaml
@@ -7,6 +7,12 @@ postgresql:
password: postgres
database: form_templates
-postgresql:
volumePermissions:
- enabled: true
\ No newline at end of file
+ enabled: true
+
+ persistence:
+ enabled: true
+ size: 512Mi
+ accessModes:
+ - ReadWriteOnce
+ mountPath: /var/lib/postgresql/data
\ No newline at end of file
From ee367d069f05652ea36258bb93c873fb2a764c69 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 15:30:14 -0800
Subject: [PATCH 21/50] Update deployment-dev.yml
---
.github/workflows/deployment-dev.yml | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml
index d40dc16..0b13784 100644
--- a/.github/workflows/deployment-dev.yml
+++ b/.github/workflows/deployment-dev.yml
@@ -67,7 +67,12 @@ jobs:
- name: Deploy with Helm
run: |
- helm upgrade --install template-repository-app ./helm/app --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} --set image.tag=${{ needs.build_and_push.outputs.image_tag }}
+ helm upgrade --install template-repository ./helm/app \
+ --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} \
+ --set app.image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \
+ --set app.image.tag=${{ needs.build_and_push.outputs.image_tag }} \
+ --set postgresql.image.repository=postgres \
+ --set postgresql.image.tag=13
- name: Trigger OpenShift Rollout
run: |
From 9a1cc2da21605c7f7ae90375c2e09c05fa03a8ea Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 15:38:33 -0800
Subject: [PATCH 22/50] updated app deployment
---
helm/app/templates/deployment.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/helm/app/templates/deployment.yaml b/helm/app/templates/deployment.yaml
index 12a48e8..cc04910 100644
--- a/helm/app/templates/deployment.yaml
+++ b/helm/app/templates/deployment.yaml
@@ -30,7 +30,7 @@ spec:
- sh
- -c
- |
- cp /usr/app/.env ../client/.env && npm run build && npx knex migrate:latest && node index.js
+ npm run build && npx knex migrate:latest && node index.js
volumes:
- name: env-volume
configMap:
From 7628c8f7fb19cad8782916efbdb8f8b5a31942b7 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 15:51:07 -0800
Subject: [PATCH 23/50] updated app deployment
---
helm/app/templates/deployment.yaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/helm/app/templates/deployment.yaml b/helm/app/templates/deployment.yaml
index cc04910..111b8c9 100644
--- a/helm/app/templates/deployment.yaml
+++ b/helm/app/templates/deployment.yaml
@@ -24,13 +24,13 @@ spec:
name: {{ .Values.secretName }}
volumeMounts:
- name: env-volume
- mountPath: /usr/app/.env
+ mountPath: /usr/app/client/.env
subPath: .env
command:
- sh
- -c
- |
- npm run build && npx knex migrate:latest && node index.js
+ npx knex migrate:latest && node index.js
volumes:
- name: env-volume
configMap:
From 9f6e92726e7a9ff02198914ee50fd290fc1c9602 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 16:06:31 -0800
Subject: [PATCH 24/50] updated db config
---
helm/app/Chart.lock | 6 ------
helm/app/Chart.yaml | 4 ++--
helm/app/charts/postgresql-0.1.0.tgz | Bin 630 -> 0 bytes
helm/postgresql/values.yaml | 4 +---
4 files changed, 3 insertions(+), 11 deletions(-)
delete mode 100644 helm/app/Chart.lock
delete mode 100644 helm/app/charts/postgresql-0.1.0.tgz
diff --git a/helm/app/Chart.lock b/helm/app/Chart.lock
deleted file mode 100644
index fe24a76..0000000
--- a/helm/app/Chart.lock
+++ /dev/null
@@ -1,6 +0,0 @@
-dependencies:
-- name: postgresql
- repository: file://../postgresql
- version: 0.1.0
-digest: sha256:7e4ef9dc694d5152e394135dfcaf1fa9fe6fc369f1a094f5586df6409e833cb5
-generated: "2024-12-20T14:13:21.3268297-08:00"
diff --git a/helm/app/Chart.yaml b/helm/app/Chart.yaml
index b2c0386..03c24d8 100644
--- a/helm/app/Chart.yaml
+++ b/helm/app/Chart.yaml
@@ -3,5 +3,5 @@ name: app
version: 0.1.0
dependencies:
- name: postgresql
- version: 0.1.0
- repository: file://../postgresql
+ version: 12.1.12
+ repository: https://charts.bitnami.com/bitnami
\ No newline at end of file
diff --git a/helm/app/charts/postgresql-0.1.0.tgz b/helm/app/charts/postgresql-0.1.0.tgz
deleted file mode 100644
index 8bdf521fe9c357ffb4c6e6ca7743b9a8f65775d8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 630
zcmV-+0*U<}iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc
zVQyr3R8em|NM&qo0PI&yZ<|06^%;r(Fv>k-0UM;fwQ*Ecsv66*=`ot%se`(Fbazc<
zMf~>)9Lz@}ktnX+58eeaW4|5nyf@=4ReCK+eHRy(_b9cs#aK)Z3&t4prqk-m80%jd
zoB0!a>bthm;*miy5abcf^6w(tnO(L+Upez>xkO=JfUNIkQp!$3PV0nz(5INXk+b=~QkT11RGf
z*BoruG)$vumg*ZDMY3xcWi&&jex!2MjjmAR9V+7RHI?zLrZ^L*%iO8o!2gYw{`bGh
z#fmbKZevOgvknaC-*)`I{=Jz!9rb?V~bE+BKFCUDjvw0_LCUUsStcDs}Cm=hYpD+0=Dv7tkozq!*odZ(cmh!%zKIM~oOT;?Kv=
Q00030{}>7az5o^g06WPo>i_@%
diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml
index f7e99de..300606f 100644
--- a/helm/postgresql/values.yaml
+++ b/helm/postgresql/values.yaml
@@ -13,6 +13,4 @@ postgresql:
persistence:
enabled: true
size: 512Mi
- accessModes:
- - ReadWriteOnce
- mountPath: /var/lib/postgresql/data
\ No newline at end of file
+ storageClass: "standard"
\ No newline at end of file
From 643688e05777a2955985c4832b1693c599263b64 Mon Sep 17 00:00:00 2001
From: David Okulski <32730627+DavidOkulski@users.noreply.github.com>
Date: Fri, 20 Dec 2024 16:13:30 -0800
Subject: [PATCH 25/50] updated helm dependencies
---
helm/app/Chart.lock | 6 ++++++
helm/app/charts/postgresql-12.1.12.tgz | Bin 0 -> 58108 bytes
2 files changed, 6 insertions(+)
create mode 100644 helm/app/Chart.lock
create mode 100644 helm/app/charts/postgresql-12.1.12.tgz
diff --git a/helm/app/Chart.lock b/helm/app/Chart.lock
new file mode 100644
index 0000000..f90d5ab
--- /dev/null
+++ b/helm/app/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: postgresql
+ repository: https://charts.bitnami.com/bitnami
+ version: 12.1.12
+digest: sha256:76ed64f7f84ec9a8f0c07a2bb08ef21785a78c829c9b2e3a3f24937c16d3f905
+generated: "2024-12-20T16:13:05.307033-08:00"
diff --git a/helm/app/charts/postgresql-12.1.12.tgz b/helm/app/charts/postgresql-12.1.12.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..1a25b58d514ea82fb316c61075b3aded125ecd47
GIT binary patch
literal 58108
zcmV)AK*YZviwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc
zVQyr3R8em|NM&qo0POw!b{jXcD2nHAJq3Pr=2)7erYKpGGh93ScNI!;v?9qoqMV#L
zGqYr{8zeDmHaY-WGRN^7+()|abYI~ve02l;%@4_TqMp5DsvD>(6bgj`P*sQt<5P;*
zZ{glx1}X0@;5__hvrn(r>m45+%71&kUjE>s{5J`(?Xeeg|h|JC8a!8f3{
zVLD2mgmFl}>8*_`-?*>jfl)*_=z~+p;TSTs1we>>6fwm5;3S6r
z40#9L-WH7UFNiWsqCU7k*n)AK{<(kD-S76c0u-YtK#`9T>u-4=f^*adKAF!+v;_b~
zF=3cXWHZiV*5BLng$T0l81o3uan~pFJ^gzN01l^;Mi1zBUJC2ppg!n+=ziD=5c4UH
zxqLNL5LWnL|3*IdC<-MzUns8i6~sV7uVo1V?OF
zP><0A+XbBB=@d~W!7@%L3P4PWkAj3E*4>&B!9T;QDdw|eY_mvnZ;w-i_T~^r>4$8P
zZ((2X!~n4w4H-k6?J*AhJ7!hc!}F>2rzZ<|2M4_m2d@shaWvh!LyHGO1KG(Is_c&~
zFXiQy2h=x;;t>0i)mt9$!-R1}w*=W7;s{YoWPV6RAfaIk4s5Av7AdNWCCIwk#Ne*y
zVFu*k;h~#-=n^{J+e&3||De0y-9Om++(W$fDd_)@_;(w|(V+i(uU-}PfA8>F|3AgE
zX(erG;)CwNR)D97@jhTPcyM&wKm3~yUmy9CgI8mCgvPIf$>A9JXmWIL^j&ZAx9|M#
z#=&>{e>+6u?|QF}zZ?H8cs>5^_0i-Qp$YsB9c@ifgec@F=!4Ed@8H1OKk)VsZ}$Jz
zfAzY5c--AT_}h1{kN01H_kTKH_PF~}9&7yH!!SYY5e&fE@xTB2@ZhkQAOFY4N6+K`
zDV`TE!2iXNFQ#GeCM07Rf*4XbM;uYM_2LB>h6pmW3nIc1;4{bppJ4_ba2Nt|k0`}~
zc#o`Vy8uUim;^YQ0$acA0-r<^JWYgU!wE>3syS77rTlHZc(JAa7N(w{PQuk?x_Az!
z=o(Ei<8)yNJ|+GgqCkEFRDYDUw*YWz^g*Xn33ix-;RyK@ah8K@U;-vTOC`wwlqMvk
z6e?r@b*EkRD-Tb%McA(Mg(2o=v{0X~;2b&R+BLyH{#8b?un*xB4MNCLYDe}vVXF>>
zGG-h_9Q;DUWRAAkjzMGt&}_+cfuOepsb%WGgwN8yhmbL00fO|0z%IJBV~TVD4CXiz
zeNMr)5gZ2ImjZgf(~bZEO>_njER;wg@Ds+#Tp{8F_!L2oiYQIhwy5IDHnv0b76rhM>7_uTIF68$+-F5^i
zgg>JN>q^lveE%6OQtIx|0^n#9MAl$?ztaV8qi`W$2H;_aBJjQy6W@zfCPRGr1`Anw
zvi9bXeTL>*Yr!XLbve$BHD3NB$|+TvDOZC`>s;{|Rb;)2i>1tfwqCg;SRb->8uS3<
z#o8*aNT~W&&Z)FWT}LxS@3D`%a{I&jV0V}<14J38$Eqr)8f{B8RhG)wOu5x)Yf2OJ
zZrSF}KrV7zb4Qg>&ACg)NbhNZx5m=>IT<4wA&!_?>WEraQHdu5BKkG0JmOTyFDC-2
z5Ycdv*-&cD)s?nIcansmoY**;$Dvg4(&94vBXZ)QNZMu+$BrPwMwX+)04$+Jd}>XH
zK$C}+L#6j}PKhAaX4pV|0P2f?~Ly19QL;;{k
z?=Z7jiwJK
zFl4BXAOmcm|K%hTUO`N@jaSxqjZOnmn!*DtL@2I93h9)A6Y-yw(242>7mg-4!hGRs
zBYO&~QcQXy)Gn(QJ((&36iu?NnpraL267D}w`pj}Zss0`Q?_TxsD#)}mplbr=>n@*
z#q1T8RWjcS)i|6M%Zr!Wcs@_K6goj8fKWfV5a~{Z8jBw>G!&K9^k@kM?u)_
zcDs6sYgV|JWt`sycp_%?-IDb#htmQDaT10@5@NrE1>zfs<;T)`X6ZSKk&h<}yOx^H
zS+T)roJ_L{6QEwGjU2#cBnbmC-1MNAmHKj5&n$nqvymIpBAaK{VK7{kch
z-}mUN-WC96qtC3b4N)*#(JIEM&!=btlThjHmnY!^T(Fm-0a@>323`s+&G^e*fI=o)
zA&Z|+t_UAe#8AXvDsYa_-=#B77n8k!_-s#@H{LYC0os!o*xrknB2O?EM^jI|Gh;RD
z#6GZbDO7J`bvhI-05fgWy8vQV%CFz`hJfkZdBV8pkvWVK2}3R40wbJq){UW$y6qaq
zA-iLH>9&d&lfX+A(w=CEYMd8Sd=EMDOxN!z_-7yBJPyqS5U;Xh5tnUNj8tE7njq1w
z3zC2bDUBh%lgn0ykeFq8FM
zJHaNPFU71#>WaHlU2r~)>Fh^0i-%-qxF0
z25fHKm~Z}a8&=CTySBBptz2qbD^U+BXN%TA;pjct|FCA&`D|M5&}+U%tFeOI6{i
zmZ?0lrTA)9u9v71Qp$O=scpS()lThhetUCQTK(^d3(raQ(_a2vOwCr^x;
zrZEFPWO|C;s@R6f^}}QCW)`=s8aAk^Y1{P1;|584q)oyVDBLP;uoXAg3Nyo2={}qD
zwQ8rWOf8hoAEwriI7AFwk|g5JhN#^Cn8=SfVjRIhur6VOVK4$Hy2q46a};rK4=EO-
z#+qy#=$2V#h@k!qbL8`cBAeOH`|bCP!zh3uiO_pMsH5}V%PkqZd>>@R1*&UHyBe!k
z`4GK$;VN1Si0nNZufSrVbLzgWge@00}5;h?7Ip)%^wcg6LI_7dKqzg{MkUXG3
zFTncXJ&A;VR94O{jN@=&{rx~ON8)d}-Su9nO){ChuOuf*=A#U^<^=;+$$X5c=t*i`
z$%9&{*k+1d^KRgc{(d$1>H6)}+jk>x@b>cZ{3ab~`7Y>#4w+1Z
ziY;eHAM`32D7rxZmU_eNNLugZ608f}F*Hd+WuFB1F!JR-Tvkf264Iqg4ssvN7q`|s
zXAe+Y>cg5%@wAZK&{q3?cD25HTnmm4Umd6wQh<3z+=~~RSTjHY6i4=UhkVry$@C|}
zxHPyf$Q1Y?7OG>W-?6d^0}@4Q%S&y3>N+8rdRRJS(rhPGOzk0=N{v+p>l8D;8XQSD
zTLxe}mE02z5s=)PqL$K=($_&16)RX2F}Hv7zy^>*QCl)d|5lK6nL=IFhD#h>BF5lU
zXma&KQW2ti6v`#^3{sSBcT1bKgh>}TLPLrs_yf2xhY3QgB`h2v5UY>df!dQ1>QiU~
zhWJhyyc;}6{~-|q=?`Q23W#EaGY;o5Q;Wy|b0Mpiq+~n1t~5CB-JZ=pWo$J*3wb_g
z>Y>2KK0uTbsxV}1(U7dBnF9@JKNhAL%@Aoy<~GM=1?}!Dik_Ygug?Z2H)p4+ctS&P
zt`)PG1@6_(4+N7$OjNrdR$Gz6WO=D;;Fo5u&Ld}t-XjXmhX4iv6)R{$rTQ`pA4QHV
z)y-Fy$8AEF2sJ9Fk0@V9uESI>08R=3l-O8jT2%V_m~keTmy#N3R!s<%
zipL2@wLI5YCO8x(!76xulvQiSt3wRPesKckkoz+Lr(#XZbHeWQPB~PCTCbH=C#pAk
z0VKyuK-9`eeE*-4>Co9xEr9lCXpYQgu3S8`_XeWqtWg;sxmsv2HHI+*0g5T|AxFXg
z`~Upk1=jJ988uqTIjam9p>$`N6TP$tHy0y-BA+f|-Ht6$uU~eqsB~NE@qJ+>zU
zrHAw%YQ&g7r0`pR#1E#9+r7?P)jj5wWUKyzhk6NFa{y{)0;QbaU0xuwmeC?
zF!N>f2F|$(WYte0ho{(Cq|3;f08=m_VIXartwQ-eC_B;=HA}IKgvk^PDGCV;F7TK_
ziV*|qwU7Yu9)#(KZFx-WF(d$SBt9`|6>T-a?1N4`mFACZ?}$U{oJ__f*k(J@dLs!3
zA)aI70w7iwvpJZfIiU+VZ~w3W#yC?4c5Hk&I4
zRd*?#zRufOXdd&05SM%TSxzXXQTe?d#p!~ZLE+3GL&orb&;>TDeYxM4X&MN`XU$1%
zGYPDG9#7P2P%o0EMc?
z45|)PONE!&5pWSriNpwk?3U#A*kQ?TWrO-h93p8V46-_MbsJeH
zw06NtNI#=RDX=@VCMdm1=GQy=_pj%3=LI95bjePB=H;~^iVZ6dlBNJ1ppWASB`_sl==uXp;c>2>A
z4w{;yx13y4I;VzLZiAG_cn1iVfMo$qk{FjZ{PDrWgu%SqP=Wp0q9zGGsc`T_ZJQ*nmM
zB|G&*XfbrnmTd)I+vTqv-lBJy(XTLx+$k
z(3xn;ISu%fFlNd)=ecqNMXf<{rDk|K1MnW=P^W#-u>VdH1v)}%icY<7OYEQ22^L1&
z+Dwpp3ljvTYlM_!Wvi7@Xq=czCrr(bbXjk$i8ZQf-pajNhnsSKb@(YymI$xKt^fW>
zn2R?v1mus*DM7jHYMgr4(!tRNxID1Bkupe^2QI^&CA^9)R{*R=q@%;aU1#i3coyCN
z0x8omO0qxI)W)IqIE3416OQPj+nt^E526wFzWZ4qo-oiC0j|Tz@s#l
z&N9mNma8eUohUyNdHkYI{k6%XVh(ol@kmwOB5ku8gz|f9Y|3sks4@ktW9nkH5naKy
z%q)EgLVS-R#MmyN2nJaE)ak1rjq!!{Aiki9oJy%eRV(Rm8p-U|zeML>?F2F_3v
z$!~}{A3?>!KV?J<_+m!HFg!&eT#S%UqJYVz0fr$6#7n^RTj`u(*KGkkMii64z#YoJ
z)&j`!9Fc?@h&SrbwLnfF4ik!QW)!g*2?Ow>dI5O)W)-k3k)=s&e>jN3|1c1Z$KG;`pUFP+{k$jtPe;*txGcebHKG-j9b}H_r0_%QVO=5Ex
zmJ?aGavS)KLc2W37Gk?R(3XO`Jm8k1TLM^y0N8Jr65gXHmtC!(OC{I-wwl~J(3g{1
zyJ|D+Mu}YxTnlMk4q!`3T@GkVDJ=k1)^_@?(&S!WzwTGa=>E}CLaJ<~3uopZ=nX38
zr98&VGF7NxePxl6C_5!9g3~)QRj99B9jxSg@N3}zcxCEgHE
zkiYOl^b;X>tZehIpaA5eNu4dD+N78
zMpEWRWYcm!92Dpf?>0ii`EXE&U#AnggfSo!JGoGhy1QG6WNNX6S+1edy(2r{ko7y?
zCQF>sjiOwhp$a8*(cBg(q;-u*!PFtL$=BHO*^`z-nNOrtg?FNI_Q+Hqyn<^0>QW$<
z#oW;Ev^R92G^Vr|Hps|?tK*~@q`~`kdNmu<{tN|)Ol*Sg)!F49lsOvYSdK`5_FmwK
zBP#zk^ms4|JQ#7DzOmWlw7=S6Mlh7)mfW&&{Q+54U_>7XDl4r{fh8|OkI@eC-vYtn
zWscg4lfh!iE?>l`te4AL1VrHtc5`~LDB#u{XqJ$DhZdDoOC2ViAJf>3RwNtjXDS!4
z{Cy|0CA$5F4v+``<3(_eoFn|Z(#(oAjnK)S>f50UnWnU4e_2~}Ph@Th9#Bo$FTOgk
z8)mw&>U_gUiD_Ql>;#ld&(ow#tp|v+Vk{1ghJmd;yDR5~-Fij1t52D$`m&ITLZ0Jb
z{!(^FIwk8mmD7~~JVGJzIicVx6@uFNerb+c3tXvBm_#U;YHJijMkTGBglUxRjrIEp
zI$v1nTy}IuL`u9xSEa~u5|fZj7o(UW7z{|nI2ABOOVk&jJ^}liXqlY-(pCVbN<;H7nwp(0FOYdMSr?p@XS7sgUbp3ku#iIn1GXplD*oe{HhGFBu?jPk@4YC#
z^Cm>jh%Dn<1y3ru7*kB-GAV?N$)nw&egjk@b1Q=fg8r=0^ezCbv{v+NiKs;Tjv<-J
zE#!zskRyb9mW|MhAu;@xpcd51VohKp3afrMWQ?{CNXsc`iM|6%O
zDW`8J^wH4SpHBCw%k8fSp+H5&YbXdz1rV7JcFCbt6s5fv7I7Y#xMEUAcV%mnIDj0D
zIE5Td7X_=s*irVXiRr@9I%orw5}6Y4oqXE_T^9xlMs7ROa?f9tmp+NOz##;~!n^lE
zA@p?XaOTC}wx(|xM%Q-3)Xszbrcy&omjD$Qb*W;PN-`iSzkv`dhaVUOSYM%aZ&z%y
z;b(_xMUsbOyYZ!MN!8X8LNb!juVFMra$2K^F{CrKL5h@zx>@v_
z{>RLb3xjSg)}-qXKO{-uX|H$cO)y0dFbwxzP{cUJKKC>jvC0!oF%0xdM$d~EpsKa$
zQ1`%oudDvAw|8(@C1XxqHB&Z7o0!~$0zZ?}V@{bHfADr%AcNKdHA9SH5~X`qBlWkt
ziDgZNy56n~DH$Ws5gM-}bY^EDW$=8Mj;-^F^-^A)#*m-LcojW_QtyQ9-UX`SXU+MM
zTuzf
zWbIt~nz?;D#wzbx^s3jZX^@6#%@#l9raTZ+5+llUj4?B#nSHC-VM@9aT*eLU;0<$A
zUOM$QNPS9C#aUmOX=!eitFjZV0#&x6RV06AUxHC)g0aym-}d1z183wG&ej|7nn>Od
z;(2Lc>F}3<-hOg5gjKI*Hnefg#R7H+`Aqu3#8Bt#)9Fjh_?4wl0ALnjCpVlc-TL#F
zOgJ)@;w(*)(}HN0j8l?XGFIA!s4z&2dQKE7z=;8>vuEN61nAz5eo>xO!af}SBIVTV
zf#pp^?YK8q^ta-%b0wnaI(;7^ur5TbkS)~`OY;V3f+G~{I@ctst+@ZPU;VdLN8eA;
z@j7MII-OncFvI@L+>XOQun>LXtGF|vR@7?Kz)K=c1=zM+?RLa$p;1Li8190I6wt}_
zBET%uZ1VU)E@Vu?Jmb2TVn?(K!1gpg0AdFFb+oH^4lW8KgHqpY4jz;D3O(F^WbU
z`giV)T*aFuo4QWf8J8qLs^?CWgQ<9t?>DEbl--_HHtN&^*9Zo`Qq0lY$Zw+zWTqZl
zXs*@d+KgV*?1S5O~7S)@o4#nou-RwOn8ebRH09r%=hb=*Z78Dmb8(j%oTS)Hva
z^H+@up~Xxc`^g;aRhMw3v$Z}d$|Ox<(LN#e91Y{R59SMD-MVwLbJ*0>Ffs6zrD>d9
zMfXc}pcVo)?5wbaUX_|fp5urmnu$xaQ>tx~e4_Duj%q!uiz%_~M9leY)mDn;lA8};
zkR^q7lD#M=bD8dih43DgWqA?RtFhS$p{*R$b?mU*IkUQXcWehq`y?7gWY76D@~qrU
zh-${^rw&rBY|n-wRm)n|9IIMM)usYgTaZ-|vg(lblyR#L;x8b0HDlq|9=_^ucI6n>
zGJdp0v#C(l8Wd~9v(`XeE2y;w?%I*9HL(Bi;jKBFV&xdubjA!)sX-2;jyj_`SdZe
zCHS8@P_~4Gr;C=&83#=vvnBfCQG;gfb@$VS&F1En6=P?YwHek8pqy#4On;nM
zT8CF_2Glme`a?(6<~9j78d}>9_GgN(b%?77vdsq4mmg+ZXwPP1ZOgdPHrlp8(&q@d
zb!X5e<8EtPUlDoh?tZoNOmhV--R!D~Pt7Z>)={{%O{$K=&Es1k7`F*?T{vz5ePxuX
z!^%HzRBo}q>OymKOnVN_E!leig2Qv&gTUq(-TH<-b(C%s^|?^p9PwXPux?XZiV?e|
z&G~X;cHP;nDR4JuKs|@&oP^;k~X6_tgaWI*o3K^39sqF3z_Oc4e?{Ig&qexNp&i
z<2p6YnYxR97S0gcHlI^88~Igj44y1
z4BWw5rx4s>t6P{~8&>Ot5<~^P;G$67m&Z`l47#2PEw{!jtHNwC-@)w3A?v&X>B&(w
zPs~#=D01J^rlIuAN<20-McblAvTU{^2#kh
zkyu}lgindws8A<1;swJ2QgKM?{9_lO4?c?3y8QHN1h(b*?9r>8IuqX}ZwWaU6sD`G
zg53&EQ6ybxOiR^qg=(uF&6t6RaNv`947t?HGUJb2Dr=^gq)=+eR5CBOBq(kcqr7#MYvfFq*Pq^ehhf^kxaVhf2d@eJ4?X*G~;3;CfHC|m@A7?(m1zLc#!1VYCD!k|%x50pkj)=tg1a2vB1bl7|xRw1rj4-W8(P-C4C=2)h-q
z-g9k~w|s^u7`kSOaiWC2FONlY2S(~>xx2N&1a`(tLu1?%=7)ZFqF%YShx@Io)K2Qu
zCH@kPBNNkNjqGNoz7Odk600;m9C
z2Bs)NRI1M;J=_#iH;L5dM0b*ep)Bl#^Q5U&a}f|Zx@EE!@yn(4hTNe@gTu
zg_xRz1*4&0iCD&|%)Mji_iIH~;*rZHvkbic;bfo|QUX*OW}IbMrDheSr$-oLxh%;0
z=NlnY3fofWR+%(vNB(_}=r~_uY6vhdLd;SYD^kRSo6iHIY?(HSCv_H6cAgAfOEZ?}
zcUH&5EH?e}>kLVqD5eVaMmfXl%6jr9jVWaL*xm1U5B7oF
zS(65E62W_jL%m*-pO4bdqO)Tb7yH^#;g|aS(pKWu30&65{Gq7K5Cx!hyeM50DbJ>r
znkAQkmRo2!>F`syXBuwZDk~2#U0byTS-P-tfr=$kD`-ovrCdCENtE|+dZMM0ON+HY
zYSr|r)lm_uSp}r2S2n%!F%DmzC6;>i)9dcEJY;f~(2i)W;Ta?@~{2!~@4mi6Qoq--WyE+vVh_AQfg_t>h
zyncIG0R%`NeJYncl6GN9;RtNMG=^gDSo=e9pvHlh8nVp0VRp`}IN!t14Yt714yljWPx!{M9Tv;RGOdwp|ueS3O7I{D$^
z?Dq8R$CGy#H@BB(H`nKbQOaSHN?(}P4Y~B|8}8&sf0A5uFBsx7nkN56Mvg$wT|XBz
zTFZQOYqz>B-fTBum}p196^X71;hUjB18cW`(Iy2SaNybt!j|d$o7(X;
zCiXWSyK+wddZx6%wW-AZ<0b_Tt#tn7AlJ_1Uk>*3B=LW`Jm;p>boKQ8D+n)r
zq#XVg@YhM-UjcHx%>5NW*H7AC0r-!fuirF$#Z>(($naz2>o0}9daC|XaO-60F9o=6
zg8ovVpCvc{{uAcrch~h#nwH;1{nQ!xUF=VnjK5%gtE?R+E~P;km}1$9tWLV&+SOLp
z4YSGzf7}1=b*uH;Qyy|>6UB-N_-i$01FE!rZbJMF?MnDoIQbr}kRT^jS55+(dNE2j
ze_Lg=$xBWh_I2~LY$hFmi4^r@f-3S5c{ui<%5`Bkvo76BzGeBm3Imm6P4B_w(;rO9
zu9NW~CV^l8B}o)`l#Fp2lKP8IjcW2L7(TV-h&9FxPxkCKw#j#pZ>xPUn!1)2(%WS6
zq;CcB0?d4&8)dtV2%;#EK8Q9^_IavtJ5IrgrZJzw*xrUJ7Kvp#u+GPipsRS;tse@X
zKIv^li}1HGqL62Yw>nC$b^z)!4dYOkN^L%U@SDSPZB(o@9z>gQG)+0Dvj-H(wOLsn
zX;)8F7N3{}Iphw&3lwhaX)eu>c8%1zRSLohqfSvY4=qEL%ms80LvU_>K(2$%4M(!v
z{z^cC@&guYgViS#5w@3!jz=^T_r@U^@6DmiMsrI1WR4=Pa{|Y>I}cuzNv!g;DrDQ~L6rl3-D391IhsgGA)A6E~YlXQiK)U@ZpAZ@Q!AM@RvJ5dw
zX`ld%7nZc!hzM{8Kk`Qg5F{$ys+NobqQz@*j>>q
ziX_Q0$;`F-t+qLp3XbDYCN5|4V1St`nT%d>Ls?QtC5eS9(5u(i77>^Bn--+tXo^^#
z4+XI8DVmXpP@NjU97x;m(v$S`xF#EFWy8R#yOcuxHyO)X1s5?D1*QF`IHXg=v-E1p
z;R&i$#J|Z{`-DaIL}ycHuw+hOCb&N>e=TECh#Xfc{e~(i=xWMYunQR3Rk@Va(bBF;
zmm;f)u^gZn$uuaSYm`5spgRx)qyB`qT3x+ROC@6|OQNMNN!B*~;hpUU}
zjdz>$n@lJbX1JC5(%6EjmM_E&!4L^U@~32quCwd%FW}UU20|ZV+6VFU*1A#uHiXlU
z8vggf4vi^}_ylzR!i=v%2W;cW50e0aPN`F82XuFYW%>#1fmg@99{6vtZ{wYa>0y6v
zzY5D@l^D85RGRlb#T@%Ew7(b3?X;eAkZ!e2O6|vwppkm;>67E}#6SqAQ(?D`7XpCb
z%eP8}eEQT8rDr6ecCe>zKr)|0y6C&Hm>E6G1Jb>n`Nn-E&&MqQI^U{3@AN@OSONXLJ<5i)YN-5BY)b}bSHdPMz7Ugm)?_v&rrmT(sPy$^+cDjO}`%WRPdi%IG0Pg#i+^-vR4#g?3G<>bq>$QXI6@aNRB{~(|+
z3dkJn_dK!SgucA)C5&ehV;k$D$~0j3
zKPw7(At~lafNI4yilRW;ARQLsAm5Yf-6a-$-7otBKXjz;XUVsB5#|E!8{BE&UwSON
zlx=oxqVulP>QyFV=6hN=Lto8`OKVqjSB~g9Sn`{?ioNi@UI6O)wYhIyW?rhB?R9e6
zVnIg`dR3pLG#vB}zpE%|^+Uo6DS+6P(cuPO>~#L+ab(NYRz&h8Y%mp;W5k`}Bp
z(X7&QRXoY}s7w}-U4m6>7!=Ydxw(f-V)!g=lCU7I^C^>>W*4*d`@{^()JZz|q#hXB
z-KT}fyDi!h|Np7o)~U7sXAYFu-qqWivr(6S;G5ZFYS{mKwSRb2-2Xdz-v4`wXYkX>
z^$oZ>xjgHGk014^U{|hdK7HC!Uw=8f9-Y6vvJ3no#vX}8nUmqLti(wiTZOj%`d1S$
zJ(kx}NWZIx84h)NJy8c>2F6HO^#O`QvOod&>tDCFK7RCsnQz>M0t}}SVI2FHB*=~o
zKYiM|NdbvP_86fk1B4@xRRnXH&G#e>bs!L!!F!}@sEZN;={0GxdWhdCOmdIt1I3)9
zNT$>4Z*5r@|4C|d$1gk%_2#;^FTi$yeQu_Ns-_vt9UTwX0pIR`-$8_5oRAYK)%mcljNLa`AuUIfCWjw160#MfX2zxAtylhDo$Kb!jC;@MO
z1UEmOf#KWJ{|251_DIZAml8E?G3)Y^Jrr@ekh4;k&A{FmM|)$)W?Nh55g;^B`zppr
z(_mv>l+HB$|QeoKdpZJ@bEwq#WenU+bqHmT_?x(=l%lG;%I{#Nba$#B&E
z_oW1-Tda}@(^jE(wj;v9Hk!wLVFTLP0oxIBK&S9JI~j`-KI<0GF(hd>L}~>&V(q=7
z3=W`4r2AXhL16fHbo1u=Y;=2adU<|zJ3JYUetmm=`u(@twxUtVEZPm~N?|qG6||^&
z1pJ$kNEqkecRtEnI?`)8JwyMe4)`66Aw$Q9zzcS2+W7IK!@EzP>KgmGn_1O5M>Etl
z)r47CUHjFv{^Lg=v)|H%wXvRo@v?W@E032Q@aa=Icl9v7A!dY&sY2?*^c03Bc`fSB
z3WjN-TuZkQeWxYxJUR!S$N2(ySp0?LZ1nxhD|Coac
zS)UigpacG?S2~_&j3dtjG5ak9o;M?`asn!!9Dw%@v=LF@1wiY?GT`Y+jRIOhf?LWO
zKdIkS*6YBF+fSvctN&YHM|?h!29TBWJ+mj2XS%RIc4bC??VUA)T-Gt>MQ25$rX#HE
z)Tn{?1S<;~Q7U!2yf|3RU-H02=Au471y(G8>8BRi6+V6X1OkFohHH8AQ>T8gNVB3O
zr?+KRm5e0TPv?J46a$?reKm5YK)7?)wdotJ)~?>3p52}gbIMHJpU`eNxjG7SG-v`zXgHh3GjsH%W
z0A}vy94-JCV;O=8dH{1ACESXAb8d(}
zAL@hbG>=_3-9!3SUZN%)t)(=nr7d{r%)9q(mrD=J_5Dj{oQ%${e>oqN43*aSmz)JW
zv-Kq{7V-a7ZaHp?RqqF2#+QA|u({U)^mb&Y>%Q0BELH)X6$CnKxsmDi3#zY873&|Hbz0l6HzE6t;Y%
z={av^Sr9D>vbBWqAH&m#hz}$J5qeOeL1CypjU(WTSzg{<8&h91
zINSh^`tzSxuX@MFx$~dn-oe51`Oi~4A3yH>72M-_U*-Ux;1G#P_xrhEi$6ns@Yg-1
zx%d9Ml}2TmiAco@(y0}ehh5Y%BRj;kY#5hG0oyzdTf_Kv$7PU(-Yw|0!B!2slACYxr?Kj|vwk|Wk3`!u
zPM*BrXsXBU8tltKYGPupczaeh;Hd=E!Z2*#GuAR9Jw^t1XwhVG6asdBMhmCA2wjrT
zb-b~c7>$yko+{)-mEJcSz+zXIqb1+P$lWsz&7q*iE3JXzXHj7(wJUSLG=&mb>^8kd~X
z)tBY{wzC7a(QnPg9B;R}ek%i195&q++F>cV&oSC2aRZ{Chi=JRTj|e(@Rp%)6?(Mz
zwi*+wI(#)tmvRGJO1#=w6vlFVq^gV>NX`hAE#2fWb){ZX
z-@2{V#(Aa$c~yB8arhNRH{JJMJo#{
z`oLvM+6_pp0X0}!de8DTSCir*n3mFPD1S_`F6jdqG^`h7o9GBfx7GByK
zUCyl~Ms`6~3M0HIWp)kIKeZ#cfMo5Fya8T1QnwC69dT>J)zUe*oULoJ30OyhcEVnk
zy9Hk*>D>Y?EJA(rcco4%zrH>jZt2nFGAGAn_tcl`v&`#H|LC*=vWlQ(5+-BmQJ|#A
zj{9pZLlT11^@Gc*CI70^YzwPr`6Y%?=eeX_CIoXCwJksdsP5^?o0}wyLU(g9QYrIQq_xmv7pEsfJCd=EuVDb=E)Ubo(Tg_R9gc!?mZpG7
z`DAMDI7|1!*9L8#$0F5X5k>xu9jd;fP-d4|%D8pouiB{1vx}4lsz%1L6F2DH_IsVjd)-vsqX7I1{QkSHQc~P4+T>J6<}nTt
zfME!X_cXwfOmW9>Gz}4$BgWtqDHn2I6r4aD*3T??Z|`(4YhX+aW$DvU`US@FMu6;H
z={Rtl&oTn$l}BP8M0%TBTFqTs&?jzH(1QO7FknFs_t$;x^;
zN3DNGznomWI~##tPA<+*Pj1fNUiJSOiTO6I^1JMx7E1dU-7=km*vbnkccQ@g1jwl&
zp&?KyLS?w5%y|F;88Z+e^$rj|llOkf00VusZ2;pXgrvIvDwao*Hlr#E+ucs7goZmc
zQ>w625#3SKYDQo`ZT>E>%E`I$?<4`f%zrQalE;M4zde@hT}fD3&ofzG)k%nw!NQeAj5Ap)ei6XW6G!QQ1LbgJ()Q#Tjv
z!GzB|NzaVW!}aB2I2zgp()AA~1Is!$uQ?&h2!I?~Rcm1uo0W~T@TFtu>kozA%j)a`
ztDNLw1;x0~v@~K^E@nqEK=FalyPD3ZyI(FQA@&!0F$uEU4|H08zy~BvL
z_ezSPSWxQ=D-cz_^7UFeojFU)elZWjgp)TYLR7BiOHA^r8B5@2djf=SgD;r&)a1VG
z2s-dY<(LtKt1D|*RzikNNxM7(sab6kD{%g3YX07m#J{jM2g-F^zC(-loX#IBZlqMXq`YuZ<1_RnbXwEP~NEF;(_k15(dY>@2s?8viqaFTL$bxvJhwB*wDMJ0=T
z8Wt#7u~{XMme>Fig6LBeph%dtYy;=VHz6xILbm6dqKr7xj_E8tl9)L%Uirj$EmT0E=JIILRZxZJMWO8neWYtPT7p3?YF
z^np|8iS=W50q1LnfY!%<_Imrr`TU>9heyxxpHK2g>qREJFxo(N{;ABHDR=ukuPmsd
zF}I|fLDJpF`P_|ue$uCO{ObVPKqbG+xz)nSLo(6H8k(SC{2v^?&W-7%y9u~R#P8Y+~FwbgDbnx)*NvdKo0v`>UK_v#P*z!q_w>Ya?82mvnmzM
zmUY`^N!Ygf)>Zl8sj$$B>3$0i!K$vlIkzSzyhLMz(saNMKue2*lH|jgL#_O?lr;MW
zdX=%*y4P|Oq}m7?=(VV2G4e&<$0Qh;E1hMF=8*fdi{@^!%DFvttZ*syd9#Sk&7~eV
zlQOjhfD*2LS%0oFxO885(z`Rgo8P?XgQHiLgLO;^Cq4=L;N9u4ZPA;-P@~|)hMx-k
zD1R-sBN$7x(ozFUigT%mv_n*%V%urVAIpv@o&WVA|6b}EvfeVFY5wmW_ww_<`20No
zKfzOXkYDLC+bzt`_xpN|O?^%p=hu~8GTTkI*%A0gCf#CAdY{Z=5}}CqjThtd?7X?z
z*+@=>x0GLWDztYYNi^w$-@Wy@U5>APGb$TU;?1U7F}3-eJlQ0Q{MAq
zJ+)-#^+v$j$%zN3Wmn|9+CE{rq3z0=^MDVEq`4XM^BRWDt;hL@AcH
zBW-$;FOOKLCGo4D8Ef^w>jS^?EYPI?5BGEVKM!8@UhO~Y|EGA$e8EbC3CaVaDgq8R
zF)yqdjPO}zgJ&hbIVHc=c3*|?W+ZfN3J(4dI((g{R{!hNcWavejr#x9e*XM#|M2km
zS^q!9Q=U6^fqmSs*OEBM(gw-@_tCzL(4^S|QF#jJP9=yuW|F4gZp6CCkcsAhw
zS+!ntOX>R(mFtxjFm-YN+bCT8NXgs)_!68yHML*2-ST`2_4PT8F43u4MjczP%|1^3
z=xrY71((l;@)oalGEdbBCG&n&lH<0Btwg_NuBc8{;l>_X&7-uMxC)=r{X9eMp-{q@%YE1x&VDQ*XUzy>L
z8ose4{y%M0NBgIC{jWE6<|M+L(3Lj;8rJ`ZM+bTTpZ)#)=kwnuc~&_8)lzY(rJ~}f
zKno3yrd^*R&B;i?Q=XD!`D&VY06-81G
zWtz;is`YZsA>9J&3WC(GY3lWLSpy579;cZ_3LdSoGZGQ%P8$GNFWX2~DGZ06id_t;
z!=%Yz)>dBge*Ravgs8XwIpk=Pgbb~f2&&fp-|xLT*e{&_9rm8{KRwCwaitXS%bd>H
zLR4`!H_}B$h;Mu)@O%chlG$#!yTN5f4&#n7w~QOMhj~92guM6@)_tX&r7M4gw$&9o~p=&cW)k&Vw`!$V_`9Oyx7{$on%uY-x#%FjOg#TW@HY7S0IcCn1ImIg8lzC;ujk|ZVpOUdJlxMFN+a6^h1;u4OU7(1Y&i*+i`
z%6s;plLM9GP19$AT%X2>1gJHEqHq(1Hb6yQR}=&td5uDg(syW~g@?5&uZmW+u&vk&
zz(ubO`|W1L-@&uFQOik)Xnwx2UT%hX8_OnXk4Z?Ti&0Dw6gB|k6yk_GEvYE7sdiOS
zP!T}BLMvm63B`Od2q9xv`p!&k0{2CDz_mpBS5#3`Tzk<4*1Sw;~W
z=%kl1{BBme?SxCr`P!wulo8fotyp<;Fr4-1-sGiWT}&RM$(-1AAi}?Xg+zt%v;Fo8NP;czz7z6_M)h
zoxfIIBdNaUE6?U60LQ&vl>p~&%(Ut&xx5q$7M5>}8ZZ<-c=p9DIpp#VX0hJwTP-LB
zlo8YxUL6zM#in&*ZlhXo9IR8di73O2qsT`EpCmS$|003aDi)baNOpx6Kn}k~?NS7@
zlAfsp^Ld9^)eKzH`2}xTT^IcZwgD$2dFeCQu4#0oR-;LD!sJ2N&JO6ngp*DYoj)TF
z5qOUS;3e<-^4~Y$ci<;n-lq#Xz?&SrFE!n))}*7UyglxE*F{|dxkZaUed?EyR5WoW
z>Gu15zFtJmz#%6A@WHysis}2^Vdq9e{IB1
za1<;94tR5+4`Mz8`@oyS59YUSioEW1+2(knmM5>O6HBT|$D-Hy*kuun*^Kax^ExDq
z|IZ0YB55G}^YbbK06suEWx%6)V0zb$YN7Q|F9ZH$1HbKHuKi%C^TIq`HMYEK@cQ*@
zuos~FJvN)Kh_2+eeGAb#2Hj_wYFdcZ@~xezdS`uJ5jR@n|za&A$a5anbwN6EHh&0T~Lc6b3!5(K7Iy+4raro@ePRFV-}4ial4d$ZRI6
zjGiBzd<^DMr2LE)*Jx7w+TdQxtb6@SR)pfYLyOAlFqq@Wu)lm+xr{~L&PZOd+nama
z%750>?|)$(u$?O1wDU9OWC8)US008tg@M>!puQ?ON*JOmi&52SrA7LjSQug``T=Yx}*^S4*Gmv2w22SzIE
zEQI&M!k9zGgQw$WAs~0
zSVsvc4V#S{3v8DyB7a6nL=rY2bFp~skjbQlp)>mX)!?V=w^wi9jcx~TFE7t;>c>et
zrO-#oe3Vh3bq`xoX%$EtT)Z3IoL%3Z42QQ@Czs1{1jgxa*Zr=R
zh8N&mUTM?DVAq%56xVzuO*y|hzd8Nk_T>6aGh@r(FUQGxg0o@qD-6Y&pe6CYo?I-m
zCaS`=$)+SF7JSKyPBdUNxIQ1=sAWYfVQPVDHTG-$vn1Vh`nHz;2Hmn2#7NDuZCbXh
zNpN{0$MsKdM>nmTV{qudek;o|JJP_)!A
zS|HW|orq*6Q5e9u$qveOnp35`sI{ddOD8nUzrZcTS2XJO-StIf!+Zim#H?<+BN=
zSqv4Uv+G}4^u9#L5WR1uRwQI0TL@rD%dbEX~t*KeooelF14femEJO-JV`8DfeQn
zcY0NP7euY`o?o4=fEPzW0WXe%Aga_3&R#>I;;or;B&paZ{r=YiXI_kfTy+
zepFx9*v1pnYhD9Yslas(x~{kILK4tt}4ME$VJAMpE6KUF-Sjc5puY>Fj!CVue0L
zbR_4m0gh*gR<0Z>$Qhhn-_&nk);Rr?43Y{oKcD@5Wh~X}_FPB!i1NY7k2pk8$pWy7
z0Vk^wc2dEB_D&f-4VR_$`eHR=uP@fzMOP<70p^Xm@KFlBqE6>-O0y
z5Dng5U7ZbX&fi`&FS1iy0}@5ZS3#D`p*uYvt%UIuGrt*WVJ}hFzQ7S0D!Zp0nHT3*
zXKk&jGAwJY*HeHuc#i%PhnRR#{v
z>^S5$u3J_9g7R>B#3AKLJfvit_mZ~0Y{+%3h;aiBU^blj`x#}6Z0w^d0@$?omieRt+-a9+_eCEth;T0qUID)Yl
z6yH}E#TE@J8mu<>zIKrT7z@SADpbx|Nff?Ai-xl4iYLZY
zj^La$KML#D;-u)eN91P5j)~hOH(M$0T19w)?@@#pE763Z{b`e`(8aj{UFc9+t_(NO
zm~w3xx{Y~OhtKNpSsi}0>hK!D09WWk>U`UzLd;>^fJSs_Emw(~XivFLq`CHdVM@^h
z9xB(ArT$!YTLy}R+=Xw)Eyb>_EPkGpLlwk?c!KjCj_N2
z*tBF%Li@2WpW>Laf!P*lC|9*}q=vR9bJgggIiYjHEQx=IsD~m>7xHo$Ph$!8*4S5Y
zDXrRBsHE3Zdk(9ST~fE6`0`yMD}S&~K2cH%GmfKaA=_|OQ>|#xT)yC%rj`YZl4v6T
zvsy1L<+W?kTzdZ7D!SEp>aKWj)NtVVh(Wk&wt5?di$35qK`S)i^9Mvf$F(1ouxHcK*dhV5dDL?WIfiu6mp1e{?);UUYv;5M6jNA>QQW`CpRazqqpy_2WPkMuFoq^S50(dx_!|9
zOR)DB_Wx%roRa{3A7CchEGel-Y^HA!kp8lQq#cWu8#LYQ77b5Eqd#`kX1=v$4gK=M
zwpI?>EEU_jkiXV@cy;oZPN)i&Y0Od)UP2-(&A
zPjQ4?gK+~h*wY^&mtkIMdyxC_i1>Gi=k-M8RlJpQS=-4^b39gua|8YSIgZClaj(?X
zqA%Z+bhKJ+J#P0u)p0;A)(uF&=Q$22$Nr@X!Rq-6zp8z_7R#5yo^bipY|~lT;aGmd
zu7b{$&O(Znms%?~Z)l{xP&hz7e1yz?Dd5#|`YG8h-tzI}yJ&58&{79Xca*idN;AFY
zuf+1N?#9PGYFO%+VV%aKJQYhZp|$#Ir@E9*a$Aut%9dZZE!BJLAKkS(wp*pQa*fD__3H5OoBhLA$4BCS
zuMfWI9rO+l4!;4tO*gjeNf?Lpo8H>E@{RjS9vI_a#K0v{AKdS6-Qg(cgONJt-m>kG
zRvQfL-tQWLNtaEcCX1o3b?!9^5oD-)WnQ~lwr(0%-&6)PNONA*heoI6G_p_6M6e5
zW-LK$@94YZM_v-i5GM~sfpj5feSP!8ma(?^B1U~M2ouH;
zJs)m~HKP9A2UjE#&65`OhuAxRYI9z|e`CWK0uihyEZv0w7jWdE&U_N7mQ{daV5xbND3`^U$xp6$OU
zc{XeRSzD^lw%@9@Uz3&gWg0e(#^mZYWGfT0#lB-1;jYP0mTp@`d-_}s!E@^edoinRtc-KWn0dN^)0A^k=nN{+L+qKM#e1TxQ5IO
zMJ0t*RT+|Z#GXthIKq6P>f~P5;w}ZS1_kQCzmyL3X*1ij_1NpRl+(J;X{iJEpm)2K
z-m}!$vV*SOsEafLJI{k1dtkoTid7kq41|3sxWu3;qajK{o0aV+O?gZ&Nqmes(}KRl
zl=-}P`vW}{>pwC_e1;N6lMt=F1Z-IU9qb<-=hlC(4-XHX*MCp(tl+|vNyoL24$B|H
zUQEtOggK!&ns$9c5s@p5y>y8=bbvIhG__)pi^--nrU{oSS!*^lBzmkxX|0~K9i6`D
z)oX>nb&iSQ=BTa5u>7`r^AdU$$CwSRrc0KjQ%aIJXZ5uo719GD3DLSOsptg>y54c{
z`Dp(uc*^I07H?wT*E~)0|H1x2ZvH>oKYH~%|3Aee2I;pki%;$$4&^~p|9h~_(EJ|J
z0hz~;BGCD-{qDh$*R%a;wHonZ497Uc93v*@I6eQX=y*?S0c~Koc+y1)i@QEWP|dft
z2@%V!tG)aEG2$>a97teNU8t?C4cZQW>iy}jaf*y7zQ-Y&qM#4tt^ZrOP$mz&O#Q}R
znl~x{ApNt{#W?+HoOrY1l>A#Bn2R?v!uS>94}{)j6o{AS!-4x^cz&9_phT065gi3nXtZVLb!|+S}>00h852?!e@R;=YP>>d$|y_Ib7K$
zXqf-^j}DG<{(t+uSI_hRlRO`55NirC2sn+~U}
z2;i~kDhc9w>M6Z;buUPLp7=L6@f#T;_lQy~vx7yGKKR{RpM#FHmq+*3()o2xW!3s$
zFZ|b6|Bd?p)$9Gd|M%-&?^*vp#j|z@r+vH!sXxOU`8*M;M(fV|&L-xF`l!w?Yf^Yt
z_ZwCBCAkmPF?V?y4_891uKhZ7^kY8F`hR^V(5C&r!^7A4^S`54N6-5IDV`Ske_ah<
z>rMKV>i0HBdfwMy{Qp6mP18hyYdf3PpMo`bn>LbO9idX^4wuJX=?+)Jk(~QpxzAri
zr6!-Wk`!ujRT@s)8LcD>r|puK1N#)-M{?-?8LWls`9D(I+UgKyEeoJw{y#i8F0B6!
zde8fRPx6$^|GMMV>Dtm(Ksgi~2_ciN1MW`CiOg&9HVPL%QZlb{CMr45b50&zWLZsp
z&Zq2rStAB2w-+mjeFV?^ats^E+w;6GS#@2~P8$AA#*!lnjQOi>r>?wad0gPe
z*F)_ZRZP6Nj)l{Nq{4p5QSF$9%Z%$Rz0sC!MwaZcwqp*CIHLE^3UD=V+Vpy{cA;@C
z`^cv-MmKnlNMa=-c3!t3r~=N4R8b^_5l2&N588UUp&*(XtSd-UyQZnv*JTYXe0rQ_
z7AbhN#?DAY=tV9!u=TQyWR=2j=&9HNkcvzi51DIpaIhtyh3HM#;&0uvf>T~uy-eRbY@-UOR#-6)SVs%9c8g5#sRe#QXGVN4gOEvg3
zs<7pKIHj@^lVHOnSAbuQ_=1wO+Ou|Wkb&pVkblRLc|NvG$5%KKxh>D)!M9y=J4*Kl
z$j}h-8R*mosC9Ov%&{3fI67v@e7!y^nHDzQacw4vy56%d8L4ZIPWKdyV&rdTi=-O-
z3M)K41)TW4m=+o?fy)`)0K{oT6b8hU#*!*4s@^GiQYHlMq9OoF!)Za=k;#
zN>mjL{jU9z*`4DZ-$AJXEYHIY(Vrq|NxXAQd`eF$_F|~i5~-_*RYXjJ?A{W-i0g)*
zhB>5&AufTbX{aNXKQQRDyIDmJWR4$&LJRJiR7NB~tw|JxThVAkRRrp^cz5z@{FYVj
z&_c@-YhOu~uWIm8V?sbLIxE<3H#jyNWE&pbI#s?qX<08f*bE!h##<4SkW3e&SiByP
zh;a&W#GN)(6xnDCtH{`Jdt-_T#e6XcA!A}rvs_B@pQ@KuHBgqKhWRrTBq5?M4Ci$<
z6>jaqHCoHb0itspNf~=Xp^t`$VwnVnM1d^}b;YVFZ3%t3p3HL843vlzZw+K_0VS}`
zb?6NsvwP9O?`GB7P6(Z(B~^T}3b{39W|O*F=fi=0#)SF6xH}b>7PjAkeaq{%eG8+?
z=rR-?CF35_Vmn30ygu+rypT7t+Lwn)%dgU$EFzHQa~HpAD8ha$NyA+MqZ_Bi%Wjja
zm!p;LGOvKJ)P?5ydX#`fFS)!&4^sr7m2L;5E^O-76wH7R8EVNz9l&iuZ{`s3Rvf6wslCQs&M?7
zUCml^gKgoW-%^buFV2?z;pJ|CeO5c4cZAhW()D-xIsnjbU>k5U;uJ?yuwBFbO4XL8
z`~o}wAA9fq-nOkQimspaSKuh^iQQWCBd@i5cJ@84?Y92vI6k)1?tRkU7$PAFHAS!h
zC`YT#{oC({0YHLJQL?1Ot+DsF8jE<$UwWm|
z59kj0iA22sbx{}f27A}_x}Sqmx}>U+%Ad9KSDJT`0
zNtN+UKsoBga}ThsmU5#76l&)J#6Yh8%|+1J_E|Kj$3hGHS6bLVTr>tW3g+$;^~Oqq
z#BzjoQE!Yt+J76QAX&h?i1k#fo)X`1iW_ttpmQHR5#d;jnC#|$4w;bO4ppq)J=zLe-0}#MkPcG
z0JG>pu>Jt0D7?7BX-^b|V+6_{k(Qt*Qu~)W{cw(0*4#s9
zONO^RzUSqsX9sUiJ{%o?_wI*+5C@1%3O^oUJ~g?`Q5OQHcXM`3El>i|
zPlhunyIC!3GMLWaUS9ohaeVoIPCuN#y}0^t_U_Gh#}~E0&3?(=e!QRGp1yl?{Nd8CrF6QTzva%339=BYQwrKYKaR*4|zScqH30|@Fri_9Oge;iz1{_^(X
z=)?CXr^nUP*sW7vbm9h){?v;N4BhgSRvad0162jj_qhNgwrEg(BGU^pD1V*dVXGUL
z+}7N3L#DOOaWJNlo&M@WW9=R=Td`e`zO%{d#8;X{;IBm&ZKMJ)rE)e48RgN&!V6(@
zvvS&6an6Hcm_!i10KX_HbdkOPX`YdbyUP~4
z5U{NCQt6#}ebjO@Sd8OcD3>AB9Qf}m*Q!8!7@X=%!a@vNnu^2Icb8Yk7atDJ&p(_U
zyr~yWnP!ke;Ndv^cis!CX0SI0FxHQ6FRyCHslwXk<*j^e(L7cgWv#)3I?V-Lvr?X*
ztJBL_3f%G8!FQ*}ABr_AmDwo~UDS_~OIm@x{-_
z7atB!&VM|)11q4*i0`v6k4xm;+(BP#sagO)S_
z)B2P~R=Hl4za{xJupwuTdB5^S)d%A
zo*bWDeRy+n_TkO(<>kQ-$88sdA5s#@H#B-fgup{G&q}=f@!;b4NHO^7+k>MIrzhWC
z99*2V7&?=Qmm|zcaL!4{aBxcd9CKO^!_0SV$I;|x%u8zea$mFAL0Xytn{BUk4v6kZ
zhi_)r(T~?kw#KqD-*yfU-;_BZ&6-(x2#6Y;|C{@6CnDy;UIDBR9`}T{y7TtNltSoF
z5vwP#TQGdTCayZ#Lwaxazg?!B3`DUC`;V_G8oo4lyo?rU0$wM%}68Etn#pm2v
zhYB(j4?j?$FrK2`J2$XmW^!{aahc!;x1pe~*2(J{ecAy*`z1EM9%($EAR$8aW8F}>
zW0tCXL#8w8riZ0WD0ES8gm(8{c{|>Yw_9*PZMmomY`wIZclO--&7`8+3TLzH`eZJ1
zHe1Q^*|PDJPDn(As1S~!`)TRYF+cFK#A6QTYWcVXv>F6tm`CexFCo#Rh+LV7e3X#u
zkdPMy2ed{+^4zzj%gDme%My}#sH>&qGB9fple~c07bYirs7I=WXH68L43|R3?5SLai&fcZV@_RKEl{gDtp?ZsG*x?8Agwy$#j_AdHu78Oel)T-83
z_MD6MU)#_m0qUMai1C1MBpK55waW}mS%M-$0`*D6#HWKP!YJ)#Bd3?7KRdTI!;tlH
z=(!%4Zq?129FfgN0V@oS4z3P9T)usGad`aU-Ni{sb1pkirl-99uY>Kc#s4EjIA#HP
z9Z;e0254%YL>Ih%HaDH=oVCNWQroKWIzPC)tn#6FNUotxR)#v9tI@6Yx|{8HcYn{j
z`+A8sym75$=d$mnOYznwm}b6AH{6C>;rl5Ml_RuP8Row#tVr=O
z%CQ$BwW8$@6@=D@+|`nQUFO`zQJ260pT~$>J^Gi*1b-9zUW+4+6IwENjA?*V9eVC*
z2djZ|A-i?C@m%NW*+!4Np9>9$k5?56AnkpzAOM<+%YjH2v-i$r>rGwi@~fw9E{-BN
zV;ol~`?F~^b9uH~ntILUQOS-V^Pf^?172gvZV_!`L0DyI90DuAZErh=ljjlT`{>U$
z*v^xQw^nG)6j-x((VoV?7PfJXk)tMA%;tQgZM5;%*!R)6CvKP
zps2iX91Tf}SUHNLN^*wGWF^Q96ZZ)$xE7NuLT=r({R%X^bKg1$SF5`?l8#2_@S2Eqg
z6-~v?~ym0^sKSzdO&KzkF57|NC<9G5_y6%AbGEm;cwz
zHenJ0EXB3V&IdcH3mi{ImIup}qJ`7qqK%<$)|^Je-w3xBWoN
zn925|-80|rmzfs00P_>{P7s}cB|{z22;m^0@NdbG91(D8Lq>RP>_V$pyk#nM>PP5L56e)WAn=A!e1O9n@Q=a%$n;Mg
zx0yci6>Xq9uY+oNCADBXSJ;iOTw{AzJ##B41f@weNs0N8NPXvB8lqVXo|RX5j+E?w
zMFp}^|GS^smzEj&--{Q|i~8ToomVd&^}ltL(WLf?hr9esk)6vlO&1QDkPp|joHLF#oMl(vsC&wA@Es0uZ4D@ygCBo8^~a-Mzqq=sEtHjjcncoi_Si;AlvM_1&!dJ{#w{mR}6I
zC+Ag2D(!S0)K1Qu5o+ux)ri~TovPE8AswB17S!2bwE#D^7X&ha9OROo7k-=#MP)Dd
zg+*WHS3;yeEz!8!3_`Q$%i;NjX#OaFZNAZ7q&mWJp=CSAx{b_G?z?N(z1)7E&3{!r
zW&OApl=H60Drll4bmw@^eH(6<0oavo+s+Vk?Anj##ayXA|FMuP>FoE9+2_B#y}jp!
z^WTeSyN~C;wUpvo?qlEcIl)@D)5p6D7Lwe-&lTuq+4wldeHv0pZ7*2^BhZ^qho&Dm
z{5_rtXIOw|AMO@$+gQ>$&w=&{Qc@(OkwoTo8sbSv_H_dtRbKr7x&*xLi$#1e!8C-r
z`>)Z4Ama()hin{UPEhwhcD=n9y&cyZt%?JcV9vO2bJN^PJIX?SB#Ue;Vu$^ec7tOI
z=>XHa{~mf8!y)Ktr_x^lz6bUhEL5dL=*knq`)7{3#3sERm%~k+4;Qi
z{Y%za9Uts9@qu}qSz?2Suvz{EOYQ#Or%^zo;WE^K8T?<37xi5xLb|E-gC-277=!a5@9|4w{uo#>(5
z{ltOqvn0~d^k+P!cIy|s|L5VsFMm_3l>g>E)v}I&v;4oFmF54=-pfb%zmD=}LsUz>
z59lW__Dx64{hzAxDB1shl3m|@y^Zl73F%ncS3NkZOEXxC+EK|gRv_6*!W-iVf*~1u
zp)gEZIu(}KZ4-5G$h10MNH^weLIV)JC7c%TI=dMXi4
zB8mC;4J~|7
z=fw}{prudot-Y`eaGa-!&u~bDPv-0op*z%n`J6<4?QOLCB;j*!v|nhc(f>gI#ajQp
zw;DM6{Qs=z|NrdK|7$&^_$W4a@^LHyO@3eYT-DnBtKoe0s0XI<{V(FyRbZ)QzXxdO
zejdQp4hj)G@;rUTZb+1W{aqNZq1{8U0949<8H(N#Z2+^*|9j8&O7`Eq=a2G#9cA|U
z|H?+eP!e?0^7L0eM*FYPkVJ)rj=E{bam-3R~-G%8{Gp!@FHu0b=y*dax8Z*^_#LnRZ@vxxYkwFGx7GjH
zKgA^4&N}L2|0apifQCeLzVXCu-1)}qgDd^`d>%+kN?r@
z^$?EZp2_*G`Qh^aoT6UuKRcZ#?k`3X1gJkn-{~-{osRQ;!`|<0A_z!;SWF_MJsS}N
zzl@$14=loAmV)6XVz&`oL~s&P?Lahzy9ZST(MXaZr*i6{gTs@fp3lZ{NO2^$5S5uU
z8Zb`iFhVzEDz?z?j7DM$O(?k)TS#&`91<>|Q=tS&fMU*k5+qznw$A&v6Q#0~Tf_zq
z%D-)lq>T5sw{LH6-5V{&hnt*f;`X6fmN%e&{$3)vQht
z9t>zmwH#(#DO`*TqDJ;|0j>(A^W+J-I{jZq7oE=a^|j9;!9vpc3Mst-aS}6xg8+@E
zJ@~hc;^2=km%=k)dm);G`L}IKBO!4Z>XvYfu$?$Te$|j21;I%qISUdWyhb}P?JxxD
zGbV-PI2H(__eB~O0!r8@!fCjCu`M|v+v-485n^}~1tbpHRLv1$ks2V2TagWr)2lb_
z3pbPqML$Kd_dk+woYhz8dt$U{nFQ(ENA7hx-!qPWJlI09o)AF@dJl0v)VwsK1QXtf
zPH%)aI~~J~din(NafJFr@s8P(0Yx0g1q9VEUO*<>o3Lb^iBYVlG0^igKnh)SsQagp
zoe;I)o;*S4oInB>K_wBLPR|Jif_A;#e|_8O=?-=YZfvFC-gxjTWS4yHz
zP2m*QT{PfWNS?qIvEduwGD`^ns?)h*Df_8kH75b~dWGrPheP*u#-G>wpKl2$(P0w{
z>A4rKjAnW+oT;>2XlBW#-SFL@##$o1KgS%8iK5VN8&Bf&k4+>9tT&Kr0=mh*B00j+
za*yqm1Sm+jCIz6Thv{_w6Mgf|6^+07W*?nWp`)i5l!aL+*Dxh&D81s}MYN7~iT$)4
zkdR0nt;Qvk!=9BiGtIIVp7^Mj&g<(Uc8UgPOcF(eBh|uAtR5Ib{Meqdmxizx
zgWEtDdgxqpsUkT}Bq+xwE=|CI?9wdqluy*3PtXtG9pbQ0r*ntEPPSONLq|mToW{VP
z52xHAu;!q<&K>G4T+n?Qf5u|r2K29u#}H(xyC6d&)}YozO@X@N&VEI(13i}^=IOMHt5>`^m-$xoCJeD8z5WR%6!S-_zzMrI~Mqy
z1SFCahoU?uh4D7M&x?MV2vK+-#GIsr*Cq6C$W)zdmM{xV!&>XKJ{*ro)S7lwAVH+J
z82W{jjMruAuLS+#u*<@JUi2&6qG1+RjDF3q_n(Cs=(|C1+!!xK0dVIcWg0=Kog7xR
zy?wT=FGF7+1%&FDN=Ua>s<9q38o*(6mivp3#Z7kCaQESLDu^aZGibC$X>{N9A0Z^AXL&3Si%Z?a{#A8P$MMA=8^{P
zg01%WlVX-G(r#oAbOZvOmK
z2aV%RbL~Ro`V%h|q#9_d^YE%I?^p-U$SR;Q3kceP@Y9_2i80*uiH)@qfWc8Zrc7JG
ztbl+-n<+E{9J&g36*Q(B1qZ?V>2`yT$e3^4BWmR^gQBkHQ$WB?2LkB|8VT5oNA;hEztGqk*&|5ho{FVx`1)flnm{hc>F`*wSwb9-}
zQlal3|0d-QT}z(STvTS1S>kQJhfd%bL!j1H<^7$u+1-#Sx-JDdg3E|B2+Uu(%+>&w
z=xFd*<|r*GvqT?=`PR(eZmFcDC1sZ9p7B^(mX?%puCCwJ2)69l3;A*ociswh*Z1XM_~B6;Q#WL1Ia{!T)z<(gTox0P3?0d5tyIsJ62fm^J?O$`gE
z>M;e~JBiVNv$58{HE8-thXHd;ha-t_D44w#(=QN!PjVsot`%oN1VJiHu>Qc)b@DO!
z8sRAdqpes}ARi0jwWZ8j9Kp(7J#9Rh{;K7!^2}gAR#9ekK5CDYam$^nnU+3QQD$}S
zbB~m9%U#`8i;5>rONQ@hNUE%wcjygEBAN441ScB^P5@8o2o4nG^h-G$Areg}XAwNO
zoM2Aj7U!|((!y@$L=tX&Ka&eTym74~7lkY$*NE{PGknf>248f!L%C@yeC*_xlqaT<
zKjJK6i8y5AF_k%wx=SLFQv-Z)s08;Y4;_RdyCs3KKkuV!7Ae(Bn=(J(I1Z=I-?yAf
zqW(7CbD)v2!Jy@Xq`yMBYeKk0nJ5`wW>ar-G#b%|&XRGTa3!xy8}nEgG{+I1kR09I
ze$g3|WFH-Z|D94YhhQ*Jry?9F5S)aNrrn_uo!5Wi-R2Hm@6qS6&WdukiXglyQO5P67aZrgH1)CW+bSC834FLO}lhzh@fI3>!kM2bh+
zEL_@BCLSKB|DLj1Hw{ghJS7wrvQR~)4@5pn5-sN)(OH$(_Ltgz4AA@d1VN=POoRLe$;FelkNsmEKiw&f086V6%r
z)(n;QnNu2(a|jq(b3b!sAML4g3y_CK1nC%~Xv4<5GC8&ck&kwnrqWiLg=~05$K>A?
zHk`C4TOqyERMe4lOoYVa_)&qLugs>5o2IMTqG?_f!eyTgrT17CEwgnqpo}1VQsF3&
z@9E?m;UM5d2*kLKK4|nA-Jj>Fg~_toTD>UsZXQ7x+~1wr6pxVGMI-lIDRC|
zeM?Kq^syj8G=nl1j7dA!WN2T>6U_Zls;&W*mJ^-gFJ9VGhDO0m${d~PTYkN#z(SBr
zZ#9o)?lK2u;@cUNDfwtV66qeL?LGrC=|DwwYv`?s))a3V(}lJ?5^vE)iy%J?JF_^!$N
z&Pb+Ph-*t0CBiOO1N>jQw4{s-#ViYrq73NCJc0k}>gek95|PN~)5l0b^Ocs?nS|3>
zu3mR~gMW8%s&(c_Cpmx}MIB*uPw&NV``g^~!d_?Q_8OL`9vK0iBqX7$p#~YbN${o6{$Q`q-X7;*B
znadI8Bsk|JWH>mbeU3TJuF&p~{*Gc@0fn{(+JK;PJwX)POAu)?`Lc@=`8>m$8vf^IhsH-INfXqWU?(rtjVs)5gZus
zz7TBs|2xLhJ>q(p4EK+uG846En=QBa%ndE3c$~uFoFc{gG%6Z?DCSA!Ab&v0
zU_~U8%fMpvDW2(;^qRoNWvNLN{9wwEG8@13sGs^?M
z011YvfbrN=Otp;jx1g~gV4N!WjUGcN_qSoVhy9o>jc>of9VZ2pPWA{5bd9bdk1sYg
z$!J0!DFv0%$yPP<;SNh=mg!y4J3|xD_)}Sn_BT0pxv`UBN0A
zkQ`w!38p+P@i|kgw2uQIr!tn>?|a&f1B7LHqx8Y%B261894N`Dptb9N=b$yt3c+w(82%fnLYC}nyUKNLX7hYFPx-XKrIAe5#t6(9S0>-
zY$z~fVMpZ{y?l7@R%RPl4RSog20b=`Kt!&9B$90%YLAf($24n4341EEK@((SKmPc`
z>XKZB=iGdr)H-IGt3BZ~UvT%jBCi>18^DpBRYBG+`wL04n+W{rzBF`xJ
z+t!O41X!fsJG2~%KyR2E*%tnH@h_nnZzW{-_c{j|EMY)4B?&g|(@h>|*mefHeIPKW
z&@Ws-q33}USdpSlxhqeRo_VMUSYwi=dQspnRH9#*EJgK)chI2q|6Hs*TF{JF4~9(%
ztdOOx0gO_0toUzKlGH{2?-)cxr;H()b4Aj$tqCiIG|jv+ChW@P64AfOLRN1jDLu)9
z1)4gQssI0!6MOPCw98{9E%*#Sp5>}(mPZSi_5ReAPV@g8mLg>}U_grVm~gkWyhC{@
z6?VKrP<9wVlq+*s$#Zw9kRl=_SebIAdtjfC^k}kfX-{qqZpCj1i%pADTi!U0j_o+r
z1k2bwNKg#CFZUJyIkqNq#Uno)qhg^1OqKVXN*bay#EU^M3x5C(M=XK1&}hFaTp#=)
z?0%bHK-zwRawx#a^0Wvx583c>z2darH;xB^py+PIIAbQ(#@^?Kh_7Ry!+zQA{#N=}
z>3|CBn~gl{;DPTZ
zmmZ$aK6Qu|_7<3vL$Zv|^dce=_{B~s1PS1^F$8v;oMV|7^8$|TX1an)cMDP*BVZ_(LgEtwMP
zFincM1byI&2bmcAotu&zzpBEZ;u!a(19*uIEeb-n=ND3JLezL}pxo?{VP!TH_VQ2>
zLHuRs3i0MbAy8Ph;!|y%C}3(wcmL$jF3T|f%|>!qPs7^HgM6%F^JWrZDQwMGh+-W!
z7vl!&E$n)D=W-p3R8`G!5|*4aV&a}^h)P(ToRXxSu2CAC7*%$0)QxOpn2$#lRjVuZ
zsbi9HL)6B-N5*3iurO-GL?g`cPtSJ7miXGxY)^kA@C|6+0xN?&CW5(Sk_;yd+$Qtz
zXoEJidWO=3+qni!rM0fiKJg9sx8KLZVPgLX(EwipVu%{%qy#0v!sbBU|7}izX-R{l
z`TFoigh))V$8viSy8{tuA8bz!5x4YNJlzU^7m9lhIsPi+b~c};xrYydw+OEO1s3b$
zsOt~|^#wzKjl!G7nt_u1#}qLpOld$I69Kl6>$ra=SyCuNT1Q*u!6stYo1ZY
z#A$EN_{PfQq=~zAi*Yp*76Z0tkRbMxk>PrdVi52=YxeX|J104$v%P|UwM-VRX>0eS
zuYd<UT!aZdH?52$4Pk(U{jBj*?_(5@<
zqr+545Wb*1Dvol7cSl&CAKA&ahy#1og#XGP
zurE^z9XPPq9i9auMh@&LEDY`V)-%!u?HNn6PBLwI0*S-b
zFj1K!#Sl?2hmaiEDXaX4JUBGKzmQ?5zCg6FtRq6;W=?U)G2MoAir!lf+&4FxC=@VX(8>Np>-9k^f#k5u&a?BT_D^01-n6)~HJ
za|zN$ji12=PKyHKBX{xsG5SVK3WIfkArgDTg+PNwn4;PtN&2wGs~d3wweehBaVuT+Uy!c$9_*tBVDq
zKeQJ+`G(XI-ZKLRJzoVgH+!%-rmJLD!2h6m$Y2YPdBxA9-lLLeMz<-f@enPnur~bF
zm+a-roHZ1EI_GFvhrQX!3ksjE_c6v^Pb=TR#*Jj*tLUEClY#2`TVSFFDq>J~H9gsO
zg$OSV_As6Ngh}p91|qtTgQ00;%L6W^{|dEX3vwrMU-5g6igDr-s(wlqpaa+)80Ew{@q^L39AG`dqa
zKys(zsa7kjQV=%oRVs8!0q4iyab-evT2`#{>Hv
z!fR+g#zlLiesUJ=7|#2T4MGAg{Awid{}l4ie=+!fF_fY_W*Q2XF^OSS_mbxrpkOAv
zhrGgnTJWFV{igy#j^Wf)j$@X}HOH%(PvPA4w*>!Fbi)5B|9@)!pT-luF?|5XQYi+E
z4MNlYPowD-+2g3uO^Xe|v<31Lp2MlxR>l@yUPRzEMEep{@D=gwjZq1sL~%4iI+oF0
zh{MK&V0jp!62OrBiuH$l+Xcio2<`z06As}sxUeN!i&qiii@RBTaTp{jOAC%fgg%h=
zg_tre*Q$L<4DsPVGi;4`QUC1O)l
zahr<2o*uUhq#(nq+3h8a))Kqi=DHfB?$v&(Vs#gC37x>`DexQj;YnWvi#Z}CNC>H-
zj2OdC2D=3_kXaLsz?dxPTCQ4hKPD9FQ?r^>5h0D#kaI7
zf6Du-P+$@cuJ0(p5*dCCd_&?CDdF5h_7qGM_wt6NOA5vi0ZOSo`p3VojHsMN&{z<7
zfnvlM<$gJJ!2EH$sycnTSG^1*a$`y@?@#C~=F7_63{2g`ai6h|utI_7Tzk!)K6?5<{(!)h4dGo;4OEcY#{u
zTvgx2D14C^qYyBH7)QFrO^uUIt_k*}Q+#?z1GsTFXB%}I(%8ryzl}cggd%e{sQy*P
zfvAyLQ4Gi-AsB@AY&2c2h4bzA81tVKYp%~6vk!i5@G;Lc`oH)I^P=5$V9k~l^9oD8
z-Sg@iR~U&e;-Oy{AdFcPM4
z@)yelwF`wcmf@n-ACn9APuQF$es5Oprxulj_ZN|sE*B*h$T7?sO0pO#yqiM=Efb5l
z>MD^L-S&rSjb*3V2%qLglTF`gR(!1n`?LmAs3iLzlTPFbRq8FT+I5m$jRxzqKh7|e0
zG2y>hCG?1F2=3>}8dxi^b94$}+TVTds)^0Ch_rf5b&M~DY;Ag%lR=C5)Ep?PW;;jZ
z?PXun2T;P)X9`}V*!NaKV7q4lf1~M@!F&&OEi|0OR?bZhuF4DJVzhF;KrVIl@JrOd
zEfGM>fgo8UjyR@^#ew7LjyA1wScdSD69>j(!F$YJ7o3`*esQ6
z17V;GNp9p_q`rvR5u@;`j{NDp-|ffiXP|{L_VcUj=hrH=XOQJ!b^b76W{^&ssPya6
zci^pk3Phr=m;EE&k=zrHQ*L5)cw~kOSFv;PE1Iif!nWoPBO*b5KFf~tYa3I1R5F8f
zCrS-?hUK_zs5Gtrvzad89+(8h&W*%?Bh#|c=|(#gd~JRfuHtFEM7Tn0JZwE=&BvNM
z+$fd9&;x47dM~u>GK(F)Zp+JN7{#+nce!Lm?snQiX`WIf-;+W#F#pEmJVqzr;#{Ed
zs(L6jhtj0jbx*I$3)VB6DDKHiHggeuPpu9os3J2T0#p6dbXIUq^D|+d$kl{GZvmTE
zr^81`=I#p!bCuMjS(P3Yu^wGTACN9~uIB+?w+0iD%?gVhWy0_uq-P5*Vg6w?TqjQ%G3RLhj-Tu>!m-$yJ?D1KS`;^xOeFWA@|j}tBEXU72i7`
zKTWm7yl&HsF61%0+Bz?etg+~FJ6mJ8U#C%H2w(GNJr#g`o3;zTF6l;X73_-40eW{h
z3rON(np+H+go{WDL3&gVrgm0}WAPFIW5Pcsmd*WF{LCwMSFtChcH1P9gB#troruLb
z_1uHf&7QS}7=)MQs4I6TbFukETE(2%&8i1G#84jmZ_ou$=_xYg=Vnh
zi=+p$(Bn;y#iUNRzFFLSE{SF;^rB4|`_s!#ni})U@
zpuSqa_xZ(9d0;BOQcE3WjLs~QTKzZ85U~^WHtS!{bK==b#7b&N-T2Os$3x-ti?(mXL@8jb4I$`SYB<+dSkc}
zfqSM!k_Z}sppOCg@W^Uo-Au8@(lB^!VUI14l&5v4Yp7~Buvd|63aKo{2MNb9j1f;P
z!0VPAY{ps_tdZTTozBU9GD#HX4yxr&{zBJ6RV)E~M{gma^zSmlGFo(d0;2RF7Ws#u
zi2S0Hq9=|I>3J{HRI7iag6>Y*rjr`V;YZV3G{CSzjpg|Cs}IKlN_6#T6%VI!_*FV{|H_v;5D6b8>XQ4=cf#*#Sc=5OFv)&scBkbS(mF
z>}IPQKPBI8%j(%D8K;+*OIO@ZB@EWq;3vZI0{dR5wPYZT@ZL?h1TquSr~u=GtV-{3
z+#W(t;fInz5a?@mUzQ(sBn>g5UvaT6A$V9zHLNTue1nPkBN4ffDh*_hI@
zer4xPK|qKIM3edEPhr*kn1{UKQe8zK99pr1O4FpI+-q=!za{!giXG9Kd<6xUzv!{P
zG!f((->I++7!+tBaB>IH;Fj;hG+nwFGp6qYOvjRgEx~IDL4?l8l5w6PLgZM@5lIYv
zOnhBC1R?EcwlujE{(h*$rupA1RH&ey4N4BFP|YvUYi90)f~2uXG=WxlC}40XF#G6R
zkcHWDJepvwF?&pYS(6Q>N6*Q^GDHb)A$Sbva5^66VtjvgQI|zHBM4O4$45m1#Qg#&
z#yPGpuUEjUtFEmt8zW*9>gTq$Fy+|9o|7gA%rsQlCEv0iWvV6TZ?0(j+oN~GOgW8&CBAeKC
zB@fSs<4BJ?#Q6ezdWA{ZWY(hT{%-?J#DMq4Zg!hQuA52LToFJ6%K`YO8Q4rb%VM(?
zf7j2l{euw_o6ON=b=b737*MhumJyX7!4bp5_BcT^>4}LEA;?HoR7i>C`@&OAL`Tw%
zPnN=hF`VNw+=y{0%bg{$TQrZr4Up&h{q2{No-wbSdlr%MH8vNJ2NhR<{&>z&iMOvN
zN$T>qL}=2y7oeq^)N4Mq?w}$%qt63AIV6jM0bm?CLE8U%afk*V@WNCmZ$TSS^2mtU
zNSFPDs#q8zSVV*^|M)vkLOase9jlEUT{%jZIpMb`P8uR7LO`@Fx0|^=q#Kcj4vGwVT4P_($aqd_~_y^fOVF3;P$5}8)
zSYgv1az(DQlv-gb)hURTu%BJ6%p6StMS3!6!Xf5XA2`fqYv>P9C6Jp5iXw0&|0en5
zcmS+mKQ((j9eKGOijnfc)YM$OK>u@7i57)xOt`LLe2!zX3Lp*#Fqu?(c`N=ClxUCU
zOr#9~zmDc`DJ1<6Q~gG94-Lv=8{07YhxPdw@Vg<)s=e+-u
zEvJYIDl*qJtM5weA(>^=bCZWUw^ZutNQ`doA9{xNt?w
z2Q|^v&^oKi@{8sg$P^fjDpAsP#4rBG%X%Y0RHVV7m2H@T(Al!D8at-`Kn#Gt(5I6v
zyJRuXD`&9=WxHUewaJWWPfaZ6ongOkZN16y)>spw1s8gm;jz8LtURshQHio4dUrcm
z9`~eYse~puxWv=b-=LUTK@ScKw$<%IfamP!m$K;JECKUp>>Ov1lt?MLC
zlH&3z2$0XKLBKQ+6!nooypQ%@=jla`h=mGfYie-A+ge$3iWFF=(Q@$hEh^D8k07Ha
z1}YB*O4C~4T6#lW91C^f
zoP$Z~!8kF@6_p3gT=XkB?+;uyC21Y+MQ4<)K^-IE}vM
zhJpk#Ult8k1CEJ2Ir$9cjWw5E!DOto+^~n~r5E4)_Gg&v0a-Nz=mS$N6D1lJl)CtW
zMIXoxYI;|qK!d&QtrYj;H*LR?&fq
z5j|&N8mXh0`r|nxuJsW=hLOAxEgL
zEGk>_O~Hjr!;elT`5x^vGIE69pXnP1JeWZD`6BAw$%hHRyfeH6NExU>yLclL|J
z93R>#$1GJre()|X+QrhyI)_!KCVt|o&z8DlyXN|H};<=xo!dhWusHqu7G
zQCs{03IL4A{xiNHsu3=0%Dla3O2lu{?i#T-@P1UGfQF)d`%Qqs^KEF#1rajGP^i_X~ZXidlefWBWn20P?EI0SAEi78zw8
z+S*z81AkeRM?rowje4@vo>6tSbyuV)YEs_$a~W3M%QFI*eYFMQyBU47a&3}0nH4)I
zQ&d~BX#4m@4I;Id(#AV!hREM=ga@&wY=M|2EH_tB_^1?6i$itKB9FX;!~+-!YgwfP
zCdtHv`6r=GNO@+6#tZ@h0b-G85^VD`B9IpInb2{QN&bZt`NdvNj^28~B&yfw#{l?$
zpn2FjmIJ#Oze^s)DIeip61daE5NZdBd34!3DsgXj6%wlYjd(TeL4ur$nx%)buCQ+w
zoWs41OHJqgm5IrN9m0Y$f9J5BMz5R9muhT6RkCY33`dd3V4R+3l!QuDBpz9g9aZVk
z=Dl``@42!d1-9tU(5o?ng<@*rols
zG>39IL07BP2p7MI239lR=Fk+LN1{#@$~ja-iGR#Hpc;)}QFE9jJ~%gB@JoPD&Qb&P
zcJTmD#g%-Ut1?5jQmQ>$Ff2h~Af8sh6tF8S`5Rn=Bc*hL*6vmbutXB<_G~
zShuT*;1%De>iKTn&n_>TOEfF>p@8KD-{$Cldu%-p9k&f*0Hn4?1qV?du|{gDG;mwg
zk=*ZvH+PGSx5&0oHWV8~XK(++EcK9wuT^#pE*sP6{JcYBx8zfVSWWoD{#lX}JSzwS
z-)(NX8GF!i2F}_7kbWpsH4Y+g@H5yN54v5}S&v`^WkF*XKWXa(B{Y5Vb(xYvG8c7#brtr}ntu(u7f_Lq;
z;T}(SL4wF38~~TM*_U);IQI?(MB!&<3()tR8!F(;Kvw|=C_```E=~&tmKNH*v^dN<
z@I-#JnLv|A7=+K3El1W;-s-u+aqH&zvB9#NEuS
zF9;rw$85uKsVD8@7%p<+O)KQ&HFG-7MkNpO>ad9zj#+D!l@5NHQZVPj_YLPb!vOHa
zTq4`BYiBc&sFMq2-jL=AvV3@xFb(8DZ_?+DJb-%STlUlCOhu|cnG7EMGRDmdG}&2G
zi4$jbX&f}EGiv7W{l_qzWZuWloh51Z4GcR77f&+nsJpT3+iy3Di8l={JN?L7gN1PR
z6fvah+xqbE`aY}INg6a=x9#&3roZuWyn6jzrvp}}*O|xb(t`XgawYoqMxWG`vawpj
z9lGk7+3Ba|RQb@t?bm7+4p5etj+6(oRU1>kpoSH{BB8RtlujwA
zpRk-u^nRBtL7`kU<&hJaEC7h&5MH+KkwwBNi@!@NdOUxJ4{_x=A9X#pRrIlYL~92T
zA@7mYfM%%Rzk?^BFZ`$~gFkH0s+;W3pn#N;{T2_2(A15tMNjE0kB~Xrfw?XPa-j~)
zZCRYKkcusdaao{W11`NKwD2#^fXgc8FvHbVnYbbK4*ap0Ykn5OF^N1sC3|t)-XT?
zAt40pDMIrc`vbA7O1}-!GNWoyO}}Q48cl*NU(j(wt{D>KHijOqQ8wi@30tXUJ@_#+
zzl|Y+R?HcHS(?fq@!LO99p-*(b9-HopvyI$_Iaku`sk1RV*3$Ds8T%K5M2B@=}p>d
z9_L_%rE19hjEFE+mXhAG^EcB?oX;p&1*2>ps*_eMlCY6FpHla?qnICBQNs${LvLE?
z?ccVlxN0I!?24j>oY88?>hyJ|qY~R(ViSy_C(R4b0FVtO;kzKXvb4t>VTZ!WM`e6c
z2iCTc9c*N>Y5sRk$pQMD{YcNiS6-~qlk9-SnCy|mClN#mPEu31Y?*xL*!!a8l`x;n
z>_rHe-!fMyybGScG(znOfP2rju1O~OX9w(0ua7`8`>Qv3xY@b9Up5B0%x*85^PFb=
zN&)pAls2$ID{&J~WD3&f?@4Q^?3zxvKb2|6Y`F>?3(C+h-9q00>)p
zx!BxTOphURR?QOR3@IRa&D6m;qdgg*JkLKHzlLI01{LN86N-60CQDb(u)*7TCuiP0
z=%BLlrE)Bc@A4~_WYuFzduf_ja|oJsVKD5Js+)vb*Fkp7#PaUiN7{Amlj-uJowcH9
zR5oJn^m`|!EJS00zYI~=!XDri)pYGl@CYTO@Gw??NzIVBSQn8hJGE>Q%Sk+j()PMV
zi+#w0GIV(C^Bk#zK=703s&4KfQ3%$FJ|#doDS68ufg6LolsAQW`T{@;dyAzF8*`t{
z?PH#nMRQ;!IX!l(UXe#yTt{pGSxXNchUU(bD|aqak(j%i=rZ17+iNzjW^xKfd!MF{
zt&ej0EuTG~$GMk$MDt_)3SBgdG^t@P48^v#w%Vt#y8>O@PP$eks7kiP19;p0Cplsq
z3K5{4HFdwzr7Bl}uqAAbt9XA?&fvRC3s3L4iM=JC_CdlRMh4l^)8uzz#l+kAVI|pL
zHu}44cK_^0(2L8a7`M~ROAwhOSHC%l1=ur-Y4v5DX;w=IZOIi&V&Y5P+Thy8J%
z0vom&Bhc~%Ez1E37a;l|en9H{(cPruwvR~3rSE;$CLkejK@v|1%An#)VJRA8!pI-7
z9QRz)@Z<6D_Vx0tHLEV^tS0$mBxzua3oZa$a%6tlUqx?KA>wj
z+gWj&kxc-V@|-;HeI6-R{$&?2N85GY4J?f;O)E!Fw$|7C;~MgRTh9*mt}c$=5j(p1
zgKcJFWNKt~v$XS@H}n1Lenok*GqJ7k1@Vr7-q8fB6bJg`1;k@hCa(4$?PNSE!R(l%
zmMSpo!F^gag-qgLu*;&sX>)hq4e$H!QdSPNpgXKvLVeSh-J@&k>+2qGpB$fVW@crt
z|F(0|>b@I3K7R`k&wq5UzKqOXj;^cJe)zeh`t3y}f`>lwxL$Cp!nc4aWVh13U@gi3djI{%$vG;{K}ut!7OJjN3rsGmXS;9?RZT&Cyb
z4mTI^GoYF-Yje%5)c_O(htbrZpPHIlBPC0^uyvZKib>d`UBz;;Ulz$PHZYAVeK<8;
z8EGh1r2NEM&G?L_6a2Wj>h(}h{G80@@=g4>B$LU>3n21(1U@EdsL640uk&&<%FQoR
zFdk2l3BvDHy#Huz&8>0T3P@JWB$45~*iq#?QXDIIdoz@{er@_lS^JI6+~r22#s6Vi
z`KjvOHhX*OZR>n7JaPD{EBbspd1f;g9R1LbR~QwhM~_`@ekE#*>skMPtXNc7=0pRj
zm1oEviMR4}2yAlx{zRJpZ2<3|Uwce4Yk=QA`l1Y`(~KamS9lGR;i~ZR(Pr0KUgefU
zy8&JiU;eS(FQWE!^K)fuTewpuhvR=d%jdNM>^%ZrDFN*Zm<=L!YkRtYmw*pp!OT6M
zru}|mb)qe2iOmAiA>>Caow%>IoGl#i^_DufCw^VD9s4y$wTNJA
zaxEmb+;4eSE+#K?>AI8~T^S~YM1CE4>u_H7?Qg!$-|YoYTaux9sk5|PWkQ0yG_=S*
z4@l^T-=0`+ggLcm#Z|G#fs-g7?_HOvcYLPOHuhwB+-Y!45~VQ~x|lbHt#rdY0lxeF
zr)kU6(@BPH0p
zO#$O|*sUZQQ8HH}1DKXpbD&A#4D<&^99Q_aMiOSJCOxz^6c
zN7-az4cg9En$B>cmi>5(u6+oBTE`k@>gs~(if1!5&jMmHwHcjuZtM~Dkp|_;2`}Ui
zjTF|0+zggEAe4O5mzkT}&G19v*U9jt*vG8q1kf`c*<@p1kL@qU`^tEPs1PwypYQ=^>yk!xg*(
z>inFbjjYp$@XnTvug1k?GHgTSWTH!pKD;ffWI!vdHRWS
z*6G}PrtqIe?@{sk#>HVxkD}_POiE2h*V*{aSxYuSnZSj_hEI=c>3{=uDyM?rf3%@y
z6h+%GXW2ylHwWoB_lG5iK&$KY;o9`5veoP1WBiJx!f-AbFWjIi+-IE^oHmJU8es^Y
zna#G>>aZJFn1*9-YE|U#p=DUt-yh#PFzLf^2c!*$S_*5+o~{b+E_O?<0A9G`^xlsq
z+*pf|XD1mQnaQK+jsCX?iIHW;YkO&%pl7A_rf3T0hRl