From 22cfc3d48f2c8fdd395d820d623c11924af960f8 Mon Sep 17 00:00:00 2001 From: elinuxhenrik Date: Mon, 30 Mar 2020 08:53:58 +0200 Subject: [PATCH] Correct spelling mistake in name of component Name should be Control Panel, not Controlpanel. Change-Id: Icbb222cb0136ce9dff9efaf97d396e5673e323e0 Issue-ID: NONRTRIC-166 Signed-off-by: elinuxhenrik --- README.md | 4 ++-- docs/developer-guide.rst | 14 +++++++------- docs/images/non-RT_RIC_controlpanel.png | Bin 49197 -> 43632 bytes docs/index.rst | 6 ++---- docs/installation-guide.rst | 4 ++-- docs/overview.rst | 20 ++++++++++---------- docs/release-notes.rst | 6 +++--- pom.xml | 2 +- webapp-backend/README.md | 4 ++-- webapp-backend/config/key.properties.template | 2 +- webapp-backend/pom.xml | 4 ++-- ...pplication.java => ControlPanelApplication.java} | 4 ++-- ...nelConstants.java => ControlPanelConstants.java} | 4 ++-- ...serManager.java => ControlPanelUserManager.java} | 12 ++++++------ .../controlpanel/config/AdminConfiguration.java | 6 +++--- .../controlpanel/config/SwaggerConfiguration.java | 10 +++++----- .../config/WebSecurityConfiguration.java | 4 ++-- .../controlpanel/controller/PolicyController.java | 18 +++++++++--------- .../nonrtric/controlpanel/model/ErrorTransport.java | 2 +- ...anelResponse.java => IControlPanelResponse.java} | 2 +- .../controlpanel/model/SuccessTransport.java | 2 +- .../portalapi/PortalAuthenticationFilter.java | 14 +++++++------- .../portalapi/PortalRestCentralServiceImpl.java | 6 +++--- .../src/main/resources/application.properties | 4 ++-- webapp-backend/src/main/resources/static/error.html | 2 +- ...lTestServer.java => ControlPanelTestServer.java} | 2 +- ...erTest.java => ControlPanelUserManagerTest.java} | 10 +++++----- .../config/WebSecurityMockConfiguration.java | 6 +++--- .../controller/PortalRestCentralServiceTest.java | 2 +- .../portalapi/PortalAuthManagerTest.java | 4 ++-- webapp-frontend/README.md | 2 +- webapp-frontend/pom.xml | 2 +- webapp-frontend/src/app/controlpanel.component.html | 8 ++++---- webapp-frontend/src/app/controlpanel.component.scss | 2 +- .../src/app/interfaces/controlpanel.types.ts | 2 +- .../services/caas-ingress/caas-ingress.service.ts | 2 +- .../services/controlpanel/controlpanel.service.ts | 6 +++--- webapp-frontend/src/index.html | 2 +- 38 files changed, 102 insertions(+), 104 deletions(-) rename webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/{ControlpanelApplication.java => ControlPanelApplication.java} (95%) rename webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/{ControlpanelConstants.java => ControlPanelConstants.java} (95%) rename webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/{ControlpanelUserManager.java => ControlPanelUserManager.java} (94%) rename webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/{IControlpanelResponse.java => IControlPanelResponse.java} (95%) rename webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/{ControlpanelTestServer.java => ControlPanelTestServer.java} (98%) rename webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/{ControlpanelUserManagerTest.java => ControlPanelUserManagerTest.java} (90%) diff --git a/README.md b/README.md index d5771d1..bd0ff26 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# O-RAN-SC NonRT RIC Controlpanel Web Application +# O-RAN-SC NonRT RIC Control Panel Web Application -The O-RAN Non-RT RIC Controlpanel provides administrative and operator functions for a Near-RT RIC through the A1 API. +The O-RAN Non-RT RIC Control Panel provides administrative and operator functions for a Near-RT RIC through the A1 API. This web app consists of an Angular (version 8) front end and a Java (version 11) Spring-Boot (version 2.1) back end. diff --git a/docs/developer-guide.rst b/docs/developer-guide.rst index 2995872..8dc48fb 100644 --- a/docs/developer-guide.rst +++ b/docs/developer-guide.rst @@ -4,17 +4,17 @@ Developer Guide =============== -This document provides a quickstart for developers of the Non-RT RIC Controlpanel. +This document provides a quickstart for developers of the Non-RT RIC Control Panel. -The Non-RT RIC Controlpanel is an interface that allows human users to create, edit and delete policy instances, for +The Non-RT RIC Control Panel is an interface that allows human users to create, edit and delete policy instances, for each existing policy type. The policy types and their definitions are retrieved from each Near-RT RIC. See the README.md file in the nonrtric-controlpanel repo for info about how to use it. -Start the Controlpanel for development -====================================== +Start the Control Panel for development +======================================= -To run the control panel locally for development with simulated services, follow these steps: +To run the Control Panel locally for development with simulated services, follow these steps: - Fetch the latest code from `gerrit`_ @@ -26,7 +26,7 @@ To run the control panel locally for development with simulated services, follow mvn clean install - mvn -Dorg.oransc.portal.nonrtric.controlpanel=mock -Dtest=ControlpanelTestServer -DfailIfNoTests=false test + mvn -Dorg.oransc.portal.nonrtric.controlpanel=mock -Dtest=ControlPanelTestServer -DfailIfNoTests=false test - Now you can open URL: `localhost:8080`_ in a browser to access the backend directly. @@ -39,7 +39,7 @@ Start the frontend: ./ng serve --proxy-config proxy.conf.json -- Now you can open URL: `localhost:4200`_ in a browser to access the Controlpanel. +- Now you can open URL: `localhost:4200`_ in a browser to access the Control Panel. .. _localhost:4200: localhost:4200 diff --git a/docs/images/non-RT_RIC_controlpanel.png b/docs/images/non-RT_RIC_controlpanel.png index 32f07bf7b755e447b3811f24006283aa5797bd3d..7d28f458be8c335bba7827ac94ecf30e94d386ec 100644 GIT binary patch literal 43632 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 literal 49197 zcmc$_2UJsA_b-Z|qN3u_qZ~kriXhUCks{p=NK<-`3IVA>AVdfuA}TgOq(r)i^b+Yc z1Vp8Tq6CN#AhZx6kU$`W5R%+@j-K;t8Fu8oe=APRkCoJRlD=jo0(U3aB>|k=C z{mOWDJ-O$Fj;gGxdGwnnm3yCeo;tmM?=zA1!ta0Xp^C`v5`4Dz?UM(49+V!JHGRHM z-B~I9Noi&DV(*0hT9G#;qhIYfpz8ElC7=0xiDy*%z8UR-WSE_u$86KvPL4GZw>QGwv0~nKhuI)Qj-Ljz@BSuJ3(`H|%zqZfzCTNTRh7cQbhpR z5ov$udsM6b4mCdn^xM+H^%^8k)n6&$l_nk4UN#FfoRBY&pTj0Z;k$DT@ZD`lN>>zl zp_^N<(Agpl@nD{Sc;K^9DTiDs-ApJx5w=hhm}2t%rx{HiU&k9=O$%%&Zl4(^zE@@5 zF5pWgSAMsB9lu#;8#5n&PF{u!{m4Sf;?vE>>c5os8B) z(N61Qh~&kEpqj;nd&yhh)=z71#*}~}xcfX=)j>ba>!r#i#L9gQ_5S>?OMPWZsmot# zRz-&44G!~D%{!^j_h2-X%F1uey?8XtuzMz1&s$<>2GKX9=s*R6@u#Pn`4HHrufsu` zRT0{(3t30u3YKxA7`Njm=(7d(DCDa?NZxF|5{P^liKQYiW}!SolGe3xEC}y!-x;S{ zo+RV!q9`2DVAbd{G*)^d$B_B8X-xk{``mon-BI_FcORu(E0-A`R~kOnm376q0zPY^ z<_wQ`KUT?AStWQ>_PnyCYZ02eU-wegi)x*#sB9C*t=FK@?&3a>SK?@&3Yl{h?s}xd zK(>o$^w(nCPxJi5W7_+k&+_khTpH4jT-@t!)L%jE|8z~1tPx0T1l2iuL-y%>sVmd6 zcC!c6X@V6FA*+)S^C?RThZ(@}MvkG@n7l&AglvaFsoG)pRnla77@!%aGB7==Nk{T< zHg;PyouFwkB(@yrBHt7lmb%FOlvl|{=!Ux9P2KvoxMzg8c8&GcP2UUN0+Eb5|Lx%0 z;rdorQIikTB8ThK+oTJ<4%T-Rm;k=D7>9SZ;qPwJ!%-*-3Sy@`eET?*O~jp^%`P-hZF5)%_LdKNQdG8Qe<&#Qm?n1 zp{0*3*f7M|Z!_F}Y|3D}#)N(kFcMa>xM^tL$>mQ|H)$NxVsnGXsUvo!D5)Y(>_a6P z*sI5x%ee1;D74Kd|CZ;6AS;MAz_qsCI(1U_Xp()+P{^o1qfE;qPG`&{zA=&G8C-ax7y$M=tH}h}1S5x%3t@fwD)!y)! zi1*(^9jp1y4C*ae6xfu^!dGb0fvb|H*@g`q6py>V;qwx095n&5SdQ!mr(@%Qz+-F# zJautvD6f)ikL*%q5E*>I*Il8H%vu&UABHVO<*AMBdzifbzW>PH@JpMM1OvH!N34qm zYv+t7-HKW@&-KX^=evX+ZfWiOT-lxjzWKh7tb3&E@p44+-m&OQ3+`!uz9Y;f(SWbo z)=yq+oViJelj}HUFncqb{g)_{Z*BOFix9oyb5VpjxORS0n%)W=?W&(%2Vm-Bjf-&c zY>Y+iVZ|obt4try{D$GBaCvdH5ZW5Svyz5KroM;Q1uStXrl29UNCin%v`dPct5JDV zscYbb!*!_D5w#aFp%twF*C$J&n-Ldo>fNc{0dH#^uT_N|NWD7RI$k$nmXfWh+<(3i zw80!X_%46Xm=c3@;bi7&Wnwe3D0=Jqm!rDU+|^H&`tuV|UhTU*S^bc76|#+NATySU z$$D=_4E@-V=Vtk5U_31sK{ym2yCkyxFVU{6==8ioS6+3ih+UOSpL?W19Y^c_9=j_J z|EgE=9>-f8)8Tsc-nX-+RFVGl%Y4^8Ao0Q;nT?kU(gNtVrlYL)wJ2jpqWT{ncddO2= z)DwQp`{K(Cy$yqcH(Ccu^Q9M~B8*dnm?6>rQeE*zX#(pR8SKiL3*d8;7Bzl6me?3^ z7Hd6_k=ylP?S1fsC$@5i2E3PAWFT{FH@SvXHKp7CphNak_@G`C<}dtro?&w2340{} z%&jJ#hC=H&dj+@RUG0HIEmFkK5u@1i$39uqCgj~(6b8yskve^*&xbuCTxjf#o72eO zcjI(uLjz(FI2$4T416p6##EhW-jGI5M#Y!LiSF;5(ItR42o~lQDygVH;KZdQ;qrR= z6-KW$9kIYN%mkUfsyI$#iPlzk2Z(}DM~-8*ppHzw{dB1z6jmb{&W^z>8c7scx2I2R z*Vqt|8)zvUqS)SJlXI(B7Ql)q5@c@FZyflR|L`WD>*eu~edn^HV6VO~ruUAW-IsHg zSWvoyY7!R=@e5vHMa=khoFg@4)R)eZedzsZ2Kn5d3ef15o9t76KZMKM2P@eK-`NL6 z0uI+TlOIcth;N2Q9;>$8JVzN`I^i+ja1`I_OIGm1uLZgZG0U7o)06G+Z-n54aHUJa zRGeKM5?@fA!bo?1o>Y^}(;L1zYe+D`$61s>IBy1*BW~&V;dx8pL)HLtcL9i?#&fmf zE?6mU4S_+Q)gqNXVVYc=fD=0Bfae13QJ*edOi&Rik*F`&BdK(yk7iBctQU?@$!b4ke10LG44LE_ zg}FQVvI40xvlxrIgwBduI*~W-wy8(izQic+kqd<8v)H!i*%{x*-QA|;iPJ!COb>e~ z4?rSDDgk+O%pd}(s4;29jrk~~B_}8fRxDe&DFo$FqFBmpURI9#$7Zn0Qj+@bHjc{< ztvrco?W*hV0j9!3GYOSv_vRd0S7b$q=>(#>H4C!(wN%xC5m}Qh`A$cEMj+a%iT8E& zV%2t8yw>dLN%wnSs+G88GTq0k?~r(AU%~@|6I?sSIYp!Ic?E|6w`e&JTU}$w73Cfw zVg_99aH5nwfqgsQ7CSm)VI9k6BQs%f zSPSWw1$zqBJSMX^{=?H9ip@RUkvq4@&q?Ugi<9N#-CO(q@@>VI^4p;IBq+p*1L3V+ zl_dLh#@>CLPeSWAn_K)_Y=czj)odvS$6NnzhUg;jjQdk&(KpSmWx<#m(|$7bxhITwRbL zD<4CXqYc7cCyLJ67gtZ22r_TBlJ^e39}rt(387~% zNp3(pvkiQm{5yj1)~J2lv;*6=-Z$5*ae(7|{k`mzpa zGV8R>FktUk6}s1H@{i5WY@nzbPO}fQ&rxJ-sD6_8_bEK;aWGK9EV0!0pwyh(w^mo@ z6&`1Z@56=Bs^~uHaWh zxTF_I`|?5OhJSGH;U!S#!&*R4q;r`6w9IS~)48)sMjff& zvamZ0GjTnvfO;S`WWF6h6XV&-Z_%LuhCL>^AQI+2t!Kiw_H$mwN9^+VcrLBFJZaTG zXOK&>hfPW!&DMEu-hwWQ!-)GG3whiJ8fklZPThfA;xm~whs`k)f}Tt#l;-J2ri48p z7x{PE{RCWn>1Kif1ohe@L$&x6G zh_IaY)rV^8TjSjh@ri`f24kQXASYiS%`rd5VUpWHpqCyRIvwz2f~5xSig`|Z*^?HM({Uzx_4p}WLg@}7=1Y+Ej!CZC?ZKP1 zggTksgiC*`;(Wl_Tcsf5?`nFE=cqELe|y8X|I=UKjTGUcBODafif))){dg`p2bqJ+ zLlzEGI5TW=cI+$=~ne#xl7k2PF z;ImGdWS_nJ_j10fCW?B^ho4q@-?$Z;bu-=XwYGZ>1f6V4D~=n0nhA@aLqA%R<_L!c zd7N!PEc*v_VC%ZxuhezvLu+dL$PJs%2&9UVa4doGxbwXZXLh{t5~+$fp@56L`_y}C zf@yE>Ko+_V@0%Bq`^%~YWcTTR6l7vTyWWB6!Br4!K-Iv4M93SkGdSpuCt?Tyh*Gwja6OS`=iKiiHbuUXKxEIPhgSV)k^XZiQupoO* z3@NrT8gw%gKkH8#*SX|D=lQB0;`Yv4%}wy|-&}#40p0>0!oMh<;za4`DE5q{gFN+oMWe>$m)v}go5M5`B(qztEa;D1R)xJw*n%M+(KEDbnhB+uLQN!@ymKyJe{UtDmt;{XE$b{!A= zJ8(S@84!wUO2*N*=tMoaUfwrnX?RJp9z9+@h;~1JVEvP`+2q8Vj$SLWTI{Tr=v)_y z>td0QKoM`RV82+;PdO`MD*=kzzjRI6Nr1v`O`v4oXiE%yd9(lJ&ol}-a3l$iO zYnA$2;X@{T{ADtDmk0YqU<~D{(_oA?$0S44T)%S|V~` zE!lpdMHPjYk_+aci_A7i;CBpgdIR=^-_Icbe%j+!G@yJd(FMrVZfKxN4pjEZHgFcW z134Bz7ES}zDTHr6jcCY^Un?ZoXB88GStVMRxi{+Kd$@?Y&NrqDow3MT2=damU-X~G zZ&9$rV}V1Lg0LFsyrmk{wGPV8Yk11UON^VALzYce)B3(JG*t;erIM!-`?O&T^%E3)#N(^Ns7P zzt!7EG5;J2DZjDsTkTIi?|j++EspW$v;_X&5S}j&)N7#|PX6ku@ZI^ziATRoPT>CO z-P@_vKkZ#W;Ej)96#FDnz1HII(1rh&mB@cL*fsWxyX|~%ell`q{9j(y=89}!!J~hf z+@DU8-^u?MOz!ovD7Goq^7Y|&5~sVdv$JhwmCKnOv!W>=o34jaeIMcxC)7T<(M~AE z>8gRVC(||Y)tshg4X?6AeJ6R+;lA}}Tgs%ola=l)xv=swP}b=5Bk;#C5oqUS!o8o` zs=vQ>KxE9h`p&J)!eYSgv6)LY-L)1eY!z%#^>aWVSOJmUY-{oPVkjB=WWXwK%Zqtf z!zLq%Ap=^$J`G-u+0U6>?bQW+6AtCN#(r z9|eF~Hk{484C*H%YR&9T#9SvQEH;%5^Vi)(4Y6Ilz)mHp(H;4$_I4Wf8E4||X?yl^ z;LRoR`~l;gC)NJ4}wPnUMIGH<~ixf*@mNvJyf=> z_CGcS|nc4{Qf;F#nAeqRl#JbLk zCljv#p0$`_~?!8&$^OE1en7K^So%E|14*BN7bNeiz(ktsEk_rVPl;nzUC z2jt#+G_rWl3Y%Kg%BUT3Xd*a-uX*Z;&Z667gZ_!{u&Jd(+CYh9-h_ zRU9OON@pO!V+ZuVd@?;L$aHwl_-+X(vEE|*G42(9r6DPWnxxkF9Up)c&HU*47Un6x z)?g4gBz{)a7I`+ZqSX~Te_K4eDA>U6V1jwB3Q)GW(#j%jWvV<9uxl(aV*WbG|Ku+p z_p*KMIwuNtwY@*c!vp~|<}@p--2HqH9!(h2T~+WpjzB6W?;7jyhd8}AirkQ0cXARM ze)4oE7Y4d2%&WguS!)*GS#7xPw}a|<&hD!}pij%+rShhJbSv7UVU3Qao{Rafu>!XV zLC2v?6Ycs22ZJTJ{T=S^Y0s%P)tet~A6q=;xcr3e^f?OVIR$>(Ryn%#*pp}mG+dex zx_+n;Xrg+g-no6=48(R|WnP*L;2fMfTATdKb)VmlyTlNtnzWDEG@sYP-5eI%@;q9v zFpt+4viw~d;`xGsmZtg48Q+@gsKCE+_sj~0-SMf7PX^WsF@wL^2||BvWoP^>_s98cdttet&6kS~8jj(w z@pqp19lSA8&k_r&W2ypn6BAHzeh5 zI(AH!VlvjreY!+Qg{VHMi;3jHy*9>F8E-d~aYjoRa!mWpE|f^;%;q zy8FL94^#-6M^bte)Y=P#d^xJ9lsqsHR1^qI`0hRO=Vs1iMDp&jU7W;QY4K%my34&R^S>h?LFE(n zh>gVn?1b$qsn;l4g?Pw=tyfeI)O$6Vrl!$CSzqQqy2kw;wD|W|0&g^Nd~!5z?BvquIUYP>P)G4AJm+#~ z=g0k1Ka%8sT{XM;E#R_}8CRF62a=xm~_0iHp z%CF{khFkR^->BOcS6U{1;k)y)fhdGmWvhOLMw9=oUo8ji_*yG|uRo#AwWECa^|Y`| zFsg}aC4VN+axXzrOYWDq6=>~0Sg*CZ@?qWC)jaR+r5I-5uau?07d`l-v?u|B4OQ?1 z4^AHW&)yCSGSelsg2z48hc7gJwUN;9JFTTzf5rQ_`C!klFD)o<_lPJ#qO04L|OjAa{}kjUyW+QXPUKd224ik z|2vOJKJ$XoO?}v^Pm}-0-3nYR{-a*2QuS9jc7L?{U_CKKE)aZMkQs5Po_NRgk6-hw zIs9*DjxRL>!SC8bwF2>?X8#;!0wS){$$q7X17$zJb?M4d4_ld zgV1wNl@_@F+_@lfW(MDQ%_X`jr~SS+0Pz{Npc5biMwa;+{E%YuB8&3HWI;OQz1~f6 zq+7t4*j&IQ7a5;-^HZJGIRbhlyW)I`GTZK1{=Ss`we#?;C>X5*2+|15J_Anu9pxYg z3_rG=uY@-{Hz~p*xA9H=UTPubZB<4l@%iiXRr66fX8|H(z)U$25d{r*Sn#2BMsnIt{-d9kqK?1|5jbTPC6)Br9xh7W!d&M8|R z^*JDL-|Qg@+AGa=m{W5;7CaFqr)gdV%i8T`J&sSWzGobs?n^vBKhBEVpzzB&R4rpr za42>LRqPGZS4D(%HAoXzz6)sdJ|DOetA$^2Lp*go3k>__n3d`|7Eu$sO0s6^9BrBF zs8tKx7mDilX(`8LEg!_c1RV{U%d1jx>M zd8Qa(Tgr7SFHhegqxYLbT|=CjEuQ*m!O5wxoJpliM|#C64^oEkj1Ss$YIK_~SBjJ0 zb+HOwoOQi0-`Pnvm;0949t2mlqR?B;{l#~<2$a3+e+RPK`m~Eh(On&j7?SkDWG|-X zG9PKn)b~pjU_f6CUKRn1GJ$$m+yX|gN$D|Ytn7M2e~jf$OMCE>lOFLrLPHJ^P=ry( zVewHLm0-|ZI@DBwBd=;LY^$Oq{hD3-N#V@>d*`qAaqUtpB}-E%z?jv~Du3W`snqxr z9{Enh45)PArA-h3e*e&bE^(qKF@gCBFT`KtqLTOy3-}>hz-d6x4>*;~Iz%(=m6}fH|6epdOJ|&J5RI2sd05fpD_* zuj$NVdK;$+uLFCtx%s$#uDC3K9cRgAQTTjE;1Nu9{$zwuM=!i@D97S z$7N2_CqVb2=cdFt1x&Wh%+Fm2%Djb#e4 zShA*A2K#E)QHH#Q%<_}n{f7{h2fRdNZ%1*m89~ij9gf)nMPxIw-zvRJX#CKvN6L4Z zSnrCu^PgXX9RvjGm#u`UeHsB_Hxgh{N&t9sy006dgSKLf@jg9+;`;Ar34*+?Y)wfB0*<7n}XHS&nGr^hLc(1ya-!`uN z#neqU2UU)T(Ic6{?{IL-Zgyi-75;?D0NVuY5-=_{7cm(?{EF!oUVYG3e<)m6Ym%G3 zx_m*ij5ZcFO-;E4{0`Rh>|RtSdVUk!MRrDl=&UtuD;M=EZkni=iTcm_phbHsa{Jt6 zhf_0IIE9zw{sC2!l5hcmzPg7LR~#9%g>M@c5HScFf=a>8Q~fFMB6!Rg0kFP@7_Vx|E!!e{o(0==?{@KuIGniP6v0O_3ow;q%0VAr9V7^Kr(6T zS);>v`i{e$FofMq;)G@ROc14I`S`xEbkqKLF_XJr&BTkHo9n)x%>F(+L#>nMADjVU z!Jqdy8qf~SkGyTD4xhHJ+1jxDjrs?GuqGwh^wjc$M12!>Sm9#x5SnkZsodHze0A~| z-mCccG`lq)_?*H);bXNa_NcEsYAZi|_Kfa+0lxRxn5r+qCZ8_CQU>!O21 zW`$OLm6?ro_a5)n#81V{GU5$2c##`$jqFAPQEqNp`8*I*9cl553qi71TUqYmCMBPt z#{KbYA&nw+dj+A)aN=SX9%QAwW{*pIHguHLAv1IivTq-7^*I^gQ_kw8hB+Ik1w|wN zJ|jC-sAmD@0SoB4xq{URxZEesyEIi{zJDBTb!9f44f=fBF+cyzcvVlf9DJ=8Eg@$3 zz73(paz~`TLCjJ6swQz<3mJnnw)|#OQALF?)$JxwZYG=V7A(X>?cw{payR0Ku4s1( zWx1ySUWrH1k3 z)GJiV=G0sjXx7~#uc%!q(WA`@nrbQn`k=%t!k^teCe|&;xi6_fq<@$Pd_hlWu~uR9 zJjX1Yit`5zprOt9c*~=+R~!1_$Ns_z_g$vdOZOXEyVEW4K`!t=U%cdmD%FIO`!gdn(wEe zBjtBZQ1G&MuI&95B8#Dt-4a^aWNi~9k|)Vw)hyQV*UZ$vXZg}SLe#P2nbx)b`3|Lj0P^v>+ul_|GIzl zA13a9PD{$|9!tMA^EmG6zO>F*CvNY+8?N~)#3gsFz<;2-fXhFu$N!$UmD^6$(r7gI zJ{=qKt^E6Ybk5vPDg%5+ISfxcrB#yp3xVH{{tu`o`ya^eARqLBt<$dM?%aQ}Z@O8p-;=g+!V`ri=b z&1u0X7{^oeAC^qu`i`hpv?Is!-<7htARCBy?+E`FCKt;d;FGkn{~_-)KHc4Q68W!E ze{{nsD#-ekFXHdu>zPE}1q++kTa7-KKAEt%obq9iy~2+~nsB=7g?~bZ`ukV0kDqjv z_xnHbOJbH{Q3l~}9>K~fykx(Lt>oqaN$3U6jjYthtNsK#N7h&OKHoY66&V$FTXSs~ z>A3jH<@7Ilg^il@Wy2#~%*}6ol78Z%0yQ|w>M5~cen!QvYYuFf9FTJNhZVdWl^gMV zO9_^$#crq2OX8(3M!~GL0x_TJE82Po{sa~w64g6>mHFl;7lzlcIZF&pfH|hfoMmVK z=_d(J=L$+-T>X;`w3TN7uOfiGfu#;^@B5HW@eeK?jLmvg2DC(Wf%S^rD2hO-C)d^n zBl$(Lk;X0TLdb`R&@$3gg<)rf@!)u2;pMocmkpfJj(l&z${Chv#|Cjk!>zX1Rz~>? z`<5h7JY~l9hN@AW+N(NRm3emR+zG8~4Vy%6@~TH)A+ikT65(VTBWCdO15MOqJ|ToW zB}8vyDtuy}yrCXsY=>st2k98CB3n}6pb6GmRZ>8<3ZiMqKtXMtth9#t#L%=nae+g7h+YFb92?*(jKA7--~% zc4a9rFCY$meQkCDN>W?!#Gx7k^hy>pgrMZdg9MCr)8KSy?{nHJM@lJdv6}5M=LXrb zTYHXKU&aSr@Al}Gps17c}`pqjlUlw6m zbT+lLnVAwynHTk7af1?Y#IBd8AGcf@PI|id+U^nav_1Mn$u-20qEpH41;@QH8x62c zx2Gv!WS1-C{eash>N?qobv3L%Tu->G7I&rQ#)1l1IiKKZu6>H7!&0*IKa#`7$c6Y^U6P?h&##r1dpJ z8ehPRn)J?Epk++2V#htR^Rdnd$mfoUc51ta)2o@qW(>8mNr#qGcyx`rfH9sboV1U`ibkc1@>{wEdE}BvwqX&f*aKvm<6QY(`hZ z6KS^YKcl2%QIzOi8;*kGwi)+rr*?oE>UxUBG^`b0l;K~Rt51F3d|x$Syx{08W-X$o6AosQ6BV&h5ZJB zGh7R*rGYYswb561Zn)tH>rY9WdA2IcmTsae-MHnu#-U5gap~4vgQX-g7fzoL;nh+o z+$6|tRTbZHO05>UqeQYE|AB^tXF0UM@W-$<#~f;fQB`R*7GKt{h--kF*H(GQd;Cgh zV*@=E%R^VzLf5&n4p8egM&traty`*sGJOazSoYjp1RY<`yc3A0Sd(19?Cv{}7j&O*>xbOm1KZ(evqm6WFdicgD-am(6-QH%nNCH9Qz zmSC_-8QxknZNiayi)7^2Mo;C3$V+`dp zT1;@~R&P_D+*?n@k+Su>$q|5crIBXJ>&t_@YoYTkAw=U{zG;|hvpAbAWrg*^m2_zL zS9)O*+;FrR*h?gq&grQVc_$)PDP`c2qvvvK**zCDP}F`mbbymQR~a;Sj+VsVCWS?u zpn&Sk)k|RBe%kAl68G;DtrYhIifZ<8-B~p_()@KLLz=!GeBos(qW@|35OHOAa8CaK z6gbFslwdicy(VBuvtxj5cWuz91>ywE?MMPnc)j~=9b?0Ty;>MSFGKL^y0^GR`FIMB zeJFt*MCx>71$3WX&|qW*C~1+)+#XL9+%c(WzP;X++ETif9n>>k(5k(lOJ+3d#wD3n zFUCx+oQnwtz$d9kahZu**buj>+MYpj@P^1yjuSsF5s0wbNnHr$eKL4@HMGmay1Yf% zG{kg8Wu_PDv_g-JRR-1$DQ1t|o$#t_UaSu`A8Q8ofP$E++ExonRk<;#Y zP09B{oA2}xP=zwF6nh&8Zw*?y!?mhNDx{A#94YiyvIo`h;7yjvw1t|7{#yMp+Nb6Q zg3ia{@Jru9>&F@|q_SIH``#*5eKV%*)M5{It8|xACPd>$W+8$ck-W*fXRz9p#^Ln{ zNzr&@GPkj_ZYD3CRg=NXfW)mNpcpkhXw{Sk$QgLq0ORv_GQ>M7Hk%$d7|qsS*%h)BEg&nYjgJvgJm`<+GuUgGe;8i0+|mE<&8I0-dmMO{evK1 z@aXPHTHP2%<-&z?8N0VQg*^nBWSkH8TWHz}e`R7AMA1%yQhZuEv9st>W!T8&FvT_N zt>sWrhp^8<8RLx9^Z?!&`1!f5--&LA>S?d%e0PZL70h@!Nw|03-KhXpR+Pyk@FF!4 zzG#W`~1*j zQ7qwjGhs~V;J%QUnZ?}s=UO6Uk3W+t?hcFX#rvZg{H7Y0Gz7X*gHBIJJY8tADBtR& zM6e5e~q;fEqM$0oAL>&C~O0RcwTyQ=3n$Va4NF57v@S=Q4-^0;Tz@>jf-RVzGPh zRXgSZZxRiSi#uiFOFbjC)Ig<-G~9?$aGQfhzTu2E?-R zl9rXZ@WZxvrQnDM_?GSY0h78ZvEkRIeq+1}?`II_bY?Mj6U7r+HI@bT`vC}HY$&hM z3cvfo>d7p%yHoCeY!Z}lx~L3_%a#*~`|8-+g|JPUI^!?)h@2iQnh;U%AjmApdi7aL zQzJnA7F%WDJs+*g{y?jxjKQLk)NS0kTNl+As(YSe%Ev};Wc{Hxk=f5OscPYWpM}?Yw(!}I&&|l=V7+F! z0rJ^+M7rdMCAzm?I4M_V$gLhVFX=`j&M{8VGZE?d;wB*2QG8?2?*)SWyVi@ns=4T` z`61EUlryerALpJE2S4XSqXpoJ*&B7ix$JghXhsgZ5`LL#rL{2O+soZ3egUkt-JkWW zkhA3&S9XJJc96oMH4nE0=mNPWrD-W`jEIw(`(#d z8DtVM_zK6j7TsBk&49O2V1H#*F>3Isjks?m@M! zK?Yb>qlSnoLxYo-41>sLUE{()FGy7sOrLn0ui5R?#T4%rz&IPaP^oIbGY@dc+-S_l zUM8E`74$%znmRgk2?dw~Ul8exm|^WtOPbLi8K@|Iz|xLz6%$%Q`C zX>)%*X!~jW>MB@a7ZcTyaBr^+{#av^#VYN@^Vz#+`w%WJEtIgv@E`SC_g8xxVxEX{ zVL3L%I>7bsQ^)s=CB`ge^;}|lXfZBQAU>19uf$H!8)KRc@KWt?l+j zHLMQqH9#a{6Bcw|+ zIOAuEARl~(-xz}v33+CdHAxhK12>f@2lZrep|*v9n@F>kv)u5iHs4vBE2&2(T$F=D z?m7ODD(^Kr4HIGJI{b+o-&^PIblbHJLz^S|@B~Ts{w!sp41?R?A=N3zlq?&@8+xC| zw3tvt+I;P|G-wVKgnj2-od0v;Y1YP+$12;QyVo-@v;j5JO(MK&7h~UE-Tq^zZxQbB zPi#o5wr2eAM**0PDxjru#}~a;S2cp;WA5RHXZtGqoC~`4Gc~Hp6n~*9{yAf?L3?CX zv=A|p8}s~BAXp7m_9d!G-;a4N2WE54Zf}xi%F2F1Y(OV`;i~f6;hImZqOA_M*Kfe* zu`P*h72dcVLfmvSqe*%7shy+fTd{sgPzI4Jdwcfk(|SWJGrvsP_s;_@MVf@)T`U6) zuq&&=zwbuGr^pu}}lKv$e?Xub}9Nnd+!YD`xWy_`)B~nBWs-P4&C` zX8zRr9>qLmtfsUvAxz9oqUE4qsoyqQVXxa7l9#gzCS=M0Y?>eVPltQucNiXU^?S7Im<&AOa#QEw65^_2%n$gH)U? z@l-9+s6eM|AyHW9saEw=SwHm*EKjXM6N`vFrdGRGUqjI;bhNnDlx6}) zMgB$^T&oZbYz#Iv*=0Vk7{95z)smOx2Id>Wo%PSqpix9t(Nb2kH%b|?r21ng5B5-; z?W@Yq_8@NR-Zk`T4Q08rg-t96?Xri*aQ6j z0vQGa@S!YmEem70cBzwtcjHy~4nxxXCajf(Mi*8rZt`$QlLgyNxXCH@Oh?h z>bCvQr8h?BgXGQ8KlsvC*4)@7Ihkfyu33RDVl6OX2X$n6?EC0W_$uXL>Vka#Ls)k( zcF_DCp^`gX0GjIqkUcFph}p>_Bl#($8u~SJ^vUIS7tNjTdc^Ks z9hTa2JWW3*AjNX4)J`hl3HKyo-i@_zl6+O?koXR2tn|xUbI0=guHR_9R7+*lNmOs& zF%>AkRc8=DFdYIQQl2#4icjIlJ#up>z4V~SdG>Yqxa8Y}naZ#MTt)hKPjG31wP$sm zSxqc9@)dxQW)N@#q8A4@l$Y+r*ebI#5)R(b`kLTw*m;NfI?H*od`#-A~;T5V%HX1zDTh=Z$^ zIQ59V2H|-XeZlT?!Hh8okC$sSTSLpffR8`b?@#{V0%FQ@6)D@(R!N~DOff}7*%$9kx0=2B8*$HfQ*tZ4!s|(h)Wz|l z1moQCQ7B}A~qdz#%${EvO&z$JHbV6n3^e2SS z_(J6T@K;28YK9vI;S}udE9s~8HMRKTx`&zCDmN}__)g^Jtqc>q_juOF7}Vw`X{xul zJ*ckMjzDyxHuBD}5(6^58g09Vh0ig#a>a{lElag=mM0mFeFW{)>8;&5NcfJxfHg7- z0J09sSH9cs>zePio?1RjCaO477wU}Hk*3Sf!94Ym7Wq*=25$6p>Pw|0(4535?Rt8d zPIK+djt_yDcO8RFP{e{xe2eBcWTxE!z!jQ#WPk6{!CG^f=v8E2Kh zfqJq{q9F6Jd936r_>4r_d)KZe6FN9hi0LcYZLU?kLsmBnA_OIzn|;$X+isp0k4aOhy9+F7+tkZgOdAekNImb)tHh>qj z;W9r$Tut#->J=IDpD8x?Z79LI512ynWC+1Mv+r#Y*J>&Z_vpsuOtm)OO38Xd3gSoL zdY*bs?46fR2Cv6fw4#;s%2f4OAm%{$k#5U8!_Ju6yPf7bFGfObu3=9cRMb@z#+xT9 zq&wvc31n0iw2Z3dQ4A{MO8A>mB@r+6>JVrl+{W#+QJqSV(;Okctn{m)@x0|DdXm3O z&E2M5&yVu)9-)fH*)0us8WF-)H%mCtZ)72zh$IWfXtHJv5f+Q2HJ<}344m)1YY=lXYlW? z1v;gjcaq+N?C#d~h@4*vY7>GwPyH^Y_Qmhf-~T$#-?bZ6r(r4lHa7))Vt$W;9cte_ z27a|OEcPVt@zqz*_Sk^Qa*_CAAD`_aMVDhG#(oMld(=6FL?!{({q~+Whiv0lhDXh) zJ>2qp^tv~8-=OBtR*s(7w|;&jDRcd;i{j$<)4o60LFEc|_S*$|M_ue6*Zg~yZ=6^F zMQ6{v5rArJt5hMpFL*L5?3)|vXVUCt)0Sh33T0r|c+}`gFF`0`TOQt5>Eqw;-gn74 ztBlA8VVif2MU9g5c2eitL&2G8We0xhC+LwO_IQZ!o0HqAu{OuvXxQv{G~BvxY;{$_ zl=CBc*7{$(y?0boUDxidqH-%D3L=6OQHpc~kzN$RLY3YTBp@x+5JD9d5b07PO+lAr0tjo@TZ3p@~-Tf4fHSXYb@($x`nu`4D+s z`FWrU>)JHkgxfoX>htE@|7a-Z&t}-bV9C8T`=-V+w16zmDSYzGWMJupTiu60+oxX3 z!KB%Uc#^2%3I|kqx}h&@&xY^G{e?DVTfVj*)~0v3r=EAM9%ZHKIH@ag?OBodKxkxx z%UavMdG}@$WPbW1)+3=ZhVTbr#!YyK%JAzPvuf#gbYF|JAnhht7}w=UH2 zhpnY5xQr*WYt6k;5EK z?3vR<+5WE?f2M(j2Dp&Tp9Q7D3=r1;(lHhRaz&LZzlD$ndQ&1CxjP~~rE|xQRRbl0 zFFu>G*D3R=w&}z_5%aEzqInT%0wl#AC%Mg8K6?-oXT>nd4YLpMT9KR8NRe6uIkJ6V zPP}{Egv4epaj-*<)JV18yNgFpV@a(VDd%SJB#9I?e>zUk>qvgDm{&gAeb`oWE9b znU+Wc`c!l+?Qs<(z>i}(RpivrbW#k!WZj$hVNn5vUA5#)`4Gym7`$ti7X#Y;%W_Hz z-mcyQ>?DbwOSMa#pLj7jPurFx4l3*QKG&I`KFH{rndF^%`ok)g59PvYe5x|GUa}J`bok0pqENv`8@%A?r3YjZI0`TL>G|^Kl*r7AVq^zgUSrQgS6)KZ-!BC zNks>(^>V7({c?!3d(^xn(YRjenV&M67W}61=XYwkk-OhGN^y8P!wS*{IZT)sG;kKJ zRhVgRNEYJ4Ce2MZdu2N9$|L(Z9{qGJ+C7u;{d9oj?;7e;(x22|Is90&hzf+f+! z0ClT=P!C;SM@Dob?1fp`N}2@3qrCg@GjugIgS70Mg0?G+^3SWkO)Np+rgqRx-hoEg z8STV zj-~)|Cpva3nP~#i@7F{qMX@Yv%$)z2+~IHk_L8VToS0#X*{@Da)<)?i@=ZCH>-K2#+KT5aX$n>c# z(5Qk`-|Pw24Tr;B8WqOm7jpv)EQOw~?-WW8fH@Ise_xT;iWyoU@D>H=f%@S^n&uYb zYQPL-%5&*DH;EfsBGAbsB!g^_)A`|`5qtqjsm2|%0l=Q*Y2I6l)i~o zhMa7&uqa$DR1Lp})x(D(%Frcd@`YaElv!L+2kKC`;ji>1S2 zYs{P{bPp?l_i{!lP_`%%`q+B9#g21SI`L}yxo!s?OD0O60l{1}bTLR}gfJ3t;D3th zwnc~iuK2|TR{Sg=-89VKQbZR!0^36t0h+3mK7a4@ZbOWD&N?k>lmIBOb+6XZ2j`(g zf=AKk1=FwheM7xzG{?a&rFaI8mYgs&Dy|5&2wus=LzkV`@rzq01+)*dySv{uR#g&Fd!Mj3g)R43oYfV7^5Hg1GXH#2J+TMr|4PZr z#8@)ctMcoFPFGT!~OTP z6Is2yg?va82GI1wiSJ)}kfu6yJLzt0wMp6~hU`h6$5Pxe;zMtHUB{%?Us-9l>PNsI zX^$eXyik|AsS8C3$5<+VI(*?@|IjSq({_R+`7!u7{xnelKLuziCLFX5IS`fdnKtX# zo2g8_1l@M>YAf2?C$AbO#6v$xgSFN=^iy*)p7l#0(j6PVrp+q z7i=%#)0aMh7Uoe_H=pyp3@UiYRTct5aW~a5#Zb8Nfr9P99R}@v&ty%Jeum>-X1%@X zw^h$xF78W1!Omg%zlKmIHwK4-Gu#3nlt7G1v`<)cGvbFi^UKU-9N!NCt|_9Nas0*p z{PczT0i)Z~8-C;)61Fv4YAMo)tz*N5oAcPhN1~h7i565z>;8wad zo*=sUa z--vu=g%ERx1|#=&zBLctLDW|Tx`vsBd2OuRLFyVF(9Ji2onSC%M|KNempIj}^4zh9 z+!pmN8$L5XVmBl@$q|&a`EE!I=f*d&h6+Izy7A9faY$)_sZ13@iPsk60C| zA6lk4bP|x-AM-twou_CbGBWQKqw`T~Rg-6fF9&iz9XgO4sZx_DM+C+BIoEIHdPt1# z%Ny_?7qurkT)UzIO*G%MO4d2sRF+_-k)KuBO|!G@aKrFu7w5&sT`rnhr8;5IAGSjp z%-fAH!CJ}>5l?hr)+3mV(c}zJ$I>30FS8E&E!M6E=`&7bes`J(#!WSpE#d|>!lF4q z2h@2J>OyVhRAbGnp32m8%5iAg@sEJy)=9(|REgerxuxqjR9ZHH>s}@Kr8?iOB|*sR zyBpxHjWLP3P(jI&=^qppL`knRB~Mci%d`|ZrpqB1;98&#oG`!sH7Sy`tkRrLdfh1N z8t+9@DlGV3z|99DdIhGVlXwDB?v8>58ie@{iCFPi_dZE-A}u}Xq=8mPm92MGoq#mE zFQx6~4YhkVH3CB92)dp=-4?>B7m195@ScSMh8?)Cw(gai31-{z<$L**yb@DBueM!} zJ=K#RmALva9l9LXel65)T^KQuzDU%vD;Y8Dy6_VW^W3%=T1c>}3G&5%cks4e&yqXi ze#=XlrdO(MF5vWmf?bVytd-~~YtcBwh|Ex{>02bpQWfQmZ!7nMxGScdB-)epo8)SO zmZ$E++Ng{@)?(Hc;yU)mH4M~dI*O(za$s(PAW#EHl5-iF$Sp~5J3_OzG07l+|^qEdzp`Y zH%n?4z*~jG^wllu@Yq4MX3_g0t~qMdFSh?RQxi zS74YP@BfT*22GQDtGsJ+B}FqJE8Q9n);|=wlT(ftnEr{~UI+rY4q)>hWov*x27mvy zKLO6ivqwSC#XoMehJYai@aFr+x1->wxa$8Az5vw(ZU$UIr6Gcs*y=)jQG&ww;(Isx z=)WQKLm%Cc@&ft(4fut|0`qqS83SaA(hEdbsztq0<*X? z|NR~S;|Fhnf07AyVZgV~#CGNb;_R{3OXpzYf6JZ=g9C4LHW1b8e;~s=aZ>a-PiU%N zJpP%SwzBzO=^LTHBhd`U6&DQ$3ps*BiZL~fX;a+X{`5!t-zs$A?*2W>14P?LX1~Bz z{T(>|f0&sCmzgOfu+@`CdjeW4 zDpBwpk-kx;Fz|-`CMPjyNd8F;QjGuH19(@qU+Vq`iJ+E<@1a6wNS(K*ArWHA=-BQt z{X9`nudauEgXY?(gwlbvPi&{VC z%1DsR#5V0OdSi0c4m01Qs?+Cr)x_lHCK%wKzN5@yLOIug`*us-IM|{zpQ^AvwDTCc zmm&_n8A2h8`xW~spYKZd+WREv4LGLFbdQ=2icH@Td7&9Sm7}CjVbQ((N!>~LdFbj} z;{smKr_~6hY`lCEOUDP_P#$l~M}}O`Wu#RjGEqk9A$B2PXRCu-V0WZX3s=lDJ8HcO zkwqI&?28}BszzK=O05$XaaDXGtzhb}8v`$N6*lEoY?-rcruOet%>=50NR?Iz?YW2F zm@5o>Dji*X8`n_FzT&(Gkp%|TTl&hJMX87ReWP%D1qZ@?Rn z2?zr+$PJy5(;WlP4Sckb(l%!8OnUA&1sn3^l6GmA*b|q>)+A8bWs@}tEb!!l1=n{M ziS*wzS{-=&wy(mu31?;xI7$s!qMPPguvlqAC^Vd16v zOJ2+S$*OeEmY~Ijl>6ENH=1y056*c~B6mxsmeqN?dzsQ9Ti~}Yip5iVvmv`H$L)B~ z6Y>(1O}!_i-WEox*^%JHo%Yhc`_Nu@bM5nqv-(eDk=`#@*DZ`cRRs4k*&kHxY^YfF zU9}b^gpCpWLXhdk%E}FQ!%~owk$MK7@Ji0=au6}Y;FLP8kplg9&XN6G|M=uMqA3S%NgEN%9BRfU!p(j1_Lc zJPG)Wi&!(CB^SAO7>C{uG&Gqnyf=4R`U2XBnNPYXMX1FboQJ7pwjIOj$)V)5&%UjF z=+P_#8!SCP7gaYdf^>YwzT>$OJOzZPHR!MTLRg zgzt3Ei}Rf$m-Nl+gN3v>ef9Y+m%^*nyqMg+r6~xtIF!UyI~#XIxxcyN(=gsYUuyM| znDj^<@>zbsj2s*=ORDgwQP%VlTzNp}-)ik;-oyjez=QY`lwDq>D>fM3DV*bw53>yK ze2wsVSeV!uYps=VX1$56L7-#(S6Gy&iOAJRmab*vjH{wlKih%{y(Teym<{eGY5il6 z5N0?{q7}L|yGl5a#f_jdNQd7BmC9EL3p$CVcy(u-IJI^`Q7X%~QO%?8ZuY`O4wD8O z82$^+QDh!n=&1ZGcs0=Vj-AInW8o05nju}*z4R?!jj#0uJVa+MQ@?w5B!hK2UWaKW za8Z;4Xf{{$>Itah zs}24Np|Ah7&ESZ%WtT+TCx?NJUkG1|MT@f;)+#*%+J5IUh18s}8Us-SM0k|P)DHg- z$sA=jyxd56d%n|Du0%=u1+wo~`DW`^%Z^H%*GYxJ1W%8zFE}?m1Td;QV{5m}>nvRs{XEz&iQJJscb>*nf!S+KVOc`MuLOIX^1@Ub--ino} zAfdk71CWWN`Y1PaY-P81Zh>DVXj9d@yz-hgZE?fm1P!W&*|B=w?+y)|`&pFTenexj ze$San$Pupi&!ZXRKS#3xRT28hhK}!AAiXDkCU-8E#?4yt=Ugum%zvb+n|~^%DYSt} zm|_k~ecFZnBpv*XFXBF_gNLbraMrmlwMgxt)}{wcOsaz$jw5UL&KiWg4CF%6xdqrg~M*DhvD&-Zn-0wWJoD?9=h1@`-?@ zd{J09ac?rRW3004M^lBq*!I{ zFOrl$&8y@=f5*>Cnc7dM?`abDOoX;BmF(QlxA|66sQ4_}f^UyNiWN=Du93?Z+CjEZ zWVOA;j6>R_!T>SxxruA>6ojvn8OV{*T#xowR^u;>j+UI_55n>uQH3MjggjS8+enr{K5lH^imMyj|7xqDUSo| z(?uYvG=W=XVl`IJX9l@f+M@k)c^KnWQK(zA2oZ*Z+cin!3{ugKI~hMJ=FA?WlN@+H zfz!7)8DGx6z8WVF>Ub%lxBo^dA1Q_j@yr!uCFUI z#SgCSqN-qE#B`|=>;S^SLCO12+bP$c>wd(_B|nhg}`KJArqz$k{5DUF|g%Q?|~jCS}Ew8z-k=ny_fle_F* zxG$4iOs*wXG+QrHfb`3*`xfPVY7i112ZbPuzVxR5mws-{rqCh%%B z@sUA~b5k2leVal{E4C@~pyV|HRD-qnu~#Qzp~F%~O8_MUj&cdidzdn6E~5Z0i7c7? zm2&wbmZ_1*2P);4!$PQPNJo{YsQJjQfluc?6x*>?nv7bmP`&YCXLii=(eC)-tHBD- z_a>AZwj!g@Img@&co-%|+^3N78$hV1>$Q@VT;q-%f7Gy~j(L4%D9Vs_WZ<(we@61h zPO~^!Zt%4?hML9W4^vhJJ`^W6>E26$u*$0hk@Owct&fL_zRc#&lIIq`D=wWtp9jz z7(Sv2E_knedlb76b;c|AIps`*K>=GBIi+I3q$-nJe#Cd{n$FILQbh|vW_(^VozE7f z)QCCJb1Z*aA0k{+Od1yMT?@;l<|yLV^(zWhTpu+1$(9gh1Z|rUu^?sjvS>FG z_j3OyXJd<;JAUlwiSJ8U!*bq_=73oo!1ePMk+{D1BI3i=G5*#k2us{ND`BD_*mKUH z023n^pxA_nJ(4*ye~HB67!vn=*R;GT?>l}@fQA%Ln1d8cQb5FP*3-mNt0dB}L$S)C zryh2phlb?eIT?sTj*s6$fo|3WZrwtA)89VvsM%;*3ULbk&`lYVc|W_T`%$$fiA8dh z$WcmRP38N-S+`Uy_gxWnFs~J;ltnx>a}U$>+49fQJ5AK-n9o>P4CZCuYUp}99D{g@lM zPfI@pHC;N#aqSd7a634wKd0SWV6+q|U6vf7sFVz`at@NTQhpD~DjAu>iY8`>i6&BO zl82M2{WfoFMHabDGA-OgCv|53qVrfrOjv?`YqT?oTPL z5TD<}iKT?Qw#9~uxa**Zw=)g5o?7Kc=AQ5(zNR4=WJafURZIhRR26-`r^kyIGJ8IQ zINWay^=Sy0h%}r(9NIT4@$Ng3e`vSGx|h%Xeb&Ny_Ut@JF;hx>xO6sSbOkwa=8$FQ zz*7zcD}YnPYUNqc{gR3=(i5g1yxnFo!7DJFMDL~de$+^@+wsuPd^nn`nb5m|Od@~6 z71r8MD~V!fSPG*^eStT}6OZ*GCeKYs0qGJcIH!}t3|O$TIXrRC&9{0#M&FJwHY_5e zWgUGWYIx2(bZW(a;EY=atxFr1Zs9MkRHv__y4T#yvSgYor+QVe(jjljl@Sb8w*w3L z9UW~)nTtvYA14Fd->p36``K^cK-ESs_Oj45&+J;Q>`dKe?Kh;#_f*Vn-6ZyzQICJs z$seJ3?7i5lz50}A@`X&htUEh3%l7@s2|jX55###{<^>88)i4c_|+D@~!bL^AMrS$Xy9tecE;b~$m{)&z(6^#DV0 zk4Z@rN382o*Zav=VALmSS5)Wu4tWajTIhxA$J4_h+TNFkq43nL19 zS6=ttI&`?9#meO0lh=97)bBP-Na+z~jCwX5u|n&jz^!F<+N71B9y1+pHc4NcE-T+_of_A*`PN)sJsY}-;)={L z5qBsOdb@8fqG=Jmw4p;cbFTyUubmBuKpgCPuHo+G=2opzqS;4Su8Y0z&N-DoVGXl= zL8!T-v=`mDtn|Es`bNvM3u`;J9mrXHvOz?5SIoV|G@rM7tW-ZIn-wA0)7p;P(6*i( zzdMtIvYk zS1Nk2eq;OTBhskO$l@FxKi$RmadJBqa}!VDz!wFW?hs0$REyTNchjD4gr(eUZ@Oc% zI=zNKEgL+_h4cfKn+i$+p{tKJhi3TJkQgr}X^e+6lnr@mxKg6=x%DRaO^LJ~_af#v z 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 diff --git a/docs/index.rst b/docs/index.rst index e59e017..92a6555 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -2,10 +2,8 @@ .. SPDX-License-Identifier: CC-BY-4.0 -Non-RT RIC Controlpanel -======================= - -.. Add or remove sections below as appropriate for the platform component. +Non-RT RIC Control Panel +======================== .. toctree:: :maxdepth: 2 diff --git a/docs/installation-guide.rst b/docs/installation-guide.rst index d7df04e..ff1bbd2 100644 --- a/docs/installation-guide.rst +++ b/docs/installation-guide.rst @@ -13,9 +13,9 @@ Installation Guide Abstract -------- -This document describes how to install the Non-RT RIC Controlpanel, its dependencies and required system resources. +This document describes how to install the Non-RT RIC Control Panel, its dependencies and required system resources. -This work is in progress. For now, it is possible to use the Non-RT RIC Controlpanel. +This work is in progress. For now, it is possible to use the Non-RT RIC Control Panel. Version history diff --git a/docs/overview.rst b/docs/overview.rst index e2040ac..170fd93 100644 --- a/docs/overview.rst +++ b/docs/overview.rst @@ -2,23 +2,23 @@ .. SPDX-License-Identifier: CC-BY-4.0 -Controlpanel Overview -===================== +Control Panel Overview +====================== -The Non-RT RIC Controlpanel is a graphical user user interface that enables the user to manage the Policies in the -network. The Controlpanel interacts with the Policy agent via a REST API. -The Controlpanel generates its GUI from JSON schemas in a model driven fashion. +The Non-RT RIC Control Panel is a graphical user user interface that enables the user to manage the Policies in the +network. The Control Panel interacts with the Policy agent via a REST API. +The Control Panel generates its GUI from JSON schemas in a model driven fashion. -The Controlpanel consists of a back end implemented as a Java Spring Boot application and a fronted developed using the +The Control Panel consists of a back end implemented as a Java Spring Boot application and a fronted developed using the Angular framework. -Controlpanel architecture -------------------------- +Control Panel architecture +-------------------------- -The architecture of the Controlpanel is as shown on the following picture: +The architecture of the Control Panel is as shown on the following picture: .. image:: ./images/architecture.png :scale: 50 % -The Controlpanel itself is split into the backend and the frontend, and can be deployed following the instructions in +The Control Panel itself is split into the backend and the frontend, and can be deployed following the instructions in the README.md file in the repo. \ No newline at end of file diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 71696a9..a075163 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -6,7 +6,7 @@ Release-Notes ============= -This document provides the release notes for the release of the Non-RT RIC Controlpanel. +This document provides the release notes for the release of the Non-RT RIC Control Panel. .. contents:: :depth: 3 @@ -37,7 +37,7 @@ Release Data Bronze ------ +--------------------------------------+--------------------------------------------------+ -| **Project** | Non-RT RIC Controlpanel | +| **Project** | Non-RT RIC Control Panel | | | | +--------------------------------------+--------------------------------------------------+ | **Repo/commit-ID** | | @@ -49,6 +49,6 @@ Bronze | **Release date** | | | | | +--------------------------------------+--------------------------------------------------+ -| **Purpose of the delivery** | Introducing Non-RT RIC Controlpanel | +| **Purpose of the delivery** | Introducing Non-RT RIC Control Panel | | | | +--------------------------------------+--------------------------------------------------+ diff --git a/pom.xml b/pom.xml index 868f8f5..c95b41c 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ limitations under the License. org.o-ran-sc.portal.nonrtric.controlpanel nonrtric-controlpanel-parent - Non-RT RIC Controlpanel project + Non-RT RIC Control Panel project pom 1.0.0-SNAPSHOT diff --git a/webapp-backend/README.md b/webapp-backend/README.md index 4867adc..acec8ac 100644 --- a/webapp-backend/README.md +++ b/webapp-backend/README.md @@ -1,6 +1,6 @@ -# Non-RT RIC Controlpanel Web Application Backend +# Non-RT RIC Control Panel Web Application Backend -The Non-RT RIC Controlpanel back-end provides REST services to the Controlpanel +The Non-RT RIC Control Panel back-end provides REST services to the Control Panel front-end Typescript features running in the user's browser. For production use, it also serves the Angular application files. diff --git a/webapp-backend/config/key.properties.template b/webapp-backend/config/key.properties.template index 74e7727..ecf8b94 100644 --- a/webapp-backend/config/key.properties.template +++ b/webapp-backend/config/key.properties.template @@ -16,6 +16,6 @@ # limitations under the License. # ========================LICENSE_END=================================== -# Template for the file that provides a secret key for the Non-RT RIC Controlpanel. +# Template for the file that provides a secret key for the Non-RT RIC Control Panel. cipher.enc.key = diff --git a/webapp-backend/pom.xml b/webapp-backend/pom.xml index e7ca3ad..ff92311 100644 --- a/webapp-backend/pom.xml +++ b/webapp-backend/pom.xml @@ -33,7 +33,7 @@ limitations under the License. 1.0.0-SNAPSHOT nonrtric-controlpanel-be - Non-RT RIC Controlpanel Webapp backend + Non-RT RIC Control Panel Webapp backend 2.6.0 2.9.2 @@ -327,7 +327,7 @@ limitations under the License. -Xmx256m -cp maven:maven/${project.artifactId}-${project.version}.${project.packaging} - -Dloader.main=org.oransc.portal.nonrtric.controlpanel.ControlpanelApplication + -Dloader.main=org.oransc.portal.nonrtric.controlpanel.ControlPanelApplication -Djava.security.egd=file:/dev/./urandom org.springframework.boot.loader.PropertiesLauncher diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelApplication.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelApplication.java similarity index 95% rename from webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelApplication.java rename to webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelApplication.java index 76bb8bc..dee84ad 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelApplication.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelApplication.java @@ -32,12 +32,12 @@ import org.springframework.context.annotation.ComponentScan; @SpringBootApplication // Limit scan to controlpanel classes; exclude generated API classes @ComponentScan("org.oransc.portal.nonrtric.controlpanel") -public class ControlpanelApplication { +public class ControlPanelApplication { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); public static void main(String[] args) { - SpringApplication.run(ControlpanelApplication.class); + SpringApplication.run(ControlPanelApplication.class); // Ensure this appears on the console by using level WARN logger.warn("main: version '{}' successful start", getImplementationVersion(MethodHandles.lookup().lookupClass())); diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelConstants.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelConstants.java similarity index 95% rename from webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelConstants.java rename to webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelConstants.java index 913f803..2e2d87e 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelConstants.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelConstants.java @@ -20,9 +20,9 @@ */ package org.oransc.portal.nonrtric.controlpanel; -public abstract class ControlpanelConstants { +public abstract class ControlPanelConstants { - private ControlpanelConstants() { + private ControlPanelConstants() { // Sonar insists on hiding the constructor } diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManager.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelUserManager.java similarity index 94% rename from webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManager.java rename to webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelUserManager.java index 663526b..ba42b03 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManager.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelUserManager.java @@ -43,7 +43,7 @@ import org.slf4j.LoggerFactory; * * This first implementation serializes user details to a file. */ -public class ControlpanelUserManager { +public class ControlPanelUserManager { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @@ -62,11 +62,11 @@ public class ControlpanelUserManager { * @throws IOException * On file error */ - public ControlpanelUserManager(boolean clear) throws IOException { + public ControlPanelUserManager(boolean clear) throws IOException { this(USER_FILE_PATH); if (clear) { logger.debug("ctor: removing file {}", userFile.getAbsolutePath()); - File f = new File(ControlpanelUserManager.USER_FILE_PATH); + File f = new File(ControlPanelUserManager.USER_FILE_PATH); if (f.exists()) Files.delete(f.toPath()); users.clear(); @@ -81,7 +81,7 @@ public class ControlpanelUserManager { * @throws IOException * If file cannot be read */ - public ControlpanelUserManager(final String userFilePath) throws IOException { + public ControlPanelUserManager(final String userFilePath) throws IOException { logger.debug("ctor: userfile {}", userFilePath); if (userFilePath == null) throw new IllegalArgumentException("Missing or empty user file property"); @@ -164,7 +164,7 @@ public class ControlpanelUserManager { // Test infrastructure public static void main(String[] args) throws Exception { - ControlpanelUserManager dum = new ControlpanelUserManager(false); + ControlPanelUserManager dum = new ControlPanelUserManager(false); EcompUser user = new EcompUser(); user.setActive(true); user.setLoginId("demo"); @@ -172,7 +172,7 @@ public class ControlpanelUserManager { user.setLastName("Last"); EcompRole role = new EcompRole(); role.setId(1L); - role.setName(ControlpanelConstants.ROLE_NAME_ADMIN); + role.setName(ControlPanelConstants.ROLE_NAME_ADMIN); Set roles = new HashSet<>(); roles.add(role); user.setRoles(roles); diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/AdminConfiguration.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/AdminConfiguration.java index 224d0a9..836f462 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/AdminConfiguration.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/AdminConfiguration.java @@ -22,7 +22,7 @@ package org.oransc.portal.nonrtric.controlpanel.config; import java.io.IOException; import java.lang.invoke.MethodHandles; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelUserManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -51,8 +51,8 @@ public class AdminConfiguration { @Bean // The bean (method) name must be globally unique - public ControlpanelUserManager userManager() throws IOException { - return new ControlpanelUserManager(userfile); + public ControlPanelUserManager userManager() throws IOException { + return new ControlPanelUserManager(userfile); } } diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SwaggerConfiguration.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SwaggerConfiguration.java index b0184d4..fa00b2f 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SwaggerConfiguration.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/SwaggerConfiguration.java @@ -21,7 +21,7 @@ package org.oransc.portal.nonrtric.controlpanel.config; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelApplication; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -47,19 +47,19 @@ public class SwaggerConfiguration { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2).select() // - .apis(RequestHandlerSelectors.basePackage(ControlpanelApplication.class.getPackage().getName())) // + .apis(RequestHandlerSelectors.basePackage(ControlPanelApplication.class.getPackage().getName())) // .paths(PathSelectors.any()) // .build() // .apiInfo(apiInfo()); } private ApiInfo apiInfo() { - final String version = ControlpanelApplication.class.getPackage().getImplementationVersion(); + final String version = ControlPanelApplication.class.getPackage().getImplementationVersion(); return new ApiInfoBuilder() // - .title("Non-RT RIC Controlpanel backend") // + .title("Non-RT RIC Control Panel backend") // .description("Proxies access to Near-RT RIC.")// .termsOfServiceUrl("Terms of service") // - .contact(new Contact("Non-RT RIC Controlpanel Dev Team", // + .contact(new Contact("Non-RT RIC Control Panel Dev Team", // "http://no-docs-yet.org/", // "noreply@O-RAN-SC.org")) // .license("Apache 2.0 License").licenseUrl("http://www.apache.org/licenses/LICENSE-2.0") // diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityConfiguration.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityConfiguration.java index 4b65958..d8c2b94 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityConfiguration.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityConfiguration.java @@ -25,7 +25,7 @@ import java.lang.invoke.MethodHandles; import java.lang.reflect.InvocationTargetException; import org.onap.portalsdk.core.onboarding.util.PortalApiConstants; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelUserManager; import org.oransc.portal.nonrtric.controlpanel.controller.PolicyController; import org.oransc.portal.nonrtric.controlpanel.controller.SimpleErrorController; import org.oransc.portal.nonrtric.controlpanel.portalapi.PortalAuthManager; @@ -69,7 +69,7 @@ public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { private String userCookie; @Autowired - ControlpanelUserManager userManager; + ControlPanelUserManager userManager; @Override protected void configure(HttpSecurity http) throws Exception { diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java index 3d08135..6f3421b 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java @@ -25,7 +25,7 @@ import io.swagger.annotations.ApiOperation; import java.lang.invoke.MethodHandles; import javax.servlet.http.HttpServletResponse; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelConstants; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelConstants; import org.oransc.portal.nonrtric.controlpanel.policyagentapi.PolicyAgentApi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,9 +58,9 @@ public class PolicyController { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); // Publish paths in constants so tests are easy to write - public static final String CONTROLLER_PATH = ControlpanelConstants.ENDPOINT_PREFIX + "/policy"; + public static final String CONTROLLER_PATH = ControlPanelConstants.ENDPOINT_PREFIX + "/policy"; // Endpoints - public static final String VERSION_METHOD = ControlpanelConstants.VERSION_METHOD; + public static final String VERSION_METHOD = ControlPanelConstants.VERSION_METHOD; public static final String POLICY_TYPES_METHOD = "policytypes"; public static final String POLICY_TYPE_ID_NAME = "policy_type_id"; public static final String POLICIES_NAME = "policies"; @@ -81,7 +81,7 @@ public class PolicyController { */ @ApiOperation(value = "Gets the policy types from Near Realtime-RIC") @GetMapping(POLICY_TYPES_METHOD) - @Secured({ControlpanelConstants.ROLE_ADMIN, ControlpanelConstants.ROLE_STANDARD}) + @Secured({ControlPanelConstants.ROLE_ADMIN, ControlPanelConstants.ROLE_STANDARD}) public ResponseEntity getAllPolicyTypes(HttpServletResponse response) { logger.debug("getAllPolicyTypes"); return this.policyAgentApi.getAllPolicyTypes(); @@ -89,7 +89,7 @@ public class PolicyController { @ApiOperation(value = "Returns the policy instances for the given policy type.") @GetMapping(POLICY_TYPES_METHOD + "/{" + POLICY_TYPE_ID_NAME + "}/" + POLICIES_NAME) - @Secured({ControlpanelConstants.ROLE_ADMIN, ControlpanelConstants.ROLE_STANDARD}) + @Secured({ControlPanelConstants.ROLE_ADMIN, ControlPanelConstants.ROLE_STANDARD}) public ResponseEntity getPolicyInstances(@PathVariable(POLICY_TYPE_ID_NAME) String policyTypeIdString) { logger.debug("getPolicyInstances {}", policyTypeIdString); return this.policyAgentApi.getPolicyInstancesForType(policyTypeIdString); @@ -98,7 +98,7 @@ public class PolicyController { @ApiOperation(value = "Returns a policy instance of a type") @GetMapping(POLICY_TYPES_METHOD + "/{" + POLICY_TYPE_ID_NAME + "}/" + POLICIES_NAME + "/{" + POLICY_INSTANCE_ID_NAME + "}") - @Secured({ControlpanelConstants.ROLE_ADMIN, ControlpanelConstants.ROLE_STANDARD}) + @Secured({ControlPanelConstants.ROLE_ADMIN, ControlPanelConstants.ROLE_STANDARD}) public ResponseEntity getPolicyInstance(@PathVariable(POLICY_TYPE_ID_NAME) String policyTypeIdString, @PathVariable(POLICY_INSTANCE_ID_NAME) String policyInstanceId) { logger.debug("getPolicyInstance {}:{}", policyTypeIdString, policyInstanceId); @@ -108,7 +108,7 @@ public class PolicyController { @ApiOperation(value = "Creates the policy instances for the given policy type.") @PutMapping(POLICY_TYPES_METHOD + "/{" + POLICY_TYPE_ID_NAME + "}/" + POLICIES_NAME + "/{" + POLICY_INSTANCE_ID_NAME + "}") - @Secured({ControlpanelConstants.ROLE_ADMIN}) + @Secured({ControlPanelConstants.ROLE_ADMIN}) public ResponseEntity putPolicyInstance(@PathVariable(POLICY_TYPE_ID_NAME) String policyTypeIdString, @RequestParam(name = "ric", required = true) String ric, @PathVariable(POLICY_INSTANCE_ID_NAME) String policyInstanceId, @RequestBody String instance) { @@ -120,7 +120,7 @@ public class PolicyController { @ApiOperation(value = "Deletes the policy instances for the given policy type.") @DeleteMapping(POLICY_TYPES_METHOD + "/{" + POLICY_TYPE_ID_NAME + "}/" + POLICIES_NAME + "/{" + POLICY_INSTANCE_ID_NAME + "}") - @Secured({ControlpanelConstants.ROLE_ADMIN}) + @Secured({ControlPanelConstants.ROLE_ADMIN}) public ResponseEntity deletePolicyInstance(@PathVariable(POLICY_TYPE_ID_NAME) String policyTypeIdString, @PathVariable(POLICY_INSTANCE_ID_NAME) String policyInstanceId) { logger.debug("deletePolicyInstance typeId: {}, instanceId: {}", policyTypeIdString, policyInstanceId); @@ -129,7 +129,7 @@ public class PolicyController { @ApiOperation(value = "Returns the rics supporting the given policy type.") @GetMapping("/rics") - @Secured({ControlpanelConstants.ROLE_ADMIN, ControlpanelConstants.ROLE_STANDARD}) + @Secured({ControlPanelConstants.ROLE_ADMIN, ControlPanelConstants.ROLE_STANDARD}) public ResponseEntity getRicsSupportingType( @RequestParam(name = "policyType", required = true) String supportingPolicyType) { logger.debug("getRicsSupportingType {}", supportingPolicyType); diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ErrorTransport.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ErrorTransport.java index efe2884..9646b1d 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ErrorTransport.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ErrorTransport.java @@ -27,7 +27,7 @@ import java.time.Instant; * This mimics the model Spring-Boot uses for a message returned on failure, to * be serialized as JSON. */ -public class ErrorTransport implements IControlpanelResponse { +public class ErrorTransport implements IControlPanelResponse { private Instant timestamp; private Integer status; diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/IControlpanelResponse.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/IControlPanelResponse.java similarity index 95% rename from webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/IControlpanelResponse.java rename to webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/IControlPanelResponse.java index 3fd5575..377e097 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/IControlpanelResponse.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/IControlPanelResponse.java @@ -23,6 +23,6 @@ package org.oransc.portal.nonrtric.controlpanel.model; /** * Marker interface used by all transport models. */ -public interface IControlpanelResponse { +public interface IControlPanelResponse { } diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/SuccessTransport.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/SuccessTransport.java index 83403c3..3e2fd7b 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/SuccessTransport.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/SuccessTransport.java @@ -20,7 +20,7 @@ */ package org.oransc.portal.nonrtric.controlpanel.model; -public class SuccessTransport implements IControlpanelResponse { +public class SuccessTransport implements IControlPanelResponse { private int status; private Object data; diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthenticationFilter.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthenticationFilter.java index 6a0e4c5..f9a9674 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthenticationFilter.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthenticationFilter.java @@ -42,8 +42,8 @@ import org.onap.portalsdk.core.onboarding.util.PortalApiConstants; import org.onap.portalsdk.core.onboarding.util.PortalApiProperties; import org.onap.portalsdk.core.restful.domain.EcompRole; import org.onap.portalsdk.core.restful.domain.EcompUser; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelConstants; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelConstants; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelUserManager; import org.oransc.portal.nonrtric.controlpanel.model.EcompUserDetails; import org.owasp.esapi.reference.DefaultSecurityConfiguration; import org.slf4j.Logger; @@ -92,10 +92,10 @@ public class PortalAuthenticationFilter implements Filter { private final boolean enforcePortalSecurity; private final PortalAuthManager authManager; - private final ControlpanelUserManager userManager; + private final ControlPanelUserManager userManager; public PortalAuthenticationFilter(boolean portalSecurity, PortalAuthManager authManager, - ControlpanelUserManager userManager) throws IOException { + ControlPanelUserManager userManager) throws IOException { this.enforcePortalSecurity = portalSecurity; this.authManager = authManager; this.userManager = userManager; @@ -159,7 +159,7 @@ public class PortalAuthenticationFilter implements Filter { } EcompRole admin = new EcompRole(); admin.setId(1L); - admin.setName(ControlpanelConstants.ROLE_ADMIN); + admin.setName(ControlPanelConstants.ROLE_ADMIN); HashSet roles = new HashSet<>(); roles.add(admin); EcompUser user = new EcompUser(); @@ -230,7 +230,7 @@ public class PortalAuthenticationFilter implements Filter { System.getProperty("line.separator"), // "", // "", // - "Non-RT RIC Controlpanel", // + "Non-RT RIC Control Panel", // "", // "", // "", // - "

