From 1dd269937fa7e3cc6e2212f1d09512e9ca834682 Mon Sep 17 00:00:00 2001 From: RyosukeDTomita Date: Sun, 4 Aug 2024 13:23:25 +0900 Subject: [PATCH] fix jest --- .dockerignore | 4 +- .env.stating | 1 + .github/workflows/react-jest.yaml | 4 +- Dockerfile | 11 +++-- README.md | 26 +++++++++--- .../archive/initialsettings_aws.md | 0 .../cfn/app-infrastructure-roles.png | Bin .../{ => archive}/cfn/app-infrastructure.png | Bin doc/fig/{ => archive}/cfn/env.png | Bin doc/fig/{ => archive}/cfn/pipeline.png | Bin doc/fig/{ => archive}/cfn/svc.png | Bin doc/fig/github-environment.png | Bin 0 -> 32162 bytes package-lock.json | 32 +++++++------- package.json | 10 ++++- run_local.sh => run_local_example.sh | 11 +++-- src/App.css | 4 ++ src/App.tsx | 2 +- src/__tests__/App.test.tsx | 39 ++++++++++++++++-- update_github_actoins_variables.sh | 6 +++ 19 files changed, 111 insertions(+), 39 deletions(-) create mode 100644 .env.stating rename initialsettings_aws.md => doc/archive/initialsettings_aws.md (100%) rename doc/fig/{ => archive}/cfn/app-infrastructure-roles.png (100%) rename doc/fig/{ => archive}/cfn/app-infrastructure.png (100%) rename doc/fig/{ => archive}/cfn/env.png (100%) rename doc/fig/{ => archive}/cfn/pipeline.png (100%) rename doc/fig/{ => archive}/cfn/svc.png (100%) create mode 100644 doc/fig/github-environment.png rename run_local.sh => run_local_example.sh (63%) create mode 100644 update_github_actoins_variables.sh diff --git a/.dockerignore b/.dockerignore index cbc509d..7a5676a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,3 @@ -docker_test.sh README.md .gitignore CODEOWNERS @@ -10,4 +9,5 @@ LICENSE src/__tests__/* copilot/* Dockerfile -docker-compose.yml +compose.yaml +run_local.sh diff --git a/.env.stating b/.env.stating new file mode 100644 index 0000000..c7d2d1f --- /dev/null +++ b/.env.stating @@ -0,0 +1 @@ +REACT_APP_MESSAGE=staging diff --git a/.github/workflows/react-jest.yaml b/.github/workflows/react-jest.yaml index 5ac81a5..6b66409 100644 --- a/.github/workflows/react-jest.yaml +++ b/.github/workflows/react-jest.yaml @@ -22,6 +22,7 @@ jobs: strategy: matrix: node_version: [20, 22] + env_type: ["dev", "stg", "prod"] steps: # checkout repository to runner @@ -40,5 +41,6 @@ jobs: - name: install dependencies run: github-comment exec --token ${{ secrets.token }} -- npm install + # 3環境まとめてテスト - name: run npm test - run: github-comment exec --token ${{ secrets.token }} -- npm test -- --watchall=false + run: github-comment exec --token ${{ secrets.token }} -- npm run test-${{ matrix.env_type }} -- --watchall=false diff --git a/Dockerfile b/Dockerfile index c548447..a861e58 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,16 +10,19 @@ COPY . . # npm startは.env.developmentが優先されるがnpm run buildでは.env.productoinが優先されるので注意。 RUN <lWmsHG)@~9k1Pc;0KnU*c7J>z7+}&Lp_Yi`+yKCdF4FnJF?hcJ><6O?nH*?OM zx!>RW=k}ld?7e%xRkhZts&`2R%gKnNyu*L@>eVY0iEknbuU^3bUcGu9{uch_$*^Ne z)yoCe;j4tw+n1l`Tce;?uRgt!5D`*x)j3Q@a1Ea&_~ipNkr*QT8WcU}VOs~aFpsAR z$$2nW2B}cjElgxPOG%CA(3iDZp70BQ{`x-V_xs?(t(E7d`Aw5#0C?B!Sh($kcNcte z5_SUK1@C&MJj{q*eS81r>zB80Uz2=-{rUa<|J>xl){0dOi2ld3f8GRI zU*KW8%?4gYEMfc?T+ld~(|@%<67~8ua|+9M(uO}<{THYKn*`y1_sZzYm#_llwcqsr z`rDt~#sw%K{5K5V`}eujFkC>XzmJaOWe8LMIp9Aq|34kVB=T|pf5_A~G3vW^bk5dr zDh{S19!=ZNo@Wu7J`r(D42&NqUYV4VyY1NOv8&BRPwfuhKLJMwBeTCf+Gx$2^>Kh zITaQUMII#IS&@XVPwwq6LMHZr=LAqqW>J%$Yhq5;qFxK8b!%S>3BZiRKT!TuB@AkV)*`aH3hZtBGx!b;m_0&;`-(NMZufGa(U@49dapkV?& z!mn_hp%S+74LdZXPD+xg{zZVFV09GUFwU8U^d9YcUurp~Kc{G8thXhf^xAq$l=OtE zF6J2_X~c2*VlwJrNB_sXT-&Dj&Lg)CmwNdu&-FRsuYLaIKoR8^ zR`AAA_b{yFLh=r4++ceu0@|k0+be9^xaR5aKzUt#T_|x0G7Qzo3_{zPN^Oj!on7W? z&7y^4-ya)Zjh-(oUx&DVmk39`FRhKk2PX{DtlV-FGRcNv`z#;vtu`o*n!l4fDg!+< zACTdc>uf({g7~BWpLv@_c-WdDL>~ z)%m+W4GUp|f$5(VqM) z;X<>+Dl!#S@zr!Cvo3~Sd<3{2!de(sMfJ(+huNAn0iG9AC5u4V&(YcKz zKHm)C71&c?#&oOJ(9u&_M`_b(NNn$$>XbJ8(Um2r#I4mged@qFSUQ9F9Z*%W9BS_{ zTe)31v0fard#;Xpe3wdI(>vavZcaBjEn@RmBV~STM!3gkjGkFvr$cX8i#+hgf z`8Leid)8Y?qQr`}aXh@Jbht;*Dj!ZYe6+vO*@Qa9(+C5TfiES%fV_6kMCd=$}{2E*+BPE&7aTx3cYd7j;+HN zc5fqQR*iG*Q4|SJeiT1k0J&Y0)6UH(#2R$Ywy*9_v8-cy&`lDyx)$x+9wE63lJ_Zy ze2n7!cm=!E6dYJW4EJ$hU9FH+_@Fk&e&72t)x)=Ps&4vM;cVe0K1b9$W`U*4#t2P2 z#DRoziF;`AWKjTnSHj#yPp1p0$m@4H0Z}7=WlxnAH$L>?r#niT>vMSUp-)tdV#WYW zQu`%q%Dj2-scLhY6FH9$HO;hFIF!IKPjNC5_wv@pbK^=Di&k?x|F@~+n>58|qRh%mRu=&2y4Bv>F&S=ag33LD0ADuY%dx^I3u47sFIzFRUxX{VN@ z$Tq)#)CcL`+r((p_nB;j$@UZB4j9(k%fgzUWT=#ESZ4guw`Gi{{aeH4eMqBn1%)ZK zPb9~bsObA=-@;iPOe-zU(Kn^6jRuH0H+prO6o;)W<1fM}VmB^vS)&#;DbMcW>a-BU z7E$u)<(-e-@)_uKoP(>ABI7(SF2Wck7 zyIBB1V_H5Yf;83QE<&3V&95fnRnwhnAA6KAv62W#w_Sn%Ook2X4r`7#NoPf=!N#7t zRXaLq$gH(c4ekB9`lPdG&$|=)7u(%@P!cXVO_?< zg*P$9$)yYnAH5Z5>gK~ckB=Mj^{IX$f9?+%NnaevZc|aW!u?d$_CG##_dgb5j0tu+ z-Q#OLD}Ln%=$960RJ=RWTN~7;MOxb&H zTOjj5I(YvJ6 zbt&RU&7lZ}j;tq=uJ29LB&g4|d$Q__=5!djex7ndxp-=psBPBGSDD6Q2o}|SByLTY zM&y2=&!qdtl!RP$$)|7}GwIDEoLBIk{@yYFXEc6%**ObYsyY*ONGouBN_=(gk~%Yv z)(QQo@o@FGKH4TFi%CN563)K~Uq;w>fkU=bXOS_Wp34B)YJC*NJYSr}BT?+m^FW9) zZ4##;?9qTmc2!YdP`(tN4kbx7;so;z;hV%KR|b9TlhLh zW}`P@Z+qY_0}4hBb=NlEjnXo{LSIB(F3J?2mp0|7JaV2HJ)OL@F&=-1qfmj4r`7i{ zl{2>%#3S=~>CUmt#^O4Q;9#)K!Dpz{V>6KwFkm7@n8W{MJgZDPs1t3|xFiR(D66bz zuD28qTwV9llJ-(*8Mx?0(KVi;F6?3T;7%KO9H|s>9(*j|>5;=rpP8}Prq}sgXIo-_ zaA)BoN48u4Y-z-;9SGf@T#|22QZAR+X4A~6*3;NJ2|9-RQ?t%g!hJ4&C&!L|9( z?gnHTT7S9;8QibKn*w+Vy!9LEF=2S)r8%->GwK$I#?81kS8LaYA~R2)PG!|R%ip&4 zq7=0Cu%|5#fz%AlkqbntV(yw4BN_ORB>25qYrRl3{-JR+!VJ}1nUcj zP$J_^s};%Q((v)PVRfC70+{GW2@Ks8_NEltQuspYIWN`PS$@dg^KLxdv-N@n1CkGp z70iF{A{QqLnhzPM1UB5ouS3qMA<6bbygA$P`Y>i1RQm5tqAm#WZ_A8##B-A_Ly?@9 z`%bq_)5nfdhE0jX)&qr42i6*jhy@coKQCYTe#{h%$loPB)q*10w$H~ttrD@Y%m9Sf z@*7Wogcnei4;_Dt2W}T7?WiVm;t;@}frOD=rUgD4I;qg}zyDxtr^?#VO=f;8w%Zbl z68IxNQG>qOkuHA9wXVl}HNU(%OPH(K8({?m-OL-|nO_|rDde(s?3w==V=M_$e?!W%9o)TIHIu`ANW;cmlq~HG5!H@v}dWU-l?s$RCwbB?K%K%=t(4b8J-un)2i+fjUUnU=@L2z7PvmuY3bKGVELxx#TTrIiELN#h z*MLwOAH=}(0aQnExc3#?RxmWR1)&Yyne9j}FlxE|d^b4t25xD0XM9zyiZh_sLMq5Q zhq+)Ava@~YbVl)MjRA+lYB#2UO(q!g!9v>U`PBi3?uO2H;)Y1u^`b(!W~qalgS=!S(#NK92&rV`Xtof_!9(EHf(H0i#Nh@xm?G9NAf{QdC&dY)zNQtZ4RHd!sI zr8<)&0g7-0nFk2i;SfM!jYt8;-+%smZ=>`Ula8J~jyac-jEwG)EtmN0ccpav>^oXo zVNqEdBAQ7Gx=Uty4}Sf1^!?qEV-ayYcJ6S@=^avA9r8?pAH0QVcI4}MNQSZ{AF^7^ zW4y!8SrVL!E!SsfPW2NFYh5jwVD8%_yHsG3#_kAvUDG!*{aKUmXGPyALUYx>sS=_8 zxs$-Z=0{h3Hn?3+4m*5)S7=HcvV5J6JJs!Ej=-9>@{rQQk5O(>_1iMSLrChOf@kyD zwlLoM#Ox?N1d-S%NKhq~Q9G;0|dH#GfARmw;4F-rD+jrL7ezm*QDcx%}G=_ML*A0yT{IFl-(U z>0g38GFA;Z5y@cdIMoR|oo=C{H@DKjL2FIOn~dh}u2eKT z6Dsz>Is0~?zD;_gWKuK~EQZqdBLd`?H`AEMHuc#LlQQp$nOO`B+%Q(`9RiV-gQwe= z$vF;ltTrWYh%|fXyX=O4=OpW&xDMQ!)y3o!u?xVn-8_)}#Lbzk>cYri`km|^S2Ua7 z7L$~9j_m$*IW{KdIsda>?Vba9{^_RGf^#D7WVPdAUV>@-GiY762A9#`ySrUWV7};AyeAK8Sh1?%J zfhU5vjwDOm*Ep-FCz1{F2Tg>ALbq+g`(~Fv!=JMrKF9oz=j^K``GpwhE2yGXpzy4t z!~)=0k@pDXJ29s^))TI57knMu{_4l)IQgt=J6>JZTIOI{jfEAd5O0c24+b>5ES$R1T4F6o-PF3|LuNNZXM*~F=N5|GZ5$g!2%agc7$ zB+ua42L(?2&c-(11ZUCSy^1*Im;JdCr?9-59bb0l7F$T0&LbjxRH4Az_B(e8r-mq} zvB8uu(9;RR6xBILo>m!q1-m8j&xpticV7cxjA452xOlgh%OoDCv6x?px@3~_ju?!a zP@U9Og!rYS_)96}3H8k=h46>dXdPLe|9Xn&h->kQK=KZlj(@8)(xi|l$~zFKy*{9A zNXx+7crxExms4@x?n_@JSIWd8Dyh(9u9}j-%t66gUi!379l^CYk>%n+<4Uyc3e*+Y zl#eN=Sw^)Lh!9;Ax-8bkIC#SmXEBxdR7S_ux=Hoa+dV=zOtotd$xJ-yWVR(YV#=UnRbRDgU^oO%D^qee*=Qch#NIjQQzO_zW=Nnc}yen){v zcha;`_aR~}t@UYFDB8jgr31lGJX>sWg7w~%%=*|nMJd^Y`^kth8Dg#W?@kRlW5uXu zy|S6(Agw1Xly8>XU((C{_E$USsxl)%Qg}~ z_|w5s;JKG8;$`=IHxE~HyXqSV$2Qwrnm zV>cSB*kr55>pG{7PZbfrXcNz>>d6l`nr^1?*yla>`HofKm>ryY?UE|1vMv@z(kh;} zR6v|JH;evsH~RQpyzxDfrrn97YHtE8As*7ZsJfj6R){u)+yN<(!(wBYjzC0R#+Hc5 zMa85V*VnNt48!3cbgQ>q^{`c2s-v~5#WS^_X5}^-9q0gB0qx49ywSB0^oj_S+ zNexf6{puw&S=$QHFa_N8kj{S!bl5y5RkTW@k?U2#lb0v5N@a_2+wCOcOx(qmecr=e zjYx}V<;gAw9JwUdv=aNe*Z@!T*(h$U?d_-}1!~NkFg9MR5WC_V?7LO&x^OI;52WTd zpDkZ6AcH+aPr>!B^e3Y?>Evdt&ZvZa;uwy7C=I-jsq}BG@8XL^;#umG`fe&uT0}qI zFjlPbqe#aD{A<~G#(llKd?oEkSti%~t7{0)oogG#3%3EvXjpKEht$k_fcretjMZ@I z+j3icVq+Ld*;1g=pw&=i6mo~>HsN&pjGMI4jG8%&iPy+|D{7oYm^!>>_%gfPs@Esm ztiClq*rDk{7Y)f0-yRd)#aB#?s*MqZ;&>$xBcK61`NGq9i0i#q63hBA!?-#Ry~Sg+ z-GIwZ0^&Dr;5$6b2lBS-AK?^N=>ssCq|Z#PX~AbS_b=THfe6!>BrY%nh@1u8SA?04~GXM>+LSpHv6`RK%|joAFCM$ zZwlFfmhzoPo5KAumsb@HwqLJ+#zlE;Mg$-5zmHCPSJhbx|{+a7;B&_b27@sKZ6XSQaRPuIS6JG)zHBZkCVTvELv*#P%=f*-hmrfe)xgnuuf zU*7VO_(ny&ryI&VZt9VxiV+!Ihef{Xm#Y8@zuo8Son1ivjQdZ|#^3;BAvB{2lG|#~&K~@k^@y@ABP3 zev$8X7!ZT{@4a>vdPzLG3$2lB{vn1xd-e$y2>*w+#JGdw{*DIz^n%v<=`^P7?_%Qi z`$Jo~X(Ez;N7H%#f~ND{wO{4$b2v@t4{gcIe9r$n8e`B48sl5A5$%8W?B|z}PcJLN z2o+_t!r#$wL|)KvV0EfL{7s;rO#jGd{=ZXC994e(H>uw8xh@dxtX)%MQpOQwrPr#o z#_p(o2w!j`g)#2Uy*D=0`3ucy?02@@nIypBQ$5T}h9}QZAz__>p(-cyQL1C1c-ztW z_$Dl1XaCeyKXJH-_w3a!jw8h=QtbK}%go%B-tkHua*08TKP=0vqTym_eq#N(&~|BF zqCZ{cE-9nBhkJ&Z?hLp#eplgS6Az26{}Gn$R#P7M>ovsNJ~klp`G?*|`p-V+A%)aKC809*d-teVG4GOv zdf0MDJQVkJ^>}j^IJ4ba&a7I2A!VtNYv>t5wM))YyQBHqsdFyu@4aj$>2)$6w0BN- z_lo%z_4Sc;OzW#}D|xfeK4r?bMQWPuuw_*HQUivGIDO;Jq)Sda?rt5cq?L^)BeTtehlx$yH~C)+3KA|GdP5ZQ ztxpA-LlrZ;yTcEhYxJD&5 zYFi{oB?G_KN(1-kxGyY|CPjUJhmA3JTdewEoM=(4@^n9s5!8+Ow!L#zP^+H^wN+qN zCdde_8_E5Sx}gpy&)?{N>TQyqN;!%f;99T_t0p~)g3-;&ItW}9oAssr=1HG2!=pNV z!cb%keZT(gXkQSuJP^lsw`C%4PE<#y_kq91)znq$9j*x-o9G^2HO|g~$wgrxOAgy@ z(fJOW%7aG;(g+TBwHMxIOT2`m1T!^jm{a1j-j{x(98G8Ar~KBiir5k4T7S%R0rk#a z(%q)LQk7;7AK`|LfSVm9PeU5Piq)>@P}N2|h;D+cmF$_T;skivN~RQFGL*CM;(n!u z=Gg7}`4Od+mNGR(Mwxghq)x9J>@(+b&4M#ZY`nPf6c?$@F>9c0%d}d$T%mQ4#_ixr ziX>nqQ3V@~Vnc9%#!}`XweoC_6v(K%-Pxc1z*i3^ikzdtZg82Yd7C3jlos&lcX37g za9)726J7vZdqAtL3BnXn%%Xttp8J&@I+7+>AKcWXId*ZsNf+r-F_4zo!Eb_gAU>V# zzB*qjXdhfdyV9%EucwfQM~ZE;wRSt0#@iO3*;^|aBlrP9ISQ+kRc_zo`{YO>SDOcU zX1fYU+sDoGxf^=~9-sQKBT7bx+X-e423$$)E`?kPI58{mkl-_|R7{^Q{Nik)-Q5^l z%1b;JFVtz4n>CUlg8tTZTVRBXSPw`F#}V6%g=0(Nm4dp_auvvRa5x0wFG*U;XS46Y zVBBq#0rME6c#LqDu*~Ti7fjU5Zc7I_ByajVz05(dBtKqiQR_ za77m!P6|3OP60+v+D;ax@A2HCU28WEG;ko7~J$jV2 zDs+vff4M@XLnj<>9H}*Bw6;2LyB_$V{P+tLzRWWew9~l#DNcq(84WNsjM{zE#t6j9 ztUY5pvc$=fo3KzYWw|iu72d+F;C=EGm`}T~YXxoPby9 zzSZ*zqwh((Yf4p$(o)v^9m9pQX*P*Z*=x^MAghP0&c?(xrj$Vxiix z=tIkPNvx_`jgH6f4{*?ObyjLYc})fiG1r+-zcX7RiyBqAyw(^^!157|7HJZ^5wg;X zMW}vCKAvM^#KfyZ;PtwGocNU?z20h*nP>cx-2fNaLk}xsT^f#$BaytLR2dF?X8Ewv z70Y?EGu2ZF`PoVSNN!cdtbPN;I$2L!p;P$h^rD3C$a*KYECaeyEkVrJIn5{1N9z|= zEZX-Fa!*UG-D;&kR0X8#o~f?`((;P5_KVv)vVgT&X1K}O97-)lvnDEGrf!$Q?>3=| zAVu+^Sm-13jvB{q%n){{g=L5!#OK1J2q=hF$@=>A?bUkBtu37xl17;=-ia$qkFO*?oZ}u2XKPf{`F81DoQG z_UrlQ$`uY@filfW%L(~I_~ETwY)J6f=Ft9fxOrfwz2*(R@}RQ*?}hJiHC6bQ3tm-0 z=E$}6EY)Haj0~bmY;OQIA;GELEVhg|F11gnMp)YYYyao;0ln#Q zhSt164ee^Hj=8gV?ptFY<<;i1aT83Pbmr)CL>M9VA-anZSDxk6(WnUPefBFh@_=E( zqY0OwTQ96-O&9$svAyda+=bq@K6b3*8*(WDy52U#it*}sOHc12*j(>4Y0XsF_5ftZ z+50N5r4ngwTx{Ku?V_`GfQX7);(o4_y{ji@3cHO&@-!E7_nO-V?8-KQ z0;P@Ej|a#+1PwgSW+9V5hZ9P@4VmpYf3P1R-%XNf%dRp{RVZB5+*)Lc$e`Caz56MQ zMZ`s0u0t`%zu!*5b(Q%A`kmOV!jQHZSyx8xphE3NKKeT% zjHIuCN~KfL#0-Vk{euQRapr`Qa1w@67l<{kv^%oBP>)pE*_9w&c8+(f>7jW0W%;fZ z)Y9cH;p(lLW0&zG$QgH(_u8%fV?qp*&V`h8r`V<{0R3;Xs%A6Wn5fuzom1KDm?*&N ztW<`%%mZ<6ldtX9Y_==0$*LtR&gYu_cS6faG7q&!p~lRzsDO`i5vYHcTCUWa;_3+yX4 zlbsMu9CRV?7d?S5!iaCPhRjVatpJOh6xD^UK6grhz7A4Sb$XV4pGnZm0v<_{6i584 zAyavG33_sN%`0d}N9T8kX$~$kubDzH_O%QVXG>DP)xe|dajmQhjj5pJtVmRX83)a6 zg�ptv~&2V(j&Dvvg`lXz(hQuO3|7lK9w))!V%3f;C>Y-doXXFL*!%)nQY-*X2*t9>F{j)EsMQAu)3)vHG_u;^+u|66T=#3OHuYk=mD@<$Df z%Rc0tLvSZQvFxw9 z;K--0nay%nI6kF&-kF;F;t$4YhZv?IY%gUEvx8ia1Pw1nO1~x9($a& zjJ4L#8|Mqr<0WXP6VzZPeN;T3hMXmXB!bZ;96-BbhM?J=-mkLTawv~;Ci#nz$2N}lDFL3f@!@v7_LOS=+uIeCJzrLNg;ps zl|{yLbj4HKPnRq~PAHwx?OBfFu?nU4_k5wvy6E`}=o)Y~uqBbB+Hn&lM5XLU9Yug9 zZ#^(y8et(Z9Hy+wTq5w!`%nocScm@)q)7PJ`TXkKF zARxfW1vVlNWd8tCVX%k1{y2A(8_UG;b*8GDE3@%##4tgX zW}a>4$h8om^x5P!0{?^Co|ms6w)L;}b<0|YV)93hWU>BQoazN)V~s!sBpHHt4GJbjhdKvMV!WZQUkI)(nI^kCvE3ud#@LraX{!%tf$98bXyC|; zRZXrE`#h`Q?&LJ&J0|v1g-83ygmJ6;Cl6=si;k0HQH~Lfp^nSzOp{L~q7;v|CRbXP zW$SxkRdn-C0fQqAZ)xJ}TbM&ALcOBK8~3%R;=1eYc|S)2y860e_o5d0_#Q}KFF4O7 z^yA>r-o1Nm`b^%f+msimwb^k?Dx#T4DckumZo>q-5g%&pb0)`(iXvIG%M44HUa+#r z8H@~6-DjYbQ%v@BHrG)*n*hNQKltsAlm0|-Lw7gEdumhJTi)Gpy9$xqghz{f>?fUk zr>0TDhFr~Q1-Jx(mgHARqlH}FHa)NtnUYpnpKDBn__=fLGemCpo_X;#d-w+xVI&`< z{YV6&I6M=)R8)!tz!tZ%AGod=2j`b*$1rELe}|T{^SwJI9eBoFSxm%KDMjEAttK&b zH;$V=P&uls&<}pTMs!_m{5tn|!3PGWy`7$^m3gF6*n69y=|lQ^HT7G2uB&ZESMKK% zg<8iAsn7ye6)j^oictUT1jBt(&V6(hLQ!AM`Gi>%~ zYDQZuxO;h0&HU|xK#GT|3?^{Y&n)*ulApQ!qRDIj4SGj$o0j&^%t8$zI+d^Sp?GeV zSKSkq%tYdmpgYING0Tf4r-5On3K|jw%x@J?*IpWbdq|Bk}Q zRdRD-i-7=)gE|2Iq!&HM_nLwODe| zx#__rCZE)ILC#O{6)Mv^ zC4$h&+cgbu-L{x;%GPhJ$Ps*_RSwu;MHMQqB0pq_cInAHwc$aFN%zKUsRUOm0FNOd z(}^n<1D{G-T^8IyDZVr`HI9lwXLhm%1;BIFV*nIMDJzfX^^PkY^e}O@6*jH^iJe;A zmqmr#419>okC_6R`2jA-z)}$)*l&;^4bE@7#5#~0$ji0ob$_#3ioB#ai1qB!>)w^_ z#Hv1agMfWvKAeowUZaI~9cb&1U!p+`{N1<=O1^`CbbD@{HPdRV1lr8#r?kJN*sbk{ zXHPybQOP0q6GzDr))q%Llx-Cyu^M*H2B;7^HP`|vt8B+G_jUqoJ3=I`DCHs2cPT-H z4_wwb4uw`5tDG(uyCK`9^Umn)j?K|nOy_a=7eVsi<$8GXID%*$+u*t$(kCVf47OZn zD}~PBn8q4TH=mEd^n+qS8@*C3(ue|5OOr=iv6GC(u*(ipZfEBG)+qZ&c|v!HglD{T z!u==1=6n}`COmBmpW3`_j?Bf+KsK|Bt#x@Fzd#YDl&=FQ;OY0JQrtbQE&!xrAD3)q zEa5|1NdW2+mkfS|_;f?yt$^eJHwCPAEu>}w+!Bkp>*II&(;0MkmsDi-d8%7=BZ*r< zThXg^=5%C|N8cP%cn^Kn=!hm}tc5|YM&Xb~_7FDn2~~)bKPIF9#|U-ro&_AG?U6j! zly$K3Yg#sow47m6nV%jppYQC@I*G{%3SpbyV_yjxFHw_tvL>?94wK-K=RQw&<5%0j zx)p>sf4$;jaRnnkPCwR`X52KCj znvGFAfI+-C^ZzO)Dg(_CctA$u4-dmr?3Sao6F4hL2{J8&>GX=km`^EWU6Eh3g!!09&_5zb46vFJPDlIVrzv)s7 zcUJU(ON09vwhzij(fjA*?O_du!w4{V9!pYXZ|5gnwr!dzX}MZ0;6UllVTmO%{MTi+ zRxl1}I#td2h>%;OYEh8PU6rua9rYwDt^sp0pcZ$%FcMkTq_Nm2{*<|4=5)Pf&`vfX zLx3Ulk$89YN~KLDGp0BVlPBY7%!li&iQP^J($!+NZoMrdYX57`?&tZ zj(v^!dSX%>BjalX-3+-GRx%0a?_~UJnZ%W#S-JJkTs$R|x`%-IeKCPcbQgEvBV z^>G9&XWq6Pu!GRuW7ua=K26TUn2|kO%}OcjD$Gq3TNmk@RwvHC5DANUL;nlKLs>~n|q7!RxcNfAV0$%A1@(tkg2Y&$)pw#u{^x%-D65Ne?f%{+g(x3179sY zL9t8TY!-=Ui_?2?%FFFd0DNLE@>lpH8O>(KRYteS$|lmdz+Z3=pQVe~EMR=5q?2_5 znv+$GZ)7jrrmv7ze7rEr(Q=tB`Qm+W$eQqb3KE)Yr1uuXf->xNF?-U>V)xzj@Bq!w z-R1F;z10)b0FbpWM&ii5UV%vQ?j#q3kz{*nvfrhICF~3e&L5aX z3Xi2R6s2Wn;BHLko-N{V#Corm#xe^JiCD`8sR?Ys-_?)&!s6ub5|tRU?*_B9mz(xe zfR$xv7ortqVrLCL-N#QN<@EDK@XO<7gF{&+CtIl#Ses^sFiTX9`_(eypRWYIVNOX_ zpXu!#gs(D#r()f6zZociXIRI%MPn?6b5el1hjKsfeXcg|P#CAZkEnUBmtcAdE z$u(~jG-c@3_&~eru)PLZO^mcuLN7@=2j0mF)HjE?T*V z8MR_>1VTR-o+H}ZK?ngKg>#m%LCg#fa=S}Nd;2}HEwXN?=x7^T}jcBrPZ;iFjKz8~eCW<00Y|@X6A+Njx;1Dwtv%XG zK3W3mK2|CieRIRk`+>F9DMk~|CJLkBM)7Ws5{ok!G5ugPmKc5a#7j=Zi&+EpIhmtH zc^l1sZ~5X!i}UG%FZzscB6{$o1MYH$RmqkmCN8VpC}y1?iYRRZygk_p)f{>+&{V@g$IoUE6Y^T6Fjj*DWfwmpzp#kx$b`)85QD%sr zu4MTLiF#jJ995zBejOTbpT<+wcdO}>dWuk>hE1PZ%2!%h$&e-;NVj*(DlcK9&}|?(=(kiHPNQ;ylnKg(i$#gZlMG(A@a7g z5bpV@9)(f(9@^9ykFafaZ^3>}yI75{4ZTSs8vBM>{HLmUkf;<@GnW0<4cw{11d=^Z+5*E1=0kfC_YH8ttt6o6GG&b z2!`VY6M#9FEz;f<)H43o)H<6^0>rbvYgg?xf_wH3(s;7Om5EmfLvBuoW*Xe{a=*&? zti>YpgsUTUjT3dhqOOa3n}&_3w+ zJ>(XvaIXi#i@j%E_BGgJJ0w}+k?*Xyb;6ttR|-b1tgYIUm2-v3WBi*h9g7Mj$#*zX zRgb%>p^gRZ%Td)mN7Op?97lJpLan9VKc(p}JXSrvRZ$!j8R`ag*56jyS%_9dTv6$Q z-@74UflyAOY6Tr;i<8Ai&nff8v=|N!EC#a( zfi+$4#nT{X%r^uK9*9JarGC zV!5Y?zW}Q2qnVqgulyVNzJQnstetIz2jHnw?Y@tukGJ3|B1z#n&2~iS1uv3KrxapT z8@Y&~dBIWgYKBZ74&Oi_4z`={q*s)&ZN1=kg!i@C35xRXw&=h0L)fXzy)!+a%0vT4 zpz$^8FrVe$`W(z{u5NvDTKu|d>~E}}UJl*WGfpdv${Wc|+~u5%(e)-VHpH+qgl+mK(YmfBN_WEV07MAJ zpH#bPo=nXP1(M3z{h!bH%?`Z$6(7aauxtC4%27E`R>Sz&0mM6^MnCCQ$fxus^_b>q zy4uYZ4QcqFEeDQ9p7%JUA%Fsr?U1D1y1wFp!npF-K!m;qGKWD)@)QQcbVY$O(v9o} z9rv;}6f)ppro2;Ljz4k^v6(Uy3j9uv zlH2~Fo67@#q8RQ5cc^h0BKWQIlRUCK+DUeUWiWu5SNZ}Jd!W$ZAC-Q?bwIVGPve|F zXrQl{@esclts0+uyz|b}lRz#<>PHv~)xwqV`F)v!$H>HwuLi{bss-?%HmdpNLamQ87aP*DdXOmD{)!5%=NC!W!)l}W0?4vJVA11TJnQu}sId+H@V9B{PmKqL3wQA|`hc~geZ7jA@ zPVYfp&vN*Ts?vr=%SiT4%6hY3vI&AYBldz%SS^nz=aOL8+Z?b@N^%RGGA!|UyW?a9 zQ+qRsvHJLKDEgl9`o^02!qN0tN9m6+A+WX9vEm9=5TgQHqHj;{(IU!qMg&z$JYcw#iJYR(nhP&P=$` z<@VEH0lwGLjp%lyr{17E#i+U8VAzps!7jNzoAZtnwNs`oTe6j|66;l}pmF8Cco@M0 zjHO^h2i;PjWuMAf9gi`iB}s^)lxelwF|79rZ&21UrmI&u_f;T3U#ll)YdUbl$(T`U zN{Fy8ywz4oJ)J8tQGh<8`osu4C{;@v7$L@7Tfy6&c`j>e!f4%A5$-gS@|!wi0<+l^ zFV#A*#?_QQq}WSqmosAbv1!*(l|0;G6bzQ*c{m%E#Fx$-zRrkFOSz>GR&lp8>is0( zeM8-4TB;wnK#WefHnQ*2w)tJCAZ#HIDz?L52133E9IA@nGT@!UhbrzztNR#fCH8$u zSat@XQvd#DYyD(#dAr5hrXoe8VV^Q7?=Kz(2&l%+e)5L-k4@d9dL*Vt_m_ zO5f)5={~q8c^9MJWjyOI7i*;TItQ0KHF{ieIs%sG@Nf(1)ipE33$t= zrQXA7hP01PXtP%;dMJ)qr~UfPy=wqH%{O`B$%Z-CU7p?DvV#Vx;)KX+pu5rv0sVPp z_9P{OyT!I#iY0HIv>9Xht9;G&WT8j(OpxCX3Q+hG(V-@rpQtFMk(bBMk-*{1$gJOS z64Hx$dy%$wr?a+6HTS$c1fmJPrFYVItH_Y1@lqC$VDG|0rEvZJwUGam7)cpu!7{el z4uf@8Pr(g-dg`;ZLC{jr;*dP77Jgu8znUa_vTWT5$NO#Jx$xB~eNIS!(W9%4PKAuZ z^0y=Gfn|ohw@~NdjrD`N@Zu{^Mo4fo4?0ebeVk28KnjQ3I9x`D?fn-grk}d-IYoYi zEEC+K(p~*dil>fAqVtg>Ab`T_pE`F5nth>)bZ6Y#8LrkmL>3A)mo1xBwIO61y%tMP z8j@;&bK@@?^kpDFdc&JlSk8O9Hz!s`>4>*5oUKh zGtOc8*=O7PN&`3$DAB}!I>S8rJdP%`sW-Vwid_WDp> zf>Z2)mo+d$-vikS)EecCRcO6l(|d}tOU!KYIYZ6I0CU%5y_7o*t?4hf!Zlh`1u3S+ zPaWow->sM&XDo>NQs9ZiXudF!KPqP@-5j2Fjd5PreEs6ZYdqJC!lttrAXIWv$f`CX z`Sm>P{qJ|LyP%d&#-K-OeD6yBBcTuK5??di0$_*CSqvE!y99Fv!xY7|EHm|Io~!ce zP+`=Xn#eVIPHXagEWhFBi*s+lI}%!oauhwEsK5L^W*&at`i?WxGn~3%<+up zxyP9IJ)URI)z7K+5S*lF#;vPRY0Ez&xtdg>-3M*X!egg<@XgheN8)5vtGDbWL@bsV zPcb!V+*VLidVHc!f)XeZ1mbkQ}gNsx(F9u2e?1#9QIM*Z2~b**?Vafyq#gh*$dsCks|GP_+0aUZ}^> z%WVfwo1>fe!rIP z_Z(7F%w=sg&(A#2mct=_;%mCs$i+b?JzhGqPLA^>F@z?5japohk+y@2{m`#9MzN8BK3>rd{kpM(DrF7cU>6vL!if3ciR9jL}5pt8q`HOb*e{ z$CwZHvblfL+wzTkD<8wm`}${bBC8R|Bkb#WV5W{|=F7D$6SRsMu}@Vt26pSKOp!~c zKak(c4dXtG`A6}i4^~Gn@E=7hM(shFf0jSePy>~w|BF7r%RG9s>1$CD@78AS{`ge^ zYT)+;zWDR6N>IqJ+FJ<3L5%Zm4+>=9sqh_E(0+sL+2AIv&RbbU?}f>ysDD=$|NUsh zug_3wq1IP~Mb0NotJhEFb3N4bD^lN4lB>9Vfc3ATZrG6^*4)%xM05OoH|%|KGGs-T z(uL^edv0d5Qo{c%Kz%Pd-|8_vI)a_Zp-B6#T!7%icR$F>)#IvGWd0%FswWsC-Yu7> zq8a%f!clh1uY&5ucE7GqkC&$=bRFbEW!ihWGf@KrReQ4tvS)QgW^uP|AeU(Pg2bY` z{n|B~MNhrky=_AYTf!opZOkSRrBjKt)XsR{-P2eYFn!`=)NPo5Ks91XyHHPG9Punm&+kl(6n$-@`HA zdNFPL92_s$>MF~c#7X|WV$V6|g|%4Ekqq(>QexQ|E_4`gGt{w>^;8!Uz+$X$@8t^n z2Ljyz2qiW$%6Y^nQ1>ug^s}fuu5Cu;`Wl#lnh~7Dvddi_#cV zm1tyU=8g$3illS$_*I9tD>Jg-Lp3?*s2J+_Kr%Y|?04QQ?rfgJACw$J(d)%coS3U~ zaX8qO$(zH{_6Aa#d=2{s!#_1GM7)122e>6AjwO<`JMF%B#lwzrruk3Uw^Qt1hEW$d zjgJWzb@VKzHwg}!Ikv6N&xvv$H`fY%a`eT75#k{F~ZV~CJ*R@H~`MazEY`*Gi@yI65 zC@+b&+nuM2FlDb6`(`WI);Vf5OnO< zJIG{bA$qvzWTaQbO?A$J54k?~uYXz#R-tyXU6XW_%S`%{F~$}*Hat14$vq)W^qFwTS8esTWWYHt zL?7Gjvjir(e3}V18>h!Y^SRD5zCny(Y|?bCt+zeVDxjDoY%elNJMn;w;R~E=3bs5w z%9a7ztA|db(VJFT^+&$QTUWut)?OlEm=6}b&4^}moM~r5i6X@px~cxTkFY%7oera} zWI(D7nbzdSnVVlyk!53kippr@c369OvbZ*quORdTXE{SPvUy%sZI#=VYlVMXO z%S(>xc+9p{FSCiz);RP3u&Y4oR@cc1RjiY~F%U|{2wfT#GL>P?2I zmoy4Qb^u~MlINn1=>~gw`T(>2`^L@o461|D@>ScOG4C**SvMF#Oc*!}Oh{krtGDundT$peWaI5R1*^bmy=eSFu+e!BtqXyHpC zld}IC%*4`&T2>8O&I`9^^e5qKv{rb7NYUh%ZE3a1;_&6ZO z0!>x!32`KT94%BfLPnG}_)ezx@>SSXVp?0x#==Rnx4ZD#<1dUseA4@TLD9|cgU@nM z-~!U6)qJ2ccaSo7Fe^w{Wrrz~(*MdeZmIN+8M|mMvj^_87Y|xgcG5c!1|A5s;604T zFoZ)@nhRpT`?a3yye1?7yr6FS8XiZ;Jv2flEOSZn*zk}`c;hqhKBF@Y56&E{SE&F# zJnV(V;PIhHi6|T$MEyzO&Pwq>@}oZJMa73V)h7rUMTQ#mQ0mV32dG$}9!?r1Klr#% z<4~}DHDP&i4<2;?PZ}zednT1Z3Gd}y)imu3*^SBa90S9}`hfSw#-_8=+#2O>u}#|F z=EMLWK1R$Sf^!Tjy4Ki@+jie{wsLp8Yj@$?x2W?&av>AC7D+?b6v2e2kB;V7Nn)x@ zgW4{Ke)eMvdZ$LV5%1616{&N`I72bd&aP~p{|>%THkJ+7lSxoi@!3J+@wJOrL||Yc zo*`4oYk%s|eC-VT?TKXdjH`)>03jFLBa%t!aIs;wXUpU3q?Y=@c{oM8Yx%*Cs?WF* zsDDq&w~KDK`I|(HTEXbVPv=e7B0j;-)r0-v2iFi9R>hKreFdXzx@g+~oR62b4&BSg z#!X+g3>7V^9~_QkdRF}GkdWdKjy}P2r3E=C^2(s|XD8vFQLRUM-tL@qLCwzSjmk&F z?3cvb*Pa)blM%_mkH4+#^GQ4i(?|dxp-U9N*jtV^l43OyYZY`G_X54tuMQ)Hi7|(b zNjNsTqqaxB-3+@~f9EN>niqg_fGh`P*lk9XdbP?_1PgC;&_C3J1&^(B16gIOTq?bH zji{I|UIVW=DRGu?RK5)QGtddz;9aXQ#Ayx{bffE;!pjhEO4P5fl9W!_%wP>Ur6f5X z>xdVG)+^IWsW*v-G$!N+@U|D|G!24Sz^VC@Ee_Ces>y^DFeIWnu7$PA)x5$?ri{!= zV>gP`ymJn4EsdC`P?5T6Z-bo#_SS8D%En2ipS@VzfrlQrI?Tl{Ax(cgptIup3 z=@L#lL_xGqw53WcV*bC<1SyE+GCviWyf1tQDO!h9+XpIB$MwI zYFgabbQ2He_lh+@r^*;uX&PSItIj)451Vw5&!4SN6>sFyvh4RONImRDzulfx@Ci8# zvL-7mbuG?%LArSXWMuCwcpqJ(tMRaP1`?XnJRItEp2X_c#r-+L#u$BnPD%N^)+_GRAkrmCGAi5vSGd5THBA%8S+_{qSI&_<{8`~y+Ws)(v?4Lhd z;#JfbpCT>8u{d_93LAao{BU&Jxgl3MXBth?B%Qu5y93>Q)%y41LkvL^l@OzU%3M0W zu?a0HN%+_v`M3`Ekr%2OFWWL~u$JAu!P(fZx^Ms_!Z@*2sa!n@$?1bccomFYGi#Dy zkf|1TQ%ST?*G|`%#>AH@(POxTJFGYFQ%Uu+BB^A8rO-;UYvZ}!+jCdi&9ZQZ6)yE@ zq-WDYynIupXhq{`w2S2vrQPE^X`a!zR$nf*EAJNQUQIAbDk!iU@;qlCMgIxMGFN$s*+L}_8ZfO1;rG?4bp-$uXWKE9h}njuD}Hm`X*->)KZ<s96@c zI1KPuzHyjIswSD5z_1JsWQjva8FT%vOVuE$ToYk{cHFq-)U8ruee!Pk3ID;zg1~IA zRs44HTVxRs>>_8d>Y8YdyjsXtii#dk!jlQorKkK5Qxg%)+nkbHMY_>pUqZ!@mpS=k zDlDyBaf;QutYh0EEQiB-fZ&eCc$b8hC7-mMz`YMb_qafL_H|q^uW+~I5rIKMbE{eo zxBD&rzi++r>&SLx$pRwLtBgvrPO{nds6Tw9uN^)KDec)`u*IcR67HpcIG$wGyrK^^ za%Lnwvo2e?F`2exCR>mniA%i>0(*GIUk_G?h$^G2s#=bd=XZmio9w|#Msd;YD-AWl*!je{%e$s-)$RJ9v)+#I zFEXLL&QaN%Q;gqiqv17g_ER^j;ZVd5)6Da2K`|n4%r3zoHmp2mAYhlNzn#4eHllGj zHYivSaxL)m2ob8nz(o5Jh(e1 z{yesEY6n%tRVw*76wEN2XBg$^U^KkJ6Sd5Dr7g4CtCdpK$op0##Z4~6nMbL~5uGaO z6`9<1$xmVyC*Ly9FlZ{hkLN8K@eSs_Hy8UMTs8_0W5m;@bG_b+B^zkYqp{!=%o01gFttD`7Grb$L$t{OqbfcQo&}~+aVty zn;i1Q;~dQ9>NPIKq_;PqEo;*pduoWUA(zPJTdO04G`O9aOlTd znt>&h#s}!8<-A@9-0X##?EtphEkktgj>2+9!vb|FCfeVjz{>!Ai%Vp=W2x^x9tB%$ z4#(>6&F$C4y8&Lzz-fdR`g?H#I%1g?pmlPVeV^eQ<8Ue1)UCQ+5W;an@0i~45 zBy{*j27v09O~<@@^*1y4B~4;-0R75W$^969`eB*zm zL;d1bJNuI8OI5amxn8b{!bclfib4Kqx@rGT56FX~UR-|mh3@zg;Atcnf zgA!yuAa=!nz|TmiIRL=O0}L7XtN0+K2btd)5Nr3TkjcKU2rj(eD1=NFh~eN0^zcBz z0(s02+|f5cQ_X#N2q7Sn19p&evB9GS;g@Of@x%K6+%!L7I4zBUG>UIB))-xTyp=aT z&IO|=D=%lW-g#1_-q2MW;PFHr0fChL*LMVbVo_iAqmGtAS^oFo&acHIkK?;}u3Iwm zwXVYKj0L8DM8ctvdi@8A4AtxUjz)(5I+TI4UVSrOyEv6%&D^~|aFBI^cE@jJ7X<kzy5?AR=MKMWf?3Xw~3d7Fg`#`c->T~m6)k{X)~t3r6}&#g&(tLfv=z`%D} zN;X5WPYJYdqm2A!-d8{3MX5?rdBcB{Mm}_TPiF4_N8sN+w|A=}P;Bq5+sh7FoF z;)tiIaB+}xbopM4%T2RPSMIfr0tc6ydySgAMfqd7KgSR+PPPxs1)b=0nnCHED$15S z?!wPtJLxMyQC;>s!*R;G>y@k2CW;|6M}H1qDM88d3)&b5+e*(SnT;aPuPl@EPY8#GuLdcl-OQ# zp;fT%eZ;V%A=vDFJC>zxlSq5!X8u9LBHMW!Xx4Ds@&5YRUeh4-D8te2#EE-zHvMsG zjmlt^U6QHn?e2}Ggw!G)s+3r@9YU&DzM{I39w31?CHv_HDXxAP4~M*jPMp}5d?KqP zCtP{|L(bMu42bMX*Abu^npW;R*7kryiTXD?F)@;~Q{u0V7B{ZKuv4cwCP<+U-R9^= zZ{w-WhAG9X91?4%$3>u9u9E`WoVDu{_&o2jb5c^Tg72#|5$4J~<+eY{A(1dSPDjzc z>d|Tt$n^(RT4Y4tY^fT+NT7W+<*^qn(zTn%sukQNVA~z0BMWDNG-qb@$=f?)FhO8= zu!^vO!C+Wh!O_N;>f7&z9U(J8_nVLzTyxf!zO0{fUDa$ISq;rKs%0_d2&9vI$?(7& zC&>Iz9Wk1y`w|KYORVr}QF!+1vulK{AJNUDydpQpCuNWb)83&<9;^DDU$P?a`ejnL z^p&hMrn>;YqrwymOW1`5$7gQgFmDluiDk!7Z|%u)kDw~oQN-F~^VT7UxTUicW{q1r zJy5vp%kW8@&+EPhPxc-($Z+>(o#)ejy3A*ZgkBeKJAAw?sSE)bsqLG?PbV z_XlcqU4n!ho*O@tV3VI>>kd3rasMqHVx+ZV>FjVo!5OrB=D_$>9fV>jy8_{ zrA~j%#gAJK?9<$j+tKNC{!k{RPM&*$Td>4FoJTJ0RFjq3KX~Knw@^AvEt0O z=)*6eMviA+rRKg^`cYLoSseJq+&AO)0L^aOsy(H}Wp}v7xH6fZ&U0-oa&vI;J7#;5 z#;fT^=>B+G%8q<6gNcByV9L?#l|!(ARjEpVxmI3Wr8J4=&V~vZ8IJ2=0Ot+J0 z^NMvP?Mf3eU97dY4`obm9SO#_Ss_f%OIUX0NVFZMpjMfXU6eGn$R_xbIUFE|IhLiIvg*D{>o~~@Ds#yR7aJXnl_}U1jZ@4~xs;Y`*c05g zV^?T;;Gge49)I4F38O#QqT{Z{=y_5kp_@`-$^9;WY|C!B&r^&%+f_K$_9Q<6-}$;n z=(@^#voy-uTzy4S*>Xe)^#ORZa;ae!=1S*8n<_|Jj`^D-2xa5j@Fb(5qP|lakrSNy zC+WtsO)+AoV_m9KQ+=8u2;=rApk4Cb>yu6y%|I`TcvJ`JJ zcIRj`HuJ&m)2ZQjD}6I5B68!&Bc$y@=ncn5<&%V>!MzUcGbd(eLsUFYhnGe!gUrmp zW>!AyZVckcv1BL?@oBQ!IJu@GY@mu?jn(s@8i#^6s++*;pE4`G78yx91hQ)g8b<2; zW!lG{o6DZ}KYS~G?`as>2yY4SzJa6l$pgc1E%wQL=LnOTLLg{Z3 zz%qh@tVBOw$e33hzPphf%M&Tw^Hh+)G}&~9t+%2s9<5tZDy}mb-YNyURG;qHlIl5+ zhW$tNNa8*F^=Lw?F}L7BQM&J|r=DWm`QWvZKYA!LB^J zm}72tZ=lNx7I08)NS2EPci%;RO9z~&um6xI_#JhCaU_TUj5^#k4Go@ZzRClbW)`l9 zI-Fq?dKiH4;9l{igC~g1SpXS~mVIb+OC2bD{@c+1;87tHv5{D{0w=MgID7c0A|O!_ z2y6 z_Kf>i{Cx&~u*1O!2>K}ikF(}rKzVpcG`9+noTN> zIe{q~xQ2EOzRn~7(^@V*cB=ut%Ybr>sP{G&h&caKCgtJ41f6kp{ZvWPfzD-aOJeTa zfQ}sl2uwuV9y}L8@EerAXt*wVW=DFQd0k%S~G5Uy_t^wnm4B7n)j#K zBY)fnawc|=B@BO}yaDEMys2$O{v#7|ORoK>FJS|Irk`a|XnyC6gYizSzE|h#WQs>w zK5ne>o@+$cU4Y@B#k31o;lwS??fg8l9#Dia4Rjp|u6dVJn*(pz4zKMK6-9jvc1|5FQwmgVM-rP2*MOY2&X3OJVrHZ z<^&>4yONgMAl?HRL`senp_VLm0wb;yult;VS z$JowW&QMZwQ_MMgP#P=yOCSwuH6N>FX zIH6np*u{M67W2KzNbpeX&PxpHl0Pv z&742ynLsVTE06kl1Jm+2lKSdOT-!~r+=)Cw!60#pZ6%uNaG(EZxo5n1Yd{)WIA?gi zIWI0g9pw>LZPSq6>z&iNXsx&{LQ=V&rqtjn80KMHGwDBpugdq&EdA?qicwsgmsEFPGsisfA!8+nhL9ulhe9zCW51ReTrxD%M`=#gu`OLsx z%}TG<^PE3N@|~Sst@cGLnpDQL3>0_#zk(V%moH9b#XP<-78c!qWR-1l;zcFs)?fwM zbb3U{_HNToL>Z>qq%tRs{@`W&s4QVtBCJ-CbM7LTV`&oK{RqLaz{!eSGf;-86M#p6C6aIM>2?ADE5vPQ_ZID}P!E3wx*azW(z@B~i{B?<1=jn|8e! zudxsf$F8DCKZ07yr*kfWZGUBFwD`}u687qWZ`9Fc``Mk`rfYG##6RHvTlbV2K?`(s zneRnBWpbh+zQp;qWDF8!DkuPn4|GavrrqPUZ}?-T)Zw$!YPEtTO!sO2Tuu5DabXmg zfJSFqKjfwA9@KF8a$2p*Ik&pldRSV!z!R)J<^;{I((+8@)12BD85vyNv(16Y;%`8` zB)@#gCpz)48#7<;vVa-;+Ep__gJ&2k3#Zg%h>1sx$zoHRBsNF4j{Nz?;_x->JF-7O z%?hkuE}lNSm%IWS%QwJ-vX+8sAMoTs#mGUM=5H z?5WYn)iPCbYz^he(cE4D(lB_ACxrtDXZW|PNC~Mg$)dF_`PvGcfp*|wtr*T)mrJcf zpYB5?GCaXd;C1?m{-&OnlB546em_e&H`Cfge^?#MD#lQHSio}EnQZ3)M*dCFHnd!o zb9+NYyDD0m{h<5pvmU>-jP`<^vys_@D~E%>@-e4DXjNDf+s4P7aV_|cP5sH4g-IVj zh1$9y#a)a@CNpq-?sh5KU2$&M$?W2G11Ah$U00at+?E@>s`H`2Ncp+lozIvimG2v%PEyGU0IQnC-5cCb?}Yn)_%bE0kPLD0D~GS)e_CSfhLyLgJ88g64& zdCl(#vGOP@zyCHN+uxiOf3PN&m}|dsv!(hF`Z{xwb&?}MBlJ|B)!j0_=o-J4ZzTKK zjm)S=f2a3o=w+x|NK(Gm_IRABXdk?EbnLHb&51w2cYVloOW~CKd|2DnxAyt^>9P_M z)Qot`=`t$Pc#YqoxAX{hClUd8KrXQ|p)(1Xy$p@88Hq ze;MmiKcLeV+`aE;O_m1?#q_(!}Nz!7zp+ zb7qGZk};sxGs37ep%P9v<~9DI+G)bsMC49V|0yHXgjek-rDOeWI4NhuwBMv_A(@9j zT|$+ks2EpWc83FBtkwMQ?L+7uI#;snXFtCebaWduv7!>~E>m`)p1<-QAz^YaS~ZWp zJRW$JSIWX+O?T$|-NtXV?#rDlO!NkP7Ul)yuEb+ot;fhPG#F_#G;TQQW3!Z(QWp3Z~+6m#9vQQc!P*vvD?|!2<-o?*G%I%>R{_T}=5i$8g zuTVtzIWc1G){mXkub$MOVEVtTpuAsd4b!0-Da_jqv@tR=TK}=Pi2v^Xopg>b3*Ih6 z=fSl8J~H*M(zS`d%JPDV-$GAaT7R_B@$qG3NX^&7he%!=>0jk>_qs{JtPJ?Xpe_@u zwfpdfV4)-kLA=4Vde71g;c*~D0c2Xh2x&u9@D4_fKuD)`S@{wLhk73&1VEP|3S~>f z_eTK)qT+53)wA0>jSzw_0+8fE@{x*%HxdiTHi75AN{fGlhX*1c3GX4qGQ#7C!UY%z z_$JR#WcV2%0r@2~1Ul_Ih}{JS`e@8ZgnGw%K#k%dDAnFU>^wFwP`?%n&K>K4)D|s5 zuEQO~et!lGlmdDG{Eqd2+Ehf4U&nzr>7xWN5TAYL8+dH|w?qGH9O}c*z`)=l-g3wJ z2)--?-vT83=;?SgoOn5tyT;>o?gR$~xn7d?`H$kjjt&Y!43Rs68M#Ykeruab&c+~5 zXJTQ91Rhgry7TqyuIU&7M-o3!;I9abh{wgm=DNdir#2P9coHrJl`T8`3i|KUj{hUh qi011DVp3uIrSx~R+(OH^r{0Ir52DVOG)@tKA4xG;(PCk}kN*P>tlN43 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index a31e4ca..858eb3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@types/node": "^16.18.66", "@types/react": "^18.2.39", "@types/react-dom": "^18.2.17", + "dotenv": "^16.4.5", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", @@ -6053,11 +6054,14 @@ } }, "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/dotenv-cli": { @@ -6075,18 +6079,6 @@ "dotenv": "cli.js" } }, - "node_modules/dotenv-cli/node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/dotenv-cli/node_modules/dotenv-expand": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", @@ -13591,6 +13583,14 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, + "node_modules/react-scripts/node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, "node_modules/react-scripts/node_modules/emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", diff --git a/package.json b/package.json index 9ac9860..6fe17e2 100644 --- a/package.json +++ b/package.json @@ -10,17 +10,23 @@ "@types/node": "^16.18.66", "@types/react": "^18.2.39", "@types/react-dom": "^18.2.17", + "dotenv": "^16.4.5", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" }, "scripts": { + "discription": "startはデフォルトで.env.developmentを使うがbuildはデフォルトで.env.productionを使う", "start": "react-scripts start", + "start-stg": "dotenv -e .env.staging react-scripts start", "start-prod": "dotenv -e .env.production react-scripts start", - "build": "react-scripts build", "build-dev": "dotenv -e .env.development react-scripts build", - "test": "react-scripts test", + "build-stg": "dotenv -e .env.staging react-scripts build", + "build": "react-scripts build", + "test-dev": "dotenv -e .env.development react-scripts test", + "test-stg": "dotenv -e .env.staging react-scripts test", + "test-prod": "dotenv -e .env.production react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { diff --git a/run_local.sh b/run_local_example.sh similarity index 63% rename from run_local.sh rename to run_local_example.sh index c36e1c0..08bae27 100755 --- a/run_local.sh +++ b/run_local_example.sh @@ -7,15 +7,18 @@ # Author: Ryosuke Tomita # Date: 2024/08/01 ########################################################################## -#docker rmi react-app:latest -f -#docker build -t react-app:latest . --no-cache -#docker run -p 80:8080 react-app:latest # -p localport:containerport +# -----composeを使わない場合----- +# docker build -t react-app:latest . --build-arg BUILD_ENV=production +# docker run -p 80:8080 react-app:latest # -p localport:containerport +# -----composeを使う----- # .env.developmentでbuildxでbuild docker buildx bake --set react-app.args.BUILD_ENV=development # .env.productionでbuildxでbuild # docker buildx bake --set react-app.args.BUILD_ENV=production - +# buildxを使わない場合の引数の設定方法 +#docker compose build --build-arg BUILD_ENV=production +# 起動 docker compose up # open your browser and go to `localhost:80`. diff --git a/src/App.css b/src/App.css index 74b5e05..a69922e 100644 --- a/src/App.css +++ b/src/App.css @@ -7,9 +7,11 @@ pointer-events: none; } +/* [`@media prefers-reduced-motion`](https://developer.mozilla.org/ja/docs/Web/CSS/@media/prefers-reduced-motion)はユーザがページの動きを少なくする設定時の動作を規定しており,no-preferenceになっているので該当時にはアニメーションは動きません。 */ @media (prefers-reduced-motion: no-preference) { .App-logo { animation: App-logo-spin infinite 20s linear; + /* animation: アニメーション名 無限ループ 1サイクルの速度(変えると回転速度が変わる) 一定速度で実行 */ } } @@ -28,7 +30,9 @@ color: #61dafb; } +/*[@keyframes](https://developer.mozilla.org/ja/docs/Web/CSS/@keyframes)はキーフレームを制御するため,fromとtoでアニメーションの始まりと終わりを定義している。*/ @keyframes App-logo-spin { + /* 360度回転する*/ from { transform: rotate(0deg); } diff --git a/src/App.tsx b/src/App.tsx index 0e4053c..51de2f2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,7 @@ import React from "react"; import logo from "./logo.svg"; import "./App.css"; -const message: string = process.env.REACT_APP_MESSAGE || "no env"; +const message: string = process.env.REACT_APP_MESSAGE || ""; function App() { return ( diff --git a/src/__tests__/App.test.tsx b/src/__tests__/App.test.tsx index 7f6509e..743cf92 100644 --- a/src/__tests__/App.test.tsx +++ b/src/__tests__/App.test.tsx @@ -1,10 +1,43 @@ +// import React from "react"; +// import { render, screen } from "@testing-library/react"; +// import App from "../App"; +// const message: string = process.env.REACT_APP_MESSAGE || ""; + +// // 画面にHello, Reactの文字が出るかテスト +// test("renders Hello, React link", () => { +// render(); +// const linkElement = screen.getByText(new RegExp(`Hello, React ${message}`, 'i')); +// expect(linkElement).toBeInTheDocument(); +// }); + import React from "react"; import { render, screen } from "@testing-library/react"; import App from "../App"; -// 画面にLearn Reactの文字が出るかテスト -test("renders learn react link", () => { +// 環境変数をテストの前に設定 +const originalEnv = process.env; +beforeEach(() => { + jest.resetModules(); // モジュールキャッシュをクリア + process.env = { ...originalEnv }; // 環境変数をリセット +}); + +afterAll(() => { + process.env = originalEnv; // 全テスト後に環境変数を元に戻す +}); + +// 画面に"Hello, React"の文字が出るかテスト(環境変数なし) +test("renders 'Hello, React' text without environment variable", () => { + process.env.REACT_APP_MESSAGE = ""; // 環境変数をクリア + render(); + const linkElement = screen.getByText(/Hello, React/i); + expect(linkElement).toBeInTheDocument(); +}); + +// 画面に"Hello, React"と環境変数のメッセージが出るかテスト(環境変数あり) +test("renders 'Hello, React' text with environment variable", () => { + const message: string = process.env.REACT_APP_MESSAGE || ""; + const testMessage: string = "Hello, React " + message; render(); - const linkElement = screen.getByText(/learn react/i); + const linkElement = screen.getByText(new RegExp(testMessage, "i")); expect(linkElement).toBeInTheDocument(); }); diff --git a/update_github_actoins_variables.sh b/update_github_actoins_variables.sh new file mode 100644 index 0000000..79b8173 --- /dev/null +++ b/update_github_actoins_variables.sh @@ -0,0 +1,6 @@ +#!/bin/bash +for env in "development" "staging" "production"; +do + echo $env + gh +done