From e9e9dd5c0c0ac58c6941f3ae1db31ab4d44f9bae Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 16 Nov 2023 17:48:58 +0000 Subject: [PATCH 01/49] init hero --- src/routes/init/+page.svelte | 41 ++++++++++++++++++++++++++++++++++++ static/images/logos/init.svg | 15 +++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/routes/init/+page.svelte create mode 100644 static/images/logos/init.svg diff --git a/src/routes/init/+page.svelte b/src/routes/init/+page.svelte new file mode 100644 index 0000000000..e1fd89b976 --- /dev/null +++ b/src/routes/init/+page.svelte @@ -0,0 +1,41 @@ + + +
+
+ init +

+ Appwrite is unveiling new features over a week of exciting announcements +

+
+
Get your ticket
+
Blog announcement
+
+
+
+ + diff --git a/static/images/logos/init.svg b/static/images/logos/init.svg new file mode 100644 index 0000000000..62698d30d1 --- /dev/null +++ b/static/images/logos/init.svg @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file From c4bd765d3657e8ea9e3570a648cd18e97b0af16d Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 16 Nov 2023 18:01:31 +0000 Subject: [PATCH 02/49] days --- src/routes/init/+page.svelte | 78 +++++++++++++++++++++++++++++++++-- src/routes/init/day-1.png | Bin 0 -> 60909 bytes 2 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 src/routes/init/day-1.png diff --git a/src/routes/init/+page.svelte b/src/routes/init/+page.svelte index e1fd89b976..59ea715876 100644 --- a/src/routes/init/+page.svelte +++ b/src/routes/init/+page.svelte @@ -1,16 +1,63 @@
- init +

+ init +

Appwrite is unveiling new features over a week of exciting announcements

-
Get your ticket
-
Blog announcement
+ + +
+
+ +
+
+
+ {#each days as day} +
+ Day 1_ +

{day.title}

+ + +
+ {/each}
@@ -38,4 +85,29 @@ padding-block-start: 1rem; } } + + hr { + border-block-start: 1px solid hsl(var(--aw-color-offset)); + } + + .days { + padding-block: 3.75rem; + + display: grid; + grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); + gap: 2rem; + + .day { + @include border-gradient; + --m-border-radius: 1rem; + --m-border-gradient-before: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.12) 0%, + rgba(255, 255, 255, 0) 125.11% + ); + + background: hsl(var(--aw-color-card)); + padding: 1.25rem; + } + } diff --git a/src/routes/init/day-1.png b/src/routes/init/day-1.png new file mode 100644 index 0000000000000000000000000000000000000000..eeaf48846ece373ce07104d51619b0e0b57e2694 GIT binary patch literal 60909 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 Date: Thu, 16 Nov 2023 18:24:24 +0000 Subject: [PATCH 03/49] days grid POC --- src/routes/init/+page.svelte | 96 ++++++++++++++++++++++++++++++------ 1 file changed, 80 insertions(+), 16 deletions(-) diff --git a/src/routes/init/+page.svelte b/src/routes/init/+page.svelte index 59ea715876..ae1f8e6644 100644 --- a/src/routes/init/+page.svelte +++ b/src/routes/init/+page.svelte @@ -4,29 +4,25 @@ type Day = { title: string; - cover: string; + cover?: string; }; const days: Day[] = [ { - title: 'Day 1', - cover: './day-1.png' + title: 'Messaging and notifications', + cover: Day1 }, { - title: 'Day 2', - cover: './day-1.png' + title: 'Bun & Dart 3.1 support' }, { - title: 'Day 3', - cover: './day-1.png' + title: 'ENUM SDK' }, { - title: 'Day 4', - cover: './day-1.png' + title: 'Day 4' }, { - title: 'Day 5', - cover: './day-1.png' + title: 'Day 5' } ]; @@ -48,11 +44,16 @@

