From 9f9e508bb7689d5a96968a897559ecae87a024f8 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Mon, 25 Mar 2024 13:16:53 +0530 Subject: [PATCH] [WEB-812] chore: project active cycle stats empty state (#4053) * chore: empty state asset and config file updated * chore: empty state asset and config file updated * chore: active cycle empty state implementation --- .../cycles/active-cycle/cycle-stats.tsx | 120 ++++++++++-------- .../cycles/active-cycle/productivity.tsx | 56 ++++---- .../cycles/active-cycle/progress.tsx | 83 ++++++------ .../active-cycle/upcoming-cycles-list.tsx | 21 ++- web/components/empty-state/empty-state.tsx | 6 +- web/constants/empty-state.ts | 31 +++++ .../active-cycle/assignee-dark.webp | Bin 0 -> 1188 bytes .../active-cycle/assignee-light.webp | Bin 0 -> 1156 bytes .../empty-state/active-cycle/chart-dark.webp | Bin 0 -> 1176 bytes .../empty-state/active-cycle/chart-light.webp | Bin 0 -> 1154 bytes .../empty-state/active-cycle/cycle-dark.webp | Bin 0 -> 1360 bytes .../empty-state/active-cycle/cycle-light.webp | Bin 0 -> 1246 bytes .../empty-state/active-cycle/label-dark.webp | Bin 0 -> 1138 bytes .../empty-state/active-cycle/label-light.webp | Bin 0 -> 1186 bytes .../active-cycle/priority-dark.webp | Bin 0 -> 1052 bytes .../active-cycle/priority-light.webp | Bin 0 -> 1096 bytes .../active-cycle/progress-dark.webp | Bin 0 -> 1094 bytes .../active-cycle/progress-light.webp | Bin 0 -> 1172 bytes 18 files changed, 203 insertions(+), 114 deletions(-) create mode 100644 web/public/empty-state/active-cycle/assignee-dark.webp create mode 100644 web/public/empty-state/active-cycle/assignee-light.webp create mode 100644 web/public/empty-state/active-cycle/chart-dark.webp create mode 100644 web/public/empty-state/active-cycle/chart-light.webp create mode 100644 web/public/empty-state/active-cycle/cycle-dark.webp create mode 100644 web/public/empty-state/active-cycle/cycle-light.webp create mode 100644 web/public/empty-state/active-cycle/label-dark.webp create mode 100644 web/public/empty-state/active-cycle/label-light.webp create mode 100644 web/public/empty-state/active-cycle/priority-dark.webp create mode 100644 web/public/empty-state/active-cycle/priority-light.webp create mode 100644 web/public/empty-state/active-cycle/progress-dark.webp create mode 100644 web/public/empty-state/active-cycle/progress-light.webp diff --git a/web/components/cycles/active-cycle/cycle-stats.tsx b/web/components/cycles/active-cycle/cycle-stats.tsx index e27c99500..fd4bc9318 100644 --- a/web/components/cycles/active-cycle/cycle-stats.tsx +++ b/web/components/cycles/active-cycle/cycle-stats.tsx @@ -11,7 +11,9 @@ import { Tooltip, Loader, PriorityIcon, Avatar } from "@plane/ui"; // components import { SingleProgressStats } from "@/components/core"; import { StateDropdown } from "@/components/dropdowns"; +import { EmptyState } from "@/components/empty-state"; // constants +import { EmptyStateType } from "@/constants/empty-state"; import { CYCLE_ISSUES_WITH_PARAMS } from "@/constants/fetch-keys"; import { EIssuesStoreType } from "@/constants/issue"; // helper @@ -177,8 +179,12 @@ export const ActiveCycleStats: FC = observer((props) => { )) ) : ( -
- There are no high priority issues present in this cycle. +
+
) ) : ( @@ -195,63 +201,75 @@ export const ActiveCycleStats: FC = observer((props) => { as="div" className="flex h-52 w-full flex-col gap-1 overflow-y-auto text-custom-text-200 vertical-scrollbar scrollbar-sm" > - {cycle.distribution?.assignees?.map((assignee, index) => { - if (assignee.assignee_id) - return ( - - + {cycleIssues.length > 0 ? ( + cycle.distribution?.assignees?.map((assignee, index) => { + if (assignee.assignee_id) + return ( + + - {assignee.display_name} -
- } - completed={assignee.completed_issues} - total={assignee.total_issues} - /> - ); - else - return ( - -
- User + {assignee.display_name}
- No assignee - - } - completed={assignee.completed_issues} - total={assignee.total_issues} - /> - ); - })} + } + completed={assignee.completed_issues} + total={assignee.total_issues} + /> + ); + else + return ( + +
+ User +
+ No assignee + + } + completed={assignee.completed_issues} + total={assignee.total_issues} + /> + ); + }) + ) : ( +
+ +
+ )} - {cycle.distribution?.labels?.map((label, index) => ( - - - {label.label_name ?? "No labels"} - - } - completed={label.completed_issues} - total={label.total_issues} - /> - ))} + {cycleIssues.length > 0 ? ( + cycle.distribution?.labels?.map((label, index) => ( + + + {label.label_name ?? "No labels"} + + } + completed={label.completed_issues} + total={label.total_issues} + /> + )) + ) : ( +
+ +
+ )}
diff --git a/web/components/cycles/active-cycle/productivity.tsx b/web/components/cycles/active-cycle/productivity.tsx index 59c2ac3c9..a3366d934 100644 --- a/web/components/cycles/active-cycle/productivity.tsx +++ b/web/components/cycles/active-cycle/productivity.tsx @@ -3,6 +3,9 @@ import { FC } from "react"; import { ICycle } from "@plane/types"; // components import ProgressChart from "@/components/core/sidebar/progress-chart"; +import { EmptyState } from "@/components/empty-state"; +// constants +import { EmptyStateType } from "@/constants/empty-state"; export type ActiveCycleProductivityProps = { cycle: ICycle; @@ -16,31 +19,40 @@ export const ActiveCycleProductivity: FC = (props)

