From 417a413f8d97d07136604c1ff00c0e52da146f41 Mon Sep 17 00:00:00 2001 From: Andrei Kondratov Date: Fri, 27 Sep 2024 09:39:54 +0500 Subject: [PATCH 01/20] wip --- .../src/assets/images/player-avatar.png | Bin 0 -> 18167 bytes .../src/assets/images/stars/star-color.png | Bin 0 -> 4632 bytes .../src/components/ui/PageTitle/PageTitle.tsx | 4 +- .../layouts/PrivateLayout/PrivateLayout.tsx | 10 +- .../src/pages/Leaderboard/Leaderboard.scss | 117 ++++++++++++++++++ .../src/pages/Leaderboard/Leaderboard.tsx | 42 ++++++- 6 files changed, 169 insertions(+), 4 deletions(-) create mode 100644 packages/client/src/assets/images/player-avatar.png create mode 100644 packages/client/src/assets/images/stars/star-color.png create mode 100644 packages/client/src/pages/Leaderboard/Leaderboard.scss diff --git a/packages/client/src/assets/images/player-avatar.png b/packages/client/src/assets/images/player-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..488510874011b8984722273b4044aba5d9ce740a GIT binary patch literal 18167 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 + return ( +
+
+
+ +
+
+ ) } diff --git a/packages/client/src/pages/Leaderboard/Leaderboard.scss b/packages/client/src/pages/Leaderboard/Leaderboard.scss new file mode 100644 index 0000000..ce6b352 --- /dev/null +++ b/packages/client/src/pages/Leaderboard/Leaderboard.scss @@ -0,0 +1,117 @@ +@import './../../scss/vars.scss'; + +.leaderboard-page { + &__logo { + display: flex; + margin: 0 auto 44px auto; + max-width: 255px; + } + + &__title { + margin-bottom: 40px; + } + + .records { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 17px; + + .gradient-wrapper { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-radius: 16px; + background: linear-gradient(90deg, #adadad 52.5%, #474747 100%); + } + } + + &__record-item { + display: flex; + justify-content: space-between; + + position: relative; + z-index: 1; + + margin: 5px; + + border-radius: 16px; + + background-color: #000; + color: white; + + padding: 19px; + } + + .record-item { + &__user-info { + display: flex; + } + + &__user-result { + display: flex; + + img { + width: 62px; + height: 62px; + } + } + + &__title { + font-size: 10px; + color: $text-color; + } + + &__value { + font-size: 18px; + font-weight: 800px; + color: $text-color; + } + + .user-info { + display: flex; + gap: 24px; + + img { + width: 97px; + height: 97px; + } + + &__login { + display: flex; + flex-direction: column; + + margin: auto; + + h2 { + margin: 0; + } + } + } + + .user-result { + display: flex; + align-items: center; + gap: 24px; + + &__score { + display: flex; + flex-direction: column; + + margin: auto; + + text-align: right; + + h2 { + margin: 0; + } + } + } + } + } +} diff --git a/packages/client/src/pages/Leaderboard/Leaderboard.tsx b/packages/client/src/pages/Leaderboard/Leaderboard.tsx index eb55205..ba9d2c2 100644 --- a/packages/client/src/pages/Leaderboard/Leaderboard.tsx +++ b/packages/client/src/pages/Leaderboard/Leaderboard.tsx @@ -1,3 +1,43 @@ +import PlayerAvatar from '@/assets/images/player-avatar.png' +import StarColor from '@/assets/images/stars/star-color.png' +import PromoLogo from '@/assets/images/svg/FT-promo.svg' +import { PageTitle } from '@/components/ui/PageTitle/PageTitle' +import './Leaderboard.scss' + +const RECORD_ITEMS_COUNT = 6 + export const Leaderboard = () => { - return <>Тут будет доска с результатами лучших игроков и местом в рейтинге + return ( +
+ Tank wars + +
+ {Array.from({ length: RECORD_ITEMS_COUNT }).map(_ => { + return ( +
+
+
+ Avatar +
+ Логин +

Gamer 1235r124

+
+
+
+
+ Рекорд +

999

+
+ Медаль +
+
+
+ ) + })} +
+
+ ) } From 191d8fa43dbdc93cd95a64fa49f4511606bdfe24 Mon Sep 17 00:00:00 2001 From: Andrei Kondratov Date: Fri, 27 Sep 2024 17:36:44 +0500 Subject: [PATCH 02/20] refact: small css changes --- .../layouts/PrivateLayout/PrivateLayout.scss | 14 +++++++ .../layouts/PrivateLayout/PrivateLayout.tsx | 4 +- .../src/pages/Leaderboard/Leaderboard.scss | 38 ++++++++----------- .../src/pages/Leaderboard/Leaderboard.tsx | 20 +++++++--- packages/client/src/scss/vars.scss | 3 +- 5 files changed, 47 insertions(+), 32 deletions(-) create mode 100644 packages/client/src/layouts/PrivateLayout/PrivateLayout.scss diff --git a/packages/client/src/layouts/PrivateLayout/PrivateLayout.scss b/packages/client/src/layouts/PrivateLayout/PrivateLayout.scss new file mode 100644 index 0000000..6868812 --- /dev/null +++ b/packages/client/src/layouts/PrivateLayout/PrivateLayout.scss @@ -0,0 +1,14 @@ +@import '../../scss/vars.scss'; + +.private-layout { + display: flex; + flex-direction: column; + position: relative; + min-height: 100vh; + z-index: 0; + + &__body { + flex: 1 1 100%; + padding-top: $layout_body-m-top; + } +} diff --git a/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx b/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx index f59020c..f2d5db4 100644 --- a/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx +++ b/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx @@ -5,9 +5,9 @@ export default function PrivateLayout() { return (
-
+
-
+
) } diff --git a/packages/client/src/pages/Leaderboard/Leaderboard.scss b/packages/client/src/pages/Leaderboard/Leaderboard.scss index ce6b352..068a466 100644 --- a/packages/client/src/pages/Leaderboard/Leaderboard.scss +++ b/packages/client/src/pages/Leaderboard/Leaderboard.scss @@ -1,14 +1,16 @@ @import './../../scss/vars.scss'; .leaderboard-page { + margin-top: 40px; + &__logo { - display: flex; + display: block; margin: 0 auto 44px auto; max-width: 255px; } &__title { - margin-bottom: 40px; + margin: 40px 0; } .records { @@ -16,22 +18,13 @@ grid-template-columns: repeat(2, 1fr); gap: 17px; - .gradient-wrapper { + .records__item-wrapper { position: relative; - - &::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border-radius: 16px; - background: linear-gradient(90deg, #adadad 52.5%, #474747 100%); - } + border-radius: 12px; + background: linear-gradient(90deg, #adadad 52.5%, #474747 100%); } - &__record-item { + &__item { display: flex; justify-content: space-between; @@ -40,12 +33,12 @@ margin: 5px; - border-radius: 16px; + border-radius: 12px; - background-color: #000; - color: white; + background-color: $c_black; + color: c_white; - padding: 19px; + padding: 8px 16px; } .record-item { @@ -56,7 +49,7 @@ &__user-result { display: flex; - img { + &__star { width: 62px; height: 62px; } @@ -64,7 +57,8 @@ &__title { font-size: 10px; - color: $text-color; + color: #c5c5c5; + margin-bottom: 4px; } &__value { @@ -77,7 +71,7 @@ display: flex; gap: 24px; - img { + &__avatar { width: 97px; height: 97px; } diff --git a/packages/client/src/pages/Leaderboard/Leaderboard.tsx b/packages/client/src/pages/Leaderboard/Leaderboard.tsx index ba9d2c2..47f390b 100644 --- a/packages/client/src/pages/Leaderboard/Leaderboard.tsx +++ b/packages/client/src/pages/Leaderboard/Leaderboard.tsx @@ -8,7 +8,7 @@ const RECORD_ITEMS_COUNT = 6 export const Leaderboard = () => { return ( -
+
Tank wars {
{Array.from({ length: RECORD_ITEMS_COUNT }).map(_ => { return ( -
-
+
+
- Avatar + Avatar
Логин

Gamer 1235r124

@@ -31,13 +35,17 @@ export const Leaderboard = () => { Рекорд

999

- Медаль + Медаль
) })}
-
+ ) } diff --git a/packages/client/src/scss/vars.scss b/packages/client/src/scss/vars.scss index 6993b3e..6364166 100644 --- a/packages/client/src/scss/vars.scss +++ b/packages/client/src/scss/vars.scss @@ -10,7 +10,6 @@ $img_default-background: url('@/assets/images/page-background.png'); $primary-color: #839d22; $second-color: #00aeef; $text-color: #f8f8f8; - // colors $c_default-background: #010101; @@ -22,7 +21,7 @@ $c_button_blue: $second-color; $c_button-top_blue: #5fe1ff; $c_button-bottom_blue: #0079a7; -$c_white: #ffffff; +$c_white: #fff; $c_black: #000; // fonts/links From d9b6f533c0fb5e1922d67948d78532da6b33d635 Mon Sep 17 00:00:00 2001 From: Andrei Kondratov Date: Fri, 27 Sep 2024 17:55:59 +0500 Subject: [PATCH 03/20] feat: text-color-muted variable --- packages/client/src/pages/Leaderboard/Leaderboard.scss | 2 +- packages/client/src/scss/vars.scss | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/client/src/pages/Leaderboard/Leaderboard.scss b/packages/client/src/pages/Leaderboard/Leaderboard.scss index 068a466..eb5a9cb 100644 --- a/packages/client/src/pages/Leaderboard/Leaderboard.scss +++ b/packages/client/src/pages/Leaderboard/Leaderboard.scss @@ -57,7 +57,7 @@ &__title { font-size: 10px; - color: #c5c5c5; + color: $text-color-muted; margin-bottom: 4px; } diff --git a/packages/client/src/scss/vars.scss b/packages/client/src/scss/vars.scss index 6364166..4dd9bfb 100644 --- a/packages/client/src/scss/vars.scss +++ b/packages/client/src/scss/vars.scss @@ -10,6 +10,7 @@ $img_default-background: url('@/assets/images/page-background.png'); $primary-color: #839d22; $second-color: #00aeef; $text-color: #f8f8f8; +$text-color-muted: #f5f5f5; // colors $c_default-background: #010101; From 1103036f96b06dcb4d13d39aa090103f4d4722f6 Mon Sep 17 00:00:00 2001 From: Andrei Kondratov Date: Fri, 27 Sep 2024 18:13:54 +0500 Subject: [PATCH 04/20] feat: use border for player img --- .../src/assets/images/player-avatar.png | Bin 18167 -> 16787 bytes .../src/pages/Leaderboard/Leaderboard.scss | 5 +++++ packages/client/src/scss/vars.scss | 2 ++ 3 files changed, 7 insertions(+) diff --git a/packages/client/src/assets/images/player-avatar.png b/packages/client/src/assets/images/player-avatar.png index 488510874011b8984722273b4044aba5d9ce740a..07532486a346a65d453ac6b9c4bcafb62f61181b 100644 GIT binary patch literal 16787 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 iy4^hbUaFupZvPLJtLy!@d!S_i0000 Date: Sat, 28 Sep 2024 15:30:10 +0500 Subject: [PATCH 05/20] =?UTF-8?q?=D0=9A=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BA=D0=BE=D0=BC:=20=20-=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B5=D0=BB=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/images/svg/arrow-controll-bg.svg | 177 ++++++++++++++++++ .../src/components/common/Header/Header.tsx | 66 +++---- .../layouts/PrivateLayout/PrivateLayout.tsx | 1 + packages/client/src/pages/Game/Game.scss | 0 packages/client/src/pages/Game/Game.tsx | 20 +- .../pages/Game/components/Arrows/Arrows.scss | 123 ++++++++++++ .../pages/Game/components/Arrows/Arrows.tsx | 113 +++++++++++ .../buttons/ButtonMid/ButtonMid.scss | 32 ++++ .../buttons/ButtonMid/ButtonMid.tsx | 24 +++ packages/client/src/scss/grid-system.scss | 2 +- 10 files changed, 524 insertions(+), 34 deletions(-) create mode 100644 packages/client/src/assets/images/svg/arrow-controll-bg.svg create mode 100644 packages/client/src/pages/Game/Game.scss create mode 100644 packages/client/src/pages/Game/components/Arrows/Arrows.scss create mode 100644 packages/client/src/pages/Game/components/Arrows/Arrows.tsx create mode 100644 packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss create mode 100644 packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx diff --git a/packages/client/src/assets/images/svg/arrow-controll-bg.svg b/packages/client/src/assets/images/svg/arrow-controll-bg.svg new file mode 100644 index 0000000..e56e742 --- /dev/null +++ b/packages/client/src/assets/images/svg/arrow-controll-bg.svg @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/client/src/components/common/Header/Header.tsx b/packages/client/src/components/common/Header/Header.tsx index 8b71340..2108717 100644 --- a/packages/client/src/components/common/Header/Header.tsx +++ b/packages/client/src/components/common/Header/Header.tsx @@ -13,39 +13,41 @@ export const Header = (props: HeaderProps) => { return (
-
-
- - Falcon Tanks Logo - +
+
+
+ + Falcon Tanks Logo + +
+
-
) diff --git a/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx b/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx index f2d5db4..8869962 100644 --- a/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx +++ b/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx @@ -1,5 +1,6 @@ import { Header } from '@/components/common/Header/Header' import { Outlet } from 'react-router-dom' +import './PrivateLayout.scss'; export default function PrivateLayout() { return ( diff --git a/packages/client/src/pages/Game/Game.scss b/packages/client/src/pages/Game/Game.scss new file mode 100644 index 0000000..e69de29 diff --git a/packages/client/src/pages/Game/Game.tsx b/packages/client/src/pages/Game/Game.tsx index 908d885..c03f7cf 100644 --- a/packages/client/src/pages/Game/Game.tsx +++ b/packages/client/src/pages/Game/Game.tsx @@ -1,3 +1,21 @@ +import { Arrows } from './components/Arrows/Arrows'; +import './Game.scss'; + + export const Game = () => { - return <>Тут будет игра + return
+
+
+
+
+ +
+ game wrapper +
+
+ +
+
+
+
} diff --git a/packages/client/src/pages/Game/components/Arrows/Arrows.scss b/packages/client/src/pages/Game/components/Arrows/Arrows.scss new file mode 100644 index 0000000..6ee59bb --- /dev/null +++ b/packages/client/src/pages/Game/components/Arrows/Arrows.scss @@ -0,0 +1,123 @@ +@import "../../../../scss/vars.scss"; + +.controll-arrows { + position: relative; + display: flex; + align-items: center; + justify-content: center; + height: 200px; + width: 290px; + + background: url('@/assets/images/svg/arrow-controll-bg.svg') no-repeat center + center; +} + +.horizontal-arrows { + position: relative; + display: flex; + justify-content: space-between; + width: 100%; + padding: 0 20px; +} + +// .vertical-arrows { +// position: absolute; +// left: 0; +// top: 0; +// right: 0; +// bottom: 0; + +// &__top { +// position: absolute; +// top: 1px; +// left: 50%; +// transform: translateX(-50%); +// } + +// &__bottom { +// position: absolute; +// bottom: 1px; +// left: 50%; +// transform: translateX(-50%); +// } +// } + +// .arrow-top { +// width: 100px; +// height: 50px; + +// &__border { +// position: absolute; +// top: -$border-width - 3; +// left: -$border-width - 3; +// right: -$border-width - 3; +// bottom: $border-width + 1px; + +// border-radius: $border-radius $border-radius 0 0; +// background: $border-gradient; +// background-size: 50% 50%; +// background-repeat: no-repeat; +// z-index: -1; +// padding: 10px; +// border: 3px solid $outline-color; +// border-bottom: none; + +// &::before { +// @include borderDecorSettings(0, 0) +// } +// } + +// &__content { +// position: relative; +// display: flex; +// width: 100px; +// height: 50px; +// border-radius: calc($border-radius - 6px) calc($border-radius - 6px) 0 0; +// border: 1px solid $primary-color; +// border-bottom: none; +// background-color: $bg-color; +// text-align: center; +// color: $text-color; +// padding: 12px; +// } +// } + +// .arrow-bottom { +// width: 100px; +// height: 50px; + +// &__border { +// position: absolute; +// top: $border-width + 1px; +// left: -$border-width - 3; +// right: -$border-width - 3; +// bottom: -$border-width - 3; + +// border-radius: 0 0 $border-radius $border-radius; +// background: $border-gradient; +// background-size: 50% 50%; +// background-repeat: no-repeat; +// z-index: -1; +// padding: 10px; +// border: 3px solid $outline-color; +// border-top: none; + +// &::before { +// @include borderDecorSettings('auto', 0, 0, 0, 180deg) +// } +// } + +// &__content { +// position: relative; +// display: flex; +// width: 100px; +// height: 50px; +// border-radius: 0 0 calc($border-radius - 6px) calc($border-radius - 6px); +// border: 1px solid $primary-color; +// border-top: none; +// background-color: $bg-color; +// text-align: center; +// color: $text-color; +// padding: 12px; +// } +// } \ No newline at end of file diff --git a/packages/client/src/pages/Game/components/Arrows/Arrows.tsx b/packages/client/src/pages/Game/components/Arrows/Arrows.tsx new file mode 100644 index 0000000..ba91afe --- /dev/null +++ b/packages/client/src/pages/Game/components/Arrows/Arrows.tsx @@ -0,0 +1,113 @@ +import { useEffect, useState } from 'react'; +import { ButtonMid } from '../buttons/ButtonMid/ButtonMid'; +import './Arrows.scss'; + +export const Arrows = () => { + const [activeButtons, setActiveButtons] = useState({ + upButton: false, + downButton: false, + leftButton: false, + rightButton: false + }) + + const toggleButton = (buttonName: string, state: boolean) => { + + setActiveButtons({ ...activeButtons, [buttonName]: state}); + }; + + const handleKey = (event: KeyboardEvent) => { + console.log(activeButtons); + + switch (event.key) { + case 'ArrowUp': + toggleButton('upButton', event.type === 'keydown' ? true : false); + break; + case 'ArrowDown': + toggleButton('downButton', event.type === 'keydown' ? true : false); + break; + case 'ArrowLeft': + toggleButton('leftButton', event.type === 'keydown' ? true : false); + break; + case 'ArrowRight': + toggleButton('rightButton', event.type === 'keydown' ? true : false); + break; + default: + break; + } + }; + + useEffect(() => { + window.addEventListener('keydown', handleKey); + window.addEventListener('keyup', handleKey); + + return () => { + window.removeEventListener('keydown', handleKey); + window.removeEventListener('keyup', handleKey); + }; + }, []); + + return ( +
+
+ + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ ) +} diff --git a/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss b/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss new file mode 100644 index 0000000..7f1717b --- /dev/null +++ b/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss @@ -0,0 +1,32 @@ +@import "../../../../../scss/vars.scss"; + +.button-middle { + outline: none; + border: none; + cursor: pointer; + border-radius: 8px; + background-color: $c_button; + transition: border-color $animation-base-speed; + + padding: 4px 12px; + display: block; + + border-top: 5px solid $c_button-top; + border-bottom: 5px solid $c_button-bottom; + + font-size: 16px; + font-family: $f_default-font-family; + font-weight: 900; + color: $c_font-default; + text-decoration: none; + text-align: center; + + width: 76px; + height: 64px; + + &_active { + border-bottom-color: $c_button-top; + border-top-color: $c_button-bottom; + } + } + \ No newline at end of file diff --git a/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx b/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx new file mode 100644 index 0000000..cc439c2 --- /dev/null +++ b/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx @@ -0,0 +1,24 @@ +import './ButtonMid.scss' + +type ButtonMidPropsType = { + children: React.ReactNode; + isPressed: boolean, + buttonName: string, + toggleButton: (buttonName: string, state: boolean) => void, + +} + +export const ButtonMid = (props: ButtonMidPropsType) => { + const { children, isPressed, buttonName, toggleButton } = props; + + return ( + + ) +} diff --git a/packages/client/src/scss/grid-system.scss b/packages/client/src/scss/grid-system.scss index 784b0ea..5c3d2a1 100644 --- a/packages/client/src/scss/grid-system.scss +++ b/packages/client/src/scss/grid-system.scss @@ -2,7 +2,7 @@ @import './vars.scss'; .container-fluid { - display: flex; + display: block; width: 100%; max-width: $container_fluid-max-width; padding: $container_fluid-padding; From cc9e83da236ff83c022216329de7019081f00257 Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Sat, 28 Sep 2024 15:30:31 +0500 Subject: [PATCH 06/20] =?UTF-8?q?=D0=9A=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BA=D0=BE=D0=BC:=20=20-=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B5=D0=BB=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../layouts/PrivateLayout/PrivateLayout.tsx | 2 +- packages/client/src/pages/Game/Game.tsx | 29 ++- .../pages/Game/components/Arrows/Arrows.scss | 32 ++-- .../pages/Game/components/Arrows/Arrows.tsx | 167 +++++++++--------- .../buttons/ButtonMid/ButtonMid.scss | 55 +++--- .../buttons/ButtonMid/ButtonMid.tsx | 24 ++- .../src/pages/Leaderboard/Leaderboard.tsx | 4 +- 7 files changed, 152 insertions(+), 161 deletions(-) diff --git a/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx b/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx index 8869962..51acbce 100644 --- a/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx +++ b/packages/client/src/layouts/PrivateLayout/PrivateLayout.tsx @@ -1,6 +1,6 @@ import { Header } from '@/components/common/Header/Header' import { Outlet } from 'react-router-dom' -import './PrivateLayout.scss'; +import './PrivateLayout.scss' export default function PrivateLayout() { return ( diff --git a/packages/client/src/pages/Game/Game.tsx b/packages/client/src/pages/Game/Game.tsx index c03f7cf..9dfde02 100644 --- a/packages/client/src/pages/Game/Game.tsx +++ b/packages/client/src/pages/Game/Game.tsx @@ -1,21 +1,20 @@ -import { Arrows } from './components/Arrows/Arrows'; -import './Game.scss'; - +import { Arrows } from './components/Arrows/Arrows' +import './Game.scss' export const Game = () => { - return
-
-
-
-
- + return ( +
+
+
+
+
+ game wrapper +
+
+
- game wrapper -
-
-
-
-
+ + ) } diff --git a/packages/client/src/pages/Game/components/Arrows/Arrows.scss b/packages/client/src/pages/Game/components/Arrows/Arrows.scss index 6ee59bb..3e50471 100644 --- a/packages/client/src/pages/Game/components/Arrows/Arrows.scss +++ b/packages/client/src/pages/Game/components/Arrows/Arrows.scss @@ -1,23 +1,23 @@ -@import "../../../../scss/vars.scss"; +@import '../../../../scss/vars.scss'; .controll-arrows { - position: relative; - display: flex; - align-items: center; - justify-content: center; - height: 200px; - width: 290px; - - background: url('@/assets/images/svg/arrow-controll-bg.svg') no-repeat center - center; + position: relative; + display: flex; + align-items: center; + justify-content: center; + height: 200px; + width: 290px; + + background: url('@/assets/images/svg/arrow-controll-bg.svg') no-repeat center + center; } .horizontal-arrows { - position: relative; - display: flex; - justify-content: space-between; - width: 100%; - padding: 0 20px; + position: relative; + display: flex; + justify-content: space-between; + width: 100%; + padding: 0 20px; } // .vertical-arrows { @@ -120,4 +120,4 @@ // color: $text-color; // padding: 12px; // } -// } \ No newline at end of file +// } diff --git a/packages/client/src/pages/Game/components/Arrows/Arrows.tsx b/packages/client/src/pages/Game/components/Arrows/Arrows.tsx index ba91afe..17fcd42 100644 --- a/packages/client/src/pages/Game/components/Arrows/Arrows.tsx +++ b/packages/client/src/pages/Game/components/Arrows/Arrows.tsx @@ -1,113 +1,108 @@ -import { useEffect, useState } from 'react'; -import { ButtonMid } from '../buttons/ButtonMid/ButtonMid'; -import './Arrows.scss'; +import { useEffect, useState } from 'react' +import { ButtonMid } from '../buttons/ButtonMid/ButtonMid' +import './Arrows.scss' export const Arrows = () => { const [activeButtons, setActiveButtons] = useState({ upButton: false, downButton: false, leftButton: false, - rightButton: false + rightButton: false, }) const toggleButton = (buttonName: string, state: boolean) => { - - setActiveButtons({ ...activeButtons, [buttonName]: state}); - }; + setActiveButtons({ ...activeButtons, [buttonName]: state }) + } + + const handleKey = (event: KeyboardEvent) => { + console.log(activeButtons) - const handleKey = (event: KeyboardEvent) => { - console.log(activeButtons); - switch (event.key) { case 'ArrowUp': - toggleButton('upButton', event.type === 'keydown' ? true : false); - break; + toggleButton('upButton', event.type === 'keydown' ? true : false) + break case 'ArrowDown': - toggleButton('downButton', event.type === 'keydown' ? true : false); - break; + toggleButton('downButton', event.type === 'keydown' ? true : false) + break case 'ArrowLeft': - toggleButton('leftButton', event.type === 'keydown' ? true : false); - break; + toggleButton('leftButton', event.type === 'keydown' ? true : false) + break case 'ArrowRight': - toggleButton('rightButton', event.type === 'keydown' ? true : false); - break; + toggleButton('rightButton', event.type === 'keydown' ? true : false) + break default: - break; + break } - }; + } useEffect(() => { - window.addEventListener('keydown', handleKey); - window.addEventListener('keyup', handleKey); + window.addEventListener('keydown', handleKey) + window.addEventListener('keyup', handleKey) return () => { - window.removeEventListener('keydown', handleKey); - window.removeEventListener('keyup', handleKey); - }; - }, []); + window.removeEventListener('keydown', handleKey) + window.removeEventListener('keyup', handleKey) + } + }) return (
-
- - - - - - - - - - -
-
- - - - - - - - - - -
+
+ + + + + + + + + + +
+
+ + + + + + + + + + +
) } diff --git a/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss b/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss index 7f1717b..759ef17 100644 --- a/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss +++ b/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss @@ -1,32 +1,31 @@ -@import "../../../../../scss/vars.scss"; +@import '../../../../../scss/vars.scss'; .button-middle { - outline: none; - border: none; - cursor: pointer; - border-radius: 8px; - background-color: $c_button; - transition: border-color $animation-base-speed; - - padding: 4px 12px; - display: block; - - border-top: 5px solid $c_button-top; - border-bottom: 5px solid $c_button-bottom; - - font-size: 16px; - font-family: $f_default-font-family; - font-weight: 900; - color: $c_font-default; - text-decoration: none; - text-align: center; + outline: none; + border: none; + cursor: pointer; + border-radius: 8px; + background-color: $c_button; + transition: border-color $animation-base-speed; - width: 76px; - height: 64px; - - &_active { - border-bottom-color: $c_button-top; - border-top-color: $c_button-bottom; - } + padding: 4px 12px; + display: block; + + border-top: 5px solid $c_button-top; + border-bottom: 5px solid $c_button-bottom; + + font-size: 16px; + font-family: $f_default-font-family; + font-weight: 900; + color: $c_font-default; + text-decoration: none; + text-align: center; + + width: 76px; + height: 64px; + + &_active { + border-bottom-color: $c_button-top; + border-top-color: $c_button-bottom; } - \ No newline at end of file +} diff --git a/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx b/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx index cc439c2..b1a9320 100644 --- a/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx +++ b/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx @@ -1,24 +1,22 @@ import './ButtonMid.scss' type ButtonMidPropsType = { - children: React.ReactNode; - isPressed: boolean, - buttonName: string, - toggleButton: (buttonName: string, state: boolean) => void, - + children: React.ReactNode + isPressed: boolean + buttonName: string + toggleButton: (buttonName: string, state: boolean) => void } export const ButtonMid = (props: ButtonMidPropsType) => { - const { children, isPressed, buttonName, toggleButton } = props; + const { children, isPressed, buttonName, toggleButton } = props return ( - ) } diff --git a/packages/client/src/pages/Leaderboard/Leaderboard.tsx b/packages/client/src/pages/Leaderboard/Leaderboard.tsx index 47f390b..27298bf 100644 --- a/packages/client/src/pages/Leaderboard/Leaderboard.tsx +++ b/packages/client/src/pages/Leaderboard/Leaderboard.tsx @@ -15,9 +15,9 @@ export const Leaderboard = () => { tagName="h1" className="leaderboard-page__title">
- {Array.from({ length: RECORD_ITEMS_COUNT }).map(_ => { + {Array.from({ length: RECORD_ITEMS_COUNT }).map((_, index) => { return ( -
+
Date: Sun, 29 Sep 2024 04:50:51 +0500 Subject: [PATCH 07/20] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20Favicon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/index.html | 2 +- packages/client/public/favicon.png | Bin 0 -> 11822 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/client/public/favicon.png diff --git a/packages/client/index.html b/packages/client/index.html index 609278c..d63e210 100644 --- a/packages/client/index.html +++ b/packages/client/index.html @@ -2,7 +2,7 @@ - + diff --git a/packages/client/public/favicon.png b/packages/client/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..42425cea8d75c7a8302376a80bc7790de90660b7 GIT binary patch literal 11822 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 literal 0 HcmV?d00001 From cd7f210c028aa5035d4af9caf8b7e02e4f082335 Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Sun, 29 Sep 2024 04:52:11 +0500 Subject: [PATCH 08/20] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=87=D1=83=D1=82=D1=8C=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/scss/vars.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/client/src/scss/vars.scss b/packages/client/src/scss/vars.scss index 0ab6285..8a23747 100644 --- a/packages/client/src/scss/vars.scss +++ b/packages/client/src/scss/vars.scss @@ -9,6 +9,7 @@ $img_default-background: url('@/assets/images/page-background.png'); // main colors $primary-color: #839d22; $second-color: #00aeef; +$error-color: #a51300; $text-color: #f8f8f8; $text-color-muted: #f5f5f5; // colors @@ -24,6 +25,8 @@ $c_button_blue: $second-color; $c_button-top_blue: #5fe1ff; $c_button-bottom_blue: #0079a7; +$c_button_red: $error-color; + $c_white: #fff; $c_black: #000; @@ -38,6 +41,7 @@ $red-ligth-gradient: radial-gradient(#fc2204 -40%, transparent 70%); $main-text-shadow: 1px 0 $c_black, -1px 0 $c_black, 0 1px $c_black, 0 -1px $c_black, 1px 1px $c_black, -1px -1px $c_black, 1px -1px $c_black, -1px 1px $c_black; +$overlay-color: #000000bd; // headers $nav_list-gap: 40px; From f73667e4527ac291dfd6d6defb41dc4df8592bcc Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Sun, 29 Sep 2024 04:52:33 +0500 Subject: [PATCH 09/20] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20Favicon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/public/vite.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 packages/client/public/vite.svg diff --git a/packages/client/public/vite.svg b/packages/client/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/packages/client/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 538af89527cb42de5e66b0bc806af52818bcd7d4 Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Sun, 29 Sep 2024 04:55:18 +0500 Subject: [PATCH 10/20] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=20Icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/public/sprite.symbol.svg | 74 +++++++++++++++++++ packages/client/src/app/App.tsx | 8 +- .../client/src/components/ui/Icon/Icon.tsx | 16 ++++ .../src/components/ui/SvgSprite/SvgSprite.tsx | 23 ++++++ 4 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 packages/client/public/sprite.symbol.svg create mode 100644 packages/client/src/components/ui/Icon/Icon.tsx create mode 100644 packages/client/src/components/ui/SvgSprite/SvgSprite.tsx diff --git a/packages/client/public/sprite.symbol.svg b/packages/client/public/sprite.symbol.svg new file mode 100644 index 0000000..1523c16 --- /dev/null +++ b/packages/client/public/sprite.symbol.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/client/src/app/App.tsx b/packages/client/src/app/App.tsx index dae0732..bf1c3b4 100644 --- a/packages/client/src/app/App.tsx +++ b/packages/client/src/app/App.tsx @@ -15,6 +15,7 @@ import { SignUp } from '@/pages/SignUp/SignUp' import { Thread } from '@/pages/Thread/Thread' import '@/scss/styles.scss' import { createBrowserRouter, RouterProvider } from 'react-router-dom' +import { SvgSprite } from '@/components/ui/SvgSprite/SvgSprite' const routerConfig = createBrowserRouter([ { @@ -81,7 +82,12 @@ const routerConfig = createBrowserRouter([ ]) function App() { - return + return ( + <> + + + + ) } export default App diff --git a/packages/client/src/components/ui/Icon/Icon.tsx b/packages/client/src/components/ui/Icon/Icon.tsx new file mode 100644 index 0000000..e76c674 --- /dev/null +++ b/packages/client/src/components/ui/Icon/Icon.tsx @@ -0,0 +1,16 @@ +type IconPropsType = { + id: string + width?: number + height?: number + className?: string +} + +export const Icon = (props: IconPropsType) => { + const { id, width = 24, height = 24, className = '' } = props + + return ( + + + + ) +} diff --git a/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx b/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx new file mode 100644 index 0000000..f3169ec --- /dev/null +++ b/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx @@ -0,0 +1,23 @@ +import { useEffect } from 'react' + +export const SvgSprite = () => { + useEffect(() => { + fetch('/sprite.symbol.svg') + .then(res => res.text()) + .then(svgContent => { + const sprite = document.querySelector('#svg-sprite') + + if (!sprite) { + const div = document.createElement('div') + + div.id = 'svg-sprite' + div.style.display = 'none' + div.innerHTML = svgContent + + document.body.appendChild(div) + } + }) + }, []) + + return null +} From 82445916e30f19ebf015e3299b84acda695bcb32 Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Sun, 29 Sep 2024 04:55:56 +0500 Subject: [PATCH 11/20] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D0=B0=D0=BB=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/Modal/Modal.scss | 91 +++++++++++++++++++ .../src/components/common/Modal/Modal.tsx | 33 +++++++ 2 files changed, 124 insertions(+) create mode 100644 packages/client/src/components/common/Modal/Modal.scss create mode 100644 packages/client/src/components/common/Modal/Modal.tsx diff --git a/packages/client/src/components/common/Modal/Modal.scss b/packages/client/src/components/common/Modal/Modal.scss new file mode 100644 index 0000000..033c48e --- /dev/null +++ b/packages/client/src/components/common/Modal/Modal.scss @@ -0,0 +1,91 @@ +@import '../../../scss/vars.scss'; + +$border-radius: 8px; +$border-color: #70842f; + +.modal { + display: none; + justify-content: center; + align-items: center; + position: fixed; + inset: 0; + background: $overlay-color; + z-index: 20; + + &_show { + display: flex; + } + + &__close-btn { + background: none; + outline: none; + border: none; + cursor: pointer; + padding: 0; + + position: absolute; + right: -24px; + top: -24px; + } + + &__content { + position: relative; + padding: 12px; + border-radius: $border-radius; + min-width: 200px; + min-height: 200px; + max-width: 500px; + + &::before { + content: ''; + position: absolute; + inset: 0; + border-radius: $border-radius; + background: linear-gradient(to left, #5e5e5e, #414243); + z-index: -1; + } + + &::after { + content: ''; + position: absolute; + inset: 7px; + border: 2px solid $border-color; + border-radius: 4px; + background: $c_black; + z-index: -1; + } + } + + &__decor { + position: absolute; + inset: 0; + z-index: -1; + + &::before { + content: ''; + position: absolute; + height: 8px; + left: 0; + top: 0; + right: 0; + + background: url('@/assets/images/svg/title-decor.svg') no-repeat center + center; + background-size: contain; + } + + &::after { + content: ''; + position: absolute; + height: 8px; + left: 0; + bottom: 0; + right: 0; + + background: url('@/assets/images/svg/title-decor.svg') no-repeat center + center; + background-size: contain; + transform: rotate(180deg); + } + } +} diff --git a/packages/client/src/components/common/Modal/Modal.tsx b/packages/client/src/components/common/Modal/Modal.tsx new file mode 100644 index 0000000..b09a86c --- /dev/null +++ b/packages/client/src/components/common/Modal/Modal.tsx @@ -0,0 +1,33 @@ +import { Icon } from '@/components/ui/Icon/Icon' +import './Modal.scss' + +type ModalPropsType = { + show?: boolean + onClose: () => void + width?: number | null + height?: number | null + children: React.ReactNode +} + +export const Modal = (props: ModalPropsType) => { + const { children, onClose, show = false, width = null, height = null } = props + + return ( +
+
e.stopPropagation()} + style={{ + width: width ? `${width}px` : '', + height: height ? `${height}px` : '', + }}> +
+ + + {children} +
+
+ ) +} From c22b3028831213eb0e3c3d125772188b0e9b024b Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Sun, 29 Sep 2024 04:56:41 +0500 Subject: [PATCH 12/20] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=20=D0=9F=D1=80=D0=B5=D0=BB=D0=BE=D0=B0=D0=B4=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/ui/Loader/Loader.scss | 43 +++++++++++++++++++ .../src/components/ui/Loader/Loader.tsx | 18 ++++++++ 2 files changed, 61 insertions(+) create mode 100644 packages/client/src/components/ui/Loader/Loader.scss create mode 100644 packages/client/src/components/ui/Loader/Loader.tsx diff --git a/packages/client/src/components/ui/Loader/Loader.scss b/packages/client/src/components/ui/Loader/Loader.scss new file mode 100644 index 0000000..0ec947d --- /dev/null +++ b/packages/client/src/components/ui/Loader/Loader.scss @@ -0,0 +1,43 @@ +@import '../../../scss/vars.scss'; + +$road-color: #2c414c; + +.preloader { + position: fixed; + display: none; + align-items: center; + justify-content: center; + inset: 0; + z-index: 10; + background-color: $overlay-color; + + &_show { + display: flex; + } + + &__road { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 150px; + height: 150px; + + background-color: $road-color; + background-image: url('@/assets/images/ground.png'); + background-size: 50px 50px; + border-radius: 20px; + + animation: moveRoad 2s linear infinite; + } + + &__image { + width: 60px; + } +} + +@keyframes moveRoad { + 100% { + background-position: 0px 50px; + } +} diff --git a/packages/client/src/components/ui/Loader/Loader.tsx b/packages/client/src/components/ui/Loader/Loader.tsx new file mode 100644 index 0000000..80194ef --- /dev/null +++ b/packages/client/src/components/ui/Loader/Loader.tsx @@ -0,0 +1,18 @@ +import './Loader.scss' +import LoaderGif from '@/assets/images/loader.png' + +type LoaderPropsType = { + show?: boolean +} + +export const Loader = (props: LoaderPropsType) => { + const { show } = props + + return ( +
+
+ loader +
+
+ ) +} From 0d777d0f7e90c8411261eff79ec2c77dc59094d4 Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Sun, 29 Sep 2024 04:57:49 +0500 Subject: [PATCH 13/20] =?UTF-8?q?=D0=92=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D0=B5=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20prop=20classNam?= =?UTF-8?q?e=20=D0=BD=D0=B5=20=D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/components/ui/Button/Button.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/client/src/components/ui/Button/Button.tsx b/packages/client/src/components/ui/Button/Button.tsx index 84670b3..e3a9583 100644 --- a/packages/client/src/components/ui/Button/Button.tsx +++ b/packages/client/src/components/ui/Button/Button.tsx @@ -3,11 +3,11 @@ import './Button.scss' export const Button = (props: { text: string - className: string - useFixWidth: boolean + className?: string + useFixWidth?: boolean href?: string }) => { - const { text, className, useFixWidth = false, href = '/' } = props + const { text, className = '', useFixWidth = false, href = '/' } = props return ( Date: Sun, 29 Sep 2024 04:58:48 +0500 Subject: [PATCH 14/20] =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=20CustomPageTitle=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83?= =?UTF-8?q?=20=D0=B2=20=D1=81=D1=82=D0=B8=D0=BB=D1=8F=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/ui/CustomPageTitle/CustomPageTitle.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/ui/CustomPageTitle/CustomPageTitle.scss b/packages/client/src/components/ui/CustomPageTitle/CustomPageTitle.scss index 087ee8e..c91c2f6 100644 --- a/packages/client/src/components/ui/CustomPageTitle/CustomPageTitle.scss +++ b/packages/client/src/components/ui/CustomPageTitle/CustomPageTitle.scss @@ -58,11 +58,11 @@ $outline-color: #101010; outline: 3px solid $outline-color; &::before { - @include borderDecorSettings(0, 'auto'); + @include borderDecorSettings(0, auto); } &::after { - @include borderDecorSettings('auto', 0); + @include borderDecorSettings(auto, 0); transform: rotate(180deg); } From 95411b0129ead914da2caf09822f72bc4595e736 Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Sun, 29 Sep 2024 05:20:33 +0500 Subject: [PATCH 15/20] =?UTF-8?q?=D0=A1=D0=B2=D1=80=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D1=83=20=D0=B8=D0=B3=D1=80=D1=8B=20=D0=B8=20=D0=BE=D0=BA=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=B0=20=D0=B8=D0=B3?= =?UTF-8?q?=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 175 ++++++++++++++-- .../client/src/assets/images/game-info.jpg | Bin 0 -> 54339 bytes packages/client/src/assets/images/ground.png | Bin 0 -> 10845 bytes packages/client/src/assets/images/loader.png | Bin 0 -> 62794 bytes .../assets/images/svg/arrow-controll-bg.svg | 194 +++++++++--------- .../assets/images/svg/fire-controll-bg.svg | 39 ++++ .../src/assets/images/svg/kills-count-bg.svg | 94 +++++++++ .../images/svg/pause-and-help-controll-bg.svg | 150 ++++++++++++++ .../images/svg/title-decor-vertical.svg | 15 ++ packages/client/src/pages/Game/Game.scss | 153 ++++++++++++++ packages/client/src/pages/Game/Game.tsx | 113 +++++++++- .../pages/Game/components/Arrows/Arrows.scss | 112 +--------- .../pages/Game/components/Arrows/Arrows.tsx | 143 +++++-------- .../components/ControllBtn/ControllBtn.scss | 62 ++++++ .../components/ControllBtn/ControllBtn.tsx | 17 ++ .../components/FireControll/FireControll.scss | 19 ++ .../components/FireControll/FireControll.tsx | 27 +++ .../components/KillsCounter/KillsCounter.scss | 24 +++ .../components/KillsCounter/KillsCounter.tsx | 16 ++ .../Game/components/PauseHelp/PauseHelp.scss | 21 ++ .../Game/components/PauseHelp/PauseHelp.tsx | 31 +++ .../buttons/ButtonMid/ButtonMid.scss | 31 --- .../buttons/ButtonMid/ButtonMid.tsx | 22 -- yarn.lock | 87 ++++++-- 24 files changed, 1161 insertions(+), 384 deletions(-) create mode 100644 packages/client/src/assets/images/game-info.jpg create mode 100644 packages/client/src/assets/images/ground.png create mode 100644 packages/client/src/assets/images/loader.png create mode 100644 packages/client/src/assets/images/svg/fire-controll-bg.svg create mode 100644 packages/client/src/assets/images/svg/kills-count-bg.svg create mode 100644 packages/client/src/assets/images/svg/pause-and-help-controll-bg.svg create mode 100644 packages/client/src/assets/images/svg/title-decor-vertical.svg create mode 100644 packages/client/src/pages/Game/components/ControllBtn/ControllBtn.scss create mode 100644 packages/client/src/pages/Game/components/ControllBtn/ControllBtn.tsx create mode 100644 packages/client/src/pages/Game/components/FireControll/FireControll.scss create mode 100644 packages/client/src/pages/Game/components/FireControll/FireControll.tsx create mode 100644 packages/client/src/pages/Game/components/KillsCounter/KillsCounter.scss create mode 100644 packages/client/src/pages/Game/components/KillsCounter/KillsCounter.tsx create mode 100644 packages/client/src/pages/Game/components/PauseHelp/PauseHelp.scss create mode 100644 packages/client/src/pages/Game/components/PauseHelp/PauseHelp.tsx delete mode 100644 packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss delete mode 100644 packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx diff --git a/package-lock.json b/package-lock.json index fd496d3..63bc191 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,6 @@ "workspaces": [ "packages/*" ], - "dependencies": { - "normalize": "^0.3.1", - "react-router-dom": "^6.26.2", - "sass": "^1.79.1" - }, "devDependencies": { "@evilmartians/lefthook": "^1.3.9", "eslint-plugin-react": "^7.37.0", @@ -30,6 +25,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "dev": true, "license": "MIT" }, "node_modules/@ampproject/remapping": { @@ -2930,10 +2926,35 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz", + "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==", + "dev": true, + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", + "dev": true, "license": "MIT", "engines": { "node": ">=14.0.0" @@ -3340,14 +3361,12 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.0.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.17.tgz", - "integrity": "sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==", + "version": "18.3.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.10.tgz", + "integrity": "sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==", "dev": true, - "license": "MIT", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, @@ -3361,13 +3380,6 @@ "@types/react": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", @@ -3393,6 +3405,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", + "dev": true + }, "node_modules/@types/yargs": { "version": "17.0.11", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", @@ -4147,6 +4165,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/babel-jest": { "version": "29.0.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.0.1.tgz", @@ -6815,7 +6844,7 @@ "node": ">=0.6.0" } }, - "node_modules/Falcon-Tanks": { + "node_modules/falcon-tanks": { "resolved": "packages/client", "link": true }, @@ -6989,6 +7018,26 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -7848,10 +7897,21 @@ "node": ">=10" } }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/immutable": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, "license": "MIT" }, "node_modules/import-fresh": { @@ -10958,6 +11018,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/normalize/-/normalize-0.3.1.tgz", "integrity": "sha512-DfyFcERXw4cjxUBgmATdxnCipRFoRvj0tNo+MWwjhebV9GZz2HYoNkXodEqS565uomk0CxEs90nEwrmj+aI9RQ==", + "dev": true, "dependencies": { "stylus": "*" }, @@ -12532,6 +12593,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -12674,6 +12741,29 @@ "dev": true, "license": "MIT" }, + "node_modules/react-redux": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "dev": true, + "dependencies": { + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25", + "react": "^18.0", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -12688,6 +12778,7 @@ "version": "6.26.2", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "dev": true, "license": "MIT", "dependencies": { "@remix-run/router": "1.19.2" @@ -12703,6 +12794,7 @@ "version": "6.26.2", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "dev": true, "license": "MIT", "dependencies": { "@remix-run/router": "1.19.2", @@ -13068,6 +13160,21 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "dev": true + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "dev": true, + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", @@ -13143,6 +13250,12 @@ "dev": true, "license": "MIT" }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -13358,6 +13471,7 @@ }, "node_modules/sass": { "version": "1.79.2", + "dev": true, "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -13375,6 +13489,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.0.tgz", "integrity": "sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==", + "dev": true, "license": "MIT", "dependencies": { "readdirp": "^4.0.1" @@ -13390,6 +13505,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.1.tgz", "integrity": "sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 14.16.0" @@ -13403,6 +13519,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true, "license": "ISC" }, "node_modules/saxes": { @@ -13714,6 +13831,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -14072,6 +14190,7 @@ "version": "0.63.0", "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.63.0.tgz", "integrity": "sha512-OMlgrTCPzE/ibtRMoeLVhOY0RcNuNWh0rhAVqeKnk/QwcuUKQbnqhZ1kg2vzD8VU/6h3FoPTq4RJPHgLBvX6Bw==", + "dev": true, "license": "MIT", "dependencies": { "@adobe/css-tools": "~4.3.3", @@ -14094,6 +14213,7 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 8" @@ -14839,6 +14959,15 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "dev": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15527,7 +15656,7 @@ } }, "packages/client": { - "name": "Falcon-Tanks", + "name": "falcon-tanks", "version": "1.0.0", "license": "MIT", "dependencies": { @@ -15538,6 +15667,7 @@ "react-dom": "^18.2.0" }, "devDependencies": { + "@reduxjs/toolkit": "^2.2.7", "@testing-library/react": "^13.3.0", "@types/jest": "^28.1.8", "@types/react": "^18.0.17", @@ -15545,11 +15675,16 @@ "@typescript-eslint/eslint-plugin": "^5.35.1", "@typescript-eslint/parser": "^5.35.1", "@vitejs/plugin-react": "^2.0.1", + "axios": "^1.7.7", "eslint": "^8.23.0", "jest": "^28", "jest-environment-jsdom": "^29.0.1", - "lefthook": "^1.3.9", + "lefthook": "^1.7.15", + "normalize": "^0.3.1", "prettier": "^2.7.1", + "react-redux": "^9.1.2", + "react-router-dom": "^6.26.2", + "sass": "^1.79.1", "ts-jest": "^28.0.8", "typescript": "^4.8.2", "vite": "^3.0.7" diff --git a/packages/client/src/assets/images/game-info.jpg b/packages/client/src/assets/images/game-info.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9346ea2efa5c07da5c8afab5bcb8837a893d1ba3 GIT binary patch literal 54339 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 literal 0 HcmV?d00001 diff --git a/packages/client/src/assets/images/ground.png b/packages/client/src/assets/images/ground.png new file mode 100644 index 0000000000000000000000000000000000000000..158a9ca388cd8a3702844cfcd2a4a245a8e177e0 GIT binary patch literal 10845 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 literal 0 HcmV?d00001 diff --git a/packages/client/src/assets/images/loader.png b/packages/client/src/assets/images/loader.png new file mode 100644 index 0000000000000000000000000000000000000000..8114e59da464bcbd42cfe7cd314e10feef77e3af GIT binary patch literal 62794 zcmV*DKy1H>P)O4P(rUNT?9u( z#nDlxym`*doB7Q*PH}vWpY!xNilEV1-}$#i;9RMNmN=|P8F4lsC-o@g@(D%tG`(-331KnA4oc9 zN9%eoH+S+1=tYN~&!(8D7+O|uq-}@O$;D*^`FVMhPM%ojNBf^oq8-QLsp(=YJ@fhu zI{s2FZ9AGu5s5>UL@n3SsQI}B3XJGSyUs^bXxu4LjVRHW0bXKC$l!%=Ve7B4a}AyM8} z!|pxui)#?n9*N{ddiwXHm;QYjMf1C>S|26XAWn9MwY{#zW(6N^%QcUU)TDv!bidP26%SFyk z20Kyw8)?&NL(E=q{h4TTad1>j@LdO;$?oypFZ3RcTf6M&W~1$VI-`5A3^xzbefsG# zOKN>xN3AbCNxvUAh|2rw?!S#*oTV#%Cu=Z$wA_-e4emjItsY6Ubh_LwA8^#$FJohV znKvbmR7pur6$3)1^7-7NIof$hP>7Ze;_2$H7#shfIjvk(ORLwc6G=@?r)lM0g!k_4 zV@pASLGt(Hx$fj2WTmBpL`Oy|ZBot1+1^3K)zOLEeS6ccvoW-Aqmlgl?W8f|?`@}| zq|rDT>?Iw<&DllC2sa=ZlMHm|T&dQE>yM{V`D$OPSQSXKD|{$>hMs&w`e^sx`29wT zN*>1D&j6)G;vcAu9&RtU^t8Mogfb>tOB$qwpx@Fm z%FK79*)^_|G~QZTY{~>H3JB|`d^AUAQqDAQicB0#C9AxsdUG(XI}k#v_k>Z=VmAtl z9eO7t7!lt`bgBg%Z~I=txJxZs>?<8MWd3p^XA(qJb)j_f)k&0^ZAsB778DdUP{~L& zwufIY?vE`fViaeXJXC(~CQ*q>mApMXP2ZZn6(1imn>gE*GaMwpok`9tSDG-xnO1Dc zln?fvKiVJU_;Q#2Yb6u-RO;{x@$vMM@59Y=AdSu#O96iV%DGp6 zDlM(h(&c35l7pRLz0T8n1jWV1n{|n5zXO>zt&qm#8RYNilp$1Ivs6o$Hzl9kT-oJN zGf~I*ii(9)y(y3`y;VXte!Grp*KVMlNAu{~FRJM93*%_UjG0>6S+k1nWa8rBr1ihB z$HI+1RI@cm`dnm^U*bZG>WngIqx*1a>wEDPOD3*vBgxC%gMtH%uG57*mso1# zK6ejS0iE=c?MCu3_LdCxJ~v8!S8UE?=hKsPD|ZFcgsEPV@ZbyS(!1B6jHkfxew2`I zE4}~Wiwo%Bl^hur>RJ-D5#V=!Kf;5c_nl1O4mDp+pt;LDY3Ys-ag|QJP$s{S{m&=T zlzC1R$eygEZOf#v(nrapt|^!1EK$7M*^6DNdP}hKFb^Mv3%w|PqMc+iW1%}cZ2ctN zsIkNN84pDh*aVv3^+Af3x{4oGe>6vIf}yso)>jOP>k0g@niiUfO-gwP4G0?`<4NU) zKp9_VSNX{JlQ`B|#veF(IQI|jC-<8!jgs_fS&q_@b@(2j2}VCSct>B%k>AXzdhzVn z?Te6KWQOaFXUE9zo=XYztH1421~If)Pd8`s=5`XvvyHTDtGf6GfZsIDlBehO4QAe{$b37;}ZD^MxAY^rOsQkJ( z>E#*DWbJ+Tc%2}ukALJ!thVl% z{`&MGAAVA2BZ_?W^dS8HbB)bY^lILauOFErJTl&FV59szZ6JMha)@{kt#9+S+b4$5*F06febRz%HQ3PeuDz&2Cze_N zFcr~``Q3C>$ptc2K<9&Xba>bkRL_4eXJP#3lifjmM?O%-o}QjhIT#FOPI~euSU9(s`Z`xqbxc9Q68h={eOo1e~Rau!v42*cdDx2g?af z>gG9s zlE#gY;SA$q)--qadV(mB0W^pkk14ngDO&6&BNpH%Umi2M%F~J6E-w2yHpUuJ1|uA5 zjRDG?=eO=IuH?ajUw_UBZkCV#2p(tqQu25!9zGp-qN#|Nw~hF0m@_A3S!vfZ^YuJq z#cZvo` zw8>BNUsRtbFi5W{vuKmA**z5|0?If(bG*2=ahw;@<9GRr)s&W+*0nNY$7IU83=0m? zBqYcvj^%_I2AWmvX(mqg2J-h|vwQhae5#|_y`sgQqD(-5GlencVVY+u<0GRp#z}1KFzJeYkW?GRy&+p+&o_%w=nWH+2oz&=L3tCYhBDLOFw}oogZ4|}U zG=-8k`=fwSO`o~=W(9@D3}J`PN&r$!wq0C?OL=g&G<=|HQvf$g5AqA{N7w&tGhP1a zJjr0+g>f`@vHzV+Z{(4eu@^O8OrkY=LaFK0be4P*DWJF%Yif8Vo;EZ`(yT?^+Or3r zpFp!0`D*9y{AnwdFH54J=z;P{lN?ZM(N0}>978Z7A!Tux;-f2ce^cS#_HCs@#F zINqElzr>S)X zKy3Kh@NjFJBN*1yQvlBjPQNzUEMIjd04xZOyqPjn=6g^mV>?+4AZ1Rqp~{T`g0e!2 z*uhWBv7)6s(TUF(CWS(olUKV|X6?RENe?kb_7e;VdF?(Q$7q+GlrgI;g3}K+R|c<1 zwame58H$r@BC{8}NM{$B2%kSlz;-B;J=2kv?F^I*$4p^BE4)8L#4*(HY%DFUOQYgd z{sL-YHd4DcxI@0GWeUo?+BaZDnf+IiC9q&BCm8fvu-u<~gZnVhx))Zu-$Cp=Jh^}IP$0Y$&n=|$ZxzX`Xz#^wB1T3oqmqVd=a7Z#L#cR0pvbIh zSDM2eoO<4PcC41J`C=xGndm}|&yJDv0~`)O-aq?uJtd6+QrJ^w=UNZ!>S7~3a434m z5RN2;cuS(wuT2t3=805X`cUose&i%7g|CvWg7b5)R+Dd_1^4oy6vKeAzpo!TJKCZA z>n1LQ;ady`^X4s(u?fn|uJIMYtS&NXuy%f5Qtd;CJQY@Y$@%ds6*OaJfs~P#m(S?7 zQLr4vg|M^FQIxU&sURurU#Q~b$YTbJtNUO?ShxmOH=UeD?7LTSak4y*=Yfi=c{w@Q zn3cgs_@`=+@9lz8`w-*fJZ|mMFMHfNm@4z(ui;|wr%ZW zRpe&9UB=A@Tce_k{-ZDI?MFNoMTm6WKU!~HbbYb~-99o*CjU1Z?5@eZ>#2q9?r@@A-jjF%+X9; z)=pOB{rSTMi)nqeJGK62Nt<`dW7doB5fZEi+7B*ZcE^(OHk)G^bm)hX)pA>vTQ1wse%CvJWap5J)twuRlqx zA62n345ghKLSJmMq3cooX;t@b|M}1qQ4dxoX$32Eh0&{9d#xBK;x==mn|$71Jv)&8 zG|7VY_UVpS^su-lcaATv>qb^}@AiNGivxIPY@edj7EjQveOC0x!lCqHKp*<`v?27g zS8rP9p}YCemBCTbxBFJ0R`Xdl4`k%Zvo`^7+{VIR8&wW^BAVM*_eY`(AKmyhEMm-V z%2b`MFDvyPlwi5eG1S4|D`y8ghm1BD>*(F#F2j}khR_&xQ=SD3*IAzSFS3WX7%(2- zJT(ko3xp{rd!kuj(^Np?;D=vVT|@|jNuSMOsz+IA8Rh3qMG$nm>3swO0ey6pCjzOU zlC-(K%i5H&Uk7XrxJ+008z44*@DHY#9gwH|{ON+{?cIL>%D!WU`3Z9=xXU~h3{c;y z`M~%G-g#7bBu&i8HH+4&g2-%aOq@h%RXhjMUKu#L{kR9 z9soYf43K%JKp^9Kc#SBah^HGWi0Iv(pgGlx!P$_gl8@Aa^(0 zJ4h#^p~;MV`i1mmlysz^r9e$J6xA8xA}DC5%76@s__!8VH<1}LW{EP0r&p{Fm)JUp zln2hu(v6XJEL3&YXWH@ zxib`03IL^t_h43xyMX{B2~U@ydI=LS`vTluothBfFhF8}#Q==~9)nDF=_i$D;PUC$ zrU>Y~hF=8`1vKsp7cYx4m9_qi<&0qFn}yjk0JWEI8Y>|8CPEwRX z@E=%Q{Af$z*o~X)!F;<7W*MpiMGyZdjZ!C!q*~?)7ghRl$li;}Rs;zBV`ilr&8zVe zxVHVXpo<(lTO!mE@c%#~QHjcCoIWU1u{?>9>n+;DK(t|M^}M1sm}RtLO3e_5cw z?MdS;In!i;;RC}J9C%56um;sHVcB{jnoho)&)9IVqzh-*wfRD(JP+7^dYQL`0rqe> z0AYc>XXZ$lV0lCE9c4gSiB1_#zy0{I8JrF?Lw24@r#L2BfOrE4zTwnZu8|Y9oSmyt zGa+MgTqSl85Y}JPZaWbt0JfSBpno;*{m&;$dRPVsy{1fIrJ@W#;`aFd=^K+7@3r7D z$yO8z;;9H=`B9k)Y;P(T-l!C1c0HZOwGE}J%|>n)eQ0Gvw3#9h#3;H@#z#}eG>QhP zI}*+&9xM#|f>IYMUhVmv${=MLG1(?ezLJe?%79%vcZnB&dG=Cpa@GjSnc+gSO2Zl7^`WB|E2!n%d`%fN z&>E&%jpM*6Xjdu|C~=&%(6PYkt!tXZ_Z`iZ!Plg|ruLDKjfX--nfQ#MG;f(Nt==)3 z)*lR^ZKtDzr8{}9fvsS{>B6|i22my~exO8O;?jpvMy{1aW!mS9=#BcCR+xTG=x0=A zR8E&FJD!Q=z{N-oIyegN3sNvQSU&BVZ2{b#EF>KQTxgin%bls|Oum*DeG@FxKHnA- zWz6~+h0WNeOuH})LNj$O%oj@@LJL;-Na&_`WgrDb4(ib9ZQ{nh^KgL{20{d7-cmma z5w*`3p(IrqvmRI-4nR)BI0XS=dJmJ<)bPyWE#cBpaYXf{ zcyX-SQw<+P5W!2!vDVIgjD5tPffEP1qnX>uC$GRV0lxke7ZWQHGDONwUt1`VGepqv z$s(fmAdxsk@DRyU&rw-K`oe-k+rR{NJJ}c}YeDSS!6%hvL_9$N&I_RX} z+uW67*@fV%GUaE=9GoYKD6ef2_f3b1Kf-gE-XdH#Yjz>O({c&pA)JTChVb5lgar{! zgfi+mltCE?Keo*d?o9mKEVEW6iK?<_b*d0S@#%pSiscb^BaU_@7%*elI_f!;F)gP9 zB+?cz{ikW{(Ahz+#TB&}qtl3U_YZPCHbp3&WZfrA4g z5x?K*)bnxc@h^99?CiPQyA9=!TaSOK<5r`c14pX9W%)hF_x^Pva%|%Bog;@mZap9Q!JTdC%Xt=A zFXRlqAO_*kW}9*Td3%?G3->vNt&N75$F1ihId1OK2i)4JFKqJdZQT;q@BE*ZTM>up zl|=$)2hi=q!{zTU>TQ3?Jc2JP`uBK!$&e?W{qqW|P4BO=v3T72Ka_)4A=+}-?iW|a z4`#B2ExliDNndPlYb6|aMqvEw=lZCvhW@_MhTdOcMW1t;LwQjTB#rjEOgJw3b82Q?!#1Kd77gyY~GhW<%^4n^zeHV5djv{SwR?-P0c&NPNv zW$6IcFdRdkkGo#q``|!s3RkFg@I695Vz-ipZy(fl@B3iI2QD4@e#_Q z-|64$f9{CI{XsYz=o64OwqlL?Q{CyBM=$#OVoT|8Z=W8lu#tY;i(20epw_nr@@K_= z^XG+635NV&7KfFrpQJrKx>1$#3H_bL<8jyRdmm@Abt9Kr>wdF{E7kBsH~Q&>!NQ9A z$2Keabb}Rr%&iG60*TxwCEJYfaojKndFX zR5v={*ptqV>i==o;O@U#&|6o|GtJ(QyFNeIQK-}T@|*q-j3{mLEz7&*eROYb9H{$j zGhf@nvW|r-PHkHke8Tc8mV$pN`t>6`z}d3ozGEUwDfdmO-X^+6TSTwCuP~>(|mqGL~s8LpC9c=*J}T)p#^1_?yYmb z(njm}hUE=&8|cSraH5KF%62eqd=PLp)J-DpMI=3otE010s0tN!B7E-z7M@fxbEbru zGgBt#QS-hQ+TU`BPMka~1R2)na#zng=ncP6HX3p^Dfb@rG^rZ|bw=Gy^EWdLkZ2&n zMy6~49WE%CE=X~4ap^rtQPEss`rujcpq%V&KIN#y2h95VTYF*r^;2-Bur?O-HFbTg zN@D{@j#(l9=11#F-{450ER>0|?^RFK33bD>L0nhVSzR2{sbLT=K+}@trpzh= z;S0nZ5VMT_0Tjd>Ed1ge*KrO(d;x}#^d4S9nR9p3YqS$E0SYTzY33p~npNe-Fuyxx zO?446*@6Y7!nc|;XTD~bJhd#qwy=^zhVzx>vJjMk&96`<%7zZm z#n`5osqV&hx(9NQ26b%X>wKdwJZ={zFudgAj8#3dzKQvM0b)%M(TYpTgd}z^vVh;l zgsg0ej8p=zkeQ1-%&2;*OrGaKk)s&(cjFkFi<=ObVxwcEqOQ(*3X8Lnh+${X&RFQ7 z{w!dY>O@pgH8>MPpp!=FJUg6hi@M@}x$zF?w4>3flBoZi!~ zuP9r!*-ywA^OiCAw(tDdNn+WBH#`8^v3O%M;{=M_*A6Pjyk7E?SEqR|u+IJ4@i8d>IFkUx!P&zd7m zxTd;>JY3y0!z`-v?XXc!{plE5e;|UE?+O*_1Sp``$FIF%KnE=-b7hi92(4kd&gNrL zvS_(|02pPchVkUGYpNHEF3<_OrKhG*RaLdrY|v6&*+ivToGb;E?NL^VvsdT-{zhB4XJNR=A{JC(wPZshB4%LboE+v*#r ze&=o~D__Wlv7@Oa&RssYtRaNzpN`_c70xxvyqiwY8M@~jke+>`fS&pB)DE)caI(;IRi+X4dw^lkoWUE$ zu4>>8V;fgccCn8H(rD=ed(o5r1{k`tWST@3A#Z?|o2r zjAq_gBpI35wBvZZ>>gHBb!RV&uH^h%GwEg4ZQK3=+4~JTCycd}I$*WGx(SB|>lDp( z1*Oc?1{%dn=@b0faq27=qXY;@2PTXU^J0p)Q*i zbo}L9N*rTN+YU~oy5_QV-^}Z{Kw6Q5$cEC`dKlTz+8*^GJ8HfU;hEQ_h%R-_S+xC-qT`8| zCz+)|T~580OTYQ(fY9C4jVBp* zuC8jJJ!doda~sTD;4s>FFpR(F!Q46~YK7PCiBr7YIgYgNQnI{pNX|?H6)%oejMB!% zyPIKzF?}_emTyj{^odqlK8@!RX~7b2@(E^w;^uIz+#@gKur7mSUy?1yBUncZYCe~# z8Kjx{g&@eod0e>BU+Nf}VkOjY)EzeHU>LAmv403G7tVCK*kmhOvwebag+ZtXhh3F} zFJ$nWn@H>Sj-m|*l9=Z=NjT|eZsal7lnIRN(PF*BmZLFLcPLt9@?1wMEDqvIb1OI; zE=vl6qX$W!)~Q4fl+AzO_kadiz9NV&#Qj>29nLzNvu%e-kt8|~Q4FyJDC4{iD>fp80sdwUAI={7hj zFCL#4<}XmRsxFY$?T^$Xzu1|w3*5PN#0zT^M7Wl-^SH&tbs%=Df^<*6R4#pvIP*z z@eAq02C)%hGRlJv^=Iy`t4iDNXc(XSG|W{tjQZ_&A)xw$svkaT5cdVvw0vinCh?<( zYt;WA!Z6t92#iP5GA0xn$Qad6bWry_x|-v^Z z`K{xA0Zi@Kv=OpZmFb)X%ML(}2iqS6=*8PYG>OX?)~R6*UnpT0!Hm`Co+eXg3vn3E%!T`ghWLa|W9!isn z9Aq=QNkuNQ|mk7k$|jK+n>4Wp?=Mq0BclBSiqv%^?GjmKtD?o1cjc07Ty^Sybf zw_&i#Q8UbXo_k>{r91|?;Eatgu#>Vfr`pNJRM27V{*IedZ9Ehqx~ug-olv*9RBQP< z?%MgP!*yq$Qu}2R?L}!Ziea$G0Bc>#Y6Gc!tx;sjwrET}e1LtPTbYku@ zH}PY3Ux?-DLFk=U$W4FC@hJYJ!ej))2vW1vpCaOi(V+|TsAN^3S$=aCd&wfL=#-(f zV7VXF?hU;sT~Vj@hUwD5!<3*i!|Y>cto>RRQ)#|DO4hradUX<=Vt;1!?ig7EgMI*S z5xd#V<#SbvR~l*QrgRF489PQpwvU2fnZHpYW7I-X3rJ>ZB6;wAUbeme5X3>Je?t1bz^Jp zrVDT>;-n7PeOv0pb$k209W*+}nLkrIsXJ_-8OG7UuFl=3?}rKo+gsN6M5hd+^a;*% z;kD(ox+#d8yHS%h&7stAI-L$*%a(N@caw%Q>D>GSWGNWD;cRx!DmNHq@|Hc*nXzE+ zyUOHwZn9uy{t7=fkh3_C=x9q;2Jk#7`8&&pj?fi4o7Mq!Lfw+a8rnuIC!V=0Gj7-d zHqn487bhEXH`&V}gAMcRzqQcipDqv&73-L=-pF(s; z%4+~QJK5eH!E^Uu6yEm^A~&hfkFNe?E&cfS>$rl+lrq6aFq%6ugeJ}KrFTDUrctA9 z+ueKkf-+HdZlSN}VtOwobvXAOVRYknYw7tnYbkfSpD7?EbyZg?eJ8XDzz7k#pnyP% z2se_S(L7wS|IB>av~MD9Y|a*0y>qOrA;r*&JxMq0nV{W!*n+Z9Cd!5m(8curi7N}u zbVpqx!-J%5s3YpyCFU!^d}bP8mqo;J)wmKi{=hyR0LMjKl&1IW^(wQu$Bw6?W$hT; zZTSzIE-BE#qY#vZGEp{kfG(!@@xOryY|FZ<_3(E06oA|$uJo3vY`WXF};8M zIc3RX(VUrDJt{a7f&Z}tb&TT3i}I$@1MM?Y$+NU8EjS;)D3}t*E=*2^PoOoSZ+d? zsb$05!gm+OahQoY6KQH*zL_MahVdw29)^VgLmfZOQ83#34SRfFL7C&H@ynE*r#s${ zh;gC3ys2jOz&=!{V_P3{OZ|kjeWGk^Y6$I0ssI28fIfuOaK4?0RR91MgRZ+XaE2J00000000313IPD?ZQiN?04vyL zWId{o!5{?fbX66(G8-g_?~M3E33Q3Xh%N`QofD58Uq5FmQTU^*BK zHW1sf33ePiE=e4}42d zA&s-6WvwT_5@w!RQ6 zi6s##GAY}X8ZN|21&^BSNSlsF$$ecSRHUbWciMJ3nlkgusj@DCR__g!`;rKa?dYvs zI(jpY7S;qw1&^F!FO`d&o$PFc@&85YxQu}Y6$ zONR#i;;}L*)M)ze;1|DLZbr?&89~jzn?(0&&FDDayD;q`!-@Wf+ezLMe(A3Z%;@e0 zOX2AII&0dfw4t*`UvjjyuV7`~b#-(im0Xy{cj@vQh%>oUr>}6G-l4-i7dyLZX9q`l zt`fhmC>wv!oQ4g}rrERS(xOGBG$wB>O`h*XsP_pICQ*IEF8MyT(4G8)%qe$NF2zR2 z2qh;bD{WHEXlUk8&TJU@d;3Zw-hMWg7Oe{+A75*Vj*OP?TV9BkM&sx0LqoHM$~$gO z&Pqmj0Lsd@ql0HlbZr8NSL_I(rCUO2&Aw2o-W5(Wm%33z{GgVMpv2hpffSQIfR1s0 zScTGf4E0~xPf2# zZmTsl|5ziveUCE!Jl2pwZ}slPFLNeemeRd*&OCgWQe_9p=uZ#Lpg^OsDCWf9Zm^>J z9~a1^*8E`v-L18z!&Y5snnq*)NSvtF%y(-o>Hf9e^nJYzz0Dqgxbm)2x&7E7K zONa4Umq|!ah>X2)F>&PQ<-=pG4=vdoEMqPbPnzdSi`NIqq>bmn0YQ>JJvCj)#MNyG zdAhnO_NKowYQcisekM_8Xn1=%%6HuN3g{tYP#}wl!Q9z_`__UrzC2=ClUHC5y7=}? z-2e^qVb}R&a)+(sU`6#O5)B6ToU!hdFqB8S)B&U^uMMK8Br`hnN)}Bn_NKj;Mo|69 zEZTM|o(+>^+QlMZkjC%eXcNg`_e)7~t=u@ACKR!aTeY3_k?Sf64_wcb(Yn72HRHXMqf7hW5yn*l!gpTj%}dbeZ(bExrhA{AD6@{7Hx;e0HezO_J1 zCeYri$rPJ0i2TEQDQUHt6fE>nGFiWK49!~RF4M=1rLHnf;Kjoii>R_8go;=CNG7=N zAKp{aC1nrhcRUnMpc8O{>I2PK>O%8Y2U5klVZu%Iu22@ujzu#SLmZi?X~Bu;q@>!H z{6qW5e6nC|fXpx93H@Zg35_+Oy3;Xi9!AUWkQfuO-*#R~lJprP9i=5}&>z4FWLhat2^GKmO_kQpt1 zmIqhkzz5ENpz6jjxn^f)un`oCOjbYgXxH9{mzTv)C8K}k!(*`HJdLKG7@|9D9G)8^ zJcKXa=+d3aO}kLj0WmL#1pyu&DH*Nhi8nWkyX`V-+Jpr9YKWQ@thqqiit! zxI+h-+O^Dl^3*ut4120l)-&BvHJ*N(KC z)6G^~FL6(e5&h3+d+4%f54zo_6TRQ51N|E7M7EH=E;FTH_Uc5pJ2JD0CbX9C zSJ{gI-#&5yo}Qjv9qjDpIoaAS7i$h*4r- zak}HJDZ5wiUudnhKeT%G8SRX+AU4Keh_$R`?d(qSi~q!nbBjuZq1H5N z_Y>@XV5mYn{xnM*x|nXoV~ zU0$*56UB8{RyK_vKT*okF{4`heqp`I!^4(5yp<(((r^p5pL$c}hT(Mf_7np{b^X3% z-6|oDGuyR$FKw&eK~DB|iY5ZO8KehYyuED;+||%<{Tm8aB?JcAuOj-dfc6L0IG^ zUSf)!;+H{wp=|SBNTJQg*qKq4NITdrghLtD7W|GdsQ0~`N?BtpB+ZSnSD;XfwuXbw)Y}_uzrq_i_r2F0hldmD|E-XudTwG1eeobtM2_5Da+(X2x+fg+vda zk=!MRPq3neY)(U3&`dV)GxIE2gW+7*AYH-wD+ZO|H-h00-x1P-V7tSIguEKg$Fnot zM#`AZ>%g%1{)Wt;npDjkxR#|Dxq5_!LfS}kme!WW&32>GO+La*c-$bW*&9t8c8+7O zuLF%3=fMM>voI49-H!r!nNzWiS0iD}3_E*U=c{VQpqiusYnj=5B~{viK5aXZ#=XFd zrY>}+B8~)rlCo^1%~bCSlZ-bXXBXY21lFi89k@`aOXnTbgNiEsX*av?TIZ`WqiewK zK0SZu6U<{sfisnqC-7KeO}W!-m~1JZy>M9hsI+J;r0mUWuMnEfPDNjC>{Azc>uCI3 zcb3vqo+S@AukDZ67Ik|Z#fn8m!WCV8OSs5#G{6?aaujdP;@i=kVxB(NPg8?+%Jb$yK17-h-*2~l>3Q>^`Qo(3;j?P1k-XM6 z9xncOeRyFu3`Y2Sb4=BknB#L{D5w10z@;9S!a!TDf=Dgs#W+p+^3#uBl2i8nb803^S01f@;|na@?{j{ezwM zO}j0r`L&Mp&1QDkTXdmc7P6mEVdy(VCZ7o-oOviS)4Y%iLg-T*MC=B+cg93K5Qv{6 zuJJ)kZ(0w{^cL;iekROt#=oASUB+?=^!1VE4Aw)cnOF#RKuK9fwA&sj1GAZg=Y_{+WYW8k*Z( zgILScYd_4$3aB0KkT<(@px--m<0`V^C{ekdf2M-&U5gebKQQSiOqXf3Gex5r{4|;Q zf5`MGH`>qVnMr$TI_JX7RJ1Vj)e^e*68A2ys;^gB((CbkXucB0di$v{qGjfs>OzCW zzaH3G7`p$KgO(B2&}UP)%~;VFLA~e_r&+FO<>`;ioN1RC+6KIn>8HIqva8jKzN@jK zd)L#s?ew80>0MUz)ue&+0;eg|R#A~gWAfA)D(aybfyP+JzPk6L`w;7%K4$v8O;`G6 zwFP~d+mGJkYPoIRg-+RZrMggs8D{F)_=h?3j}~aV_ZFsoT2#$jfLCaLS2N9T>DJ#p zRsnEdi5tt-_DK8gF1sreI&~6Mg-UZeYiOI+jaJ3JybbQUXFr6RnbkPk+SV!W!VPCE zPy1Kd!dnVA9^83q7=D!_8^&so(ip)+bhWm*gGPx03p#fEM}F6?ztm?=x-r8)B1}zp zt2hDmef=P)Asoc+u9DWiLYRS14Zbz_*o^t!;FE*z20psh{yYyWn-`~a?0A>4C(WUz zX4mwe!TN_U&{&>uqiOT}L1zQ2%mDp{s4F6qf{@c*;p)PDFEdxRgq7jyLWp@Z zqjV5%24V-HX8=!77|4&oIpfAn5MvO)!I4I6R%3w$xH=ioNoTy`k`m!np)5 z>4Q9|s5Ya_01P={!eoQEx=KZ?QZR#f`uyr}iLC=jS-3bx+EOa74!ymc=+*bD=*EW? zbm{G40bC+34=<^)JORwqR#RJMGSf5J6*`%gEiD(<=n@8H!c__t!*vQ~4BW0v6?K6W z#lg+>8#lAp)3(iXxN5=7nl&}z!cAvaE|#=#?WQCpYh#l}m_f@&&>!F{003|W7yvPR zw0tmwsPUS85dt0n6)bYsG2`iJtGi#dBTW1+02_cAybthKTuiLwE%|f%0XV@ZGw{cv zXJm83()ZVb;Kv0st$n~_W;zHAqPDJq-L^Juo=+@x6#p^&$ohWect%DPz~9`ungE%E ze+1ZAXd#4wO+YmOFAHC-pr#n@u;p;3xK9DM1PTHa80bs~4;`i-zjd1`E2|ijpxg&) z0%<{GrYc@3Pxkc!SpoPa#xPVp5Eozu=nG(X#f=81Fr3415(~tFoyKq;!-;%}oyn~o z%&HUF$=+JJ>YaDq)r~`->g{m`>EYB~z9Czj+;DbFIyk@C2`{+gNf&vEl1-7t>MjXT4V15E&|LSpd-Nl0Y;(# zm3<8{eL+zsv|xFPc&^o#;n9Yw)!&D%jTR3kJm3IqwDyj}yS4QMLy~U}}z^g3qX zE?1a2+{V8Tpa00o_Ox_Uu*3q!&30ss#0&Oj$AvfpSN+LX<_Wfa>byW*oB>Yh!`DX} zFako1;-SpwN6|n)LL*!=ahJW3m7E(oR8 z`L@eUXk32@EFi!D@AVE2I3Vz_{!lo_g!<@$5~Uk`9*LQ#lmU`HXQGV+Le!uL0wgE{ z0TTpH5I`|t25kmt*;z~71v#5EY_Onc(JzvhYvNoFX~;vzf*F@K`67CwR+B+*!Z@Qc zqhf5mV~}J`)UMs`p0;gGo71*!+qP{@+qN}r+g7!0+t%05d(L;_{5XFqc2va9s>q#d z?Uj-DeXVw7&C;q8q{K_G=O$|yqXuRO@xNw*@gx}LA}moUx{H4i;Thz^8*8al=0NyD z^RUt^vai3a(m73Ghq1t?%1laBFd_2O_bPzKl;PGdxY&YligB0+**i!S3ciw~k>;cf z)wwL&vACT^Okhi@M%F^35hWGVDc3PqTseW*;qFnPx(qOamPonp3%!9Gh`58O%~#)G zHT~GLni*HBVt|()VHIPg&&0?U^Y6T8*Z83g7_?1v8V`W;SbH6TY)Jfq5r7MVWOVB1 zHPJ&Z67;=#|&J(nLX|(rp?=0{A49WOa8GS zCxWWRWCcVAN2xsINE&e%t9SP6iJlWzYjy_N;8UH+`8I^gLzEyZCmMD?Skyga;U$-I zv#iSoD!QK{#%4gNve*MG)pLH7wKrb-`O4$jXA8DBRzpwfI(ak^L8j&)XLbiZ0YO$! z^<#oFg#>MFT9_Hxh90l5DPT?$$b+?(a4g=)f?)I{E#TuPcneAwSeOp}T-a&ZfBhxY zV=%rd@(->yBXwJw#fi=S=H;gn7Ce#0v#+rKJt*%n*+vq3lZQtKHgvtS>*^wWveG{U z#RY$hNy|10b^EwF_^$$$odO}P4m$g^`nFPXMtEP z^*6SpF!fjp6JeM84{Pvq4k^uFd*U<&zaT7@hrbL(jHaqa(ZM2U{sk-G4XvCy{&_3N z!15H$VvUfvK8V2nl?a^R%oL#OOhD2@=y0H>jWOANXCv_0c-AfsB05pCV;39ygA_>f z!qzB^vMlsLOzu9hD`hwOMtpDSFJCza_nYvU{Fcrq@13tNvG3m7`d%OJo|zTLQzL#0 z$C=qNB^MudN0>Lq&X&%l$5S&-?}UK1F}cLfC8c`^u9$5P%F=B$kwuSaq|n9`|3$ zd_XHsm>aPno0H4uG$(p_aVWpYmDgIB@u22HhvXhhOGttay|QhVOQ7ecdpL2|-@{Z5 z!e=;Qai`{2pkBE7aEV>?4Yt(4EBE5m$w0fTevB{|6<WwzthFg^i1BqJbUzh zHd;Zxtrr3RL$zx6YhY&a+Yy_xLnu1Z3s$5%|UKK=_#kd9~Tab!N{1ReSH=aLeZ? zX{Kca#ry)xGzm#_)tJ)(TObfVoNyL8v8kH683u==@fYIy2gKS zQoXRa$WNctN6THyOR<>{eiF4Zf3Dh}GSf@$R&TMg>XUXtufp6>yVlvTN5{#{8+BA6MfH1AWfB0oo#CtIt?>j7> z*U}X9#7HY_0okK9;|d^N5&r0mOD?oYComej=``^@Ku7~mQMyzO(Y#OzZ;q^LK6WT5 z4TK5V5o-#zUH&^&AcQ%wC;^OpCO0*oeA%?k^ci)1%*Xs5;-E{SJd?iU<%+}0>(0OH z0}7zki^mugZj>S_tCGh(5AVayND=K3ZAY;>x+H#Mz?F@3r4 ziY&Fjy69&XI{mJIS9`(MSy?=uvCoztwhj&n=0yi)J-XZ_3*lT@>pC{D(Mhy5bfoOj zYC#xwxqPd<(CxAXhr?0~GYZ$Ps!|Jq#ZsJcXVFk^CJ&8cDNawzdTy@QoOvC^hr?T4 z>xyOa=I$z*963a(7Z4qVPG969wE6f)1qLV2VC@gq$I;>Lkd9l`Y%I|xpAKMZYyO}s zotrCmc%-!IY>2^nTG`n*=zb_688%w<`IpmIK8|T-cXecrc zxB+C)C#&Jr(ZpFilyS!+fu%2gHeFIdOigB5^@sJT%L(E~1psRb!(B(^?vDyEsbw^; zM1vaGUL3iVj*;0$P23jN&oNb0XbMoPRTng|SXr1nN`@-Y=HCDiGZ;pqP3d;a=z4xZl2oumLv?={u0z{uno4TlNT@fo2;)urJxk z@nk>itjNQ72&gQIJY1c!!1;yl{rj;x?Fgt(>AL)#frniY$`qsK*~Up;_Hs;}1Fy!> z3p1IK6BbsuLZ??FGJtJ2+!xBc z!ul7z8s?8Ac;p6t9wtu4pP9peYn6pC#mmUq4;>CXp44g;+2`ydzux1eHUQ8%T^7J{Ybb8{a^;$`T z$WenpS;swaHD@f8948Mpq0k>zq8SlruRpRa`f=RBYWkV);jsuK3usbidNM~Va+=D| z_#tl;EJVmD&Hf0T0}%of@tVkDW`8Rb^C!}GDZR)KKUnPdDc2d1W3&PK&QJf? zg&-J(PaeK!=)^asA$d8ayfCV!2+&J6On6)DR`4rq^jV#P(9&q1NxbXH779Yl15Y)T z%-*DRg(1279`~@-!A^*vkAkgwYlx0wPwh;X!*p2?o##axrr5&IVJYxKfj~dqroLk~ zr2Gb$dS##_5hu6)LaIi>;DuzjNbIXz{$k0&$QOHy{n=hGEs) z?VVo=f{q=rJHjanpou%hpusU#M#ur8-9%ncWkg#Kv@op00OflHWI9W6y8F@akhEY=7jB{-go*PRg3oCy zc%Ki?R66(r7vNF}utnRdg1m*u_BEn%%kK-k7RJ}o`&-C!JP)?O?cG@=u*~Vr6YFvM z`#8ax6P@hkK=epO1HP%}>Y)D!55~Otemo{o zZx|?v^vTYm1Bm>F`=10W3iaush1nEDqO7kvYwF-gB%!Op=x|ir#oYMT{PvG09a#(p zKKqJj3`gg~p#RcQFNyo&FK}_L4l8#pz7O7a9O>WZ)ir1|yOuwbApA@4* zS#rT>8^zR&c8KdvnR+E%ljYuzhl<=zRboMRGb{igG4biM+T z5~A#JDMA6E!Y=lS8Ku&7NI_j&@AO+}M3V`2Ew^-4{EBx&vGwuadTt(9HRO(?k=PTa zP|rRl0h+U}AC(Sz{KPq9h?r&k_0n8bZFznLuc*5RMGuXV)e!&Fh~gyhutO!{2P9J7 zm;c%Rs9e^A-XbE=j%(Uu8pv_YEfYKcsRSBmKf6E43^{toXacZF^bah`3_k$!aij3* zgwU;KL=m=Kk$mRSV&L**jcc*-iJyJ(0wMAIO$aG)A!dT1@XjV5!V2C0yv_#5{5wh; z#*|%JjD1C7Gc>OzEwN_Ougs9Hv#mAS&>l!x`3@+EDO9c&X=oBaC7Rn}@{julc59g+ zB56!8o>I_Q+C;-(o4c0!6rr2JlYyBfhXVEEy;DV3P`$B=3)8|G2Fw+XpV6X_rp%fI zp&--VJ0WaE2qoeY4mB~sND@x0WVVcQn)@AXexZOtm(63=8RF(h<~Bc(K6S3P?y2#3 zNRScg5lyKzDiwiS37y6{kx723)?vw!0nMGkl^x9;;<^I&zc;+-LyRk=o=dwe*RXNZ zD*0^2(itT=$GUQdfj;6?`NO^gVVdd^Tq1D&5q}wl>BN{h#3yI?P@ADyt^QkGG3?H* z!9GnZxacV5P$4v~#d@SeL7Gjep^1LYS{9iHdeu#7FpbjcU>vXIUs=Yp9&_{9+T$V@ zHP0Pqxc!o*fUwj>KcG2$gJLc9-D#OQ$;r#kQ+VZiCV;`7KO#2AkmRaduW~ab zKg7|=g1~}3JgW@18#6POI7U5O2o{(m7T-vK}32$ zd0(QR#la2e4dSqtX7s8qYFwQtkX!L{`%tB;3A?ix2r$mjI+d%l2r6ouse0H|-IsGp zp;lH#6X()P8)uc^tFVUhE(=g=;M10Vz7#8!zl|W&;mzAa^JRiE`o&z@A8V5;ybIjv zU;5;}vv(!@qXl__PFyaW$y$y%uRHbtFK4)tJwzyhh%@1BeX1Db51jioht?jFGbBPY1F5 zGd`4u0snBytOYk+vJF%ziS=mHQQ?&_y2;V%_*P>!26BkosK1{x5mTMD-M4FI)^JL^ z8OcvR;v8b0nreEP`YyK`an@R`=wmy}>5hM}t`yT}dkZw0BSF!=(cj4z$?U84@+ zK%nt>&pu;B#;0Ffjj@keH1pn*CJCd0H;JiVupObhMeJ6?RQs3E0T;yT?tYc9!D~ZS zc~J%=;C^835STkq?dBgnsBxfm91^qYmhai?%9blB$R* z^?$ihib82cW0MVW=z(qxcU7eH&N!b;M>WvN^?ji3jKd`EVX$%FOg7Id@VVvaon-&L*b2OY`#L}Vt~{NRTL!fIlyd_#>hz4_@Zk>rbU*AKM<@MR zXkTO&f(}0w6X3?-fd{|mx;zYLQh35V0`5HFi!|W_^k*=5?k6rfKR#K?7P14-&WP$O zxRUYD)`ABx=|o=?goHjQ2;Kh%z&Om5b2J*r;a6GV(kknu%9P{I^}+^PcwSa3w42Rj z$fJ)7ukQReDxa^&YHx|tD0pV1bQ~O$;1cAUcb&o5?DQ4LQyP(WI1pOriLYg=%DIl4 zOLOw%%!a0Q?bFJWVblfQKos$J?P&s2!v`0X$xjgshu<6dbwAIB0X?&$6OH;muYe{o zst>~YNcamiJ_grlc7%;cqm>3;Bh!4a2L43y*hIk??HoB2sZQrVwlN*ncms`*HpVyG zCwzV-ga2npC+k?ynZ%N)YZo6A^~o8@O=B3R(!pi~amX#V2@g zMm^dH3=I)Y&t0*lE$rnE>~gEf{M4G}FQdYD57(>Y&cH&}gT`WY0{C1PxAe&W&0OEg zeHxe>l?hl#H|~G4raB6{`iLzaGCV$B0a;if%DJ*iyBl^01h{#Q%zDu&$>ky1bZxBT z%KPwRK6s`1`{N7*1AZ#uH}f8U{Yto&R+|8I>iC@7F3 zu(R=&M=;yZxBtIB80_cz|Dg}I7finV0n94=?|Z@Bvo3rf-Bp&8tBnn%uLbj57rm~# z)DXp$(JH{sbU;Xn!2WJ!0!jRtjf`T%T=$1rF*U`#AZ4BjKPF3OqrW{Eay3m@8N*S! zSUIoq%l4vs*3}6&g!0&){OlfDGG!PGSNo|2WBBxS${onjZnEt2Mx zIg?1)*wnRcM)RtRJ%P6lTl|x?Wo_~TQrkVNPr%IUeX(123+(p6FW^UUO1O<*ZR zx)o3aSePttblnuK&_fX*%BOp{;%kxU3vP8E7oQ;RiM8Os5n#ClrXYV{U(J$!l+-cGNC`Id?1WOf zJyt9umSAC{Mrv}TIc6s=zhGZ1FJZyq(w$*Wh*v`jcs+ka#YUa$F?zpya!U5LdZT?n zp}TR32d_G**^z@tn`dL2D(~zO+~8?0{Qbb$XZtPt4bgIao@Dok`A>|<(p+713wYq< zGFFp2BuMKO3@jYc--R>6?;l9o~?M z`e^i)1D$4!6j2tphY@RbXU+il@LW5nf^rj;ye*xjsgKBQPoDEfQ5^)EyP6!0imEC# zo%>lX6>|ed$~~TE`k_$D=J@>gA&Cmp$fWh4X7>$qCD8{UwxDL)J)k>+KT#rxdbn?Y(WEJ!D&n%LHa$gJHp^!RtIn-~$bdM+J z2f^rS1Us%2QI#rQ6m zkAW~r5lF9bN zKP99iij{Y+_A30A|7<6vsyR#uz23SO-UKV$*+`mVw9QV6&^21F|EZ|1E*!o2+cPKh zF3gLWdae#VIZ5+!-8)hNB==H!KRieDrQ1KpY?U@tsJzpdP5;K^{%4biCFV+|InDtJ z4JDoD8K9XZCY-<#(EZ8<&k0R)a{Tcg(2%7-mfZ0Y$R~|Yo4m25FJ*=*bH(jU_L6ib zLJKelI4z8An*a_xm~%)8b_aw^Z#rJl={|fqJ|K_up0zM}rni@8^o5m<2DeCZ3x~hL z-VT4BaN9rAs&r18ig|jlWm@WU%IHYvzAoMiv5n#7m@EBbs`a zYxu-QbW|Gh=b}<V@gyGPPv4<{;gios7i9`gF|VZqbp2cgtWCEZi6nVe+6i6J@4{57lbgd;CTeT0 zoRUmn-`n?n?q6>kHDJ5)%asz!&Ha%=MGU`^J+~_2?MCydDZMjwDA-L~6;-t)h-Oq2 z$BtsOsdTQ0=EWQua9C_$l3}=JQ0MndcyWU`#K}Y^xG5<-(~_j7>*K716H|1E3VzuV z6dAW=4jNpR-VgqMrystrg3r@{@jh@rd$?_{2MBvBHVnst^oK^Kp0h!We<(ICXdUGS zOQ0Bk-5T~?_l_DkcJDjZC*}SbknpU>%7HWwTtxuh3U4u;cuwMQMP9Ap!z9}-gBp3( zOQYJ(PE9;9%Oy}IXM9k%lVdymJxjT7K4*RI`xBT~zgZtVtER@ALbn3N8B!=SA0cDx-CP}pG zFaiGSRF4|C+}*%_3yvI!9ud&t(By(y0T`Pv+`Kk8%zH}A8f;P3hfZPeGLzmNEb~P< zRUh-Z`%|x5+9oDWUMz!ySaczm*To6UHPS=*zI^-8$kT?}S*p4XuL4>3h8-LBw)SgJ z^`59~-3N4{-!xcz$Fw9mzFYgh(`kqlN|aM0-WIi6c+~cH;pDzBT3q#i*~hW`>Bp0& zuGK7?T$NzR+nr{zZmJryYOAcy$ul)(2K4oXIeVq*>vA!5AN?kXpT6Z}n>;+BU#;f2 zK6Qf$bQa4VP^!|^)42y>ICV>cl0}{oU7|9c*{LBy%_A@F9v*PcjV(1UOXex}SzbYh zc$Y18Hx5(ybZT~z8`jn->73IJQ%zrI&Pyw~isKxncv8{P6XoS?#i>Q4 zrH(WQVT8MlIocGobos+3(F^k1{J^~3dN|qNE+9f`O-*p*=UF_|YN|<4gI6^smzOgF zSg^;`nrc#6Mf5gSOG=)a5a3}N3X)Im>C+7KrqXU0gK!E2{#anP?C_Kpss+78gT|Wm zMRjV~ah)3+1+Xoj*j_%-6hT<<2Jy(Lx122%C8?yvuZlqQr1Pfg3Qyc(y5>}ShbBTp zBE`rxB~y({crzJRBk{$F6v_$;CiT+=1;_%R3_@oq9u-Vb0y=ov?5a))c2I)qgg`mI zK^CXzemWlo!`#3DuE_lT{lk}E5XZ`CP%otV;CZ0tLTDdP&Ms_Ku-qtE=(4*+2B`SB zl3TC>gCm0u{+ANEz(Vd-7IGrdx)6I8`t&|yGwWfBCG1#P)D}<3CLkbLW2r&!>{p3U zcM7F^sWp{a#LUgISZFpk2n54)W|IqcQ6I9?&B)FMhbh+WH@*P^dDt^A7)x)o>w;if zo9#BGgL~8Pu8pRC?5|)5CG%`|u+?oJzC0l#(fj_>lC`qJQ(L^OQKeA{aZ+IjH0#Kt z*>i~>f}wMdertj?UuD`U-H4jJHFb885J8`sZbxNI;i+dG6J7SkIQI3$-F8scA4bBBzPwv;E+h!D)a~@c|A~Fi9yX zXT;ymVJ*Qr{O*?sajeRJGB6eU>r^6MK#528^O=?~kQ(Pcw5s zDo79q7(6n!nUh-q`f(dUQ6&f>P93W%h*d{{`5OpV-PgvHcaY~|GEglc*d4_9WciJ; zu?y^!dfu+saws-?7Q{F-IN#nC2Y9&nRVs1(eFz4173 z27_jQyn03R8a8=uX&f3Iy~tInAC9etPm&m`)gGhzY&3_d)l|}jYDy&x1@vT@PgL57 z{XYgm831U6_214!kc&i)_-F%`t@!?GE?R$+%5^ViK8^p_aF4bes*oAv(^oLH!(Z%j z9iVK-_5Eo8gji}Kd(hM!k`>`ah8B7wXsnjaxlm@_qgDT5+0Hq2A)2>2XSpZri zjS|qrf4i_9_vT`t+{7eaR5lwe>EW;B=hpetbzu2Xl2vBPq1cCBCV4xI1JA$R?_-Qk zGP@!VTRr<+RG&=^2P&+<({Ij7A1lrsVhdcT1Px7ly zRfM4ZfE%+%w$7O2Lc$fJz#gm6Up^x_my@a{wOB0Xy>P1AMcs}`5mVC)HnoB+XYUmJ!^t8DS-5)A-`!oJBZ0;=G8A5Tsh(~JEOAI;((9iP#wWdzG6Z6?27 z4~M)2APZ0AnOp-<3Yt^McJ-Wnoik1{gO(dmjH6!N;JwR}5I}5YK=+rabYw0Ym-=nc z5Yfe|K~xS-a$ZrV8^YEt@Nl^q^z;dxOC&w>W)kyF=uZ6Y_tk>dHJ`$)oCub;yZpLl zg-=Gc6XciCJlI=cIDuPCbRi#YLlHq;U|5qoT+(hmH!4ra%t&Py#2${k6$xA8l6IR3 zrqwi`9UTDMe<iO#uQ5WxV1fIUU%w}=igUy_ua1sV|e0jK+^ltkJ$e|Z5oEa;q8tEoaB)>aorj+zC~Y^9XIaLr+CQC79-oG=sG$$4KM?MMu&8Zl zUc2T-4s)1U9s&>Uq>xe>*_@0D!t)oZlE|NVGmVBlfrS41huT>@NNi|j)IT_RMI~oo z6%~)tb|(Cx!oIkj96L@gpp>y#9uB6rtz z-_GDVUwN8PsiXhFW^sAWguC&*c@C}wJkFG`0{CV43(pcT#!rMQ;*PQdI88o2Swd@R zVDdEio6l$!cD2#gL~zLeW6VnUk$$6eU$AjPz=P&#kHcS;6SO<>8z2YF`Q>ShYAxRgJ)$A$8Y1m z4%7zhDwXM52o45`Sq-015EVCri7S2ZLCo%&XX$TOs+Uhi2JNEnahG_VzlnXLl)3{AAdaNPjUbdkyyu_1zZd z?j$MzO*Qy+@&1nwaf!m7=Y`=0qLtAe>@7nUYp3=nvT{L1A+zAs@oqTvU3)LbG*C`< zs82x#AVp#jaou05x$rh(Qo!SpJ%Ldmu1`NrIK0j3o8u#TGdey3X}HC2~%as3b8E zuy8~c%0RGRYyACS;V7i?ut@^Bz*^0Xt3qiFV@kBaBJ1U)u!Jwj_(ITU*+sht)-bZV z?6ZM)h?*NGLYo*Br#q3wKanLE2DJzsr30u|CPz%`%u@|m>}VsA!|a9_-?31%OLRCA zQh|`(icsa#Y+_DiB|s>>G%Elf7Rv$FNOlS9H-8fp`;QPCY^)atFPY0IP|q~{NbFU( zRiawbj1|RP!9-Omm7LAPh)WTDTol@H(@p3R334zi`WJCvEb5aRA6yhZHHM>RF8(Py zyO27v4?&x0-xEQvYul`shZ!@#WgN5EATDFookC*gtzyx4Z9%41nqW9+YnTM7@!2?l z4h|KOF^Nj`MJi&nRktWX*#uTpAJ>0EKz4xphY;JIC}CykSz=)YCYN`@MI>lVt%o$Y z8z9)MN=CP-_`{=PKW%akPrX^Q=lQ!vI1$ho{pPSPP#`3&(;#YRE7%R`L2%%ALrO#t zd<*tU^y#f|nW2xx24I{oq2~DQ(}xb@y>Br_?UFwosR6NkoZQZgp+)iu>p?qa=a2*Q zN_WuZzG>_R15IT8vT6odME}Euy=s{?`{BZ>fLiku{p#Bo;4iCxA*^L*UJhlwsS@$9 zzL(eVyUXMWX0?xW$RwTKeN3a9b8=8DaU?B_OX?RH*-9fDqav+}>l8$mk}-Gb&Z?4f zCOQo{NPX+DwJ8%wfR$i&27Y8a6Lo}>U`?JrzcMhvbS2h@h(-jb!a*UeWh%kujp4`g zp(>QSK@2zRU4-16CAVlsC(j#u!?lE!6nAN>)o z4&h{-4pe}q^ZnxDKq+g%7&PFK2ev1vqZ%F05k9t~nZ2CrBMez7(Tg!52-M+w`;gWk zPEA5;_O<}M>%pY?h))sngg+;hSZ?D4jH#WIMu$1$bK=Z-#U`Tv*da|8w&fwL$diWy zosH>DYBzx=&=5r`E37Omv_cUD>c~Kfx+j06v(ctb19;4SV%x%Jxy9+9sfIc{AYGYU>jD8?X zaJgJ_UX0~v>^|g5o4(zCS68)g8>U@6x@~HE|K7Q#gqfOz_e9w}STmNDD!2jk%W2WJ;>E*^d0ZiTAu$^*s7**Qgec>8P z=3~l|<~uDb7>J9tg15F+$cFFp#P;p((EPx0)=W_Jb%aHpg!avcDa2~!^@~;HBk+*# zBFvFE#{znu_T(xdygqY(Yl7rNcgDQEBQ(}&=GAjpef8AAYfkuW!2xsg;Jm%*^t?E9 z`gN~rgOS0*@O$Opn> z46Eh+x4w*b@7;P`&`Bi?d215IMnVVV2=%(n!@*VeFXx)z>=t)oK1Gz1d4rjWl4AU> zfHvXPC6}x6>m1Jnf}D(f#+?c!CiY)CG^uG6w|3m`A8nT0o2xceo#DHe$6g!|!dYI& zX+(|dpNbfqAJMWdZGxOh7 z*%Z@lFpxUmz+49&?Owh~42j)oY$?7hmi|dTQe5_Sti(RGL1#Hl*$AKcJk#_5)rs4+ z5ldp68_w-bI|dcIS@@jIftr8Lq^wza`}&U+(*7r&2e8alryE*KVPB z3T1G1%3=9vEu1jEbw_z-&(jq(aseY*(c@;XZe5g59mq}%2&(|w6qt{9`il9eW!bf2 z;O5!_w~u8_eM3Z(fq~ZF7Y1V52R$8B5NR@Ro1B%SW+h35qRgBA*h37pHx^L|H?c%| zjA0j}h4S_I;oT-?+tI8!{yE$Irb3o!rWx?E%IT^Un3K4~J24?4ks-}WI!e#_2HcJR z{sorEPh~LWRKZKjH~oN4@wI8 zjM&1@2{dJv+LxM^{75M$%*BbUtQ<;>H$XCkZB=e-d!5AO63&K%pRe2heNZK#eI!>> zEt0Ls))LSRAYc38u!=0ga0;rO{5!!XZr)+H4vN-%TNmOu>L4@?@5>bYN>JnE>72}B zlsaX+!p6Hawhci+Tk4qIE51^0oXj@xMHruUL&L^Qb<$Pf*m z%n&x2NMT{NC=2~DtWtPcHh+Zrr+_=AZ@gxCM?^rUD3c}Wbq*?t&CjPkSlBuqSF}Y_ z$>Jm>tIWmdToQY&Ju~7l_}|+;Q~JIIaw@Q`@oSyfnB#ErW2n%dK?fMi;} z#0N&#s`$XcdIRZgTr+aNjGjBPKZgoVXGz|eToGTL6h_3hR9?mGRWa<4g4>JRS!?^Y z{XX7jUp_V+*$_csB%~yY@8IMMwZ)E*sM}+D_K2^@qgx1XUvvc=?Vmv77*vwhuDFhU zT0j~m#)L=5#M_3_b^maN^09cMXbwB}@XW;nWO5D0gnxwynbGiOQM)>2QWWu8UqRF% zxXn&2O5Tl@R14^oDSczEX}33?=066@)WWe^zIG!VW7^XirBAll3lJ3-7b!|jK(}S0 zWsyl4jN3TPJC5r^+Ym7$Fyah~)*0Zi-tr$)P71GPx1-f`N|%hQ>SfHhVPC`c+xckJ zg+V?O%FvJa2mX>Qaqw6OXqW%da>98OwaUQO1AyE4f1g0$WvZ*4z-}4{Nl8_%fUWD3 zSo@fdwC;v@XEn-5Nai;#G(t)$3L>W>EOm!F{-x+}ZqTd2IK1G*5W|TPo*nPnU1+5Z zhQ{7F7f{%9q!L*_1GX2{Khll**D4pftpwzGqu0puP zWbjRH0ac-}^E1~Ht5mH*Y9`0*wV<>RL|DX-mm|`Dg?_dVLb%sYKWidO!)66fPYU5y z>SH`SOm1{~)sn=mvDA6*v=#Bfy!2!Y{eDuwC$m+u*;cPk1H=H=;oNr&0^|NBgy4??0^tzfdbu1J0sZu*WB`bWA8Z9k%6XtVxYp($PH3Ho zKPz~qW0hZbyCwdp8^x=tDuc`4${xev|4HfRHT=w3er2kv+lv48{~F$Mjxme$yHJyH z%XN4|OTw{`X^%Poj*C+!FkV;sOtd%=Hz30 z=A0}Op0O`!jF)O2%B9!6lM93g$xa2-4YS5!D0|S0R94j{D%+AAc4z4a>K8MHAkKCgf;$4BxeDujH zbQi#81!Lfu5YyeD^deh1CnO9Y(v?S&#n`qeM(}Nlrt?#O;vZ7xaJ4~qLjElo^m}Wx z$Oj|A{J9Oxz%{Tpdr(_kC81$B@`OMLt5XShd1o!r&ZJ(JFj|X=*7Hc{{6F69|9Q61 znFd_mfC-sz5;=>h#|+n6QmoXQO6Zbxw`cy z#A5Cj*3zV7bsibcX9zD`1#4@2MG(JFqy)}X@Ep|IptpYKV=feX`ea>0)w7B~j!SX-ua*u^4=Wm!~B?s!O<%8-~Ot)Z&J(D_m@ zY_v#$8z*!ONB71O@uY$ijI|eiCHNV!Uvvf9lHEEC!IJ}m-diD{$s`T__kB?M)uNr%1~2ubLU4J9(*y{$+f{&rN)IY4HxO3 z##p90c__|7F#r`kx1Y?ckMk4%wH`$4@B|Nzu&tvzLg##vgd2jCM$jE!R`$xeA7d?! z=EH)J4&!&1M2%najk0$WSrk1`V4V2Wt)-+U8i3o0{VE(TQ6B{# zzxrpvh|Uf&c2lroV=c#)mSkX7-#K>EO0D^W)n?o_s%wETqh4pW$1g%9W$(^mF|zC+ z{tTYw05c3L$jC5$OlA}w=sLj|u!juk(qxb4t(!S|m$Y0GGOGrm;b1_)n-O!jC) zNaQr5ReOK1Vy@m9UCnuhMp=9_pkxnIEs?%7a2lY~1o~4Stw3r0w1N@S%~?8j-h5XW zzi5)_S7$xpfIzxxe8pDv*El~96w!1Wny+U`EGoV5knq6x+)CXymklA|gYNrd699*U zCu@bUQ&(HSdWGgu49}hXJ3^_Q?l)uUdcv7n$=oRZxJ|1iLfcpPrJ#cfL#OUpI?bN zW$qPXw;pGF`BsT~u0MexR=;rLh|I>jKA5ZEVN`D3kozhH=`5`Z=&;d{ z5#Rj7yA1dtw8Lgfa||COoVYPt;>I4?uE`uyd^0 zJl){ErR&$?QXHakHDJ(EuuSC8buEw2ctKTd5&T1m0>3;ap8!E}E9YBvaz%cQT5u9_{7Smbef=SnsJqc*&W4+xwJH^0U6*SpO#{ z8(6_3ywvI_GF`yD2tz8jajwUO&G-;<(M|;Letkf7y^+Mo*F6VA@?WscZBG=9m*ccu zTmor0EmXlVbI%;F>19ne$RSTr4MI2!8{!L<(A&q++FtS`7R!FJ{;vXiC@BVj_g}_+ zxIGRV64i+r_hN5jU(XP|*=U5yDP0Dm^Cl>sp?)Z(=F=AQ`=&p)nBV;)nQJl7I?T?4 zCDj(<`!GM#PT>(zHQQE7|C14p>wc>CZ*A>icYLn?(QVhVmDTbG zL;yMK&1fV#5O&+%H>3R5JgN$OPGue~q?5VQGEIClk47g&V^TR<{MGPudb^XH76ARf z&sZOuMfE7mE;h#zLN)LY;Ka9#K1{mm++N%UrM(NSQB&jVFrtI#u-5To-$&m zMMAHLTBF}oxBQV{ej5I}z!Pev{Wd_6YeLYh;ieS$pN$RVNrB(j$0NinR{Myss04a_ zQL8jlN-a{ei1>GIn8;r zjp6^r#VnuSk!AKtr~R&Wox#)Osv*kHzDSZ>@jiM@=|T5xA5bBdrV;5zMpO#(fR7qI zTw)43mJ?4}gU=|d10^Oud9*o6Wc%hapYt(DII6^v)?`6TV2mR z?pGeMoSTW>hJxN@s-=ZQD5yolDyZsvkaB;8LsDK4-jJK%Q&yq6Uzt<**0diPFj-p~ z8<7U-jY(;>)##-86B2 z%?8h6NHkO|p$MPuOcv>?DUD-v#l`D3B3GIdKI23tS)Rn2PyVr7O%@nECziFXkNz5Q zsxEJAoz<$AAg1t5ifq060$KB+i}v(1qNv%>@D;j=BOT99l^P)+T_3IUl5oD?WWBq+ z!Tmskdoz&xCY_!6Ocf&U=bC6rn{p3>|7kULIw_u%ik;1CPV9{yizQMQgZ%%ob&tW3 zwPCxkV@>Q#Y}>}fwmlOk6Wg|Jdt%$_*qYe3_4PdOerxX^-@jE|)m7`R?p}T4xX!Ef z48dSW3==CA@W$h`-|AJ#h`&UN0$lmU`yO+79EIYJPFz(x%dicN49^ZDWR4CDU5Asg zgh0#&n0($EBjNE#n{84h{Jq}o>MZ@#)##qf)&Kb2Ch2xAdTJtZ*^weSB-8oKD~u{b z(m8q#>3BT40pZ@KCsAO&j+3anjJhLMAb>&dT$1z`=eEG0?K|xsX>|O&YKJM_yB2s8y<8q?qWwW zggKEJTMHZv)mD`Y9$RVJG*WhspP$xnkp!h|8Ig;s^<;6ob6I5;jv!Uu+zHLuF$MHp zv#QHGKbWOd-dF?BW(6kF6HgorJi`wenyN|DWfH1#nXoxG&9G5 zDY9l6r`GRb@);s^+wkoZu9RZ zISWmte%DdTkRh|?Uwi^$^I1hU_MUGV1ehFrE>P6^P``^nwOc^Tmrr&>vq4i|bC)*6 z{mCzVe+^1Vik}Z1g(OSSSjFdJN(7HFdpu-R%+|8+$V(IS24c!gIDLNdu~S50#t^<~ z^6$VbB8^f}vxMyibd{S9hHdf5Q(TV|GS>kXrVHGsSebkQ1Z>Qfx{`{uaprLI=oB7vb}| z%&u*Sw|_~Yc|XtF%w-dFYRcPwJbZ7zt`dPWnNL+yn~%VdQ*CN&7eq@79JE@lDutM` zTbv@&ev%HlZ)??`-50BL4Ia;nep?*3Jn+!d3rq-aL3%>k6krLzMo1$oF@$n|ZbDBt z$K&@&xayccER1*HC$eUHfs9SK7k^AH&HQ$<)(q(w%bp4rRd}*l>Z}c|r@kkCvH$8X((^Y0fhniO`|i>TrR%kV0lUg(GcUFWGYKU^Jnl7d9r8JCx^hK@e~$>v z&}O7+wy@-dcM8b^(P~Nou1Di9d@uKuddoYK0Q#GhAhWHhluhri#a}GLQH4q8ZF6tA zJuL}S-AW{d{ne}%YcSWYUmiKoeZ8NuO!%kXaUu`6AHd2Xs&pDX&knI};!=W=*#ame zmf>iPIcW;4vI>65v0uw|EZW_h8X>W3h_>1tl*;aDp|KTeph)Z5qwI5hAgOu2oIvxSkJrf$$rPl+N+U6tz7MFW>mm$AkTy#|4EGlriJK3`p@dX- z^(`(bH{%#zPC1FL5EbnWVI5z=5blRb&{^V^&PNq>IH+}-{FAlm4>iWFYbdxec~y1# zmz3u#oh?QN1|NMjm>iL{3M>P>&p*bkggJcpQV(-7px9S$NiT!q=@ZWutpbeP+H-2x z1<&O)Mx`@8k#D*-s4QuQyCH1u4W&D3*H`AZ34z1v^`P04UYF+=i{WC9Af9tS#x#dVU&5qvb@m&7>(Zxl-VY@h0 zK<9Z*Mi3^A)r`Noygz$Y=f}ZGKBunwT-$-&V$JS@lpFTT$z~J4zsgDvf zJ4dskqhlqV#B#MBqs&yWNhB4EDMRsrLh26up7AW|R<{`2^e;^i_8p$0YEn^gIvMTu ziFeH8WEuVPF=_zk^t!f=#*Ozkc(?4XO?rS~&_E~p&+(F}$%UpiGru(B4JtBAx?-%! z!=3r)TUvBj7^jpr;EoOE-?NS!jZ2b9C8|b`NuE&m{>q!W8x|4EaXz*5YoIM(j+KUf?G%8@Jw^5GNx&1^XJ`K1z3k87e3I!|+?24Bm zqb4}&u&D%C?eV%E7FsD>(n|~~oRoF)+p(s4z#!@7&N(HVE{R1M$KGFL9Yv-|3AwnB@5wk4~QTsCLo#7Sbgqi+&+t>ZGm>1wkI z`k8=ffly8?n0S-V;irVnFX=P@TKj5%^J{Qa0aGFG3pDo_ozwvI()A!=G6R<}UDw-| z>wMr9rz8~R6^7zR`^=}TARX{uLTSNsT4ZBH&gpzjIR%ckyr?LO+v(Vp<>ENHFk{hw zts$*_xf*fF$M^A$f1!Cy1my;;NZ1@;%`@n@C06aU`|1D}fjz)lip~>?<1UjYJM{Z{ zz>ILpjO-U(m)Gn>o&kKedu`aGZg^o#7YbecLLH;>;kaKA>0UP3#tC$KCte24G^aHa z%L-q5_0Qc&3!04ga%U?ha?^>9Y=UZsRzN{}jMhQev1>r@Tq!Gt<&=@HmM0E2Vc z3%+b1x-8#=^-&+QUhDmqy`N>FOqJC3dbka+=C??=kGpQQ4>bPev^Asev%>J=YEE%7mxJK`&^Vq(JHgUvj$=S|ssDy6-X3L!cM6Wc z>u8VSiN!t;UHdSh5p z#v64N7_4PuF`N&x>zF3D*1NR6-HWpzm~Zaw)1Q9_eh!a~#I3t+a=JC9q=shRV*c5u zT_m11G=5E;&YcZSrH|HRX7Jo`ukgNX6CN0vejkvI+IeW6ye)FrAElrgxux|3Gl(QP zkDrQ|B^8{ub5>uH&+o3kR(P~ebWTcNR&^#7|J$BF&;KQhVN|JCq3nUuOikbsa{hx_2*>=e#Ya?I)g&Q!a&7 zjw7Ecqqz~>v4FJ1rBfV}=xtE}t1?a!IS8hx41EaK7zH6kqAvLkm%UYFAp__VTo3XGdHQw4HqfBOER30N|Y)lLWJ+ljBqDMvjG{bp$ZfH_P^)fdhG(q}f^ zN1F7{Njg3f9?$V5NPgroNbNqV6Z}t7+PPD;ezQx1iyo5CZs)X_D`GvpQl%_K!(i-w zeo9B9(5(-d0qHT)80T{Xm2HmO>Mv05NRL5bCYD zN`W^Sh3`0wPMlL_1U%H`j9Cs*vbk^w0q8cKq1Kxo#-4WdK@i(6(Du4<01TNS?`KhH zU>lW-=Rk&3Q6{5|35E)PT1;<(@1L=1bRe>^b;TKR&1*&&CoL%DWb(9>)mY@Qtm19` z@ba23VF*ulwbR72ceFbJffq@?v&DkxL9BB|rdHUho=t*9xQTmy;}u+!d=j)NSem2= z9}ip#!seGuOFzMhDk+gxlRUEY=j#4pqPPkY%o8Aq!V}6u^S7eEqSsW_1PuHE+)zWP z$9i%(lT1+P~Q82=5##~zy`n7Rq7~}`swYEF|->+w|5fhVh=IuWu z3UIs9FnDRKxOP1SV|v$nn#1w&lsxhnKcP0^SC+(q0uxj!4|@0vq)?cv@zXJQ2ZX%W zWyMoKXM4Uuw&i?>iAfVB-{^8-W=4|G_tjf^r`izQV8FSSA`Y|OFnz89L@_`MW%ypM z2_75Hq_fKmOqGj>DPwRaFdIECty1YEWmDz%2y5_YC7(*P1V*ks)D__7PS zK-N=%s-*yD!YkAI4*q{V<~Nw%StWkkQ4tl{MO5I8>!Y1KGpxOJ;A-Gryl3!g{sl)p z$zthuX39u+L1$}$+`kBg=(CMPzRG?-<%c+ff-SEJert!}^38+r`-1)+E~1Lqd~h$8 zL8*Ku9tjkg1OFp3bri^|_Tb85y7z>_-5la_F*cUDpZnzUj4_ZVQlvkLe zTSD9ZgU}LDg$^NJ%jbw^8c=#%y&`tFKI3D&I7tT8sb&frjK4(L(krylTR-1h4q5!GK=^5FJHwj=Z^3_V}kVOW?O1BmhFy zzO8WvJHH4L4`Y2c;^6N>fIu97BxU!=8uAmB4+q^{^N zKFcrW5%TF}kmPGF5bzZf7f9=DCcQ*ruLa~#ut8=~kj!a*#iS^#RSKM^YeRPxDW_(kUuea6u9i4x54srq zR*XtY4T_io*JRrvZeB<^(2vPG3Wzn`N`5Lt-Q!q2iNe%X`G7MTh+xz=(b!we?-M}0 zp;fHCr`u?eOdA*l3#EWt;JyR`U{Uc87bZ8U3*ES~Y38F&px*`AJ8Hh(db5oMx zoX6zmSiF%&r#<6iT1sO5(S4-R#xy_i1IB4-I@P|9oZTbbjJTTohCarTSYZ$dHurDC zt)Y!7ecvk+m9cueRi4&08*YhKDnJ?i&_E9fctnzipry7kL``q3*VZ!0PK0$d{*lc> z4=V5)>>5~iBmR=fd%pBMQZhJ1abl|A(5W6hy1t4+yhZ^1Ljq9>=1hBH4P-m=y~wr9 z$HpAK5gHlz1AZUt1Ltk`Kp#8AYEbtXXS|n}*}R`Knt709t%F>G?4R@U5CxJ$rxKR> z(uJ+GG$R4h2&Ro$(=}MK-uaE-qjF|+3C40{w^a~eu_m%2KB!>)KAT_dA9Z{Z30)!xmy-nT{wkBSqK>h@TJUl$RFSon z->^3|iN8@0^Y%E-8#{iZKNP%QF3?i>iXn!OVgM518{cFY?eKh`>&yo1q=JkA0Rk4c#Icsx< z$U!N!18&aVi`t^bIfw!?G&@^(r?MAAB`4<&Wd>K)1SQvK-T&M%aftK8p7AtDn3Xbz zfGOS=RnD1IR`@MsVc{W5dF%y?pK#*RbcqW21+4{7GdTbLaYYil$ zZ;Nj6q{LfgSYQdd5W+PK+TH^~JXTcDbuv%30nlVmbaEp&*)sU?VE8oe=2Y+Ebcv@= zL95$4zBL-sD;T^oI`tBEM3B^Pt9gKKIv6@m6=(}TL~}44@23@-VZ3!xfJ47a4Z`D= z!&Txt-z@ML$}2{x?&G>SVbOzYol^NIZ0AQxS(Y#rBuDYPpy2~$dDJu|P4F%LcveTz znJ`s8gUE`+E*~}REvOKd=|+dmhmQP(CQH^+>dx@5>n)i!%Pl$lm_co4gGlMTyyY|F z*Xkc@)Xk9)@6BaKq0jiCfGHKrCCBNDy|rsGa$ZnbZ90~hPb@kOtTU(i9+zUACYst3 zF;FN>fk_ajv$}()ONNjJ4)^uQO=qOLE{57pK+ly3-^1&&*Wpyx>BX*t;jtNlSy7ar zo`PMdK-1K^Tn*#GwkU?3n8@`|?J`m?Etd!pJHPg6c}Yo((w>+5(#U*dYcC<9DfU(e z>ZEGa?vcYr>&?}sbM)5ZmNz!aT0{6+D~{MDe>A6-HnjJIPv^su z8Tg8yF#NEm_Nu`x=4duct=%D)B zZ}r9JJEyS!!-eL^R$anB>KLJ%;YExAF*o!{)A+cWfn^nnK8qDiNm*&4ZQN~ZQdZwu zwRdfnmun0eBI>&oli?{O=xpv9+e)MjxkAmoO%d$iH}Q5yV{(M`N9RLKaRsD!)PTcM z?KimWdy`@)S{N8zwSZj27g=PErvFEMTys53vyJ~K?at= z4|XvLsEnd>d2bvEeV{3k6ISiB{mv_Ov##A96Qtr+iSV>6{5TV4cCxf%%zcSJ*Scv^t&XWT;{rU9{sS~BPxQJ?pg$n{v{(`3SL?XE9tR!gc1hqUM`FRrXI=TLhRFCExAElQ)z05 zq*;)|dLX*=B)T&!Ot;3Bzu=8VEVfKWf()HX4s3k96cl|!BFM+22zz_$nAxS67S3IF zqe^(}`9AGSn`x^=0Z@PN0}hKFrkw;P#s?AzBG?$4s3*tMIlV^Qm?oVy8^i;1`1s96 z{mp3*9_=Bl7Zxj*XUgZzPL{Ge?)yTwiZfd-nRZ%3oo57He1KTNtxolXCw5Z)G`4hK9~2z09yiDsFB;Mqiz=C`8JsRJ*$VA=cYwy@ z!ZX?Ft_Bk+jvs3d15=W49>%?wnTR-$GfHK#7k`+!IxTY>54LD_4p(CK@CPj7op?Id z)*saW1(xo9JpWv55VNRtf(7I{j1J0nYHB67+kH*b4`w0k0nTGJY~v4+W7}PG(3evM#TTm*NSmzg}z+@|z8QAoTcT zNk2kkV^FdwB&i90J6cS;v)&EwQe{~TLo-mS5UE(5F5TyvFsJ=}Y0cO)*~lYx!pPQg zT>;TCOtj<#KEjp+W~lW0Cszmntm8ry1k~^OhL1cjl7?Z7dPW7jSGEPypGO4kUs@le z7%B%Oj*~2rN29o%*QOl!ZOI~``f`|1Smq(rZS!nWlbP}sbW6)bhW_0S+`>6sx0if} zY;x%B!1nc#Ayv>$pGnT42(^$voplVU(R`?vSJw3xbs4Zb zS@RA&a%4Y^YI-nD$4rEJG+MPQ0c{Ez)4~yB*8tx*Ax+9D*O$b9r4AyM7 zV{yS=va3z3BPhZf&H8-{P!|DXGyR-8Q3Yn0agjus$a#g#=cLjdkLg%dH7;P{!_~zS zbM2hfpdU7;usr6fzs-seMN8Qie6vk84}QW^NWigtad72v7u4J20`>qDipCF*Pr@&?|=6JvDr{P&` z7=5!2u&HGZDfh2!t0(v4asSTL%e+m(XrqEx$U%<$+upi_KX~I68!s8lH@%W>NnFus zl7ZBQ7o${4tdJ5zK@4*k&zGa=Sh?fk%)Lzb1iRW^d?4Byx!>&HZ!CEX%|M z-fXEIhQCR}aQU3B@vK_Ula)t#d%&-W#1S-i!7eZ#Gua7|TK|+m0wg~xu8jE{*^HQ? zknh-TTl|#tAz1D)#{VMr0NYK!cpHf#?=`T3Fp($xEr45AAa;q&ebXuW^@|NJ&@rY~ zthYVtMGXormXMOC?1%t?9Jp!k!#9#gZE~lXn`4{TBCsyPJ2ia0HaxgBYwZ=q)P&Yx zI^&@~pjo3;djYcVR{J6Bce#RFETuff78=9t+Y%l+f=p0Ss;soAd%E8yhc(_0b@}dC zqIkDN)P66X_;Z8_W1&5&U%CqqN^SiJ+iJt^52jPdWyjPAz%YLWos`407D!@G4CTh! z?}D*rb)NLAj^e|mmiR$QG#fAYu+HqhK{NwDCmgYcR##3Xt?W$eWxC3{1bPjtM+l1; ztzmOr**P|CT`c*Hkv(&%21bQpnv>(=@7jtNVxEkpiuPheXWJ8o$sLDj7oCs&Uj~X( zL|7C*gOeGQ)jy4~xYOWxtohlm?P!3N0BXF3|1ebAwiF?&=20c$@}nH=8|!(C)JmlC zPxKMPM9|0f=6h`5Ax!J&YnSO-Eo&-lPvS|h+yUL|Knq&yz}I_y(=whBA9S78~xYl7sbnjBMtq`Jvy!L(ChLB!uOR*7dg1fr!g7 z6mD+Vo?--Q$Pj7`b+k#D!|+PzxD?+xLsv&n)|-+t_JD`e-oFSO_kWWxBFUbwbZd{Q z`A#3W{Z^i32{3}tdXlCBZWk3gy5g2uG|W=;9N>f2OO0nSC)?*DpK=?0PpPgQ+hk_x z`$@>9i^}CNAq6dwrzLY0sLG9cu?B78bn(Hm=0GO=*qcY#t21cf^6;*cJX~$JR?C}N zfJ!lQDZ}jaoT6okv_G0Hih_sjdTkmYJEP63Qr1MdMuB9#KJ>-yR}4Ajv)L*bQ{CMn zZmtC*SgA|J z9U)P#qBL;X(Ym>#%;B=?rP0z8*vSrd#|LU1mq$OmD5I$lkG!|UPe`kjZu=A3mp9=y zxtrxjmGxty8PSSLiWXlYm^(+zS96K8RZv#mp(ONih&;ww)lXOEVo6k7yVvHG!DjDQ zg|{K~75McX@JZ&&-wYjIfy1B5Oq##JR<;85|0bB_b!@GQ>coiIIU_9>bu5d9R-4Vg zv_zN?jw(7Fi*smvF|ERdtlBXvOs%;Fja#;~uBnLk<^M7YL{iuso{5-3c8M#MC77M% za1OrVq5gNc<5xgWmcfJjMdU6DhRJ5snF)CIXk()=WtLkPgPdv9pI?oZNjTB%mW;YnV7kMmB@?%(fs=JTN*e%AwRrUN2@(-Bsdg1(x zIQd4uFE!KE)+SeEBo>J7@F|aG!#&0S!7R3PWhS84$Cf^8eCf{~>+wH>1~aSu?+zC^ zb;OQNGm10tYyT_MIh|qFb>?`mZJU4E{zKN3E4)9Y-`QEp3!e<~gI;%+0sG=-DF3IZ za5~jLba^fo!{+QtXc)QHL&b6C`TDWlE@j4qEzTTRHacmjIl{@A7k#t!#C3zD`MHh; zkT6uC{_4TG^}_6Tm%-6pN<4c3A5veo8ATKDW6a9VmiQ6`Ldvf%ZSK7W;Kl!jVZwrg zZRWwmnY3S}vpi(+pHR4`&8b78Ox801VLV@}hppcPjp(-vlzs1~PA@^s)Dg_4^) zTk45By~va0ZE^ZA)?3@BzL z?J26Z;$TrHc6^^kbx{kP*a~*7L$=Q+Ch|)87@*2kadouUU{FonA`T}j@b9Y!g+><;xCW<}RVOHb~*P^H5Z@|-;< z8{e!sESkE}@t88bu0_`|!5_L(#NVbU=i}GIoh~|Lj{9{Sxs51Rl__}9vO9Bu?6M?| z`caF=ZC-w<=w`urlw$cDXFe-jzB5Nm;*w0su_YWWW=~fI*o&=9H&Imaoe9hSCcCZi z&guKZ{TfwIzsCQt%kjy=Lf1t8{m~1u_Q$;F1>rtY$J)}C$?tmB*2k?zXc#4Hk^Ac? zf=(!6F+o+avglUulMQ0#PJzE6UMmGgBI&596Q7*7XOv#l^?CkCkN`X1l2+Yld7MdD zjZFc?r3(B%aoOH6Bb3-5u&qO5oJf zzn4ihK4>SKyP3SRO`UszHc5)(PUj$uEFP|wbZ;BwmOP-0@TG9(v8o^Ww&}Sj|Kk24 zj}`S=dYHMzmy(JqBX)AL8VuY{8ab1lfm-5o5r46;4?Gq2Pqm7DSABa<`Vr~#0^7|B z=0zIfMKmL5h|hcXC7M|viIT{yj0dB|)Dv)emeTGM8fu|;LevN9FK@O-s7l$z@b?F1 z(kp z=P%Em74e%Bm9}cZqd)P_(3XTfsq!PO3s>GtG%N%A_?urD{cX`GQq~hWT0b z=?PF4#K$eVI2h_s$`_}K(zIFBKw&ur9}(rgv}!)3rgBnX7a@}=DTnLacsgXh=Fl&a z>G89yT1Bq8h#KiXVR@dOcr4=U8NLG)mMRM7KjKWzCbOi_tNt1l%Uq?Xn2vq>GfBoW z@{n1=g)3;BK%ruN`YXa!HvVddOyI)Z-E>>$?T@z@ba3XdvX%|iP;Kn>g`BjNh{aTb z;pv*1q}#9-WOs!4Td|jM^mpkx?91Wr0~}S?H#l!(IPcOYACY*Ez6w!@zVAx{cF$A} zgCEn+qqXs7`(a_&JEAScTeHnwk=B#Ccg!UBAgWuV%o?Lam zLaw+tf@ud0_|z$;q87FWTxE;ef3F0U*@wV%N&FL)TkAGfzbz@c)Sqmh`PU5|@;%$j zBw0%zuHt1AP!shA7|Ga}B-cWiK1;R~w3+1RXuOvpuR*#e?xF=XFVYr+r;Rp!=>v z(+znRJUN3;mn|$V1R`aV8G2?(w&M1l=FEM5AgAvRbI(gtn3Y%X_ot7=kRCKTMT-MH z<&>g!6Ybgy6B3~sty7ZTA!Rz9R{oCgxfak<3ab5IPpN}Tb64ASBt7(>r@U8Htd2jU zey>fy%m`D+=s@_@7=^~zViTEkQ|w|A6eVc!!fNu~CyLY)y<~RqIm=s~AW+GrXjzZ6 z2F})Z916SHc9jHh?E~{oU$s4nOt$?Mau!;1H1;&hOMRcXh3AN9Tvm6wy{fFRJ6EEp zellSMU9GfX6T`Nvqxt7G-|$ zV3gE5Kc6oyG+Lrx>BU%8Q*tnlo1Ok%`ieZu+1=gm?Nww)5dP_R(#XOp-+)8SJ0?x7 z{z1qZ7yxGF?X?us&O)94DKob>St1PN01PdrZE?G8xnKVl;0xcya&{CSZmwtKXT|0k$2!DRs#FG9^-ymd| zCh}c`1U4_@o^zzJ3adqC*J`7U39okxONM+B!Rgv@!qVF<^*{oy(X@L-m{xCFuWDYC zIg&<1^p_DQ&`_&q6H+K?kG%=2P1GuA6)AE`IUOTp%IfNZGct8dxZ5okziT;6(dH`5 zHftrRGs%UpMnw)qvVBCF=Zw{YSoS+h>XizM(@FfJl831plK-gWlxg3%f~!B<@&hz*e#Bhr5qu51nrege8L==ZO*$B^6G~DR z&ar(>wF)gD$imBn2<AXRH=%J!CKPbCMIO_cfzkSViqVi=@?$rJvNhfXAx%#uFF?kyvs7#G-dXHH?t;L=*GC#Ywb@=6o)R zyPDlYSLkyrNg5CMw|>#hAL%dS{VN4hsuLi}eP9NbM<;BG>XP^h*A3EUGurycWJj{e zBKZ@=%c1I~j=5@cKPK#_;X;Bs5w~QG8^;v@WftM&GP|M*Cf6D0(^>7gds+MKQZ{BV z+;F9Lbih+ZoT2nsG!y9xaElEeG+L&316FYDW_vIMLO1gGrOVNR;b?KtrrPf(+?f1S z21Bd_HLw_(N{7!@C#afssgdv=^ai$M-uJBVPB>yQy4oVRi0S+P7fPA~p`^{PKUQEi z0ujjur+Ho&Cb}4!Xg3pE;-dD1${4bfR*7wl>0-r;K6Ia|-KzAoxMHuD=yL%FZYGS^ zuaRaB7KsPzdO#@YdLEXbzT7#sfAcQI239RNid$3BC_YqW0oFq?`D2hl_6>|tH>>jW zo2$l5RqQ_~8TG$V@;&6wie>RI0!4g=TIc>YqWp{Zvqv|r-qi&dfc9I-kDC3lE3_I6 zsZGJ>^{)L<*9Z8DxVKf6&WeQJpbkdlD>-OfjOden5nwQ+0VYhKZ%dnOJQ_q@%3UhYy_=hHx04 zTGQG7(<<*|V_vpX^lT z9$P<05%_9mW9<(x*w$Y#|L!{u5gWWV-cRR#+2!sm$s3%6rjqs4W;!QXvijs$)bU~A z;wWR9!B_V4SBD!!Cv+0Ly2!Tj;Q2eX*sUB{)KLJWYp-9m9peg}&cyYILvk-**YcKB zb@q=6M77_0t`BU{f31P#BUc+4jf}7PO0ty!TePx7dU@rv;D~%3s}A}wF*DyV{ykIB z*FWd_J1$c<2ADIRl_O*~Y4sD+MdrKi$fvQ*8TcJ4qWSDtWU@|0Q}{v*N9{D&#i`2! z1*sn_!VJ}9vydcJE7}<#LZHUYJ=s$>1J7Z6BX zIptpsR|hmo*xxPY6{79KJq(({U;Lzhyne&UQMfbl_A_;8=<1z0efX5wsy$)|o+o!Xg%A zE+X>fPOZYPouN}!Zwwlc=lS>Qn^xFPZ2qk%5r!(N*_xko0X)TEzzEYY)cbFuM<_nX z6+9*$*9k=CNdRCd;0T}BC*TU&YuAUcHe)+T{}#d}%u^Gl^{_XB1q9l^t4+da1Cowg zv>2Tanne*u_V30Ocrs183eT?`zY9K!eUL|xYkz;}UZmb!G#J_BtCy$_VJVPcDv;iM zFp>}m$o5{bR({uN?dqRxr&L)Keq<>EAXM=hN=D4=oK4DT;AxH#hsYpuZcrd*U&>++ z@x7W82iVx^k1!IfKSy$ywZbT+HQViWtYenNm2EDRLjdo(%jCZ%CkTf;f53`tmTCCi z@Fn#b!yOlL0;461MT$Wq%84>?$h*;T(PTPYu1KRjQqFj0X6{KscK-Yv>!&Jj;aj#{ zDe5fg1N?IILb|zmIO`x&-yActADrwf24{jXnd(%cdgmEj5-#GiFB~q8nnfnNd1~?L zjJfpsD_VtHg_;Uo1w_*2aW4HGgB=rr_hSkBZp&?ib_-Gz zF)$awqFvQ<=CN!9Md&YQhI)g1EdSN=D*nJAYf_x#dp;9Vo zU5%YYHpiAOIU@>JCx`l*4=e(%nsdyxCo#}rT89L}5k2$vk{3LiBGj*pu`k5`la2>K z>FC`8cVJ6&EwuZfG_4Hzqnp-MTtM~zk&YWjEI{d~UYxR(x|L1|dES*U$Ycqx_b#7I zq%85;24fEJ8#hiYh3zT6GKIoWeI9QZxk6_q$&gi}mv8-?$ZQi?hvI~a5z=#{2FJs! z1qPe;9{bIMR)Xt8Paw8#DBXkMcO(O)z9Z~*CNAT3U)dC_O z_pVK`$siC3@pB>;)2yNmZ)PbFYx3NA+x^yCC^3kW9UP*21{07}PZcPKgAez2ILeze zHW~Er2tvwQFH3*4X4h1mEh{V&#O|!2vW{f+Zu3Kr8+d2@T2EjMWz=pw0RH^eHLIyE zk`ivf$H)JA8GV?JpQQqF#{u*BLoVh@L%J_@SaG zS0Ht4J_%7h9DcK5_>Vg7iqXIZQT@NvaX0_}rH&8KfW{J@z`q{r|yLM@Fnic~9*mA!Qf?>zCukV|laQOq-D_>E9P zszIw~G0WM<3Vz4$!#GeJB_SC2jll#e$S7t*&V&H}ZfK5j{uTiRwcX;JMM?E!<{@j!6HHbqtcSl6EU`OqF|$QtK!PT2b#wNo5qL zT-A{3iyCkv(YxyNdeqpX%WXA2(5{K<~an2hH^VQwyduNxgpWf?>)y3`g0LL zRLVP$4f5+R%uP0m#mG5#|1vW1h91dqC>ejsq7gLBfQ0p*`gn0*Xl)!e*wqTNlJbh& z(;Y>#XVm9>@g`drUOCNuZ&o-3TX6;W;JT_4KK#)P~ju4P}MJ8d285QI7MuR@|Jn@ph)v^o97!yv{rD8>dY zi59P=26LuV#UGPyanV>O%tTR2cs*o!{UIQrUvKyp#W5X|{sf{>cf5Oah)y93|40-Q zy^tcY58EbAD18q>jY5(coE{50w4js#<6m0SEDHSBTzyu_!{gurahU<%NjYsDe!LD( zWTxWpOS&SImznhoSm^v&KOwDj&Zg4h#5P(MKI!B!(j1%|i zoLI{8(K~fSa5DxXsG+MA&Kv^KWp`(9oD^n3(hOTBI%Z{vhhC>N+sBx99|`USjCgpt zJDOg8s1p@^9>!U$x0>6iG7I;gKG;e z|Lh(`am~th@Y^%(adJ&T{UK9#`jskI^JyPIQI-$f`_yfk7%{tDwpqt|tyRHHl}%si zv;DA5TllCADO&&1+^_Xb$Ti)H$t!qc6+5y2wjvx2X~FSBDZ^VMe}JKmpD***ENS-> z_4w0Xl=jE6$uia_kq5wA(xhIjCdiXG7t>DGwa6Wv2h|z4w+iqPu}97zc0-_x?GbxB z`!rmJY7i9=63WSx>QOm=N*}zrNBi{@U7)JNA^62RBrKHz;}T_hkXrq$aTC61r9Hn_ zm^FbZ@m|w_-`qDs5p}I%#p0crxsur*Bo+O^#;m=pro2n)>GWA7uq5fs@C3^s0D}9l z@mF`ARUrW@3_(}NC(^4PmHwkp%^Z5`HCC9{GYhHZi{YGpN~&G}&tz`Tci_DgM?r*^ zN;+1sa(^!@+Ub#5+&qb^0FG|jLhmZS5?v;G6{7Sr z39MAVzR!PfVY0FQ{{1z&)x_7}ydt+#*}D1x{;VW9F!k(OZIim&KR{_rJ#)Ut`axSb z!Ox&2|~wg>z}wUqCcfa(*pBkjsL<-p|A zTV_yj`}>ywXIwS=v(};%^5e-shX((*UPt*Y&o6pzm>8!#?AIN>}zFLnd}@P#lR zKIy-cH0Ru%5_BsZhe{J1mSX5#E;Bn~=r3ECUyJKh&q&uWbx*H^hknZm8Zt3op8oIkv z5P@L_eg3=8?zL~23tkWxXU@zy_vilpM!{bK2jS^-B!?S>+&yt2Q>PRB>atW777?`# zZ$gLy&WeP~#-ztyM+i0KmV17h0f9u0qEK_oJ~^^IoYwyWRrscPgBeqxrMnW8wY-5%a&}nI|>j zV%fx+8C1xJf3(Peg=}>1a7tMvo+QPoDy8hvK64m!JpdU*!*z3(Hg zB6{el<=!e_d%;}))MjICT{Kvf^mgQWPfk@aWyew4!X?H&t|oCd-ER}Hjm>Vq&@B!F zL_7P?{&~+l%MV%^+jTn;#4`mWstFgkq9969d4Lu^vQS$*Fe# z4@4XYQ+tJo9=sk^@t}RjMo9m%T7OUn``}JgoGpc@wwZBpCyji|6n(l(AAc9Wowq-> zLm;3%rWj!Y#4qv}B4YRI>)Ccf*2f*txO~@;)3Mi0)g?f~!~w?)1;SO1xqdyXQWoFU zL(6D4elx=ED7N7CE-1=P$NEvxwyEg%$0nCHczMIBU8fJqD?hm=SBaUjeSXAnl>PKQ zi~x4>U=7ZLwAv)&b)2^YdNM5x{K;R^84#sq*IEx*kC($=_t6{&@x26%m7h+zPSy-A9Y5#S|l z+(CN$B+Nv4eozLG<5H0-$S1-cKkRcJ^Xu}nOMleJBEzi` zs>@~t)ixS?AvW}ANmNTkufXd2N&ZEAs+F`-@3xV0)k?+qbsib?ndOfAH)m_W5Umu_ zs`)?D{zaQ)+1hTTX?LAOQ$RlMjXc?e%0no~0b+^iERIR^jBM@8Xs#!%GCDCr++ysX zvJc49%pcA64=5hdD zq7%d+()>Voe07M`Un67#{>veLrRdNT2lRamgHP`>gA&S(SO;@qI z?ne&9rdkX>GEu1TKpdjFApe*VP0NEJr+~r#i6ZF9|8s~QD!OrLLXk6H zR;xw2p}mhp{rNqwM3|h?22s{7cgqJpf?xo^@&Dl*xBis|#Y~!SC!g~iYK#GH>ALYW zEU+SQk4GEXIb#<|keuE*oUWImyoCq5#Z)QV^0c-rfq17QILPxoOP{rlf$~0f>u=W& zXKka-pObn6>&<`RWy$g%F_i$s!I^|f!EWVU&-1_5y z_d6+$STgbFaEqxUw&|;Fn5i8d;l9p(u4m2_c*4X0YSK*RR0KZLwN9F%uP5KBG81^? z9dA&YHCRHO9hnQ2*becPr=bBWE!SW`5 zT?phc6#ZbLixb=p|8ugZS+{nL2BLpgJ?LtQ1@U)N&}3T%9M~?2HVFVyXNW6^qc3a z`AS;n`x{h%(e2zsHKU;!EqnFNpd|ObBa8$rYbjqd!L(WBXLCS*1hx{FVi(9MTWRj&eta~t|bPBSOt-fh?MJi6r-+9bl{W z<9o>%nQQ0upX>tduCdC(xiIIO=XSk1#0z}4|2RZQz-ZK9t6_xdpF_M-lpE>zk3%f` z=MVvJ8J2%!NBwGrgVx61Oo`aWYj$f=_E@uCs?yZMBiF7{KM%9#HATvI_)$;_X#mTv zecmxwst=+zMmf5Cc%P4^tN)ry{ zY1e@6u;$_SW?yLzyR*jWUn6GZPwhRfm|4xHgJCVbn9XXR-Y@I`!Y?+i8F}NWtNl%O zu62o_&a^2LWIJWtdqJ`6HsOK$+(U@8x&?Q$N~XL{r8mC6!*$MXYF}(w_^#7+SG|r0 zuFqP131zMskjh0Y>jZ&_1pk4E#m24C;zG*$iySqyXuLX}>6=@Ir#K#}BABWZgG?W} zBaiZExMVqOBW`1`xGiZphoX-cN=-gE9jZehV#Vnq_!S~91VSJp>tBfY92X0@n=^By zjW*XXy&JnRBcEwKQ)eb?xH=>(FjVnz28RpHIYRbw5kW5*cAaSUU=NYQ?WiN2?sJ~5 zPg4d{mx_EkI_2;O{973JaGr^(EFk^NqDfIBU;RkjCD9qbU4FpAnX)Houq{>CW_R=R z!n?2jpjNU#El(r<>+T=APuVbEv^Gxmw}W+#%PNiNzH(4ob@HiW&luo4Dx5J+HZk2rBC09jnqr3fT@U1gB_8lf z8fZev(LarwIEN6RR?!r-+M7TwW!-(WVuZDFcg1`kR$24fhh!RpoxEGg4aI*X>@jFT zG5}(HbNJjDX4}z}#YG&teQfJ0uw zBnIKz_Gm~+lMhl9UA@^qJ}7LZ#Z2radL;P$V{_}y-_L8H{+;r0JUO>^Xn4$%++dj- zNP1MP>=lp15`1hE{m#8>Qo+}F+7^$Y&Z8+iW6guu+^ORhx3@bRx5}316;SsQ`mYSp z48jl}1w8jTEH{h_?}6)L_kyeA7Js0eV_A*L>r{?ne^R+#!nk0h5=)Z3GQ@AfA>JBE z)03TS%j??Ybr!(RQ?dcbjy0(!;>?{^?&beY2A{zLo|9c%HC`XUZG(I@HR|wp7SSNQFr`V1G7oCTYh`n(B z>w7jLoaM3qC?0U&fYzShpUk9wO>!@H2^|v`V?c9Z;Ix5d|1m^l2tzCv%Q!IAb8pO~ zOLt*P?UMaSZ#w?gclOPVeV0&K@81F4uYbKagFpeK`WKECCh&KAOKcsnV7;czb8es) zQY$xiQz!?6RgCE5s&$^+=ayoj?F3HGiHJJ6L;}YB4_|I*?j^J#Tf(q;0$hBV&hME! z*69Em3kqem3^j(4 zttj{=ee~fa9Wo{Xb5eVBvo1?#iiF1oZPA|}a{NI?HMx!dOFtTKPY3=NLqvsnbM;%& ztJ378@4px#+W(&+o`mp2278l_|A!%>zcNG%dsU4js;U23dSvl9HiHX-{1>Rz*5wo*$%E;b- zYABz|xM=rMNL5BgQD`%x5@p_w`F649cF}V1`eEbY+@#0Y>IwPF?$+DdpBL~i(VQy`ELslBx0ycpVnx3x=RB#Ds|HM}l-|klE9BQwU(KzOj3VL92AWAV6i%!B z%{wNAH$R9Y5w~Q>!tBH*Xz$Y;U

9#vz7fd!`wDg#4T%Fka^F*ge>;tB3^He0&S+ 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 Vh*evS4f*ODDRKEvRiXy|{|lw`NkRYs literal 0 HcmV?d00001 diff --git a/packages/client/src/assets/images/svg/arrow-controll-bg.svg b/packages/client/src/assets/images/svg/arrow-controll-bg.svg index e56e742..602d91d 100644 --- a/packages/client/src/assets/images/svg/arrow-controll-bg.svg +++ b/packages/client/src/assets/images/svg/arrow-controll-bg.svg @@ -1,174 +1,174 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - + + + + - - - - - + + + + + - - + + - + - - - - + + + + - - - - - + + + + + - - + + - + - - - - + + + + - - - - - + + + + + - - + + - + - - - - + + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/packages/client/src/assets/images/svg/fire-controll-bg.svg b/packages/client/src/assets/images/svg/fire-controll-bg.svg new file mode 100644 index 0000000..533f075 --- /dev/null +++ b/packages/client/src/assets/images/svg/fire-controll-bg.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/client/src/assets/images/svg/kills-count-bg.svg b/packages/client/src/assets/images/svg/kills-count-bg.svg new file mode 100644 index 0000000..87f05c2 --- /dev/null +++ b/packages/client/src/assets/images/svg/kills-count-bg.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/client/src/assets/images/svg/pause-and-help-controll-bg.svg b/packages/client/src/assets/images/svg/pause-and-help-controll-bg.svg new file mode 100644 index 0000000..9ca92b8 --- /dev/null +++ b/packages/client/src/assets/images/svg/pause-and-help-controll-bg.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/client/src/assets/images/svg/title-decor-vertical.svg b/packages/client/src/assets/images/svg/title-decor-vertical.svg new file mode 100644 index 0000000..2848178 --- /dev/null +++ b/packages/client/src/assets/images/svg/title-decor-vertical.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/client/src/pages/Game/Game.scss b/packages/client/src/pages/Game/Game.scss index e69de29..b2741fb 100644 --- a/packages/client/src/pages/Game/Game.scss +++ b/packages/client/src/pages/Game/Game.scss @@ -0,0 +1,153 @@ +@import '../../scss/vars.scss'; + +@mixin customPosition($left, $top, $right, $bottom) { + left: $left; + top: $top; + right: $right; + bottom: $bottom; +} + +$border-color: #70842f; + +.game-page { + &__container { + margin: 0 auto; + max-width: 1400px !important; + } +} + +.game-wrapper { + position: relative; + width: 800px; + height: 600px; + background-color: $c_black; + border-radius: 8px; + overflow: hidden; + border: 4px solid $c_black; + padding: 12px; + z-index: 1; + + &::before { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient(to left, #5e5e5e, #414243); + z-index: -1; + } + + &::after { + content: ''; + position: absolute; + inset: 7px; + border: 2px solid $border-color; + background: $c_black; + z-index: -1; + } + + &__decor-hr { + position: absolute; + inset: 0; + z-index: -1; + + &::before { + content: ''; + position: absolute; + height: 8px; + + @include customPosition(0, 0, 0, auto); + + background: url('@/assets/images/svg/title-decor.svg') no-repeat center + center; + background-size: contain; + } + + &::after { + content: ''; + position: absolute; + height: 8px; + + @include customPosition(auto, 0, 0, 0); + + background: url('@/assets/images/svg/title-decor.svg') no-repeat center + center; + background-size: contain; + transform: rotate(180deg); + } + } + + &__decor-vr { + position: absolute; + inset: 0; + z-index: -1; + + &::before { + content: ''; + position: absolute; + width: 8px; + + @include customPosition(0, 0, auto, 0); + + background: url('@/assets/images/svg/title-decor-vertical.svg') no-repeat + center center; + background-size: contain; + } + + &::after { + content: ''; + position: absolute; + width: 8px; + + @include customPosition(auto, 0, 0, 0); + + background: url('@/assets/images/svg/title-decor-vertical.svg') no-repeat + center center; + background-size: contain; + + transform: rotate(180deg); + } + } +} + +.game-controll { + display: flex; + flex-direction: column; + align-items: center; + width: 290px; + margin: auto; + + &__lives { + width: 223px; + margin: 8px 0; + + & .custom-page-title__content { + padding: 28px 12px; + } + + & .custom-page-title__content > * { + font-size: 44px; + } + } + + &__kills, + &__lives, + &__pause-help-buttons { + margin-bottom: 32px; + } + + &__arrows { + margin-bottom: 20px; + } + + &__fire { + margin-right: auto; + } +} + +.start-screen { + display: flex; + align-items: center; + justify-content: center; + position: absolute; + inset: 12px; + background-color: $overlay-color; +} diff --git a/packages/client/src/pages/Game/Game.tsx b/packages/client/src/pages/Game/Game.tsx index 9dfde02..d5332ca 100644 --- a/packages/client/src/pages/Game/Game.tsx +++ b/packages/client/src/pages/Game/Game.tsx @@ -1,17 +1,122 @@ +import { CustomPageTitle } from '@/components/ui/CustomPageTitle/CustomPageTitle' import { Arrows } from './components/Arrows/Arrows' +import { KillsCounter } from './components/KillsCounter/KillsCounter' import './Game.scss' +import { PauseHelp } from './components/PauseHelp/PauseHelp' +import { FireControll } from './components/FireControll/FireControll' +import { useEffect, useState } from 'react' +import { Modal } from '@/components/common/Modal/Modal' +import GameInfo from '@/assets/images/game-info.jpg' +import { Button } from '@/components/ui/Button/Button' export const Game = () => { + const [isInfoModalOpen, setIsInfoModalOpen] = useState(false) + const [buttonsState, setButtonsState] = useState({ + upButton: false, + downButton: false, + leftButton: false, + rightButton: false, + fireButton: false, + }) + + const pauseHandler = () => { + console.log('pauseHandler') + } + + const helpHandler = () => { + setIsInfoModalOpen(true) + } + + const arrowClickHandler = () => { + return; + } + + const toggleButton = (event: Event, buttonName: string, state: boolean) => { + event.preventDefault() + + setButtonsState({ ...buttonsState, [buttonName]: state }) + } + + useEffect(() => { + const handleKey = (event: KeyboardEvent) => { + const isKeydown = event.type === 'keydown' + + switch (event.key) { + case 'ArrowUp': + toggleButton(event, 'upButton', isKeydown) + break + case 'ArrowDown': + toggleButton(event, 'downButton', isKeydown) + break + case 'ArrowLeft': + toggleButton(event, 'leftButton', isKeydown) + break + case 'ArrowRight': + toggleButton(event, 'rightButton', isKeydown) + break + case ' ': + toggleButton(event, 'fireButton', isKeydown) + break + default: + break + } + } + + window.addEventListener('keydown', handleKey) + window.addEventListener('keyup', handleKey) + + return () => { + window.removeEventListener('keydown', handleKey) + window.removeEventListener('keyup', handleKey) + } + }) + return (
-

+ setIsInfoModalOpen(false)}> + Инструкция к игре + + +
-
- game wrapper +
+
+
+ Воот тут игра +
+
+
- +
+ + + + + + + + + +
diff --git a/packages/client/src/pages/Game/components/Arrows/Arrows.scss b/packages/client/src/pages/Game/components/Arrows/Arrows.scss index 3e50471..499a019 100644 --- a/packages/client/src/pages/Game/components/Arrows/Arrows.scss +++ b/packages/client/src/pages/Game/components/Arrows/Arrows.scss @@ -20,104 +20,14 @@ padding: 0 20px; } -// .vertical-arrows { -// position: absolute; -// left: 0; -// top: 0; -// right: 0; -// bottom: 0; - -// &__top { -// position: absolute; -// top: 1px; -// left: 50%; -// transform: translateX(-50%); -// } - -// &__bottom { -// position: absolute; -// bottom: 1px; -// left: 50%; -// transform: translateX(-50%); -// } -// } - -// .arrow-top { -// width: 100px; -// height: 50px; - -// &__border { -// position: absolute; -// top: -$border-width - 3; -// left: -$border-width - 3; -// right: -$border-width - 3; -// bottom: $border-width + 1px; - -// border-radius: $border-radius $border-radius 0 0; -// background: $border-gradient; -// background-size: 50% 50%; -// background-repeat: no-repeat; -// z-index: -1; -// padding: 10px; -// border: 3px solid $outline-color; -// border-bottom: none; - -// &::before { -// @include borderDecorSettings(0, 0) -// } -// } - -// &__content { -// position: relative; -// display: flex; -// width: 100px; -// height: 50px; -// border-radius: calc($border-radius - 6px) calc($border-radius - 6px) 0 0; -// border: 1px solid $primary-color; -// border-bottom: none; -// background-color: $bg-color; -// text-align: center; -// color: $text-color; -// padding: 12px; -// } -// } - -// .arrow-bottom { -// width: 100px; -// height: 50px; - -// &__border { -// position: absolute; -// top: $border-width + 1px; -// left: -$border-width - 3; -// right: -$border-width - 3; -// bottom: -$border-width - 3; - -// border-radius: 0 0 $border-radius $border-radius; -// background: $border-gradient; -// background-size: 50% 50%; -// background-repeat: no-repeat; -// z-index: -1; -// padding: 10px; -// border: 3px solid $outline-color; -// border-top: none; - -// &::before { -// @include borderDecorSettings('auto', 0, 0, 0, 180deg) -// } -// } - -// &__content { -// position: relative; -// display: flex; -// width: 100px; -// height: 50px; -// border-radius: 0 0 calc($border-radius - 6px) calc($border-radius - 6px); -// border: 1px solid $primary-color; -// border-top: none; -// background-color: $bg-color; -// text-align: center; -// color: $text-color; -// padding: 12px; -// } -// } +.vertical-arrows { + position: absolute; + display: flex; + flex-direction: column; + justify-content: space-between; + left: 50%; + top: 0; + bottom: 0; + transform: translateX(-50%); + padding: 20px 0; +} \ No newline at end of file diff --git a/packages/client/src/pages/Game/components/Arrows/Arrows.tsx b/packages/client/src/pages/Game/components/Arrows/Arrows.tsx index 17fcd42..e604558 100644 --- a/packages/client/src/pages/Game/components/Arrows/Arrows.tsx +++ b/packages/client/src/pages/Game/components/Arrows/Arrows.tsx @@ -1,107 +1,58 @@ -import { useEffect, useState } from 'react' -import { ButtonMid } from '../buttons/ButtonMid/ButtonMid' +import { ControllBtn } from '../ControllBtn/ControllBtn' import './Arrows.scss' +import { Icon } from '@/components/ui/Icon/Icon' -export const Arrows = () => { - const [activeButtons, setActiveButtons] = useState({ - upButton: false, - downButton: false, - leftButton: false, - rightButton: false, - }) - - const toggleButton = (buttonName: string, state: boolean) => { - setActiveButtons({ ...activeButtons, [buttonName]: state }) - } - - const handleKey = (event: KeyboardEvent) => { - console.log(activeButtons) - - switch (event.key) { - case 'ArrowUp': - toggleButton('upButton', event.type === 'keydown' ? true : false) - break - case 'ArrowDown': - toggleButton('downButton', event.type === 'keydown' ? true : false) - break - case 'ArrowLeft': - toggleButton('leftButton', event.type === 'keydown' ? true : false) - break - case 'ArrowRight': - toggleButton('rightButton', event.type === 'keydown' ? true : false) - break - default: - break - } - } - - useEffect(() => { - window.addEventListener('keydown', handleKey) - window.addEventListener('keyup', handleKey) +type ArrowsPropsType = { + className?: string + buttonsState: { + upButton: boolean + downButton: boolean + leftButton: boolean + rightButton: boolean + fireButton: boolean + }, + clickHandler: () => void, +} - return () => { - window.removeEventListener('keydown', handleKey) - window.removeEventListener('keyup', handleKey) - } - }) +export const Arrows = (props: ArrowsPropsType) => { + const { className, buttonsState, clickHandler } = props return ( -
+
- - - - - - - - - - + + + + + + +
+
- - - - - - - - - - + + + + + + +
) diff --git a/packages/client/src/pages/Game/components/ControllBtn/ControllBtn.scss b/packages/client/src/pages/Game/components/ControllBtn/ControllBtn.scss new file mode 100644 index 0000000..d309513 --- /dev/null +++ b/packages/client/src/pages/Game/components/ControllBtn/ControllBtn.scss @@ -0,0 +1,62 @@ +@import '../../../../scss/vars.scss'; + +$button-top-border-color: #ffffff7d; +$button-bottom-border-color: #00000074; + +@mixin buttonSize($width, $height) { + width: $width; + height: $height; +} + +.controll-btn { + display: block; + outline: none; + border: none; + cursor: pointer; + text-decoration: none; + text-align: center; + + font-family: $f_default-font-family; + font-size: 14px; + font-weight: 700; + + color: $c_font-default; + transition: border-color $animation-base-speed; + + background-color: $c_button; + border-top: 1px solid $button-top-border-color; + border-bottom: 1px solid $button-bottom-border-color; + border-radius: 4px; + + &_active, + &:active { + border-top-color: $button-bottom-border-color; + border-bottom-color: $button-top-border-color; + } + + &_blue { + background-color: $c_button_blue; + } + + &_red { + background-color: $c_button_red; + } + + &_small { + @include buttonSize(28px, 26px); + border-width: 3px; + border-radius: 6px; + } + + &_middle { + @include buttonSize(37px, 29px); + border-width: 4px; + border-radius: 7px; + } + + &_big { + @include buttonSize(76px, 64px); + border-width: 6px; + border-radius: 12px; + } +} diff --git a/packages/client/src/pages/Game/components/ControllBtn/ControllBtn.tsx b/packages/client/src/pages/Game/components/ControllBtn/ControllBtn.tsx new file mode 100644 index 0000000..d842884 --- /dev/null +++ b/packages/client/src/pages/Game/components/ControllBtn/ControllBtn.tsx @@ -0,0 +1,17 @@ +import './ControllBtn.scss' + +type ControllBtnPropsType = { + children: React.ReactNode + className?: string + onClick: () => void +} + +export const ControllBtn = (props: ControllBtnPropsType) => { + const { children, className, onClick } = props + + return ( + + ) +} diff --git a/packages/client/src/pages/Game/components/FireControll/FireControll.scss b/packages/client/src/pages/Game/components/FireControll/FireControll.scss new file mode 100644 index 0000000..10c2887 --- /dev/null +++ b/packages/client/src/pages/Game/components/FireControll/FireControll.scss @@ -0,0 +1,19 @@ +@import '../../../../scss/vars.scss'; + +.fire-controll { + display: flex; + align-items: center; + justify-content: center; + width: 82px; + height: 77px; + + background: url('@/assets/images/svg/fire-controll-bg.svg') no-repeat center + center; + background-size: contain; + + &__button { + display: flex; + align-items: center; + justify-content: space-between; + } +} diff --git a/packages/client/src/pages/Game/components/FireControll/FireControll.tsx b/packages/client/src/pages/Game/components/FireControll/FireControll.tsx new file mode 100644 index 0000000..48fdeb0 --- /dev/null +++ b/packages/client/src/pages/Game/components/FireControll/FireControll.tsx @@ -0,0 +1,27 @@ +import { Icon } from '@/components/ui/Icon/Icon' +import { ControllBtn } from '../ControllBtn/ControllBtn' +import './FireControll.scss' + +type FireControllPropsType = { + className?: string + buttonPressed: boolean + fireHandler: () => void +} + +export const FireControll = (props: FireControllPropsType) => { + const { fireHandler, buttonPressed, className = '' } = props + + return ( +
+
+ + + +
+
+ ) +} diff --git a/packages/client/src/pages/Game/components/KillsCounter/KillsCounter.scss b/packages/client/src/pages/Game/components/KillsCounter/KillsCounter.scss new file mode 100644 index 0000000..3e8fe66 --- /dev/null +++ b/packages/client/src/pages/Game/components/KillsCounter/KillsCounter.scss @@ -0,0 +1,24 @@ +@import '../../../../scss/vars.scss'; + +.kills-counter { + display: flex; + align-items: center; + justify-content: center; + width: 127px; + height: 50px; + + background: url('@/assets/images/svg/kills-count-bg.svg') no-repeat center + center; + background-size: contain; + + &__number { + display: block; + width: 100%; + padding: 0 32px 0 60px; + line-height: 1; + + font-size: 18px; + font-weight: 700; + text-align: center; + } +} diff --git a/packages/client/src/pages/Game/components/KillsCounter/KillsCounter.tsx b/packages/client/src/pages/Game/components/KillsCounter/KillsCounter.tsx new file mode 100644 index 0000000..bd8ebc3 --- /dev/null +++ b/packages/client/src/pages/Game/components/KillsCounter/KillsCounter.tsx @@ -0,0 +1,16 @@ +import './KillsCounter.scss' + +type KillsCounterPropsType = { + kills: number + className?: string +} + +export const KillsCounter = (props: KillsCounterPropsType) => { + const { kills, className = '' } = props + + return ( +
+ {kills} +
+ ) +} diff --git a/packages/client/src/pages/Game/components/PauseHelp/PauseHelp.scss b/packages/client/src/pages/Game/components/PauseHelp/PauseHelp.scss new file mode 100644 index 0000000..b940dd4 --- /dev/null +++ b/packages/client/src/pages/Game/components/PauseHelp/PauseHelp.scss @@ -0,0 +1,21 @@ +@import '../../../../scss/vars.scss'; + +.pause-help { + display: flex; + align-items: center; + justify-content: center; + width: 173px; + height: 56px; + + background: url('@/assets/images/svg/pause-and-help-controll-bg.svg') + no-repeat center center; + background-size: contain; + + &__buttons { + width: 100%; + padding: 0 36.5px; + display: flex; + align-items: center; + justify-content: space-between; + } +} diff --git a/packages/client/src/pages/Game/components/PauseHelp/PauseHelp.tsx b/packages/client/src/pages/Game/components/PauseHelp/PauseHelp.tsx new file mode 100644 index 0000000..f44fec1 --- /dev/null +++ b/packages/client/src/pages/Game/components/PauseHelp/PauseHelp.tsx @@ -0,0 +1,31 @@ +import { Icon } from '@/components/ui/Icon/Icon' +import { ControllBtn } from '../ControllBtn/ControllBtn' +import './PauseHelp.scss' + +type PauseHelpPropsType = { + className?: string + pauseHandler: () => void + helpHandler: () => void +} + +export const PauseHelp = (props: PauseHelpPropsType) => { + const { pauseHandler, helpHandler, className = '' } = props + + return ( +
+
+ + + + + + + +
+
+ ) +} diff --git a/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss b/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss deleted file mode 100644 index 759ef17..0000000 --- a/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.scss +++ /dev/null @@ -1,31 +0,0 @@ -@import '../../../../../scss/vars.scss'; - -.button-middle { - outline: none; - border: none; - cursor: pointer; - border-radius: 8px; - background-color: $c_button; - transition: border-color $animation-base-speed; - - padding: 4px 12px; - display: block; - - border-top: 5px solid $c_button-top; - border-bottom: 5px solid $c_button-bottom; - - font-size: 16px; - font-family: $f_default-font-family; - font-weight: 900; - color: $c_font-default; - text-decoration: none; - text-align: center; - - width: 76px; - height: 64px; - - &_active { - border-bottom-color: $c_button-top; - border-top-color: $c_button-bottom; - } -} diff --git a/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx b/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx deleted file mode 100644 index b1a9320..0000000 --- a/packages/client/src/pages/Game/components/buttons/ButtonMid/ButtonMid.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import './ButtonMid.scss' - -type ButtonMidPropsType = { - children: React.ReactNode - isPressed: boolean - buttonName: string - toggleButton: (buttonName: string, state: boolean) => void -} - -export const ButtonMid = (props: ButtonMidPropsType) => { - const { children, isPressed, buttonName, toggleButton } = props - - return ( - - ) -} diff --git a/yarn.lock b/yarn.lock index cd20bd0..de59505 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1645,6 +1645,16 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" +"@reduxjs/toolkit@^2.2.7": + version "2.2.7" + resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz" + integrity sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g== + dependencies: + immer "^10.0.3" + redux "^5.0.1" + redux-thunk "^3.1.0" + reselect "^5.1.0" + "@remix-run/router@1.19.2": version "1.19.2" resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz" @@ -1913,20 +1923,14 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.0.17": - version "18.0.17" - resolved "https://registry.npmjs.org/@types/react/-/react-18.0.17.tgz" - integrity sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ== +"@types/react@*", "@types/react@^18.0.17", "@types/react@^18.2.25": + version "18.3.10" + resolved "https://registry.npmjs.org/@types/react/-/react-18.3.10.tgz" + integrity sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - "@types/serve-static@*": version "1.15.0" resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz" @@ -1945,6 +1949,11 @@ resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" @@ -2348,6 +2357,15 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +axios@^1.7.7: + version "1.7.7" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-jest@^28.0.0, babel-jest@^29.0.1: version "29.0.1" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.0.1.tgz" @@ -3800,7 +3818,7 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -"Falcon-Tanks@file:/Applications/XAMPP/xamppfiles/htdocs/practicum/falcon-tanks/packages/client": +"falcon-tanks@file:/Applications/XAMPP/xamppfiles/htdocs/practicum/falcon-tanks/packages/client": version "1.0.0" resolved "file:packages/client" dependencies: @@ -3936,6 +3954,11 @@ flatted@^3.1.0: resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" @@ -4429,6 +4452,11 @@ ignore@^5.0.4, ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +immer@^10.0.3: + version "10.1.1" + resolved "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== + immutable@^4.0.0: version "4.3.7" resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz" @@ -5484,7 +5512,7 @@ lefthook-darwin-arm64@1.7.15: resolved "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.15.tgz" integrity sha512-o8JgCnLM7UgF9g0MwarHJFoj6aVSSkUInHpsQZegV1c7CVQY/LIXgSeAWRb9XBvuUjByJ/HiHFMp9/hAALTwxQ== -lefthook@^1.3.9, lefthook@^1.7.15: +lefthook@^1.7.15: version "1.7.15" resolved "https://registry.npmjs.org/lefthook/-/lefthook-1.7.15.tgz" integrity sha512-HW2mYkhg0a3RH2t57+ZJwacJiSIuDEhsXQAaCw6iGeN7zowdUV7g5QtnRdFdPkaK2eaNFpG6Rp0GsTrl/v0gNg== @@ -6876,6 +6904,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + psl@^1.1.33: version "1.9.0" resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" @@ -6956,6 +6989,14 @@ react-is@^18.0.0: resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +"react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", react-redux@^9.1.2: + version "9.1.2" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz" + integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== + dependencies: + "@types/use-sync-external-store" "^0.0.3" + use-sync-external-store "^1.0.0" + react-refresh@^0.14.0: version "0.14.0" resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz" @@ -6976,7 +7017,7 @@ react-router@6.26.2: dependencies: "@remix-run/router" "1.19.2" -react@^18.0.0, react@^18.2.0, react@>=16.8: +"react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", react@^18.0, react@^18.0.0, react@^18.2.0, react@>=16.8: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -7101,6 +7142,16 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redux-thunk@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz" + integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== + +redux@^5.0.0, redux@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz" + integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== + reflect.getprototypeof@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz" @@ -7144,6 +7195,11 @@ requires-port@^1.0.0: resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +reselect@^5.1.0: + version "5.1.1" + resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz" + integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" @@ -8209,6 +8265,11 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +use-sync-external-store@^1.0.0: + version "1.2.2" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" From 076873728e63f32ce6eee0ffa765e317389adccc Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Sun, 29 Sep 2024 05:20:54 +0500 Subject: [PATCH 16/20] =?UTF-8?q?=D0=A1=D0=B2=D1=80=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D1=83=20=D0=B8=D0=B3=D1=80=D1=8B=20=D0=B8=20=D0=BE=D0=BA=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=B0=20=D0=B8=D0=B3?= =?UTF-8?q?=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/pages/Game/Game.tsx | 2 +- packages/client/src/pages/Game/components/Arrows/Arrows.scss | 2 +- packages/client/src/pages/Game/components/Arrows/Arrows.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/client/src/pages/Game/Game.tsx b/packages/client/src/pages/Game/Game.tsx index d5332ca..65ac6d4 100644 --- a/packages/client/src/pages/Game/Game.tsx +++ b/packages/client/src/pages/Game/Game.tsx @@ -28,7 +28,7 @@ export const Game = () => { } const arrowClickHandler = () => { - return; + return } const toggleButton = (event: Event, buttonName: string, state: boolean) => { diff --git a/packages/client/src/pages/Game/components/Arrows/Arrows.scss b/packages/client/src/pages/Game/components/Arrows/Arrows.scss index 499a019..8fa88cd 100644 --- a/packages/client/src/pages/Game/components/Arrows/Arrows.scss +++ b/packages/client/src/pages/Game/components/Arrows/Arrows.scss @@ -30,4 +30,4 @@ bottom: 0; transform: translateX(-50%); padding: 20px 0; -} \ No newline at end of file +} diff --git a/packages/client/src/pages/Game/components/Arrows/Arrows.tsx b/packages/client/src/pages/Game/components/Arrows/Arrows.tsx index e604558..72054aa 100644 --- a/packages/client/src/pages/Game/components/Arrows/Arrows.tsx +++ b/packages/client/src/pages/Game/components/Arrows/Arrows.tsx @@ -10,8 +10,8 @@ type ArrowsPropsType = { leftButton: boolean rightButton: boolean fireButton: boolean - }, - clickHandler: () => void, + } + clickHandler: () => void } export const Arrows = (props: ArrowsPropsType) => { From 9daba7efd6f259743186a4fe3aa4f4457dbbd39b Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Mon, 30 Sep 2024 12:54:47 +0500 Subject: [PATCH 17/20] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20k0ndratov?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/Modal/Modal.scss | 21 +++++++-------- .../src/components/common/Modal/Modal.tsx | 2 +- .../src/components/ui/Loader/Loader.scss | 19 ++++++++++++++ .../src/components/ui/Loader/Loader.tsx | 26 +++++++++++++++++-- packages/client/src/pages/Game/Game.scss | 2 +- packages/client/src/pages/Game/Game.tsx | 2 ++ 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/packages/client/src/components/common/Modal/Modal.scss b/packages/client/src/components/common/Modal/Modal.scss index 033c48e..3ceff14 100644 --- a/packages/client/src/components/common/Modal/Modal.scss +++ b/packages/client/src/components/common/Modal/Modal.scss @@ -61,30 +61,27 @@ $border-color: #70842f; inset: 0; z-index: -1; - &::before { + @mixin borderDecorSettings($top, $bottom) { content: ''; position: absolute; - height: 8px; + top: $top; + bottom: $bottom; left: 0; - top: 0; right: 0; + height: 8px; background: url('@/assets/images/svg/title-decor.svg') no-repeat center center; background-size: contain; } + &::before { + @include borderDecorSettings(0, auto); + } + &::after { - content: ''; - position: absolute; - height: 8px; - left: 0; - bottom: 0; - right: 0; + @include borderDecorSettings(auto, 0); - background: url('@/assets/images/svg/title-decor.svg') no-repeat center - center; - background-size: contain; transform: rotate(180deg); } } diff --git a/packages/client/src/components/common/Modal/Modal.tsx b/packages/client/src/components/common/Modal/Modal.tsx index b09a86c..78ba914 100644 --- a/packages/client/src/components/common/Modal/Modal.tsx +++ b/packages/client/src/components/common/Modal/Modal.tsx @@ -2,7 +2,7 @@ import { Icon } from '@/components/ui/Icon/Icon' import './Modal.scss' type ModalPropsType = { - show?: boolean + show: boolean onClose: () => void width?: number | null height?: number | null diff --git a/packages/client/src/components/ui/Loader/Loader.scss b/packages/client/src/components/ui/Loader/Loader.scss index 0ec947d..c8bd13d 100644 --- a/packages/client/src/components/ui/Loader/Loader.scss +++ b/packages/client/src/components/ui/Loader/Loader.scss @@ -34,6 +34,25 @@ $road-color: #2c414c; &__image { width: 60px; } + + &__close-btn { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, 100px); + cursor: pointer; + + background: none; + border: none; + outline: none; + + color: $text-color; + font-size: 14px; + + &:hover { + text-decoration: underline; + } + } } @keyframes moveRoad { diff --git a/packages/client/src/components/ui/Loader/Loader.tsx b/packages/client/src/components/ui/Loader/Loader.tsx index 80194ef..ec938be 100644 --- a/packages/client/src/components/ui/Loader/Loader.tsx +++ b/packages/client/src/components/ui/Loader/Loader.tsx @@ -1,18 +1,40 @@ import './Loader.scss' +import { useEffect, useState } from 'react' import LoaderGif from '@/assets/images/loader.png' type LoaderPropsType = { - show?: boolean + show: boolean + onClose?: () => void } export const Loader = (props: LoaderPropsType) => { - const { show } = props + const { show, onClose } = props + const [showCloseButton, setShowCloseButton] = useState(false) + + useEffect(() => { + let timer: NodeJS.Timeout + + if (show) { + timer = setTimeout(() => { + setShowCloseButton(true) + }, 5000) + } else { + setShowCloseButton(false) + } + + return () => clearTimeout(timer) + }, [show]) return (
loader
+ {showCloseButton && ( + + )}
) } diff --git a/packages/client/src/pages/Game/Game.scss b/packages/client/src/pages/Game/Game.scss index b2741fb..6f219dd 100644 --- a/packages/client/src/pages/Game/Game.scss +++ b/packages/client/src/pages/Game/Game.scss @@ -66,7 +66,7 @@ $border-color: #70842f; position: absolute; height: 8px; - @include customPosition(auto, 0, 0, 0); + @include customPosition(0, auto, 0, 0); background: url('@/assets/images/svg/title-decor.svg') no-repeat center center; diff --git a/packages/client/src/pages/Game/Game.tsx b/packages/client/src/pages/Game/Game.tsx index 65ac6d4..a0c4834 100644 --- a/packages/client/src/pages/Game/Game.tsx +++ b/packages/client/src/pages/Game/Game.tsx @@ -8,6 +8,7 @@ import { useEffect, useState } from 'react' import { Modal } from '@/components/common/Modal/Modal' import GameInfo from '@/assets/images/game-info.jpg' import { Button } from '@/components/ui/Button/Button' +import { Loader } from '@/components/ui/Loader/Loader' export const Game = () => { const [isInfoModalOpen, setIsInfoModalOpen] = useState(false) @@ -37,6 +38,7 @@ export const Game = () => { setButtonsState({ ...buttonsState, [buttonName]: state }) } + // TODO: Заменить на финальное решение для отслеживания кнопок useEffect(() => { const handleKey = (event: KeyboardEvent) => { const isKeydown = event.type === 'keydown' From 0fbd8c92c2d4f6aa952cc7b52cc5f75be1802a9a Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Tue, 1 Oct 2024 16:42:43 +0500 Subject: [PATCH 18/20] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=D0=BF=D1=80=D0=B0=D0=B9=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=BD=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/ui/SvgSprite/SvgSprite.tsx | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx b/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx index f3169ec..e1941e1 100644 --- a/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx +++ b/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx @@ -1,22 +1,27 @@ -import { useEffect } from 'react' +import { useEffect, useState } from 'react' export const SvgSprite = () => { + const [isLoaded, setIsLoaded] = useState(false) + useEffect(() => { - fetch('/sprite.symbol.svg') - .then(res => res.text()) - .then(svgContent => { - const sprite = document.querySelector('#svg-sprite') + if (isLoaded === false) { + fetch('/sprite.symbol.svg') + .then(res => res.text()) + .then(svgContent => { + const sprite = document.querySelector('#svg-sprite') - if (!sprite) { - const div = document.createElement('div') + if (!sprite) { + const div = document.createElement('div') - div.id = 'svg-sprite' - div.style.display = 'none' - div.innerHTML = svgContent + div.id = 'svg-sprite' + div.style.display = 'none' + div.innerHTML = svgContent - document.body.appendChild(div) - } - }) + document.body.appendChild(div) + setIsLoaded(true) + } + }) + } }, []) return null From e745411ca1b98e05792e6e74b0a48c409f62ae8c Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Thu, 3 Oct 2024 18:45:35 +0500 Subject: [PATCH 19/20] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8:=20-?= =?UTF-8?q?=20=D0=9E=D1=82=D1=80=D0=B5=D0=BD=D0=B4=D0=B5=D1=80=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D0=B0=D0=BB=D0=BA=D1=83=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0=D0=BB=20-?= =?UTF-8?q?=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=B7=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=BA=D1=83=20=D0=BF=D0=BE=D1=8F=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D1=8F=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B0=D0=B4=D0=B5=D1=80=D0=B0=20-=20SvgSprite=20=D0=9F=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B0=D0=BB=20url=20=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B9=D1=82=D0=B0=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=BF=D1=81=D1=8B=20-=20=D0=A4=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=BE=20=D1=81=D1=82=D0=B8=D0=BB=D1=8F=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/index.html | 1 + packages/client/src/app/App.tsx | 2 +- .../src/components/common/Modal/Modal.scss | 3 ++- .../src/components/common/Modal/Modal.tsx | 24 +++++++++++++++++-- .../src/components/ui/Loader/Loader.tsx | 24 +++---------------- .../src/components/ui/SvgSprite/SvgSprite.tsx | 5 ++-- packages/client/src/pages/Game/Game.tsx | 2 -- 7 files changed, 32 insertions(+), 29 deletions(-) diff --git a/packages/client/index.html b/packages/client/index.html index d63e210..7d4a47b 100644 --- a/packages/client/index.html +++ b/packages/client/index.html @@ -15,6 +15,7 @@
+ diff --git a/packages/client/src/app/App.tsx b/packages/client/src/app/App.tsx index bf1c3b4..f17950e 100644 --- a/packages/client/src/app/App.tsx +++ b/packages/client/src/app/App.tsx @@ -85,7 +85,7 @@ function App() { return ( <> - + ) } diff --git a/packages/client/src/components/common/Modal/Modal.scss b/packages/client/src/components/common/Modal/Modal.scss index 3ceff14..a79a914 100644 --- a/packages/client/src/components/common/Modal/Modal.scss +++ b/packages/client/src/components/common/Modal/Modal.scss @@ -2,6 +2,7 @@ $border-radius: 8px; $border-color: #70842f; +$outline-gradient: linear-gradient(to left, #5e5e5e, #414243); .modal { display: none; @@ -41,7 +42,7 @@ $border-color: #70842f; position: absolute; inset: 0; border-radius: $border-radius; - background: linear-gradient(to left, #5e5e5e, #414243); + background: $outline-gradient; z-index: -1; } diff --git a/packages/client/src/components/common/Modal/Modal.tsx b/packages/client/src/components/common/Modal/Modal.tsx index 78ba914..0f9db62 100644 --- a/packages/client/src/components/common/Modal/Modal.tsx +++ b/packages/client/src/components/common/Modal/Modal.tsx @@ -1,5 +1,7 @@ import { Icon } from '@/components/ui/Icon/Icon' import './Modal.scss' +import ReactDOM from 'react-dom' +import { useEffect } from 'react' type ModalPropsType = { show: boolean @@ -11,8 +13,25 @@ type ModalPropsType = { export const Modal = (props: ModalPropsType) => { const { children, onClose, show = false, width = null, height = null } = props + const modalRoot = document.getElementById('modal-root') || document.body - return ( + useEffect(() => { + const handleEscape = (event: KeyboardEvent) => { + event.preventDefault() + + if (event.key === 'Escape') { + onClose() + } + } + + document.addEventListener('keydown', handleEscape) + + return () => { + document.removeEventListener('keydown', handleEscape) + } + }, [onClose]) + + return ReactDOM.createPortal(
{ {children}
-
+
, + modalRoot ) } diff --git a/packages/client/src/components/ui/Loader/Loader.tsx b/packages/client/src/components/ui/Loader/Loader.tsx index ec938be..b3404b1 100644 --- a/packages/client/src/components/ui/Loader/Loader.tsx +++ b/packages/client/src/components/ui/Loader/Loader.tsx @@ -1,5 +1,4 @@ import './Loader.scss' -import { useEffect, useState } from 'react' import LoaderGif from '@/assets/images/loader.png' type LoaderPropsType = { @@ -9,32 +8,15 @@ type LoaderPropsType = { export const Loader = (props: LoaderPropsType) => { const { show, onClose } = props - const [showCloseButton, setShowCloseButton] = useState(false) - - useEffect(() => { - let timer: NodeJS.Timeout - - if (show) { - timer = setTimeout(() => { - setShowCloseButton(true) - }, 5000) - } else { - setShowCloseButton(false) - } - - return () => clearTimeout(timer) - }, [show]) return (
loader
- {showCloseButton && ( - - )} +
) } diff --git a/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx b/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx index e1941e1..e57d5b8 100644 --- a/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx +++ b/packages/client/src/components/ui/SvgSprite/SvgSprite.tsx @@ -1,11 +1,12 @@ import { useEffect, useState } from 'react' -export const SvgSprite = () => { +export const SvgSprite = (props: { url: string }) => { + const { url } = props const [isLoaded, setIsLoaded] = useState(false) useEffect(() => { if (isLoaded === false) { - fetch('/sprite.symbol.svg') + fetch(url) .then(res => res.text()) .then(svgContent => { const sprite = document.querySelector('#svg-sprite') diff --git a/packages/client/src/pages/Game/Game.tsx b/packages/client/src/pages/Game/Game.tsx index a0c4834..c74443d 100644 --- a/packages/client/src/pages/Game/Game.tsx +++ b/packages/client/src/pages/Game/Game.tsx @@ -8,7 +8,6 @@ import { useEffect, useState } from 'react' import { Modal } from '@/components/common/Modal/Modal' import GameInfo from '@/assets/images/game-info.jpg' import { Button } from '@/components/ui/Button/Button' -import { Loader } from '@/components/ui/Loader/Loader' export const Game = () => { const [isInfoModalOpen, setIsInfoModalOpen] = useState(false) @@ -78,7 +77,6 @@ export const Game = () => { setIsInfoModalOpen(false)}> Инструкция к игре -
From 1ea0f725c344433dbadaf741f906fc4746d4f4a5 Mon Sep 17 00:00:00 2001 From: Iskandarov Timur Date: Thu, 3 Oct 2024 19:08:43 +0500 Subject: [PATCH 20/20] Linter Format --- packages/client/src/components/ui/Avatar/Avatar.scss | 3 ++- packages/client/src/pages/Profile/Profile.scss | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/client/src/components/ui/Avatar/Avatar.scss b/packages/client/src/components/ui/Avatar/Avatar.scss index cb95849..5052582 100644 --- a/packages/client/src/components/ui/Avatar/Avatar.scss +++ b/packages/client/src/components/ui/Avatar/Avatar.scss @@ -7,7 +7,8 @@ max-height: 100%; position: relative; - &__image, &__image-placeholder { + &__image, + &__image-placeholder { border-radius: 50%; border: 5px solid $c_avatar-border-color; width: inherit; diff --git a/packages/client/src/pages/Profile/Profile.scss b/packages/client/src/pages/Profile/Profile.scss index 842d7fd..24b6677 100644 --- a/packages/client/src/pages/Profile/Profile.scss +++ b/packages/client/src/pages/Profile/Profile.scss @@ -1,6 +1,6 @@ @import '../../scss/vars'; -@mixin notification-message ( +@mixin notification-message( $color: $c_font-success-message, $font-size: 16px, $line-height: 19px, @@ -106,7 +106,8 @@ } } - &__edit-button, &__save-button { + &__edit-button, + &__save-button { margin-bottom: 16px; font-size: 16px; }