- {#each days as day} + {#each days as day, i}
- Day 1_ -

{day.title}

- +
+ Day {i + 1}_ +

{day.title}

+ {#if day.cover} + + {/if} @@ -91,10 +92,12 @@ } .days { + --day-width: 300px; + --col-size: calc(var(--day-width) / 2); padding-block: 3.75rem; display: grid; - grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(var(--col-size), 1fr)); gap: 2rem; .day { @@ -106,8 +109,69 @@ rgba(255, 255, 255, 0) 125.11% ); + display: flex; + flex-direction: column; + position: relative; + background: hsl(var(--aw-color-card)); + overflow: hidden; + + height: 13.75rem; padding: 1.25rem; + grid-column: span 2; + + h2 { + margin-block-start: 0.5rem; + position: relative; + } + + button { + aspect-ratio: 1; + padding: 0.625rem; + + margin-block-start: auto; + + [class*='icon'] { + color: hsl(var(--aw-color-primary)) !important; + } + } + + .circle { + content: ''; + background: radial-gradient( + hsl(var(--aw-color-accent)) 0%, + hsl(var(--aw-color-accent) / 0) 70% + ); + opacity: 0.24; + + --size: 500px; + width: var(--size); + height: var(--size); + + position: absolute; + right: 0; + top: 0; + translate: 60% -60%; + z-index: 0; + pointer-events: none; + } + + .img { + position: absolute; + height: 100%; + object-fit: contain; + top: 0; + left: 0; + pointer-events: none; + } + } + + .day:last-child:nth-child(3n - 1) { + grid-column-end: -2; + } + + .day:nth-last-child(2):nth-child(3n + 1) { + grid-column-end: 4; } } From a69552a4b4780e151077d4dfcdd219737a7f0924 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 16 Nov 2023 18:33:39 +0000 Subject: [PATCH 04/49] responsiveness --- src/routes/init/+page.svelte | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/routes/init/+page.svelte b/src/routes/init/+page.svelte index ae1f8e6644..411cefc17f 100644 --- a/src/routes/init/+page.svelte +++ b/src/routes/init/+page.svelte @@ -27,6 +27,10 @@ ]; + + Appwrite init_ + +

@@ -92,12 +96,12 @@ } .days { - --day-width: 300px; - --col-size: calc(var(--day-width) / 2); + --day-min-w: 370px; padding-block: 3.75rem; - display: grid; - grid-template-columns: repeat(auto-fit, minmax(var(--col-size), 1fr)); + display: flex; + flex-wrap: wrap; + justify-content: center; gap: 2rem; .day { @@ -120,6 +124,8 @@ padding: 1.25rem; grid-column: span 2; + flex: 0 0 var(--day-min-w); + h2 { margin-block-start: 0.5rem; position: relative; From 7a67658ac37977851a14ee0fddc29bcee1395ee5 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 16 Nov 2023 19:20:47 +0000 Subject: [PATCH 05/49] timer --- src/routes/init/+page.svelte | 115 +++---------------------- src/routes/init/Day.svelte | 159 +++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+), 101 deletions(-) create mode 100644 src/routes/init/Day.svelte diff --git a/src/routes/init/+page.svelte b/src/routes/init/+page.svelte index 411cefc17f..e52d8c5b47 100644 --- a/src/routes/init/+page.svelte +++ b/src/routes/init/+page.svelte @@ -1,28 +1,29 @@ @@ -49,19 +50,7 @@
{#each days as day, i} -
-
- Day {i + 1}_ -

{day.title}

- {#if day.cover} - - {/if} - -
+ {/each}
@@ -70,7 +59,7 @@ diff --git a/src/routes/init/Day.svelte b/src/routes/init/Day.svelte new file mode 100644 index 0000000000..370764e905 --- /dev/null +++ b/src/routes/init/Day.svelte @@ -0,0 +1,159 @@ + + + + +{#if hasReleased} +
+
+ Day {number}_ +

{day.title}

+ {#if day.cover} + + {/if} + +
+{:else} +
+ Day {number}_ +

+ {pad(hours)}:{pad(minutes)}:{pad(seconds)} +

+ +
+{/if} + + From ed5b0d53eef500e37a1b70038d9f89a8f9ee0a0a Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 16 Nov 2023 19:22:19 +0000 Subject: [PATCH 06/49] memory leakz --- src/routes/init/Day.svelte | 43 +++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/routes/init/Day.svelte b/src/routes/init/Day.svelte index 370764e905..489f697e4d 100644 --- a/src/routes/init/Day.svelte +++ b/src/routes/init/Day.svelte @@ -20,33 +20,34 @@ let minutes = 0; let hours = 0; - function updateCountdown() { - const today = new Date(); - const timeRemaining = day.release.getTime() - today.getTime(); - - if (timeRemaining <= 0) { - // Target date has passed, stop the countdown - return; - } + const pad = (num: number) => num.toString().padStart(2, '0'); - const totalSeconds = Math.floor(timeRemaining / 1000); - seconds = totalSeconds % 60; - const totalMinutes = Math.floor(totalSeconds / 60); - minutes = totalMinutes % 60; - hours = Math.floor(totalMinutes / 60); + onMount(() => { + let frame: number; - console.log({ seconds, minutes, hours }); + function updateCountdown() { + const today = new Date(); + const timeRemaining = day.release.getTime() - today.getTime(); - // Request the next animation frame to keep updating the countdown - requestAnimationFrame(() => { - updateCountdown(); - }); - } + if (timeRemaining <= 0) { + // Target date has passed, stop the countdown + return; + } - const pad = (num: number) => num.toString().padStart(2, '0'); + const totalSeconds = Math.floor(timeRemaining / 1000); + seconds = totalSeconds % 60; + const totalMinutes = Math.floor(totalSeconds / 60); + minutes = totalMinutes % 60; + hours = Math.floor(totalMinutes / 60); - onMount(() => { + // Request the next animation frame to keep updating the countdown + frame = requestAnimationFrame(() => { + updateCountdown(); + }); + } updateCountdown(); + + return () => cancelAnimationFrame(frame); }); From c1b81884e45e77236bdf021c21a5b3b9880dec12 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Fri, 17 Nov 2023 18:13:02 +0000 Subject: [PATCH 07/49] change dates --- src/routes/init/+page.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/init/+page.svelte b/src/routes/init/+page.svelte index e52d8c5b47..b771212749 100644 --- a/src/routes/init/+page.svelte +++ b/src/routes/init/+page.svelte @@ -19,11 +19,11 @@ }, { title: 'Day 4', - release: new Date('2023-11-17') + release: new Date('2023-11-23') }, { title: 'Day 5', - release: new Date('2023-11-18') + release: new Date('2023-11-24') } ]; From a0b03a02a683ca585cf54dc6773b6109729a6b9f Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Mon, 20 Nov 2023 13:53:59 +0000 Subject: [PATCH 08/49] revert anim --- src/routes/init/+page.svelte | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/routes/init/+page.svelte b/src/routes/init/+page.svelte index b771212749..4af200096c 100644 --- a/src/routes/init/+page.svelte +++ b/src/routes/init/+page.svelte @@ -19,11 +19,13 @@ }, { title: 'Day 4', - release: new Date('2023-11-23') + // Half a day from today + release: new Date(Date.now() + 1000 * 60 * 60 * 24 * 0.5) }, { title: 'Day 5', - release: new Date('2023-11-24') + // 1.5 days from today + release: new Date(Date.now() + 1000 * 60 * 60 * 24 * 1.5 - 30 * 60 * 1000 - 36 * 1000) } ]; From 1e01f4ffb1a34c7af5a518e1ec76b1e821be2e24 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 14 Dec 2023 17:59:13 +0000 Subject: [PATCH 09/49] update cards --- src/routes/init/+page.svelte | 4 +- .../init/{Day.svelte => DayCard.svelte} | 41 +++++++------------ 2 files changed, 17 insertions(+), 28 deletions(-) rename src/routes/init/{Day.svelte => DayCard.svelte} (82%) diff --git a/src/routes/init/+page.svelte b/src/routes/init/+page.svelte index 4af200096c..81a350e672 100644 --- a/src/routes/init/+page.svelte +++ b/src/routes/init/+page.svelte @@ -1,6 +1,6 @@
-
+
diff --git a/src/routes/init/+page.svelte b/src/routes/init/+page.svelte index 81a350e672..ad365e30d9 100644 --- a/src/routes/init/+page.svelte +++ b/src/routes/init/+page.svelte @@ -7,25 +7,27 @@ { title: 'Messaging and notifications', cover: Day1, - release: new Date('2021-10-11') + release: new Date(Date.now()) }, { title: 'Bun & Dart 3.1 support', - release: new Date('2021-10-11') + // Half a day from today + release: new Date(Date.now() + 1000 * 60 * 60 * 24 * 0.5) }, { title: 'ENUM SDK', - release: new Date('2021-10-11') + // 1.5 days from today + release: new Date(Date.now() + 1000 * 60 * 60 * 24 * 1.5 - 30 * 60 * 1000 - 36 * 1000) }, { title: 'Day 4', - // Half a day from today - release: new Date(Date.now() + 1000 * 60 * 60 * 24 * 0.5) + // 2.5 days from today + release: new Date(Date.now() + 1000 * 60 * 60 * 24 * 2.5 - 30 * 60 * 1000 - 36 * 1000) }, { title: 'Day 5', - // 1.5 days from today - release: new Date(Date.now() + 1000 * 60 * 60 * 24 * 1.5 - 30 * 60 * 1000 - 36 * 1000) + // 3.5 days from today + release: new Date(Date.now() + 1000 * 60 * 60 * 24 * 3.5 - 30 * 60 * 1000 - 36 * 1000) } ]; @@ -49,12 +51,24 @@
-
-
+
{#each days as day, i} {/each}
+
+ +
+

+ DAY 1 - MONDAY, DEC 5_ +

+ +
+ {#each { length: 10 } as _, i} +
{i + 1}
+ {/each} +
+

@@ -86,7 +100,7 @@ border-block-start: 1px solid hsl(var(--aw-color-offset)); } - .days { + .day-cards { --day-min-w: 370px; padding-block: 3.75rem; @@ -95,4 +109,91 @@ justify-content: center; gap: 2rem; } + + .days { + margin-block-start: 5rem; + + position: relative; + + &::before { + /* Gradient line */ + content: ''; + position: absolute; + top: 0; + left: -40px; + width: 1px; + height: 100%; + + background: linear-gradient( + 180deg, + hsl(var(--aw-color-offset)) 0%, + hsl(var(--aw-color-offset)) 50%, + hsla(var(--aw-color-offset), 0) 50%, + hsla(var(--aw-color-offset), 0) 100% + ); + } + } + + [class*='mosaic'] { + margin-block-start: 1rem; + } + + .mosaic { + display: grid; + grid-template-columns: repeat(12, 1fr); + grid-template-rows: repeat(12, 1fr); + gap: 2rem; + + min-height: 660px; + + :nth-child(1) { + grid-column: 1 / span 3; + grid-row: 1 / span 3; + } + + :nth-child(2) { + grid-column: 1 / span 3; + grid-row: 4 / span 3; + } + + :nth-child(3) { + grid-column: 4 / span 6; + grid-row: 1 / span 6; + } + + :nth-child(4) { + grid-column: 10 / span 3; + grid-row: 1 / span 3; + } + + :nth-child(5) { + grid-column: 10 / span 3; + grid-row: 4 / span 3; + } + + :nth-child(6) { + grid-column: 1 / span 3; + grid-row: 7 / span 2; + } + + :nth-child(7) { + grid-column: 4 / span 3; + grid-row: 7 / span 2; + } + + :nth-child(8) { + grid-column: 7 / span 3; + grid-row: 7 / span 2; + } + + :nth-child(9) { + grid-column: 10 / span 3; + grid-row: 7 / span 2; + } + + :nth-child(10) { + grid-column: 1 / span 12; + grid-row: 9 / span 1; + } + } diff --git a/src/routes/init/DayCard.svelte b/src/routes/init/DayCard.svelte index e21546ed37..eaeec5c2df 100644 --- a/src/routes/init/DayCard.svelte +++ b/src/routes/init/DayCard.svelte @@ -16,9 +16,7 @@ const hasReleased = today >= day.release; - let seconds = 0; - let minutes = 0; - let hours = 0; + let [days, hours, minutes, seconds] = [0, 0, 0, 0]; const pad = (num: number) => num.toString().padStart(2, '0'); @@ -39,6 +37,7 @@ const totalMinutes = Math.floor(totalSeconds / 60); minutes = totalMinutes % 60; hours = Math.floor(totalMinutes / 60); + days = Math.floor(hours / 24); // Request the next animation frame to keep updating the countdown frame = requestAnimationFrame(() => { @@ -65,7 +64,11 @@ Day {number}_

- {pad(hours)}:{pad(minutes)}:{pad(seconds)} + {#if hours > 24} + {days} {days > 1 ? 'days' : 'day'} + {:else} + {pad(hours)}:{pad(minutes)}:{pad(seconds)} + {/if}

diff --git a/src/scss/6-elements/_dot.scss b/src/scss/6-elements/_dot.scss new file mode 100644 index 0000000000..ba689ef312 --- /dev/null +++ b/src/scss/6-elements/_dot.scss @@ -0,0 +1,29 @@ +@use '../abstract' as *; + + +.#{$p}-dot { + border-radius: 16px; + border: 0.5px solid rgba(255, 255, 255, 0.16); + background: linear-gradient( + 138deg, + rgba(255, 255, 255, 0.13) 9.61%, + rgba(255, 255, 255, 0) 105.41% + ); + backdrop-filter: blur(100px); + + width: 16px; + height: 16px; + + + &::after { + content: ''; + background-color: white; + border-radius: 100%; + width: 4px; + height: 4px; + position: absolute; + left: 50%; + top: 50%; + translate: -50% -50%; + } +} \ No newline at end of file diff --git a/src/scss/6-elements/_index.scss b/src/scss/6-elements/_index.scss index 5dc3af6054..12dc5ecf03 100644 --- a/src/scss/6-elements/_index.scss +++ b/src/scss/6-elements/_index.scss @@ -1,5 +1,6 @@ @forward "text-tokens"; /* folder */ +@forward "dot"; @forward "container"; @forward "white-section"; @forward "link"; From c5fcc4b3dcbd5d2aa280c81799759c3ea436c4eb Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Fri, 15 Dec 2023 12:12:40 +0000 Subject: [PATCH 11/49] countdown cards & left border gradient --- src/routes/init/+page.svelte | 46 +++++++++++++++++++----- src/routes/init/CountdownCard.svelte | 44 +++++++++++++++++++++++ src/routes/init/DayCard.svelte | 45 +++--------------------- src/routes/init/helpers.ts | 48 ++++++++++++++++++++++++++ static/images/icons/gradients/lock.svg | 21 ++++++++++- 5 files changed, 155 insertions(+), 49 deletions(-) create mode 100644 src/routes/init/CountdownCard.svelte create mode 100644 src/routes/init/helpers.ts diff --git a/src/routes/init/+page.svelte b/src/routes/init/+page.svelte index ad365e30d9..0b09c386cc 100644 --- a/src/routes/init/+page.svelte +++ b/src/routes/init/+page.svelte @@ -1,5 +1,7 @@ + +
+ Lock + {#if $days >= 1} +

+ {$days} + {$days > 1 ? 'days' : 'day'}_ +

+ {:else} +

+ {pad($hours)}:{pad($minutes)}:{pad($seconds)}_ +

+ {/if} + +

Countdown to next announcement

+
+ + diff --git a/src/routes/init/DayCard.svelte b/src/routes/init/DayCard.svelte index eaeec5c2df..18d5ffcf7d 100644 --- a/src/routes/init/DayCard.svelte +++ b/src/routes/init/DayCard.svelte @@ -7,47 +7,12 @@ {#if hasReleased} @@ -64,10 +29,10 @@ Day {number}_

- {#if hours > 24} - {days} {days > 1 ? 'days' : 'day'} + {#if $hours > 24} + {$days} {$days > 1 ? 'days' : 'day'} {:else} - {pad(hours)}:{pad(minutes)}:{pad(seconds)} + {pad($hours)}:{pad($minutes)}:{pad($seconds)} {/if}

diff --git a/src/routes/init/helpers.ts b/src/routes/init/helpers.ts new file mode 100644 index 0000000000..8e386ac2c0 --- /dev/null +++ b/src/routes/init/helpers.ts @@ -0,0 +1,48 @@ +import { onMount } from 'svelte'; +import { get, writable } from 'svelte/store'; + +export const pad = (num: number) => num.toString().padStart(2, '0'); + +export function createCountdown(date: Date) { + const today = new Date(); + const hasReleased = today >= date; + + const [days, hours, minutes, seconds] = [writable(0), writable(0), writable(0), writable(0)]; + + onMount(() => { + let frame: number; + + function updateCountdown() { + const today = new Date(); + const timeRemaining = date.getTime() - today.getTime(); + + if (timeRemaining <= 0) { + // Target date has passed, stop the countdown + return; + } + + const totalSeconds = Math.floor(timeRemaining / 1000); + seconds.set(totalSeconds % 60); + const totalMinutes = Math.floor(totalSeconds / 60); + minutes.set(totalMinutes % 60); + hours.set(Math.floor(totalMinutes / 60)); + days.set(Math.floor(get(hours) / 24)); + + // Request the next animation frame to keep updating the countdown + frame = requestAnimationFrame(() => { + updateCountdown(); + }); + } + updateCountdown(); + + return () => cancelAnimationFrame(frame); + }); + + return { + hasReleased, + days, + hours, + minutes, + seconds + }; +} diff --git a/static/images/icons/gradients/lock.svg b/static/images/icons/gradients/lock.svg index a5a27edf67..7a65bcb83b 100644 --- a/static/images/icons/gradients/lock.svg +++ b/static/images/icons/gradients/lock.svg @@ -1 +1,20 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + From 22b7b2596a68a5631fd1e2cb1cc4273e62571e3d Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Fri, 15 Dec 2023 12:18:46 +0000 Subject: [PATCH 12/49] better SSR handling --- src/routes/init/{ => (assets)}/day-1.png | Bin .../{ => (components)}/CountdownCard.svelte | 2 +- .../init/{ => (components)}/DayCard.svelte | 2 +- src/routes/init/+page.svelte | 6 +-- src/routes/init/helpers.ts | 39 ++++++++++-------- 5 files changed, 27 insertions(+), 22 deletions(-) rename src/routes/init/{ => (assets)}/day-1.png (100%) rename src/routes/init/{ => (components)}/CountdownCard.svelte (94%) rename src/routes/init/{ => (components)}/DayCard.svelte (98%) diff --git a/src/routes/init/day-1.png b/src/routes/init/(assets)/day-1.png similarity index 100% rename from src/routes/init/day-1.png rename to src/routes/init/(assets)/day-1.png diff --git a/src/routes/init/CountdownCard.svelte b/src/routes/init/(components)/CountdownCard.svelte similarity index 94% rename from src/routes/init/CountdownCard.svelte rename to src/routes/init/(components)/CountdownCard.svelte index 63ea085727..777f611eda 100644 --- a/src/routes/init/CountdownCard.svelte +++ b/src/routes/init/(components)/CountdownCard.svelte @@ -1,5 +1,5 @@ + +
+ {#each pad(value) as char, index (index)} +
+ {#if Number.isNaN(Number(char))} + {char} + {:else} +
    + + {#each { length: 10 } as _, i} +
  • {i}
  • + {/each} +
+ {/if} +
+ {/each} +
+ + diff --git a/src/routes/init/(components)/DayCard.svelte b/src/routes/init/(components)/DayCard.svelte index 23a80c6071..fabfee4cc7 100644 --- a/src/routes/init/(components)/DayCard.svelte +++ b/src/routes/init/(components)/DayCard.svelte @@ -7,7 +7,8 @@ @@ -15,10 +26,10 @@ {#if Number.isNaN(Number(char))} {char} {:else} -
@@ -66,6 +123,9 @@ width: 100%; aspect-ratio: 0.925 / 1; + display: grid; + place-items: center; + .shine { position: absolute; inset-block-start: -100px; @@ -73,4 +133,16 @@ z-index: 20; } } + + hr { + margin-block: 2rem; + border-block-end: 1px solid hsl(var(--aw-color-offset)); + } + + .tribes { + margin-block-start: 1.5rem; + display: flex; + flex-wrap: wrap; + gap: 1rem; + } diff --git a/src/routes/init_/ticket/customize/icon.svelte b/src/routes/init_/ticket/customize/icon.svelte new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/routes/init_/ticket/customize/ticket.svelte b/src/routes/init_/ticket/customize/ticket.svelte new file mode 100644 index 0000000000..f2f1d8b2f2 --- /dev/null +++ b/src/routes/init_/ticket/customize/ticket.svelte @@ -0,0 +1,99 @@ + + + + +
+ +

{name || 'Wade Wilson'}

+ {#if user} +

@{user}

+ {/if} +
+ init_ + JAN 15 - 20 +
+ + #{id} + {#if tribe} + {tribe} + {/if} +
+ + diff --git a/src/routes/init_/ticket/customize/tribe-toggle.svelte b/src/routes/init_/ticket/customize/tribe-toggle.svelte new file mode 100644 index 0000000000..63c59247a1 --- /dev/null +++ b/src/routes/init_/ticket/customize/tribe-toggle.svelte @@ -0,0 +1,54 @@ + + + + + {alt} + + + diff --git a/static/images/tribes/android.svg b/static/images/tribes/android.svg new file mode 100644 index 0000000000..b81876d551 --- /dev/null +++ b/static/images/tribes/android.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/static/images/tribes/angular.svg b/static/images/tribes/angular.svg new file mode 100644 index 0000000000..8c46b07aae --- /dev/null +++ b/static/images/tribes/angular.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/tribes/apple.svg b/static/images/tribes/apple.svg new file mode 100644 index 0000000000..f288225e8b --- /dev/null +++ b/static/images/tribes/apple.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/static/images/tribes/appwrite.svg b/static/images/tribes/appwrite.svg new file mode 100644 index 0000000000..f25a7c8f42 --- /dev/null +++ b/static/images/tribes/appwrite.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/images/tribes/dart.svg b/static/images/tribes/dart.svg new file mode 100644 index 0000000000..7413edbbba --- /dev/null +++ b/static/images/tribes/dart.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/tribes/flutter.svg b/static/images/tribes/flutter.svg new file mode 100644 index 0000000000..815b3713ac --- /dev/null +++ b/static/images/tribes/flutter.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/tribes/javascript.svg b/static/images/tribes/javascript.svg new file mode 100644 index 0000000000..707f70b137 --- /dev/null +++ b/static/images/tribes/javascript.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/tribes/linux.svg b/static/images/tribes/linux.svg new file mode 100644 index 0000000000..300a511a4c --- /dev/null +++ b/static/images/tribes/linux.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/tribes/net.svg b/static/images/tribes/net.svg new file mode 100644 index 0000000000..b42b80b338 --- /dev/null +++ b/static/images/tribes/net.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/tribes/next.svg b/static/images/tribes/next.svg new file mode 100644 index 0000000000..ab86dc3965 --- /dev/null +++ b/static/images/tribes/next.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/tribes/php.svg b/static/images/tribes/php.svg new file mode 100644 index 0000000000..36fc752427 --- /dev/null +++ b/static/images/tribes/php.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/images/tribes/python.svg b/static/images/tribes/python.svg new file mode 100644 index 0000000000..fda369e5d0 --- /dev/null +++ b/static/images/tribes/python.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/images/tribes/react.svg b/static/images/tribes/react.svg new file mode 100644 index 0000000000..fcd9bfc7d8 --- /dev/null +++ b/static/images/tribes/react.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/images/tribes/ruby.svg b/static/images/tribes/ruby.svg new file mode 100644 index 0000000000..fea11487a0 --- /dev/null +++ b/static/images/tribes/ruby.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/tribes/stop.svg b/static/images/tribes/stop.svg new file mode 100644 index 0000000000..aec5844878 --- /dev/null +++ b/static/images/tribes/stop.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/static/images/tribes/svelte.svg b/static/images/tribes/svelte.svg new file mode 100644 index 0000000000..82cafd7ccb --- /dev/null +++ b/static/images/tribes/svelte.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/tribes/vue.svg b/static/images/tribes/vue.svg new file mode 100644 index 0000000000..e075245fab --- /dev/null +++ b/static/images/tribes/vue.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/images/tribes/windows.svg b/static/images/tribes/windows.svg new file mode 100644 index 0000000000..abf86ac5e6 --- /dev/null +++ b/static/images/tribes/windows.svg @@ -0,0 +1,3 @@ + + + From b01f79b96f0efd0c748e894aaff19a2bed4e55e4 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Fri, 29 Dec 2023 18:34:13 +0000 Subject: [PATCH 23/49] animations --- .../init_/ticket/customize/+page.svelte | 42 +++++++++++++++- .../init_/ticket/customize/ticket.svelte | 48 +++++++++++++++++++ static/images/tribes/react.svg | 10 ++-- static/images/tribes/ruby.svg | 6 ++- 4 files changed, 100 insertions(+), 6 deletions(-) diff --git a/src/routes/init_/ticket/customize/+page.svelte b/src/routes/init_/ticket/customize/+page.svelte index 36ec8d924b..c33efb5830 100644 --- a/src/routes/init_/ticket/customize/+page.svelte +++ b/src/routes/init_/ticket/customize/+page.svelte @@ -2,9 +2,11 @@ import FooterNav from '$lib/components/FooterNav.svelte'; import MainFooter from '$lib/components/MainFooter.svelte'; import Main from '$lib/layouts/Main.svelte'; + import { fade, fly, scale, type TransitionConfig } from 'svelte/transition'; import ShineSVG from '../../(assets)/shine.svg'; import Ticket from './ticket.svelte'; import TribeToggle from './tribe-toggle.svelte'; + import { quadIn, quadInOut, quadOut } from 'svelte/easing'; let name = 'Eldad Fux'; @@ -29,6 +31,29 @@ 'NET' ]; let tribe: string | null = null; + + function toScale(value: number, from: [number, number], to: [number, number]) { + const [fromMin, fromMax] = from; + const [toMin, toMax] = to; + + const fromRange = fromMax - fromMin; + const toRange = toMax - toMin; + const scale = toRange / fromRange; + + return (value - fromMin) * scale + toMin; + } + + function ticketOut(node: HTMLElement): TransitionConfig { + // Scale from 1 to 0.75, from opacity 1 to 0.5 + return { + duration: 500, + css: (t) => ` + transform: scale(${toScale(t, [0, 1], [0.9, 1])}); + opacity: ${toScale(t, [0, 1], [0.25, 1])}; + `, + easing: quadOut + }; + } @@ -91,7 +116,15 @@
- + {#key tribe} +
+ +
+ {/key}
@@ -126,6 +159,13 @@ display: grid; place-items: center; + .ticket-holder { + position: absolute; + left: 50%; + top: 50%; + translate: -50% -50%; + } + .shine { position: absolute; inset-block-start: -100px; diff --git a/src/routes/init_/ticket/customize/ticket.svelte b/src/routes/init_/ticket/customize/ticket.svelte index f2f1d8b2f2..809c747a57 100644 --- a/src/routes/init_/ticket/customize/ticket.svelte +++ b/src/routes/init_/ticket/customize/ticket.svelte @@ -14,6 +14,10 @@ type $$Props = TicketProps; $: ({ name, user, id, showGithub, tribe } = $$props as $$Props); + + function randomRange(min: number, max: number) { + return Math.random() * (max - min) + min; + }
@@ -31,6 +35,16 @@ {#if tribe} {tribe} {/if} + +
+ {#each { length: 100 } as _, i} +
+ {#each { length: 7 } as _, j} +
+ {/each} +
+ {/each} +
diff --git a/static/images/tribes/react.svg b/static/images/tribes/react.svg index fcd9bfc7d8..079fe46392 100644 --- a/static/images/tribes/react.svg +++ b/static/images/tribes/react.svg @@ -1,4 +1,8 @@ - - - + + + \ No newline at end of file diff --git a/static/images/tribes/ruby.svg b/static/images/tribes/ruby.svg index fea11487a0..4f68de3388 100644 --- a/static/images/tribes/ruby.svg +++ b/static/images/tribes/ruby.svg @@ -1,3 +1,5 @@ - - + + \ No newline at end of file From e4f03aa8c1c22241aa053839ca7ec1e1b14da1c7 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Fri, 5 Jan 2024 21:56:40 +0100 Subject: [PATCH 24/49] move pages --- src/routes/{init_ => init}/(assets)/console.png | Bin src/routes/{init_ => init}/(assets)/day-1.png | Bin src/routes/{init_ => init}/(assets)/shine.svg | 0 src/routes/{init_ => init}/(assets)/ticket.png | Bin .../(components)/CountdownCard.svelte | 0 .../{init_ => init}/(components)/Counter.svelte | 0 .../{init_ => init}/(components)/DayCard.svelte | 0 src/routes/{init_ => init}/+page.svelte | 6 +++--- src/routes/{init_ => init}/helpers.ts | 0 src/routes/{init_ => init}/ticket/+page.svelte | 2 +- .../ticket/customize/(assets)/logo.svg | 0 .../ticket/customize/(assets)/ticket-bg.svg | 0 .../{init_ => init}/ticket/customize/+page.svelte | 2 +- .../{init_ => init}/ticket/customize/icon.svelte | 0 .../{init_ => init}/ticket/customize/ticket.svelte | 0 .../ticket/customize/tribe-toggle.svelte | 0 16 files changed, 5 insertions(+), 5 deletions(-) rename src/routes/{init_ => init}/(assets)/console.png (100%) rename src/routes/{init_ => init}/(assets)/day-1.png (100%) rename src/routes/{init_ => init}/(assets)/shine.svg (100%) rename src/routes/{init_ => init}/(assets)/ticket.png (100%) rename src/routes/{init_ => init}/(components)/CountdownCard.svelte (100%) rename src/routes/{init_ => init}/(components)/Counter.svelte (100%) rename src/routes/{init_ => init}/(components)/DayCard.svelte (100%) rename src/routes/{init_ => init}/+page.svelte (97%) rename src/routes/{init_ => init}/helpers.ts (100%) rename src/routes/{init_ => init}/ticket/+page.svelte (98%) rename src/routes/{init_ => init}/ticket/customize/(assets)/logo.svg (100%) rename src/routes/{init_ => init}/ticket/customize/(assets)/ticket-bg.svg (100%) rename src/routes/{init_ => init}/ticket/customize/+page.svelte (99%) rename src/routes/{init_ => init}/ticket/customize/icon.svelte (100%) rename src/routes/{init_ => init}/ticket/customize/ticket.svelte (100%) rename src/routes/{init_ => init}/ticket/customize/tribe-toggle.svelte (100%) diff --git a/src/routes/init_/(assets)/console.png b/src/routes/init/(assets)/console.png similarity index 100% rename from src/routes/init_/(assets)/console.png rename to src/routes/init/(assets)/console.png diff --git a/src/routes/init_/(assets)/day-1.png b/src/routes/init/(assets)/day-1.png similarity index 100% rename from src/routes/init_/(assets)/day-1.png rename to src/routes/init/(assets)/day-1.png diff --git a/src/routes/init_/(assets)/shine.svg b/src/routes/init/(assets)/shine.svg similarity index 100% rename from src/routes/init_/(assets)/shine.svg rename to src/routes/init/(assets)/shine.svg diff --git a/src/routes/init_/(assets)/ticket.png b/src/routes/init/(assets)/ticket.png similarity index 100% rename from src/routes/init_/(assets)/ticket.png rename to src/routes/init/(assets)/ticket.png diff --git a/src/routes/init_/(components)/CountdownCard.svelte b/src/routes/init/(components)/CountdownCard.svelte similarity index 100% rename from src/routes/init_/(components)/CountdownCard.svelte rename to src/routes/init/(components)/CountdownCard.svelte diff --git a/src/routes/init_/(components)/Counter.svelte b/src/routes/init/(components)/Counter.svelte similarity index 100% rename from src/routes/init_/(components)/Counter.svelte rename to src/routes/init/(components)/Counter.svelte diff --git a/src/routes/init_/(components)/DayCard.svelte b/src/routes/init/(components)/DayCard.svelte similarity index 100% rename from src/routes/init_/(components)/DayCard.svelte rename to src/routes/init/(components)/DayCard.svelte diff --git a/src/routes/init_/+page.svelte b/src/routes/init/+page.svelte similarity index 97% rename from src/routes/init_/+page.svelte rename to src/routes/init/+page.svelte index 5433296a6f..bdbc8eb1de 100644 --- a/src/routes/init_/+page.svelte +++ b/src/routes/init/+page.svelte @@ -50,7 +50,7 @@ Appwrite is unveiling new features over a week of exciting announcements

- Get your ticket + Get your ticket
@@ -117,7 +117,7 @@

Create, customize, and share your Init ticket to enter our general giveaway.

- Get your ticket + Get your ticket
@@ -141,7 +141,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in ultrices lacus.

- Get your ticket + Get your ticket
diff --git a/src/routes/init_/helpers.ts b/src/routes/init/helpers.ts similarity index 100% rename from src/routes/init_/helpers.ts rename to src/routes/init/helpers.ts diff --git a/src/routes/init_/ticket/+page.svelte b/src/routes/init/ticket/+page.svelte similarity index 98% rename from src/routes/init_/ticket/+page.svelte rename to src/routes/init/ticket/+page.svelte index f0d31b601d..f3806884ab 100644 --- a/src/routes/init_/ticket/+page.svelte +++ b/src/routes/init/ticket/+page.svelte @@ -33,7 +33,7 @@ Register with Appwrite Account (DEBUG) Customize ticket without logging in diff --git a/src/routes/init_/ticket/customize/(assets)/logo.svg b/src/routes/init/ticket/customize/(assets)/logo.svg similarity index 100% rename from src/routes/init_/ticket/customize/(assets)/logo.svg rename to src/routes/init/ticket/customize/(assets)/logo.svg diff --git a/src/routes/init_/ticket/customize/(assets)/ticket-bg.svg b/src/routes/init/ticket/customize/(assets)/ticket-bg.svg similarity index 100% rename from src/routes/init_/ticket/customize/(assets)/ticket-bg.svg rename to src/routes/init/ticket/customize/(assets)/ticket-bg.svg diff --git a/src/routes/init_/ticket/customize/+page.svelte b/src/routes/init/ticket/customize/+page.svelte similarity index 99% rename from src/routes/init_/ticket/customize/+page.svelte rename to src/routes/init/ticket/customize/+page.svelte index c33efb5830..1235c0d296 100644 --- a/src/routes/init_/ticket/customize/+page.svelte +++ b/src/routes/init/ticket/customize/+page.svelte @@ -63,7 +63,7 @@
- + diff --git a/src/routes/init_/ticket/customize/icon.svelte b/src/routes/init/ticket/customize/icon.svelte similarity index 100% rename from src/routes/init_/ticket/customize/icon.svelte rename to src/routes/init/ticket/customize/icon.svelte diff --git a/src/routes/init_/ticket/customize/ticket.svelte b/src/routes/init/ticket/customize/ticket.svelte similarity index 100% rename from src/routes/init_/ticket/customize/ticket.svelte rename to src/routes/init/ticket/customize/ticket.svelte diff --git a/src/routes/init_/ticket/customize/tribe-toggle.svelte b/src/routes/init/ticket/customize/tribe-toggle.svelte similarity index 100% rename from src/routes/init_/ticket/customize/tribe-toggle.svelte rename to src/routes/init/ticket/customize/tribe-toggle.svelte From 24449e5392c77d9abf7fbe52513a1956bb443d01 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:33:23 +0000 Subject: [PATCH 25/49] github login --- src/lib/appwrite/init.js | 12 ++++++++++++ src/routes/init/(components)/DayCard.svelte | 1 + src/routes/init/ticket/+page.svelte | 7 ++++++- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/lib/appwrite/init.js diff --git a/src/lib/appwrite/init.js b/src/lib/appwrite/init.js new file mode 100644 index 0000000000..837f9cc64c --- /dev/null +++ b/src/lib/appwrite/init.js @@ -0,0 +1,12 @@ +import { PUBLIC_APPWRITE_PROJECT_INIT_ID } from '$env/static/public'; +import { Client, Account, Databases } from 'appwrite'; + +const client = new Client(); + +client.setEndpoint('https://cloud.appwrite.io/v1').setProject(PUBLIC_APPWRITE_PROJECT_INIT_ID); + +export const appwriteInit = { + client, + account: new Account(client), + database: new Databases(client) +}; diff --git a/src/routes/init/(components)/DayCard.svelte b/src/routes/init/(components)/DayCard.svelte index 32b7056807..683ed21be7 100644 --- a/src/routes/init/(components)/DayCard.svelte +++ b/src/routes/init/(components)/DayCard.svelte @@ -112,6 +112,7 @@ .bottom { display: flex; justify-content: space-between; + align-items: center; } .countdown { color: hsl(var(--aw-color-primary)); diff --git a/src/routes/init/ticket/+page.svelte b/src/routes/init/ticket/+page.svelte index f3806884ab..6daf4d6c84 100644 --- a/src/routes/init/ticket/+page.svelte +++ b/src/routes/init/ticket/+page.svelte @@ -1,9 +1,14 @@ @@ -24,7 +29,7 @@

Register today and claim your Init ticket

- From bcea760eba73fb73f9c38550a484ca99104b66a9 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Mon, 8 Jan 2024 15:56:21 +0000 Subject: [PATCH 26/49] gh wip --- package.json | 1 + pnpm-lock.yaml | 63 ++++++++++++++++ src/lib/components/Tooltip.svelte | 4 +- src/lib/utils/graphql.ts | 22 ++++++ src/routes/init/helpers.ts | 13 ++++ src/routes/init/ticket/+page.svelte | 7 +- src/routes/init/ticket/+page.ts | 6 ++ src/routes/init/ticket/customize/+page.svelte | 6 +- src/routes/init/ticket/customize/+page.ts | 73 +++++++++++++++++++ .../init/ticket/customize/tribe-toggle.svelte | 2 +- 10 files changed, 191 insertions(+), 6 deletions(-) create mode 100644 src/lib/utils/graphql.ts create mode 100644 src/routes/init/ticket/+page.ts create mode 100644 src/routes/init/ticket/customize/+page.ts diff --git a/package.json b/package.json index 423f91860c..65601b72f5 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "@appwrite.io/pink-icons": "0.1.0-next.9", "@appwrite.io/repo": "github:appwrite/appwrite#main", "@splinetool/viewer": "0.9.455", + "appwrite": "^13.0.1", "compression": "^1.7.4", "express": "^4.18.2", "highlight.js": "^11.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ac4adaefc..50f17e381b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ dependencies: '@splinetool/viewer': specifier: 0.9.455 version: 0.9.455 + appwrite: + specifier: ^13.0.1 + version: 13.0.1 compression: specifier: ^1.7.4 version: 1.7.4 @@ -1864,6 +1867,15 @@ packages: picomatch: 2.3.1 dev: true + /appwrite@13.0.1: + resolution: {integrity: sha512-kdOLB5Qbr2beQW72diA/dx8L16LywHcQV1H6oqgGtf64Mo6LsvyIM1hEVxWmFLwAXMaOtsqb7Mcs4+oQHo+WmQ==} + dependencies: + cross-fetch: 3.1.5 + isomorphic-form-data: 2.0.0 + transitivePeerDependencies: + - encoding + dev: false + /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: true @@ -1927,6 +1939,10 @@ packages: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} dev: true + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + /atob@2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} @@ -2318,6 +2334,13 @@ packages: hasBin: true dev: true + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -2416,6 +2439,14 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true + /cross-fetch@3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false + /cross-fetch@3.1.8: resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: @@ -2579,6 +2610,11 @@ packages: slash: 3.0.0 dev: true + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true @@ -3177,6 +3213,15 @@ packages: signal-exit: 4.1.0 dev: true + /form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -3786,6 +3831,12 @@ packages: engines: {node: '>=0.10.0'} dev: true + /isomorphic-form-data@2.0.0: + resolution: {integrity: sha512-TYgVnXWeESVmQSg4GLVbalmQ+B4NPi/H4eWxqALKj63KsUrcu301YDjBqaOw3h+cbak7Na4Xyps3BiptHtxTfg==} + dependencies: + form-data: 2.5.1 + dev: false + /jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} @@ -4428,6 +4479,18 @@ packages: /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} diff --git a/src/lib/components/Tooltip.svelte b/src/lib/components/Tooltip.svelte index ccdf79af0b..a7e36df15c 100644 --- a/src/lib/components/Tooltip.svelte +++ b/src/lib/components/Tooltip.svelte @@ -6,6 +6,7 @@ export let placement: NonNullable['placement'] = 'top'; export let disabled = false; export let closeOnPointerDown = false; + export let disableHoverableContent = false; const { elements: { trigger, content, arrow }, @@ -16,7 +17,8 @@ }, openDelay: 0, closeOnPointerDown, - forceVisible: true + forceVisible: true, + disableHoverableContent }); $: flyParams = (function getFlyParams() { diff --git a/src/lib/utils/graphql.ts b/src/lib/utils/graphql.ts new file mode 100644 index 0000000000..2fb8091902 --- /dev/null +++ b/src/lib/utils/graphql.ts @@ -0,0 +1,22 @@ +type CreateGraphqlFetcherArgs = { + query: string; + url: string; +}; + +type GraphqlFetcherArgs = { + authorizationToken: string; + variables: Record; +}; + +export function createGraphqlFetcher({ query, url }: CreateGraphqlFetcherArgs) { + return async ({ authorizationToken, variables }: GraphqlFetcherArgs) => { + return fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${authorizationToken}` + }, + body: JSON.stringify({ query, variables }) + }).then((res) => res.json() as T); + }; +} diff --git a/src/routes/init/helpers.ts b/src/routes/init/helpers.ts index 9e8614f227..d62a304447 100644 --- a/src/routes/init/helpers.ts +++ b/src/routes/init/helpers.ts @@ -1,3 +1,5 @@ +import { browser } from '$app/environment'; +import { appwriteInit } from '$lib/appwrite/init'; import { onMount } from 'svelte'; import { get, writable } from 'svelte/store'; @@ -51,3 +53,14 @@ export function createCountdown(date: Date) { seconds }; } + +export async function isLoggedInGithub() { + if (!browser) return false; + + try { + const { provider } = await appwriteInit.account.getSession('current'); + return provider === 'github'; + } catch { + return false; + } +} diff --git a/src/routes/init/ticket/+page.svelte b/src/routes/init/ticket/+page.svelte index 6daf4d6c84..3733092f8f 100644 --- a/src/routes/init/ticket/+page.svelte +++ b/src/routes/init/ticket/+page.svelte @@ -7,7 +7,12 @@ import TicketPNG from '../(assets)/ticket.png'; function loginGithub() { - appwriteInit.account.createOAuth2Session('github'); + appwriteInit.account.createOAuth2Session( + 'github', + 'http://localhost:5173/init/ticket?success=1', + 'http://localhost:5173/init/ticket?error=1', + ['read:user'] + ); } diff --git a/src/routes/init/ticket/+page.ts b/src/routes/init/ticket/+page.ts new file mode 100644 index 0000000000..ffc4a1e3ff --- /dev/null +++ b/src/routes/init/ticket/+page.ts @@ -0,0 +1,6 @@ +import { redirect } from '@sveltejs/kit'; +import { isLoggedInGithub } from '../helpers'; + +export const load = async () => { + if (await isLoggedInGithub()) throw redirect(307, '/init/ticket/customize'); +}; diff --git a/src/routes/init/ticket/customize/+page.svelte b/src/routes/init/ticket/customize/+page.svelte index 1235c0d296..59276f26f3 100644 --- a/src/routes/init/ticket/customize/+page.svelte +++ b/src/routes/init/ticket/customize/+page.svelte @@ -2,11 +2,11 @@ import FooterNav from '$lib/components/FooterNav.svelte'; import MainFooter from '$lib/components/MainFooter.svelte'; import Main from '$lib/layouts/Main.svelte'; - import { fade, fly, scale, type TransitionConfig } from 'svelte/transition'; + import { quadOut } from 'svelte/easing'; + import { fly, type TransitionConfig } from 'svelte/transition'; import ShineSVG from '../../(assets)/shine.svg'; import Ticket from './ticket.svelte'; import TribeToggle from './tribe-toggle.svelte'; - import { quadIn, quadInOut, quadOut } from 'svelte/easing'; let name = 'Eldad Fux'; @@ -43,7 +43,7 @@ return (value - fromMin) * scale + toMin; } - function ticketOut(node: HTMLElement): TransitionConfig { + function ticketOut(_node: HTMLElement): TransitionConfig { // Scale from 1 to 0.75, from opacity 1 to 0.5 return { duration: 500, diff --git a/src/routes/init/ticket/customize/+page.ts b/src/routes/init/ticket/customize/+page.ts new file mode 100644 index 0000000000..ac450cbcc9 --- /dev/null +++ b/src/routes/init/ticket/customize/+page.ts @@ -0,0 +1,73 @@ +import { appwriteInit } from '$lib/appwrite/init'; +import { createGraphqlFetcher } from '$lib/utils/graphql'; +import { isLoggedInGithub } from '../../helpers'; + +export interface GithubContributionsResponse { + data: Data; +} + +export interface Data { + user: User; +} + +export interface User { + contributionsCollection: ContributionsCollection; +} + +export interface ContributionsCollection { + contributionCalendar: ContributionCalendar; +} + +export interface ContributionCalendar { + totalContributions: number; + weeks: Week[]; +} + +export interface Week { + contributionDays: ContributionDay[]; +} + +export interface ContributionDay { + contributionCount: number; + date: Date; +} + +const fetchContributions = createGraphqlFetcher({ + query: `query($userName:String!) { + user(login: $userName){ + contributionsCollection { + contributionCalendar { + totalContributions + weeks { + contributionDays { + contributionCount + date + } + } + } + } + } + }`, + url: 'https://api.github.com/graphql' +}); + +export const load = async () => { + if (await isLoggedInGithub()) { + const { providerAccessToken } = await appwriteInit.account.getSession('current'); + console.log(providerAccessToken); + const contributions = await fetchContributions({ + authorizationToken: providerAccessToken, + variables: { userName: 'tglide' } + }); + + console.log( + contributions.data.user.contributionsCollection.contributionCalendar.weeks.flatMap( + (week) => week.contributionDays + ) + ); + + return { + // username: session + }; + } +}; diff --git a/src/routes/init/ticket/customize/tribe-toggle.svelte b/src/routes/init/ticket/customize/tribe-toggle.svelte index 63c59247a1..96d17262c8 100644 --- a/src/routes/init/ticket/customize/tribe-toggle.svelte +++ b/src/routes/init/ticket/customize/tribe-toggle.svelte @@ -19,7 +19,7 @@ $: alt = tribe === null ? 'No tribe' : tribe; - + +
@@ -122,7 +136,13 @@ in:fly={{ y: -100, delay: 400, duration: 500, easing: quadOut }} out:ticketOut > - +
{/key} diff --git a/src/routes/init/ticket/customize/+page.ts b/src/routes/init/ticket/customize/+page.ts index ac450cbcc9..a0457aef18 100644 --- a/src/routes/init/ticket/customize/+page.ts +++ b/src/routes/init/ticket/customize/+page.ts @@ -1,73 +1,92 @@ import { appwriteInit } from '$lib/appwrite/init'; -import { createGraphqlFetcher } from '$lib/utils/graphql'; -import { isLoggedInGithub } from '../../helpers'; - -export interface GithubContributionsResponse { - data: Data; -} +import { redirect } from '@sveltejs/kit'; -export interface Data { - user: User; -} +import { isLoggedInGithub } from '../../helpers'; +import type { ContributionsMatrix } from './ticket.svelte'; +import { browser } from '$app/environment'; -export interface User { - contributionsCollection: ContributionsCollection; +interface GithubContributionsResponse { + data: { + user: { + contributionsCollection: { + contributionCalendar: { + totalContributions: number; + weeks: Array<{ + contributionDays: Array<{ + contributionCount: number; + date: Date; + }>; + }>; + }; + }; + }; + }; } -export interface ContributionsCollection { - contributionCalendar: ContributionCalendar; +interface GithubUser { + login: string; + name: string; } -export interface ContributionCalendar { - totalContributions: number; - weeks: Week[]; -} +export const load = async ({ fetch }) => { + if (await isLoggedInGithub()) { + const { providerAccessToken } = await appwriteInit.account.getSession('current'); -export interface Week { - contributionDays: ContributionDay[]; -} + const username = await fetch('https://api.github.com/user', { + method: 'GET', + headers: { + Authorization: `Bearer ${providerAccessToken}` + } + }).then((res) => res.json() as Promise); -export interface ContributionDay { - contributionCount: number; - date: Date; -} + const { data } = await fetch('https://api.github.com/graphql', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${providerAccessToken}` + }, + body: JSON.stringify({ + query: `query($userName:String!) { + user(login: $userName){ + contributionsCollection { + contributionCalendar { + totalContributions + weeks { + contributionDays { + contributionCount + date + } + } + } + } + } + }`, + variables: { userName: 'tglide' } + }) + }).then((res) => res.json() as Promise); + const { weeks } = data.user.contributionsCollection.contributionCalendar; -const fetchContributions = createGraphqlFetcher({ - query: `query($userName:String!) { - user(login: $userName){ - contributionsCollection { - contributionCalendar { - totalContributions - weeks { - contributionDays { - contributionCount - date - } - } - } - } - } - }`, - url: 'https://api.github.com/graphql' -}); + const max = weeks.reduce((acc, week) => { + const weekMax = week.contributionDays.reduce((acc, day) => { + return Math.max(acc, day.contributionCount); + }, 0); + const newMax = Math.max(acc, weekMax); + return Math.min(newMax, 45); + }, 0); -export const load = async () => { - if (await isLoggedInGithub()) { - const { providerAccessToken } = await appwriteInit.account.getSession('current'); - console.log(providerAccessToken); - const contributions = await fetchContributions({ - authorizationToken: providerAccessToken, - variables: { userName: 'tglide' } + const contributions: ContributionsMatrix = weeks.map((week) => { + return week.contributionDays + .map((day) => { + return day.contributionCount / max; + }) + .toReversed(); }); - console.log( - contributions.data.user.contributionsCollection.contributionCalendar.weeks.flatMap( - (week) => week.contributionDays - ) - ); - return { - // username: session + contributions, + username }; + } else if (browser) { + throw redirect(307, '/init/ticket'); } }; diff --git a/src/routes/init/ticket/customize/ticket.svelte b/src/routes/init/ticket/customize/ticket.svelte index 809c747a57..371c4d1dce 100644 --- a/src/routes/init/ticket/customize/ticket.svelte +++ b/src/routes/init/ticket/customize/ticket.svelte @@ -1,10 +1,13 @@ @@ -13,7 +16,7 @@ import Logo from './(assets)/logo.svg'; type $$Props = TicketProps; - $: ({ name, user, id, showGithub, tribe } = $$props as $$Props); + $: ({ name, user, id, showGithub, tribe, contributions } = $$props as $$Props); function randomRange(min: number, max: number) { return Math.random() * (max - min) + min; @@ -36,15 +39,17 @@ {tribe} {/if} -
- {#each { length: 100 } as _, i} -
- {#each { length: 7 } as _, j} -
- {/each} -
- {/each} -
+ {#if contributions} +
+ {#each contributions as row, i} +
+ {#each row as opacity, j} +
+ {/each} +
+ {/each} +
+ {/if}
diff --git a/src/routes/init/ticket/customize/ticket.svelte b/src/routes/init/(components)/ticket.svelte similarity index 95% rename from src/routes/init/ticket/customize/ticket.svelte rename to src/routes/init/(components)/ticket.svelte index aef96db3cc..c1595eb2cb 100644 --- a/src/routes/init/ticket/customize/ticket.svelte +++ b/src/routes/init/(components)/ticket.svelte @@ -11,8 +11,8 @@ @@ -74,10 +69,13 @@
- +

Customize ticket_

@@ -138,7 +136,7 @@ {/each}
-
+ {#key tribe}
{/key} -
+
@@ -175,36 +173,6 @@ padding-block-start: 4rem; } - .ticket-preview { - --p-border-radius: 1rem; - border: 1px solid hsl(var(--aw-color-subtle)); - border-radius: var(--p-border-radius); - - position: relative; - overflow: hidden; - width: 100%; - aspect-ratio: 0.925 / 1; - - display: grid; - place-items: center; - - transition: opacity 0.25s ease; - - .ticket-holder { - position: absolute; - left: 50%; - top: 50%; - translate: -50% -50%; - } - - .shine { - position: absolute; - inset-block-start: -100px; - inset-inline-end: -100px; - z-index: 20; - } - } - hr { margin-block: 2rem; border-block-end: 1px solid hsl(var(--aw-color-offset)); diff --git a/src/routes/init/ticket/customize/+page.ts b/src/routes/init/ticket/customize/+page.ts index a0457aef18..d6d2665845 100644 --- a/src/routes/init/ticket/customize/+page.ts +++ b/src/routes/init/ticket/customize/+page.ts @@ -1,90 +1,15 @@ -import { appwriteInit } from '$lib/appwrite/init'; import { redirect } from '@sveltejs/kit'; -import { isLoggedInGithub } from '../../helpers'; -import type { ContributionsMatrix } from './ticket.svelte'; import { browser } from '$app/environment'; +import { getGithubContributions, getGithubUser, isLoggedInGithub } from '../../helpers'; -interface GithubContributionsResponse { - data: { - user: { - contributionsCollection: { - contributionCalendar: { - totalContributions: number; - weeks: Array<{ - contributionDays: Array<{ - contributionCount: number; - date: Date; - }>; - }>; - }; - }; - }; - }; -} - -interface GithubUser { - login: string; - name: string; -} - -export const load = async ({ fetch }) => { +export const load = async () => { if (await isLoggedInGithub()) { - const { providerAccessToken } = await appwriteInit.account.getSession('current'); - - const username = await fetch('https://api.github.com/user', { - method: 'GET', - headers: { - Authorization: `Bearer ${providerAccessToken}` - } - }).then((res) => res.json() as Promise); - - const { data } = await fetch('https://api.github.com/graphql', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${providerAccessToken}` - }, - body: JSON.stringify({ - query: `query($userName:String!) { - user(login: $userName){ - contributionsCollection { - contributionCalendar { - totalContributions - weeks { - contributionDays { - contributionCount - date - } - } - } - } - } - }`, - variables: { userName: 'tglide' } - }) - }).then((res) => res.json() as Promise); - const { weeks } = data.user.contributionsCollection.contributionCalendar; - - const max = weeks.reduce((acc, week) => { - const weekMax = week.contributionDays.reduce((acc, day) => { - return Math.max(acc, day.contributionCount); - }, 0); - const newMax = Math.max(acc, weekMax); - return Math.min(newMax, 45); - }, 0); - - const contributions: ContributionsMatrix = weeks.map((week) => { - return week.contributionDays - .map((day) => { - return day.contributionCount / max; - }) - .toReversed(); - }); + const user = await getGithubUser(); return { - contributions, - username + contributions: await getGithubContributions(user.login), + user }; } else if (browser) { throw redirect(307, '/init/ticket'); diff --git a/src/routes/init/ticket/thank-you/+page.svelte b/src/routes/init/ticket/thank-you/+page.svelte new file mode 100644 index 0000000000..c9010688e1 --- /dev/null +++ b/src/routes/init/ticket/thank-you/+page.svelte @@ -0,0 +1,75 @@ + + + + Appwrite init_ - Customize Ticket + + +
+
+
+

+ Thank you for registering for + + init_ + +

+ +

You have received ticket #0013371

+ + + Customize ticket + + +
+ + +
+
+ +
+ +
+
+
+ +
+ + +
+
+ + diff --git a/src/routes/init/ticket/thank-you/+page.ts b/src/routes/init/ticket/thank-you/+page.ts new file mode 100644 index 0000000000..d6d2665845 --- /dev/null +++ b/src/routes/init/ticket/thank-you/+page.ts @@ -0,0 +1,17 @@ +import { redirect } from '@sveltejs/kit'; + +import { browser } from '$app/environment'; +import { getGithubContributions, getGithubUser, isLoggedInGithub } from '../../helpers'; + +export const load = async () => { + if (await isLoggedInGithub()) { + const user = await getGithubUser(); + + return { + contributions: await getGithubContributions(user.login), + user + }; + } else if (browser) { + throw redirect(307, '/init/ticket'); + } +}; From 265d8168d7db49ab81adb9a9d633624d979c1ccb Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Mon, 8 Jan 2024 21:01:41 +0000 Subject: [PATCH 30/49] mobile wip --- src/routes/init/(components)/ticket.svelte | 81 ++++++++++++------- src/routes/init/ticket/+page.svelte | 5 ++ src/routes/init/ticket/thank-you/+page.svelte | 5 ++ 3 files changed, 64 insertions(+), 27 deletions(-) diff --git a/src/routes/init/(components)/ticket.svelte b/src/routes/init/(components)/ticket.svelte index c1595eb2cb..e65e9e55af 100644 --- a/src/routes/init/(components)/ticket.svelte +++ b/src/routes/init/(components)/ticket.svelte @@ -22,14 +22,16 @@

{name?.trim() || '-'}

{#if user} -

@{user}

+

@{user}

{/if}
init_ JAN 15 - 20
- #{id} +
+ #{id} +
{#if tribe} {tribe} {/if} @@ -48,14 +50,24 @@
From 85e213703e4c260ed0d7eaf2ab1ae38cf1383020 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Mon, 8 Jan 2024 21:18:16 +0000 Subject: [PATCH 31/49] fix origin --- src/routes/init/ticket/+page.svelte | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/routes/init/ticket/+page.svelte b/src/routes/init/ticket/+page.svelte index 54c48904c6..f685cf8aba 100644 --- a/src/routes/init/ticket/+page.svelte +++ b/src/routes/init/ticket/+page.svelte @@ -1,4 +1,5 @@ + +
+ + +
+ +
+ +

Integrate your Appwrite account

+

+ Sign in with your Appwrite Account and see the magic happen in your ticket +

+ + + +
+ +

Add your tribe

+

+ Add your favorite technology to your Init ticket and join your tribe of like-minded developers +

+
+ {#each tribes as t} + { + tribe = t; + }} + /> + {/each} +
+ + From 3086e67714876ebbb8c83785c17884b42197c06b Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Tue, 9 Jan 2024 18:27:48 +0000 Subject: [PATCH 37/49] responsiveness adjustments --- .../init/(components)/TicketPreview.svelte | 8 +++++++- src/routes/init/ticket/+layout.svelte | 4 ++-- src/routes/init/ticket/thank-you/+page.svelte | 16 +--------------- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/routes/init/(components)/TicketPreview.svelte b/src/routes/init/(components)/TicketPreview.svelte index 8a35a745a5..bd67000b0a 100644 --- a/src/routes/init/(components)/TicketPreview.svelte +++ b/src/routes/init/(components)/TicketPreview.svelte @@ -18,13 +18,15 @@ position: relative; overflow: hidden; width: 100%; - aspect-ratio: 0.925 / 2; + aspect-ratio: 0.8 / 1; display: grid; place-items: center; transition: opacity 0.25s ease; + --base-width: min(40vw, 28.75rem); + :global(.ticket-holder) { position: absolute; left: 50%; @@ -38,5 +40,9 @@ inset-inline-end: -100px; z-index: 20; } + + @media screen and (max-width: 1023px) { + --base-width: min(60vw, 300px); + } } diff --git a/src/routes/init/ticket/+layout.svelte b/src/routes/init/ticket/+layout.svelte index 14600921b6..69768c93f2 100644 --- a/src/routes/init/ticket/+layout.svelte +++ b/src/routes/init/ticket/+layout.svelte @@ -8,8 +8,8 @@ :global(.hero) { display: grid; - grid-template-columns: 1fr min(50%, 730px); - gap: clamp(3rem, 4vw, 6.5rem); + grid-template-columns: 1fr min(57%, 770px); + gap: clamp(3rem, 6vw, 7.5rem); justify-content: space-between; --p-padding-inline: clamp(1.25rem, 4vw, 120rem); diff --git a/src/routes/init/ticket/thank-you/+page.svelte b/src/routes/init/ticket/thank-you/+page.svelte index c537099eff..c237cb76b5 100644 --- a/src/routes/init/ticket/thank-you/+page.svelte +++ b/src/routes/init/ticket/thank-you/+page.svelte @@ -72,14 +72,6 @@ margin-block-start: 3.5rem; } - .ticket-preview-wrapper { - display: contents; - } - - .ticket-holder { - --base-width: min(40vw, 28.75rem); - } - @media screen and (max-width: 511px) { .ticket-preview-wrapper { :global(.ticket-preview) { @@ -104,13 +96,7 @@ } .ticket-preview-wrapper { - :global(.ticket-preview) { - grid-column: 1 / -1; - } - } - - .ticket-holder { - --base-width: min(60vw, 300px); + grid-column: 1 / -1; } } From 334b018e35faa252ac9dc0ff233af9e246636765 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Tue, 9 Jan 2024 19:23:50 +0000 Subject: [PATCH 38/49] responsive customize page --- src/routes/init/ticket/+layout.svelte | 2 +- src/routes/init/ticket/customize/+page.svelte | 93 ++++++++++++++++++- 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/src/routes/init/ticket/+layout.svelte b/src/routes/init/ticket/+layout.svelte index 69768c93f2..9813c47975 100644 --- a/src/routes/init/ticket/+layout.svelte +++ b/src/routes/init/ticket/+layout.svelte @@ -5,6 +5,7 @@ From e58dcdef9773e01f048e9900f8f0924fdffb03d6 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Tue, 9 Jan 2024 19:42:20 +0000 Subject: [PATCH 39/49] tribe toggle animation --- src/lib/utils/math.ts | 10 ++++ src/routes/init/(components)/ticket.svelte | 28 ++++++++-- src/routes/init/ticket/customize/+page.svelte | 51 ++++--------------- 3 files changed, 45 insertions(+), 44 deletions(-) create mode 100644 src/lib/utils/math.ts diff --git a/src/lib/utils/math.ts b/src/lib/utils/math.ts new file mode 100644 index 0000000000..6db30004ad --- /dev/null +++ b/src/lib/utils/math.ts @@ -0,0 +1,10 @@ +export function toScale(value: number, from: [number, number], to: [number, number]) { + const [fromMin, fromMax] = from; + const [toMin, toMax] = to; + + const fromRange = fromMax - fromMin; + const toRange = toMax - toMin; + const scale = toRange / fromRange; + + return (value - fromMin) * scale + toMin; +} diff --git a/src/routes/init/(components)/ticket.svelte b/src/routes/init/(components)/ticket.svelte index bfba2cf29a..3a5affebe5 100644 --- a/src/routes/init/(components)/ticket.svelte +++ b/src/routes/init/(components)/ticket.svelte @@ -13,9 +13,24 @@
@@ -32,9 +47,16 @@
#{id}
- {#if tribe} - {tribe} - {/if} + + {#key tribe} + {tribe} + {/key} {#if contributions}
diff --git a/src/routes/init/ticket/customize/+page.svelte b/src/routes/init/ticket/customize/+page.svelte index 6c039e2acc..4d06541316 100644 --- a/src/routes/init/ticket/customize/+page.svelte +++ b/src/routes/init/ticket/customize/+page.svelte @@ -3,8 +3,7 @@ import MainFooter from '$lib/components/MainFooter.svelte'; import Main from '$lib/layouts/Main.svelte'; import TicketPreview from '$routes/init/(components)/TicketPreview.svelte'; - import { quadOut } from 'svelte/easing'; - import { fly, slide, type TransitionConfig } from 'svelte/transition'; + import { slide } from 'svelte/transition'; import ShineSVG from '../../(assets)/shine.svg'; import Ticket from '../../(components)/Ticket.svelte'; import Form from './form.svelte'; @@ -14,29 +13,6 @@ let name = data.user?.name ?? ''; let tribe: string | null = null; - function toScale(value: number, from: [number, number], to: [number, number]) { - const [fromMin, fromMax] = from; - const [toMin, toMax] = to; - - const fromRange = fromMax - fromMin; - const toRange = toMax - toMin; - const scale = toRange / fromRange; - - return (value - fromMin) * scale + toMin; - } - - function ticketOut(_node: HTMLElement, enabled = false): TransitionConfig { - // Scale from 1 to 0.75, from opacity 1 to 0.5 - return { - duration: enabled ? 500 : 0, - css: (t) => ` - transform: scale(${toScale(t, [0, 1], [0.9, 1])}); - opacity: ${toScale(t, [0, 1], [0.25, 1])}; - `, - easing: quadOut - }; - } - let drawerOpen = false; @@ -63,21 +39,15 @@
- {#key tribe} -
- -
- {/key} +
+ +
@@ -182,7 +152,6 @@ padding-block-start: 0; :global(nav) { - /* padding-block-start: 0; */ margin-block-start: 0; } } From b782c98b72ffc1fa66f7e6299526b90102f180c7 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Tue, 9 Jan 2024 21:11:10 +0000 Subject: [PATCH 40/49] gh toggle --- src/routes/init/(components)/ticket.svelte | 18 ++++----- src/routes/init/ticket/customize/+page.svelte | 5 ++- src/routes/init/ticket/customize/form.svelte | 37 +++++++++++++++---- static/images/animations/check-circle.svg | 6 ++- static/images/tribes/windows.svg | 5 ++- 5 files changed, 50 insertions(+), 21 deletions(-) diff --git a/src/routes/init/(components)/ticket.svelte b/src/routes/init/(components)/ticket.svelte index 3a5affebe5..b481a95ec5 100644 --- a/src/routes/init/(components)/ticket.svelte +++ b/src/routes/init/(components)/ticket.svelte @@ -11,10 +11,11 @@ @@ -59,7 +59,7 @@ {/key} {#if contributions} -
+
{#each contributions as row}
{#each row as opacity, j} @@ -168,11 +168,11 @@ @keyframes fade-in { from { background-color: hsl(var(--bg-color) / 0); - border: 1px solid hsl(var(--border-color, transparent) / 0); + /* border: 1px solid hsl(var(--border-color, transparent) / 0); */ } to { background-color: hsl(var(--bg-color) / 1); - border: 1px solid hsl(var(--border-color, transparent) / 1); + /* border: 1px solid hsl(var(--border-color, transparent) / 1); */ } } diff --git a/src/routes/init/ticket/customize/+page.svelte b/src/routes/init/ticket/customize/+page.svelte index 4d06541316..e556529e6d 100644 --- a/src/routes/init/ticket/customize/+page.svelte +++ b/src/routes/init/ticket/customize/+page.svelte @@ -12,6 +12,7 @@ let name = data.user?.name ?? ''; let tribe: string | null = null; + let showGitHub = true; let drawerOpen = false; @@ -35,7 +36,7 @@
-
+
@@ -45,7 +46,7 @@ user={data.user?.login} id="0013371" {tribe} - contributions={data.contributions} + contributions={showGitHub ? data.contributions : undefined} />
diff --git a/src/routes/init/ticket/customize/form.svelte b/src/routes/init/ticket/customize/form.svelte index 2cb378377c..3d35ae405e 100644 --- a/src/routes/init/ticket/customize/form.svelte +++ b/src/routes/init/ticket/customize/form.svelte @@ -1,11 +1,17 @@
@@ -38,7 +38,7 @@ position: absolute; inset-block-start: -100px; inset-inline-end: -100px; - z-index: 20; + z-index: -1; } @media screen and (max-width: 1023px) { diff --git a/src/routes/init/(components)/ticket.svelte b/src/routes/init/(components)/ticket.svelte index b481a95ec5..1a26353d5b 100644 --- a/src/routes/init/(components)/ticket.svelte +++ b/src/routes/init/(components)/ticket.svelte @@ -16,6 +16,7 @@ import { fade, type TransitionConfig } from 'svelte/transition'; import Logo from '../(assets)/logo.svg'; import BG from '../(assets)/ticket-bg.svg'; + import ShineSvg from '../(assets)/shine.svg'; type $$Props = TicketProps; $: ({ name, user, id, tribe, contributions } = $$props as $$Props); @@ -33,46 +34,49 @@ } -
- -

{name?.trim() || '-'}

- {#if user} -

@{user}

- {/if} -
- init_ - JAN 22 - 27 -
- -
- #{id} -
+
+
+ +

{name?.trim() || '-'}

+ {#if user} +

@{user}

+ {/if} +
+ init_ + JAN 22 - 27 +
- {#key tribe} - {tribe} - {/key} - - {#if contributions} -
- {#each contributions as row} -
- {#each row as opacity, j} -
- {/each} -
- {/each} +
+ #{id}
- {/if} + + {#key tribe} + {tribe} + {/key} + + {#if contributions} +
+ {#each contributions as row} +
+ {#each row as opacity, j} +
+ {/each} +
+ {/each} +
+ {/if} +
+
diff --git a/src/routes/init/ticket/[id]/+page.ts b/src/routes/init/ticket/[id]/+page.ts new file mode 100644 index 0000000000..d456854ad5 --- /dev/null +++ b/src/routes/init/ticket/[id]/+page.ts @@ -0,0 +1,21 @@ +import { PUBLIC_APPWRITE_COL_INIT_ID, PUBLIC_APPWRITE_DB_INIT_ID } from '$env/static/public'; +import { appwriteInit } from '$lib/appwrite/init.js'; +import { error } from '@sveltejs/kit'; +import type { Ticket } from '../constants.js'; + +export const load = async ({ params }) => { + const { id } = params; + try { + const ticket = (await appwriteInit.database.getDocument( + PUBLIC_APPWRITE_DB_INIT_ID, + PUBLIC_APPWRITE_COL_INIT_ID, + id + )) as unknown as Ticket; + + return { + ticket + }; + } catch { + throw error(404, 'Ticket not found'); + } +}; diff --git a/src/routes/init/ticket/constants.ts b/src/routes/init/ticket/constants.ts index 5e210328ee..6fe4058228 100644 --- a/src/routes/init/ticket/constants.ts +++ b/src/routes/init/ticket/constants.ts @@ -1,6 +1,15 @@ import { invalidate } from '$app/navigation'; +import type { Models } from 'appwrite'; export const TICKET_DEP = 'ticket'; export const invalidateTicket = () => { invalidate(TICKET_DEP); }; + +export type Ticket = Pick & { + name: string; + tribe: string; + gh_user: string; + id: number; + show_contributions: boolean; +}; diff --git a/src/routes/init/ticket/customize/+page.svelte b/src/routes/init/ticket/customize/+page.svelte index 639743ab37..ebf63ce6d6 100644 --- a/src/routes/init/ticket/customize/+page.svelte +++ b/src/routes/init/ticket/customize/+page.svelte @@ -1,22 +1,25 @@ @@ -62,31 +62,59 @@
-
- -

- Customize ticket_ -

-
- + Back + +

+ Customize ticket_ +

+ +
+ +
-
+ {:else} +
+
+

+ Thank you for registering for + + init_ + +

+

+ You have received ticket #{id.toString().padStart(6, '0')} +

+
+ +
+ + +
+ + +
+
+
+ {/if} +
@@ -106,23 +133,47 @@
-
- - {#if drawerOpen} -
-
- -
- {/if} -
+ {#if customizing} +
+ + {#if drawerOpen} +
+
+ +
+ {/if} +
+ {/if}
diff --git a/src/routes/init/ticket/thank-you/+page.ts b/src/routes/init/ticket/thank-you/+page.ts deleted file mode 100644 index a816c9ceae..0000000000 --- a/src/routes/init/ticket/thank-you/+page.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { redirect } from '@sveltejs/kit'; - -export const load = async ({ parent }) => { - const data = await parent(); - if (!data.ticket) throw redirect(307, '/init/ticket'); -}; From e3206ae723c92c00805b0b24b2a61972ec08c2b3 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Wed, 10 Jan 2024 18:55:00 +0000 Subject: [PATCH 48/49] svg images demo --- package.json | 13 + src/routes/init/ticket/[id]/og/+server.ts | 844 ++++++++++++++++++++ src/routes/init/ticket/[id]/og/template.svg | 807 +++++++++++++++++++ 3 files changed, 1664 insertions(+) create mode 100644 src/routes/init/ticket/[id]/og/+server.ts create mode 100644 src/routes/init/ticket/[id]/og/template.svg diff --git a/package.json b/package.json index 233abf1588..7b1e3eb65d 100644 --- a/package.json +++ b/package.json @@ -69,5 +69,18 @@ "meilisearch": "^0.35.1", "motion": "^10.16.4", "sharp": "^0.32.6" + }, + "pnpm": { + "supportedArchitectures": { + "os": [ + "win32", + "darwin", + "current" + ], + "cpu": [ + "x64", + "arm64" + ] + } } } diff --git a/src/routes/init/ticket/[id]/og/+server.ts b/src/routes/init/ticket/[id]/og/+server.ts new file mode 100644 index 0000000000..8158452e85 --- /dev/null +++ b/src/routes/init/ticket/[id]/og/+server.ts @@ -0,0 +1,844 @@ +import { PUBLIC_APPWRITE_COL_INIT_ID, PUBLIC_APPWRITE_DB_INIT_ID } from '$env/static/public'; +import { appwriteInit } from '$lib/appwrite/init.js'; +import sharp from 'sharp'; +import type { Ticket } from '../../constants.js'; + +const getSvg = ( + ticket: Ticket +) => ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${ + ticket.gh_user + ? ` + + @${ticket.gh_user} + + ` + : '' + } + + ${ticket.name} + + + + _ + + + init + + + ${ticket.name} + + + + + + + + + + + + JAN 15 - 20 + + + + + + #${ticket.id.toString().padStart(6, '0')} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +export async function GET({ params }) { + const ticket = (await appwriteInit.database.getDocument( + PUBLIC_APPWRITE_DB_INIT_ID, + PUBLIC_APPWRITE_COL_INIT_ID, + params.id + )) as unknown as Ticket; + const svg = getSvg(ticket); + + const svgBuffer = Buffer.from(svg); + const pngBuffer = await sharp(svgBuffer) + .resize({ + width: 1000 + }) + .toFormat('png') + .toBuffer(); + + return new Response(pngBuffer, { + headers: { + 'Content-Type': 'image/png' + } + }); +} diff --git a/src/routes/init/ticket/[id]/og/template.svg b/src/routes/init/ticket/[id]/og/template.svg new file mode 100644 index 0000000000..893e45a9f8 --- /dev/null +++ b/src/routes/init/ticket/[id]/og/template.svg @@ -0,0 +1,807 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @eldadfux + + + Eldad + + + + _ + + + init + + + Eldad Fux + + + + + + + + + + + + JAN 15 - 20 + + + + + + #0013371 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 71757306b16dad2a19d1a6e18ab9b766b15be325 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 11 Jan 2024 12:53:08 +0000 Subject: [PATCH 49/49] working og images fonts --- .vscode/settings.json | 3 ++ Dockerfile | 18 ++++++----- local-fonts/AeonikFono-Regular.ttf | Bin 0 -> 79784 bytes local-fonts/AeonikPro-Regular.ttf | Bin 0 -> 141420 bytes package.json | 9 +++++- pnpm-lock.yaml | 16 ++-------- src/lib/appwrite/{init.js => init.ts} | 0 src/routes/init/ticket/+layout.ts | 1 + src/routes/init/ticket/[id]/og/+server.ts | 35 +++++++++++++++++++--- 9 files changed, 57 insertions(+), 25 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 local-fonts/AeonikFono-Regular.ttf create mode 100644 local-fonts/AeonikPro-Regular.ttf rename src/lib/appwrite/{init.js => init.ts} (100%) diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..26ac805ee6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "testing.automaticallyOpenPeekView": "never" +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index e12c43aab9..b670ef9822 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,5 @@ -FROM node:20-bullseye AS build +# Use an official Node runtime as a parent image +FROM node:latest ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" @@ -6,15 +7,18 @@ ENV PATH="$PNPM_HOME:$PATH" WORKDIR /app COPY . . +# Remove the node_modules folder to avoid wrong binaries +RUN rm -rf node_modules + +# Install fontconfig +COPY ./local-fonts /usr/share/fonts +RUN apt-get update; apt-get install -y fontconfig +RUN fc-cache -f -v + RUN corepack enable -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install RUN NODE_OPTIONS=--max_old_space_size=4096 pnpm run build -# Node alpine image to serve the generated static files -FROM node:20-alpine AS serve - -WORKDIR /app -COPY --from=build /app . EXPOSE 3000 CMD [ "node", "server/main.js"] \ No newline at end of file diff --git a/local-fonts/AeonikFono-Regular.ttf b/local-fonts/AeonikFono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ee3ce9bfd94fb63a1a23283553763e670f89cb4a GIT binary patch literal 79784 zcmb@v2Yggj`agWmon%4@>B*!glSwj3NT1A1dhfkAAPEp4gx-rFh%^ytA{JB-ds%x0 zR78KS>#nY{?yifgVs~BLwXMst?!i0*J zw<%{Q->gM8@3P8(LD*ckTV-cERd^T(NX`7%g%3 z27aF~Z{fPR>Y#^Y#sViW_U8G4IWzmi-u+EEe!GZb8o&j0noAYx%fR>Ofki9Vwl3W~ z1K;0gY~n2om&~4N=o&u9m~SRyE^jZIxpt}a1e=E6J8^&H;+c!)Y|GOBA7h{4>!hca zE?Keibm{6F8T;;OJmUj6a4Rdi_}zQ6dOdUh#U`u1#ufIF|LI4q$KlN3bX9}u0KQLP z5?#d~o>SdFY{2Il{GO?55H%^kiBD-RUBPE3o2Xn6Pf>e?;yb{VO8GwKisLScpsi7k zyocrTa6CKN)kUSEdp9#y!C2%9I;X#qhSqX+icJ|Fw!m;ddkdF+={GJ*Cvk{mD(N6= zqY`&SN)GGezpz&$qK6sfHP)eq0a3IsM+xjN<+fR*E{BQR>987~kK*y*pWe zv>I^Tit{5lW}t+kJc{qv-}a~<&a0_!H2aZHzrS)x?Pa)5(PQaPSq$Lgg5aWqQxfcI7Lj1j-r z^FOmBegxl>aejuysUmQ13kv!ro?D0e|AoH0;l4lOzIs+Ac>-rg(LQJHk{8Z>Spxro zRqog8D2KI%< zz`oqWCfLS+#=*XnfmR-2Q^h#YSXc{g|?lC_Ejbe@voeEmTTp@a;Ib%D1!s4WS+%pNs ziD=6MG(>ZWaCxaCjV8M)6jH&@#$J`V2?|h{Bh&dtV%~i^C>LTM)crRqbO0oc0OD(Pm-)tdotG3x-GH{+OuV-k2|iqr$1No5!KO&i9W z%4z(z9k5dUmn#ba$K^{Y?ny_9vXosoPDfFW)CSez0UXdAq4{k;? z&(G*wk2V&ve3UsTRVd{sdXx$jx}J+d*XTT7;A0_hbmfKcqx&DqmEcp{!(&(*FUNXF zr621amBpa_#mp0HTe>KBVa>h^=d|uw=8{+ou^w9I3H6H?g7z^_Xw5^tVm%x+XEgZD zI&c1$d+9k^Q;BYsB4i<)6U{2Jj3U>NY(q3m_YqA~sg>4)ewQ;}X&(y|NBX`3_w0j= zLdRb-NOsH>g(N%3%*+MS*>XjCbbU!k#&li9CW-4VSh*Nm2$|6pSEsP6+0(p|U(FBj zAt^-qwe+Ftpz1-@DUX8iZQ(yf#zv+_W=EDrHbpLtTo-v=r`l7WgOKU45H%H!$)?To*)~21N-KTvvN{aG~3Kp&P zp|ztikHwrqYeQ)5A-%7Dvwjy^a~&QY{$=>{;a7)G55F?}=y2KaRQVct+0coh`x*Pm z@6-1_9boK}%uiB3(SH(hZs^>Fb3Ze7?md(x=laiOoHLwDKgU1*0ubZx<8>cHJNW4H zzXE?B{P4lwK6vhfogYkL>}<~2?6Zk~`i+8VO!#U_960k*HhjY4iw^9gSkr*8+d=ris9V(pe z#kfQs$N4olzNi#_EsifMg>Pj{8=w@9K5GFx6}}xu;DQR@fnys=7tVL$2(4F(e)Ah} z+=p^2&iCVpanwGC^TP~_no@|KqFj~2@5IqlDMVjU-Y7n}|0s^YB^9E#DBzL`NB^Rx zDuv&JBWQ#QzZb_or4Us{^`p$e_4{%BKc#Stc?{}}xeM1H!tpVs5aq@^iSiV#{|ZOI z978bE@25~+!TA$7zNr+B`(i+MF*2?{%~))*QaGNAMZK{P<2s(#`znRzf!<#!m=8?9 z83j1wCve<_ascPA;Rv{>@V6M73j9nZdViboA10%?$*wb7gAg2CKqEaQn%arBj#(EHPfpoB1$b=EwY50MoEQ7Q}*C2n%IlSUn>>6D`xSePJ<1+uPq3%hGvF)F zvgg@z>?AwEUSuy}F0Np6*jzRU?zfiR#g?&!pzk$o0jOsuyA5=xYy&vP1ME1vhV`>0{1`7J%43V!M$G8hYzy1QZsxw+k2tR2vEaAt1yIZ@Jc}>j zoB4c56ZqqE*gD?FXJhVfWxLt6>;|@r?PdGeezu3*#17$>gY0&82RqDu;uWx>Eaz2N z3v1YVUe9Xuq{Y%v>7?|fDpHlJTC93V zby9WFCEKOjWv9z+E|0pLcDdkM>)P*n$n~V_S=S%cYIVB0THU8!uRf^0NBxreJ@t9F z0Jm1R^=?nPz2F$m01MZKyAD_aeMB-oW zl!a4{P5H<}@(A$Q>~YNFbI(}MV$WvJKF`}dAM*U2=ht37Ue#WmUdz3+tG(a%@$pIbY4us_^Qh0~zJ9)$zRP_N_&(|Tp5Fw&SifSwe!oM0C;h(n5B0C~ zU+w>_|1SYv0rde(0}cc{AMm}#LzAjmsCiuTb6{@Z!N6~WN`npsoe7>4TpWCL@SDM( z2g@PhA@w1BkA@kejA2S0o>od1!-jn%e=KGmn zW~sAcv&yqJXC2S_IeSueTy}PLfA&k+Z)cy&{v{_dr#)wB&TTpGX`5yU|`8)HU&i|-jQbA?G(t-m8-xQh(4-{T3sw}#*=wk8O z;x9{bOPWgtOE#C>Qu2Js*^=)|CzOVlW|Vf9ZZ3Va^cx7w;bnVB>dtS_%0sK2HDy#}v_&W7C$ziaer>}x#G_;#b*l-;zv>Di_W&DG8On$NZPwbZs8 zYzD5I?v>q#x{ptrFs*vp_Gyn#`+9ov^v>xAr~hgC`5B=z24_4n z^~`-UkI(#ZmisKztc9~S%-S>S&Dm_W&+O>gnX}7h_s!lt z`{?Xbv)`NjWk2f=?l<)>?%&gYXaCdvzw7_B|H2%fIf-*h=S-io0o-mPYaG5&DwW=W z_MyT0qQ_d2iIt)r>i~1rdTV*Q$*fcBqB0EW8bdPIMXCJ)4Cy9gMl4SK{Q^u;8R>5R z2BX2K^Vi^L*173*;zGI!_ZVH7o>G{h)0%He4h@fq316_WJ~y}KZ-IeBdzIxKE&5U|7E+Qs8t}P`{gH^h3_yYR?_74?F z#%7($AVtMym<;IwelM3yneJty6oZ?=jN-2o z1=r2E@LXwd-=OcjWx=Jv*P+*#r0!hu>`73UMTJ_$H}96$eRx#rUb+ z{B_1;t~Z2pWq|a_+?Zi98x8*9T%!|XhXKWuPqtV;9yQN{i`}}zmmUrh><(V?ly`!mbuFN!i zLAn?Am=}~r2La9WB&X>xu&bJsjI80F=+naV1|)kPyq)Q zq+Y-f0W27R2VgWRg@aPhN6OqutnlF>ilK$_ii}f-a zJUGDO%Vxd!BIft3EvNWjPc3|Vo|apsv!~=}+r8D0 zem(`wd!P|Fy;*P8=nZaWjhn`e`_D5D-Ws}3Dpl-5kzqmE!s;rWdqj!~-X01;_ zJH@clsw53$R2HKX^A~g3U&pH(pMSpbg%>Jct$OvzX}#b}LMzF&Td*Ig(R z_-n+R{VnRAz*vBlt{zZks#=+)ocRqOKXs(O>ptoSy)%}`X;Rx!n=|LSFZ6$=WXN1@In^mh{KjKi03kdPP&8$VE> zQaCq}jWR%dpP}NK#Y;A|@Q%vj=9=2PjLMpZy!>X~!Z*(vxGIM)oYYp+y?FINX+vdB zWfCt@VO#e4p<$HNk&%i+I(9pv* z{B=3EjvteurvX;u@P8#B1=1(I7x>x74&fr|_H@j%grmc_eYHcnp?@+ItvG2ZD z2D;3JH!XJ4xVU;G=WHIFyREu=Pgi#(j31nE!vBN5sfpurP__TBrtu!U z_jOO>gC5h$+7~WtFPZM?-k#esZ(d7I=ZzT!1sR5d0@qkUQk6?+apnHA2rmPKuMOoLZNQIupvzPw@Z#yB;ALgc z-uqtRc|c7kFeKU*^O}F7tgAlOnQdE;EmK^l%yhm?Om%r+WL+)=&p9WahrP%4ylM>g zW2x#|doE{l^&4o%ZFP}w7l594|G+>cJuSF zBdDOsGa6rS;#}wDHvTXbzPw6)mw2OHUEI}}#EnW_Me@r~VWktT`}eiO5G1kE;S2EL zp9YVL72Gx>Uou-oES+WD#Gpw2;9ZK$!i$?c^+Dm)6dxA0 z2`2&gSdKa5MysMh=WBrcrS(-AmUNw8@Shna@+W&%eG8si`XWCnKZcQL#QoX0e+r(2 zq@~q)E6cv%gWTWJ3zhYR=Y99(k~PZ;8aK<|-B?;tUUuW5rk2)5>E!J8<+1LK6}|JN zMW5uDj5+eV|I9b%6o77tXI+p6FisjftZ8(#ieR}0Zm@3i>AMf#v1k7Ee$%6`>t8h3 zzbj_C-){BE2Od1JVaefrTes~!y!0w%4glUkz&n9f4lA^3EFppq@r1KyZ@vG1`SWX6 zu2`{BI{D&VM_-Z_4t>5?-U~RWukLsjYjZsJ29s3&N$zqfe@uRWYvqsm9O-1^xyEk= z+_+!Fh)g6*TJOKVgFh-i$fM+saOXF4i|F4xL5Cw$Vb?#bXyEVOI=z~A?mT?U?nS%& zW<>0tJ$GPs$E-&pxL{wfysrZ6{xZ0muT+0y}uPLB(|{ zH-e{fV3_+3e7PErT*EiXXJlA_$jD1L=bzviSAlc%fqx<|>EIx_p@Y^sm*9737u3fP ztb#gkl}>e}VeTUj&2G4({7zK4m>(D_mD1$>e2Mj$ay+Aqivff0t>gE!w(^FS7WoO( z{G}9(`$I6?Vr zu6k`X@0EY3-cV%+gAYmiF#$OkoG2mg31A@Rd(kX_-XTPdfC#Q|4oT-3q)#gdD{NFC zlr@7hvJzt5g93Ak6Vm;nlL2nqgu2LB0r0W=c>-V!DfaiS3yaFDShod+S_STWz)ka8 zU|1}WZoWE|PQXq)>i&)k3%0bBADwmcowt{_wF0%PW>qcll|SWEL?`m|ss(+K&QJhc zLX80?N2Cr#V**}n5(3mEtbe?E{Xv%zb?Mr{CD*HM+R}CE%?m~prLM&*XIhn{JEpBr z=ovDOMD&l<0y7J&VQ!A`))Vr=NYMn>c%Q5-Hdw# zZHjwv8));Fxhq?y4K&Z0*0OreY~21dzg3+z=6esDj@u-IX`?l z_vxqmKmB3etMFd6$v<#U`3d<(9*eg8@XR7SGePu~3xN2d4q2Y_o8R^gGp^z<$oKJX zxdQiMx=VSu7xWJqSO`iGdGm&b`8Ihc|4QD-_Z3JBA4VsHRsAWl;Mg`hYLj!Oa%ZB!3~Dy?9*c1e~R#j$Wk>@Cy>xb?H1w{=Myy< zCjMrPqPJ|4GI%=rh2OYN4>h=Gd7qTA6P-}zag5{wZJD%o(pF=w8dDBwa+u2&;T*b3 zfZj;zGpQ%iug?OL$jIJu&^a9-_< z8MQStW=JmAuV1;pwH^%Y`%bxF{(bWYnp+2f16mI~(HF?OHYs9c>Hui5A|@`~v1`fn zRbK6rt1_#mO{+3hxp#Q3Ro}2?)&7}nhV1#REdyEUEi)~+nF_oqFcLSkqQ;P}$e_Ru zgwVeo&hG`x;L6~pWar8-3C0Lj4x{^R^Y-lp<=d|b4}Jmuh?=a@qMG3F9L!1uwsdJK zU<-uhjd3&PI#GjA*z&9<45yw?t{9rVaZ>A~=E8f;YaKCgU#A@MRd-8j#$CBRPG|s} z^=Qx&aQdJnj6N18L2GmZ3gD%^3!BS}%9@&+vm}@03+1z1TV3DVB>x+O{@*%`4eVI_ zY3V&>{ZZ^WL_{j<;%wmVrs$ZA=zzoWy4!C1R_cfj3672q4jp>8riKqthb7F-Og&Av4b=?2ED*@g<9Ve| zQRtK4Pv{0WU_H>g9c^yrUITyrWX>~SjIx1y{z-oS`vKe^hld`+{ops4d1CGx4ct$G zxTdB?iX}LedjEuRfgI_KE10v?0%sape>Em4wYIxCEjcZ#c~+{qxy&u0J*mtmU2^H~ zke}n_8F|GS5cbQLm1WAWbJ>)e5M6Jne-i2+Yb-P-UfjL7xvZeH5mcTnxhz;QG8kMg ztFg?J6g=-ntAz{c1X#pfEE*y|cJ787&fOqCf2gPDP>*{5*ZcQ>T{(Eq;NU%C4C)be zR*GjG`2bOYW-LBHGtG$)$lpk>H{0<6;%S+Jj+Ht=$2xCPC4?cvVcrr~ah|vJL)kpo zdEUa70o=dEWq~8&l43eph7345WG-&5yh*-)`SMe$G%h#Jsd!G%S$jM13p)rui$10Z zzGPe9lU4d;m1147aj9@g6YfGwyvLlYc&k)fU@G(UP7I7pE6fjH*3q?0-RfGBVJh;D z*XiO+*}8yL>gmnN*;94C!Jd;E_}(DIh#eTiz<@2x}pK zK)Qi=gO>0i*n=>mdHX?n;t%Ys%-gY}`KhOZwVMmecyi6&y*2V5A|dZ_Rt4S)sh#>C zGr|dRCRPLfC=tip&PC0od8PIL;uB@5w0gk`9xH!bUEf2`gEGYPc5*@1>|b{tyQ`hc zaxa3ea1Y4^ThWHIT=0)sOPky0SI_OLUp}iBx6kC$<$L%MS)!N^Jcs-Fzwn%xcfNW9 znN~6J7WAHerhnUx-e+I!zmcoYpEz+|zVKTC3+RL6e!!$5CxEGdE5d{azj0Z6RFG%T z?>g=|+VN9x@*6b)vH230=kuF~9w|;mTUaIe-|(!1jKKdU7x4=DHU6OdJZ~xH%W8_D z7zx;_u)e>H^*s&G(OmV5;3UGiksjzN%)Np;gE$L>c&ax-NKN5HtQe7(2NTm>{9NPp zu?eo2QHg`|n)+OPU9t+-yZXBHHO-R_BqjKGcWJ!iO%vU+rfU4UynUu7R@RmT`1N@E z>En2*s?IZ@$4^sS3)t5VA7pP@ZIj-HH=CQuGO5TQ4_ILICtI%qqt!sCKqG9|3XF<4 zZGoRZP?!af0E_}_LaaXC4pvuQU&`b3e%?KP0VTDSiBkctpJr;7+eA~mw+7%QBvsZH zYy5fwJnLv|%HS1Yd_Bo+W?^dxm!Lfv$R0;7gFRKHIoiy~IN!p`(%kr>^uYWNYMKMX z0voEEV_~d-Uje+Jq-2ouVrHWXcy*t zu^xfP#wdb<;=jN+IJ+!(5{V2Rv+8R5mM!nCt()ax5hadfrC0Y%>g;siwQz9vl-{0+ zJ#~saK{!VJMSu${D`ZQP9&|S{`AN$1_k&vmoFzc*<|-A)tlNEB3-({QZtb1FaZ-!_ zw!#)S57n7BC&tF}dunH`DW8-O80|e{-HQ2p8VY>$86M@vWl19VLxLTpO)5dmYY3t< zm>HIKP!n0(u|#NKZU_CrklaoSG0h!nhxGjQIQrgO&8jF6g?#`A4)UAUfQ|4f8D7MGt8g zm{-9K<-4$CetXLTmu6LNT6(T`oHjBcy;v7Kzi2^c(|ng^DLXYIKW1veRJ!=Y^a+7p z$$pVhelxs$QbVExdHjs2akZr_jb(8O@iCgn0QZURUf~g`;l1$*RdhK%K0Z1;&f8sF z-4R^l8R+Nksh%*=Ex5`z%-h#(5*Q=(X{%Jpk4cY#mjRo;cDAr|WnK06dp;mMJU|m3 z{!C&-L}Iv985W=k3)2LIg(ZgLK(<_xgO>s?ZtxR=UtvY|!iwzWYSYcl)_QI04k^lH zE_&zUks}w6%Ad~NxN+{BjT`&R+SL(Ss#YZHhrY0176i%vBzs_@Ce_eiU@4ejX z-uvVq@9SID-L zs4qX5iYkiR;$p(}szR5VoT7@5DcbDN`l-f_$e74a?-t`+;Zed%N=}$IIv-c@J}WV zc#b0qX%RmMlL%}p@HLSw^<0B|f*)M;yrQpP+DGJqIN><{q4X;Fj}Q8;M|}dg9JxcL*JiAihKXj{8cz`GkjZzKI`_UU8O{ z)fO{4TnwgteSQ1-{?MM8*`CQaO)D#(KE1pw)SNIiGjl2^2z3G;!JC4EVLC0OgMW@J0Jk_Y#MjX-s7eNtp#NMuGq zN?Lw^uTSd%{&Z5GPU{~U8LCnz=NP93#QA!ZD1D9KPw@aR+0|mx*PR+b8xzs8=?)~NRJ3xn5)+z0+Azj{AsLzpU^1z65mzS7 z@WF{P*GcBIfbC4IK8^VNhns3~VOf)L-DY;;_-O*wepO|dQR1*hukMtVp zN#KTB*C4JCtClnD8rVI!C|F6%LT1&w+4bmT(Qk`nZ+!4l!_B)2Q&SE7{d}*bmxz>u z4XILozAE|I=aQb>MsbhS<{h>+u{w{_;-#o|1fe6%_l_pyQDBTs*a{v#$2`>|k}?Ip zki09WZ`U#LGd|Vxv2eC)^i&AcDN`X}6dEz+R$tKs@)bdcR^%-RGJYPC8+aWS7Ly{r z(JE}t$5gVog#yQN8CfK=CE_VcTkA2WgGjFfL)2@*3y27ag^6`gIFsE}2EOSh@}QM={g_oUtE9^m9c_v( zf;;Wup|%%alpcyING>W$F1jWrBs3-_G~_q%uPOexpTztns|7inj5;?sw{d3hhdReU z=6>=`Z#T5@On$R`;S2e-hacv--!?u0KL#98yhOeR<488cOyNU=Eha{YKv<0gj}@zl z;JVhJ9h>WkPlp@LcjL@S#C_uhEB3o)kDZ&X`tba96Jm%XgEhCgow&>9ZbO@j@4#Kq zFSxX@$ddKg@{c!xe7T2%>r5eFi~nrY^JW8Cj&0Akf_zIH9#_cM^0;05YSQK{lxttb z2MXz)b*RKjyP_J!zv&KInglsD(n?7JaY9fPIJB?x&jI0K$%@bld9}vAYSkE|Wa}$5 zeEwT2u6!}YTN@;;O*01h zzA*Xs#>Son(&_lt>DM1ST~QI=+H>9AuT;pN%_!pQGxuNHTPSbKJb)>UIU;=&dk9uC^2b4a1@V$pG}<;|=WYFl7P@OL<8hTv@7y_b-FR--(QweJ z_&>nG+puWz%ej7~(>r9ZD}+N0ZHH{*VwKhSUO7tmN@WqQyc|}tX?2#puLz!(Fr&=0 zcKeQ!!C`-v{s&BbWhbG>61V1>%K^G|L~e%=KlJNyAXa#HjP#6wjJ3 zXI7+U8K&kHeLJbTWnN3~{P`^v)lHmh2iogfnwqX&?D=>_(avu}wo7*Ba2_Xz=IabGNGwpU-~thJAcD9K8%?^W9rmFhSBW_o;7ZJd>XMS?{OR4AwPM!_SA^cz?x{~P2)GYUSUV| z<29^!H(h2u94)3|>;Xq=|7yk%^-tg#lfcEQF;qm6lL zaecptkv(Y%u~3#D5nbW*42{^xGdvEXQ*M2TmI|k5NY=Ju-7cV`Lc#Dx%ac~VZVBfA zbmXId8u%mm05NW3%Q8054>?FN^DMPGAq9NRTE7x2l?2;<5Lqa>)!hU}0HHHh2%vg% zfW~YKF`&uzO~-B9*Dl?4{p_xS@WyqK(-MrPLc_Adbu(s?TTQw?Y4clG-M(|-iXFzP z{DRDsApi8B$n2p_b6V;vw2ilhh^T;eigE_StMQ`i*48z-9grhd+Z}Tr0ktTnf6g0itOW1k6GF6rZ`1} zjhU0xLhn#d&W=mfLpHY&$=4Yqi}hluLuJ{pybUe32g}w!!fQBLFUQuuoU7*xoOLg6 zhnAWg3~)maI<%?G@f6D(4<+t0<{TG$5A4w6Xg!H=XwaEr_d2vlvS%@}_Nb6Ek9;@e zhp~G9U|A&FJ`_Af-i4ttDp0Ep4AyFYO`e=jEMNG`kwL+ck-)NRlS2gd#|j4nz%!B`4fIDn+a@hEbs@m|qU{30^h2 zKCz@c;8@=d`S|GS?CMifB%)>YP>oTgWyuI}s8wNWCq`GSvcRdxeELgJ&KT`DE(xv< ztvL~oylZs36888ZUPj;MINHdCOf21vIuxA{Hr)R~ z!?+0ze8*Q`PV~Jyf9T6`gp=x{CQ z&<8t(nX6EfC`g8U6b4_2$=EL_W#`u?n;VMBGl5M${co-Mc4uL-K0D{ci_}X~aWTdWGSrGcBf9Vxr2&_*JD~^^V|2sTj|0$kp&c>N0b+5N9EH^)QaNvoo~ZmSVapd!JN3qj zFHaG_Oj?Sq9kpFU&clLOB?LuBhmYMUYml^V=s38wod=S(U79+6| zL7ET?5uc_s@R-BiHvv1`$@W{|EV9r`VqNp0$bLJCgs7_kQiaGqKsa*TF>r5OUAFw_ z7~2M74;+w#Y&!>Ny#N37_t0EJFChDZMrqZt3Q$6up>RC}?1=y&0kJf-t3E-cck&O%)!J@}5xpv6y0 zcqUtkJG>Rb$Kz1zc-udC)JQwekJqJC4#SbIaE4R%J+iSM z-NnD#_HSCph4xKo#U6$c&VwED<7{Z*(MlVC8Lu}s9wZ+ct2gKXa>QgxKA>IN_iA0a z?FNXJR{kC>sC5Vvw{1Y}r}Z-n8zgCD8nI*wU4qtb+K(ef2Ub2C_}Fyr?`Mt8wk7Tu zYje)zYI8z-VqSf6R@UIAF*fOBcld^-gvAsk>&<5Mo~8Etb*y7!^))Lz&tY7;6eeV} z9~XszV)|O9iiQ6Womp*GZlbEojK^<8h)T!pv|{)>y)wg?4oZ7l6icrox4o*llCZ4KPj@*qFqH?(PpLXiv7st(tDO9p?n>@ z^v0!;{<@Ev&6nx*?2*}Ad5NBnh|#LCyKmQjci5m(#cUqoQdq<;zhx_V1dheyV8X^! zZoD)$XiXyiHVU+MV>`%uUYPaKX45FtPl1uGUza=N7d90o4C->Tow+c~Iz%W@S zuBem61!;|c8K;M*_ug>nu3=nhEzA+~dL%}OBqZx*`F|*r_)goNc`|J!PnVPiOqhYB*tA`f1ll+zkk4KC+``(@lWtEJC1#Wt7ng6u9u{l-5XE&wLC+Z5UTYVL^m}JJ?LRHi zKgA9X!R>azKUVuX*)Ah5)y9a${kU@r%@%97qY)S`M~kuB+6Rm5Mu~6iauLUF<+k^SQf(yzil_~N+kW?tfO$Q0XCK`Z55OPJy zAa3nX6jH~2YfcCV8A9d|xgh`(>QVNrV$4Q(rSBNkA!m_g1M9ZKmRfgX8|&ebeXQH9 zl@pk<9o>zV^Bgd!R%Eb;ErVxOFm+uc*rPci#!%VkX16yrNI?_!rds#VQv66V=8il0 zY={Rc*)9y;UZeu?>@`<)9KNGN4(U+u+=_e`&&bGp!S`~5{1#9EzcAih!(RX|r#upr z@sIN7SYkwxW6N?zRr!<2Q3)lciy)QL?Wqz zvTs?e4g3?}P=!$wb`%J#SQzev$>(h)2?@pSz(#hE>X(##&R7QoKXCE|M!^?Yp-`1- z^^T$G%C2XD6H9&*w1KQLs9!~EsFLO6BhizggYrM9|8c|lmVMOVHzU+4?zilwuEGP# zj_QkB&}&N{K)0^chf(#vlM`1*@bj|=EbzaMdnXb<11J{fr3{4q8&CI&$U7F;0@7PW<_@{zVgWIdj@ws*w( zu+pOZMGRfQSb_pLbTz?wDJ0n2&1eSl%>GaCY5)g=&m&w)autH|03z7B-uEvzU0MR4g!g>cU+#{VIJkI6!an?!HP0Q zM8ygWGy`lIY<4JAV*y}DXPrCB-gkmwbo*3+!wz@@RWfQ9{7|--OUk$tJ`^9eqR-i( zWU;~z6X`DVm(yXwdjMMSW{@zz(TvFO5PFXiL$X2}h9VXb-nF#Q_on z(gsWZQ%i1rWl4Cb{8Ve}F=YC2DXORsiYSu;hrYl=#3!ID6Rsd9i9JbR$Mz0qvYt_T zm~GW%;lb8~0R!EO3y1~txk~;9N*Ms?ZWinqBTxFn8WqVIN<6UQj~pEj{4rUJb~y){ z!eDgkSh1x_y(z+Wr1-8$B6Rj$3ky`RgEMtb{!qs#|EU5a$tITQXgeDYw7${6wu}fC zIZhzk8HrS*A-BR!a*LnXH(@WijB-WWS)z;%-LQ!m>#n;*%(T_VP4k*ELO@2RNknZpkH8O>>X$nLkGdUQ|KKwi162do zTFUDRE(Oje+$)58jS=4XfN}s{^iU2S7n)3S)#oD<1+N~hKh>(yvpw;*0hQsuN&5{+l`&JOT3;a zFWMpRnc3FfKfASq)&j*&oiBK+x6n<96=9-cnjwLJL#8QSNv!r8=X_JjGCW4oDMdae z*=2U=xeG18fUXpF`%2p+d`;(ppS-RAWvF&z0~jTnd$S78d}VVRYN$W-f_B^VeNr_7dR>yuu77Blu8bf27raCsaFO zv_<^)rBL#aY`!7v_b9#p`%($p@9q@tjuD?|_0XXsKQ zj~sGYApiDQv7ncs9;sl{T)U`H|Ap6FGR@o@9m`##tvlQ%UOjv4lyk(#DF02S$bVCK zdAKf#K7Mw7qdjO{^RFa5&cWhlS6djXTX*ecQ{_0!J3(h7e#pxpkM?QKRd~m3mmxIr zevV6MBlAzt*%&Zf5>W((UIF9gE1iXkuk;EDjdEOOiu{4Z>AaCJUNHQT{gO&bLEh;* zd1QZNfG^SuB4g;m1Pje{i&TS@A1_nnB!c%KhLX=a)rGy6w4co=c6?K07k^-$eYFK9 zOTwa>8e7dSg+=zci=gv^nJTtS58`EtUs-`t$J-TLZBX(bT6jFAK@@vc0NWqH1If;a zCCpa`lY|32$k8($x}uL=<|L`;z)+H7`XtN&0RzNnPt>F&MzI(ybw(-YvrU^iuDa?o z_;Y@)me26y>YuS>DY@JzUlXJ>XtijY5}qnAFA(?;c1d`X<2IxDZQBGUo_Qv?rlzoL zY57{p-n6!SNhF>|UzB}5WRtvPq$4CihiyKiclphI!nyz*fvmK z(h?n`_P%pAR6gwxt>$R1l$VVPROp75o_1dSL>bpR3m<$a^Tvf-a}2-*#8FV&Aid)bKgkZ0Y#WixUPshpv;!b&;= z_H;YcJqC*H-O3FPpxcxN`J{6Xtoy{)L%;SVE8U3oawLlgh3b%6X|V2wn?Jc@ zOry0Yhb>z%e6W=}2HP=)COdV=66a{yD?(WXY<9qrUE^bQtj%smNR30!oVS0-dCna~ zE7m@4#+jRS##=Na$9}0TYRl)=KK)y0Lu2+sEo3M+lHZYdMi&Dg$QZEyXU2*GK5Iom zn`3n5Y1DfiG6p)QQv+|P1P`V-O48s6>7(4$%1H3S?lw)ZcY3~sVi}0bD{#5{q{uEVU3e@*p~^8Z67N8 zm{QdWrnSZu} z9C=&NMxM|!EH*sk^dZ*i&$XPCiFx)JaD^Gqng&-AUhuyO8Xx^^5}vKF&x}Xne!ew5 zp0!=_9b*hfX1QJK-NM9w%D(*(@9-N|C;+|%j#2qQ?dpmZbscqp$Li-D+HQr4>aya) z-iBvakwwVsvWLnNkzs|%3J=jI{2~^a!>*2WMe4|MfJTU6HvAwzDDsxYg@g_9?!O( zk7YTzk{xsW9kk7N{;%8Sq*FWOr>wR*fo?~pa$VDv$Z{*KrfoVQnm3ag5=6%c>xsp#PTiqz(t-k2)M{)EetG5R`43K z)IcN_rWy3X54IU4k0|6~?HDq#c-B6f=n>RlFA~c?(R%|HBQN#ypl`K}hkK7mQj)lPn<{O zyW*9KQ>9sP$4Gb|yPoe*sh#=Lh{VH7tr8A4p-Oru$wt677y3;Q_#3#RD`5&bkTk-3 z%!9Ck8q>?+-F+ijADbWLtAwPXKU<_4ez)|zn4e?k1FCi2gCx~BY&)VpN_dC7f&UA5 z5$^@D+F;LEgcr#G*+RJw@|;wK`&=m!0@*1M0nb%hscPu#hYLQEzj>VZ7f2h2u9aej zz7>5+$Nj0``B;y%q>$K_B)n)1sf*~{K_akS!&UF@xncXdwcB^^ez(wk?>(l%#(li(-T{Tuu?sjEE4^o(^VAzcgOq%Z3 zlo4Cu-qKu_SI~ge$~84j@yXhN|46UPKQwm^cK%yl=1*!CMYdv;m7Kk(h;rOQi-H0t zR4=J{x~E@AcKctNJGopVpYZpnnZ`TiI;6!0CK`wDkV;fh7(p(yc&0p*=$fC%a+ zB?drt0FE4&W*DCQ^I`MDDUPs1NhRx+*Pc9CJA1*h!g~2PbLPC7pOuyW>YO>X6*aZ5 zcg=U1jr8_&=c#8luEfhdc<(36Qgd8BcFEcE&wu>GB@ZtFQpUw9GpVd=h@-%?7F+L9 zoTMe;c6H2~KO!q#qMoHxkCT`*ls`&H8j;~F^-##Py#RL=mir41@L1fymx0H*o)uJ& z13V-)jDm+EqDZDxWFw6AC1fKz5M>AX=tp~4M~g^sRXPB!w71o=zx0aQ`^B+6hdw#& zG8($cxr3u}Wgt_IRnX&o7_&Z`di5>wK+zwFZ))zt@cfhLd&Qou}E6k>7j$5;one)s zg@=m4Uz&XC)TwHeQ`ORx@-yX+JtjVghjP5d`CYuL{zF>lqpj?7TBCPSUc?$XN$gb)Mx3gd z@;Qq4{V5t8u{}K*OR!kdYdu_r>C@56sKT#^CiVBr#iyLv~M|e1!6PS~7Z~ z4rv%+ES%o|Vv#wNtetn*GEJ^ja!AtHNUUM_DgKp;0Yl`KQ!+qV-w3I4{K|tJUl2Lq z_*LQ#?~9a=JA9=vj>H=|e5J1-%X!o84qr+f1U8gm(uj<_=2&_WsNOB$u(_znoK;+$ zrHyr2<`rJ5TIwTx)w-vxZBJ{eIU~sH>VQ8l4Di~B;4#R}$ZZ>lT&v<;gV4w9GLwEi zl7;kXTh>v+aWsDnFKPdTB@iOiqXbHNxhR6tx3qQ5qPh-YVs7M@CjsrqWGGT+`S0S(VU;Caf1ln@f7*SWf7 zl@%Cb454kJz6kWqg!+)-0{yaSr%G;RqEqoYppl_eKU7?a*SaRg>Jl45G*Jn$k)Wt7 zUbeO(DmWshcCa8@tBVN9Obbg7)rOjKGn2#gZtBFSi~^cJfV~?174ru@wwpiPGxLRq z%X4xvH*DzdHh%b_@lSUtIEn^*iFgLGpFMoBx>&~v^nj_#HOo~Wsny3vrfZCoK6}b7 zFxy;SHJFzc91*X@+n%SsmoYoC%$$YjH=-ZZYZiFK7^7x|Vl10N!?@iX68S2gtgNmt zORI7-tK&lxjA~O{PFZDdX?%QX!r-iy>GQJE!@?`FeFI}lOy=U$xZ?P@VwyXa@rAyN ze8z|r^% zJ~kpqTa}eromEm>7#SCzA0Mx-PD-jy8q7q`do zb}t$*8Z;yqX!T)|L61{i1UE{}`T6-P7T?)~L;i{tw>HTy=WmKy*SW4Ri@#D@Rr)>t zaQH9&cI+sv!ru*7U4=38!#ZAxbvy|GU_M}45^0d+AxJ`DvTm?<`9Z7K;7Dvo?11hZ z*ydY`*t)zD?;Q(fUFF>swx*(M$`cbG<15`GEnbjS3jcuy(@ zf3v@vC}@g*+8O=j%eDCHIF7%8+BQB({^ggDs*rk=FJCXIDyc_#op^^ttB+I*SpAhK zn~{MfbWvOoUfoLZK_DOAfAyI&9SiaI$N8H!EnTy^thotbHZEG!*a(H#?lpgy6OF@1 zr9xEt-`m?=S=o3?Np)4} zEr%Q1+8g@%q?7aK&tK{}y?j+n=+1_Ik2!sK$!6}L-8(i_tQ38E8sksVaV*a zt?{maK=^S~E|43d{H6HayRRSmLrLx3C3VMm*MS57`1{}f_V<54hx}3UK;riaA3gS~ zUlESN5vfe^Qf_3~7cv9LpYmYPt{xp;O0T~+yY3IQM>4AF>#H*A6KnZn?;DNp^C@`a z!cQ;1{IbYhj&~K`jXFFb5o<*5H{f?W68As)YxznK7VJ+6JH}_ zzAJhQf;CJ0c#`K8=8V5&f36^b{OE4ELKgV1^e4~==}X?=AXpCVBx=IGs~Z$1m?mvf z$!Hp}NZo%Yq-*;7)i_=f&b>k`@8^~2+lKy&mjjFjN~}4A>$_~Uo5pg+rCzJlKynh6 z13Rff=y7VlF{t=o;|SxU2zeag96MqGE4}+q;R}>=h4MmPf;TAsw#!TAV?fLkE-kH( zg7^xgcZQXnVE?m?rps6Z>-gX4`bztBg)}~1Kd*$$FW+@Fi$=d`??njoB^}FRCG;+% z@o3!2h_1A+m(nCClR|4GiwETvy3%e4 zE%Svdfq5@!qIk!y^3IPd02K3_gWpV);-xh5fcPS*G~`l^TN?MzIKcYm8;B);j* zl2QJ9#tDeKgH$=)OO-p;4cCWRGZAXZ6#OQCi<^FhcNxs5bF`z>9nQj}tEDjVFU7d2 zd;z)M?5jc}Txa_I?@hb-g5Bod|K7Y?zNs#iqyE%~A5NtgucSU~d4Bi{`2OA%&!Z^~ z>@L(DU$c}W|0w^E@hpGV0Quh&C(ry$o4{~#=GhFqVHdy2$%df9;FCV45ibEC~9 zTK~WDsTuO0s`(E7y8NdMyh8ckd`C6zEoANdYuK28JK%z%46sw^&XHUAHS!;Ed$qhy zfv=F2;{I<1u7L@l1hEMVtoQ8U31|gjChMr~Ue+$TDRrBnNMj7W4G)go@dqnN1T*Ab zDI9Vg3^}%4KNPEt4CHuI8u&P0)H5b=wZF`r ztH4-~x|%I@S)V8E42V!{)%*$N3BzD|^^DfG89Yq+{u$LKGycn*c}iUp-Uoa^Ngy6Lkjs%FekZ+~ZV-tU7d zT$?r@Y+8F$WnV)@+l7Llz(2> zn4cp5I}*62I0iVp$kvNUI^lgI4_us-Gp*y#9n+xb4JAl_qN3oF?l<6mcVW|*2pc)J z5c|U;X&Cw!*T_TspYpX|4f8t&D|tIFtgMwk$&`PCc8XznQt?*wl!+bSDoSF=Cs*Ms zMLmlBVW2zcQ5a)NIlj2_w(QU?H$B_J7ljt($%iDYIe0pb^-8PxNASN29o%fQ23Xf~ z7->DYK3&*)us=jA)Nz>b0!|b+H5DgUL_}63(OG9+L`8gNa&l&L9A3p3qmPR=r>68S zXlq@NUs964ptWtmmeTynHERnpv-9(_GYi(NMf(C@{ActZ_HOa2FxqE@NDtafKpU){ z-E&=du<{b$fW%XnOP0=!R&1qUw&SMT_t;h=h(3YhrHbZ<$yp5Ct4#jPZA+0pvf) zJ^UD6SX)fKfVWytHow%qUw*Kfo@pNb*T^&6)tJPMu3!yX{xhB_!ZXL{S#CVpx_^KB zOY&mk4~^_QymxCZ`2xgyx1f;1pdV$@eHUed;a=b#`nJjoxCaek*CqmMh6<%q_)cxo zZ&So?sDXY(i{7d!LnYFSLx&`dbh38nuTnH_#l5S53)(g(?BL41*h~2ZfFCQP6Ml0QztR*~KJ*lidy%h|OxMW=(WegZ3x60$ z@O%vSmi*=73&ZqtabC<*1EbdD|gYoFE*iS3G2fo@6 zM49!@ee=z^Z_0D-yz@@pgN<0n7*-J-m;pwH8JrnFOpHc9muNnt#zbQ@ zQ8BnA`bD#RMvZZeBu1jf1zZu)C=%no0p0I^s&04Rp6MP)-uK?`{eG{jZ{520)~$1D zJ9X-uQ*|TX(iadFToQ3j$=g`GD{`Sx#r|5amm)q&mPDuEWiJPLP~KYa8A$%jV!?Xonx1`*Vpd)!4G!*Aad8Ott|@|wEC~v zb=s3M#2)=@|#YiY1emYTP(qr2m3sP+h~ zjBBNm%Y}J&8c3bYyE~M{#x#SvYlLJ z=pxdT*&s95>43zkqB3g_Zl%$n2|e@H{V2XnoVKkpictbbp2K%Q;I_0A`1V*WJMu*D zU#znuYUVm%+mK#W*8$!1nmZ@X0~(u{5_XI;%W2|Y$n0J+)CnElqkkM%wIRMe5ZAVO z--kCh@2Azc*_5vCpmviKMe}xSL6YXpoAwAd?RbBS$!-l{mak2Cv~LzpZl^jpV7`-H z4F_F}@x~cO_GWXIL{}`7<#Cmq^Wq-rh)70zaL4557e7CF7aDc4Oud7HNl>w8%twg8tZ*itHRc zc=o*6&pKCFp~eHl3nPEkC36=F|0A}g!`=5~F`&$$`H)?oV3zLlhi7?h@aUbc07U<7 z;oQj6x~OotD|wOk2lD=G-WNHJ2r_s-IMB*vWWW()n0<*0>j9?}GDrHCk-p3iP@?6F?4r9Yyb&ZP>nZv&eetXx7WA3zA2jGX zrv({?&boGB+1SV)J#g5Fs=?Ru{t6P=Yv0$%mg&t3|z3;ylLCb964{r3z#vNnCl4P5>) zt%Z#~S(r#+CS69dIfcp1cZ8i3w({^k%TwwrQyJlS`&$>QcXaz(8jB3Kb*Hk+kcOSg zG{daj)UvlPyta4W6uovy%_#>z96RzCPPfDFolQ<=gnH)K-8CW~mQSi$zw)#*8&*u#E6=@W(5bVXNA&bZ z9*yk&cE3y3TyXVO7hZ6c{+_f$yYJ#C_F^%XAF}&-`WQV( zG8bgEzGQbRcYLQWi~RcJ#V1djyI@dp`PgA|Y9fD$?NM&`7duFqqEp4t+w41m5;XQ% z8Mqo&)*ifJK>z2Te=aia_FHb5GW}-fto{Qg%!yoQHXo}n!VX!pR*bA8Vl>VunT=7G zC2NTYK(n1zMHDfO#0NBq<@@9dlI`S9iirAYmd%q@6k)boz!0h%*Y1%N1DvMGdOjvFv6I#t zN2IiqV(`>&0O}J0AG67&*^f3&hfM53+cEcM``OD=wQV|Ka6xe@jP*UP$^bRsU3Nyq!h-gDJ|v;6eS{ z?|qDsFSDh@<7mny`Ga>?c2YX+5L=tRoD%)Q?eF=J|Mb-PkbD;KvLzFi0l*Tn6m^NEGS~5 zZl8?KLB&6}m4XknJHJQ%mjmI|f}HIvi8F?>4Tjx+OP-Al`=ZZ@pRh&*(v4o6;@<2*Rw@Oe)2H~(bX z=45!?G1R?$e-U1{M{#egCIYf;&A2}B23oA5{20b-v5|f3or^Ad=c0vK`nXYx=Pl8* zvm$Seu9>&QdGt3w4gK^t;@#4J!e~9d=0AVbf5Mo^;|snE46W+n$qT>-`2xlOX1?HZ zoL_V9+Qx6rn)PR0JL5p{qLRv4i)M7`QTMI0&X}?O#Cr`c)5-53 z@;e+{%!i_7z7bzb?lriy--s16ReeXvjBhtJpSMsinOU`9&PkKT&73oT(&Pntp+0}r zx^GO-joFLlEN|MpZtDD*6UwK|sSb~uGJC@5XRTQ@c|KVX9^crH8k>1m-(n4cX>G4T ze6LEsSQGh~K4s;)bv1_%|9lRH7Zc~A1{FgOt!ALR8b!IutTZ-Xk6ZUsG0gsl$$%Ry z)3fW&y{xY3LjS_RlIc^HFPwHv$>c7l^wHNve$%Z?zi{EYjpvSd3x>1?(kKb$NB!Wm{LA-K8dX_Jo?# zv<~!KU0HwLf82dp&4Q`Zmjv2QyK?&@>z0L2{6SN&kI$bsX2SVruDNLT@++1tpE*PF zHWA>*lD7a7I$9{wxo1vA2Yj*K<228mAh?-5ZcQBIJc)LEY~BH7xPEHSDfO z)IP*~$xIC4jm*O^1wWf~(#88Oo-?Vq`rK#Et&aS4{`vFye{bgUa@j; zjf<;Sbj@8napBsv3nwi7{< zUx;AnIL*2T({?(psnP!(iCliUb}o+$5*`1usYE$}t1h|jlB>j9^5)fh_g>waO0JWU zgbNzBRCsh)hm#CluZZgk+QZxsR~(pf_2xTGo;z8;(+=vw4tj+S&{HTGI^cn3EmfW= z`#5E=L@br&pUH zEFl#XZ&`HEWV9=S=hLV(+GEg~TECH;@6qV}(qWWDRy(duYKPV{X;mK`5KF5ENiHkK z(3E9mH6!i7|HkM@+Jo9)6(-5)qDM`YF2fRr-@#sk+NC^S`?pQr_Wg0~(^k=<$P=WG zg=8|l8Nv4%C#Qx%JyWVjrJ-qu#k1*EHSG~=J(^`$%*(v(zq5951WitRMANEtI^daB zzvI=1VVx(k_CB%NF{1S=+&Xa{yggP4vd$uk?cGDh-o$9`3Xl>FMdsUcfD=wn=x@B^ zj;HS$y5ySPsYtx@pmXQ;(1I(MEBPT;XEJz>u9lxJ^QZ|cP+ zNnISz@fmR{oPcmgjQ)D_2AAbc&6Br|L^qbDerd>U0@SvYgw~r6!+#`0J`!<_f$x=; zta=bgM^L?aN4Ma?V34+XWM(D^aFa4UJdrx*? zR9SP3ARrB+I`oc)YnBYX>*+fVrJ`T@gymZngtp)5q*gi_`jvnS{qn%l6o50sPy%nJ|t<$*`J9R-sahy7)z^ecfzCx$NA zxy0+y&@T@*l&EL%c^s;q9w%T45DCkd1K>+4sh6oIz@@Z?@#e+Q zFb`xano7*OJ2HrI@CVbei)Up0sR<92IjHFPcN?X;>TqER~MJ5a$SWbp#rgKqxH@^Wc+? zhH14(4^hwPpNO4{`HTqdqvu_A8yh{uY+VD%K~5qo5HL?i5@5dNuygTZE}$EU`$6Q5 zsOqs-DdFkj#rixw>F`v|WK!Oz7WK)o_w!5EF5E9G_LJ@(qX%WI*}w2TM0B!)t=(7V zbV6{H1%ue}8%CTj&!c2HeNFw+rS)rCPd{VDt*5QH_4K-%e!GqMU4c<-x&SJXIr>96x%uXahbSrjOxN+73 zxzsFtVa&t+;Lc^W{){n$29NRiYnQFs=JSQ8PAl{Iwykp7R`%=V92*>263i+Yk<-6d z|CKW@&lxx%t9aD(k;PfZhVm|N4;PE#US>@wpv|NjIcQ>JEk)5{?y|u{K#wh(HZ?48 zfbSbKc+i*(7ruVIc;xg^#aROe=3G8=C17(#lw<`$|i$c_h<>KT#uCC1^Y=6iM6a_LHamA+Wof?1An zRpeKCuCAOW?~m7&PAKur?g{2TE9co+o@ZuHF!N0IR$c1&SZCum)-;1M*c6%OAimve zNVhKhDVqu{GkXq2mEC%X_LuaY-F+y->_O!C%pOExKr0^rGedW^Fec&yd) zz**|1+%8VizD9b9O-S0m$TsC$pJqjnNWl{ZH*vxe7j*XSQyLVJoS4Xr)RQL9$Qifg ztaGQ1A3O1zb?eV#(bCCNC!aKR|IcU6J7vcF<@&POk%y~itzS~Tq-*Zd35yywo-t|W zq|)%z+fLI{Tc$2H{Yv(R8LTsnU0aO3J3dAcGh@7*>`ik}=j-BsXP+Zo+|IJ>d&`dvxV)TviVVs&ub=3k4oIx9blWsMyY>a>>q9aqbzG~5S1dCDR^WZy;} za}?J3ov!fpcQn3_?^YmnEi&@HD4(-P64q+D6v$(~OBw1({LNkiSf5AH^Go-Z<8v(nbJ zMYnZ-kmrmWC0Mf?sqa=J=lkNi9R%6X(+zq0#>QMMTKy#fuUUrEV(SKB1|m5!~b2Mzk- zAU>X%VfL(GEc;jbmi}JK-evkXdCM|u??tb9RI6V)?O(c+#qp+pk%zwIyYqe1>;?_@ zUS#t<7#tPv(8m%}2a!u3T_4kzb?9WYAJPnx@Bfi~(=JQf$xOZVpswY+jPx@s$m9Kt zyRvVZZ3|)#Nk5b4o_=Pcpgp0Vfo~4@{?F~LcG*#Mw2tNUzthjC2=Crfp#>^x^Px^_X+CI zO{KSNE5GIDaW`)(*AstQ!s*sq0UVgP{016Q2&0RU(br{E+`JkC1cWD^&D$#H4wz9#5`sZ@! z`({O+mHf5-FZfMUH)GQ=nzDkk_@7!Q?Tk*lPI?*!21-9H zbEJG$VPin#cvog$!J_Me^3d@7_$q8&FlRyEp)sKAu} z^{U7l;m77a9yV#8LE7IkeK@Q$O1cjz_2-+!SjRoc;UluE^`OWKJ&%cnq}?0dy3W!* zv9Gs#Ui1O)$ZoLxu2XpU83~gI8^1~|V!dyxq(8);&!>|6=pp(I5}lW!Z;-@~U98E* zK7C_Zq~5HB*4T?wI%iw_hsatI+2KQ<878lT!aMYfk&$PIb%8DjKR!1GqZSzF35;-t zzt<3$vHa?Is&yHA^^I(%8mX7^+D9G+sL9S9W~}uv0=#? zH|$r%dXF2%YTc=D!Aj=;Ew1)WE<;?tRt|1g>(!e(sNV!+g!w|FRnnssjIixZzB7yx+}> z&Qb-whur(w>NwvDH=Lse_+YUOTrAErZi5bLUl!L*95yU#>2G(#4(lTR;)XM@liTNp zkrV03ZrHEt^f_)AD>5hF4YRi-G~cF~rFuGB-EfW?>Bu-CaB~U2>W1^wxQqcd41!aG z2i!38=ir5InD0^rd%9uvlneaa4f|AaKz8OJP3>1x{hzwwfGYNHcf&zdSHXtAtZ!~=SkKE%Tr42YS}ep^+tR+wcv}9O&jW4Y8zWa!%ZiZ=kdg)4IVl1M&hp_BeA55Iwsv%zosoI$)K~MY$rMvd975rkP<2Dg>c%AWSJyXDQXVK3M-8Ky9%l>7%|k^h0L_~z zCQth1N1gs^Pd-~?xhPKsW3|ba7fRSbkvb8I+C+V9A+wltfNOKlsd0n=o{V?qn- zH`h0XwluV@3)P08rVa9lccl@QG5T5B-M$H)!u{c-)<%ug#+yrs-Yr*+F|5nRds^fv zq2aAE7I*6$X0sW;i#q2X&9YrPF-T-wyOn$#A8ViN;_ zG^7xjZKFT55Z)R~f1Ee{t)bxy8=BTO)`u3hHMi7n^`Kpn7SI|JPL%vA0JIq}8@S&J zDCuHu9h7*1t+6$+s=2MLc|-f^C{7Dbs&=@^NvG9O>;+XzzS2}j(GdY1p#Y2818P@* z%%99Jx>)RQJN_KX29C{vPs~6+C%ZQX;ilm};W~5Slk=D%cViuO59T60k!kd1Eofh4 zG5wM89E)w}0OZagtp5fgPace==ul>9!>Qhp=y6V96d%Lt85!@3A+zHc3(MH=vYZid zJY(lX_RN^f?w2Pr&{e??Ol7V&UCmH4u>+sY4vQx-G|hucIGOq80t&rGEmDiwadN3z zhW6xCR%xH6RkL`k{JPU97H9m#Z7q9qLx?V>S58>O%E>%xwee zKl#?gW9oGsR6kL7s?XG?>T`9Ax=Z~@J*nP%YMddPbt&HX0Y;8_eCGH7g~EpDcL?q?V{ zhi3l`b*}oRx=-D#&Qsq~=c{k41L^~Hzs^K*o{e-iS9ei|RYbP()7^A;6@{Jdfu^9R z*4RV$W(w6;_miEO^s(%9I6xn-L+VTQ6?3A2dJvk2A$lm&#Nm1b3XM_hz&@HUMU2&j z>TC6qF4DzVpO4d}>>MA)KBa;k%qQrHdJ@~FPf>f-Tlz#@sjGCgp31)Y)AbBJQ_o`O z_c{6`Jy-ow-J|E}`TAsiie7*je2rd&hGdC4s1Cumzpa<*WqP?jRj<&ev4hm<`V3vG zSLxNdPS@)-daYik8}ylay>8SS)C0OnH|vf1EcK51yV|Z>bgORDoAhSAMeR~=s#lmn zy{7i4-Rcc}w%!W=|6~0PcA7d@e+xC{`TE=X0)3&nSN%%;R{ghnT>V=8Mm?b}P>-rh z)X&u))kEqJ>OuV<`XYTXI~!iAzk@{Xa{XQXpZW@9npdJNyIOx=U!#AZzR*9^*Xrx^ zkM#BW$NC2KUFM5F(LdEU@imfL^frB~{+ZscZ_~HyJM^8%Z+@ZgVt0c7;_C_b=zG<5 zd{5ze^&|C9^)q#~x4ztO+d|E=%Szti{Y2lRt{A?J5|rRER%VWd`% z>c{ls`U(9<{iNQZ|D^w{pVEKPPwSofulgDNtbR`aO+T++&@bwj^e(+yzpP);uj<$I z>-r7k3UBJY`YpXrzpdZVe`n9d_w;^t1v{Ysp+C_7)F0}P^vC)W{i*&;f3CmKU+S;) z*ZQD7qz~(ejv`0Ve9t8V-JahGup4BiljUUd)s|eR3*Rv8%AN_`ogPlU)6?nY^k!GG zzD_@*aKn&`yh^TPH;xErerMggd(SyT>;0j zlV%w^$d@}6>@zXJndnSnJ;W5}M5ofJa;o_z>NIQ(XRv4cEcSJn!+zv*oq5iD=Va#; zXMwZOsc{xLi=8FTQfHa7+&R@*;hg5IbWUfkU+b)LRwIX~ch;ckTjw-5XFBVhMrVW5 z&+>9TKw(o`gkxn%|)Z$o&(ctiuLA{Gb4dW&e}vcdqzBg?6vWr$#_w*Er_Dx zlAM`|H*(e`!oHcSYFm8k@B*{i8XD{B0}bXBoaN%*;Nm~a;@@BkY?g~@gFQR5W;+dM z=FCo{n{#F&Y;h?mbI;-2^=n(|>zf*3q8nBRPO4qKsjWWHXijdFD)(F+ILQ`4qdECb zB7eR{yudvBR+Hzgai#XHabM1J; z)YzBX%*j_HmC`1avdC7-CR-_s+#GCjbFj$fV3Rrd7q!3+_&15)Wsw*EE}Ohp!9{N6 zZL;T_B?-K8ws^wJJmIa0aA3L3;W_4%y*%FLvd@VJgO$_F(_n4AJxf0=E-E+qE-tEY z&z0`k)^|z8ICEW6X`h!=Rh#Q+CDQ{-*0$8rU$@xP5{tnWbIMv$*HGV5-`dccwIvn` zEVB`}nvS7s zH@$Kd6bayPwlH@$Ku`M8aBtmxveruaUW#WwzM>FkvU?} zgf?x=HfJ*-wGZo>w=~%hjPyDi+O)B*$)Z@{qFCXgQsJUfVY60LrJ;81rj7P~mCb#rn^b9)1yx#YtERNt zeQ&xgz0&E^%zI_U?zz&IZds*iaK+&wn_jrcmS)(k;;>uAVYiCIZWV{!Dh|6<9CoWX z>{fBut>SRGg%d7!;gp+(TpTX9c!kR?KH+j(yWt9pf4IWpAFi-XE9{m-RiVYNs?Zi; zRiVvyRiQ27szO`DRfQIARbf?NQ_=LI*r_@&drWIE1U4NW#V4Y7>;gJZyiXIIlL=OU?7-OVTx6)=f7a zF3xpFZu7u9}qldM6Rb>Up6QJ+Oscnl~Wt#p+Ac&N##hmGb^1QX-YaDpudi>4U1qm7*0!#5pVY2i@44Jq+XC-I$(W~I&82}IOQ&{q zed6&dcox7i44B8=Nmv0J=Sg#g1w4dV=62+?J#Vcd0kWU2Gh(v9wJLb^;*McBqn@E6{P<>n&KJQR+@`>ewA zEZ(L}*%eikd7cS>VlIsgOk;eClAkcv%*d9+&LD^D?i@XEXls#KiA{1b;SyqKy-8P%0FAvJIA{F6fJ(gpM9;{V&J2^QGCxLEl91w4}9{Fh{gwY80H>Q*6i z>KD?p)V*tcvpB@EN9?0=k<(5G!eVec6A9%xNX;%oc6B{6&|e@; zdkE>-PGp;}BboaE$!J6ekVW=J(l``JVi}Uc=|}+ua}v{iZAm!O&9&nj;43${Ilh^` zCL70hnR~w4J zxaS@2`D6F|xjhGS-E(jE+}}M*`GQlh(LG=3o`3D0ce&?7_DrFgddM8;UZ3cm=g|^w zP;-!diCk;6C+g}JV;V5^1NP1>87-k zy`AV(g5w;d`XbZsN~;VRnf(yt^Cd{-tqguP6z()DPe&3ing`LQY(-}MBlSCEs*kA8 zMdEBE&E>AFSERaUA)SrORO9m0n?17ANA#bOHTFb;IJuqt57{3rX*<}=q+Qn0BCk~2 z)r0Ce^)9k+zMq1`dOVWp=}4g$AZ1>OMEOi4#pfUkz5w~|Wyo}|MuK~Tz6mP4-Wdwj zZPOco5=I94f}{0|$Ts_Oca!=ClE-r7q7OKZejIscKkjZ;n~+9UAS-B4!$)r>$6Jmc;w;%;Q5gF~HPPTpu z*=qrJ&(*C+Mk{qxKj!4w$BL@VKW$HZyZc4vv?x3cYMd-hb21k=7R!7imy8=K;K}ypBk69FtKo?sut=H2ojucPc3p?zr;0Q*U z<_#&`9;7NM7vMW+@TPgNl~g;%DS=LSOH+^%beWQaXaX-M2pocP2Bd{Ezxa-I>e=PoKdE91a~L}x#_3}Czp&jhv-VuzNI$| zAhyJnejz0-G|Q)@G$iDp6&G3-h<--cN$SytUZPF@ra5?vURgrRV(WF@U|xZ?d_mH@ zqQButgfExpv3WvoGf(Jk<_TCGyHE9c441%AYDUs?;In$-XOc!pouP+kK>xW4WSo?7 zD1YGb`-YDnQA|9U3CUh9LX$)2`A^{9x1*2apBTLwe^7KgjOftlkMW0zPuxN3MD=aa z6q4e-=KaO+n?ata=mAnQKW`|y*S(n?eJ6UqJc-}&zVW#mOYrQ8^HC#G%YASG#xWVm z`s4hJV#h#}j>Gv(`;+f1Nq!~A5--EVb4)xL>tgYwH(*yvstJ3C<7mH*zTf2ImpTM& z`0D7Je0};k7oX%47UYRv^aG)^id{{EH;(r?#6z#ss z&}Zl~C<}D_gjeg;gxBh|q~pLr2t1(`GNbN-ll{;0NL}E`7n-~CTxQup12xM)%`i|M zEI}%XUyJj>e>M?QFz_1;{Pdiy+z~u7g<3glB4O1kH&Z<`UoYrU{mpGl6&!9~#)gd1`wWq01eJ%=Zr+`8CE zsYv^QW76w5pKadnkFCp8sPoCpzE&{$tiv^NW!+-#E_Uxqj8(?T+n3S<#J|J%($g-D z3hll$dadyua_$)Z=&EEyeVrJl;i|*nH~K{bZ_+U(e3y*MW2t}pfaPMM!$&e z=X!5+zv>ZvJbFv?v*0<7`LHdFf zGw$eP=8oj*6GB1q^=9-{XobiN+Wn$Wg2e~mM}GMkKl*O;Yv6%1{u8`^h_^oj@AamX z75-a1`#QRlGL~N!HSt9nyul^9JNj{yCFRLKO7_**9da)9U`vkj>g)#|yAo785ip0JcRq0T@eq~z6ZP>_} zU-TVLNOHVC;+yi1K12Lhd4EUrMfZ80=@UDoKiWId8|5q|BarbWr@QEV?vFg|iidv{ zyyQq`wltyE#@`WgI;d`t^47Ee?7+dD_WnCBGc*yc_GY_Dq?9F>T3|e)I#0 zMwx%ku?uSZciWqzubDX8={X;f0tc}^=dR^>vMA?|GA0>B)yE}33 zLd(Ab@_uTI`1nHQggPr}tG4ai7wz3xB9#9x=nK0Uniyb*npH1|gT5WUO1j1U;ck|r6N1i@s9D0#je#?~Z z*RMEm{nzNv7#!gdGm z{u!5novo|{+lkA-&h{DNKZnc4%Jz9uei5g!4HZf3%Q%gN=&SgzJ0{xSL()dil4uY1E+9gkn23-AZ&K`IX(YY09o zJMl;85vnV8xuft$Yj*0uHg_z3kuJh7(Ixn$x>R+CCkwM)utHbhkJsaos!h}r@h59a z9xL5SFsatnK$)hek#dc$;jP6;=DWkgEyZ6BCzp@?=q@mSjk$i1(h4|Zsl(V$LW8Ia zMeXKsgklep&O_o?e8ZeHL=$3vaxO^pMRQ;7C9KE?Ql>&5K*j>qGZ`U0|{zR54vmtwA@YH)q>~u#4<>Wo2wB%O+ zOgW?sW8nZ{OB-7k@M0lh1^tK}K5D{y`025+BS79#9huZx7P*yrM>g&r zQu;Y2EqOovPu`9ll8Ve4Wu7Q=HSz6F&K>JFeX7Y%ysaep$^R=?q7&{$dF4{Z(kgO} zc*I)T|JfXLHOU{}4oFw%skmY0Kn;tm%DV<6wgM#G>W>RpnIY>oF2;8MQpS?YShw+A zMw2VdIC8bv)3c)ETE>y<89{DfO~+4U7K^R_MJs<*P`&^UePV{Sllj;?a16pzea?K+AAP%BX&vzrPGu))?URV`TA!I& z=@;-PaL=Uu5ggB-yd2UI6YLlvA(av-*b#nkU^CzmhC;o?39rBpYzD)(?Kks*BEb|H zzybJ;rO}Tml?liS6ThDDNbf-jdeXaPP7x$VZ&J#R?%~ZHaJIME$mFY+nf3QI*If+# zNu(oO<>Rh%XFu|gJ8=$-5IGXQRZ21OOT>uZi}R52I}(V|7zs-Z^ynRb)X`pWiI_Rh z$8d_0XY-3bogAAd%J6)`i6h-;|0A9I;S8Cv5s$v?gF6p0A2sO-pD*v*8HbyWn;v&Rg5qXF;i(zk{Ssf`ya)6@ zM_-4l7EW2gIcJOHfsmPRN+|XdF5JBFcl=L{`wG~*z=K(tDXo`cc*ovJbq3;xw5KoQ z&wRFgO>dHtmTRz+805))8jsyRkh-S5u{wzX?)#x^xr}IrdjMvhylTqv8RkQFRv~h# zpgXTNGnrWOw!TQ^tF)=?_M`$|YEt>U-OR_d4N`d@$cLz-q@S7TncA_pk!$%S72?L* zQQ`$sv2%)^)Cey2#K^MTc5L4L$Sw7+Q>9{Jyd(J%c?r%)ENoiT`Bx(CcCTE_Z2O7b z99$MsQn8epgA1?*a4tEXhYPS4a6a@yB&L~YLu!b*2p2H2 z(`;4-E@8A>ipyn%;4(O;<+wan3Z6>oufTOf4|W=NR^qy|3h!q4iraBntP~Xa>Yc0v z%wiqjJwUt{m&Mw$`|$6_WvK_SkLiLQ?GL2zFfI#=h(`$j38z^z_!R!rIL*4jzv4fO z%V6E$-^kYsxGeP&E{k<-yYXMaWwFlfHT*Yl0am`fiT@TZpx(v>SY3$Do)w1w!2c)C zuRg;0)h9SVs~0~b&KJ0V`ieDvLDu3OqGTetOlhvj=6%{nI8Wy>r|G7<;rGxz@O$c> z_`Nlhm^FoBAJJcn7W`N(`o95MtQA5!gg;OZ#2>5&GuIiahvE;{!|_Mzk<33%&?n%J z(PQunbs>JSF2*0H$KjXhGUhbpnmHwF4Vg!>+Hey76jmH|XRTosI84=3Nq@SYPMVAK zBH}M$U13+&6E4F)6^&&c77x2g?GyCgZw@=-5Dk;)7y98_E=%So87c%t4lr`cirjo!iJ{2gDZc^6PxcID zGP&?l2zys%46)xpa8J0{-J?0%JjD1-drr)ngr5*+v5(!CoE+=AEb^BH?B4N1o*w-n z<>Wo2v}8shd`zk%QKAyF{lTrIUwceKJdGXfXh&_t4(8IdB6}$Emg?w2t)T(purhtA zJvk)zl8(He{wHt84oSso>_lfLtw-8!84jNkyZJh*7t%88{dH@?uQnB5L+XxFy9agm~oA7B|QUr65}oZy&C@CcpLpNoP_Z4J|lq_ zj`)7`HKI*KD+LGnp~$Xr&vU%k4nMRzatE$Mq~ZJUcedxl+r5$MG7ru{Bt3~SVX=+I zjO%mZq^y)Y_9~Ee7%J`q&+XBNnR5h?Kf@av9R;#2c%ofs8Fusj3*_r{naQ~+KF9p< zaboQd8o&gEA{Uzo$u{-X4N>+Xe*}J_??UU1Y z&5Y_TPc5a68oz6G81c)a51{uFp4J>!M}HXo8ME)JskiuCPm)4E@FF<9Nc)tW#M_Rv zW}e>9-JZ0o0CkmpRQG&U4LV?*I!?QkyXh$TfAV@cr{+Xd_*^%-zSV!;qF zmK1(tN#VyT4oe8Eln1E{?0JT=Q{5P+kZ_U1Itgr-iwT!FC4|R0<7iV_4bgw)jP)po zI5~@K*k0LdxhLx%MD8d2jYz$`KWU9tYTJb}klrFAo}Hy@^GtZDe0ZXSO%}KR2YxZ` z#hzn%kQ~S%zT_b0WH!^!bvZmamVV@QHV@**R*ei+aL;m_ua$>h+4~M7T zL*(%34zV5c9>iw z5LtezBMa^=huliN_l+OI4+`gNErilnro0_HB$fX^e}2<8&_Pkg(vF0)?EHweG!12M zZxJ;BIwDrG)zFQmPA#Lbl!YD)P2TqdTt1|oDYS)C2{TWE7Vbq>WNd`Yc%Ebv#Hjtx z_{gfYweA)RQK5qJ^?@9Gu_4PaR4`zuppVv>Sg9qHFAJTH6LZ!V}ItELz5yeW>#Zs);EFKmf YJMfsA#(R0;j~JztdcD`9cgN2E3s0Tr7XSbN literal 0 HcmV?d00001 diff --git a/local-fonts/AeonikPro-Regular.ttf b/local-fonts/AeonikPro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ee79a0275f2bb88d752d31fca39b72e3c913dec9 GIT binary patch literal 141420 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 YBOk+L91FkjQ=5Ceh0okSrTqJU0Dp`dBme*a literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 7b1e3eb65d..25bdac7a56 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "@appwrite.io/pink": "0.1.0-next.9", "@appwrite.io/pink-icons": "0.1.0-next.9", "@appwrite.io/repo": "github:appwrite/appwrite#main", + "@resvg/resvg-js": "^2.6.0", "@splinetool/viewer": "0.9.455", "appwrite": "^13.0.1", "compression": "^1.7.4", @@ -75,11 +76,17 @@ "os": [ "win32", "darwin", - "current" + "current", + "linux", + "linuxmusl" ], "cpu": [ "x64", "arm64" + ], + "libc": [ + "musl", + "glibc" ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b5b50a9ba6..b443b62478 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: '@appwrite.io/repo': specifier: github:appwrite/appwrite#main version: github.com/appwrite/appwrite/5a715ff68cba4171bf3473eabc83b84a4ae5876c + '@resvg/resvg-js': + specifier: ^2.6.0 + version: 2.6.0 '@splinetool/viewer': specifier: 0.9.455 version: 0.9.455 @@ -1066,7 +1069,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-android-arm64@2.6.0: @@ -1075,7 +1077,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-darwin-arm64@2.6.0: @@ -1084,7 +1085,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-darwin-x64@2.6.0: @@ -1093,7 +1093,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-linux-arm-gnueabihf@2.6.0: @@ -1102,7 +1101,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-linux-arm64-gnu@2.6.0: @@ -1111,7 +1109,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-linux-arm64-musl@2.6.0: @@ -1120,7 +1117,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-linux-x64-gnu@2.6.0: @@ -1129,7 +1125,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-linux-x64-musl@2.6.0: @@ -1138,7 +1133,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-win32-arm64-msvc@2.6.0: @@ -1147,7 +1141,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-win32-ia32-msvc@2.6.0: @@ -1156,7 +1149,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@resvg/resvg-js-win32-x64-msvc@2.6.0: @@ -1165,7 +1157,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@resvg/resvg-js@2.6.0: @@ -1184,7 +1175,6 @@ packages: '@resvg/resvg-js-win32-arm64-msvc': 2.6.0 '@resvg/resvg-js-win32-ia32-msvc': 2.6.0 '@resvg/resvg-js-win32-x64-msvc': 2.6.0 - dev: true /@rollup/plugin-commonjs@25.0.7(rollup@3.29.4): resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} diff --git a/src/lib/appwrite/init.js b/src/lib/appwrite/init.ts similarity index 100% rename from src/lib/appwrite/init.js rename to src/lib/appwrite/init.ts diff --git a/src/routes/init/ticket/+layout.ts b/src/routes/init/ticket/+layout.ts index a3d15781a7..83addb7e93 100644 --- a/src/routes/init/ticket/+layout.ts +++ b/src/routes/init/ticket/+layout.ts @@ -1 +1,2 @@ export const ssr = false; +export const prerender = false; diff --git a/src/routes/init/ticket/[id]/og/+server.ts b/src/routes/init/ticket/[id]/og/+server.ts index 8158452e85..a0c1ad3b73 100644 --- a/src/routes/init/ticket/[id]/og/+server.ts +++ b/src/routes/init/ticket/[id]/og/+server.ts @@ -1,11 +1,11 @@ import { PUBLIC_APPWRITE_COL_INIT_ID, PUBLIC_APPWRITE_DB_INIT_ID } from '$env/static/public'; import { appwriteInit } from '$lib/appwrite/init.js'; import sharp from 'sharp'; + import type { Ticket } from '../../constants.js'; -const getSvg = ( - ticket: Ticket -) => ` +const getSvg = (ticket: Ticket) => ` + @@ -820,6 +820,33 @@ const getSvg = ( `; +// export async function GET({ params, url }) { +// const ticket = (await appwriteInit.database.getDocument( +// PUBLIC_APPWRITE_DB_INIT_ID, +// PUBLIC_APPWRITE_COL_INIT_ID, +// params.id +// )) as unknown as Ticket; +// const svg = getSvg(ticket); + +// const resvg = new Resvg(svg, { +// font: { +// fontFiles: [ +// `${url.origin}/static/fonts/AeonikPro-Regular.woff2`, +// `${url.origin}/static/fonts/AeonikPro-Bold.woff2`, +// `${url.origin}/static/fonts/AeonikFono-Regular.woff2` +// ] +// } +// }); +// const pngData = resvg.render(); +// const pngBuffer = pngData.asPng(); + +// return new Response(pngBuffer, { +// headers: { +// 'Content-Type': 'image/png' +// } +// }); +// } + export async function GET({ params }) { const ticket = (await appwriteInit.database.getDocument( PUBLIC_APPWRITE_DB_INIT_ID, @@ -829,7 +856,7 @@ export async function GET({ params }) { const svg = getSvg(ticket); const svgBuffer = Buffer.from(svg); - const pngBuffer = await sharp(svgBuffer) + const pngBuffer = await sharp(svgBuffer, {}) .resize({ width: 1000 })