Issue burndown

- -
-
-
-
- - Ideal + {cycle.total_issues > 0 ? ( + <> +
+
+
+
+ + Ideal +
+
+ + Current +
+
+ {`Pending issues - ${cycle.backlog_issues + cycle.unstarted_issues + cycle.started_issues}`}
-
- - Current +
+
- {`Pending issues - ${cycle.backlog_issues + cycle.unstarted_issues + cycle.started_issues}`} -
-
- -
-
+ + ) : ( + <> +
+ +
+ + )}
); }; diff --git a/web/components/cycles/active-cycle/progress.tsx b/web/components/cycles/active-cycle/progress.tsx index dea3b496a..752f72bcc 100644 --- a/web/components/cycles/active-cycle/progress.tsx +++ b/web/components/cycles/active-cycle/progress.tsx @@ -3,8 +3,11 @@ import { FC } from "react"; import { ICycle } from "@plane/types"; // ui import { LinearProgressIndicator } from "@plane/ui"; +// components +import { EmptyState } from "@/components/empty-state"; // constants import { CYCLE_STATE_GROUPS_DETAILS } from "@/constants/cycle"; +import { EmptyStateType } from "@/constants/empty-state"; export type ActiveCycleProgressProps = { cycle: ICycle; @@ -32,48 +35,56 @@ export const ActiveCycleProgress: FC = (props) => {

Progress

