From d0402fc2572e6ae419bc292a7fa0cca1077a7fc5 Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Mon, 22 Jul 2024 15:11:11 +0900 Subject: [PATCH 01/20] =?UTF-8?q?feat:=20=ED=95=84=ED=84=B0=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SideBar/individualFilter/IndividualFilter.jsx | 1 + FE/error/src/utils/filterUtils/FilterCreateModal.jsx | 8 ++++++-- FE/error/src/utils/filterUtils/FilterList.jsx | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx b/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx index eda403f9..bf501df5 100644 --- a/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx +++ b/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx @@ -16,6 +16,7 @@ const IndividualFilter = ({ filterLists, addNewFilter }) => { const handleArrowDown = () => { setFilterListsIsOpen(!filterListsIsOpen); }; + return ( <> diff --git a/FE/error/src/utils/filterUtils/FilterCreateModal.jsx b/FE/error/src/utils/filterUtils/FilterCreateModal.jsx index 226e818f..a44deb2c 100644 --- a/FE/error/src/utils/filterUtils/FilterCreateModal.jsx +++ b/FE/error/src/utils/filterUtils/FilterCreateModal.jsx @@ -5,6 +5,7 @@ import Modal from "react-modal"; import "./CreateFilterModal.css"; import GroupFilterCreateModal from "../../components/SideBar/groupFilter/GroupFilterCreateModal"; import FilterColorSelect from "./FilterColorSelect"; +import axios from "axios"; const FilterCreateModal = ({ isOpen, @@ -20,14 +21,17 @@ const FilterCreateModal = ({ }; const handleCreateFilter = () => { const newFilter = { - title: filterTitle, - color: filterColor, + filterName: filterTitle, + filterColor: filterColor, }; + //axios.post("/api/calendar/filter", newFilter).then((res) => { addNewFilter(newFilter); setFilterTitle(""); setFilterColor(""); onRequestClose(); + //}); }; + return ( <> { {filterLists.map((filterList, index) => ( - - {filterList.title} + + {filterList.filterName} Date: Mon, 22 Jul 2024 16:49:37 +0900 Subject: [PATCH 02/20] =?UTF-8?q?feat:=20=ED=95=84=ED=84=B0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/pages/MainPage.jsx | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/FE/error/src/pages/MainPage.jsx b/FE/error/src/pages/MainPage.jsx index 850a0539..3806d5f1 100644 --- a/FE/error/src/pages/MainPage.jsx +++ b/FE/error/src/pages/MainPage.jsx @@ -1,10 +1,11 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import styled from "styled-components"; import EconoCalendar from "../components/EconoCalendar"; import ProfileBar from "../components/SideBar/ProfileBar"; import PublicFilter from "../components/SideBar/publicFilter/PublicFilter"; import IndividualFilter from "../components/SideBar/individualFilter/IndividualFilter"; import GroupFilter from "../components/SideBar/groupFilter/GroupFilter"; +import axios from "axios"; const MainPage = () => { const [filterIndividualLists, setFilterIndividualLists] = useState([]); @@ -17,6 +18,33 @@ const MainPage = () => { setFilterGroupLists([...filterGroupLists, newGroupFilter]); }; + useEffect(() => { + axios + .get("/api/calendar/filter/all") + .then((res) => { + const fetchedFilter = res.data.data.map((filter) => ({ + filterId: filter.filterId, + filterName: filter.filterName, + filterColor: filter.filterColor, + })); + /*[ + { + filterId: 1, + filterName: 'hi', + filterColor: 'pink' + }, + { + filterId: 2, + filterName: 'hi', + filterColor: 'pink' + } + ]*/ + setFilterIndividualLists(fetchedFilter); + }) + .catch((err) => { + console.log("Error fetching events:", err); + }); + }, []); return (
From 957211b101fb542af1057b3d16e12a52b923c598 Mon Sep 17 00:00:00 2001 From: mlnwns Date: Tue, 23 Jul 2024 14:56:09 +0900 Subject: [PATCH 03/20] =?UTF-8?q?fix:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EB=B0=8F=20CSS=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/components/EconoCalendar.jsx | 1 - FE/error/src/pages/LoginPage.jsx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/FE/error/src/components/EconoCalendar.jsx b/FE/error/src/components/EconoCalendar.jsx index 814eae47..6d5b4bbf 100644 --- a/FE/error/src/components/EconoCalendar.jsx +++ b/FE/error/src/components/EconoCalendar.jsx @@ -292,7 +292,6 @@ const CalendarContainer = styled.div` background-color: #fff; border-color: #cbcbcb; color: #595959; - margin-right: 0.7rem; } .fc-event-title-container { height: 1.3rem; diff --git a/FE/error/src/pages/LoginPage.jsx b/FE/error/src/pages/LoginPage.jsx index e1cae153..9f0606e6 100644 --- a/FE/error/src/pages/LoginPage.jsx +++ b/FE/error/src/pages/LoginPage.jsx @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; import styled from "styled-components"; import { useNavigate, useSearchParams } from "react-router-dom"; -import axios from "../utils/axiosConfig"; // 수정된 부분 +import axios from "../axiosConfig"; const LoginPage = () => { const navigate = useNavigate(); From 4ca8698a6c915751a49a105a24bb9c1f6a15f072 Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 15:14:51 +0900 Subject: [PATCH 04/20] =?UTF-8?q?feat:=20=ED=95=84=ED=84=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20API=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/utils/filterUtils/FilterDelete.jsx | 25 ++++ FE/error/src/utils/filterUtils/FilterList.jsx | 37 ++--- .../src/utils/filterUtils/FilterModify.jsx | 133 ++++++++++++++++++ 3 files changed, 168 insertions(+), 27 deletions(-) create mode 100644 FE/error/src/utils/filterUtils/FilterDelete.jsx create mode 100644 FE/error/src/utils/filterUtils/FilterModify.jsx diff --git a/FE/error/src/utils/filterUtils/FilterDelete.jsx b/FE/error/src/utils/filterUtils/FilterDelete.jsx new file mode 100644 index 00000000..736d4585 --- /dev/null +++ b/FE/error/src/utils/filterUtils/FilterDelete.jsx @@ -0,0 +1,25 @@ +import { AiOutlineClose } from "react-icons/ai"; +import styled from "styled-components"; + +const FilterDelete = () => { + return ( + <> + (e.currentTarget.style.color = "#000")} + onMouseLeave={(e) => (e.currentTarget.style.color = "#B8B6B6")} + > + + + + ); +}; + +export default FilterDelete; + +const StyledDetailIcon = styled.button` + background-color: #fff; + border: none; + display: none; + margin-left: 0.5rem; +`; diff --git a/FE/error/src/utils/filterUtils/FilterList.jsx b/FE/error/src/utils/filterUtils/FilterList.jsx index 58357d40..f8f10af4 100644 --- a/FE/error/src/utils/filterUtils/FilterList.jsx +++ b/FE/error/src/utils/filterUtils/FilterList.jsx @@ -1,36 +1,25 @@ -import { AiOutlineClose, AiOutlineMore } from "react-icons/ai"; import styled from "styled-components"; import ScheduleToggle from "./ScheduleToggle"; +import FilterModify from "./FilterModify"; +import FilterDelete from "./FilterDelete"; const FilterList = ({ filterLists }) => { - const filterDelete = () => {}; - return ( {filterLists.map((filterList, index) => ( - + {filterList.filterName} - (e.currentTarget.style.color = "#000")} - onMouseLeave={(e) => (e.currentTarget.style.color = "#B8B6B6")} - > - - - (e.currentTarget.style.color = "#000")} - onMouseLeave={(e) => (e.currentTarget.style.color = "#B8B6B6")} - > - - + + - + ))} ); @@ -44,7 +33,7 @@ const StyledFilterListFrame = styled.div` margin-left: 1.3rem; margin-bottom: 0.3rem; `; -const StyledSceduleType = styled.div` +const StyledScheduleType = styled.div` height: 1.8rem; display: flex; align-items: center; @@ -63,9 +52,3 @@ const StyledTitle = styled.div` display: flex; align-items: center; `; -const StyledDetailIcon = styled.button` - background-color: #fff; - border: none; - display: none; - margin-left: 0.5rem; -`; diff --git a/FE/error/src/utils/filterUtils/FilterModify.jsx b/FE/error/src/utils/filterUtils/FilterModify.jsx new file mode 100644 index 00000000..e7e789de --- /dev/null +++ b/FE/error/src/utils/filterUtils/FilterModify.jsx @@ -0,0 +1,133 @@ +import { AiOutlineMore } from "react-icons/ai"; +import { IoClose } from "react-icons/io5"; +import styled from "styled-components"; +import Modal from "react-modal"; +import { useState } from "react"; +import FilterColorSelect from "./FilterColorSelect"; +import axios from "axios"; + +const FilterModify = ({ filterName, filterID }) => { + const [showModal, setShowModal] = useState(false); + const [clickPosition, setClickPosition] = useState({ x: 0, y: 0 }); + const [filterTitle, setFilterTitle] = useState(filterName); + const [filterColor, setFilterColor] = useState(""); + + const handleModify = (e) => { + const rect = e.currentTarget.getBoundingClientRect(); + setClickPosition({ x: rect.left, y: rect.top }); + setShowModal(true); + }; + + const handleTitleChange = (event) => { + setFilterTitle(event.target.value); + }; + + const handleModifyFilter = () => { + const modifyFilter = { + filterName: filterTitle, + filterColor: filterColor, + }; + axios.post("/api/calendar/filter/" + filterID, modifyFilter).then((res) => { + setShowModal(false); + window.location.reload(); + }); + }; + + const customStyles = { + content: { + position: "absolute", + top: "auto", + left: `${clickPosition.x}px`, + right: "auto", + bottom: `calc(100% - ${clickPosition.y}px)`, + transform: "translateY(-10px)", + marginRight: "-50%", + borderRadius: "0.5rem", + width: "19rem", + height: "auto", + backgroundColor: "white", + boxShadow: "0 0 10px 8px rgba(0, 0, 0, 0.1)", + }, + overlay: { + backgroundColor: "rgba(0, 0, 0, 0)", + }, + }; + + return ( + <> + (e.currentTarget.style.color = "#000")} + onMouseLeave={(e) => (e.currentTarget.style.color = "#B8B6B6")} + > + + + setShowModal(false)} + style={customStyles} + contentLabel="Modify Filter Modal" + className="FilterModal" + overlayClassName="overlay" + > + + + + + + + 필터수정 + + + + + ); +}; + +export default FilterModify; + +const StyledDetailIcon = styled.button` + background-color: #fff; + border: none; + display: none; + margin-left: 0.5rem; +`; + +const StyledDetail = styled.div` + margin: 2rem; +`; + +const StyledTitleInput = styled.input` + width: 95%; + height: 2rem; + margin-bottom: 2rem; + font-size: 1.5rem; + border: none; + border-bottom: 1px solid #495057; + outline: none; +`; + +const StyledModalFooter = styled.div` + margin-right: 1.5rem; + margin-bottom: 1rem; + display: flex; + flex-direction: row-reverse; +`; + +const StyledCreateFilterBtn = styled.button` + width: 4.5rem; + height: 2rem; + background-color: #ff9999; + border-radius: 0.5rem; + border: none; + + span { + font-size: 0.88rem; + color: #fff; + } +`; From 1954dabe1f7fe59e82cb61fd52c7c2fe1aaad923 Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 16:07:22 +0900 Subject: [PATCH 05/20] =?UTF-8?q?feat:=20=EC=83=9D=EC=84=B1=20API=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/utils/filterUtils/FilterCreateModal.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FE/error/src/utils/filterUtils/FilterCreateModal.jsx b/FE/error/src/utils/filterUtils/FilterCreateModal.jsx index a44deb2c..c1c16f49 100644 --- a/FE/error/src/utils/filterUtils/FilterCreateModal.jsx +++ b/FE/error/src/utils/filterUtils/FilterCreateModal.jsx @@ -24,7 +24,7 @@ const FilterCreateModal = ({ filterName: filterTitle, filterColor: filterColor, }; - //axios.post("/api/calendar/filter", newFilter).then((res) => { + //axios.post("/api/filter", newFilter).then((res) => { addNewFilter(newFilter); setFilterTitle(""); setFilterColor(""); From 711dc6d437cd88fc3568ab0e59fdfbb960fcfa4d Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 16:08:35 +0900 Subject: [PATCH 06/20] =?UTF-8?q?chore:=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EB=B6=84=EB=A6=AC=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?ICON=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/utils/filterUtils/FilterModify.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/FE/error/src/utils/filterUtils/FilterModify.jsx b/FE/error/src/utils/filterUtils/FilterModify.jsx index e7e789de..d329b815 100644 --- a/FE/error/src/utils/filterUtils/FilterModify.jsx +++ b/FE/error/src/utils/filterUtils/FilterModify.jsx @@ -1,5 +1,4 @@ import { AiOutlineMore } from "react-icons/ai"; -import { IoClose } from "react-icons/io5"; import styled from "styled-components"; import Modal from "react-modal"; import { useState } from "react"; From bda04c011f495f78eef79c0161b051e5bee0a193 Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 16:17:07 +0900 Subject: [PATCH 07/20] =?UTF-8?q?feat:=20=ED=95=84=ED=84=B0=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20API=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SideBar/individualFilter/IndividualFilter.jsx | 13 +++++++++++-- FE/error/src/pages/MainPage.jsx | 6 ++++++ FE/error/src/utils/filterUtils/FilterDelete.jsx | 9 ++++++++- FE/error/src/utils/filterUtils/FilterList.jsx | 9 ++++++--- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx b/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx index bf501df5..c31c60b8 100644 --- a/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx +++ b/FE/error/src/components/SideBar/individualFilter/IndividualFilter.jsx @@ -6,7 +6,11 @@ import styled from "styled-components"; import FilterCreateModal from "../../../utils/filterUtils/FilterCreateModal"; import FilterList from "../../../utils/filterUtils/FilterList"; -const IndividualFilter = ({ filterLists, addNewFilter }) => { +const IndividualFilter = ({ + filterLists, + addNewFilter, + updateDeleteFilter, +}) => { const [individualFilterIsOpen, setindividualFilterIsOpen] = useState(false); const [filterListsIsOpen, setFilterListsIsOpen] = useState(true); const createIndividualFilter = () => { @@ -61,7 +65,12 @@ const IndividualFilter = ({ filterLists, addNewFilter }) => { /> - {filterListsIsOpen && } + {filterListsIsOpen && ( + + )} ); }; diff --git a/FE/error/src/pages/MainPage.jsx b/FE/error/src/pages/MainPage.jsx index 3806d5f1..7e13bf85 100644 --- a/FE/error/src/pages/MainPage.jsx +++ b/FE/error/src/pages/MainPage.jsx @@ -17,6 +17,11 @@ const MainPage = () => { const addNewGroupFilter = (newGroupFilter) => { setFilterGroupLists([...filterGroupLists, newGroupFilter]); }; + const updateDeleteFilter = (newFilter) => { + setFilterIndividualLists( + filterIndividualLists.filter((filter) => filter.filterId !== newFilter) + ); + }; useEffect(() => { axios @@ -61,6 +66,7 @@ const MainPage = () => { diff --git a/FE/error/src/utils/filterUtils/FilterDelete.jsx b/FE/error/src/utils/filterUtils/FilterDelete.jsx index 736d4585..ba23192e 100644 --- a/FE/error/src/utils/filterUtils/FilterDelete.jsx +++ b/FE/error/src/utils/filterUtils/FilterDelete.jsx @@ -1,10 +1,17 @@ import { AiOutlineClose } from "react-icons/ai"; import styled from "styled-components"; +import axios from "axios"; -const FilterDelete = () => { +const FilterDelete = ({ filterID, updateDeleteFilter }) => { + const handleDelete = () => { + axios.delete("/api/filter/" + filterID).then(() => { + updateDeleteFilter(filterID); + }); + }; return ( <> (e.currentTarget.style.color = "#000")} onMouseLeave={(e) => (e.currentTarget.style.color = "#B8B6B6")} diff --git a/FE/error/src/utils/filterUtils/FilterList.jsx b/FE/error/src/utils/filterUtils/FilterList.jsx index f8f10af4..33b72f4a 100644 --- a/FE/error/src/utils/filterUtils/FilterList.jsx +++ b/FE/error/src/utils/filterUtils/FilterList.jsx @@ -3,7 +3,7 @@ import ScheduleToggle from "./ScheduleToggle"; import FilterModify from "./FilterModify"; import FilterDelete from "./FilterDelete"; -const FilterList = ({ filterLists }) => { +const FilterList = ({ filterLists, updateDeleteFilter }) => { return ( {filterLists.map((filterList, index) => ( @@ -13,10 +13,13 @@ const FilterList = ({ filterLists }) => { {filterList.filterName} - + From 5517a43877c1fbcf3a209fa46113b1bdfa19a121 Mon Sep 17 00:00:00 2001 From: mlnwns Date: Tue, 23 Jul 2024 18:06:47 +0900 Subject: [PATCH 08/20] =?UTF-8?q?fix:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/public/Profile.png | Bin 0 -> 1578 bytes FE/error/public/seed0838.png | Bin 0 -> 69859 bytes FE/error/src/axiosConfig.js | 74 ------------------ .../src/components/SideBar/ProfileBar.jsx | 60 +++++++++++++- FE/error/src/pages/LoginPage.jsx | 5 +- FE/error/src/pages/MainPage.jsx | 2 +- FE/error/src/pages/ProfilePage.jsx | 39 ++++++++- 7 files changed, 95 insertions(+), 85 deletions(-) create mode 100644 FE/error/public/Profile.png create mode 100644 FE/error/public/seed0838.png diff --git a/FE/error/public/Profile.png b/FE/error/public/Profile.png new file mode 100644 index 0000000000000000000000000000000000000000..ab8a9297ebae2cbbd6cd36a0ee00a49bdfe71682 GIT binary patch literal 1578 zcmV+_2G#jeNk&E@1^@t8MM6+kP&gnK1^@u?LI9lsDl7ps0X}Uul}Dr_q9G@kc&LC4 ziD_=(aAodaR_%C9q-odl$xZ54o4vMou}e<%Pw1~1VqAke`mqjwQbW_5n|QN_)7W{jhX|)*6_0Q!4Qu9q$Ms zr6*gRsmM%%EJ$(Fzi2bgy2$d5t6+hrr9w(f`#825gsoCouil&Yi@t=WUn!K*>Y0dpn zH`u{Dp#=WH`q)d<(q>-`LVjX~d$$XiTUH&0)?tFgu9)q%%tH)D$~za`Pge}M9}F`i z0$=|8txhi!x?Zh3GMtwO`TOc=hF(FEreGgKXzN}jSVG{h@z;j3#P+#-l4n%Di@BC}P zSS?e#MEE}SHrW-AeQEUG5yGg;ja@$)!&3||qUcGWIYZxeQpjHi2`sbiUqhg#%m0qb zb-T%BNEj{B%8o?ULsru(b6)dQL3!deUi-2aLaYDrokV>+<+x-gjWSSI&$&2?N!DG(`HAmdNR@av~xNt zgZUL=1t*WNGuO=h6L)7}xvgrF_km+7$ho@X2Z6a|oBh^5iwo}J2v(GaXFK|U+$C?m zUnnut_>$QY@|xe=hMIy%WCXl|=~M=rjsui{g5#yqUQXq*o~Nd*FO5T1;dt+t&r}tR zJE)t?q&SM-T#hCU+jc4ZUFAuD_97@hDXH^S593Yw-4MkvgQ@!X1;FLkoCU;v!B5{n zM86F#gfls()D^+GFiRd(BelQEWe^VFag1ozn}yjFVdyVObZZ6XAT^ zBiM)JV+)sWwLR0WYeRsBAuO)(n6JhNwM>!q1dIBZQqATqE+zrO9g#PkpVIuvVG*Hc zdw%~z!}aZx30~kZvrHL)gjO16Zz%M-hxL`aN?zfg)72@$1F>pH*LMKE62tY^&F#w( zx-+_=_NNuh9t~jM+rd)kU`h?#Y-q$QNF@Gg@Y!p_>9621tN1Q(9-6-A!ha)&v^*?U z==(CcL1UT*+A;(f`lHjq7N%EAo(?g@k3s@(N6$@Ms!n#>28v|p zeCZKuDt7x%GQDwhNEgBy7Y6Z#G&PWA`=ZD$&0O|^JokJcoi#24L8bu0F7-=AD4dh! z-872-DL#;j>=Ia6vPi~!bC@gSQ0Cs8>3goGfRB@s2X-Z3ZKkDOa~>gh{BeS$;J8KL ze)8bOkgXXnuM%=P&J7o|*%0;A%zeet4Ok-VUM6lBIcwOWu}l%3;ES@Y!e)0wkE^vt z2z8gwanpyg+xsa|g4R2~I3O*-H@qZfeCY-3kLDfBXjkF2Mwj7iRT5*_{ZJiWV>D`h zG`?HDWyhI;du)DSb2Y>*Cc;_gSqH?`P2(c{^#2Gzc}Htm??l)s*|??5n+=U11X~h5c7`WmhozyvQP*nDIg*E;j>i zk9euDoO{)SnkILM2?1BTUHfnNcaj=qJm3@%4wP_Qx}5%9&~bCD@Id?Y4z69D%5h7= zTw$7GqGu?CUyqC!uR#%(nZKf8Pop{`lvQME-MwdskVU%dp^iX=CTrm)D?BN8awDm6 zh#^5Vj&?FNC000000EmAJ3;+NC literal 0 HcmV?d00001 diff --git a/FE/error/public/seed0838.png b/FE/error/public/seed0838.png new file mode 100644 index 0000000000000000000000000000000000000000..a3194054e739dd58ad4cc2d048c5cfa46f5aa79b GIT binary patch literal 69859 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

stgRfsXf7($755sm1wnNF6Xm#i2s z1BG@hkPClI-Tz0pj4;aP-Mrr7pA(Urkr|njaFHjY5#VDAH+E=}TWLUHJ1}%~w%y0M zsJo!t&I%g!EYWlVqc=Quq&Bmm8LBF5VhDkWU~ZjRCfpM#i-{<+5+9>&l1KLvvYtd> zF})1L>;_i`v3un-b6&cfP_T#$sgmbSyScsF_Fb3K#retY?cLqo>TiGh?bly^7M8{G zNa9~LpBD$d@Ce6QaoC<#3_nMg&uakRuPJu(2J!!tNuKBdM`5iIEU}!^db_#5zc+Jc z5TKR?bt5vXI8}Lw(h~@Xpc+!kNc{m2EB25%2u@A}W+yU|p=!Ft(f0Ig^ZrAAcPuB1 zFq_9&Q#EznR83PgO;y*Ss^aMN${6PzuiacrBNXhKben2UDdm(>9+z1eaN*@n7juZG z^vy9h+DHK^g~q!X6~#SZB9OyOjo3;%_9?+(L|sQ?2$L;}$xkRUe#}qZ89qD5V9a0& zJZ5bdo35^63=#sD1O;<7%LCj*w!$uK%vOed5FsI`6O;=lk{3{l$%L3JGe=R6zzn=} z?kR$40MTHyZr6O%-}-&qeXGuI?{4qc_ruV^d^ukZ@7`B+^9-##PcsiUc=5Z*5hxYI z^jz@vtsT<;2loT7&P+@V zO9N>F*TNAHa|YOVc24;j=}(II8Bes;TQH&SoR^7r|fh zjwd*gMloBaW;i)P;qI1IQ_7`Ze$F{-E)jo#$laNX+!f*CKl1?t5R<8TNiK7kOo;?M z$|yA}yDUgA98?$pfKqX_{Se@$N!TB_%s%dtm^lOr`+RB=8Piy;l2B5ud1L^0W8pkx zuftHqRg9$+q1cx*H&FwDCpuub5}Z5&*;R;wqX8{lk{bcrGMIkb50=+tt8JUy+U+K% zp{}aq<#GGBzonsfGm?Y+wTH0DGjQVJwfp0jg#A419rc<&s1w*7=Mfn{(L}pEf+-<< zd|I#3^$UxD2gN*2L{@?dBSTREMhLE|B23_td>p{F2vvb&L=|C}8PADl5^65JPauHo zChrm)WGp#W{e0P;oV4%G`gf;%x@?w5^>W$F>UvhqXVq*L>pI3LW2)O|^iM%`a~@l0 zkrkO|#qllTKaV))4jrD%`;sRbV+bLX!52i>jW{g!kF#J;t7D*;05xOb%*t9)NzDro zIYOl5?!-LiragR6Ry+#;DD`9{LZwVC1dgSkK&V7C91tFhE(bEAn(F52!*;uE z+qP>vJ9TmFgNd(@mp|cw$0WA*h7XlM>7Vtzs(FM*vfcMl1%Jo`hiCAjn)<%0Fak^k zUUW=_{aG_}fI}bw5?Ly6j1ucgng-4@qXqGtr6I1t;$SDCapsCMYY193dA{h5j@#4I z_Uw$0=k;P)FP6=`na%6Pyq?cvUB{{#sXqvp+{V%4HwVEOV4CE;3W+gDiG-mB(h-SNa)5R4fB*|^(F=;h-)xoQ%NRn zqciOUl%A6=1a@PBIHG%F>@XrOox~y#%!G*G+jhI%wnG}W+x2F<9@5}$Ac4ETMYKMm zs)y9KKi5pM@jz(q&+>s@w}QZs>QsX z)y=G4%$xbVn$2Qejm7IFW5!1WW_%XKCb6-*zp0I~f0%MCwK%@a>}Ccc3PEBlXi}_3 zZ<>jy48t=sHZwEX1E#<@QU|ds zs3Z{@l|Yc4N^&58QH4?LGF5f8Sj>kZ7aSYK6AQb#%R1NM-6qzfLhP(l&j#X2^ zX%1?LX5h++lEFYu#6%({g1Sk~d{`{nojOT0{B+7&1qw~R;^TnDX9^(*ct531O_5`Fc+o(1oPk?7!^};8r+*8 z6(~p`VpYv*eM%_}R$_&dRrS!oe@fCXli@>WV2TL%M8!ll*dC2@WB0j-u`*n z9DA@EPkH~(DYia`5PBl{vmSjHa6=D_y z@w!1X_xU_6mcw$HPmZhkXztW?RoAhOp{gWCi9resB2%!--QXkm18@Ppi*U`VMfRss zYGvlYC~2n~MZ_^k@u%x5R#mL4C?f8jvx1Uo$=DxRzYu+q{Uw>%%!w5R5}2SKGgq~o zHI>PJHY$MvSC!MwR_2$LatL9b3Rw;+7mDB?BLz%l*bXtVb5#Wqu3|_@Q_6)^0GNAL z?fZUna#Cw;y{D=2?*saO(ZqO>>~;h?YJpNe{ZI+)d1d_7t{z~_S{tGNm*xK}#?O9( z0#_H>AH#H*7=sBEm_vw8DAk-IMFUvTPXY>#il`>3nYgORxdJL?R)?E2h#15i0@aPq zW_dQ(`8>}T`RJ%>mepcWHDj!|ieYql!(HxRL~(E ztFnYi2!xVs1cES2h&z2kWr!;6tj&En=IFGH?n06N97Bjvhd~BTL}cb^ND?GeRU3IV zU&iAh3@PNynqx95$?Ky9WkOuRlUo%yE02X}4i_o&(PqpQqKFKAzq(s(+je!oUT@Yz z-^~_Bd(lYWaaCWWL>#!lPmXRn1UibIKMMnpoFSBoGiJ1FqRjOX@rhWdG=jnwJP3KrHYvY6Ukh*r-a7;(F(-=HpJZ zl${X9N;M%7BA%LY9RL_U-S&qPtuP`OY~mf|ibG)8bldy;)n>E4yT8A^yV-2k%j2^tZ*$CV z8HMH#Eq}lUkI2+_IqHlFPSwbz3*v*{o~k606uWp{}dCs$vL1 z;z<1@Qw_;8w_(htfxD}D&X$r6L!QXrS-51&mD&I^S5{XycM*wItg4b)TGe$7K>)Cj zxn)*U*Ia0K2a1vx=69Hb3cAA_gju+R7P4At7RSOl5fQSLv^JgwmX13=SAZ zV5lU8SxMZSkiwmLJeKc(N=|bK0I|c9nuMt}7D0tp%{(l7?h_BmbE;K2X=xh4f(R!# z36z|oFtJ17F3cR*#MfpONSG{Z+iq8@)q1nJxw*Z)yFER7Kc6jp7t(l4(Ql=-heS6% z%|gUPD25O@@e7fxeMMOLcQREDKHLB7HSlM*tslG^)yWQAGB?iv`hHk%H>vIVl!(B> zRg3~~U{cFn?+`*@GQdi70OsaoU}B0@RW&o7%~IVAvD(IJ9qV;f8%wBaDGq6rlI1qy z{Zo28O(xltM7X=Q5q>E#uYQ;?e|JzpRK^$=fy^uuDVYF4q^@FJ#kvl49jYpb2#ToA z${;11g7U=>A}4~4{j-WeQZ$SN7GYv?2dj;~2Dv*MnDdBBGl7L;kg5tXvW)!{$AqAw zJxWq`W-1Yday~l)d2~oXD7pC}?iNBI8bDP1b_a|p3Ej_@yy&U#F!VO0in5pzN}FA0 zawd2nFXLnZ&lZS7h?%tlMfUK_5FQPWs>=P zPG*6l^+N_5RZiK79EJcem!xbaktkKuNYiN5^s!n?SV_1KvE{%LWh`kgbuF?>aTA%^ zPx%A&wsZGOU1{+<`yuCSxeO$w;<4Y%PmRc^xViv%?8sQk7{;2l(Ym8zL6!OhWi8P&9V>(%}0{`&g*>-o3!=Ds&)mZQayYi^XQr0A1NDwE$xK!J;4P9z~n zUDfrh@wy%)Y+3GE?nTxiI0?nk;t8R6y#@1`T-V(*FV{Iy<%pM=XSI~IAIc+A0Hq0o zi0rB(sd&I_CA|zpRg85Ns!9s(E`gc3ND&b>F*i1LvZ=Tf7!x=q_l*c7V8PgfYpj|e za}pyKkOJ)F#B>00h8?IiF^=$#$;U!sGgBCWXs-YZ5Aei|#ZFMoh52(X@kx@vxkLud z*3FFOv(U~$*T7o3%UobneRo0 zv3W`4Qq&Skfr}K<810`i=)0G{6YN;Tzo%?NDtNzxsF>p*ilMX}3PGgoL{*teMia#_ zmJ^iNf=tn6v$5a#Xm>H#TrsiV?uixOfWhM9pAk54HZM&X!A^`4_AZP#viDfKKk5J` zrqUdTN+{ISz+5^_j3()bMD3suhXbZo^xiP!oE3n?5TdG+W>;1VylI*^o7G)E%eir_ zC^JFGOF4!(1+qY#fmo`bL7_xD93_9ElqG1+?$B)RkRSm_Il(4}{lHfIBkO^1E^Qv& zeP3pcz1|yFI5hZ2?BE&e|IkT!pdOx{>BA4*R5$ncSC{(+gy0*R2hjn3ysh;Oju%&x``aaK)f|tgYKPHpf#~M2?w4W-ZBVm zB#y~M#zgBQ9q@QL=Fmy}r_ty~0n0%s;iPIxnJ(CoDrY8lCn6Dvkw@z10?4piN#QHr zEtug3XCfQrkYh|XWp}W%fZ1tE#Kg!Ir5AO{?{)`7CsogBNKgv+p@p(zu#0xOh_Oq8fo**1z$?%a^mfl-XTwc2uv=YxoNgS z{V8W1!)+lNOkLGOwoGcw2;9|mH*1D847txXgsf%wb_tz>jKBhDiFFj!1)$XEjb!6F z=f3ZTzE4AjO&RB94~IDDpEQVQQYStpicTKEA$t*a8envMpRs-(@Z%$Lf7UH{=+U^D z4MV?e+wFF9eRK2s$KNl$ecle;Y_T|6ETRszh1$H1wFR)Mq`q-&z%`fNo6aR|D^QG# zz{xQp(H$yDgG?9J9Iff$>qR7o&D}nOyOdTnUj8)>@-4NA{;#w z(@@n@(h!nnu^5oGuc|i2F2q`b4D3eY@G{=ajY=1lB5loKE`|seCmE?5r8c>1+pFu# z#iEH-WDX%lA|fV^6-KD`0c!b&*P&c~azB7Q3bcDr52*K<uBHiIj12d zGb;)sKxsDlVWix=N6bZy2K|&Qdh7e@e2(HXdb(fLICMSE>1#z@QCfvQW z?;KsL;&TE3%*jjdK@gmL-zBbiCI!AD1ACdH$73o#je`nk#Ne4Ar7F|Q?#AO86%S*2 zmUKw}&uzC^EEY#c$92b6I2ZMwAza!s+m;T`8D^Td+SJN%0lHdiPiVogC_t@_4o!=3_&s#r39!c^TmKJ4#qrFP(dam2khwo5N0WxmZ;gN6-%|fz#SpLG{#C}Oq#7% zw-9m&eT-cQ9ZT31>A-n(JAImBqoo117}d@*=Q)d0n7PoPdDCBATq`1MI#nHo=o7(=$4)I^-Q51|X8lTh(EJckQjg=ydoMrlWm=+w9@IV7n$hGUny zOZ{qluDSjCxt`6guC9Lj?YH;u-+g%hVKHA69a-$NKV$zqW+LCaB?o2@VP^tO_OU_=RbaYNCJvmv!{o#u^E`Sl-xoMPL@4&DVP#@6k-OK*2KlTVp8>9H7DxbI`WO^ zK*0%N%z4;R|32b1@x7~|G_YkFAz?EeyBK1Of=xC63z6`i0j84qvDK26K5@*#1}6s< z?Z5{X1{F(wqW+1P%`tY?aVoOk3|fkqiXn8EoZ-75-4rdD^t6rSJV{={XbUOITo-dU z%??3O@g4osR60N-5L+B}DMsh$pqJ^3*oTanWr`~1flauV&+%rKqNa5et|*dJ)tSVmLw|F(S=)8H$-}7{b&~g(#QZq$w-{f$Ka*yfWZoo-_O8ij;rkfI7$ZC6W7Dc)a%0R; zwZZ`E4vkZ{A?!Gy9AoUK#-q(6W)O$5Gs8+x7L0d)Yz8kZ!YYy_3?U35E{nW4MSf7@OS}W{3Gii z3uR{r9pX#@*pt8;b~oP3?{2+gw1Nnf-;^e0<#;2WV$h@}^8cspJsTvqk+i`u07#}O z(^fOm?C#y(|NlvM?~akwYExC|NCJq6`v8EMRb6c)%~Gwd>P%WNym>;Un6uyrnF{V( z5ugYFSu7?^QD>DA+@5suYzRzCwdc9qp^-j-0#?$iq-$bXq=db*NXcYj>lq=gvfuGp z_SXuC^O6~r(UMfDla>=SeUR9$*jW>Y-mikX?6_;fm>5`eQKkD14Z?32YLM+3- zwcueBh}C}My!f6XIpri`Su(15&!XOJ@hLCLKnt%H@)uJwWuPYiFXRFsmQiU;Oh9Bz z(Yxe*VE|)R6D#fV2#i1mj?fzfunusIgycJRz|J9=Wtr!3Iz1d79uB)WpEld|%U7>b zO4B?`&P(vV&`h(3{_IxP^Qnzn+i+#;M5+a<&*P3rtCmY$vCg10bGTT`Cq&1K-q(8(rqIXr=yXic^fGO|eb#slmj@ z)L&sEYL9P8oZTE16(X?3)I3nUsmn+%G6b> z5mq+_MG*xvB8$qL=4nnbK}^{c9Aoaih`Y$}FD8FM)2{c z0_0C^_;h8Ps=pxaOJJ;vy}#st{4RxL1^@+9qy$++vZ|C=10p(dL=FM1={;=uOjtyq zfha_=oGdBKiYKzjq@{p9c;`c%2+{JWqS^`qKNMxW(}2Bi|E1$HfxJl zUrZ^dXl4mk5TzPDDlkxx)nba%JdRUJ8Dq?v&3jI{Q}YetyOtW%h!q);F|lJ%Lj_R- zc0gjZ_%)@WzK&`|A_B+R`{Z46K07CwO-NOjz%L;(m?sj0Y$c*u5nXb&2oiISIhV)G zA_a&(r6j7KOXxqfoyoNcq$MBL-jRD86#6&c0GLV6Ip+8; z7@gx50X)|=Ec1C6m%3!?k*m=ISWG)xTB=%%vHGz~d`64OS1b!$jEiRKw`VQKUeNyq zCjlrBl_^HGTD1BYT3W=C%;R)CjngbDG{>x2yXYjZ>~V&tjxDXS-IzfQT&oyU0};)l zoQ0T3nH7Y!b{I1evpSc8Pr+yJC9x8zA~koN2-v_7gJD(`sJ_1%fU1~^RP~>NaetxchBShn}ou9xAaw)V`6)6lLEjC&Pa+Z@<8eHlrWjQPr#TVvu4w=vsCN)72Kn6rB-ONQXmTqu|ZN$Mvr2YvP{83LB zn-jB`mNmfexe4^x0{XXXg^Z4I-*Q$jo~MA`XGQcivG&3MtfIGen}LT1~Bt)0I3;^XWLnm{b7?9H2VI`c7$SD{08Gi%7@j zo>Yen0f?aZd~kX^yc10!CS|nLxyh zzGwiKywB`}NNF+8pa=}8nLA{wr4pser^08qYg56@gXOh|c-y>rAlLHP%R6myV?H4DPf5E$!B5b~Zw4;>fk%sKW>5eVkPAYaUNrwVw|EH zsOUJ(<1`^^PS=uijf|QVH@X>CHTzZkVXDb5YjzPkZ(iz=4Tzm9)$??%zelB1xS|b14mEh^UTJid% zZdx@!O*A3_Qk^|sjaqEs?go=wGijwDMhs`f$TTAY5qIAA!FgYcookMvji3fA0Mu4W z&{K*jrr4kr$PmDJD)RxHzc6~}EE}7h0Z?C6UBSy30s=uzTH~_5+NL_{66r6NkBXW| z%R8$HESmrF4P5%a%Lit~j4tVmsFq@!#%VrH({YMpoK91oW&=wppN^+F#Sq-_u#Y#l z1=ghiKO#}76J2r^B_7lgc|>H@9U^w#O1`i}iij7$bwbC{`RILQmxu!qtK!*iJ*O}( ze9wA~vtb7XKQGt83R*JQ&k>e={_7vwK0DYwbG|>rbe|ntCYNjD0#ilg>g%?EL^-nj z!&l7{(VylxPjNaq>~;^=H@98rgA=o*8lu)3 zV9WR}>AN%Y6ETrn!sBkOz2FKC+*}3RkVv^bdQ5LOMe`pPwH5RCgR@EdF1yqo+ zMO3svAU(}g{b?=m4A0p4qz?X+fAOuYRGYQYu>~cnHLjKlE~S$3l1JOFINJT^?XOWy!ndep1KcVx~^`RfS(0T7GfH<`m zQ_sSP7m(!5k6NDG&ZZt>*|nIkTH?K0#)W0ktX2k`6}lHu5j&4@g&Ns!>s2qYIBHf? z2rY|l1|k|$%1QDV$HREs9rpLTABvB+R%F(U{uUZ+Q9%^LY&Zi( z#E7Vjq4Tcq*t=Hr2Cdwo)*4AuIThMOo4`Rp!b1IB?|mpRiS-->r^w8hT4KL>0Z&}B z<=0|;VZDJ`l_1)14Qqq3XsJ84EGDATN+g=#Z!3uBe=m8Z%6O(=qH2~3UR{(l#dsV~ z4~PAyhyACAaevG)&htFavzj=xcsxyq-FV#YcK55*#(aIHRsC0y1hzlHk%poH-Ygu0;`X2S?H6GZ}a z?E2tCC~pJHU>O6bW8s=TDV61FRv58laD8xH9~SDb9Y|I|{RD&vmADiv5dxt@q{Tjg zW{)f~x?a4^4;C%rKc`$UMY9(1uNCX|qBQ#A@A_uWoVBdK0W8DUW6m+AX-;X1X^iv! zboh9``*1hzk8z%3jPpFj7?B`OG@nj~yZhC8d)PeeSKFZb$JzPWx#(SXEK1ZmBpbzFFqnaSx*tq8SKKGME5o zuuO>FxvulUJGYcQLv<3H63|ADTHB&p*`sIQ`OtaiOZ`Ntm8z^+b|yq-R_DO9GAKHz zflOTN8~`ndJLMtOMBCgaQOS~0ia96ITzc-aWRU_nvb;vST&cwhDIXR(DHc^uIi;Lq ziaAfyJdJZY&FM5x56At-`|)s0^PFN#^PJ+WIU_=vXg-Zocii87TCKOo&DCkMS+CYH z_TIS==$uMeY6NOttwE}onbz=EiP$r<^VJnbBBYWM_Q{3hoMd7{uydSeiRu@}z`$Tp z|IPO^uwoXLd{Gq;|9jizxe?*Z8sOh>6IGVmvT2R*;gT(B#WO`!UV6X)#rikHY!D4+ zvxK08uJf*Icvp1BYAzQoN}%?XH&YZ#^ui%K_TD*P(0ibcMAA~?Y|`@c%ua&`XbeEr zO*9}imD=x7@ZPYENNrNuG;5A!o{S{X1SnZkE@dE3_2rr3ZK>Y?D3>c9)I81O@s#FR zjGyB5#^aO@)A(?l4kt<3R7(#Ts1}%C&1s&dZXBn>;kdg$Y_B$(?Pk60`@xr zdux{{KNeS@iJyYJS$jLkd3L^(In*1|`tDV7o~KDg!7PMex`NubP(}|C7%9|Xu81I5 z89G#F!Ki4-^B3zs#hjB$HWP)MC8@~b_Ttm`+PvZNpr{H&HIH^>E( zy%1v7W#D&tZ+NbpYb|huz?6#{;Cv<)Bs@d>)K{QOrAK+Gi{vYsKtW`Q5*D8O9sQ6? zpx~Q3ozuVe=!>VdK<8KTXHyXMsx5-o2=nt>TYlo@{$KzKCsi)+frW~3Je|hlDW`-8T^F|7xZQ3E%`rKVlEf5+oO4Q9 zG!p^cG#C2^YGsW)(Y}ut>GCI5e@!jU@vz_T?jMf#yJ?(r%#u`- z%*T1$ALnt>RQhRJYzeeBrI*N5ZOw&(>}v=j5@VeGOr;7CNlG7{S{5yTr2VN*n=TTi ztYmEyt7FE9#QE%8b}lh{M6SB5yuO+h)Frpm&tDfv8M|54IBv%ux{ z6({&Br}}-DeViG2e33=%*Ed(~9|cfAFwBM-a5fMo^GpS!$Gh72QVU0GAjO{YfGwhi z>g3RhzN{uDreG>MPxF4aKOT;!{Vv7Hd$(GzRFY~2yLOJ9_kd^ysmS(})zmpcv{DsO zqgB9Xpvzjc@QYTTBWHp{XgJ$@g zG=G;Z^u*i!LwSJTaluB_jSb+ek=j3SdHZGnts)jnl}t8B3K`Luz&Q?!{X;E0X^$ei zPc6BNd|Snz0)Uz+Fx3>(-KYEA{ceBQpLP$LW7m1fGk_A6;fhSeE|-jg#F%2vh|u?e z$RlyFpwuL*BuR4|W1MnMY67^lK|*_IJpX13h#Oq&QDF^p%JXSDJsb`n9`1knaJbuN zQ2@#*t0<_JSUOdA+K8~=wICWh@?E#Nx_bHM_3OX>u)V!4!*YO3K~jzoQOuajv}MRy zQ_e{w0O&v$zgJ1TG>o2=Kpi4jJ>qk9v^o~%#4fWFq>H3@tpL^LOD`z675}bf8?1!j ztc6J)li9!1IC+j}9sFBtov&W&tO1_8gR|G$O5>Xi*aDyinNXR)F$M3tz|D?<#kjmo z$$myw(4Z3#0cxhJv`^*Z>9pS;9(KEjyHDfs06BKSfn+8MZT1}!nOTf6r8JIH$|-c= z=Jpz?GxTMSw5Y_K<~YxBN-37$4}i64PHnsJbDu7TwUCK{X&p{KkMsC&obC_P{-8*R zTp>Tr9CHmNRIAzu&3o=#7*@lpH?M#A@vk?pUiMelVZH9x19t?ZVi_%3wyaVn8<}AN zz$$ala+Ad+J5>T?X4VFKm3ib;P{))NnALf4E;|+`&LtZF7u3IK0I=HSPZbKR1u)L> z>-IXoLQa2X`}{or8|Badmx0^n13>fj9{GS5mQQIDS=vzxONe1E5Nbr|xWJ#B^IsR< zbqgRx_NQ^=7+a0-n{NN8}2&lg6jhX0tQ79h-D5MU`9*`&Wuz+GDx!m5uvChc)le`gu$#_P=>7U?wOR+y$Y74hdzW%N9S?{Y=XsvShx_}7`v+C& zhhAmF49M1}j)@dX>_1BZfVC_pga!KNqRr`?Hf~RTu@o12t76o-t{c{?&CPav*h@;z z<(x#KIEKFOx;_w*ckDvwhkh7_?alW3#r5XqibCM7qamPY42S{InNm)Ml7%!gdxSE4 zhr!5{R6qnJm+H3?>(x3HSu1!z^H2?`!sc1Z=2)HA!T`)lL|VGAv4m#NmEYA_6 zGX>AV7xxRQR=IHP9|sq$*{;Zo7}mu(D{i)evIF1ou<6+Wmm;0SB^iz79er_+A7 z|M>C4`***Y=Gzyyh~gZw!)Xr1&M6OqY)D|JM4-i>TTHYwI4N8%!b11(ge3@l@Y~z# z`Eb+}yWWq-3CzfV0KIb|gy4PGb^Xu}n_+#u?luGWfr95QU~t?y_MRLQBci1oMWi&n zkz^zX;K0a?P0)l?Km|q21WG_xYIs$bNM2p&QZDLP9hpdNk*n=jeSpRQODM@I zbS~D^N=42CSi%?e1%8e6zVzKUx6h9J-_ih2uem(`xdL%XepbRz071x&s1;BFGNKX{ z6NrK%$FLOW*Emn{03Pd`rnKA1P0N7Kf|QR9mjMI_eCK)%p>s^=7`cEw5fQQX-aD_N zcs!^{k~E!;hK3C6+0e+bnjsT=c7a`B=a~r2TGn_m?EwJnk_{fM&l2~*X3-&#r{QY# z>Zc!8tJUd#KkiS{am;gKz)&2N&V??7A#m@p53uq)bkqme2N!&+6eI&E6Im1tMTCV& zh%$gHs=?)-4Q z4xR7U{kT7-aW++|p%^4)7o6*S=sMpA3ZA+O5XsBn$P1}ct|yw!OidAs(q#iOppthl z>a5w0y4WXYJ&Q{vTZP0!W^rChAc)wIDmW?BCZOg6l!slypUW$&8sNg6d%Atj17D}Q z@8A9xH9&cuTK~{Q06;53sZtx82MmS!vq5R2ML?;4KoP+^_7{1qMYcW#5k9~13W38w z4#)u(>jBHzE084_uty*UGax7pPj!;20g#Dha7G;s+d=8NTZeg?%q(iQJUjG6N(pRXJMGFs{ zE5Md0crz2ekF@@X6}0fm<0Jnh1AOsL7U^cq`l~--DFgy&a;YNvA(UDfu0azN#Eh5$ z1QCOy;4WHqs}F!xt=gqHFn~G*myw*2E8|KG5r7QJ-==_uY;1@`S^#1T^HH^V)dUO- z%=O&E03Q9|ySY;p1R&>p@WW~t)DC)IM876lD=0)HCqk=pn|9ZV43|V!D%b( zK4;D9u+(z{f2mTi27L%kqqMtdl!jm`NM(L*(Ut^60EA}7Sc4MPSZPCGpuV|g1vMc< zq|D-+vJ+w{Gr$ey-287P5(+J1aX~ca98lBh&ydz1H~PP|eGdbC7r#CKmYX5I*no?{ zz7z$Tfgvb@7-VZRlMw(=5S2)Z6YLmWLq2R7FsNp;)uC@K3)zNGBeJnWcE}8c2Y{>z zHm$SiOM^!lL{@zR0(^Yague607<#9=0u!hu26cK2(Ak~6$VNa5P(5ec0z4B*XwDH9 zkD;87!Fg^vw7CdS1xU%hR@Sp>Ltaqq($};6)e`5XZAwmAKn5}}LnB}$!vexm5LK;~ zv7SAa_DdOuRF!}-3sG%cF7^*RF@c~??po|aTcQ+~MzS@p=sB|b0@eKi&G1bI__FxI zOMZP`(%I6WUh?(TGH*qoSVfAp_)o6SfLs`WNQi_`nb5liBy?d!;yK1r{E0$PrS<^` z$N>jr2juFUhHCxWIX+Pdg9?CEl~7fJE}SR!wilw9ol;!PO<88HGNPze~A z8WD(LUERpnmyXWZb ztJ^c*pBdn@liKqif8lIj)Bv@br1`?|CwU)(X>GPjn7XwQyBoCt9cy3o1jEwDt7^V(aR`YIHwY zx5t(le9_UnJnDkQTe0l&$X1)6+X4feV{B&y3$R$20A?3naQ))ZO&BzU#;UOhhzS8r zk+fnpG~QYwIyL?ah{&kUt9RLXBwmoP6dL+z!E}dnXy_@yfBquBwSB(d_iBKPBi;Gm z&lp|byp`u(^TpOA?ZO9-?E(P9v-K|ss1>!Wn74|oNJ3=Q173ibmuuRxJ2t5ah)hrh z43jf*#tw<~g8FNl=Hh#O#z_|;E5v1=VD}+iG7zlcSgC!88A0yY#Yl2nZFPVR>dKei0y5rK4c%P?e~>y;7@hkIFIYWuxS9c9U90cql5cHaF@b*HCBC2mpmqc= zD!T1!h)UJhGQ{EoVDV8~&!`Y7kvRtM$TKcLJ)c<>3rAJw%po~LXXKO^s0BHoH9WNx z!I>d1*4m!Z>4ovUgeotEaw9e?@HT+Z!iJaUU#y0Oy4%5*k8>%5+JAT+IB?$OLVP~8 zgbTCP>4@zkt41}REi8P(cTf$XHomgJ_%eesn1U$S0<}~NCZt7o%m|Wm%ua}E-PKYQ zT|4EA#oCx*@#W9_{B805N9evS+Ox<0+nnI%FWm%1qkdcDcPScC1SlpDVi~U~24n@U ziHum;fp^q-^8ASO?Xg;43|^{nPxeS2kdc6}n=TF4rEa>)6fi@WnZYqT2NgaQ082i+x-uoXd2SlE&mQ7giS%^2 zzsLq(CDZ3wz%{GkYnJI(w=djl6MCgJ_aX+=lpLZFDj^yuq7tY=&7VV=gGE3L&Vlz7 zJQV!HW`&lQ^hjo4ZMP=^=Edjo{Av)Ev_VW1o*`|Ftg`zn~nAmlu9=__;E+u|d^QXQ6>jqqS_s`A`FE z4jP%2+&BYPl>1UiD^g(2nmRQEL72Q_@6b7P*@;rAhbvwMP)$8F5piY!TmF7ZOMj3m zKi|Hf0^Ac#{#Y7)r^30AI#17Jdf@@vg%w&fKrJ35G(|&LKr~ATx=cndB|u0O{6|$Q z*!HCjS*5d;3FYj7846%+4SJTM^o0x0vVJir>Y40pssUiJJ#hJN@k*g$Y?YH)o$9%e z`D3I18Kv>~XGPFC(|WtL7A0?X@r41lkTBqxb}uC8BTg*Oic93}@mo5t16Ju=IJM}3 z8bJnVb3JMYTF%R>Ex@DI3hF!rhlzbMS1?-(79X)86(vw4$>PPFZ}Az@`i_q-zWTik z^K}#G`+4AOCqMe2>bXjH*24TXXo93rq4_FBW0{u$YQRWkA}$4wzSjMg0u@9lp`MHD zSv#>2m$Vn0`J^s&`@QVHNFlpO&Mcg2c5$cYx(&D>8F=&#AC-B+<2PY&7RYCukS9BQ z{<(cFBr5~fTG*y&5iUY1j|k~W4F({B(Iuf=u<`N))|}Y#PN?=0HRV`spjPc)*Vn)V zK@g&2@Qh4C6i5NfKyU_PBeI5r1{ZG7#VTHyMezO9_j|U-=lmWY;7@3w<+U$c4K^a2 z0fSqdyX{-jFJ)u})aG}xI&xG*qzHB*vV{!m<;prEVwG4+bnlV8wF@#oGeEo3IyleH z$%;~ciq`J-@xq*yN!|UC*m$z@CDQ=F(_x$T=6deO(B=$de0q#-6;Z$}5jf z`Pg!LycN$BN&vH^Gz>tO#jH&MCaPlX8l^4G5QHp|Wu_b)ITAtzV5s9=iy>tVE)JLD zFBj*Mj5YH}H$Ohx_pwGRTe#?VMg&H1OkBsREY(4<#1x=r zv&yu1LMt<{R7EmYc)mxJZP-xf>u6D1h++wM)=kegS>0!`A*^cnW@waj)+JQ3R2`^E!C@Hnb=sc@Ea3p z7AX-U<0jn^tc_!7n#2qW@Iwjw%M$yCM`;N=Q&72vs${X04Jr&jDWf?ct8;ok^Mx-K zcyTWf9{bOimiV)_?%5T-V5;-lV|_%xW=bwGg~cKfHC1R4NO8o#(!BcAu5)vV!F$zIKok5jqg^_0lL!e@qD(Lfx%%bGa zw%j8cy8QY3whOWF%sC!8!N1#w_}tq4!nPy>pwPb&ldFL900_WT#xwvCGSp$E=!iUn zYYYHZ^?(Th^Z6c1_t+w+u%RndSY|UZ%ho^+pdl$VEpYyqWR;lGG^;5xG7}ddHD+|@ zMh;lIx?zb$EvvAEP@8aVh|a zO{o|x+{|nWY|BwhKe}%oA{CfnuIF_+?R@$9X)Br^7gpQ;rF0FJiIFYpY77eP(9oyklR+ zfe^RG_VPC}A(cUC0Huk}%Bv}>jJ0lxff!Yh+Mt}$_eliCSd@9z9CMs=GNl!fAR9SE zS58h=+B+^eyHHP6+@HHL|K{x?j}MCzjDMW`+wspHY}J@=3kqe95CVcKnt~acXpt)f zj?puDcGv}61?*i82oACF02HTeG3!g52W^S10b;dW!5Z3UC3r9}Rn3x9&MC!|a*QeG zf_0T*&M~K$(`k;!NzI&N7nlQcaBUz>2%#g#OD~zbj-CwfXfWzO8d;r z-ZMMry$ih$eaFFv(D@Kb^2DlR0ak#IOp$>IkdYJ-7zwB_qAtm26P27}&Ph`S?96+l z0OS$NoH5XBg-=?Ebs>|xT08UQcz=6^`(JbUx41OgDV zNWm$z(m*RoHL4<7HV{B#hn}hD;DeXobscOV>j(mxN5GQ(s!0NaHZ~VjTLVeCj}lbH zGN7g9;8avop2u+-$MH1I(_DrIsH&)GR!L$>(v;I_o=&4AagMmKWALu?E_m-fdyjm1I^z%h}ex*M%g(?Rlr7SV#ILC269v)7o`_t*} zI37=FOgUyP;L}*q;OYqRf@a9%ykkdDETh`jOFp=6)rBGWq3hPG^>)+uec7Qw9+hbt zh6Lz<6amW9nMsYI85C^QGNwDDf@jzH(9;mm6FEe7fCidTFqfLvvnRha*wi4*bBprl z?VuLYesspixImYJ{NG`CiE0_hPQ+3>>k4IN(3sPhh|p4TY8_GU!+NzM??)KyUFpr~TF)=N}+e*kgNj^ESruoyPm)bed9J=5dy3jcrP7^S=?n z`{26}y3U7yT%@kCLm#+b_hHkmuD1o7XXud_!LXpj8$!v55hFV!Bw#Qp@G8|Y%aT)$ zk`sb;!PCmE{d$dkK+mNk!&EgBCW;6ID)qpUMTVuW5S}i>vOs@uYhFgPq91+f7OjBT z`pdr_i26O(Eh7(#kuk@dvpBZ2hJYFgL0|e zLbFCt=M5@p_v(_zk0^FHN=Iqt{lIGv8;oRZ0f{cNq9T?^tq5aDVt z5P*z1N|g~R2I@S!zVf zYu7=ywmO1`fG{P>%D^}yM62;QsHPS!PWgFG`crcH13YjMWoW_RXTqRxA(#Fw{zo$j zOSU{qo>NLGYRcIxno7SGLM5D3EGG}(kt`r=Jm2<8D5lxF95^v$!dyymvw{gbkIV!l zCS(G&u&Ww+YG?u#Z9c_mns#>&cOO0+?(WCkemWj43nO>zdlwv%8DtSvo8~yjG^H|s zCFPu(Y9>I`7O7;Wq1TRlKF*FqHkmbd-X#;ukJ?T`E8;gIHeoF)Z9LUK5c6FL|Ap&xqZJ(l!)t>gzlD}7^Fy5~R(o^;k6 zQ=H?JB{88N`mkYd9K<_iLau6d%4IdlBXG4~mysf7RsvT42J&0BrvZniV=n9<*Vv+o zs7Eu}{*2;501%aG+>yJzxs9h&o+cD^4#{I=Jf$r2ydv_BBBS&^4;&F^h2${@On?F! zlSmdcEUqkjr$$*bE0LKQn}Hdsnq?@n$WzL3n)bW>{fCeDA3lx`yJ>eQr0K|;@2oQ< zcFcvoftgq##yrn4&M{>Xg*G&`ydGvE3}ocUffxy(VVsgo5n{~q$RNWIP{lEFaLm^f zygjX=ID2AGe=)r1@kanq)0|SAlg$aT%@32Dk|cnP5_3v2#}upOEsOAE=e+mcyRPe2 z!?0ejHtW^(dK0>C=m*#NY_i+$-@X6v>(9R&4#)lRfCL3|^>BYU?GBrpE8nFMy6Q$1 zj2BouEHEh5pgHC^PN!)aW11Bt^u8Yk&kPEb*^E^IvtkxV3dIoi090J+0*_ushe(|s z`oFVX6tz6^wU<(eT66w8aR0xsor8I5X6Bq5`qj&tirO=1YuhB+QN18m1V#%WtB-4~-icyn-A^`)E)6Bp{{FK^4R8s*2FfmolIj5Ko z`@{W*Pj~M>?mm2)4o8_LG#f&=njYdVH{`4Spfin znY?r496LAk{d!n!SHsZto_QSOcsS0}DIbnG&VysP-2{hYpl;K5>%n3(b>v+V@xhy!rWoUVJRMR@eF!VxZ9+$Y#b9OUOI3;$)zVBBP*}{KGb}$clU>#K%9Mb?|<> z+1y-RU2m>#t~NtIWYKAk^EAgfPHrwfIuZ4&oaPu~GBxjf==x#k`@Rn$bX`~ttI+pK zAiLdhclh|>w{$#`!OhTb`(9(#7&Ru%2}}|Aaqe}|01M$SwF=cTD*u&8jdN_yNw%&J z#*jV4Nk*Ge5+d@x^S(0$LUhbb=*V?_SZ#)@?RvZ3Y}T9gYSo9n_g&u){kjLjIj3<> zgpP?;L)Qn7CY$x@#f#h3Y6!u3$6S!KZOK2{MWuo%sH)B>p2p+hw9nJ*9q|xcaL8zc zNMug4STeOKfsBwxji(f2Mgi}-5C{kW5J@ZeRt+J4g{FQ7b3CSFe4GSdww4FD$N~O| zYhGRuh?=1^UZkVcWL$8l6L zWblqboG0?^g7YD`(D}`Fv%TG{*Q=o)y3qA~-*-db4Wa7bT}VXa#*yaGz;-kwfP%9~Hwbdwn@y^F23G z6*n^V!|?j$tL^4$it{v$(>TrJ{QkH1S@JLMeno-A8AiiPUv|wH}C2W9q!`y3Usg zP@enE(5=^g)w@;Stp@J{c|woo01aJ7!=}4_d4(+f5Uy^n3~YO|xp{p(T(83rLg!lr zD4xr9OI)htFTvC#<&-7IIFTvw00>zHBmpCOQZofnO)-u0bUZ%njt}?ip})Gl-mI^B zxb8M<)pUJ(^W#r{d-LYaFsvQBKg<9Z6uA6s`LD|$>siGZlv<#=A(rkGd(w~mdz8TW zl86A{ykBp(>y4>uoMTS;xIdccKYv*}&*gxu60>BHBvLe{04RcriC7jh(Biv@8A#5= zF{biZh+w7w9=Y-@5|BgZ2!Tw=b*$n|hXT!kW)3ho*M}}R?|lG(l=3{!Hd+^ydhTTy zQj9Tc8xjFhFmAxIrc>5qPI1a66r2&>USB&0X`Y#|4{mietgeRD)v8-{&bu;%7?*OJ zvmR*F-$J78?O4+lV1P(yfJnfOy)g(S&^YRdLcQy$^F0r70MnuGeDLfTiP*c)g?`m_ ztI)3o=Y0XyGg74tiVS%B_NKcE>)qn!_DiL!)iqiyCGa%UESWk zc=6)Z>(_7A>osBPUw%T<_|BZ5Cy}f=t9UVWH2|V|MiWEEG7u|sd?uLPAHk7DrNvehd%InSow`xp9amzIdUBvlQCiN zU97FAVfA4FtiE>Usp+q&;^f7rPidF^h`j6I4fGpX`aV%ciQjA(a#fxaCLL@ zmXi|)R>;pYwjJSv7;1l5yR(C>ExO762U zUj2j+*tve_5J63t&^cG;bt0muR?Gnaa1P8sbGa+Sf<+AMT%pUH1pqK25wat8WZ+7& zv)!r!5-~xk3M-j^1V(g(4v7&7P^G|N0unnR9&j837}0sACT@d&{{t z%@DHp=(v>Tx1oTgB&d#dFW$9+m8dTQv0*omUpq2mrjkA}B5)3f)z0^ZrRcf7SCdjv zm7?SXphcEhnb~1RT4KheRHiJO<`mOBO=FgMN-=8chW^dlH~;s4|M!cRuY3qh)OUT? z_g(Nze7^AaS>pD^f3#I?#^>k9ox`9_J=mXd0xIK}0idC^0-YuJVSpeeV8+aaGD_u) z0YdHiMRr~#*M>ZUS|M$SzzSrdP-;0d=1e&|GjCSmu9nKDGE;^SsZ=^*tBge8LJd;8 z@Jqi&F>jHPl**{K(!p-EKD`v9nb**72F(I$NW|m-z^fAtYFg1m2x=8tBStD92`$rk z;q;#0MJs!#VW7oYtz~1Su7Z#WJTY<)*+Xq!1B0?k)QX&&EJMRmg9%kWfJ$k?E`}Hx zQy?y{UkR19wyG{kiz5C@0-$67R7#>H#*~wpx!}3N*4N5JA_Asz%Z6sEIpw4Y0Eo#{ zlBI4nyn6lSryqX;#FQcvIag;HT$0is-Yy-0g$EwhS`;h&Q5>#>-Y!}%e*aa^moFRu zg%?^!U6Pz6n;Ewurv;H5nGnb_sGvtytl+9zY#qiLFhjN^CZ)2!grnPFTVpddqf*OW zOb@1lMgRm>=5E(y5tvE!3KrF2P>S_vne1f<3#fIA2pXtyDCAXYTfsxA)v1slXl(*k z`LW=6T@Yq{19-7&XHZ6KuMca}N!0}gXiR8?LSv2pPe6tG>kVAmJ)g_|vz%+8xn-p; z+5(#%sQ#IO0+K^eMxd%2YEw@$Ve!m1g^$~l)+^(3>s3)gvGOY2Lm>fdLkLSY0>}(? z(EuVTrIb<@0R&=)P?(%c`vG}o_K;MOrJ0b-oXcVW5JHOcG*6}T(mQvCHvK&8Zj z7cyswJUrUmqg~7M|M7J2vj?@{u@$kas)7hm3q_Tgg7>Sw_s9jxzZAC>iBe5)07dY` z#bq#;Bbdf$s-UWpQzD;PwGO?iCWSSK@iR6;F~1i$*mHmws=O~?piQ_|u}|=5>CLE; zkrkjF0suBxb@?r9{_6E_L&pT)L&$`RRFi;rb-9a;xiMNA!vyXK?83%*A_2P zxc0z{hrKMp+4`z0RhXz6MF5IGfQl8rfdGwAb$Nv943$F*L^gxtI)~Y@bLbo+DUuqh z7KexH!lfX(-;)K`O0)hI`35lXBE#iC-D&hoZTTm5EAT)Y)cBLGzdMKC793R7vSC18441oc=8To@piOz{npv&9fV zT({a^z!Fk`Y>l`708WA!e z5F;Z2rEFSi%81Ajc_tdn6mo8UW|8X(XoMB0qtYrimR_E;nS*D#I#c>1Nq?quY(~Z+ zo14aL%ZiJu^Ju-QSqV#^e>oG>C2xD3U+#j!3+L-JUNNWy+SsFxmd3`Y&7o*ibiwZ} zBy#yF*;#8eDa7XNJjJV(Ip{JQG%x2OG+PIx=(lY2+N5W>)}w%0eW zU%$4L#__lvR$cJj;Cx_4kU2vDhsen6*)uq{qz1_7iI}`&c8Fjaqc4q%j@T8H3B(fq ztIrK*GvvY|gfkaF!<1+dAFHvLx&U~7lqc%pk@RldgO3h7KlS;zMFX_s@WRT6O6YcR z?4u)U&bW2D*d;=wHKKp?<{H~AKXAF9NB3C*1m!DgrzteA*rG;+MCcrc-Yb|Pm>431 z66AtsiGUzEqp*S?WE6Acy3jdx0KkYTB`_%AP7yu(K98KvKeRo5a71X)h&sRi(XM8I zkDcJMECs3!@DW7KvL1ith5*s~u-R;HZ(kh8DW$mGZqn(L#*qA zK*E_KFGzc#p9^ZWWruSh6YLT7V}sYaG)5ZdG|IGA7yWq2Z6V~wyR|~u+VEprviJ)h zHnZ%4iSXhC3xhY*FM>KU1efFJyj%c)gyhHv4@l&kih&^%jL@>$s-{^ILQW((7+UCM zy}7-48AA8+<;&H24aCfzh>8XPxHN$-DdtaXc((r=7d*pQ&mhAsO0Pn>E*$ztwkKCa z-*wkFw?F*l2Sr@1`umR`P7e>K{eGUNInDENz8??jaM-ST?Y(oM>&ZC*a9N|M0JNbD zK%NatevO=G=N)?{#!^y+jD+W)_~-ic(d}IrB({80>ya-A>a#Uy%L~UAve- z2pls-pwQUv+aH{EL`e z=gBd9r(!DYO9WAom^DU;lSakEOxb!LXnWOlopl+jE9OB_j|jQ1p9M5dAwW=A#e zMJ)mecn%9*+`ic(5xWe#F4D32(pF95g#gc{%A=*gi{H-uk7r$ji>LhPFne^oJ)+Z# zWpB4~;n_BO-&%G89=$EBPHmIz*3AFHR@Dc(bQRh?H*QA+0y7{5L^w}j0xU6UVrT5F zjMO$mKvYm0WtyjW9AVBnOP&l<4vsgQ+hMi7y}8&=F_CZ$_U?ZVExv@Rb} z(zmxtze@=E%X_-dzr%L?SzVt6(APQi**ku82o;v}E_7kN+1%dTtcGFA@%^XwtId{} zQ_d2T#0+8$nNuF; zc$_}``r+`f3+(>#!(U$dSKI5&U;gsLPe1nN+moad-$Wvm67qG<`LQIp|nmQ_>AK8vWj#gnZ_hIppNdPi2w>_TqX zCgo}AF1VB!SUu9^sAYYu$?WFHUfM6v9=TZ2)FO(6ZKN*%R5;suaI@vB7%Uc;6|el_ z4b^~=g6d+tTv*M}3MtCYcD_RdK-5AJRO^C@UD&cEb`G$fpMn5QOA$snBUJEUKqh2j zb3{n01Y(|909gQ%%~L#`Mp|z|@O>X%zI^f1U;px-|M{P<-n{ibFd;E}=cD>o=S2&Gqf;S8tHq z?TZ%=pFViPJ_H|_v+ChAjTXVsGcZ>|LNEX_P$>XGlyZ(K`o!L|F%h@f!RHw0Q{%e~ zK%olm1W-Vq0E!r1LZSHdN3kymTI93YCiNi!pmu`+0hG4-R+&j$>NN}FLUaC_dC`6^ zSSGa^u$D74O;P&PQ3NDusmXJAVdvTfyI3=Ms9IQdj)%3k^;l{VR$x6S;ZQ>X0RvT2 z(Uel0V~p7Vc*ff9P{!2*4bGA4XYL&Gs_*gU_Qmb(_3h1Odv$Ylz1?nKzI^fW#VsH< zcxyudRb66~PfXR{wbk{nt{+hI1HXR0Gc@9(b0Of_6>hrvd#s>lR6gZ_v*>K*LIKtg zA)uS>^-n+kWCq^*>+SaX=Jxb($7*URjxkT;Y$=0T9hTw9Ic7F6g)-zF86Y#}tRkW& zfDRCd7jWdo{%tCMF_R00T->NG4|o|~N34j9<&#z}2Cx|T%lyjLNZ7#Hm`YhFGcjS! zlp-t;y;YQ#rgN=&L2FnC%ThIK2eGI-&3TpyQ^uIs%rmodbv)xT+@cw<&BSPWu(jM= zzM8XLXm$}NqC%-6B3b4so{rP;IL0Z72m_RYZ$otCd-5)$&&c3bU4L_Z^X5(W!`nA6 zZ*P8h^Y;4sX1&?;!@!OKkPWON<|{5W;NPItZ_r&?pDOsN89(q1n*HK{jKvj(&&wjd z&IKiqbg8vJ+kNrg5P+G7zJL4bB?4?Vn-3q~_xJr>@NvK2-G6%6?F--xc}7nZoH}RD z`49^J0Wc#Im}SPCrH*B;NYqvbYga-(J6O%nDUVraUt^u?wxBGYz0_g`gCUBv@;oRG zM**Q_B&_JjW&I24taHvg=ZX?=#LoG^!LcKxQdnv=j#BzdkykKbIdqBTGNu{gU)5sQsnr|7!5^%M7qM6Nm-O^bu8m@ZR;Mef2MnYgBC89Fl#hMoj&>VmZ*Jud^7U6hdrBoD2awr`}lz zF!bJs0=vwm{{)bU8v}UfoM-3RhY-5ZdlwK;E5>;RJrT`Wa+a(rMJsXjUu(pt)Y8s5 z&vQB*?(t!S4~O*rE+3EBcl~;eU7$W-AG8bLoq0Acb%V*FUR__`_^t!M(r&SY|1U`HYYO12lvf_0ivP3m1K&2PzC0qS5<`m@p0EGS zSkQ8YB^Le6{kBs95_Mg0;ikaU-d^9V`#~h#-+zcPefV(q_ka9@Ool#iDLiz}4}Dmz z`qldSYP;U7`c(&_06K#?CU%6Xs7eM)VZ?>eyBLdr2tZ|sQguHK7a57x;ykE`0yG<+ z5+6=9j_EYTl(-A-YK>QGzV+RUb+_3%cE#L5048?M1s}W*-ud7P#Nb?l$kK@mG$N%&0@bj7#wf6+ZQiizJBxeKVH55@BjM0{_Af){pGJezW(8_>#HjtI!3};ZK7bG(et<5 z)n}#eLf#0?>}g4$ub*w%zA+<=E-L{qYL+hWo4$V6U)-q*+EQ{z%*24f%ozFVYP(vk zR>OK2R{b!flq}8DI08TzhRt?sZ0r<*k^l*$M2u>hvUa)lXgEFtPcCnq z3;;|^g>kEeUYMiZI+doetT+qpCV2l4ANJG3@pwFeBY(5*USIcr%e@bNvn|L$o?Uq; z@4WM&qDQksBsItir3|)=Tq!qY)ZAFK;%rpBG$|9gK#kN$4bvp){&aeG_wbM3j{oz^ z?$_UBnsB}1C>(_qFdHZ!5)d01lwN8Aqm~G~sFJk`q1&2Z5D^#IKOc6--#$J3_Wu5` zA1xV!>nLEhfx@<5kHg94{4niyyOYf`GEGzNhfN6m>zA*7eDn5ifBEs{n;(YF1`yLc zDzaSXm@_@ym24QK zr>RxZJ#u*V@*9GT=9itX2NDMS9X=XCaTI>ofc(qAU1Vssen1Kl#BQqhWN|{(7 zIY~;AqvkA{bCxux(_!5G^4tC&zwQ6=+y33B{rv-*Zo3X*qB-GVGGq+ih7JmM5osCV zMVHm#fYd6UmQ*q#5d)HBjag3P{PBMO%g-M^y!&|Ek07=gHn7@ucx6Y&6_Uo6| zFHWa%x7(!{uQuE3tK02rvkEIP+#U9#B>kDppzHeeYPDId`mPII@4TZnyQyU#+Vt(*G0kB3$2+>+O@$V~;{@S@~`&HAx0AK~vUql5E*{#=`>+74J ze){Rv&8>61UayAr(63hg&^u;_)HxofDdjxN7-K%{5Bz~QH`~pN_0`KwA6&QY*gIQ% zdTI<{Eepj6=T9yT#-f`L%m~o~IzWwT3FV|R<~+w7W7_BWVW)E{;U*A`S2yOI7Da?a z?AVp5GK>nARijAE7Bi%bS&q$C}VvO@VrIa)kgt?ew%qdIGafN1{`s_3nm=qCJYO*xU6C6#fG;}mxf z$J6d~+?@{h2QqNN1NZJ~=(`moh0u4Q8xLdJ=GV8cVv63mtL?R?a6Fy<{;z-j_USjt znUO=+uh*N~o7*>U-@bhHioJK}Dj!z=`-=qn%s(3aRO6=%m@BuxB>0~0`PsSKr{6Gv z@EkBfto;Faj)(pU9(cq@2Bpv>rFa_W<2a@)X$iN z%9Mq)P^KXQG6JE3CdqRuaCpg5(m6?tS^yx-G+R23r(ZvgAMet5a#^qY)uvxDI?HA` z7ldqMG)L-C9cY0BtBTD4aGAAN+lk8{T0~V%B2$c0Ovf?iq@=)V4iS+G5)dG(=b;;1 zH;@bK)f~sDqLRf-I`5~`>0kf)mufDy922dE)r*%efBf+$@^09ySKD=Ilm4dN|AbUN zqs=pMJ`?o+n)`b`Ny>SSb4~>qb=EnWXsf9}&6-YA8b_44 z?z&Z2VMfbI$$-5Dv_KX}J*o#QiH(BN2&MDET7u0AXoLZZlo>jyz+;c6X_^um^)6hm zHywu*1&vHCn+ljX99DhThj@y4$~j6L=ka(PPp7+2ALe--#^(oiyV%p z_a8s}^Ov80e)sOvr~Bi>{Cs+P&)rZJ^CMn@c+3#;MP?QLnav@BWT z)i7X&w4V+PbBw+ZUFbR=#H%8DaDvmCNoFKNWnQnlqj0BBiaOSGen!LLs%hsus{~j0+@#eQ?k4fY#JBTtN=Ke zfnqoKB}KllI7AvspPmj?*-z7>%8;kTf}EX7Ajv8WQDE$DH%=c)0uc zVRwIbI_+bc=QJk~7u@abOJ;oa>P1X5sDNq91hj_!B|Tva>3orPo-zGf&Z@mWt10f! zkH0*r0pNE`ieDt-9jk< zaU#Q^?-8i$3>Y)yG-o|X&e_bmRkvBMS0RM;>J^x%4*g0s4V&IF%)1!ph`WtPG1g!_b^9q4qa}NsXBpumTBys>(FaQ_5=KnKvQGEHMgX9Z$2MWs{6B zWtl{P$omkycg}Yqgf6i6=-mQgQXn_k%tS>5Qr0=nDaDjy&at3$iI^G}^Bo{j0>Cm~ z2z)@Z=`?~$a89`Qo~T3Y2|5JV7~ov@Z2+iHVN{42kW@8gIi05C;dnTVyWR14m^E5J zzjkibg{}*s>$@(EQ32U^9T7{C!+b;mOQuPu<8*k~@9*{xpLU1iVVqBM9Alc3WH^Cy zJk28mK+bWTPWwF}xvrxH1{5#I>9KkI1(IyI8>JhTE4r!2##0RXb({o(NG?$f(pfBpGi|N8k~zkGQAAmuU4ydAG$7d&bf>t zmJAdaop)}WPN(VmYJ0uv!_fcb&FfV^oaRYP<}uAvHq;E-U2l0kUB6m;CSVX#05pdT zfJ9KdsEQ!c${Y{?fB~#@iIbUAx}Y>cTG%aBVPbIQO% zopJ*1z;_rN)On3eH4+0T0F1zlWK56{nJ5d1kbo$fu^B6{)R+kp_s#`E15?QASOeNX zxN*30&^d4j6=kqBoFF!rm&rLJR#$;r{UMmye&`-<@_N3aiYJ@=K9))&@vD3g!;coG+<}9^rGPl&O`@L`>MY|g794o&;VUQqP{HU0*_(VdbV5c z@ar~C)ws`uPh0X80Kig854(p?pFVy1^zqY&4?q9&AHV+cE2Gc?((Jf4oz!+!tq;m%O|^=kX_+U)gu9b895Q~(O=0 z-VHv^Vxl>x`7|GQ$MNAbAEr1Z%W4J;zVmBGZe_!qPBD&2A~RiYwoJ4?9RBs|&&O$6 zZ#S=Az5dHQy#>3uy>&i3qKU?EHOIob<6f{Fn~Eg8|wBixp&O z&j|Rhv%>j^rTEZVni#Xl!*2Jm+dVuy>>u`bpYGnjdv|zv7*^{v_nnD4Nu07tlB6i) zC=Xt;NES)C7zt)}y&hIww*nle*~G@f>DPb$d>D@}U%hgS_V(&@zwdhQy;D;)DzmT9 zYRZ~gU$(U%Y16AJjwmp!nYP@o9n3B#QIV2&!cy0TAPOkO(085p)%r#vuJCY<(K&RC zjKEkWiIgG-kt~`;3pgpLu_$IWF$CZ`mc7*60WtZ&-Xjw@hrZ*m>D;!XO^3a=E})}= z%DdFlK`n4VRa7&voK#bmIpuLm$5TwvWY+009v^m_%^Cp|aZWiw^58qq2t))qYC5HO zit!ky(>#x}Wh3Oi@0{~xGKN5!<0-~5-C01002{6sA`E$oGt!~f8kjJz*FPr>9+U<&r|33Xn!+}th?1!x7qkj@B;u&IVQ+vVA;}~ ziI|AMN>4Z-lBmsH=LyX*GId?JTCZ4SL^dJgO0)`3Xqhlrf$BLpL)3cu8<2fupdi%-hnYOV9xCB+!0 zX}r6;`}ya8e*Ey^{?pxYx6_>0tCb^vvwCqg+^oXdhh7YLo?xb=Q7xl^WzA8L2vKH= zfTRlZCVR(bI&9a77<`ydr_J?xSZ~O@&2YLqr77-u?}o5iulla{-dpe%oLhzzR>RyD zxnYFnJ$7EV0d4}15wfU&p)o?4nhu6$Bw)Ero+PY1P)scWHgsT4jfIITR+K52C}m|; zFyPi8UJw?5kc<(50k|Z3sQL;Voa>$My<2&=3b^t%c)Y?40&MV)seXkP?OK)H?6$o22;j_zKD6c2cAOJAcX_`)_({VfB zu-otM@9sXl|9JQ5({ws%mhEc8Kppnm?s`33tyf#ubqc`K2@W{tDdi|C28c$Q3><=D znv)tNk+ABz;C$a-JHP6O6eBT)&Kr}=cASpJ${mHx5UXwV%GOE4F?! zGXoPQ2;PPu*Pc!cLSzhyFtHkAh629p%$!*^5CAD4qNR7IWP1@D8k>=7DFP_fK4j|5 z7{I84ewLx9P2g0dNFYE$<2DYdb7642_Pp`939#*S=+#lRq?d3%paF+r`a5|pmIOQ~F6j(d<%&X1%7HqdanOaVnC^Iq|foKA6`V$Nb}#2iBC zhOQg>Zq*0ZIbt;MT@bJgnk-T}B~U+|cp6ij9}b82A3pl7KTY%9?&0O_i>vFa?Phbe z*)Y+tS_53Nz@y*JC7*bX{9KCv-$niKy$rC_i33)|?Pn_Fo;m7?7BB#jd^#RKeE9I; z)BC&oyH9r?KYjXiIv#VBGz$Y=ZMJAQxV5ve?zijp^|0Bvt}_CTJ$7^)4`q5$8O`8* z?X+Sd6OHpMCaN8Gp$}c}dldA}DadI)?8n0t=bWPp7>3hyJx@2&^{Z=7%mk{Wcp&7dbKoT|fJ%OnZ(R4f#)2D}rB=Xz)_uI|-)vH&pU%h(s z`t{%b`s4N0^->@4IW?6+?Irm0d7S@S)c=gU{yqk1Fl5CLA}j@KH5u@gxYg2;1EmYs zEa!aK??1eM_m6-505_-?I(U4IW7uvcn&#^<9Hf(gZJPiG- z*DqeZxgoQD2+osp1kA>@BzOs-lsv5gsKdNnVal44nQ@s>$H<=KnDUfz%nGKt!Kzq| zR1gy~5!Z@f1t@J^1zWI$_|I8(GczMZpwbjm5qE1;hmbsT?{MX8p7`G@=cZhst4 z69Tahh~!)c2A}{6CXkbso&_*sCg+3iy3qHo3*3j$^~??&8zQiC>^Mh^!5E34>-%&% zjng#7czE}#Ne+%*zj}TDm%qe$zFKc`N~%K4H5%7I!r&40*Y3MZ@&9`TKQwOmCIhrg z=|wEa5Q)Hm$h3LG&z&1C4r#xu>Nt(}4-fC&{r1nl|MUO+&;R%H&%Yqj>o;%gt$T5O z+xLF6q8tH?L)V9X#lb5=0`<;1OM(E73j?TXu@Ia?VxTgoC&!rPLyCEtZF>zXav107 zIL))F9rybWzrK4o9GrKj-99j0T@A;Fqw{`P_lCw`W2Z#yl;@b^Y5w@}{^y_Hz5nHx zVd&q!yt%%*q4j1zjl2Efuse*06B4`7F>>%LO~yz}o-m;i0W&!QV`d+M>jHOyLtyW0 z@Z5FOc_21qKyuK#6gXfvuxz*Kbn^S%-KUQacX!9#9Y`K`dsMx-x;~9#N=a4E0hA>u zR0BS>>S2-o-x28l#`bjvcwV@d>oso}^jR}#K|H|aNBww?@pL+!PN)5T|L)h{-u?29 z93#8!_V()f=4!iL^&3+LV z8y^l2tGm@O5TGPsr1db|TwQ6-Naz4H>wJob`=cKMJLXJO)3k}092dH*L!u499769h zY}gTa58+^)bG_%@@!;Iv|lFdd}y%AGMlc}g^j+(RPY)K)C&I*&*{x}LyVX)O|c>Vg# z>z6nG`M3YtY;R(={qA&n*q?TXc$(1pd71-<)W;MPcb)fL=rs70S;3L2E}fq2J$aA8 zV{kTj?mP5sz~#kvz+H!N72-G^52xsur`b7|QyvdHOXq&Z3z;_uV>1&9fZt4)b9`N9bIc6U~l7=R@b25eNtnkPH{5x#XQTL;%Sd<-rTQI6<4;s5}WWsYf@lc=VYvg8sr0IUctOVu1U6Nvtl z@$=LT_zDBqv%j8cx(wC%syA#+0W4Vv#FB-n2naF8G8xbLpnysYedn$=tA0&DDP|m} zd@=<~rlrYN3DL1(9esxYDpF?fSk96s&FD-sB_fLRw7a`Ewf*+`?d#XCU%h&D`-&aq z6r<#%2^_NHG-{4Vu_P+4??UIyb|r z9V4C+o-)muqHt7;Vq&O9MW91zS|utF`U|)_)pi_3Qvzc!htM$AB zkHIOEA{AT=L(YmZrQ_~+xIav%xePh3pz`Dtan5?ms?jWI=fbdBzkT!eYPH_<8wL^s zJ?(dfCLmc;ObV=Gst6f1DjGWu;30K=3Mr+GrdYu)3J*|GVn$TMt^|(B69xowWS$Lh zmlT|b1`<=OK2en{r4-Pf(rB~%>j1PzuJ4~Qe#-W}QJ^yqH0~=xorr4lg~1cct?pM1 zphX8zE4KkPLqY>%B=*4#gE{X^!J*I*C>@sqX`K3?8|6 z>+99k%bV@(w(9~i0x>`Z*a1TIG!G$edOsyMCpRaW63hu>rkF7*X2psvRb?3w5fTtp zq^y#FAT&Z{Fh&am!C7z`oc3NipMy)m36oY5XaR9UF%Y$w^L{_w-R~dnc88Dq!~G%8 ziH)elpSm82=OoiKhpt<_e06*KV!c{#LqCL}3tPdau?KqoRpq03}5QAjceh;ejNQVwRMYn2wOgVez`p3Jl^6PDP_2zmS=V_cbH`{*b*>e$J01k@3-wjxm(l!O3PhZ0e6Zs@>qGL4#;3CPG(X8{qiX^s6W83Hj= z@FlRwhzuZ%N+dukn5Gf5z}jd^SxXRwiJcoZtH1v3Kf10v98VuUzJECFKixh2>*sgB zzWeofJOT(Y`k{Bu2k(ZyzuK;k$7wvyhyA#|-fyqBo9lHy^gg)KQUC>Z!ubk!C}JW} zRCAp&PikD6>j5glW(#JQNR!pVE;1rx1jZWk!D>HR>6LCGrjUy&sA$fblANY_H;#wn zX*|xShvWYJ{jdM{CGO|XU)ig_{P@#Pyjibru5NC&+n1Z0&3b*5)*kc1_f0#BSQjIWMgM8h)*GiWHJOQQI1LJaW zQ2_wo^^V8@T<2fDezo0Ry}!GAzq>o-3gzmT^QS zf{JQj3L=)0rj+NHPxE}3<8e2R_lNi}=2NseKfVC@5H{PZH?LmZ-rQbouC}Y~i|y?X zFJEoen_pD__1muoRx)&jB9WMg*#*Q7umkK=m{HmJ&~?BV#47;@?uM@GyV9y!Wtpp> zNCg!M3-}CzB59q*2kc4!puhy_qot_!Pc?m(-27u={Il_&vVDO8KCfZ;@`ej~3W2r? zp{Mz=<{n@{{j&mbE~ZM=e}aAY0tIKt-m!N`Sdi6JO^v`TBSuD# zg6IHUsnlTSG{-LZa(N^QeYf6hck`sqQRr6N?f>=v{69bb_~UdsoR0g`@o+dCPN!3f zDUK7WmhLe?5`{SDc#5aPxElI?==z}x!8y;wNUjXM$0nm2&Q7bZu%;hdNA7unYweE0 zf({DWR;r-J73eI{lqF@!Nptx{EsMr1)11bK)4ZGFG3hLU0$?<=t{bjyuCK1H)>qfJ zFK%DFeEH(do2%{hcG%o(uU}l>Zr1CE{R1GDiJht{B`m?Ean2zIqaffUBN00f%{~ayP@xf-UpAtp<^Osq7a-9C7$L$sw7BS;=r}g=`x;Q3Zu$z?UzRPEd=zxvAK(I z{d3zFYwR8?0fdTo2c~s^TUBNC85{Kjn2MGH=A5&c789sYgf%g$W<_#Wgv+8-nVB7e zR_h-OL?u~4j5Y-_G&6_fYDta(0z0pqocEyeBxrzAP6D5ycsGEZ^dkJJ6( zv>Q`YFm~MeE?iw-zj*ob?GHb^e)Ib3=6bc>UcY#8y}8+MxP^uhZgj1fUa zLX_7xo<6qqt4e%s+`_&4ECr2~~mk6xn1)xIDmVxBwf(b-u zrSE2%b5_;5&HyTsbJh1EQXq4vf`glZArpHhWOj~A{K!hC)<6^#Fary)F&TkW(E)}; zOw83Q5%K2cW*$$HQb}fPu5X6z)oOdw{rvO4{_)S_X*%srF-eYj z+>hPRhkoyZBTwY0R;2YIbiNF^CZ4qiIctgBxY+uTb!0Hg* z(ibcuCRtL-F-c5mp3^+d(`lMdF~_V)L@Z^AQBqb(BI6|EoTfR8c<(~rt+(5kuiw1+ z;qA-UuU@`-b$xZS*>1P%_3hR5W>|#~LI~amtb7MqB&A$#woD>GV5WfRtaxwUbt@t^ zV@WA$%G7xu0tbhl(X$UObioH#0I)>VvVmbtB1uF9B%3Cc++d)pc(1*9v;<5p9e^+U zqTjiF;qc#^2>aUkp_WLXDwIO~q5;m=HUNVxxiq_GsSE(MOh}~ab;**|m%67f}uOEMUefwfO9ZPvv zjPo?d!|B-dy_ijN-0cp(y?bW><2Y;5zVGMbR4|^|v-8e(j)QZ-k$0|lzH`H7wc4&W z+jYO{Lh#NrGc|0+GXoUYwlG4id8jV5NRkxGA{Dq$O<7`0r^7fc-L^63q*~B)vlOb; zET{?sW=c%J#3A&n)p|R;{^9k1{KtR1dGq#Wd%aq%`mXovyAX((9Xs!-%{B!y(Ok^0 zQnJU2Ope*JV<1HK&XMcDoKe?F&gh7H&yFZCciso*e5-m=fou|0#Io8n&6*RWD3TY) z<`MNbW52)-FDB3hk-^!y{C(8AVn1^=?EtgH5$kgcZafsNQ7Lv zu#u29tM!YkYeZ1ZDJM`hwTJ!jAHV!dQho=&YR;OXiInG?bD9qc014SKJMWxx&M|xE zg6H7KqYG}e9n)>ns50l=2Om81G9czMK-Ov=idD4Oej<`ps(E7tisf{ijt_^!{cito zoTntY@O43%vr?$k&R_`Wog*a2-Z=+g?EKIVH`mucynOxo)vNV-YXBytn3<5+d+*sJ zk`;`gdW#08pu%LH$gyJ|$dMr%F*+k}fR0pv5Iut@^n}hKvjIv{1!%1|3P7{wBI7ir zs^wMHj4x=jHMzi&^sVUjPYs|ysSeKD!T|ps54)uW3Qu2xN7Qf4tT2DdIi*}0WB|-m zb4qcV<2VGtDH6sAf?G0IFr5fTUSPEN6%brf4~uWkj@`&9Xr<%m!dYXhu+^ z3sIpH$)Y0Mb-{Zm#h9isrL5|LQ?L}{cs$K9JKv>vx?CEy9E(0;&IK2ph@Eqt_kAz{ zB4Y20z|?HcF>+&o8Uwpn@M0Sp)FBv31cdAeA!mi0Ow7+fqrgdUQka#>d}=M;znB%k zP3L`JVrZqHM5r;(r|IypzkC1T^!5k$H#c;{cD*5@d7f1Si2c6P`|vsS{~iMUmh12Z4RDc)cyz6&jQ3ffwCDjKAT@o|hlv$>*$Vb$!I-Mi zJu@|{NH{5{oRi2bVhEHC)QUJX03-r-MlLH#hMYNzmuxy~j!@=xiW%g{DUn!BG-7GW zQ!o_~EP@6xrJQ1pah~UCnoqmK?&0C#UqAoy;n&~B{n12&_t!T!*LLHXOCg)8STo*> zd1r=1M9y_xH>}pH?XbSu`p^?PP-0^c1bBqYS(XV~R2XY%6;ymbVk$`iMGaYePTkeK zeRX_!n#L(f7F`^NCL65|^2)g)sm$YeIvuBZ+CS{>*LR;j-TnH@uiNbvu~V?^dRyER zHA|8K&@q=J13Tx6o>WOGibk*rAvsHo9g;6uEI>vu)NGId3=B;Xge+sp<<=o)0w_cZ zQsNJyDpg$-AE<1f~Dd88x;IIx2LE3E>wu;dEiS~0)#R_Pzjr=2Ru(K z1Td|Xp0i3W(T-9-tWuT#oU=(u;C03ae9`u_U*dc9gpmQQ#0zy9{iFTehBcmMHpJj^lf9}dUe9>n@?xZYm( zT_3#fybE1$uK2V~OBd>`?maO(at?{GCtf)SNNAoN5&~8{=(%BW>(FB z0;Z}qBT(%)%#u^e60^<8iXkr~6T-=d#9{>}vkF^-GO4H^`kR~E&1$o|f7tJK|L_0# zKmYj0-|s$sI3A93j3Nf2^XZ5RFK%wxbJzFRS68cH6+&QQq(ZN-r|6j`)anH`np zBq^$y_rZt23v%L@#Q&c){+k#AgfD9Vd^EN4(jxl4?QG^600JRt8-eIUDCHsmAgTyR z2#&eDgPihoJXy{zbVSU+4w=Lt8w#KS8DL2gDVSzSInMJO=Q*dONi1`o(e~yeOp;Zh z=^;X5a!Aa!IF0*<-TmFeyLTTx-F-S84+Wjyp}W1lzPjGtynJzc^Wu7Y zHLTX`92OWKwd%dp310>P3W{j#nYpA>vuKWSj(JWwr5v+lGbz?k(eI7!gAbuh67Xe+ zh6|1hcnV_6E!Qeia&-hmAv5B0Er|-GB&TuOJ$zbuwmGL)DURz_Ukv?QWj`x;+B|K^Z*myx&}Hw^!He?dIn8_Tke_N^@X0c<&KVb2=SV(&QX_ z$Lt+48<8R!kOGN87ARnvP<%m2IZbJr^PDvrWVReM3yY}$SQ5!90)|9=-w&%kR5UUm z)Whi{DW_>3kNaPL`}xzy_YQfpxw^i(_8q@^d;8;0e|`1(?bY?mez7u>JEeK?&?|MNfp`0cm%o9nC9 zcDtXB6!_+L3t*egX0slcX&fi#!+LXdc)0V9gLjMwCWc4BhcOu(N1FmDnIWox3P?uF zgy0DrGa-RdDRwur60rt`3_0pN$~4cX`E<%LnObR!Uay9(A42H5E`$(>YRKTvZr{g0 zUx)(z`?gxzQPX)Kc+D$T|RuZEG4j3qX`fKNaPFe%0~lv(9IJ1QVSd?z78t)L`_5Ku9Ah#ry&R?zWMd-X1#2irn$O2`|#`P?Bn)oZJDd8s-1cKXz|1G!O6*^<7Y1> z`$xrS!R)e^0zf6DzBaZm|5eD52uUhYqEEgJT^qVK_%{01`!0ko_%5XgB8bRrjCH0c zOi>zFnxZhau&&^oLNK(}%hkj=mPcfA=?SqxWnF;6K6WxBl!>Ga^PeQ8>=u>OiLfN2l6)wLr=y7iI_uW! zRpWi(>Sn$D@Bi(oYSgsg*%$ho}HXLe{y(uxOn{Z)nQ~E@vb1>( zSZAy?x0LuQNG3e+(@*)*HW^){!Z z$Ix9ZuP)9nF3-<3rO8GbppH3!|FLC1U zSOE{(vi4B#}P(UV{)T0;Ao{h)jM~@yIKR$l@%P((Vy*_>W{_Wd0SF2@+ zkqujG*;*pbZWc{FqE=7;eST2RIm;SJ3NgmuV+fL>0jP|rU9mTtk7xU3T~*@tE&*xe74wZHqEvvi^6~!qONVXKKQQ9peAIDF^-KTGDtnMmXsC3 z1c*#S^3LGn%Du^wYDh7J0IFDz4knZNWPbAGc>mG<(-+TP{`lkbmoHC_pIB?ZKy_bB zZ4Z2UaG3tO-$c#&kZ<(<=6&I69<%+%e;^^Sf;oiZh8gJK|@G4$hoNG#q zV2oj7cMUJ~8naXS?9c2*mOhCtrPTXXMN&$HG^t0E>Eh)0WU^QkqcIV5zMam-r>7s@ zzJGIe`eD6XGN4b15jDx)VzxJ$E%wZ8TvX-Ami6J&{ewq~@yxjrjRV7KbNspY;RE#5 zVGOF6J=%J`9&#d^#27<})&`e|&KE-NldYn`>0`$oguS4#DP>^>m0 z!}-tm%5I7rJVWfe$15a-geYvN9u@nCbMaeA9zkufDcpEIdAizYR7AvPy}CF*M*x2N zX4AHbP!a2@uIq{rG$oJ(h?}OlTrRt=MFcj?%+y;XoSk92NDjcxdr!Nyn|VdfY7G)K zCf+}UqeuJ4kDtGI_WZ^3AD;bibo6+!Sd?W!pK<$tM+U@K43i1-YsYS>=>6@3HLN!X z{+=$R3djVaqpB*4a$MB~+pcYY{_D?Vj0&vRo9rs(!Be!$9~<7mP7>tE7y+OTS-d$r zPBmInpex3Edq>Al>Z;zGFMROt&OW?9eS3QL@z+vHF#1LMA)=+ywLPb=Y=l(JU{{m&*%NxTxqQku`N)Jw85;!4p!u-Cix1KqRW?AJ3X*(>9F` zeccctt7yAqo*YNWwOg>u<3z-q>y?tKR8?(?V!XHa^yTwE{nJ0aeDUJw=qQu^4dUO4 z`I{8>)#Iz#KYUgKJQQ#E%mww+Bhlgk9=Z}t#rt`V0s&Kh% znl*wtXPFrKHeP*l$Phru&T}?w%Azcb(pcBWX(cvo>zlSLiX_s8u>a`jKmYwd9_;VE zd;e<)%`dP1{L9b(_Urri&3aw9avJw4i*r-_c(OQJ6yvcSEk<@ebEA1NHm*p{c!rMD z6WF0fi*H7CcdsP7^#{;YRwN}!Nk|llQBgwF&``U^?G?MCfN5!rElRFRHU>F^h+Mm$ z2X#*eI_kq^!)+A+1(bmVG?5C#95u*sS!A@9>XETDE{jkV-P;epZUcWlpSd9{CVuzzrH_VMHLa=BTrqW3bO8sOlX z?VAs(#N6gaB#NkN?DJQ0c8II$djH_y`03LZfB5kq{^LLX_=i8993MM7w8)XT8SWD?x337rJ&-do?7#tUI;oOkRTWPjKYsT7*^58^;r-diP1^`#3LXi0NI0|B zI%kWbD9X|pyCVYbJt>ZmV@fIsP`j>eo7Q(-Q5DBej$i)x;tzlS)3mNv-3Ay5#DX?m zv)ryHL<@~4Gy7y;4kpdsLGk!xe{wk0!UkJjS8M4GZ_QKy&^FPJW&CKY;NYog}qM=G;@7W zg@k<*z?6R?Dq2+KWZ9KWV4StqmZR}vd<2*0XYTdVY&#dKwu8&n<=cVsi7R7bWrOgF)Y&f^M%K=yf zg`88RswxQ)C52|Y@u8c|_ntlbVKg3Ht}oA)A78)zYY1UJU5rQdVmyvrI2?_h?H4bP z=wRl@vts|q9XxZz)QK8NkU-D`0MFPmcz}Qd(h~v_7<%aKWN&C6@Xd6bGzK4h6S{4; zU41U`LSVAY(x~kNa>aDNrmea%qr0CDid{vM`xa*A8v=u;-G82O6jLM`S{B1CM)}R8cI(7XjBk_xzj^fJ{y90Kh=sK;pFOLq>g43&>#B7a0qRf6m2#jE?bwxQEk4{hDy?OiB%Zu~X(7-LK^i>V=%gK*b3|fd*6kkC?+-@j^Xg{XO2v1WHF0JC*vnSjQ97;QH6v-LkkRK897HWMIlLw z0s)ml6oExk0_u@{ZkRVaV+FFALdc8>BC01!Y;xO3E-GgX*wT=L2wji{)iM_dL$l`$ zu7l7QJ?nraiZr~zoDdR014vL&B;nrwkN}c`AORU-WF-qi5)}xXadjorS$cAuy5Qrs zgMcHdFB=wDr5JKQ`m5#gygn06g|lT7ePMj11lSSqSE&D=c32_Y zghUu}k~HTErgU}n}t#FTLaCKmUAjah3%37xRBOnH(M3`E)ThbqbrJ;Ah9vgZ|)2?)Nu-p)Ufih|yA}7SiEQy6!+2N>mdxujtFh7`A zvk?`HR>26c-~cMMtL9V!8Nz-F05HH%qJWBO5cQ~DV*&$8Y5)L4KmZb;=GII|q^a*X z!-&S>Y;Gl*q;};LzWRYzRS)^%nL(B0Ei7Ep>>5b7`l{1UjO>~YI*VY z?W@UzBw*8jYBdGM35B zn%%*S-DSY{#s4=;Tl&I>ALrapBmp32iOVw&y~!7(Wu^?-RsIZpfiB1 zO9s#Y$_df{H)g(0T5miKbc?p2XL-%l{<<-^Z>S}p$cDcG*UR@z-c~mZ@ z)wpbCqiQiPs?nH$Oku3afF?bff7Z1TL8%Wrf%Z=RoP7fs_&@id%TtcI3tg@!9IRDH zqCqK90pI~Va6zuLvPs8c@^6K>l ziR;m%s>;!La&U0*^y!InZf|c-RgoA8t+9PlR3Dq!P1IfI*bp_`6}k7@_5NYEsqA~k zEvEl%65#8lj)H!c$Zuy-@2-C5fPM{NUoMk>sb)-U$+$TE(YuT6*1!%-L?I}HvhK$B{UNktSDco(u&1qA9_V3^#{NPq&Qm^@NKlH4{aMxRvJ7+Y4RDs52^VTwT* zAY*AF6BvU2B0WY-Uh$%mQ}9CYzU$g`?5-egAT}C1LK?qgb-u1ZPLZn>ec&hxoNAa8jr@4$)s(YdQ?3*ek>{NM6L|w zXn4bY*?+oa6hY75c5&^8=;gE2_AM*oJ0-wZA3YrTtxQyAh( zaEJB>0|FHxh9Dy6=jWStyV-8m>#MiFygq&Ze!aR91vYkXG^)k_^rU=xWT$1QOEVd9 zX~9-TlvOB8oW3%PGTI>y9vBf2jX~5yqA02fQ^?)hsW0KnZX3RaN)|u?>SBnoA!w!D zsBgQb^<79Yk}b$tQ#i5+m{RCc*J%b(M8{u`m*PqBNv-l&5r_%|KjApyQ_ z-1d+^5KZWH>%ni>fAbz{A_t87h*@3_JuK!e>Ze>er+T$qzIprR!^e-y<;BO3AC{Mw z>#Ozo<%QQY8T0caTR)jRds6>!V8=Bqrp36n&X8qHigB>0cRrjx>ePpsl4>Ujf{;d$ zXeDCkVhRaV=^EM;k%{|qE>^@K(nT-QY1nAHipxuXxsS7!1oa_$pMsYV zB_vd|#()t(Ay7)}08^{mb-Y~4-YCrqsSK|ax7+Rc^5UuArW8|>At&Re15XEWjypy$ zd>&$D{aoE3ZMgIC)+YSS0pB+MCPwf#j@zQ({xZlfNda*8I(Mfb<|ZMEJ^g3RdZ&LO zA`r50K-_HB?|yyv>h0?f?|*&!=Jk5B7GQ%~nsz#gmMkQczWG5>Fk z8SF0oX=#w(*p9@ZcLnzQdfwm1Sq5dOPmLikprCEnY}VWN?>_vmKmYlcpZ~nxtgCAB zXm9lBG49Xd@!sUH;86i}sRw)Gaa}SY3P>98dUI|)2&f<=gqWg+E+h=XA`GAe;#0yH zBnAvVc<+7dQwTWZx^M;yvX-m?hA1(FCZr9e4t%4&6Ah+dJFSXoX)A{YlKRkfq3J>s zQUU zDuAfOlt6-tk3MKfBv_(TtQd`B5YnWIBA81PayT}nTpI~QWQ?`WS!d8dRNwg~g)OPq zu9dDK23I(C1`R1nik&7O+a_$=ZsTK65d>spgUBgq3aSYJ2-zCz*cD_fBBT_=NA*!c z(kKwKssyM?nql#h#vqV1HR89i-Nv?+&J!f1T+z@|EoBbC>ME`hK2o;|cAGZOSN>vU zf8lCWyTY*w_%621HgsJyHrKwu;DEy+CwIsUy{Y@$n9N>RdXOCckB#qEfxc@E+`GnI z@o*yvR(F34?uM*zW(3^4EjJbl-giwKeA{;0w%HFAOsDG!2}+$<(gTU$uK1*VH9Jm6-bGc1w|5QN}58F zKoC@!1*3GK*+6V1cCl?$y(=vn1&AqjNfUuU^r_v1^`^UOLmQKjf??;7tq7*5nh=25 zI4u;EKzamL6d)vEqhb{j2@s{eh$h4JL`~7FG!QxsUVYFQ6%_}JupGETMN$QWti+`{ zkw=eamm64K`JYZk<*e9h1sFq&n`U!)aq;?>U+TJ^O()~Y#4ytkng$rc^7s8P!+awA zyHNetdO~}O`|btsJ7-Vq6rSC6QLo=z_6+5iP_~LyRg)R>Gtr5?b&L#MW;%e!C@xvS3sJ@u5{_0#FS;Z8l+b zl~zsM#w4U{wJ6CHqMRZ~BJ7<)h(p$mDxv{KR3@+nwE*c*y)kMGBB%r(w~E?YG#|>pt>3(P{qvvy{OhY%>x+-*HwQJ93%5ThX6-Tn01%!@L_t(Fe|$cAaWJ0O^=w@2 z?@z}wE=H79Xw}@!fQPz1RS^j>wc?xLo7OimMg~(t?E-r{7E~rv7#=HHLM2QDfzS$D zO#wCKC;_4(ifD|nO(|e#H8gRxjH_)~TkMQBCXy1eAR>qa?^kPCZ_;Wj+X!I57JUFh z6of#Lh>UZ#EL~L@S0WSS<~kX30TMv~X(4PFI>P}WrnZ4DXlgZe2m!^TBtvKn-2mOm zNt~<-08C`9H5FH60y{O>q8`4G32CWI7Gbxs3e_ z*Tp&j0DVG#9}oIYI=LAw{nYp_i85SL0siJ*pj+efFXE1mbl8*)fPNti{}qVPFj;F1 zA*2q%mi?yWv_H28lj``ecz!rujLO+$w0ATe9~9+`Edy$lq@WD%%3qjNnk5hY{PSu&PQ4qxY<9Ym<0fTE0S4cW>Xc52GtoQ&$x zXjI!#DLCNvhr+&(NN%#|`!UtuK5kv| zZ><9Trsv1O5&*qcj&fU81$AYyUlz4BQ!9%y{ZfU|xLseh1uY(p-CkMl&8K^Zqk7@o zUd07~1__`_07PuT7%~J9Q%b27Xa!sC*4_HTHy5EW&R~QhN|924lnh~I%-C=t79^(R zVu~TfkYW8`C{<@j$#0E8($>Tk0Bb>=k&f5BW9feI2Z78s1SB55lz$hPsDHAIh;m_&_IZH;A% zgv5Q7ea^N(0%RbI?5uI7Ft$jp@PO^HPQc1`>sM##0IMe_FaNK9`PYB_fBxH(AAbS> ziAg2)Fmk)ho|}~n-!^t;px)p3smtkS_I=&>O-ArtSLWUEJFMQjw;6B_2{B1B#MNx_ z@<0Bk=P!@XKm6g%tN(HO;m>J%R#6-gk4iIH6yt?+BL;{P88|_ow_w0nFqo2$T`R5V zHu+6#R_XHGHy3_ZQ&kH`m4uowMM5o{IA+HLLSl?l(UhX5q#3@D5gCzGx)LC1+MvHe zY}44e&RRznl96N~Su#iAkJ7TRbib$Vj#|@04M<(WQV38 zC{+XfMcd2rL+p7HN>tACneK1b@G z_2b_^@s?KgEek+ze!Tmr_a5SRlU+mfeRts;6#xbdDS(J&rt$H?`0(Jze+b=M-@J{h zQ`w%gtc^`vs~Q3o0uLyV1b~zc7@H7cREZ=V#7(-mY|l=+^Yh?0u`YlR4WKX+u?mR? zWdKH0WJF~E0?yr-Q~)72Ee3!<%%LN9MW#aIT;ZUy%wPyfg_Dp75h949GJ-IQV?_sL zNuw!G_h_^LGeTEeS6Np$=hzq|>XTq|Q#2yBmaRb|Nht!WcrrDZLXlBGLX>T%ni3_% z1WBy5u5zxl+5FFayMYXnK`zLaU@IUCrXI3BQ6$v(IzeX>LGRz1CS^ZvQf4Q5+zAAsiSqHmsj}q zoj*H^79kK)LCj>FGqyl-09KPi(oBeb=$N5TRX{){0#eXKg02Qr15`+k$r@*v)L1e^ zq)H-~kVHwdf0uy(O~Ipyo$Z^&BOV{1shO;?)>zBNP*#3KBqdD(s>EcRLuMq5KtKt& zBvUCD2#lg8rcKlNHUI&VRtc@^eBD)}iVXk~paC*~7RZq)!BoICP^DC%t=V!_JB3*- zQ)k8!NTeBjbGb)|0l-_-|J!u`&yMfA^n+*JlK@{&|F@s=3kLd)1eQ-dlHR(;E&%Z0 z(Km93daGcFtMqXfWL1Tz2!%x}JX1MIx>a+`ZKz$&1E0w@Xz zR8WP03o0jevS-H!#b~cA>%KCfhlT6o=7aK=0p)xDize-R1+Yc33Rc9VL_R=FaJlT> zUHWyWvsn@<%W2vR3d~>~@CdLHsD*05vEY<-#4-V$06G9<#@Udzzq>2_Z!*B&8YCNp(6?P@R}k|BG4R#%ES*>B$6_x4J_2maW7%v89` zCB3otMo10&_VA#k!UXgHzyq}k9?=7N@QpGCxm-0LE|&h)yQ}~4*LU5vtqMBcjP}}e zKt|c2DS%280s$1r)#*d}1oYKU`4N)#`Fp_ZYAHt2)!=HhTa2OrB7jLLDS~QJNva72 z4RC2kGgB{2ywjqjxlqKXnJ5()tl5EC$yvE-a7DpM9AV%y5)%KzJ&vks&&o$L`E6yu}E zWjTh)qeKTPQ-(2diDZxsu>s_P`foTlZ%*1xHKYI9_on}v!`+zm-!%Rvd2`=b5Oa@N zKeX?YM||=~{KOu-W)csZGs8^Wk{x=>OdmQn4fcYf3L!a?B54T@X}l_@Pm1cy5Li$p z=(=sYiAkzxMrudwCWwZ5AZG2?z|J5Uo?LedU&?&~NWciPqEWUWq*;RCQ1+`sULP52 zD>5VGDz_Ky3$Kt=6ku2XCK-<{H!JJc93lb`Bjp1btus*7RE@XbB-zwKSozI)w`}0A z_Wfc$dj7-nkK5TiomlvTp(%5Ln6YL!_sqNI{W>tKYu0jOs(K!zH~#vnxD`J1>&E z2=}mlCQm*6Q$wk!!*+diF!|~E$;sdSadiBwSR9*TM(Bu$a_b`Ks~2|3zk+?EjGkKy zfRYM;ie$937*P^H1lHX32!JF;2~m6`Bxb}63eB`jo>3XfLI;t78Fp7Q1W>P<07%XQ zRfr6N)=@cvVnSw)<=RZU$zk`nYv&3t{_e%U{NMlWPyh0-^Jjlg)2GHxm>ubWLf@}T zx_)s(^n-j1V`fjn;Zg^FRA!uqiZAlvN+t_T|^=i9Xuh#9hOHs^X z|M1z5e{_$YfEk4l0SQvFY@qK5mIV{sdRsR+%9qLQuJ1x`td9F!Ouv!bKX^w)i zZVXA$ZyEqFjK&r_y!T$J>CT4+*ngc{jQifC;GN%h=HmYBd}{9gPYeVAlTysSUg6r+;}5bOopT}@d=e5ul-%?Ma&ALk zn2#tu*o^|HWE>Pg0m@yjK}16EvD=32GHsWkIoHicz4#E%F4EOXI-fL&#o)Lo4I!qG zQqm;K?6KRX^(ED30!Cnjz>qtN$CyGC5mbd99-54`2*_*zNR^-$2@I6EI4fAZjZUHf zF$4(_KyzO`Bu?3exCt}xfKzAq|M2V#+~pfN=_lM zNn(m2cI()#VzWxkm8_PsUZ(Xn`H)fo=me5aYC;b!6uam<2@yDsd{r8%Su9jr(XzMA z22eNzB692scBNrUY}ppb7Kw*E92~0A2@q9OAn6U63IIq%&gy_>b)C9==Y`!Y$#~$^ z-Zlq5I~RAa`>8+vHshWh^1u)P)3s7naG$n6L+JkwPydMr`PAnJw+<7wn`pgph~E4% zH&m{yc=xUs9dv|KgdvY5zkL#-oq^P6RjisAtHywXNqiQRz_Sue^tf~maOv`M@up@G83ob`oja^wWI{vALmf?7memZSTfv z>8>(*?PtCriywTq|Gyh33C!tVUV}ci&N=J)Nd31fBVX2+^xk2&w>o^5y zJ%l6z#1=-imPKUKMfF}{REeNbf(B$U1)>-hqlwfJI&-f#!Tm?R#$)@^oB6HdrnJ_^ZJ+9{~Nd>L { - refreshSubscribers.map((cb) => cb(token)); -}; - -const addRefreshSubscriber = (cb) => { - refreshSubscribers.push(cb); -}; - -axios.interceptors.request.use( - (config) => { - const token = localStorage.getItem("slackToken"); - if (token) { - config.headers["Authorization"] = `Bearer ${token}`; - } - return config; - }, - (error) => { - return Promise.reject(error); - } -); - -axios.interceptors.response.use( - (response) => { - return response; - }, - async (error) => { - const originalRequest = error.config; - if (error.response.status === 401 && !originalRequest._retry) { - if (isRefreshing) { - return new Promise((resolve) => { - addRefreshSubscriber((token) => { - originalRequest.headers["Authorization"] = "Bearer " + token; - resolve(axios(originalRequest)); - }); - }); - } - - originalRequest._retry = true; - isRefreshing = true; - - const refreshToken = localStorage.getItem("refreshToken"); - - return new Promise((resolve, reject) => { - axios - .post("/auth/reissue", { refreshToken: refreshToken }) - .then(({ data }) => { - const newToken = data.data.accessToken; - localStorage.setItem("slackToken", newToken); - axios.defaults.headers.common["Authorization"] = - "Bearer " + newToken; - originalRequest.headers["Authorization"] = "Bearer " + newToken; - onRefreshed(newToken); - resolve(axios(originalRequest)); - }) - .catch((err) => { - reject(err); - useNavigate().push("/login"); - }) - .finally(() => { - isRefreshing = false; - refreshSubscribers = []; - }); - }); - } - return Promise.reject(error); - } -); - -export default axios; diff --git a/FE/error/src/components/SideBar/ProfileBar.jsx b/FE/error/src/components/SideBar/ProfileBar.jsx index 2f72a1aa..c6d11be2 100644 --- a/FE/error/src/components/SideBar/ProfileBar.jsx +++ b/FE/error/src/components/SideBar/ProfileBar.jsx @@ -1,12 +1,66 @@ import styled from "styled-components"; +import { useState } from "react"; +import { HiPencil } from "react-icons/hi2"; +import { useNavigate } from "react-router-dom"; const ProfileBar = () => { - return ; + const [isHovered, setIsHovered] = useState(false); + const navigate = useNavigate(); + + const handleProfileClick = () => { + navigate("/profile"); + }; + + return ( + + setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + onClick={handleProfileClick} + > + + {isHovered && ( + + + + )} + + + ); }; export default ProfileBar; const StyledProfileFrame = styled.div` - width: 20rem; - height: 18.4375rem; + width: 15.625rem; + height: 15rem; + align-items: center; + display: flex; + flex-direction: column; + margin-bottom: 0.6rem; +`; + +const ProfileImageContainer = styled.div` + position: relative; + cursor: pointer; +`; + +const ProfileImage = styled.img` + margin-top: 1.25rem; + width: 13rem; +`; + +const EditIconOverlay = styled.div` + position: absolute; + top: 1rem; + left: 0; + right: 0; + bottom: 0; + border-radius: 50%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + color: white; + font-size: 2rem; `; diff --git a/FE/error/src/pages/LoginPage.jsx b/FE/error/src/pages/LoginPage.jsx index e1cae153..e9e0cf0b 100644 --- a/FE/error/src/pages/LoginPage.jsx +++ b/FE/error/src/pages/LoginPage.jsx @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; import styled from "styled-components"; import { useNavigate, useSearchParams } from "react-router-dom"; -import axios from "../utils/axiosConfig"; // 수정된 부분 +import axios from "axios"; const LoginPage = () => { const navigate = useNavigate(); @@ -23,12 +23,11 @@ const LoginPage = () => { setError(null); try { const response = await axios.post( - `/auth/login/slack?type=slack&code=${authCode}&redirect_uri=${redirectUri}` + `https://error.econo-calendar.com:8080/api/auth/login/slack?type=slack&code=${authCode}&redirect_uri=https://econo-calendar.com/login` ); if (response.data.code === "201") { localStorage.setItem("slackToken", response.data.data.accessToken); - localStorage.setItem("refreshToken", response.data.data.refreshToken); // 수정된 부분 navigate("/"); } else { setError(response.data.message || "로그인 실패"); diff --git a/FE/error/src/pages/MainPage.jsx b/FE/error/src/pages/MainPage.jsx index c0d9dd7a..580b712b 100644 --- a/FE/error/src/pages/MainPage.jsx +++ b/FE/error/src/pages/MainPage.jsx @@ -56,7 +56,7 @@ const MainPage = () => { export default MainPage; const SideBar = styled.div` - width: 250px; + width: 15.625rem; height: 98.1vh; margin-top: 1rem; `; diff --git a/FE/error/src/pages/ProfilePage.jsx b/FE/error/src/pages/ProfilePage.jsx index 9513a7ef..64f7b319 100644 --- a/FE/error/src/pages/ProfilePage.jsx +++ b/FE/error/src/pages/ProfilePage.jsx @@ -1,17 +1,48 @@ -import { useState } from "react"; +import { useState, useEffect } from "react"; import styled from "styled-components"; import { FaRandom } from "react-icons/fa"; +import axios from "axios"; // axios를 import 합니다. const ProfilePage = () => { const [selectedImage, setSelectedImage] = useState(null); - const [images, setImages] = useState( - Array(16).fill("https://via.placeholder.com/200") - ); + const [images, setImages] = useState([]); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + const fetchImages = async () => { + try { + const response = await axios.get("http://localhost:8080/api/images"); + setImages(response.data); + setIsLoading(false); + } catch (error) { + console.error("Failed to fetch images:", error); + if (error.response) { + // 서버 응답이 2xx 범위를 벗어난 상태 코드를 반환한 경우 + console.error(error.response.data); + console.error(error.response.status); + console.error(error.response.headers); + } else if (error.request) { + // 요청이 이루어졌으나 응답을 받지 못한 경우 + console.error(error.request); + } else { + // 요청을 설정하는 중에 오류가 발생한 경우 + console.error("Error", error.message); + } + setIsLoading(false); + } + }; + + fetchImages(); + }, []); const selectImage = (index) => { setSelectedImage(index); }; + if (isLoading) { + return

Loading...
; + } + return ( <>
From de3098d4826679ec097bfe0bd89dfe84d6762311 Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 19:27:15 +0900 Subject: [PATCH 09/20] =?UTF-8?q?feat:=20=EC=82=AD=EC=A0=9C,=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=ED=97=A4=EB=8D=94=EC=97=90=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/components/DeleteEvent.jsx | 8 +++++++- FE/error/src/components/EconoCalendar.jsx | 2 -- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/FE/error/src/components/DeleteEvent.jsx b/FE/error/src/components/DeleteEvent.jsx index b69a7826..3a6e16c4 100644 --- a/FE/error/src/components/DeleteEvent.jsx +++ b/FE/error/src/components/DeleteEvent.jsx @@ -7,9 +7,15 @@ const DeleteEvent = ({ onRequestClose, handleUpdateDeleteData, }) => { + const storedToken = localStorage.getItem("slackToken"); + const calendarDelete = () => { axios - .delete("/api/calendar/" + selectID) + .delete(`/api/calendar/${selectID}`, { + headers: { + Authorization: `Bearer ${storedToken}`, + }, + }) .then(() => { handleUpdateDeleteData(selectID); handleDelete(); diff --git a/FE/error/src/components/EconoCalendar.jsx b/FE/error/src/components/EconoCalendar.jsx index 6d5b4bbf..2ef9ff58 100644 --- a/FE/error/src/components/EconoCalendar.jsx +++ b/FE/error/src/components/EconoCalendar.jsx @@ -14,11 +14,9 @@ const EconoCalendar = ({ isLoggedIn, setIsLoggedIn }) => { const [checkModalIsOpen, setCheckModalIsOpen] = useState(false); const [createModalIsOpen, setCreateModalIsOpen] = useState(false); const [selectedDate, setSelectedDate] = useState(""); - const [token, setToken] = useState(null); useEffect(() => { const storedToken = localStorage.getItem("slackToken"); - setToken(storedToken); const isUserLoggedIn = !!storedToken; setIsLoggedIn(isUserLoggedIn); From 7174bc2cafddaa2e5fecfe0cd384add618617e14 Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 19:30:05 +0900 Subject: [PATCH 10/20] =?UTF-8?q?feat:=20=ED=95=84=ED=84=B0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C,=20=EC=83=9D=EC=84=B1=20api=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/pages/MainPage.jsx | 2 +- FE/error/src/utils/filterUtils/FilterCreateModal.jsx | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/FE/error/src/pages/MainPage.jsx b/FE/error/src/pages/MainPage.jsx index 2e487908..82523d61 100644 --- a/FE/error/src/pages/MainPage.jsx +++ b/FE/error/src/pages/MainPage.jsx @@ -32,7 +32,7 @@ const MainPage = () => { useEffect(() => { axios - .get("/api/calendar/filter/all") + .get("/api/filter") .then((res) => { const fetchedFilter = res.data.data.map((filter) => ({ filterId: filter.filterId, diff --git a/FE/error/src/utils/filterUtils/FilterCreateModal.jsx b/FE/error/src/utils/filterUtils/FilterCreateModal.jsx index c1c16f49..6998ca00 100644 --- a/FE/error/src/utils/filterUtils/FilterCreateModal.jsx +++ b/FE/error/src/utils/filterUtils/FilterCreateModal.jsx @@ -24,12 +24,12 @@ const FilterCreateModal = ({ filterName: filterTitle, filterColor: filterColor, }; - //axios.post("/api/filter", newFilter).then((res) => { - addNewFilter(newFilter); - setFilterTitle(""); - setFilterColor(""); - onRequestClose(); - //}); + axios.post("/api/filter", newFilter).then((res) => { + addNewFilter(newFilter); + setFilterTitle(""); + setFilterColor(""); + onRequestClose(); + }); }; return ( From d02765c034bc21f97a0dd3b03eabba305fc986b9 Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 20:30:36 +0900 Subject: [PATCH 11/20] =?UTF-8?q?feat:=20=ED=95=84=ED=84=B0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C,=EC=83=9D=EC=84=B1=20=ED=97=A4=EB=8D=94=EC=97=90=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/components/EconoCalendar.jsx | 16 ++++++++-------- FE/error/src/pages/MainPage.jsx | 7 +++++-- .../utils/filterUtils/FilterCreateModal.jsx | 19 ++++++++++++------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/FE/error/src/components/EconoCalendar.jsx b/FE/error/src/components/EconoCalendar.jsx index 2ef9ff58..910d93c8 100644 --- a/FE/error/src/components/EconoCalendar.jsx +++ b/FE/error/src/components/EconoCalendar.jsx @@ -87,16 +87,16 @@ const EconoCalendar = ({ isLoggedIn, setIsLoggedIn }) => { localStorage.removeItem("slackToken"); setIsLoggedIn(false); setToken(null); - // } else { - // const newToken = "dummyToken" + Math.random().toString(36).substr(2, 9); // 임의의 토큰 생성 - // localStorage.setItem("slackToken", newToken); - // setToken(newToken); - // setIsLoggedIn(true); - // } - //TODO: 추후 아래 코드로 변경 } else { - window.location.href = "/login"; + const newToken = "dummyToken" + Math.random().toString(36).substr(2, 9); // 임의의 토큰 생성 + localStorage.setItem("slackToken", newToken); + setToken(newToken); + setIsLoggedIn(true); } + //TODO: 추후 아래 코드로 변경 + // } else { + // window.location.href = "/login"; + // } }; return ( diff --git a/FE/error/src/pages/MainPage.jsx b/FE/error/src/pages/MainPage.jsx index 2e487908..a3f49eb9 100644 --- a/FE/error/src/pages/MainPage.jsx +++ b/FE/error/src/pages/MainPage.jsx @@ -11,7 +11,6 @@ const MainPage = () => { const [filterIndividualLists, setFilterIndividualLists] = useState([]); const [filterGroupLists, setFilterGroupLists] = useState([]); const [isLoggedIn, setIsLoggedIn] = useState(false); - useEffect(() => { const token = localStorage.getItem("slackToken"); setIsLoggedIn(!!token); @@ -29,11 +28,15 @@ const MainPage = () => { filterIndividualLists.filter((filter) => filter.filterId !== newFilter) ); }; + const storedToken = localStorage.getItem("slackToken"); useEffect(() => { axios - .get("/api/calendar/filter/all") + .get("/api/filter", { + headers: { Authorization: `Bearer ${storedToken}` }, + }) .then((res) => { + console.log(res); const fetchedFilter = res.data.data.map((filter) => ({ filterId: filter.filterId, filterName: filter.filterName, diff --git a/FE/error/src/utils/filterUtils/FilterCreateModal.jsx b/FE/error/src/utils/filterUtils/FilterCreateModal.jsx index c1c16f49..e7f21efe 100644 --- a/FE/error/src/utils/filterUtils/FilterCreateModal.jsx +++ b/FE/error/src/utils/filterUtils/FilterCreateModal.jsx @@ -15,7 +15,7 @@ const FilterCreateModal = ({ }) => { const [filterTitle, setFilterTitle] = useState(""); const [filterColor, setFilterColor] = useState(""); - + const storedToken = localStorage.getItem("slackToken"); const handleTitleChange = (event) => { setFilterTitle(event.target.value); }; @@ -24,12 +24,17 @@ const FilterCreateModal = ({ filterName: filterTitle, filterColor: filterColor, }; - //axios.post("/api/filter", newFilter).then((res) => { - addNewFilter(newFilter); - setFilterTitle(""); - setFilterColor(""); - onRequestClose(); - //}); + axios + .post("/api/filter", newFilter, { + headers: { Authorization: `Bearer ${storedToken}` }, + }) + .then((res) => { + console.log(res); + addNewFilter(newFilter); + setFilterTitle(""); + setFilterColor(""); + onRequestClose(); + }); }; return ( From fc596b2f735b20187e91240fd9ba5f9f5e73488a Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 20:32:19 +0900 Subject: [PATCH 12/20] =?UTF-8?q?feat:=20=ED=95=84=ED=84=B0=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=ED=97=A4=EB=8D=94=20=ED=86=A0=ED=81=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/utils/filterUtils/FilterModify.jsx | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/FE/error/src/utils/filterUtils/FilterModify.jsx b/FE/error/src/utils/filterUtils/FilterModify.jsx index d329b815..df6a961b 100644 --- a/FE/error/src/utils/filterUtils/FilterModify.jsx +++ b/FE/error/src/utils/filterUtils/FilterModify.jsx @@ -16,6 +16,7 @@ const FilterModify = ({ filterName, filterID }) => { setClickPosition({ x: rect.left, y: rect.top }); setShowModal(true); }; + const storedToken = localStorage.getItem("slackToken"); const handleTitleChange = (event) => { setFilterTitle(event.target.value); @@ -26,10 +27,18 @@ const FilterModify = ({ filterName, filterID }) => { filterName: filterTitle, filterColor: filterColor, }; - axios.post("/api/calendar/filter/" + filterID, modifyFilter).then((res) => { - setShowModal(false); - window.location.reload(); - }); + axios + .post( + "/api/calendar/filter/" + filterID, + { + headers: { Authorization: `Bearer ${storedToken}` }, + }, + modifyFilter + ) + .then((res) => { + setShowModal(false); + window.location.reload(); + }); }; const customStyles = { From 98b55fb71ca26b2aab0d34f0f8fd1c6d508ee73b Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 20:33:12 +0900 Subject: [PATCH 13/20] =?UTF-8?q?feat:=20=ED=95=84=ED=84=B0=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=ED=97=A4=EB=8D=94=20=ED=86=A0=ED=81=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/utils/filterUtils/FilterDelete.jsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/FE/error/src/utils/filterUtils/FilterDelete.jsx b/FE/error/src/utils/filterUtils/FilterDelete.jsx index ba23192e..ead17085 100644 --- a/FE/error/src/utils/filterUtils/FilterDelete.jsx +++ b/FE/error/src/utils/filterUtils/FilterDelete.jsx @@ -3,10 +3,16 @@ import styled from "styled-components"; import axios from "axios"; const FilterDelete = ({ filterID, updateDeleteFilter }) => { + const storedToken = localStorage.getItem("slackToken"); + const handleDelete = () => { - axios.delete("/api/filter/" + filterID).then(() => { - updateDeleteFilter(filterID); - }); + axios + .delete("/api/filter/" + filterID, { + headers: { Authorization: `Bearer ${storedToken}` }, + }) + .then(() => { + updateDeleteFilter(filterID); + }); }; return ( <> From 03b4f5cfe2bbafca13b5d44140c53b0c04cdf18e Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 20:37:58 +0900 Subject: [PATCH 14/20] =?UTF-8?q?feat:=20=ED=97=A4=EB=8D=94=EC=97=90=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduleCheck/CheckCalendar.jsx | 27 +++++++++++-------- .../components/scheduleCreate/CreateModal.jsx | 27 ++++++++++++------- FE/error/src/pages/CalendarModify.jsx | 9 ++++++- FE/error/src/pages/ProfilePage.jsx | 5 +++- 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/FE/error/src/components/scheduleCheck/CheckCalendar.jsx b/FE/error/src/components/scheduleCheck/CheckCalendar.jsx index 8fe3df22..2424f0b8 100644 --- a/FE/error/src/components/scheduleCheck/CheckCalendar.jsx +++ b/FE/error/src/components/scheduleCheck/CheckCalendar.jsx @@ -21,6 +21,7 @@ const CheckCalendar = ({ handleUpdateDeleteData, }) => { const [event, setEvent] = useState({}); + const storedToken = localStorage.getItem("slackToken"); function createDate(title, startDate, endDate, place, info, type, color) { const specificEvent = { @@ -42,17 +43,21 @@ const CheckCalendar = ({ return; } - axios.get("/api/calendar/" + selectID).then((res) => { - createDate( - res.data.data.eventName, - res.data.data.eventStartDate, - res.data.data.eventEndDate, - res.data.data.eventPlace, - res.data.data.eventInfo, - res.data.data.eventType, - res.data.data.filterColor - ); - }); + axios + .get("/api/calendar/" + selectID, { + headers: { Authorization: `Bearer ${storedToken}` }, + }) + .then((res) => { + createDate( + res.data.data.eventName, + res.data.data.eventStartDate, + res.data.data.eventEndDate, + res.data.data.eventPlace, + res.data.data.eventInfo, + res.data.data.eventType, + res.data.data.filterColor + ); + }); }, [selectID]); function date(startDate, endDate) { diff --git a/FE/error/src/components/scheduleCreate/CreateModal.jsx b/FE/error/src/components/scheduleCreate/CreateModal.jsx index ae74644c..e1c5103e 100644 --- a/FE/error/src/components/scheduleCreate/CreateModal.jsx +++ b/FE/error/src/components/scheduleCreate/CreateModal.jsx @@ -29,6 +29,7 @@ const CreateModal = ({ const [eventEndTime, setEventEndTime] = useState("00:00"); const [selectedFilter, setSelectedFilter] = useState(null); const [activeDropdown, setActiveDropdown] = useState(null); + const storedToken = localStorage.getItem("slackToken"); useEffect(() => { if (isOpen && selectedDate) { @@ -160,15 +161,23 @@ const CreateModal = ({ }, }; - axios.post("/api/calendar", data).then((res) => { - createDate( - eventName, - res.data.data.eventId, - eventStartDate, - eventEndDate - ); - onRequestClose(); - }); + axios + .post( + "/api/calendar", + { + headers: { Authorization: `Bearer ${storedToken}` }, + }, + data + ) + .then((res) => { + createDate( + eventName, + res.data.data.eventId, + eventStartDate, + eventEndDate + ); + onRequestClose(); + }); }; return ( diff --git a/FE/error/src/pages/CalendarModify.jsx b/FE/error/src/pages/CalendarModify.jsx index 614361f6..58c92628 100644 --- a/FE/error/src/pages/CalendarModify.jsx +++ b/FE/error/src/pages/CalendarModify.jsx @@ -10,6 +10,7 @@ const CalendarModify = () => { const navigate = useNavigate(); const location = useLocation(); const selectID = location.state.selectID; + const storedToken = localStorage.getItem("slackToken"); const [modifyName, setModifyName] = useState(""); const [modifyStartDate, setModifyStartDate] = useState(""); @@ -75,7 +76,13 @@ const CalendarModify = () => { eventPlace: modifyPlace, }; axios - .put("/api/calendar/" + selectID, eventData) + .put( + "/api/calendar/" + selectID, + { + headers: { Authorization: `Bearer ${storedToken}` }, + }, + eventData + ) .then((res) => { goBack(); }) diff --git a/FE/error/src/pages/ProfilePage.jsx b/FE/error/src/pages/ProfilePage.jsx index 64f7b319..d1f72533 100644 --- a/FE/error/src/pages/ProfilePage.jsx +++ b/FE/error/src/pages/ProfilePage.jsx @@ -7,11 +7,14 @@ const ProfilePage = () => { const [selectedImage, setSelectedImage] = useState(null); const [images, setImages] = useState([]); const [isLoading, setIsLoading] = useState(true); + const storedToken = localStorage.getItem("slackToken"); useEffect(() => { const fetchImages = async () => { try { - const response = await axios.get("http://localhost:8080/api/images"); + const response = await axios.get("http://localhost:8080/api/images", { + headers: { Authorization: `Bearer ${storedToken}` }, + }); setImages(response.data); setIsLoading(false); } catch (error) { From 80251ab12feda22be03837e66a483eef1870cabf Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 20:44:43 +0900 Subject: [PATCH 15/20] =?UTF-8?q?feat:=20=ED=86=A0=ED=81=B0=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/components/EconoCalendar.jsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/FE/error/src/components/EconoCalendar.jsx b/FE/error/src/components/EconoCalendar.jsx index 910d93c8..001b3914 100644 --- a/FE/error/src/components/EconoCalendar.jsx +++ b/FE/error/src/components/EconoCalendar.jsx @@ -14,7 +14,7 @@ const EconoCalendar = ({ isLoggedIn, setIsLoggedIn }) => { const [checkModalIsOpen, setCheckModalIsOpen] = useState(false); const [createModalIsOpen, setCreateModalIsOpen] = useState(false); const [selectedDate, setSelectedDate] = useState(""); - + const [token, setToken] = useState(null); useEffect(() => { const storedToken = localStorage.getItem("slackToken"); @@ -87,16 +87,16 @@ const EconoCalendar = ({ isLoggedIn, setIsLoggedIn }) => { localStorage.removeItem("slackToken"); setIsLoggedIn(false); setToken(null); + // } else { + // const newToken = "dummyToken" + Math.random().toString(36).substr(2, 9); // 임의의 토큰 생성 + // localStorage.setItem("slackToken", newToken); + // setToken(newToken); + // setIsLoggedIn(true); + // } + //TODO: 추후 아래 코드로 변경 } else { - const newToken = "dummyToken" + Math.random().toString(36).substr(2, 9); // 임의의 토큰 생성 - localStorage.setItem("slackToken", newToken); - setToken(newToken); - setIsLoggedIn(true); + window.location.href = "/login"; } - //TODO: 추후 아래 코드로 변경 - // } else { - // window.location.href = "/login"; - // } }; return ( From 1c9dbdad38e375302795980255e4cf8c96f1c8ad Mon Sep 17 00:00:00 2001 From: kanghaeun Date: Tue, 23 Jul 2024 20:50:17 +0900 Subject: [PATCH 16/20] =?UTF-8?q?feat:=20setToken=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/components/EconoCalendar.jsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/FE/error/src/components/EconoCalendar.jsx b/FE/error/src/components/EconoCalendar.jsx index 001b3914..b689f4fd 100644 --- a/FE/error/src/components/EconoCalendar.jsx +++ b/FE/error/src/components/EconoCalendar.jsx @@ -15,15 +15,17 @@ const EconoCalendar = ({ isLoggedIn, setIsLoggedIn }) => { const [createModalIsOpen, setCreateModalIsOpen] = useState(false); const [selectedDate, setSelectedDate] = useState(""); const [token, setToken] = useState(null); + useEffect(() => { const storedToken = localStorage.getItem("slackToken"); + setToken(storedToken); const isUserLoggedIn = !!storedToken; setIsLoggedIn(isUserLoggedIn); const uri = isUserLoggedIn ? "/api/calendar/all" - : "/api/calendar/public/all"; + : "/api/calendar/all/public"; const config = isUserLoggedIn ? { headers: { Authorization: `Bearer ${storedToken}` } } : {}; @@ -290,6 +292,7 @@ const CalendarContainer = styled.div` background-color: #fff; border-color: #cbcbcb; color: #595959; + margin-right: 1rem; } .fc-event-title-container { height: 1.3rem; @@ -298,4 +301,7 @@ const CalendarContainer = styled.div` font-size: 0.95rem; margin-left: 0.3rem; } + .fc-direction-ltr .fc-toolbar > * > :not(:first-child) { + margin-left: 0.5rem; + } `; From 9a30ec427a81268c20ec56efc7b89fda3752326c Mon Sep 17 00:00:00 2001 From: mlnwns Date: Tue, 23 Jul 2024 21:09:41 +0900 Subject: [PATCH 17/20] =?UTF-8?q?feat:=20=EC=9D=BC=EC=A0=95=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FE/error/src/components/EconoCalendar.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/FE/error/src/components/EconoCalendar.jsx b/FE/error/src/components/EconoCalendar.jsx index 6d5b4bbf..b689f4fd 100644 --- a/FE/error/src/components/EconoCalendar.jsx +++ b/FE/error/src/components/EconoCalendar.jsx @@ -25,7 +25,7 @@ const EconoCalendar = ({ isLoggedIn, setIsLoggedIn }) => { const uri = isUserLoggedIn ? "/api/calendar/all" - : "/api/calendar/public/all"; + : "/api/calendar/all/public"; const config = isUserLoggedIn ? { headers: { Authorization: `Bearer ${storedToken}` } } : {}; @@ -292,6 +292,7 @@ const CalendarContainer = styled.div` background-color: #fff; border-color: #cbcbcb; color: #595959; + margin-right: 1rem; } .fc-event-title-container { height: 1.3rem; @@ -300,4 +301,7 @@ const CalendarContainer = styled.div` font-size: 0.95rem; margin-left: 0.3rem; } + .fc-direction-ltr .fc-toolbar > * > :not(:first-child) { + margin-left: 0.5rem; + } `; From 294e28218624833d3020a8b212dd306e13320220 Mon Sep 17 00:00:00 2001 From: mlnwns Date: Tue, 23 Jul 2024 21:10:23 +0900 Subject: [PATCH 18/20] =?UTF-8?q?feat:=20=EC=83=9D=EC=84=B1=20=EB=AA=A8?= =?UTF-8?q?=EB=8B=AC=20=EA=B0=9C=EC=9D=B8=20=EC=84=B8=EB=B6=80=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=20=EB=B0=B1=EC=97=94=EB=93=9C=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/scheduleCreate/CreateModal.jsx | 73 ++++++++++--------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/FE/error/src/components/scheduleCreate/CreateModal.jsx b/FE/error/src/components/scheduleCreate/CreateModal.jsx index ae74644c..a95695ab 100644 --- a/FE/error/src/components/scheduleCreate/CreateModal.jsx +++ b/FE/error/src/components/scheduleCreate/CreateModal.jsx @@ -29,6 +29,7 @@ const CreateModal = ({ const [eventEndTime, setEventEndTime] = useState("00:00"); const [selectedFilter, setSelectedFilter] = useState(null); const [activeDropdown, setActiveDropdown] = useState(null); + const [privateFilters, setPrivateFilters] = useState([]); useEffect(() => { if (isOpen && selectedDate) { @@ -38,16 +39,32 @@ const CreateModal = ({ setEventInfo(""); setEventPlace(""); setEventMemo(""); - setEventStartTime("00:00"); // 초기화 추가 - setEventEndTime("00:00"); // 초기화 추가 - setNewStartDate(selectedDate + "T00:00"); // 수정 - setNewEndDate(selectedDate + "T00:00"); // 수정 - + setEventStartTime("00:00"); + setEventEndTime("00:00"); + setNewStartDate(selectedDate + "T00:00"); + setNewEndDate(selectedDate + "T00:00"); setSelectedFilter(null); setActiveDropdown(null); + + fetchFilters(); } }, [isOpen, selectedDate]); + const storedToken = localStorage.getItem("slackToken"); + + const fetchFilters = async () => { + try { + const response = await axios.get("/api/filter", { + headers: { Authorization: `Bearer ${storedToken}` }, + }); + if (response.data && response.data.data) { + setPrivateFilters(response.data.data); + } + } catch (error) { + console.error("필터 정보를 가져오는 데 실패했습니다:", error); + } + }; + const isFilterSelected = () => { return selectedFilter && selectedFilter.category && selectedFilter.filter; }; @@ -82,7 +99,6 @@ const CreateModal = ({ setEventStartTime(time); setNewStartDate(`${StartDate}T${time}`); - // 시작 시간이 종료 시간보다 늦을 경우, 종료 시간을 시작 시간과 같게 설정 if (StartDate === EndDate && time > eventEndTime) { setEventEndTime(time); setNewEndDate(`${EndDate}T${time}`); @@ -91,7 +107,6 @@ const CreateModal = ({ const handleEndTimeSelect = (time) => { if (StartDate === EndDate && time < eventStartTime) { - // 종료 시간이 시작 시간보다 이를 경우, 시작 시간을 종료 시간과 같게 설정 setEventStartTime(time); setNewStartDate(`${StartDate}T${time}`); } @@ -122,11 +137,11 @@ const CreateModal = ({ return selectedFilter.filter; } switch (category) { - case "econo": + case "public": return "에코노"; case "group": return "그룹"; - case "personal": + case "private": return "개인"; default: return ""; @@ -146,7 +161,7 @@ const CreateModal = ({ const saveData = () => { if (!eventName || !isFilterSelected()) { - return; // 추가적인 안전장치 + return; } const data = { @@ -155,9 +170,8 @@ const CreateModal = ({ eventEndDate: eventEndDate, eventPlace: eventPlace, eventInfo: eventMemo, - eventCategory: { - [selectedFilter.category]: selectedFilter.filter, - }, + scheduleType: selectedFilter.category, + filterName: selectedFilter.filter, }; axios.post("/api/calendar", data).then((res) => { @@ -191,7 +205,7 @@ const CreateModal = ({ - {["econo", "group", "personal"].map((category) => ( + {["public", "group", "private"].map((category) => (