Non-RT RIC Controlpanel

", // + "

Non-RT RIC Control Panel

", // "

Please log in.

", // "

", // aHref, "Click here to authenticate at the ONAP Portal", // diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalRestCentralServiceImpl.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalRestCentralServiceImpl.java index ea97b1c..75ab13a 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalRestCentralServiceImpl.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalRestCentralServiceImpl.java @@ -29,7 +29,7 @@ import javax.servlet.http.HttpServletRequest; import org.onap.portalsdk.core.onboarding.crossapi.IPortalRestCentralService; import org.onap.portalsdk.core.onboarding.exception.PortalAPIException; import org.onap.portalsdk.core.restful.domain.EcompUser; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelUserManager; import org.oransc.portal.nonrtric.controlpanel.config.SpringContextCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,12 +52,12 @@ public class PortalRestCentralServiceImpl implements IPortalRestCentralService { @Autowired private SpringContextCache springContextCache; private final PortalAuthManager authManager; - private final ControlpanelUserManager userManager; + private final ControlPanelUserManager userManager; public PortalRestCentralServiceImpl() throws IOException, PortalAPIException { final ApplicationContext context = springContextCache.getApplicationContext(); authManager = context.getBean(PortalAuthManager.class); - userManager = context.getBean(ControlpanelUserManager.class); + userManager = context.getBean(ControlPanelUserManager.class); } /* diff --git a/webapp-backend/src/main/resources/application.properties b/webapp-backend/src/main/resources/application.properties index 64866be..8fee6f8 100644 --- a/webapp-backend/src/main/resources/application.properties +++ b/webapp-backend/src/main/resources/application.properties @@ -17,7 +17,7 @@ # limitations under the License. # ========================LICENSE_END=================================== -# Defines Non-RT RIC Controlpanel property keys and default values. +# Defines Non-RT RIC Control Panel property keys and default values. # Create a copy in the launch directory to override values; or # copy to "application-abc.properties" as mentioned in the README. @@ -37,7 +37,7 @@ portalapi.decryptor = org.oransc.portal.nonrtric.controlpanel.portalapi.PortalSd portalapi.usercookie = UserId # portal credentials must be supplied at deployment time -portalapi.appname = Non-RT RIC Controlpanel +portalapi.appname = Non-RT RIC Control Panel portalapi.username = portalapi.password = diff --git a/webapp-backend/src/main/resources/static/error.html b/webapp-backend/src/main/resources/static/error.html index c786381..c09d1aa 100644 --- a/webapp-backend/src/main/resources/static/error.html +++ b/webapp-backend/src/main/resources/static/error.html @@ -29,7 +29,7 @@ html, body { -