- - {`${cycle.completed_issues + cycle.cancelled_issues}/${cycle.total_issues - cycle.cancelled_issues} ${ - cycle.completed_issues + cycle.cancelled_issues > 1 ? "Issues" : "Issue" - } closed`} - + {cycle.total_issues > 0 && ( + + {`${cycle.completed_issues + cycle.cancelled_issues}/${cycle.total_issues - cycle.cancelled_issues} ${ + cycle.completed_issues + cycle.cancelled_issues > 1 ? "Issues" : "Issue" + } closed`} + + )}
- + {cycle.total_issues > 0 && }
-
- {Object.keys(groupedIssues).map((group, index) => ( - <> - {groupedIssues[group] > 0 && ( -
-
-
- - {group} + {cycle.total_issues > 0 ? ( +
+ {Object.keys(groupedIssues).map((group, index) => ( + <> + {groupedIssues[group] > 0 && ( +
+
+
+ + {group} +
+ {`${groupedIssues[group]} ${ + groupedIssues[group] > 1 ? "Issues" : "Issue" + }`}
- {`${groupedIssues[group]} ${ - groupedIssues[group] > 1 ? "Issues" : "Issue" - }`}
-
- )} - - ))} - {cycle.cancelled_issues > 0 && ( - - - {`${cycle.cancelled_issues} cancelled ${ - cycle.cancelled_issues > 1 ? "issues are" : "issue is" - } excluded from this report.`}{" "} + )} + + ))} + {cycle.cancelled_issues > 0 && ( + + + {`${cycle.cancelled_issues} cancelled ${ + cycle.cancelled_issues > 1 ? "issues are" : "issue is" + } excluded from this report.`}{" "} + - - )} -
+ )} +
+ ) : ( +
+ +
+ )}
); }; diff --git a/web/components/cycles/active-cycle/upcoming-cycles-list.tsx b/web/components/cycles/active-cycle/upcoming-cycles-list.tsx index f4156f341..221ffab0b 100644 --- a/web/components/cycles/active-cycle/upcoming-cycles-list.tsx +++ b/web/components/cycles/active-cycle/upcoming-cycles-list.tsx @@ -1,5 +1,7 @@ import { FC } from "react"; import { observer } from "mobx-react"; +import Image from "next/image"; +import { useTheme } from "next-themes"; // components import { UpcomingCycleListItem } from "@/components/cycles"; // hooks @@ -14,6 +16,11 @@ export const UpcomingCyclesList: FC = observer((props) => { // store hooks const { currentProjectUpcomingCycleIds } = useCycle(); + // theme + const { resolvedTheme } = useTheme(); + + const resolvedEmptyStatePath = `/empty-state/active-cycle/cycle-${resolvedTheme === "light" ? "light" : "dark"}.webp`; + if (!currentProjectUpcomingCycleIds) return null; return ( @@ -28,8 +35,18 @@ export const UpcomingCyclesList: FC = observer((props) => { ))}
) : ( -
-
+
+
+
+ button image +
No upcoming cycles

Create new cycles to find them here or check diff --git a/web/components/empty-state/empty-state.tsx b/web/components/empty-state/empty-state.tsx index 88fe21612..790bd5aec 100644 --- a/web/components/empty-state/empty-state.tsx +++ b/web/components/empty-state/empty-state.tsx @@ -151,12 +151,12 @@ export const EmptyState: React.FC = (props) => { )} {layout === "screen-simple" && (

-
+
{key diff --git a/web/constants/empty-state.ts b/web/constants/empty-state.ts index 6705021a5..363147775 100644 --- a/web/constants/empty-state.ts +++ b/web/constants/empty-state.ts @@ -84,6 +84,12 @@ export enum EmptyStateType { NOTIFICATION_ARCHIVED_EMPTY_STATE = "notification-archived-empty-state", NOTIFICATION_SNOOZED_EMPTY_STATE = "notification-snoozed-empty-state", NOTIFICATION_UNREAD_EMPTY_STATE = "notification-unread-empty-state", + + ACTIVE_CYCLE_PROGRESS_EMPTY_STATE = "active-cycle-progress-empty-state", + ACTIVE_CYCLE_CHART_EMPTY_STATE = "active-cycle-chart-empty-state", + ACTIVE_CYCLE_PRIORITY_ISSUE_EMPTY_STATE = "active-cycle-priority-issue-empty-state", + ACTIVE_CYCLE_ASSIGNEE_EMPTY_STATE = "active-cycle-assignee-empty-state", + ACTIVE_CYCLE_LABEL_EMPTY_STATE = "active-cycle-label-empty-state", } const emptyStateDetails = { @@ -584,6 +590,31 @@ const emptyStateDetails = { description: "Any notification you archive will be \n available here to help you focus", path: "/empty-state/search/archive", }, + [EmptyStateType.ACTIVE_CYCLE_PROGRESS_EMPTY_STATE]: { + key: EmptyStateType.ACTIVE_CYCLE_PROGRESS_EMPTY_STATE, + title: "Add issues to the cycle to view it's \n progress", + path: "/empty-state/active-cycle/progress", + }, + [EmptyStateType.ACTIVE_CYCLE_CHART_EMPTY_STATE]: { + key: EmptyStateType.ACTIVE_CYCLE_CHART_EMPTY_STATE, + title: "Add issues to the cycle to view the \n burndown chart.", + path: "/empty-state/active-cycle/chart", + }, + [EmptyStateType.ACTIVE_CYCLE_PRIORITY_ISSUE_EMPTY_STATE]: { + key: EmptyStateType.ACTIVE_CYCLE_PRIORITY_ISSUE_EMPTY_STATE, + title: "Observe high priority issues tackled in \n the cycle at a glance.", + path: "/empty-state/active-cycle/priority", + }, + [EmptyStateType.ACTIVE_CYCLE_ASSIGNEE_EMPTY_STATE]: { + key: EmptyStateType.ACTIVE_CYCLE_ASSIGNEE_EMPTY_STATE, + title: "Add assignees to issues to see a \n breakdown of work by assignees.", + path: "/empty-state/active-cycle/assignee", + }, + [EmptyStateType.ACTIVE_CYCLE_LABEL_EMPTY_STATE]: { + key: EmptyStateType.ACTIVE_CYCLE_LABEL_EMPTY_STATE, + title: "Add labels to issues to see the \n breakdown of work by labels.", + path: "/empty-state/active-cycle/label", + }, } as const; export const EMPTY_STATE_DETAILS: Record = emptyStateDetails; diff --git a/web/public/empty-state/active-cycle/assignee-dark.webp b/web/public/empty-state/active-cycle/assignee-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..25906276703e5d6f61c413c1c4ed4380fa743141 GIT binary patch literal 1188 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 literal 0 HcmV?d00001 diff --git a/web/public/empty-state/active-cycle/chart-light.webp b/web/public/empty-state/active-cycle/chart-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..587906fba3df748dd91b16f7482f3cd059c380bd GIT binary patch literal 1154 zcmV-|1bzEbNk&F`1ONb6MM6+kP&il$0000G0001+005f+06|PpNaq3o00E#?TW{T3 z`ydE{A#4bS5C~?l%^+dWFi08nFc1Vo5ClQcLvM*~>HL?Mh?oFOFfH|Va1*hYB8`u& z<{vmuxgKH{wnxq66XhFQmwe0KP-V5AA0@d#m2E&SNgrHiA`S8 zKv`}2x(u_Li|Zgab8;QxFgK6>h|SSPol!Ga8+Ap^oNd%oGk3Y8!yG=kSB&m0ru3&SYFZi_p*3*(iK+{==h469GVnNL3 zNEGChVqvUjNF0>DTP={=S4kqF^i8o)Zr?~Ols+pK%<`E;gFng^&iu&{kNpF(cq+Xs z0kQgyBf@Wzg_K^EnABH~nD8r$snSypish$0D*F>hg#nO-m4Fq#T*0My76&+3%4#I5ONK(hrM`o*$sY_&Xip&op z14vvNaF5F$pvI*FIW8HXxDWu23Io6%mHjD4B|nh{1ur=!e_qv?lvfm!^a>mi#@iZ^ z@{Tkh^bUJG4t$v7kv{=PL-28lM){017J@IgSd?!_BO&P>uO8q~2+|0@b^MYj@vvTukDb&{at4mnK}F{aVoD z=GBHicb_)&diUs#e%YUfj;VRms3%bKr4jn3<_QzJzx#2=h?^HX#@u|^FzTZ7(~NPG z%uW(UrhRTZVeq2!(u(mD&x#YKSY<|9G0SwH&m&=?i_AqbCR=14S~1~G=Aav4%BjeB zx)J7GWGpU(x##;Zx@R~@g-75@@G_N0SIU*(Y~HyK-ZQ~v%JtE%kfUaT^FO(62RD&d zB8`u|E(sF^09H^qAZ!5u0Pq$7odGJG0Gt3mkv^M8rK6)EF1(1~uo4MrZrxvcsh_TY z*gpV2KtA#X-HYr?ZZ>4nkO+b-+I@u*N2`!GH8I3T|HTHI$EsU=K#TN2h(8gAxGP;Z z=YUY~ofT^@kkC%+5);6E1c=vjc1TtoMNDLzswt>IcXHHd7TpY`cs_6d?)3&l=%fgM*uPf#uHDP`a81(wT+tJAV3xjFKVx~ zHj%18e}|hds`0e_c9aq0U%7YGDx&V&D>N#?cnP~~|9_0XsGNluPT!k6#c;=PGH;%L z@9z`SUSbdb*H`8#!*keQaG(G7YybVJSO4~z1UQgXV>eZyNf103Q<}}f%>U11mK+9^ UDEaeX-*GC7q(;dG!I>NY0OST4vH$=8 literal 0 HcmV?d00001 diff --git a/web/public/empty-state/active-cycle/cycle-dark.webp b/web/public/empty-state/active-cycle/cycle-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..d092308046fba21f8f4302b081e150b3f53e462e GIT binary patch literal 1360 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 E0KfPStN;K2 literal 0 HcmV?d00001 diff --git a/web/public/empty-state/active-cycle/label-light.webp b/web/public/empty-state/active-cycle/label-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..e5ccc6994d13c152506d9bf7ba00d036676a8d54 GIT binary patch literal 1186 zcmV;T1YP@5Nk&GR1ONb6MM6+kP&il$0000G0001+005i-06|PpNaq3o00E#?TW{T3 z`ydE{A#4bS5C~?l%^+dWFi08nFc1Vo5ClQcLvM*~>HL?Mh?oHU<))?H4sIg$Ql#;* z)%@cf<$8!+*d8^LPn2(LUGgn^LzUHfew5?}Rki`SkO%puHtLZlM}=)@DHEerZFnhZ zPPD2`QPvs#s!dbMY_ix?WtmBO*mRFHjbF71OPxbvn>42h{Hje`%V>17so!X*BsO_T z17)@8>oUx0F0O;z%*l0#!`wXjBQ{4Hbw|p zn^zn9+)oR}`elC_I;Q4Lqn<#`mqzHDnkP)?{_e*eBW_;o7<2Ps!>EhSPcz0% zGCN5anfAHugu#o>ODo1tJS$F^VwD+b#Vpf(K97WnE;1L%m~4@GXvKs#nS*YGDW@Xi z=|-4$k+HZC=AQ4v=$_#q6&`^r!OK)0T`5O)M;FWTl1Nzl;eVg(Z);uz&V2aIbTCr{FUhPqPpT+dIVSN zRl)F|j^h9T{=FRnJv-|hjMa%SB7gt<_%0%CKe%`c`0=E|9U*{_RTo1EN093wYN(X1 zlIzz}yyh8O#k1fOLz|bTLn4X3@hmz06120_+)(~3({kgV?@7fp3YD(?bYJBKO zL%$rC8%rL6S+4-PIkq^5qFC{>!00E$uZExI4 zdm#vdAsh&X5C~>)%phUVFi0767zlzP2!bGJmM)2HX};x8L`(o?n3j4wxQW%EOTJ}ysIpqmkCObL$~GVuav|T;Mm_TEsIUz!WoERh4KF24 zidMBL$~vWQwP{M3P8OT0EK^Ajo9>b3@vSytsgp=-ljbyoZ?$P_8IEo?^&5?q#3nCk zq^vf5UB+3>#dVaMIk}E;n48A{#O7$D-l&v>5cpy{;3Lijjqu^{G? zBnom)u`t$CBo0a^tQN@avm}vF`lwhaw~r(iN*@#pX8Ay(!S7`YXMXF5$NmmkJeA%k z0kQf9M}%J`3n{%QF{v*eG2s^$Q>7<4D3+h>QQ4nxRQM0Fuo8eAmkglBr2=@wR7|0geo#MW#U_Bhj(Y{vSaiBhhJ*Y2e5(?vXjLM`lBf zOvMtJj1-wKATj_XE)BpvE<3Ps}ap2t?kNg%m8iMyrG|C60u@HQ^#iD#f8VN}sVT;6u z&q?DTIJ3r~oC1l0;M^RA{}aNz8u5s-8mY6L1SWd9gfCiPC!C8*vNT)g|X<7yJm zgf2r;zciu4?AL-WH?KByy8E=D+q*}1bjk5_c5oAUCerxW>yj`*09H^qAo>6R0FV#>odGJH0Gt3mkwTtIC8MJut28Kp zuo4MrZr{`d00bZYR3GMIgCr58E(G4ena0^|?cy=v%sF#I(0Yf7bmRg$W?Z~O4T!v! zO+mYubeV@fE(dz-yg;ekXaV3}xp4|OTos(oU(jXh;A9Aq(x3SiI=!@6IW!vr$ zxXE$F9uh!KxFYa+O7B`=N8cDuu9qT5G?Xm1hgJ}AYCe@7Nxq(?f%<^MtF2K1H&?Ky W6r?)`dS&naK_QZFBpht`00003o8$!m literal 0 HcmV?d00001 diff --git a/web/public/empty-state/active-cycle/priority-light.webp b/web/public/empty-state/active-cycle/priority-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..fde814c6a7c2c5c373b5a900a78ae0ff6cfdbe12 GIT binary patch literal 1096 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 MWeMCLcpv}(0Pm3pc>n+a literal 0 HcmV?d00001 diff --git a/web/public/empty-state/active-cycle/progress-light.webp b/web/public/empty-state/active-cycle/progress-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..ae30cf76a5cec3bdcf4c83c809099ae5bb172749 GIT binary patch literal 1172 zcmV;F1Z(?JNk&GD1ONb6MM6+kP&il$0000G0001+005f+06|PpNaq3o00E#?TW{T3 z`ydE{A#4bS5C~?l%^+dWFi08nFc1Vo5ClQcLvM*~>HL?Mh?oFOFfH|Va1*hYB8`u& z<{vmuxgKH{wnxq66XhFQmwe0KP-V5AA0@d#m2E&SNgrHiA`S8 zKv`}2x(u_Li|Zgab8;QxFgK6>h|SSPol!Ga8+Ap^oNd%oGk3Y8!yG=kSB&m0ru3&SYFZi_p*3*(iK+{==h469GVnNL3 zNEGChVqvUjNF0>DTP={=S4kqF^i8o)Zr?~Ols+pK%<`E;gFng^&iu&{kNpF(cq+Xs z0kQgyBf@Wzg_K^EnABH~nD8r$snSypish$0D*F>hg#nO-m4Fq#T*0My76&+3%4#I5ONK(hrM`o*$sY_&Xip&op z14vvNaF5F$pvI*FIW8HXxDWu23Io6%mHjD4B|nh{1ur=!e_qv?lvfm!^a>mi#@iZ^ z@{Tkh^bUJG4t$v7kv{=PL-28lM){017J@IgSd?!_BO&P>uO8q~2+|0@b^MYj@vvTukDb&{at4mnK}F{aVoD z=GBHicb_)&diUs#e%YUfj;VRms3%bKr4jn3<_QzJzx#2=h?^HX#@u|^FzTZ7(~NPG z%uW(UrhRTZVeq2!(u(mD&x#YKSY<|9G0SwH&m&=?i_AqbCR=14S~1~G=Aav4%BjeB zx)J7GWGpU(x##;Zx@R~@g-75@@G_N0SIU*(Y~HyK-ZQ~v%JtE%kfUaT^FO(62RD&d zB8`u|E(sF^09H^qAbtS=05BE+odGJG0Gt3mkwTwJrK6)Eqg2|cuo4MrZs5THW=dT@ zt>4f;3jaVp^m;rXo>TXElFkN)zjh5aNGn{sXQ$b+q*DB)qX9-ze{@$073uOOMY!{f zW)#}s1r_4IsLg~SRSB)G9qNgg9hb#sf7`|m#Vrtnocb)zExUMZk{ZFrwoKu*@`q|4 zQ5H~jZ=R^}=U@@i<^Dq&WWvdvPNOh{loi~|ZGk<9HSJr};RWMj<=dWPuv>rt{>5Qz zpRMHoz^_2r&$T%Ug(unuVEy||2<@WMLKTwRlTlqWKvdEKSoM}C%cUly_KeV$-6-)K zgTThim1KK`s#=0vb_{Vz>+7-9swihiT_(VAEy|D4Ro-zi2S7$B@ zBjDH;EIBRRi#rBe74(U-`_aCQat4ymJ{T#S$mWTk!qRz6U^@U;Ap@B}{ctXq6aW9b mumAVeAOG*1v>@Go<&XKbD!_cW78>wc>S;r0$QdeP-~a&Rw=ItV literal 0 HcmV?d00001