Non-RT RIC Controlpanel Error

+

Non-RT RIC Control Panel Error

The previous request could not be processed.

Click here to reload the application diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelTestServer.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelTestServer.java similarity index 98% rename from webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelTestServer.java rename to webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelTestServer.java index fdd8103..ea832ee 100644 --- a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelTestServer.java +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelTestServer.java @@ -46,7 +46,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; */ @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) -public class ControlpanelTestServer { +public class ControlPanelTestServer { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManagerTest.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelUserManagerTest.java similarity index 90% rename from webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManagerTest.java rename to webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelUserManagerTest.java index 034a154..00686eb 100644 --- a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlpanelUserManagerTest.java +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/ControlPanelUserManagerTest.java @@ -29,14 +29,14 @@ import org.junit.jupiter.api.Test; import org.onap.portalsdk.core.onboarding.exception.PortalAPIException; import org.onap.portalsdk.core.restful.domain.EcompRole; import org.onap.portalsdk.core.restful.domain.EcompUser; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelConstants; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelConstants; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelUserManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.test.context.ActiveProfiles; @ActiveProfiles("test") -public class ControlpanelUserManagerTest { +public class ControlPanelUserManagerTest { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @@ -48,7 +48,7 @@ public class ControlpanelUserManagerTest { user.setLastName("Last"); EcompRole role = new EcompRole(); role.setId(1L); - role.setName(ControlpanelConstants.ROLE_NAME_ADMIN); + role.setName(ControlPanelConstants.ROLE_NAME_ADMIN); Set roles = new HashSet<>(); roles.add(role); user.setRoles(roles); @@ -58,7 +58,7 @@ public class ControlpanelUserManagerTest { @Test public void testUserMgr() throws Exception { final String loginId = "demo"; - ControlpanelUserManager dum = new ControlpanelUserManager(true); + ControlPanelUserManager dum = new ControlPanelUserManager(true); EcompUser user = createEcompUser(loginId); dum.createUser(user); logger.info("Created user {}", user); diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityMockConfiguration.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityMockConfiguration.java index e72fd1c..e4007e3 100644 --- a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityMockConfiguration.java +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/config/WebSecurityMockConfiguration.java @@ -21,7 +21,7 @@ package org.oransc.portal.nonrtric.controlpanel.config; import java.lang.invoke.MethodHandles; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelConstants; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelConstants; import org.oransc.portal.nonrtric.controlpanel.config.WebSecurityConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,12 +60,12 @@ public class WebSecurityMockConfiguration extends WebSecurityConfigurerAdapter { // The admin user has the admin AND standard roles .withUser(TEST_CRED_ADMIN) // .password(encoder.encode(TEST_CRED_ADMIN)) - .roles(ControlpanelConstants.ROLE_NAME_ADMIN, ControlpanelConstants.ROLE_NAME_STANDARD)// + .roles(ControlPanelConstants.ROLE_NAME_ADMIN, ControlPanelConstants.ROLE_NAME_STANDARD)// .and()// // The standard user has only the standard role .withUser(TEST_CRED_STANDARD) // .password(encoder.encode(TEST_CRED_STANDARD)) // - .roles(ControlpanelConstants.ROLE_NAME_STANDARD); + .roles(ControlPanelConstants.ROLE_NAME_STANDARD); } @Override diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/PortalRestCentralServiceTest.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/PortalRestCentralServiceTest.java index 77038b6..a09f693 100644 --- a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/PortalRestCentralServiceTest.java +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/controller/PortalRestCentralServiceTest.java @@ -72,7 +72,7 @@ public class PortalRestCentralServiceTest extends AbstractControllerTest { * EcompRole role = new EcompRole(); * role.setRoleFunctions(Collections.EMPTY_SET); * role.setId(1L); - * role.setName(ControlpanelConstants.ROLE_NAME_ADMIN); + * role.setName(ControlPanelConstants.ROLE_NAME_ADMIN); * Set roles = new HashSet<>(); * roles.add(role); * user.setRoles(roles); diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManagerTest.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManagerTest.java index cdb78f1..55637d2 100644 --- a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManagerTest.java +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/portalapi/PortalAuthManagerTest.java @@ -31,7 +31,7 @@ import org.junit.Assert; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.onap.portalsdk.core.onboarding.util.PortalApiConstants; -import org.oransc.portal.nonrtric.controlpanel.ControlpanelUserManager; +import org.oransc.portal.nonrtric.controlpanel.ControlPanelUserManager; import org.oransc.portal.nonrtric.controlpanel.portalapi.PortalAuthManager; import org.oransc.portal.nonrtric.controlpanel.portalapi.PortalAuthenticationFilter; import org.slf4j.Logger; @@ -73,7 +73,7 @@ public class PortalAuthManagerTest { logger.debug("validateEcompSso answers {}", s); Assert.assertNull(s); - ControlpanelUserManager dum = new ControlpanelUserManager(true); + ControlPanelUserManager dum = new ControlPanelUserManager(true); PortalAuthenticationFilter filter = new PortalAuthenticationFilter(false, m, dum); filter.init(null); filter.destroy(); diff --git a/webapp-frontend/README.md b/webapp-frontend/README.md index fce6e33..1360dd3 100644 --- a/webapp-frontend/README.md +++ b/webapp-frontend/README.md @@ -1,4 +1,4 @@ -# Non-RT RIC Controlpanel Web Application Frontend +# Non-RT RIC Control Panel Web Application Frontend This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.3. diff --git a/webapp-frontend/pom.xml b/webapp-frontend/pom.xml index 6dfa858..b12bbd1 100644 --- a/webapp-frontend/pom.xml +++ b/webapp-frontend/pom.xml @@ -29,7 +29,7 @@ limitations under the License. 1.0.0-SNAPSHOT nonrtric-controlpanel-fe - Non-RT RIC Controlpanel Webapp frontend + Non-RT RIC Control Panel Webapp frontend diff --git a/webapp-frontend/src/app/controlpanel.component.html b/webapp-frontend/src/app/controlpanel.component.html index bc7a835..3ba12a6 100644 --- a/webapp-frontend/src/app/controlpanel.component.html +++ b/webapp-frontend/src/app/controlpanel.component.html @@ -33,10 +33,10 @@ class="hamburger__icon__fill" data-name="Rectangle 11" rx="2" transform="translate(31.5 30)" /> - + - Non-RT RIC Controlpanel + Non-RT RIC Control Panel @@ -74,10 +74,10 @@ class="hamburger__icon__fill" data-name="Rectangle 11" rx="2" transform="translate(31.5 30)" /> - + - Non-RT RIC Controlpanel + Non-RT RIC Control Panel diff --git a/webapp-frontend/src/app/controlpanel.component.scss b/webapp-frontend/src/app/controlpanel.component.scss index ddefe09..86dab8e 100644 --- a/webapp-frontend/src/app/controlpanel.component.scss +++ b/webapp-frontend/src/app/controlpanel.component.scss @@ -233,7 +233,7 @@ mat-drawer-content { .mode-toggle__bg { height: 1rem; - width: 2rem; + width: 2.7rem; border-radius: 0.5rem; background-color: rgba(0, 0, 0, 0.5); display: inline-block; diff --git a/webapp-frontend/src/app/interfaces/controlpanel.types.ts b/webapp-frontend/src/app/interfaces/controlpanel.types.ts index ec6e5c8..44e1d9f 100644 --- a/webapp-frontend/src/app/interfaces/controlpanel.types.ts +++ b/webapp-frontend/src/app/interfaces/controlpanel.types.ts @@ -19,7 +19,7 @@ * ========================LICENSE_END=================================== */ -// Models of data used by Controlpanel admin services +// Models of data used by Control Panel admin services export interface ControlpanelSuccessTransport { status: number; diff --git a/webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.ts b/webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.ts index 9f3a03b..6663fa5 100644 --- a/webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.ts +++ b/webapp-frontend/src/app/services/caas-ingress/caas-ingress.service.ts @@ -24,7 +24,7 @@ import { V1PodList } from '@kubernetes/client-node'; import { Observable } from 'rxjs'; /** -* Services for calling the Controlpanel caas-ingress endpoints to get Kubernetes details. +* Services for calling the Control Panel caas-ingress endpoints to get Kubernetes details. */ @Injectable({ providedIn: 'root' diff --git a/webapp-frontend/src/app/services/controlpanel/controlpanel.service.ts b/webapp-frontend/src/app/services/controlpanel/controlpanel.service.ts index 7391a7a..5aed53b 100644 --- a/webapp-frontend/src/app/services/controlpanel/controlpanel.service.ts +++ b/webapp-frontend/src/app/services/controlpanel/controlpanel.service.ts @@ -28,7 +28,7 @@ import { ControlpanelSuccessTransport, EcompUser } from '../../interfaces/contro }) /** - * Services to query the Controlpanel's admin endpoints. + * Services to query the Control Panel's admin endpoints. */ export class ControlpanelService { @@ -47,7 +47,7 @@ export class ControlpanelService { } /** - * Gets Controlpanel version details + * Gets Control Panel version details * @returns Observable that should yield a ControlpanelSuccessTransport object */ getVersion(): Observable { @@ -55,7 +55,7 @@ export class ControlpanelService { } /** - * Gets Controlpanel users + * Gets Control Panel users * @returns Observable that should yield a EcompUser array */ getUsers(): Observable { diff --git a/webapp-frontend/src/index.html b/webapp-frontend/src/index.html index 817c092..83f24ae 100644 --- a/webapp-frontend/src/index.html +++ b/webapp-frontend/src/index.html @@ -22,7 +22,7 @@ - Non-RT RIC Controlpanel + Non-RT RIC Control Panel -- 2.16.6