From 4300a80e3cc6a4f1f755cf57c0289c72f354b300 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 4 Jun 2021 10:44:55 +0800 Subject: [PATCH 01/14] Update Dependency-Injection.md Resolve #9232 Related: https://github.com/abpframework/abp/issues/364 https://github.com/abpframework/abp/commit/4c04931b63667497e536d965e49f890c91fd4c8f --- docs/en/Dependency-Injection.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index f94901ad84..ee739a0880 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -59,8 +59,7 @@ Some specific types are registered to dependency injection by default. Examples: * MVC controllers (inherit ``Controller`` or ``AbpController``) are registered as transient. * MVC page models (inherit ``PageModel`` or ``AbpPageModel``) are registered as transient. * MVC view components (inherit ``ViewComponent`` or ``AbpViewComponent``) are registered as transient. -* Application services (implement ``IApplicationService`` interface or inherit ``ApplicationService`` class) are registered as transient. -* Repositories (implement ``IRepository`` interface) are registered as transient. +* Application services (inherit ``ApplicationService`` class) are registered as transient. * Domain services (implement ``IDomainService`` interface) are registered as transient. Example: From 1597ba44291b6417eb038fe239a0ab05284fe74b Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 4 Jun 2021 10:47:12 +0800 Subject: [PATCH 02/14] Update Dependency-Injection.md --- docs/en/Dependency-Injection.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index ee739a0880..35bb19f5cc 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -60,6 +60,7 @@ Some specific types are registered to dependency injection by default. Examples: * MVC page models (inherit ``PageModel`` or ``AbpPageModel``) are registered as transient. * MVC view components (inherit ``ViewComponent`` or ``AbpViewComponent``) are registered as transient. * Application services (inherit ``ApplicationService`` class) are registered as transient. +* Repositories (implement ``BasicRepositoryBase`` class or its subclasses) are registered as transient. * Domain services (implement ``IDomainService`` interface) are registered as transient. Example: From f13340a1c6ada8464c8615fb93eec783902d1c7b Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 4 Jun 2021 10:48:03 +0800 Subject: [PATCH 03/14] Update Dependency-Injection.md --- docs/en/Dependency-Injection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index 35bb19f5cc..e5ad10aa93 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -59,7 +59,7 @@ Some specific types are registered to dependency injection by default. Examples: * MVC controllers (inherit ``Controller`` or ``AbpController``) are registered as transient. * MVC page models (inherit ``PageModel`` or ``AbpPageModel``) are registered as transient. * MVC view components (inherit ``ViewComponent`` or ``AbpViewComponent``) are registered as transient. -* Application services (inherit ``ApplicationService`` class) are registered as transient. +* Application services (inherit ``ApplicationService`` class or its subclasses) are registered as transient. * Repositories (implement ``BasicRepositoryBase`` class or its subclasses) are registered as transient. * Domain services (implement ``IDomainService`` interface) are registered as transient. From 713953a2a85a10c21696a232184336817afbf320 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 4 Jun 2021 13:40:07 +0800 Subject: [PATCH 04/14] Update Dependency-Injection.md --- docs/en/Dependency-Injection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index e5ad10aa93..f4398488e5 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -61,7 +61,7 @@ Some specific types are registered to dependency injection by default. Examples: * MVC view components (inherit ``ViewComponent`` or ``AbpViewComponent``) are registered as transient. * Application services (inherit ``ApplicationService`` class or its subclasses) are registered as transient. * Repositories (implement ``BasicRepositoryBase`` class or its subclasses) are registered as transient. -* Domain services (implement ``IDomainService`` interface) are registered as transient. +* Domain services (implement ``IDomainService`` interface or inherit ``DomainService`` class) are registered as transient. Example: From 5c281bcd61e4fc808f9e2e3686e5c1bd67de657c Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 14 Jun 2021 13:35:12 +0300 Subject: [PATCH 05/14] Update Basic-Theme.md --- docs/en/UI/AspNetCore/Basic-Theme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/UI/AspNetCore/Basic-Theme.md b/docs/en/UI/AspNetCore/Basic-Theme.md index 67977ffd4e..3c63eb6b6a 100644 --- a/docs/en/UI/AspNetCore/Basic-Theme.md +++ b/docs/en/UI/AspNetCore/Basic-Theme.md @@ -83,8 +83,8 @@ See the [User Interface Customization Guide](Customization-User-Interface.md) to ### Copy & Customize -You can download the [source code](https://github.com/abpframework/abp/tree/dev/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic) of the Basic Theme, copy the project content into your solution, re-arrange the package/module dependencies (see the Installation section above to understand how it was installed to the project) and freely customize the theme based on your application requirements. +You can download the [source code](https://github.com/abpframework/abp/tree/rel-4.3/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic) of the Basic Theme, copy the project content into your solution, re-arrange the package/module dependencies (see the Installation section above to understand how it was installed to the project) and freely customize the theme based on your application requirements. ## See Also -* [Theming](Theming.md) \ No newline at end of file +* [Theming](Theming.md) From bdce28e9ccdc3d2327115175883d80eca704cd7d Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 14 Jun 2021 13:36:48 +0300 Subject: [PATCH 06/14] Update Basic-Theme.md --- docs/en/UI/Blazor/Basic-Theme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/UI/Blazor/Basic-Theme.md b/docs/en/UI/Blazor/Basic-Theme.md index 926d15cf11..d2947ecb17 100644 --- a/docs/en/UI/Blazor/Basic-Theme.md +++ b/docs/en/UI/Blazor/Basic-Theme.md @@ -50,8 +50,8 @@ See the [Customization / Overriding Components](Customization-Overriding-Compone ### Copy & Customize -You can download the [source code](https://github.com/abpframework/abp/tree/dev/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme) of the Basic Theme, copy the project content into your solution, re-arrange the package/module dependencies (see the Installation section above to understand how it was installed to the project) and freely customize the theme based on your application requirements. +You can download the [source code](https://github.com/abpframework/abp/tree/rel-4.3/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme) of the Basic Theme, copy the project content into your solution, re-arrange the package/module dependencies (see the Installation section above to understand how it was installed to the project) and freely customize the theme based on your application requirements. ## See Also -* [Theming](Theming.md) \ No newline at end of file +* [Theming](Theming.md) From d7ec1ed8c379839a580b0e2920953bba283ca577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 14 Jun 2021 16:34:04 +0300 Subject: [PATCH 07/14] Improvements for the account module documentation --- docs/en/Modules/Account.md | 52 +++++++++++++++--- docs/en/Modules/Tenant-Management.md | 2 +- .../images/account-module-forgot-password.png | Bin 0 -> 12926 bytes docs/en/images/account-module-login.png | Bin 0 -> 10767 bytes .../images/account-module-manage-account.png | Bin 0 -> 20471 bytes docs/en/images/account-module-register.png | Bin 0 -> 11044 bytes 6 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 docs/en/images/account-module-forgot-password.png create mode 100644 docs/en/images/account-module-login.png create mode 100644 docs/en/images/account-module-manage-account.png create mode 100644 docs/en/images/account-module-register.png diff --git a/docs/en/Modules/Account.md b/docs/en/Modules/Account.md index 94cdb7af95..72f6f55c0e 100644 --- a/docs/en/Modules/Account.md +++ b/docs/en/Modules/Account.md @@ -1,12 +1,54 @@ # Account Module -This module provides necessary UI pages/components to make the user login and register to the application. +Account module implements the basic authentication features like **login**, **register**, **forgot password** and **account management**. -> This document is incomplete. +This module is based on [Microsoft's Identity library](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity) and the [Identity Module](Identity.md). It has [IdentityServer](https://github.com/IdentityServer) integration (based on the [IdentityServer Module](IdentityServer.md)) to provide **single sign-on**, access control and other advanced authentication features. + +## How to Install + +This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. + +### The Source Code + +The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/account). The source code is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it. + +## User Interface + +This section introduces the main pages provided by this module. + +### Login + +`/Account/Login` page provides the login functionality. + +![account-module-login](../images/account-module-login.png) + +Social/external login buttons becomes visible if you setup it. See the *Social/External Logins* section below. Register and Forgot password and links redirect to the pages explained in the next sections. + +### Register + +`/Account/Register` page provides the new user registration functionality. + +![account-module-register](../images/account-module-register.png) + +### Forgot Password & Reset Password + +`/Account/ForgotPassword` page provides a way of sending password reset link to user's email address. The user then clicks to the link and determines a new password. + +![account-module-forgot-password](../images/account-module-forgot-password.png) + +### Account Management + +`/Account/Manage` page is used to change password and personal information of the user. + +![account-module-manage-account](../images/account-module-manage-account.png) + +## IdentityServer Integration + +[Volo.Abp.Account.Web.IdentityServer](https://www.nuget.org/packages/Volo.Abp.Account.Web.IdentityServer) package provides integration for the [IdentityServer](https://github.com/IdentityServer). This package comes as installed with the [application startup template](../Startup-Templates/Application.md). See the [IdentityServer Module](IdentityServer.md) documentation. ## Social/External Logins -The [Account Module](../Modules/Account.md) has already configured to handle social or external logins out of the box. You can follow the ASP.NET Core documentation to add a social/external login provider to your application. +The Account Module has already configured to handle social or external logins out of the box. You can follow the ASP.NET Core documentation to add a social/external login provider to your application. ### Example: Facebook Authentication @@ -32,7 +74,3 @@ context.Services.AddAuthentication() ```` > It would be a better practice to use the `appsettings.json` or the ASP.NET Core User Secrets system to store your credentials, instead of a hard-coded value like that. Follow the [Microsoft's document](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/facebook-logins) to learn the user secrets usage. - -### Other UI Types - -Beginning from the v3.1, the [Angular UI](../UI/Angular/Quick-Start.md) uses authorization code flow (as a best practice) to authenticate the user by redirecting to the MVC UI login page. So, even if you are using the Angular UI, social/external login integration is same as explained above and it will work out of the box. As similar, The [Blazor UI](../UI/Blazor/Overall.md) also uses the MVC UI to logic. \ No newline at end of file diff --git a/docs/en/Modules/Tenant-Management.md b/docs/en/Modules/Tenant-Management.md index dca6ea3d1e..e12b6fc7a6 100644 --- a/docs/en/Modules/Tenant-Management.md +++ b/docs/en/Modules/Tenant-Management.md @@ -12,7 +12,7 @@ The [SaaS Module](https://commercial.abp.io/modules/Volo.Saas) is an alternative ## How to Install -This module comes as pre-installed (as [NuGet/NPM packages](NuGet/NPM packages)) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. +This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. ### The Source Code diff --git a/docs/en/images/account-module-forgot-password.png b/docs/en/images/account-module-forgot-password.png new file mode 100644 index 0000000000000000000000000000000000000000..92fce47a228001a531a60a0cd22e6628aa21a99b GIT binary patch literal 12926 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 L6)DIEo7)~uB`D`%g5_TDG&-p~6!&)(6Gbst_} z;$i}UKo=ld8u}p6sS3bG|2PelM6oCKgFx3o5RJQr0a;5Ep>BqAn3c8OSjZpwLI?PkTiP0dKd*3r26}D2ICZD;UcK(SvpSg<_f3#St@byNps_m{~ z3srZ2M07ZK|1jkdVoU09kV!xIf>9=yS!b#R)01x+tgo+YR-1!3EmT!iYdt0!kXs9a z@hbF|2v*mY{;9v=5~R1%>ClkP{)e(o-*<7(`6i!yUv86Tso6)hVFjh6(2n7BA*Y1iX>TqS16}`*jbe+@VYR_(N_MZ zCrA{5(xgwGue|Uy>ki%T)ZbF$OXJr-%i{mh`~QDaHuZp9Pw`JC%?7*6(D52&CW^*n=v(SRb=Kf`6EPf*vWMwXb3A=ldd%$$r#>#>WXq=5LI4eMH{W<$90}lML z?(R~OsD-X(=pKF6QC4VT_bW+9T?OO1XZxi#r|NWnj_Y0*eZ}yGA;RU3=m9zOgX=+% zU+|X>bW(p#u=AE+;?P8$`nttr#~*c{T6d{)Q^kos{1+RMpqYoUEvqaXa}1M^PRJ0KywyB`RQz*mx1gfrQcIo8d)ZrM`HNkN`L$NZWP|i5rI78s z9PNQ$ufb}6L5@VT6NNDJ)ceE*e|fj#+J>CC-~v!v^!c@;R&id@NySmxAZL)Uc8n8r ze}JsOaTpZZs6^ONNFn>X9gd}J@Eh$E>eBng6AC|8BL4e;@L=A&wNB* z;iKWjeR>k1V`6PK$B_6KfvgCfAzIga0)j;y_Q^bC?t$`M3nVAi_ zECE?(tT|ZJ3h;ck#TEj85K!s)bD+#E_%OA9H6|tt-kFr@7NHb4vdV^gvKMkk``zXzI`q=pP*Pneiq!1#T?6+fKJ_MG}uc&*nU0 zid3#a&o*#@1QFYdqv=)a8|&*$R%PweYXK_3W6%SyDa(bU?hb3MM0EEw2Rb}D9?H|# zJ^23crw2sLvTAeflR3k)=JOS8GD_wlb@OxaL3>?Y1nJ|!Bw;^m*F(n-{?zw_iMQ*$ z2kE`Db!wm;P`V3D`RdVR#WU(*yo#kIQBJzadX3?Su7e%rfJmt-*dOWDJD~eEZUtVD zJK+^v?gE~}9uN!t%Sy#YJPS>V^a$*K6 z8%K_&4YsKTpX&zwZg7rV)p2L^&t@^&Je-#Qd5DzHuJ6J!XBzckXZmD z5*%Rdkymm?*-IW*YIdADmsw$;q_Qq+lj{{ILScB@l98cv7gD4=;BZl%j0Q07;FFe* zLlUvB)f)arz``HEy`?gps7jW5`WIX+kV~WPev==2J&{^V$yZ|BzK__eyV~a$uP823 z^sUXt?x0>-q&|jC_43#%?pG*Rbd5P5@7Q=!Ok8&cozu_@>ic;zIk($olNx@-wr9+J zLJk$)FAAs^*zgIAC{A@~v=K$UntL{-6IirV_If&wq0}j~ZkTU#$<8b(cmlbDDfUQQoX3Y#$kT@!)ax`i$BXgAC0^g%Q2=4-E6Y%(o4^aiZ8UQFyd?H zj}4F?UwH@iA8)0$=r*N~t|tp#6^0Dk8nNO;>*9-LD`>kGv+M*1qZFYB+;KbC=!~p2 z{vWIT-6Y+QsLEWzz+7{KFS)==S;cs->S_~es$dJe;-7}K?GniM5)HF6&Xdjw($4AH0!@)bL0if}k&UCzmAWe_0V1dC4sVQM3F2 z%+wXBh1%(!m}`&0u|&o!fTzdriy5;Np2By_WU2VS5= z?Z2TY`}Lw7<|+T|y|8p<4(HgdN-?TIwT29XX>nAQb4kqT)f;OZSk1EjIG;}IHQyEj zeq`)nu2?A2FQLSC<=oN}$VNX*$b6###=Kt zL2|<81=D@g0$^Fu^JedPnQ(iSE2m6a)X7IuTQbW9OVAvXhevddqQ(29R>gAUgS$$R z%jSb>C@CHmYAJST%7OmaL(?E5F-a(Ze;SKj&-HqS#FBYnYOgCqLe zyl;;Shym6mA=QOJyYnitwRp?z=VB_`^*D zwT_)%3*H@yS9E5)+rD-2i7QSD4aHzeKb6a!U-I+xdNtcq3vSC+9P{+5b2wlC97{{4Lxp=hi)bFsEZ)y*CVkl8nU#;&hz_!N~x3(U2JZ6fb)yuOP zMB96KS6BOMlMgCzG?TTPQ-Xqf9O1NO zhilNJkUcB~v zLS8W2^_WV@*#-cmDAS+Z^ocL0iUXSM!`F;>b)zoGyx~=48S-)0rvC-BPLh;uFHC5To&5gg@T+iRrp&fy z>_^jwy!+>9)WCGy)O3Q58UBf6;~@EWU712_BU@aRGkPvyL0(hs_wkc-#AVd6FP+#@ zqMi{FV)ggc+Qt=!!v?>`{n^qn{@|bu$`&^UgXvhq&JVwQSwb zt5V|7&J!YD61IAvCzVe`_;Vh2_%Ji;u&ykbmzNi*Wh-gBCsmm(Jkcpr;3+X;gtw!#}}3|=}m^mO@UvP?(8_Dhl>DR>8)r7FmQc|cTR}fGIOEy*l_Kr{*Wj7p}gb-pN_lH)?g7oFeO^z z+J=lDCjvRhm7w>xQTrRbZ^DPmt~#jSxH*j-q%t}kzIUEDziB_^lv{nTp_=ws`Ue<2 zP!`qFlk}d6Y7@`?PWAvU;2h zlj#H`p4cGd*6+~=d;e+sI2GhDJtc>(-(X;pb0A=AXSB3F8TEv&oumxB=ZY86J_j@X zk<*7#E-Vlr(P{%aMr<^2nP2mnJI6&uj@4iPGZg#2;@EcL**?FP!F?^GEkWooTJSGM zRsun7>>b#5s9tU3E^4SE#mwhmF+HSL`WvIuQQtYr`OVoW=%$eyQ;`S8{=&!l8ks92 zds{LPeTmA(6|mM7m1>bcCybY1H~F?bAMMU|n|z$kTC55}p?rUAo3WI#Sbr_F@ogX2 zWNZ_lPV!wKNWaKx*zd}k29wkMm3__qJwI@l`+?&*7>7b?#QhdJhg2gEw!nrr4b!b6 z{dp2Qi?)^Ee7n(0E2pcD`l^=C(0?w}`^DFzUQ<{BB=hLdIVb-QEMEd zg=WfFAF#7XNKV@F-k`Dt+t*mtl zUErioWUc)b>$_izQC#S=k7^+LMu(q@`lM%j_GoZ_zVjn`A*(ibI3IOmx@vrRl0)xD z``!H%(ckPIE@%e7xTq3X?)sD{y0mk;>aeeB!xi%Q30;uo}{6hNj{ccT6J=4o|6klhoe3|PW!W}RzJ36D2#0}8UkK33vZ}7 zs1>6aOiB_83Ad0K=b55dVEj%Qp{KITmw4c8T{S&?(XdO`9W_> z#;`>v-5mev>CAe(ozQqjbhJj|B>`!Vz-Ft|$={;JpnpW26Jh87mOX=uAe*x_1QKXs zAcs^fp(ZOmd@<+wTBoUxQCO>bq#z(SeOvAv<{sqB&Y+2DelATn{gLT+WYr%L}KZPt^rwagGF5mR9EhAISz2W%OCWHJHhnmSI?SwB`{#19Jis6)=v| zE!`qekw=UhF<0Ex!H~6YBB5Toi&c$!3+3kq?j>fxwb33q);Zbr zwMKM|?9Stv1fvty>}fdi259k!EI%|+EXvrj3QdE$jq;B4bB=!`{H;IVWud(^!Khby z{==bLYQB$iu2{Aw_;a#*U_Dgd1eMu2r|z+|VdPf9M-XvQ*QltC*C>AOv;l1_A|*pA zzQNzOO#Vg-Z$G7fA7@Y|TA}HauCOHY1XI3&+PG7l?R?wyQTNP838IvQxO>%$ zH9O~O3ebhALGI3h9|p3okFAr5kB942``~KIh>&+{rM1(EJ&4<9O^8iJos?MOU>_%} zxs}3i+ML_6mi8P=Ij^@w}xub(eVa z%mJRz6}jaTGDVvB?k2Ux|5x?GT=$<;K5I z_-~mLSu9#37mJl|fD-^FMr+6bYIk{HbM{kKJ;~MXjQ@cXQvg^K)lnWjZq%lB<|Zr6 z#+HBtEg?Ltd2PRH?&|kUTAQgaJfn3gb?*E2Om9%~-)Gv`%gCAP8~ut^!2ry|$TF8b zE+hkJpQRXVjxPqiod5vYBPd9gY!v&#LiSdImdw2~ZIZwX4R9Z}GX2MUFaMQUx<|K0 z85szA{{)H4(J#of4nKCmpCoA3_Ue$hiRUi>yhbhSk@l1?20oTwPofiZP*sn0EW)zB z&E*oO$>nGbateG7+y)eT1K|tW>32%-wqNHj#*NvwsnlNUSkcQJuvCVY*)3$Ds*2yI zrg{S`w8u~Kq?2TzqQkNC(G39Z(;km2AiSL6_brm29|>l9**ItMAd>nw{MW64by#lGf>sKV8n8 z$fCPK5I}dMy?!8}tEGr~U(?A(YLqia$0Sh&y?8S*bk9Pg>~bcB;(^rZT+NnJpSg-E z2l$;2vP<8M!fn^)Q`m7U+J;G8`pZn|BM%p$jrQVvqrbpX6$F2Uf-w#GtDZ_jS4Lg< zDP#%U(;RC3O=tVYbD{2CTFAHg`1_yKFj_zqFxbb`@@D=M>nwPI`1PFtM23TE$@z00 zvA&A?RL*&C`JN*ds6=DY3?%sFpq?>|eVD1XDAzpO74vNIqq#AUNdQqSE;HowzK(jM z`4UESGFemt(uFy^G5v(Son6_3kLKnx)h!Xct(0n6l_%dD@|8Zm$h^`!GCor`Qj&s& zSH%_XWMYeRl%qu_4YveLE?yR%_us*kSl0qddz0UOUc9GOV@O_Am8@cq#?j$#7dZmJ zU4Hs(r7o84>SbG)?k=FrE?RylGcSKeF6-XG-CxU5sVy%jI~7I!dPy&0>^=Tr#OlNh0Qj`)KFky zG9eL$lBnJr%OB{LI=LERP2`Z_#wrKy*yzW#lbRBTK7}^~*XDe_cyK+BzjzE`a5&`P z@BKr+NM`}Y5jU!g;RyI)vwp8^!#p)<(wB$pop*5!11>dc_)hTV=ZgHScpcSN*zTRd z(b2#q`kQz)Lf{5z$)dKgN|Qf5?S#XzGrhdlp9B@5j-^!0|M4z1pN0|auqI!X`r!UZ zHNQyBqd|+G%bV3K@kU;fVU@!Glfk}kv(oqEg#2cKkJCiA>D}+psKr;r%Anp90JN*TRH^c_xo0$xjoiL+V|3Q-+G1JE-UG&9gnxA{?$(u6 zPsDNwmoBS+@B<$n3xG7ay2L;2*o)H~mb*$;%tWiJCSOE}=Nt#1o4=sW!rrZLY0o_v zF6kMma;q46m*$`v_>vILrOaAtDKWQUS*`_-FEZfjWVKydjP1UcBfueCJX9yPO?yVa zECfj@-f}a|&WrQo&LLE5b?wkbzi({&AWik-Akg{Fld}Mm z>B-upMvIGX#;u}|#sN8hda=0( zug7Dz1OcyLI1BnmYOs-dEbFA3iv62{)Pb^<^DpEV;b=o?qL$yoWmluWh#ySf=SfB= z@WkyZUjUe|I8(mj(Yni*wF(OX{+G@+P2yRl3p=vgSpn7=6DyBDm`wK!(TLA#E)v0W z@dEyjqJqVE?&^3wm?| z4Sv;<`tup@7K4(7z6$O~?(Yj}8ynp;oQIW9V(N>OZ}+>08(ypUR$Ke9D<`B=6!!xs z7yi4(wW?$sHiq~__lW&0E8Qb$QBaNLfwz~MhderG?C1%rH&;rjc$dXj3vAKoz~T$Y zw$sS953a`8%3*AE9B7HQ`ee}kPRSRw(oKl|d%bR4pI5fjK_T*(XNuwn?1CHq99%DV zy*j4M6l~5XFFSr$toNf^3aM?&Zb1X^lKe()$?ygNPLl$7!v=Q4`G~xic3kCi)_u=< z&OWCnM=^`A0i>7J?)PVwjY`3u?xiLj4VxDlZR+yu(q00|;hh`Dk%@1cEsd!1<5EJ5 z+kBfuW7xnAh}b_l6je&@ijj2r$AGATs7UHQ2t9rXyyf1N(URAP>pay6md&1p%fjL_ z=f_434R8z`>=53d0?i_{Xo|(TtQAvT>LLw$TwQE9VncL%sAf6h_E6ukKmbQ^6*Eer zOJ1`4=-mB?D)gp!&t<#VwBA&yC`I^MCh3mvYA32AsDXqZXpH&TM8tMsR8I6QRU64c zq07U=f7=YU+joinkKME)bh}DrLQ>m zW@8k^)xqFi+7?m;;LL-yZ!FrQ2l+AELmXYYwTPox1d)HY>hm8OvFz<{)PY^NZVd=< zyQai#?Z;AB|3J~}7^lB$;lzvJN|P72Z0qi@g`>JfUv{f1tC>09^QIkYfH?8*$Mt+^ zC@+wW#M@|)&3~nxBsGYcYU}y^m7>yDg{Xb~ z^fY;RjDFNuFJ-3zuyYJQARvPnyys(vO4GmPGD-K;Z$4NcLC^d<$q#(8y5(Nr6Elk ztP`XPgV({i&lQngrDu8$NN-N>FYGWs_-qd*|I){u2#sP@Q=+UTaRJF6K?R@dqsbawRR-YX>a3@B*( zl{m6UG3;De7PXULe_Ei|@a{*b!{Wswb;}eq7@hz5tNHI?)Jo>x$(zlgU1?^{2*tdy zZx0|y7m7>rn|;poR~4I2yWc8-ch1)#{O)F`=_HbLQ}cVMj`DRXyTC3&b*#r11>yNy z)QM!~x6z#Z9*r9-R(4Z=vE4#T&ELm8Lo=b4tnuynBTnzan z5S}fyp#2Kn^IGHm(4u*LpJJiIRdqiL^BU9MJ6u5szZ_1+)}rD{AU4P?Pd<=pZAp}N{B9KAzpI$1Efcdz?g4|rAfid2j&6Vw{X`*Q^WVU zfoV`xV%U{6=A}Az{ZLofQ>@awSEaC1G0}Ic;UY2b^>m@_D!<pU|zGXtniC+b-Mz2;|#KwI8tM=_}6XVA{&^jB-n=zB2*Ljo+%z`*82{mzO-^(tD| zy3c6-{lkw3vSMlZrf}CwXX~QAY5ba;*ET=8rYdWZnA|rU?^_3iO&;&6{8UwPrOSQR3Aby}xqiNn=-ATBp~(sT(LCL!-of zEIYO8_YwP6^jwQ$@M&qa`hcuIKzVV{GoXn7Pt4vW{r4Jx__y$9Ky8l&65h7Ux>Wt; zIK_}8GST2i!)u=o%c}RIk$~$96t}lm{}Du?AugRM;wD0>n|=2K0|WC6t^CqKzeHXJ&*iM+4^->075;(g4zL1yJR!LI(G+w)>p`a}`f2$rk{T%iCTW zUoW)x3fpFI%x#~pnC&rs*x@ih+e&-|8vmLE!J#6|E~x1mit&`*7GgV9r(K46g^)v_ z?LVd+Ielbe3_}U>!XiXQex%SS0vftBl@0=y00JV?r38>Fy#$D~#7Zv$(o2+HgLFtpQ0ZNI z2c-oFMQR`rIB&kaXU?3NfB$=CPT}IZlD9nlS!>=SA7_&_?b+rZ@ zs&~ohB6n0RFWF}hS)s1tADqq(Twf9#%=^&DoT1VX;Np=H-F6nQ>l!VGmWpQm5Hf}< z476A76j`~{B!X)S77bCs^Nwx@6QU>=gx$UfW5aq{WMJz%L>LaPS>k7oKsYr@N4lN? z`ULuX-});J^~>w858hIH3Ce!_jQa7J`2uwqpikfjCxDOFIy?f@%V(jd|0<^*{h4}s zUyzBJ`YEvU`p4GMeh>1f1Z_eWG~1mfe?sIu^@)l(1oB=zo1Czixb9Dof0wo!F*|;9 zoJ>$U_StGqxXky2RS9ue<36i`eoTG;{Do@Q=_4|+#C57p_Qg!YyY~Xh0nd&Li9?Mc zm%04^e2*5Qr@r^F6)1BwZ+^rJ24_&82GvXdv=3c)AbUM>W40yA)S3DgLuhjp*Sed` zS=k5LZ!s{!Q)?c_r_=|mvtVxSbLQkXrl+Zw|9&{i|2uQ>|EBP-qy87&y?l-pZEVgS zk+m>Z7H|2JIz6lCoaD4Z)F7{YtmN1nPukP~>&F9N{rpJxfrY*u+nne{;CE5h-(gmFr0TxFZT{ZAo4rky!2WRElh{HidVlt#@q2RfBfOtBj7E zAW*n4`Sa^Po()5u7~A2Tl}@hQ5_H*_9J|wI)eh4~^DR&?SbDh{uWQGZ@9jFii|*Qr z(7Kb%<2CTOk`CApoB_}7*AV6Kyu_s40&aF4RkX?JccD5F1FEZg6%K`d-^^wT6b___ z1G6f5_P`3VZa+Bj8+>4)QQoyrs9z>V>ErRjZCeWX!HO^2*EzILFvr%eK_5AUKYmj1 zd-ClWZb`SYos1^RaMiE*gb*zd==}*MW`;n$UI$Hb0n=8rX8syZO2P4K3cL?Ic&2ORlYQ_Exq#a%*AKQVDwG;NIkJl5k5DiQ<*+3dopMpFMZ3P*G;X z{#|ANO)yiM47cpQosk&sv(}Q*`PKMUr^)DPzl#hZy*yoMnaHCLc6TLuDMaUy=(>S9 z|D=GgHUY`Ol+=A(X!|LzDid%)O;&i(O2Sr|&f(LCnAMtz=di=z`FC3c6I^9i+w&w! zA1t5yc70w$YNn7JAcEJ%g|CoD`~=5cx;3T;?BdAn*~Y`>Z&(YR*me9kR=y%${W#qC zuGM2!G0DWJogb@1=zqjsF)_&B z;5&Zsd956rFv_k-@PB z6OQX=gfPZpL)B(QsBPVVb|=(iH8vSxUgMzwMdce+I}OcN#mwsS-ia!nt`?HF`DlZ6 zg{O~^!%}flJ#@fcud#1%hfUUV-8%4DpK(nSGRNf<4X1bw8VqCdySJwp*5N#~xlY-% zYpqb|D8ULoQoO@uOjMfCk12C%SsP|~VntP-DjLCjc?EJtn~e-UZKG=Qb19Yn=Z<`K zQN{5-U_-7AWXOoJIbRS2V%>H*IZ64TZ!g-x$x(0@bxae)!IVD3pssvD|y?!x*! zK7!=%ef`KbB+tWK=F!@{o8-H_gs=yzxL!q)ZHroxzvh}Si8JQJT84CRtvX%pbmh8g zbzIy*Tqy09ra=y)~Mt!>{S} z+&TTe7je7WF5Z*w`MXx5elc~@7=%Y9R$?izN5o|Sr(>M3;fgb8fK{ZyTXGj0uWfWc zO(IGewj_*n7Mg1mOE0N@Ib~u$s=fT_ni_cK55jk zjUj(ZuuL-DoSpa8;kCZY8Gs_^xS8~M#j+|4(fpZU`l&LiHI0cey5Me-;p#;u4*vO| zwKqt+LL0Lrt$5a7Om@wW#e-!>1LC0ZHS1d{UxFX3)zE8-vfqG&bP9bE=k;ir{A^}= zb9se-lgM-@jEIk&Bn31Oa`Xq+)csHPu@8bBdJCKUwJ&w&C|+hb+0cJ^ z>++-OBK>+(ZI1$zMuUB%p)JMTS?Ab*6u;&P;k~BejX(Uvr*b{vcw~`*(Qi_I4IhHsY0>X&@nO)zIks$aG~@Nu7S8StYEu7q`Wm`&LYcQ zJPT=aR7DtUm=*yR=Nrvrl@Q~$Q5E5 zOUGEM@vg^DLO4N&v9#kRDy`mV4Kw#sayb1mOSW|&e9Lt$b^nN8$MTQQY)3X^4pLrS z6?0~4fN*bAx6gGG=g#F zkje0>8szNbSez@elwUC<*ulZ~JM#J{8s=QJR&Z~s`nWy7)?oBI*pSZM;AowfX5w5i zzY=l9%fn-et49x=RT1 zBP8zA4nssSCPJUi_k5N|`g5C4aN~ZAk2)CAq?f`n;>~+L#@XN!Y_#G79FhzL$g#K- zk3a>iMBaQ8zjX+#-00%qUGvq8R$H-6!-v=U+`6z!#a+{F=P$=;RJO4ZP+3MxG+XLg z@Y+ZSZ*c%JAP^=qvD!>O1#2qM7qi~s8kKY&>dBEc_Zm)f-hiWWhj90D&8wfKHpgN} zcsu;P)`Xp~_*0YUgbt~qE%C>$ribODXGyfnPyNRR*Do=KAosKJ^~UVt8if4ceU)bP z!HHRV$5tbV+mo=6*)dPT-gg}QHk)>6ZdgJG2cS(t z1elY4vyIucvb<|$|G=~naxm0}rpx9sySyLWn6F$Cf4K{cYK!5bW#x9~>Rqg^ht@nH zM)DwC6^V4W{UXYD>AYPsLCQ=MJ=$a89JmEc2W^Rug zm~v1+)=qjam+um#3i-=Yor%mLB$J-j+QKplOoEc&SBlS1f*nW;fx-O?*4dA(VuK$a zn2%$4+IlVqfj}14A6{||9A49TPGCDDeW^=Fz{B>nkNP`-!=mAw+yi1z)T?u|v>l^8 z5ZhMM=*TdS$0CLa^sjPmny<0eJ-V2N&;=U?G@p=@|Mb*{NV7M2%cEGhZPbF z*e%k74)v|nMaZ|q^#>)Po+UhYLV>+tfk9(cU$$?LsGUl?lD&EOsK3}{e&Z4dG=clL z^3LO_$}J-H`VRnzjbEM`RYc_3guFtEFVos^JPSNiR;E7n(z^=|K)??($!yHhkK+Bo zj#}iR4#U;t^Z^unFw`~)uC0Cvtk|%h+Mhavm|1&X-oef?FCE}pojgyw@f5q6c)%^I z#~U=@p}*>|^%3?$fuy=IbNOzqI%2Ur2J*!iP39=br3#*p{@v;Fm_`M7|BH$mgyZAd z3W5iL4&%QY{z627ATq z!oB^Qa_%a1a_&#Z21e|Uv8kQoKK@_B04FYxA9DFqFzcqxky?`JV!2}=Y1oUR+kxh{ z_DCvXW{eg;%gDQN!)T3_C!@WR!6)RwE)*tW!tZd05QcvOzUPP}(2sN`otbjbxU_cT zldzp_Yu!UbN4xZokJgURfm(H4zHcpG#MQ_3$7Vyaeyif7XzX5<+f2-Q=-0WL+P0>> zA*NzYyY;XdOtP_J8trHAUHi>{%Qm^yhLKUtB*y%<9fX~WB~3=D+7f}DU60^8L}=N^ zHI25xh_kd}d|D-4noNv?k2b*FQj@z(op*4;wG6#e+4)F#x8Juhc>i58mLvT|X#c>a-={zp67OB!G6AM&KC)i+arZTd zSsU6&g(9}G!ZjCjl%nsY7&KtHs{msN7`y)2*w6=&!twbGY;c1zT_gF{L;{1 z(<0de_@f#6!&GY}S9kicf$W!*9=TH>5VsJ7@Zd~rjCtnChX$Rg`&zYTW}-s!ZZ_|e zSHD*7qI8*K@wfOVcQ6Mggk$~e95GmNJz>P;(EHJGp-VN_tLnbNb62vFhi1psL!-+_ zn!oo#0_0zaa)~2fMRlFivh)p#mm|M(e_>{rZr zq>^+!`Ocz~(2Xo*rP|JNgBqLJ{=mNe)yOGxJO|Qs0-HV8@S-@{qbapE>*adwl#-n% zmZIm3Bkt&tW*F|!gr8aCt#XbNGGykcS%j8MxMw30wCj6!D$V0cd0p3V-l>gGV0K^2 zuN-fEvU@V_tm>%Q8}=do1p4AR;|5#Obk;1SSG;+%+_273c>?otss`LMr{0=enX=RW z_8AxiB4vK$Y?4+V0P9Z)s-=HudUHG5*NLJyo2!wQNyMcF{rP*|Jb+B9H@Y{C`95Nb80~lx zcP`KYte1aRN{>xRQs$V?HBHoH|5XwI%3oUgEBY{M+c=Huer#t@1iXj~7aU~7)6U-g zbI5yxRnPv+0lnfUY*|I`pk43esAnmhr2T0b3$ON^qBZHa2mYs_y;?4#$Ln~bm!^kh zP_J0;IW)QgBd-a#M8*MPN!TxklPl5tL#Q$byYGUJ@*PDK*CQ;`$2JfT4$XAuA5ZW+ z&d`zODoCobZ*t_q9&C^g^;LL9gapUauPjd20yL2skAQ_R8%tWeiA_M&#<%tV>3L@8 z@Y^#Tx1@fc+37iYa#_6SbR1?a>Ok@w!W_0-zQAXa5d2urDb&_rOovjC>lt$SfQ2EY zv~6PVA>hCU&;&nCy<@j_KVhOWFRSucTbe{4w@z7W6?Dvfq_@m7SuQq@JJi$ZtZ9zM zYJP;+8^jGNrMT|@f-jsxA(knB?7G@o?+SOQr>PJCOP?t;!`@Q;DBW{sOX$Ld3va~E zQn{YDMa9L=o1ab~^<(3Bs5kzV#QM(>Hx8c=+N24Bj=zqB$vhDm*-iTf#CFWl_T*DW zi_PvQiv(bPUiV6}U09wVY$EGay?=~s>?qBjDjcY4N8%yDz~h?w@MZ!0Ol%{6_yhA} z-B7KwSSnc-j_!T@tg<-M?edNDd#>yt&@Y5I+l5d%fpGo9YFZG;t^S1wupj<03-_NJ zKa}X#xTZ`BeLKKkHea zVnU$c-D9k!^T)YIn`&P=kI}?Dc-90{ZR~=}5Zvw8z1q^pY?1AA$}v0u)8u@&^oLi* zdfvln%Bef^9bq#CT}Fwr#%6jXOupcBC83GQrx#Z~{6`rDKL<2^gZaHG*Qd_dHn5?5 zoh*OGGw{WENX0}ODP8gbx5q>9Mc)07iJLZv1Y(8xxG6vLTx*(y>~H)bMbxJd@x+gkl-%t+7AFiI-t&5lQ_vQDkfGu zaH7R-t4M9`p|k6<&38*fJGVj}4V@(&WU``nDDp+5eMHt?{N{Yjm~xobpDSb^{?b#oGB} z@FQ@yk0yMa`SSz;h2&hJZlE87p9FPJ4tSjB7eF2j@oweP&K~w%6ue?D8ttP2p=%pd zMze5k4S4KqGDHX`1FPL`IgVTWm||b{GX0Y;=F5WG7(DyMFPA&v&TkG-3P6o(#;-cx zZQeG!s(m0lcUvnNc8JnkA&=^mF%SG| zNN_L|d^S;MzT-LHmbz(diObkrqx2iLCOhHFZ3!$IbIR_MLY8?p{nQG>bAny3Pt*DI z4fd4q@bFAf6wY3hy}!r)5=xbn_xV*-Rc*RCbe6lKnp`-hX50BUIk9 z9j9s6Twpl;ckOX4;&fb+%th%FZ(ko*0WGXaXGVVx=i+BWa%F!xHvCBP+y$%eNZSmd7A7KqH#m8={ zW;xwoiC_vR_iEs3QSC~Ckd*&OuivqA%Y2xmU-g{bn#1;FG2%(Ruo~}WU7GaAY+ZK& zhM1xE+?n@p^!=7;Y}*VClgCS{Q4`n(PmBhJUE{b?U}G+lpZ_ej=1$gcTu~e!V{aD` z_RVZ-EG9!2Y}vV1spRr~m%iJTD|;E3xyPUBFP=YD5R_rXr=pb-tq8{>VA(e2-gUu` z;az@Q)#tDhfMq$Lxp48kd_ir`F<2P_VLP(KU7524CVowfN8rXK<@|wemTDIt!o$fj zL=E@xwMpR!DWli|Kik!A`eLZ!uqWs3zhVZf-Dlk^k~QLU_#G>j(tQ+mVGG5MJ4^X( z=#FwAB(-lQ>e1m{P++}Nj^S}GQ%On9>Mxnn@v7?aziB^FpgHt1R#K%L+K9kxCJ1?| zjah3JxGY_T>7pv&*uoviprhkX(o**i+iazj`pRZ+csVu@ee6vz>JN;g>6fG~qk_2K zyCu(Df<;3lby4%%YHddIU`PXwh3i0jhMw&{jn-~x+C-~0W=7fS^5F$Hr8kQDwLR`v zGkX^}{!m`Yv(djgLR6Obp}LN2Y`FKY0amx=9xw-9@+;je8xDlG{*htxLdTUwU&dh% z?R25@VnjMbUBlrTY$E{eGL}LyE)|#c3h*+4$VIu5n;go!aw*+8{gTT?w9TWvGt~i% z01^C3zip$SjGr?35MtcrBby>j2Y*MauiWE5hWPXDP$G`_J`nDy0pD-t4VpBzBkND* zFHoZz`T^tYjX!rf;xG|n3tWHF`v!e6w!|e2{g44?C)W@z@I|ZEeGGfG=$*uS`nBDq z*X(wj+szCsJc?@vu?;V(hmd*r?G&f0pwl3W3hEw1OdPPe_vS1@Mm>o}NhTv$0e)K}+ICG&KBKYNr998$P@ zSXv6)b2<>ySWQ2K^srEbZ0!!1;wqdp2DyktcA`k7-zMQHGqtKsZ=-{_y@Z(58IxuO z$(@~@2rs{IwOfpgCi{L~ij;?RYHh~m?wvD5jlN|bt4?vj70J8)KdTqMUxL>DsTHZz~z zd+^(o5UuaWM(qsoSV71;xGeDKG$xY8R(@7D1OLYY8ekPb;Uck!#;V8G_Q)3@?QpgF z5Q)H040R?_cKj)&3TMVZ%1VHQvjVXn1I&0&{I&S_F$g5bw!Y$qaijY#E<<+`tQ`oS z?m@}x^Mdc*u^+6O;a7$T`w^XRDQ;QJbrka9t3jFJ-Qq}ZJ0-Pd@MMJmBcpZ`Uw6;s z%Eb$j1_P6_NJHTVE zMX7aDLTZiIp%_5{_cUbGOZ7-Z{?TP(5kyiFcVqen7#yDy|Kid-djX=>X{xk?51e1J zE@~#lZ47~2L6!R0eb-~Om*&Wa0|45yvvHBtkViY8Po?Eacw|yujQcGD4JkS?F$8Z% z=hUk8Yh87!&^CqVd-*k%e2;yZ=LEe<+sjY4mMgVPNz@JP2HuUJuES z>S1KGmz#82AAC+O+h?10-Z@T`)Pz8GkE#G)&%0$+Q5s%-tT)wB?ngM=B`$Uk2o*_2 zXa=B@3y|KCJ#Aw~XvI`-EWcw@o>f!tsBgE&H@zyaN4w%0Wjf}0o}3t`b%hW1&mIj< z`%Lu-fbXiJejnglc(ZLngIl?}r3LGgJRSv{+}(;l%g8ub5NEXPuE?UYbX9R0E9kYk zk`D&!=+~7NY}{2kbry90*&RT?%J;)NFQ4SD|Of9o#sIjjO*T=9Qstg6O!7OKMN_QfX|U zFMEQLsBwAQ#9W%mm9)GNybZgGw~k(Yh55akU@+<`<%!80VROwjC_t4rkbGLS+Lb>P z2ps+`7vMPr!h>5k4+?fLU0-!qYp(W)!abiFa8~%*N?eqzJkIQ{@#m(C+U&4x>{aW78`+V0DUz=~j zwDaL0(uj>c#aU#h(p4B&*!=d{v4Cz@w~}Rk{>aBTDQ(F0-ODzzG+r7V#a0B4lOP7g z$ItGwx*cVpx3s3|E_(TAY<(zg2Us>jlv)XobJI)DW)A&`V;k8rO_Tt5G9vqU_}FRF z`B>erzOo#<(#^}25yLb~=43Z*Xqhhtg9E!vF2N*A?{sej9bY%&4qZ+dX_N)R_d;mW z!G1-N7WQC#N@4I(_nAwpk!y;o6DS9+JIR-3Bj4F|4|Clz%VA_xePoZ%KV}1>&^NvT zeM@9dxYrXqAvGe@^iV;K-Z?EHS)S3;$6;6M`u;C=nR*Lr?AtVI$eoigUY6 zw%XYPF;iycu)^AnvV&?L4rKN9gUsOICuwm^{9vHmCt%hrg(!v%2C&(Ac4)PWXH~j@ zd2L4414xFaEB=#Wr&p!bWvGz5AaJNpu36Zd#=3Y(AYRrE zFJ`Fs+!^IJ0zb%?BgluN((Vmp z064`Wt2E{`!>(TW@T#axeMLoY<)?=w??!2Y>ZaV=D)Rd(@_Wo8Hj2$_eB)z0NJ%d9 zMTJhwE)vdn6a9Na0X-5`hN6d^M+IkzKvA~0>=|0}EdzW@%LONQV^$(QAPgI7s>!q4 zB?*%FL{}G_ws~@b{uohWa@X8PTE~;z*jHu{tvkNGG!Ef8_ywbZKr9#T#buMfHs3TX zFc8aQiVk;Jah*>OD6PvM@71fl*-yb=j?iBZy_q|lyYf=J?XVh-B|{A(UYK{$&7RZ@ z4}R=9^Y$>HWmh-_AuS@9j~vr&s*GwiB!9Y-6PfMQkP*VQ5wY0sfr#3mFSNQf(%D%;e0>7??rT)}vlnimd z(g+r739U}eQ#1OA3#iZbesoJIp9a9}VSCMYw$<^5O7$@xKQinApb^@FjKgD8AZ7Gt z?c;znpf#AYvvX|j_5qGjn*14bQFLJ{CTQ%wWtOGB^qt?_XYa7@+h z0OPNPfImP1b_D3O>LZ`2bG=4A-AS=B+PvUM_O6y&-cAY@R~SR?)*YJqe+>1q=151dtANd*~~-QKlCKu;94r zhSb@q{L$XUsd1lgiK$jD_bfb7{w}#H*z)fLYgd|gm8tMwsf3s`+8L)7JKeKlnNhn2 z8oS>qqq(A$Q3G}W1Yvjv_%f!WT|OEnp+u8pDuSepqH#cfp_30a%8Ro{hb%{@EdOYV zn^IZTI)__r@((FITpY%$M(ySht5J@rE>#i$v@*nmIvB9D} z@}-Qn&^c4(OSQwFZC**N+-^PEu`eIyVt(g}0QT2;BWmkVyfx#hXC=&P*Vj(KVGkPZ zBxH1zFu{&>@~TQ)u7f^mzDK&rKe@|?Z$8*SlYL$Wy& z@Ur)`CJ7fP&>-UcPN>7j44CWpG7CUT)2-DHGndjHSoJwquejUAbq`&Ywdu2$+D}hh z^@+QqfQPg9U!HBOr-MbJ7eD!R$XHxKn6PF5fveYlfK~oskc!Vx79)5&c($=OrDTR5 ztXC@KzEIuNiFLtd*Mgry*s2|9;k~W61VBC+-m*5GdtXqq6k;jsjp>J@D4vsolW$uB zumQFu)s@eyh^cnXd=5?9ZTCB*1O{Gp@-$QY;%NsIBr6yNff>2M9R2zA$2fAI)MUQq zhbjH*a-AhkWvqr+TT#iCKU=5N?X|4K+J0eurwm|r_2p+-PGhc1^ke`AZXN*@$h$J_7I)6>OVy(yKeo0%8-PqJj}8J~ThM|Z#iyw;+4$gpt% zAO%8NTU$qhxRS}in1&-|&^l91&WVXIG}2S)-c7j?eQJYALHrOnB~#vQHTLsshQWSV z&=fzgO@4=lhhJK}?tw=EQ}$02IREKn+~|ash&-?JCw=(RQ|M#k^IdgV^$QrN_)hrW zQ$iIOR!)K@Qq+>NgT&uaNx^TFw~Bwy8dVhdt9&b^e|EmUD|v1V?PD{!c6IoBk;tH< z?XDc<;r^y(3j_j5(cQ4MO+AQ-#Z;TWG#_3E^5#IkUjWmrk?bvIR&Ao|x$U;o+c2ow z0TXpzs`Pz7Sh2R9x||tQ7{w{t?vOu{zd|i?@A0#5BfT5F>y8z&S84^(t7=Ka2;;)+ z(gs-b4=_AIubpWg2z`Tosk}Ye9O<|!qK46%?uEN6?c3{U97vLEb?SUSJD!uJQk(RD z&v6B&s5w$~<{%PJ+}lDGjqRzvHDClr`TP;}K}{~I$05H}(AC4)ykyeeq3!P10syCe z3w|L9vk+D@g4H~}$|B|=sxCSvIX}3j-wmwF?UVmuBfm;>B@>H2sRk*o`#L{xIiLxG z+0q37D*9W%gC$bliHgcf&GfropEJW}PW_k|^mhEJ0d%nj`4Py;G|<&gvF^+`brAq* zp0@#K#}zB7tctQN0Qkjk0>C7mcU6VyzJ&rB_FDkelmmbNADOQY^{lNST3T9P3xVh7 z#T673qN5q#IHCZzFb~++_`1<6f7y&5oe9#|46g8trU!t+gf!*X!{?K6TOB2fAwUby zGIDcsfeW;0c}sphOAYpqA0P;!Y$d)DFN}jIVM4P(YhCaLkT&R#B{LVbw*vokn^NEUM>6~Wrttfs=3;>0^0s?~nk0CW zM=yZBlmKaxnnN|mbBXfrpbVf1T7Z?9xs|Z?@{%_#$gQV)bzpJ%s_|cT4j?eHW$uhz zIq_}s=7SSAyK0JM8mvcrMMu0q-*EPOS$C~W+R9`|-l>RkMXAIyz-xfz{vz_=cmXhZ zO|KhvR~GImJ+hSRlm#p~;od1*Z>eC|9;zoN0ajxH@OVXcl2_mOOM}+zauts<>-nF| z8aPkApCr<#Saaa5k@qv;8D-C93@LS(NYoc!UI)38W$9tPu?4~VXpPR~{hP8SrMLveQ>!aIMLpA!2A1P>e z$#a#;OYa3hCq7nvX@4oG&UGZwt(&s@SPih~K3h(N$oA|H-9aX>fD)tyhCp}`B-=G9@sm4J{yv^`(*!7(J?)|g| zmno~e2DSAGkH=`5uEk?w6^~gjfw+0RU>aKwtmbv<9p^6nNF;C^@Xu^XT>hK!?yeoL zuO_@`SPyNK@BTV`6ZB_?s^LH1Pd(~#_F5A17IiX04UwMD8Wew@n`(XK@R=`%zj=Su zZ$C!)$<>H9ILhU>!r(>FDfRK6PUAOdU`eb9o*mcKfZ{%5TsWvfrxDEuJBxm-DG>$NuAX-~us zu#mS=?B4`{>P?jt#3;}$4L(EHJ{)^A;meO_=YA=+2q@k#t!de;w7+ZWC#QvQY8$bw zO*lp>Ib&R2*G_^M?k~SzvMhyqI~y67yo&U!s+v&tBOTof*Bl64y3D6|f|U)JVJ>&F zboJ7cl+dTORaTcPJ(hK_um%^=iI>;BW0za5T0ajp+c-ko%o^A}J$3$dAO{|XlB2IP z5o|tV4+iJcL|FO`R|a-XDzvN2`6TW_s`k2NR&Tq`OCwM0H2@t*L67@on?!$uhgf_A{W8_UtkB9+hUPur39}$i9Ha@Ksq7 zm&9^BUHuN@E6#2+*Kx7rD{X5@dZXt|wj0Dwe;Z-hpq?$z!jSjl-oJnUjRin1Akc%M zp&==s_JKE%cd4Aqe;WAzx0FTxUr70c7jkv+E3$VdYAroo{yX~2w-M%R*BB`ldZ}bT zK&_p?G15zbGA%sQ?Wu|rcze%rd_F%a@A3?AEMZCXECU0ebj_z$$iQvY%Q4SVt#r}^xjWUcx10n&c=;X5A}wX zFkI;j9Du@}VBt(>m<0Ott+MA7?YEZ~x5XoDdILbh8EYu>aI|QPBMx602sW zrnA1qP~D^PBDJF^zH8H>0b@QZzFk7Zr^{1_F9DM|R^3F8TT`9k?6~9;-&Xl$$Hx*} zZxvHEKw4jD<~yKTx1#?7B68+tC4T`E0&yw|5A>$?$`GD#>f0os^Q^je#@aCw^5}&%}D<%tdf2!Qd)Pv(szSfo$ zuNH9pocnWUtbfCmOJN1k=r*?#e%&s(%Ui3Y}qS8g|oo5 zucVzulT{F`^%-ala5G<*F8ug?k@y3=4v$Qd9lxsHm8+S4xvZ+DUaqs#IMW%(`A5CE zOA|KnK*%OU+p$vOt}FZfk6A^dcfUQyt0g(sMb&Hz+wZRzf;}i@nlUqj-IMNGguQK? z<1lj#xojpKp{U`YRW8N#+V4I9Y7&VF&M}hwP4MAP*(6KsO!vdFbuG?6mOTmdp!0ZY z2dY*?cdAdLU~TxO4i+C(VXgMN*2bE|!(wRq?T9H)5I3OSfWtZiof8>F2;wGGz#K0? z(uztjR?-k)Zo@E`(!h#UC7*z z+{(2~5QCYi)&3Fq!kU6+Zj{xk>Pp87=5br)+$W9&yS5X)cs7292trnNQdDA9iftZ-as|-&F3s z{!{gG!(*vjW<9I3&qJ^kTHQJ~(LLe4S6w7`=7xV)r%1cpg7|d)4MNrdV?t%N0P%S# zF}N6P=l)@fS0nz^`PBa<$a@;k3Nj<49LWjI_gWa9_=RBnX-7wuy-tsoC}Ue1cW;1TyCg+8#s#lfUNyPR1GRMG)x&@I_gP z^~&F0d4tFS+&YFUxkpoRj=SAr^)p;9Cr&>FkRKtz99nA|rHd4Ega3YW*1|KqTYUA+ zH%Z!GW{?O&h2-1C4M$Bt8LD;@J@+r#Z2<6MGMWod!dW<9f>c@-@AU(&&mw^M`uvgV z0GNEu_zloIiQfhOkL0lYBlJpD@&COuZ2wc^f1~755!;k+_mV10_bXM zNtZ!BNB`rMm)BRBx>qm#&;*p^!x5?;`ep%GZ0R1(C6(FjDLV zdgZa%n2xDyU!f`na8F);1zd(-LB{nhIj$20l8F#&WV!RBuQb$VXsN(H0=Cd63yXC0 zobEmgL_c+Bu}ikn1fR1f782$CDsRtC z|Ds3Gg{DB5wyrRrw zn;?DwnD#vpsuNP%o8tnw4MI`Yh)rSnflKo8#N@O56zMFCSu@4y%hSOA6lQE^g`H9A zI`#M<)!A@vH;740m$CTa-eUvscHy}ydBVU@53U3}`<7@UO|Y*xJ38$Iqy0nU{QxNP zJL>eAaQ!rXr7CNu^6*2;Mc^Lk4qy@tn)n>%2eQ2hfs>{+y-X9nz=P(K0A+Hss{%Ya zH`%T@Ql_Z6QEAU!5N`agnFkzGTI_)B_Hb&X@{2V+5dYad@77o}0>OLp=FLA%KylFh zkCp$%Z=&A$-`yhAI{wia$>qOgB21dg%dMDuQZli*gr{E}ft_;R3-F|R=~Vz%iAB=v zN(~n9+872Ym9r(z3Au_HPlKbv!n3fffctj-e+2-dkd4Yq=d}TAhT}G3OGdgVhyNj4aF&T>^#IX>}fV*d<*1y)&BuNt%iBAI0Tw?8@@n?EVB{<@jGi%Y} zaKxvAxsOr*0uNI6tpRL+w(j%HqxcMe#!}%5(YwX4BuS8i3x{co*L9Z>e+m)RTj4BA zBUaYS$M666tv1tkJ4kn;q+c1rm#v5{mI=6Nmm_Y;;e!0_w)2G1?tG^pYPs#6K|dy~ zxjM=>*;rVyKhHs0B;GlwaJZ&WghAX)%D@Syi-puCJ04%59qFN$qY$|M05XFgBr0!K?(iETc1qZpGUynH)QM>F@1AAaEH_VV98NdC}+{V@VS(x&cc z#Gop@p&@JK(Kx_Yv1$X!xht=D@awNDB9)HY6huYc(8o=EF>_`|-=mUbRq5+-D&roT zJ&%<0)PRXkJ2j^>RO2zcsf^0u66s;=$0&y-5S}BJuVs#G5R{Apf`sV|EN0uTuFfiL zOxt+=?l(3{RQ#2dqo$in;wT>m@Ya*4T!3_XeE^&pXO*Xd$ii%JZe3et0M0u%pSQz} zo~8x*H}a4HhTzle53ZbCn*d~=qeuNUOS@2@EcB&L{LOM(jixj13+TVdyoDS9kJ1@( z?HHZz5hr&W5xUKk>V*vY<=~^kj_N{1W2mDMb{_|6oDQ))iRG3QM{JR-;LNfb(cG<_ zDYMEptoqdILm&4DDZ2~A$5iuZ$;o^>KC4L9lqW2Vr8W>}uOQTVhKfstNt&_Y%8nIH z{7_Y3qkD^-T!Z(zA)V*-Sk1eP>gsy-0cr9TII6~BYHb&sOll?u@ltjv+Ss-kg+yy% zGGcI3*`(2@f<&H88o#tE8MQbQT31p7D| zWv=%4@p=C{pt^3(r+&%+$(Td^T>xo{mqB~xBNQB0b)%Z{p|q;TyTrVb=~}J%3l9qC z0P8^wV9UhR>s4t#|CPj?e~Kd;FugFt@#62IH$i+hIHR;HeW$NYqMeGoWz@~iDGrO|qyxAp(2dkP|IkbRH)s>kxwgK( zzQ7s!lf#PCP#9p;0({Da{!U2$E6!A-QhvI~^>#@=08{o}20+_qDz*4;0VcqY-he3o zM_37TW$cDu!b73arS3mB6S1>0As9o5kO%#;;26y@PGNX1>5p^UWel5_|e0tJ4@<2@Dm_j zYuhj9Kzts*@>eibb@Su|3=&^t(GM)s#fzb)=;U4Jd_*1}gc)@IL2Vd)PKb?CK&|4~ zl+3e5SrABZn3?$rd)U=sm7eG~6QQTHY#a;9B?m{7F_F4H^66w}N-KHUsZ003gMC-Y zP?s|C=1rukO0~-<3jTbG?5+xRTL9iXK(Q+z0|3;2E}iZ8eE%Q#JcpNsQ$g--1p86O zdV9)ot$Wj}r3)nI{BD=gde@FU9}p<#{oA+pvy0K_R#7yo(Xwyd?v9@yhWc;r`^r^! z>m}~`t6L@que|-%|Ky;%T$Lp7C1XR*;qg=HYg6fHI|p-r3kmJBa-6lqO24C2_`qq# zD}E^sB>#GBbuPBr&M#p2GJ8wY`1@Tc9D~RtPGJ&>z*Mb%NnT!|srHT#SqL&6o~`U^ z@Y~&WDseS2Oq2K>MqlTy<*EgD9Ult?ff65HyqFUN443m|VZcHVJhC_+xsn)vp17oXIzL}`tVzm z5q@---FTse0>p6=<)(N}C>H}G=pEirIP~awc~==SFopTWbik$1S9yq!KP2A1GL5nG z(OvHij*hD>eC|Vzs^fqf(?tTvdG`5wPf@AzP6^A%L~2q=PY4k|KHADr(E&)>MGyfdHOmQPTwMQA>X;6*9#f$3dO=GId*z_95l`Gy94)zqx zGSah&BsAgU8ZcMi`{J{e#!=V~6ZNu!($ZS^=d4^Z*E*)4p~X|dOkPd}+0vYYo+kz5 zT6zFACZ1lKdB+4J^!Qb&dP8?wXLT!kJiU%@{J!=jTZxE}b>M8p%aobcYR_Fi%5k_K&^W?E}=(W=g4k({|vf*eljPAlSHtffBGIsv-fHE|o>om3xi&x>IA>{-^? zb3vv7CqXsFHa0f8th&zPj>S27_2LmC{)izH zOxC$ZhmM!Umd8}2Ck`6dXsgZrF-L|-?cuAmR{ZxyM{B-N+*}SqbKygi(bdP_o#~}k zuN@^ivq}Srd`r)s-KNZs@r{41Kl+7+53h~{w2UZ5xj<_&e@6xflV-$I zI}35{?hp>&>|%bfJYxRCpoG+SbVQU(F~XA6t?`K!$X9n~;d%n+hgVjqQns+wgCeyS z9UNY?R<+`;P4w##P^6qh+5FL!IBs?qb6r%#loe%`UZKW$E85R6T>f_miLNDkr=DC` zJeYw0cn0*$640gaEdvFt)yi&NoBLN>e)U>zA&Xg!BKA*?#!A3qTvfXMF&G7U-E#)M z@tx54MVi!DpvmIZ-PSGQtWYSWV3bsy3h?L4wOSKvdFA>vAzckSy~axzvR zd*hve`JB+zk0U9Ka@OaWP%MC-TKECP9|RsI!3avVGf(*=xe5yklF2V#ryk30Cm=DD zs=p+XVme!&NhXtB((5fUivJ5RBUI1G$kxs6>rY(}=!y8dckgU$lJe#2-@XM)63C-m z>596Gf`G|QqSr!ERm|TW=^JefTCLNklK+&TAtyjttkyktOura(sY%g?8GN-oH z3W(N!SvUSCG-S(N}5d8n{!cDd_T2`JE}|sXjDwGbS$v=GJ{?h64;oT z^8;FDQ^sdV>!0)#l^b(WP3zMkt}bB#Ei?)jLEi>-0hPyQE>!8=PFk|--823Iqy*IX z0;3o(S-_2HeoQVE&rzUoZb_Ku^=#4)()r-7`#PQXtwdFweD_N#=)4FD6cOsDZ7*}Fuu7Y zCG&`DXC4GP^X0RJuj8R_Cr5BeU5ttD>`B0Ef7-at`~-QW*E@gERYH}NJYi`Cy(Fn> zb;RiioI#qapZFhp>;p7f_v5iyKQc;!Z~w5peN6tI*`JWBmpVGWioXF)oEHJD&tLoY zSUJ$-&0J%{@^dY}_kF&$^(;F>fR>2Jl)h`l=EU9i*S}4U5c+sc`{Q@%_&lJNQ}>&jGT&Eg zCucl;amXPh%FS-uw&SOsMcfy9t(>GF_qw-!{`~SA4kc$g7hasZ{%ilkeWJ4WJH7(d zFWtYIn_lUICkKL8qS` zmp4CBzAr3G)->C#=6UwVK3{)0+Y8fw=ILg!qm^n?|(V*1DBM`U8i9uW@<>l zOdnvWRImzYH-pBSg9i`#s1?tYoy4_j&z?VTZf>4z0^A4aFwv^|TTW%=&(yLRGmEC_ zpZj^qUA|UAF#g9O@w78D3@sM}HH-9~xBLADsAakT{CU5pO6zToes<@le~{nzm&@n> zyFc^4ZT-JL7cN{-@dfs@19XgL`Tz|Se_oS$ZB69#+qxS;zWksEoO__4tM>JOAjcGd&t}V&bjZNdH24Vd+yA6civ3?$o^(!tzFjsw6#9JRg%4bm*Or61iBBEd#wrr zT`L5Eu3x`>9jF|{-fRbf=s?idFV)?Xwx|8xj-1qE_r|!GSwFYa+P^}~Q4$I{g5`&n#feBAg_z#7j1<)U}pW&Jy`8&~l(j<>TJ5d(q6qx`ycXL(#Cr8b!!p zEG5$Sr0?tN z{ho6ysE7!3&rH$v8t9A35*=tbG63{OmiRh1waD!zXD7Q-828hpQBjbgs1`>obn*={ zVDOZI@LFd1o$C(iRQF70k2c37aVB%;N1LyoeHbw+(b}my=tu9Q_^l?p-3n;lOShk* zx(9qQ+#MJzHmKR(YY8M;?Mp<(#tPbEt~ZTP($F+`9&If5pvX9?R}o^^5#fxMk`w4F zsYXNY(=L`&4xRF~9W<8t#)Ppjn_3J_bbRfPI-?)>Lg0Dc7T`#{RE`; zUa6Gm)LYbT35AxSO-em!V@Y{lc)Bv&Lzby%Fg7iF;!FY+9rbK6NQi>?P+zN7G#hre z|9Vp2dT~|a+~(vZdMl?GwQMk1Y2-gtHd+LWcNu26Pm+wA+Z|}c@1ss!lnhKk5~+`= zNo2$|aQTpd6*-FilPlTHoe2mFm*uw$+1c@nAMm`pLpfPJhr#R=V(gE^yZlbQ1~BDN zM`lmv50R&T#k* zTOe7J1(G8#V<&VmT{Bv1E=@XZ6T^Fj&lYLvet}mlPZEu)drx9^8XcO}tli$d^Y#dw zj)fcSu;NqD7v1)&2yZm!tesOWL(RnOLiyzWcI73E+F{kTlE3b(I4+^pE@NEoMWe1GZ z_%TMtFfa4;+^{Y!YA4l?4!RB&zMG-j-n!}wgPkEKDQ#WbCa*N4E{gq*3IqDUWM;1i zrjNGH+h^9YypttoH9XUc(|4KAkE%w+8@r~(91S~Xr>`_LX5HBDG8dl(&_eJhJd|Pq zxJJ0`rR!!I!~GpvU)+^SxF7x?1d9pUhtC-^Uo}03?(NMTrAfjlsvRxox`U@}6$Lg0 z1&`%*)c4PYG+zrsgG7&mUj5Xl9G)JZUfz~C+PT^n53E!Z4SrR~RnhQ7RI{=aD^x!@ zGc$gbC^ZX?$uBV-q6nHev2!?)FO8wKfGlsX@4Kd2N!H?HE}fy>Iv3#W?c~M+eR8YI zmaG2bW8mYboyZ1lXa(bNDTtR@WImg7dulT&TyXS7sz#OqL1R&#^-oEcWFp@aq^;RN!LJ4Q=uhkfJt%KsDEJ3KM zXMf%XZQYiK>p)FeQ7el+7pv0PI72x6zPvns!w+xi!T2OkDVYrqvKTq!6bqW^D0SaiURCBSRN1^;Pyuh$MHF?MU<%fG4z+CAAu z+AX^?Uyq)X;WCYP4f^l&Z4xEBJ~uSX2H!%4lUBBuPsmT5JX*@I{>DjVOY{o z?U=4YgOANOH-n1Jo?szPRA#{xsVaKu+sPJ~^2E)57_0p}8O25H!_hVkcWT4uByRco z7ycT5tEaMwm8iSGBs{^s?bt!V5VN1UpX!d{JX8}I&7-QU_LEIP!zLPGgsr@dIu%)O zk#*?Cu@Ny2sK{}LBV*U_&;~XB^<=BE98%)cvIo1+ZeQPMaIV>@U`%D5gmq(}_i_y)sYN+=h@ z4K1`ND6040pXe6lVX29i)z7=l*&P|zlk!WwJKh)Lhnh%Jt8A6e%Ft*Q1G+=%nZdc8 zQ+q>JXQ|n_n#xf(Cg=&-I0KrCoTw#HNR}9X-s;cZ&|f8v8@kNVFX)Wq|8+QYo{*X< z?zY_hB{NL{SC6f6Q@{GQ7*qs$6Fklbj%Cau^DWy5Z0}Ab$+MN6)p>7(1%IxRCv^M9{2N$)$x6m+rwctKky-oiLM909RmG+dv^xN3G zvi^5`8x|>L&E(0C!R}k@73*+nnxV67lzajsDfZC&ojmwF7=PBC>w*>wuAQFM#a`)8 z-F!aEcy)Eno4CwcoRzJ$q^A8DG$3V+LZ?_xM@JQpO$nF<`&oIIx!YHD9`BNk*-eZe zo{wd?b!Cz@Y#sC4omr`T>$|K&hWMSC9vr84LWFyEXip++I6V)sf`u@0uRUbQxta1M zZCyNGJsI6lN5?LO94aHC=_js_yV|WvnD86_zP`!6|0IyTOQ+#7cYlLGmL0yLsSTPE z?WsuH%pkrAXaVl0w{HXm2ZQz32KxFGW#03(#*D)K=9jB}Xx#cT(Vrwz<_CiaAU~Kn40(~{+nM)JDd0JyP}Uj`Q{cG_TBYOydPI#HZIY% zI$Be_zx%PmTGRLaxIv}@#ktxTT<<F2-;j!R>`e(CtJylp?5g(s7Kd?nf$0zP(fGC)> zJv+X?b4M~2o`7?z;J}=(7BR+tP>&fBd3v>{VDywp8NbIs1KoEYU`9u)wBT#NfEdIfV618|&@Hqq)^_HxL4Ou6z!-}7lKKrOZM z9XL8j7hd0b(w3dIdwdC~9Xop@N~N05j%}i;r+urGnniuae8tXNIHF2L*1S%>$s&yv zVOeTOiU@>|0F8DhQC|kTuD7bQ59cA~0kzU`m9TM+%O2lO6q>$+UAI4i3ZeJh+cdn< zoeWmJbz9)}i5PElM1AKPjdFXT972a6+)L~%hO^=7NsdpOU<6~X!?Zgm16K(dq(jS4e$9koJT@9Ay!WbjoYf-Gb{>9a>%eo5Ut z3KM1Dck*>a+4>kSeK+4cPpIsSDgehmRzR+%%YRP;{%G|=uFKUtE;fGI8hJN)Qdl>0@ zdL5%o&0}lQr8TJT_I>sFqi*l}LNX23B)nCiM+N&i8IQQVTAEQ=Z?14XRR%joNh>$x zluufq_FV}pNe_iLWc-1wZF#1pS!9^}5xiNGSZ(SN7$;l^`P^8`_Ao|dp;^lY1#%(rkqLqkyK`o0v7LrNRXtz3_a&riVwi>@P zHyy7&XbusOP9wzCLy(NheIdVPWykh!u(dCw0oOX(&oPUGjkrExBI+SJ{6M^bnj1ulJ9_q_aiT$U#7AY*CyAdMTf z;TyL20BY=~AhVQ0#9PC_Rnz(TU&8zJsck!w!$PB*DKiKAXm%;6dfo6J)FkrA;$pXj zgplVO)M=rgI`aB4Hx~tI#+Rre_enO_50od2^{~1vivnziw&VvI4R>bTf0Wj3K`A5D zoWg$6^!pF}kXYyzn&$-P)I7U2%uMQJKaxz&!<BAWWWSK{NPp$^>FBgP#?NpB$=5ve0N_X8BBwI;nI)?}%DUA?;u1fS#7IULn zhQu;4OaF&6zh#NiR^5sgJf2zX@(QbU;G(4nmnr2aH4q=CjNr3dl#ey?m4~Q$A zhwMvd*TNhAkT`WWsj<(B#+jTFH*aLyUkI^O^M3g=x~Dl37gBvq^Y{#qOQ8spV!g1Cvd}YVwa7?ImVuJA}iC*KtH6f$x)juKuor2j{1`YU7je_w#fuNcY(OppHb;3HJikqz+a=rSR@_LPpv z$-Z(E?l56{KUt*b`F^bHPG=R|{)7e1XegK%wRPP-qnB4xbG!>yc@&N$K5`~yM$;L( zCT1S$TahCu=^thz@mB3n;tUruU_RK{1twf|N3E zPo8`k;~9YBq``T2TWo)$MoI=&I@l6%PDZrAwO})$|JYM~w=Wq{$$$-N`S#sP!6Y`} zY-yPI=9t;Pk6XG_h{*hX~eI z%~;ph*rs(MCxZmFY}x_Ka39Al!Ww>0Vp5LUMnQIfH_GLP&ii1@5hn#L^>vkfQTFS9>mdDL z;o~+WrS50B(2wyYm+*VTo>d|?ldnkFiH|@nJPmzTK z11(Ru#>#@%?U#l!B|3%ip;&ECc=A(3zx#8wEqE#03U68SEo&8l)PC!=? z{qF(%UwnzA<2KeV9F5kkW_b(xpUUF6jvRklRouAlZ=!k4(8m8olT`&HI^;*DK5>5| z`{Kg#-|A#wlHNvkhVgg6MLBYdS$Ca9T;j+i&D3xAviiUHieKnhmE1Qs=Y+a)evSt~ zSm5OfxTKd1>9$yCCF4N&Wz;?TH3$YmMdzM;5-)t;@%>-_FW#f6z@6luB z>OFWsZ#e%ofh4yQfQBp17a0+hqVRbm9H$ZxY~g=_Q>ILNW-$&#nuOf%RCx(;JMy{> zkd^$>Hq=&v8SpkpG0t8KLn2cRIG~6LS53=Nb%ToUc|Bs7u{Wgv_HABlKw>=3km#XG z+wrs%&cH6NyKyS2f`krHA(if4=ekM6DA{^3$V^JF3E7QaVc>10QMQmS&UhwnFay9N z=TMt?_{J0uZy}9#4!TRA*@6s++z?Sb;L|C}{fy~kN_@d-O!H5jc>s|wPcdDT<~W|Q zh)VUfA3w)_wE<#Toyw}nVv`c~2-H_f70sx5Hi&`!PMn;iCk2B!X9q7-4=r8z-(K#F ziUXoGr)P55rE|QRE3JYr^3ACXYEvTG`I5(7U9OBxw8G#FEx zq!H~goU5pu26l*(NTDR-P_KOC>F7y7K=C?cmol8_* zeRfxlp&_Vg$r%M-x8)Gq!E3s0?tSemPH_8?a_JNirrgFV*?v^}pU-~x;S^n$0yz#v z@*_>tEUayMA}G0^NOGF~1HL=3t!trXwd#hQzD8F_&K<~&@6B}^J$z3aSd~NnKviNN~sfLS(m-rE6nMc9@FSu4#n-T1|Z~YZy7ZNGrUW&;I zkxD(NOzh9#5=lHkg$q)^fU{x`%A)GOpk zybYuF-j%MDUGsN2=hr)^{u>@r) z%M(A3RDwVL&Nc4cxZc{@N(Me$U0Gqy;0DF;Oa`stO=m23x+oOxTNPr#w zeEDz7JO6c-Kq39ytamrQ4EVhVaQg*a+?EdLlXhY3nVYGJIcHZKDrHOOQIw~Mu)E6| zKm%O$LhL73Hu*7o9NcOEf`+09e{)7ajYuwOU@nS50w0)lVrI(K5d7eV+2ednLd|Ik zPyo0G2~#jq1-p~ifc%F1&UL<6jFna@ zs$jxG4F$Rfa;~JH_9wS*6lf@v=F0)VJ$H%b<YL@mutugG>`*c_iStf5YhV_TEUonY5Mcd%w_OJL|PxZH>sP zawpjap8&MvIMcOT(5?Z82$Z&lrq{@z=ai;SZ1R?lM9zPd*G;T!Vl-hf^&HB8msP!t z7I9U_407{EAbKGex=DipfX*Hab@O#I-5N#&MH00u_EL&2dRngCJ0i8E8a{f>9`Ntl zxCTjOjS?E+9HTk(dL5GHr$rhXj(1 z=td59=Q@j?V|pl%9X!`}^;^@@Sdaa=Zk;r*wgiM)IV~dl<;9w$*1wmdih-zO{84P*6HGA{6NK&ubT@Q#nf#eVf z>QJ^WzhsBLTZC5SIq598B*1q;?PPXceZeG1ky8s zw1EDVqBU0DzW(pqAkf{}-+KWzLz&w4m!!>_({en|KNm#m*AjQpc)f(182JYD@}gvw zWUCo~T+OL19e+M_N!M><%n0@=kbwC_n?)8oX(51?LR}C!d zeMO{z?d#U_CV2+PV~ulDVmp!>4*92Ca+;I>v_tchl1+(=I| zz=e8s;(yh*0e1i#{@pH^nRANZBO3uL5O&v}oaw>sLxaoHOWCWf0;b=d$_WX3(E>ob zWL)Cnfq^hSQu4uVW;7M(y+*$26^xu@WyPddK^d?Q(0Z!qXddwNv8G=jUF1E+z+n69xp8tvk~Jp(w0N>yAsSm z*_E1GOa6*lV@j|HRl&o);_(6{IXG$Sd4+$YO-6L)_n@mC9}qY7St&U-I!(5$+&i+n zF>gym2O{lfYjy*A4mOT;i3mUl-Y?NHkGWVddeWRCMN@|I=+`Upg?$%K z*u8ePcOEkv`aJk7g41=;i`p4v?<%?x_dJYnuSO4(yS5m7h*h@4JnE~EPtBdo*YwM- zGM=#0$=L{Qk*ewOt=~)abg5Xvq!S=BS08hXlvK$wPr&QGg;(y@&R4vo_SWsc2lJF6 zVuDg`ma8BQVj;#by!_PuvKU53;A`>aOE1kee=*GTvx~&xgZnR^GZ03`nWqddI=R%! zcDx#(RUH#5*AvC$@4V!!Qyy6AsfQl>h;l+bO#^1WuTQXeqSa7Y%N}`NuaI03PB>3|i|C)IZl2Euzv~=+{QMUzLlQQI(pOA2PN!ud( zs=2)Cg~56>jb?@7*yZzSKHgVU^@P;e_=`*;9o(XQnAK;R80VLXUPs-xfWfP@$ZM}m zi|>-Wo{(gO*Q98(NjvS@xzs^#8_^e#7&)>Nsq25;_vRe8xbXch`Y^V6g$9Z-P-wrKr4nguR5<3rwL|xubwY%V@iL#7S!b0CiL+`QYR|!A8RpI#A&jQxxw|wNjCGZB zfpo`yd3QDfyY@>PmY5-X;5^&(`ht8wLB^}mO z5@Qwau1yHk#@pXf9l(@^ z?(U}xfmc&gQznlExfEPV*_$}ekz5d_BdbB>DA=9szNb|W7%~4zgx7seXIB+YVv**2 zuH02b@FyLigBK)I(`LwAbTnm4{=@B2LY{ijJb{yswYXYlPQA06a$!`VVkC=SDO3N}`uCF84`4#*IeV_2C`)da9|*xRmmTflY79?Tb>%Ef0*N zs*+RyuftTYT{O`cW9zWNDFrHvX``Ps!dw;3a45U7eOAEC=1*Q~ZQv3K49(=b_UJ%w zp8ac*t$+3YJ-bq>a;@wBO}4o=K-oYF`lXHcWdPK17a`(Qq+c(Z#dNL7*5zmeBev2T z|FyZgSo^mPM@qQOw1tu}^(Bi5adO&j5Z(A-$tN!E4YX50arO07vqxJR3sN!=N+||3 ze{D0WSwx6^JODgpE&t`X`LHe+^d_KO#A&6!ryBU>RhOU{g%U5#J?Zy4Iy!U@Zr=*{ zs|g#B2UqA6YFP9CY_}1F0-{ADoRJlJo6hu8yI2=X7!;k+9z} Date: Mon, 14 Jun 2021 18:12:09 +0300 Subject: [PATCH 08/14] Identity module document enhancements. --- docs/en/Modules/Identity.md | 96 +++++++++++++----- docs/en/images/identity-module-menu.png | Bin 0 -> 9099 bytes .../en/images/identity-module-permissions.png | Bin 0 -> 30517 bytes docs/en/images/identity-module-roles.png | Bin 0 -> 18027 bytes docs/en/images/identity-module-users.png | Bin 0 -> 18200 bytes 5 files changed, 69 insertions(+), 27 deletions(-) create mode 100644 docs/en/images/identity-module-menu.png create mode 100644 docs/en/images/identity-module-permissions.png create mode 100644 docs/en/images/identity-module-roles.png create mode 100644 docs/en/images/identity-module-users.png diff --git a/docs/en/Modules/Identity.md b/docs/en/Modules/Identity.md index 8cd7bf3966..60976347ab 100644 --- a/docs/en/Modules/Identity.md +++ b/docs/en/Modules/Identity.md @@ -1,38 +1,59 @@ # Identity Management Module -Identity module is used to manage organization units, roles, users and their permissions, based on the Microsoft Identity library. +Identity module is used to manage roles, users and their permissions, based on the [Microsoft Identity library](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity). -> **See [the source code](https://github.com/abpframework/abp/tree/dev/modules/identity). Documentation will come soon...** +## How to Install +This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. -## Identity Security Log +### The Source Code -The security log can record some important operations or changes about your account. You can save the security log if needed. +The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/identity). The source code is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it. -You can inject and use `IdentitySecurityLogManager` or `ISecurityLogManager` to write security logs. It will create a log object by default and fill in some common values, such as `CreationTime`, `ClientIpAddress`, `BrowserInfo`, `current user/tenant`, etc. Of course, you can override them. +## Menu Items -```cs -await IdentitySecurityLogManager.SaveAsync(new IdentitySecurityLogContext() -{ - Identity = "IdentityServer"; - Action = "ChangePassword"; -}); -``` +This module adds an *Identity management* menu item under the *Administration* menu: -Configure `AbpSecurityLogOptions` to provide the application name for the log or disable this feature. **Enabled** by default. +![identity-module-menu](../images/identity-module-menu.png) -```cs -Configure(options => -{ - options.ApplicationName = "AbpSecurityTest"; -}); -``` +The menu items and the related pages are authorized. That means the current user must have the related permissions to make them visible. The `admin` role (and the users with this role - like the `admin` user) already has these permissions. If you want to enable permissions for other roles/users, open the *Permissions* dialog on the *Roles* or *Users* page and check the permissions as shown below: + +![identity-module-permissions](../images/identity-module-permissions.png) + +See the [Authorization document](../Authorization.md) to understand the permission system. + +## Pages + +This section introduces the main pages provided by this module. + +### Users + +This page is used to see the list of users. You can create/edit and delete users, assign users to roles. + +![identity-module-users](../images/identity-module-users.png) + +A user can have zero or more roles. Users inherit permissions from their roles. In addition, you can assign permissions directly to the users (by clicking the *Actions* button, then selecting the *Permissions*). + +### Roles + +Roles are used to group permissions assign them to users. + +![identity-module-roles](../images/identity-module-roles.png) -## Organization Unit Management +Beside the role name, there are two properties of a role: -Organization units (OU) is a part of **Identity Module** and can be used to **hierarchically group users and entities**. +* `Default`: If a role is marked as "default", then that role is assigned to new users by default when they register to the application themselves (using the [Account Module](Account.md)). +* `Public`: A public role of a user can be seen by other users in the application. This feature has no usage in the Identity module, but provided as a feature that you may want to use in your own application. -### OrganizationUnit Entity +## Other Features + +This section covers some other features provided by this module which don't have the UI pages. + +### Organization Units + +Organization Units (OU) can be used to **hierarchically group users and entities**. + +#### OrganizationUnit Entity An OU is represented by the **OrganizationUnit** entity. The fundamental properties of this entity are: @@ -41,8 +62,6 @@ An OU is represented by the **OrganizationUnit** entity. The fundamental propert - **Code**: A hierarchical string code that is unique for a tenant. - **DisplayName**: Shown name of the OU. -The OrganizationUnit entity's primary key (Id) is a **Guid** type and it derives from the [**FullAuditedAggregateRoot**](../Entities.md) class. - #### Organization Tree Since an OU can have a parent, all OUs of a tenant are in a **tree** structure. There are some rules for this tree; @@ -52,7 +71,7 @@ Since an OU can have a parent, all OUs of a tenant are in a **tree** structure. #### OU Code -OU code is automatically generated and maintained by the OrganizationUnit Manager. It's a string that looks something like this: +OU code is automatically generated and maintained by the `OrganizationUnitManager` service. It's a string that looks something like this: "**00001.00042.00005**" @@ -72,6 +91,29 @@ The **OrganizationUnitManager** class can be [injected](../Dependency-Injection. - Move an OU in the OU tree. - Getting information about the OU tree and its items. -#### Multi-Tenancy +### Identity Security Log + +The security log can record some important operations or changes about your account. You can save the security log if needed. + +You can inject and use `IdentitySecurityLogManager` or `ISecurityLogManager` to write security logs. It will create a log object by default and fill in some common values, such as `CreationTime`, `ClientIpAddress`, `BrowserInfo`, `current user/tenant`, etc. Of course, you can override them. + +```cs +await IdentitySecurityLogManager.SaveAsync(new IdentitySecurityLogContext() +{ + Identity = "IdentityServer"; + Action = "ChangePassword"; +}); +``` + +Configure `AbpSecurityLogOptions` to provide the application name for the log or disable this feature. **Enabled** by default. + +```cs +Configure(options => +{ + options.ApplicationName = "AbpSecurityTest"; +}); +``` + +### Options -The `OrganizationUnitManager` is designed to work for a **single tenant** at a time. It works for the **current tenant** by default. \ No newline at end of file +TODO \ No newline at end of file diff --git a/docs/en/images/identity-module-menu.png b/docs/en/images/identity-module-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..8083e2f7229938a4cbccc13371d383e764ddce07 GIT binary patch literal 9099 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 H-+lUDr)x#2 literal 0 HcmV?d00001 From 16626d1d2b32656e5b1999f3e3f80eeeb2c5103a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 15 Jun 2021 10:05:30 +0300 Subject: [PATCH 09/14] Update Identity.md --- docs/en/Modules/Identity.md | 231 +++++++++++++++++++++++++++++++++--- 1 file changed, 217 insertions(+), 14 deletions(-) diff --git a/docs/en/Modules/Identity.md b/docs/en/Modules/Identity.md index 60976347ab..c06f649723 100644 --- a/docs/en/Modules/Identity.md +++ b/docs/en/Modules/Identity.md @@ -10,7 +10,11 @@ This module comes as pre-installed (as NuGet/NPM packages) when you [create a ne The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/identity). The source code is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it. -## Menu Items +## User Interface + +This module provides [Blazor](../UI/Blazor/Overall.md), [Angular](../UI/Angular/Quick-Start.md) and [MVC / Razor Pages](../UI/AspNetCore/Overall.md) UI options. + +### Menu Items This module adds an *Identity management* menu item under the *Administration* menu: @@ -22,11 +26,11 @@ The menu items and the related pages are authorized. That means the current user See the [Authorization document](../Authorization.md) to understand the permission system. -## Pages +### Pages This section introduces the main pages provided by this module. -### Users +#### Users This page is used to see the list of users. You can create/edit and delete users, assign users to roles. @@ -34,7 +38,7 @@ This page is used to see the list of users. You can create/edit and delete users A user can have zero or more roles. Users inherit permissions from their roles. In addition, you can assign permissions directly to the users (by clicking the *Actions* button, then selecting the *Permissions*). -### Roles +#### Roles Roles are used to group permissions assign them to users. @@ -75,17 +79,18 @@ OU code is automatically generated and maintained by the `OrganizationUnitManage "**00001.00042.00005**" -This code can be used to easily query the database for all the children of an OU (recursively). There are some rules for this code: +This code can be used to easily query the database for all the children of an OU (recursively). There are some rules for this code (automatically applied when you use `OrganizationUnitManager`): -- It must be **unique** for a [tenant](../Multi-Tenancy.md). +- It is **unique** for a [tenant](../Multi-Tenancy.md). - All the children of the same OU have codes that **start with the parent OU's code**. - It's **fixed length** and based on the level of the OU in the tree, as shown in the sample. -- While the OU code is unique, it can be **changeable** if you move an OU. -- You must reference an OU by Id, not Code. +- While the OU code is unique, it can be **changed** if you move the related OU. + +Notice that you must reference an OU by Id, not Code, because the Code can be changed later. -### OrganizationUnit Manager +#### OrganizationUnit Manager -The **OrganizationUnitManager** class can be [injected](../Dependency-Injection.md) and used to manage OUs. Common use cases are: +The `OrganizationUnitManager` class can be [injected](../Dependency-Injection.md) and used to manage OUs. Common use cases are: - Create, Update or Delete an OU - Move an OU in the OU tree. @@ -93,7 +98,7 @@ The **OrganizationUnitManager** class can be [injected](../Dependency-Injection. ### Identity Security Log -The security log can record some important operations or changes about your account. You can save the security log if needed. +The security log system records some important operations or changes about your account (like *login* and *change password*). You can also save the security log if needed. You can inject and use `IdentitySecurityLogManager` or `ISecurityLogManager` to write security logs. It will create a log object by default and fill in some common values, such as `CreationTime`, `ClientIpAddress`, `BrowserInfo`, `current user/tenant`, etc. Of course, you can override them. @@ -105,7 +110,7 @@ await IdentitySecurityLogManager.SaveAsync(new IdentitySecurityLogContext() }); ``` -Configure `AbpSecurityLogOptions` to provide the application name for the log or disable this feature. **Enabled** by default. +Configure `AbpSecurityLogOptions` to provide the application name (in case of you have multiple applications and want to distinguish the applications in the logs) for the log or disable this feature. ```cs Configure(options => @@ -114,6 +119,204 @@ Configure(options => }); ``` -### Options +## Options + +`IdentityOptions` is the standard [options class](../Options.md) provided by the Microsoft [Identity library](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity). So, you can set these options in the `ConfigureServices` method of your [module](../Module-Development-Basics.md) class. + +**Example: Set minimum required length of passwords** + +````csharp +Configure(options => +{ + options.Password.RequiredLength = 5; +}); +```` + +ABP takes these options one step further and allows you to change them on runtime by using the [setting system](../Settings.md). You can [inject](../Dependency-Injection.md) `ISettingManager` and use one of the `Set...` methods to change the option values for a user, a tenant or globally for all users. + +**Example: Change minimum required length of passwords for the current tenant** + +````csharp +public class MyService : ITransientDependency +{ + private readonly ISettingManager _settingManager; + + public MyService(ISettingManager settingManager) + { + _settingManager = settingManager; + } + + public async Task ChangeMinPasswordLength(int minLength) + { + await _settingManager.SetForCurrentTenantAsync( + IdentitySettingNames.Password.RequiredLength, + minLength.ToString() + ); + } +} +```` + +`IdentitySettingNames` class (in the `Volo.Abp.Identity.Settings` namespace) defines constants for the setting names. + +## Distributed Events + +This module defines the following ETOs (Event Transfer Objects) to allow you to subscribe to changes on the entities of the module; + +* `UserEto` is published on changes done on an `IdentityUser` entity. +* `IdentityRoleEto` is published on changes done on an `IdentityRole` entity. +* `IdentityClaimTypeEto` is published on changes done on an `IdentityClaimType` entity. +* `OrganizationUnitEto` is published on changes done on an `OrganizationUnit` entity. + +**Example: Get notified when a new user has been created** + +````csharp +public class MyHandler : + IDistributedEventHandler>, + ITransientDependency +{ + public async Task HandleEventAsync(EntityCreatedEto eventData) + { + UserEto user = eventData.Entity; + // TODO: ... + } +} +```` + +`UserEto` and `IdentityRoleEto` are configured to automatically publish the events. You should configure yourself for the others. See the [Distributed Event Bus document](../Distributed-Event-Bus.md) to learn details of the pre-defined events. + +> Subscribing to the distributed events is especially useful for distributed scenarios (like microservice architecture). If you are building a monolithic application, or listening events in the same process that runs the Identity Module, then subscribing to the [local events](../Local-Event-Bus.md) can be more efficient and easier. + +## Internals + +This section covers some internal details of the module that you don't need much, but may need to use in some cases. + +### Domain layer + +#### Aggregates + +##### User + +A user is generally a person logins to and uses the application. + +* `IdentityUser` (aggregate root): Represents a user in the system. + * `IdentityUserRole` (collection): Roles to the user. + * `IdentityUserClaim` (collection): Custom claims of the user. + * `IdentityUserLogin` (collection): External logins of the user. + * `IdentityUserToken` (collection): Tokens of the user (used by the Microsoft Identity services). + +##### Role + +A role is typically a group of permissions to assign to the users. + +* `IdentityRole` (aggregate root): Represents a role in the system. + * `IdentityRoleClaim` (collection): Custom claims of the role. + +##### Claim Type + +A claim type is a definition of a custom claim that can be assigned to other entities (like roles and users) in the system. + +* `IdentityClaimType` (aggregate root): Represents a claim type definition. It contains some properties (e.g. Required, Regex, Description, ValueType) to define the claim type and the validation rules. + +##### Identity Security Log + +A `IdentitySecurityLog` object represents an authentication related operation (like *login*) in the system. + +* `IdentitySecurityLog` (aggregate root): Represents a security log in the system. + +##### OrganizationUnit + +An Organization unit is a entity in a hierarchical structure. + +* ```OrganizationUnit``` (aggregate root): Represents an organization unit in the system. + * ```Roles``` (collection): Roles of the organization unit. + +#### Repositories + +Following custom repositories are defined for this module: + +* `IIdentityUserRepository` +* `IIdentityRoleRepository` +* `IIdentityClaimTypeRepository` +* ```IIdentitySecurityLogRepository``` +* ```IOrganizationUnitRepository``` + +#### Domain services + +##### User manager + +`IdentityUserManager` is used to manage users, their roles, claims, passwords, emails, etc. It is derived from Microsoft Identity's `UserManager` class where `T` is `IdentityUser`. + +##### Role manager + +`IdentityRoleManager` is used to manage roles and their claims. It is derived from Microsoft Identity's `RoleManager` class where `T` is `IdentityRole`. + +##### Claim type manager + +`IdenityClaimTypeManager` is used to perform some operations for the `IdentityClaimType` aggregate root. + +##### Organization unit manager + +```OrganizationUnitManager``` is used to perform some operations for the ```OrganizationUnit``` aggregate root. + +##### Security log manager + +```IdentitySecurityLogManager``` is used to save security logs. + +### Application Layer + +#### Application Services + +* `IdentityUserAppService` (implements `IIdentityUserAppService`): Implements the use cases of the user management UI. +* `IdentityRoleAppService` (implement `IIdentityRoleAppService`): Implements the use cases of the role management UI. +* `IdentityClaimTypeAppService` (implements `IIdentityClaimTypeAppService`): Implements the use cases of the claim type management UI. +* `IdentitySettingsAppService` (implements `IIdentitySettingsAppService`): Used to get and update settings for the Identity module. +* `IdentityUserLookupAppService` (implements `IIdentityUserLookupAppService`): Used to get information for a user by `id` or `userName`. It is aimed to be used internally by the ABP framework. +* `ProfileAppService` (implements `IProfileAppService`): Used to change a user's profile and the password. +* ```IdentitySecurityLogAppService``` (implements ```IIdentitySecurityLogAppService```): Implements the use cases of the security logs UI. +* ```OrganizationUnitAppService``` (implements ```OrganizationUnitAppService```): Implements the use cases of the organization unit management UI. + +### Database Providers + +This module provides [Entity Framework Core](../Entity-Framework-Core.md) and [MongoDB](../MongoDB.md) options for the database. + +#### Entity Framework Core + +[Volo.Abp.Identity.EntityFrameworkCore](https://www.nuget.org/packages/Volo.Abp.Identity.EntityFrameworkCore) NuGet package implements the EF Core integration. + +##### Database Tables + +* **AbpRoles** + * AbpRoleClaims +* **AbpUsers** + * AbpUserClaims + * AbpUserLogins + * AbpUserRoles + * AbpUserTokens +* **AbpClaimTypes** +* **AbpOrganizationUnits** + * AbpOrganizationUnitRoles + * AbpUserOrganizationUnits +* **AbpSecurityLogs** + +#### MongoDB + +[Volo.Abp.Identity.MongoDB](https://www.nuget.org/packages/Volo.Abp.Identity.MongoDB) NuGet package implements the MongoDB integration. + +##### Database Collections + +* **AbpRoles** +* **AbpUsers** +* **AbpClaimTypes** +* **AbpOrganizationUnits** +* **AbpSecurityLogs** + +#### Common Database Properties + +You can set the following properties of the `AbpIdentityDbProperties` class to change the database options: + +* `DbTablePrefix` (`Abp` by default) is the prefix for table/collection names. +* `DbSchema` (`null` by default) is the database schema. +* `ConnectionStringName` (`AbpIdentity` by default) is the [connection string](../Connection-Strings.md) name for this module. + +These are static properties. If you want to set, do it in the beginning of your application (typically, in `Program.cs`). -TODO \ No newline at end of file From a98b572051408e72b305f7a92f78dba7d90a9d04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 15 Jun 2021 11:39:47 +0300 Subject: [PATCH 10/14] Document the basics of the audit log module. --- docs/en/Modules/Audit-Logging.md | 53 ++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/docs/en/Modules/Audit-Logging.md b/docs/en/Modules/Audit-Logging.md index 039c61d3a2..390a878ec4 100644 --- a/docs/en/Modules/Audit-Logging.md +++ b/docs/en/Modules/Audit-Logging.md @@ -2,6 +2,55 @@ The Audit Logging Module basically implements the `IAuditingStore` to save the audit log objects to a database. -> Audit Logging module is already installed and configured for [the startup templates](../Startup-Templates/Index.md). So, most of the times you don't need to manually add this module to your application. +> This document covers only the audit logging module which persists audit logs to a database. See [the audit logging](../Audit-Logging.md) document for more about the audit logging system. -See [the audit logging system](../Audit-Logging.md) document for more about the audit logging. \ No newline at end of file +## How to Install + +This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. + +### The Source Code + +The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/audit-logging). The source code is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it. + +## Internals + +### Domain Layer + +#### Aggregates + +- `AuditLog` (aggregate root): Represents an audit log record in the system. + - `EntityChange` (collection): Changed entities of audit log. + - `AuditLogAction` (collection): Executed actions of audit log. + +#### Repositories + +Following custom repositories are defined for this module: + +- `IAuditLogRepository` + +### Database providers + +#### Common + +##### Table / collection prefix & schema + +All tables/collections use the `Abp` prefix by default. Set static properties on the `AbpAuditLoggingDbProperties` class if you need to change the table prefix or set a schema name (if supported by your database provider). + +##### Connection string + +This module uses `AbpAuditLogging` for the connection string name. If you don't define a connection string with this name, it fallbacks to the `Default` connection string. See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-Strings) documentation for details. + +#### Entity Framework Core + +##### Tables + +- **AbpAuditLogs** + - AbpAuditLogActions + - AbpEntityChanges + - AbpEntityPropertyChanges + +#### MongoDB + +##### Collections + +- **AbpAuditLogs** \ No newline at end of file From a7d18ad125d66e77ca2be91e9616c9ab3045d95e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 15 Jun 2021 11:54:06 +0300 Subject: [PATCH 11/14] Documented background jobs module. --- docs/en/Modules/Audit-Logging.md | 6 +++- docs/en/Modules/Background-Jobs.md | 54 +++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/docs/en/Modules/Audit-Logging.md b/docs/en/Modules/Audit-Logging.md index 390a878ec4..30e1ef4e04 100644 --- a/docs/en/Modules/Audit-Logging.md +++ b/docs/en/Modules/Audit-Logging.md @@ -53,4 +53,8 @@ This module uses `AbpAuditLogging` for the connection string name. If you don't ##### Collections -- **AbpAuditLogs** \ No newline at end of file +- **AbpAuditLogs** + +## See Also + +* [Audit logging system](../Audit-Logging.md) \ No newline at end of file diff --git a/docs/en/Modules/Background-Jobs.md b/docs/en/Modules/Background-Jobs.md index 18d7f43486..6cce8a6c95 100644 --- a/docs/en/Modules/Background-Jobs.md +++ b/docs/en/Modules/Background-Jobs.md @@ -1,3 +1,55 @@ # Background Jobs Module -TODO \ No newline at end of file +The Background Jobs module implements the `IBackgroundJobStore` interface and makes possible to use the default background job manager of the ABP Framework. If you don't want to use this module, then you should implement the `IBackgroundJobStore` interface yourself. + +> This document covers only the background jobs module which persists background jobs to a database. See [the background jobs](../Background-Jobs.md) document for more about the background jobs system. + +## How to Install + +This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. + +### The Source Code + +The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/background-jobs). The source code is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it. + +## Internals + +### Domain Layer + +#### Aggregates + +- `BackgroundJobRecord` (aggregate root): Represents a background job record. + +#### Repositories + +Following custom repositories are defined for this module: + +- `IBackgroundJobRepository` + +### Database providers + +#### Common + +##### Table / collection prefix & schema + +All tables/collections use the `Abp` prefix by default. Set static properties on the `BackgroundJobsDbProperties` class if you need to change the table prefix or set a schema name (if supported by your database provider). + +##### Connection string + +This module uses `AbpBackgroundJobs` for the connection string name. If you don't define a connection string with this name, it fallbacks to the `Default` connection string. See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-Strings) documentation for details. + +#### Entity Framework Core + +##### Tables + +- **AbpBackgroundJobs** + +#### MongoDB + +##### Collections + +- **AbpBackgroundJobs** + +## See Also + +* [Background job system](../Background-Jobs.md) \ No newline at end of file From f4b3d4b80616e086b3b9e8436260373e29435811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 15 Jun 2021 14:25:32 +0300 Subject: [PATCH 12/14] Documented Feature Management Module --- docs/en/Modules/Feature-Management.md | 105 ++++++++++++++++++++- docs/en/Modules/Setting-Management.md | 33 ++++++- docs/en/images/features-module-opening.png | Bin 0 -> 25000 bytes 3 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 docs/en/images/features-module-opening.png diff --git a/docs/en/Modules/Feature-Management.md b/docs/en/Modules/Feature-Management.md index 968b742092..9bbf344a01 100644 --- a/docs/en/Modules/Feature-Management.md +++ b/docs/en/Modules/Feature-Management.md @@ -1,5 +1,106 @@ # Feature Management Module -> This module implements the `IFeatureStore` to store and manage feature values in a database. See the [Features System document](../Features.md) to understand the features first. +The Feature Management module implements the `IFeatureManagementStore` interface defined by the [Feature System](../Features.md). + +> This document covers only the feature management module which persists feature values to a database. See [the features](../Features.md) document for more about the feature system. + +## How to Install + +This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. + +### The Source Code + +The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/feature-management). The source code is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it. + +## User Interface + +### Feature Management Dialog + +Feature management module provides a reusable dialog to manage features related to an object. For example, the [Tenant Management Module](Tenant-Management.md) uses it to manage permissions of tenants in the Tenant Management page. + +![features-module-opening](../images/features-module-opening.png) + +When you click *Actions* -> *Features* for a tenant, the feature management dialog is opened. An example screenshot from this dialog with two features defined: + +![features-modal](../images/features-modal.png) + +In this dialog, you can enable, disable or set values for the features for a tenant. + +## IFeatureManager + +`IFeatureManager` is the main service provided by this module. It is used to read and change the setting values for the tenants in a multi-tenant application. `IFeatureManager` is typically used by the *Feature Management Dialog*. However, you can inject it if you need to set a feature value. + +> If you just want to read feature values, use the `IFeatureChecker` as explained in the [Features document](../Features.md). + +**Example: Get/set a feature's value for a tenant** + +````csharp +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.FeatureManagement; + +namespace Demo +{ + public class MyService : ITransientDependency + { + private readonly IFeatureManager _featureManager; + + public MyService(IFeatureManager featureManager) + { + _featureManager = featureManager; + } + + public async Task SetFeatureDemoAsync(Guid tenantId, string value) + { + await _featureManager + .SetForTenantAsync(tenantId, "Feature1", value); + + var currentValue = await _featureManager + .GetOrNullForTenantAsync("Feature1", tenantId); + } + } +} +```` + +## Feature Management Providers + +Features Management Module is extensible, just like the [features system](../Features.md). You can extend it by defining feature management providers. There are 3 pre-built feature management providers registered it the following order: + +* `DefaultValueFeatureManagementProvider`: Gets the value from the default value of the feature definition. It can not set the default value since default values are hard-coded on the feature definition. +* `EditionFeatureManagementProvider`: Gets or sets the feature values for an edition. Edition is a group of features assigned to tenants. Edition system has not implemented by the Tenant Management module. You can implement it yourself or purchase the ABP Commercial [SaaS Module](https://commercial.abp.io/modules/Volo.Saas) which implements it and also provides more SaaS features, like subscription and payment. +* `TenantFeatureManagementProvider`: Gets or sets the features values for tenants. + +`IFeatureManager` uses these providers on get/set methods. Typically, every feature management provider defines extension methods on the `IFeatureManager` service (like `SetForTenantAsync` defined by the tenant feature management provider). + +If you want to create your own provider, implement the `IFeatureManagementProvider` interface or inherit from the `FeatureManagementProvider` base class: + +````csharp +public class CustomFeatureProvider : FeatureManagementProvider +{ + public override string Name => "Custom"; + + public CustomFeatureProvider(IFeatureManagementStore store) + : base(store) + { + } +} +```` + +`FeatureManagementProvider` base class makes the default implementation (using the `IFeatureManagementStore`) for you. You can override base methods as you need. Every provider must have a unique name, which is `Custom` in this example (keep it short since it is saved to database for each feature value record). + +Once you create your provider class, you should register it using the `FeatureManagementOptions` [options class](../Options.md): + +````csharp +Configure(options => +{ + options.Providers.Add(); +}); +```` + +The order of the providers are important. Providers are executed in the reverse order. That means the `CustomSettingProvider` is executed first for this example. You can insert your provider in any order in the `Providers` list. + +## See Also + +* [Features](../Features.md) -TODO \ No newline at end of file diff --git a/docs/en/Modules/Setting-Management.md b/docs/en/Modules/Setting-Management.md index dff8da3f8e..9104daf8a6 100644 --- a/docs/en/Modules/Setting-Management.md +++ b/docs/en/Modules/Setting-Management.md @@ -83,4 +83,35 @@ Setting Management module is extensible, just like the [setting system](../Setti * `TenantSettingManagementProvider`: Gets or sets the setting value for a tenant. * `UserSettingManagementProvider`: Gets the setting value for a user. -`ISettingManager` uses the setting management providers on get/set methods. Typically, every setting management provider defines extension methods on the `ISettingManagement` service (like `SetForUserAsync` defined by the user setting management provider). \ No newline at end of file +`ISettingManager` uses the setting management providers on get/set methods. Typically, every setting management provider defines extension methods on the `ISettingManagement` service (like `SetForUserAsync` defined by the user setting management provider). + +If you want to create your own provider, implement the `ISettingManagementProvider` interface or inherit from the `SettingManagementProvider` base class: + +````csharp +public class CustomSettingProvider : SettingManagementProvider +{ + public override string Name => "Custom"; + + public CustomSettingProvider(ISettingManagementStore store) + : base(store) + { + } +} +```` + +`SettingManagementProvider` base class makes the default implementation (using the `ISettingManagementStore`) for you. You can override base methods as you need. Every provider must have a unique name, which is `Custom` in this example (keep it short since it is saved to database for each feature value record). + +Once you create your provider class, you should register it using the `SettingManagementOptions` [options class](../Options.md): + +````csharp +Configure(options => +{ + options.Providers.Add(); +}); +```` + +The order of the providers are important. Providers are executed in the reverse order. That means the `CustomSettingProvider` is executed first for this example. You can insert your provider in any order in the `Providers` list. + +## See Also + +* [Settings](../Settings.md) \ No newline at end of file diff --git a/docs/en/images/features-module-opening.png b/docs/en/images/features-module-opening.png new file mode 100644 index 0000000000000000000000000000000000000000..bd99604cd7fb0b34b48de1299bdd8920fbf9cb4f GIT binary patch literal 25000 zcmce;1yodD*f%-`AR^+BO6njWQqm0~Ly3SQ-5t^;4Jy(SLrP0`caG%H-QC?V3^mMm z`2W9et^2O~-h1D>zF?g-r}o~@K4(9BKhN`feuu!1@>2K@$sdA1Abc5Vs3Hh-uL=aZ z%m3gmaD^O~{VNFc93%r3Q*ue%opaZUa=O7_CinvUq3mz($YJ?DAta%F6rouDYnF>~ zdQbyvyu!zNM_*9SKcrj8(xSd_3}>|X89L2&4_bvy8YFT5HQm$KX1RLb^j!XaN?f3E zXwc*9e&Zvw&uh(VTD0TYSd8lBBU6|^sVn+4_tY%`=mY4@rpeBo+k-RTfJeaY)f3q5 zDHenS`2F)1iVf_D13H1HFP?$~;G`rPZ43vUUDL3WuAr?D zo+Gs?J1P0`(8SeDmKmE-@1|K;r14q#%1D$qOP#lEPnC7z=P;(dRGCYC)5dzPnx$@> z8yKvTc18D-3e_FG>O@I-4_l4FCk&MV)8@8=r&kQvr`!dfr|k8{xnEgcKM)tWvGSJG z@RF!^qI$EJ%I^TVt5H3K@7y1lM8ut1YeHnw8yu4SRb115e1GLmT>-^@qM-*T56TNS zERmCqqaa=KD_w!>`Sz>AIEk;%1U-v98k&dm>dEAe&C&e>G<}!rA438nHy#wHiZ}i+ zVRkn)3v>0J^C&=SKeN=KtgYSCWa>j-Ay7C`*YHlb$4BpwbktrjsdX}1(%gOT;pVR2 zEHRk+%^zo8u-sZ|gn&ZIoyM!j_z5D5TAWLK%&*6#f_SoaxpbcbonM@n+GeTvEI)7E zf0^qSuiMmhApx&ZSRAdt$HjkON~}5kN^e@cIa%>?u3mTDdGO7hiiE!bn@7~4CU{&7 zWs#y+T_!8vqbr0U7F-)tQgd~k4z1Hf_~Y##D0UQ`vm{3lxypjYg2+}`TtDaz`<3ni z^FwlX@7c*dwn?dwpNJ;|UZDsIR#At%;iKuD1J|$3F^CCmv3Q&!(uvSUhxdbvI$vOQ z3t?W>>7!jz92^QE1V{&`-LaW*pK=~Hh86MMA@`ilu(Te;3J!8O>a47x?>>#fkQt@6 z-|X{?y&DT;HXCnM#z2zhg83y|I4&Fbb#B z6)W!Y1Ki(etzE=P1o=%f$nk||V=H|Kfvp`e%pueDnJ9|dd%{Ik3it5U&3b+VxH^>D zK12hWkuWWj(a~X88Falc@N7MjQWzofWbLy-$qP%`10yKN}uIB__+-$Y$+ zD+V3)ghGwX->dwzn6Gn!OECZD7?ts)-v|*Ey8IsC@r{i(AUM$X#Gb9BmkOIS`BYgJ~qodvYbkJ9%+z;L|o2gZ;dAm5W1PYl^ly>7tnXX$(8x8vpVh?v9dW_rlIgTxZ8vR@8Z!OKBqUfAh3W zIaa%~ZQL|ILRrWYs}+Yku{zb~T|F(KxbmgCA!+2bR2N{tUa4O+QtZ+ znRt!W0ntfrCL_1E=Vi?aeH{C{Tj|BohFb@otgjE{J-M3?Q=FT<8g%CHb#a`cIbw;Sy+zGdRwnmko=yq_9M?s?CS znowx8U75q#a_8v8$uJxHl<~rPV_*!j5$vUMnvit3-oL2IfP*pL+U@NK%1&R7g<=WD z?@hZO>*_SxuBIyUchEQ9y}9@uygO4{ST}&I{^=4D=D9_pTg#tu@O{^cf$LI^@OAm4 zbgMH!-8#%i_eK!-`-P;r`HWrjb}fd>+O$cd>nv{g4-$#bWcSYs9EcF^{QQp}{60o_ zx$1gWW=Ch2V@X28P~k*V6i#sJ7TS$pVM$AtmxYVFyo-y1GMY}teJh3=(#U4#h%!fK zAIRO~k+U5^yWDHmtsajdD%TBY7fJSN)18qlEO!motekw-?*5XG*>vB*;z``mI9`M> zLlQ%uM%ud^AvkEjDiJN)6`8GcBwb2vZ@eNO$qG$wU9HauxgZ1#gC2a6-z$FjAfjsf zK+?}ROGD^^z*UGaMtiu!V=i)0kk-Q#t(&t1Yfj#H+;n0c6L4R$_bDVIu8w`=U8=7g zs19fOE33O<(2~TF`)2>PGu+ZhJiR1Gjb`Huy2+8Pjgn!cSXe4d50w^jknz4TwwN8? zn>Hd$->_dqY{Ow*W}2;=*F+C`>JsLF6A{5F;fQG@v9XpVZ(>iFmmu11{9LqYW#5{# ze_M8rE$vEH&`l$neTc{IoKPw(HKOq-Da8>djsL`ho1u(1>w0w4PNo`W8Zh%cBZTqN z6EM%MH(3@8H!qo#1G4l{e~btGA5R~qTC<{u_v8ZYjtXa3=^ zGCtkBCr$MkM$knPV|Zd{n2m8Ax-9UM7&cs?2|iSewRRV9tM$64-F~vylT~!p!vm{V zWrn-wtZWHeP$biyE5-|z+kN?F*p9;Op-3!ZfJ8)>*wLI{ETmKDo>H-e*qyp8c>Mw za}8_M#l%WF5a4XS)$zeTRS8bSuz0IB{Yob1`8)KE)~WafuiT#Y`5am8d}PO?eb2sc zV*A5yAc9x@aT}W6`js~eZ$t?Y+i4*ktp+CBVkk8l6fWfQo2KVm%+8CQw_Afp)EmUk z+SoYVHy*erCxBY}F?OXiF*kXIE_{0fV>$5DXJG0crZ6je1nuNMhsnySyU9sWKc zlagC2^#H@raHY_*(Xfxum)CB9Bp(X=W?@e5>;v)UqAV+JhOFKTW!+vKu^=X>isO)W6B#PK5>9u_{mD_Ue z(A^OAjN^Uj)-c8Sd<+NQyZSfWLyjF2A}u0`useN9BWT*NUvtsY`S={a?sy`7PIxb%rX+fda02vvs@ zPTG8TJ$|UH+n9vkX2Z#1pnh|a_}$g)tQ*Uiufp^d$90``TT2NvL9ksU1OhJaAc*eX z4I|niqgZ{p<CChu(apFhn{$Ltp1e+08p9f96E;(jrfH!3IvF>8Vhh5B2*auqGwVQi~ z)&BKPACHbW?M`OpjI|m&_jxKtDEv6b_i0j@<#$)d{(jM~Cd(j(*f(Iq70xTpUkcj& zs#0FThsUqb`k#Yd>|~>D9mReJ2Tv%$tolSL|In`4^z3>DOG$Wz?zH*e)gBAsb#$b9 z<|Vt-(f6!*X+JYAh8{#7C46hH)Vv92@jcySok|U?RMacOsy}}V$h?=i?%~wx%X_-T z659X5VcqxlLFLg4-h6$LA{O-i2-}Ibjdd#pcD;ZK8HI`DiFfX!<2T6_WP{b!N;KxK zUqn&v!TlEIRdM^(mWK^$DeEGoV~P2Sv#QAx3)e*3vpwe<-*s--qQ$7QEUk{lEL8TX zBiIGB41M2j^sA|vE%A*PbS(TPbsoCAcP7uyl=B2F2(R>K<5wN|FiZmTLnM-ZDVCa^ zE`BWIeo&uNQh$$Lc&qdVsTfBA-i0t!c^}%f`XP8Qwr^T`Of7r$WccVgcs(3x7%%7< z5e*?rX*Li=hx3!ZF86J@dlT0xMon#*Vd;r%=-TjrUoVW}$Wa@VA_u;fDA}NsT$`&-k(O>YZ z&Y@q9I_3+T##T1x#yg>?lxE*r!JgU$4UT(5PzEa}tP3^XW4F)i-@!vG!XHv11(>=; z6Wyy@IVTk_%)2fKNyp9^k{=SyCT3o~Wnyzv_S9L)DM)%ixx8$4&HSt;o}X!69qnFu z*f&=PJpa~XgBZ5ER;{hE(G^R0IlSHt2lJm+5dCfiVGDY>*Va4J9eKo#%Fk#I9#d0N zuW#f`Eo=t5u_(Dp(uxZg!8M`m2RrP&nPH<;*B9y76p76BDn z`RG2?kD1|>9uDK1nfm(Ws?;o;G|IgdrK|=zyv*eofJhQTV^f!K33ImI2Y-u!OOtEfG~@ zV0?IVn&?71LOotEJ)7$OhhWNU*)KjNnoc^jte!ScO3#@Y$NeNO1QH&ykS}~h=^>>2 z*0Q%1Ch(4J3s{%0KHFA~Bw_Rf?r+U=$iZtVTn(qyko+Mv@!^tz zK7|QQ0rMQQ$NLv0OV~3U1VZG5>%144B^hfmA|2PZ6F08_t@4lcv(g;vL?n7@`Ev^v zRlpmln)c$t1D6yT4bJl!+eXw^J*Eaayl@cmE(M)^Xl_gD<)UCA{B7e#h?lrq64R9G`s%^TbYt{|+TARChnQ_2e393Euk+82 zD88C5_OqQhTYE~G^l~OPsA)$zq*X6_kXdY52^@8DbroJ^QgfK<1Y|0>IGIjw=|*ke zlNjr7%2E!o`5hhc@>8kE$tg`gxo8oV0L94&Qo~l5W9>!G<=e032PX0p7ONrVhF799 zoG$XxhYgc@;9OP#wLQyM6(wU!J@HDse)Hp&>F29dBmUHAKFiP}kDA|3x~vZzM=3wB z*UwH4M-@CMPB(8J%KxB=jqtu6=qe(&yJkTT;Slx)S*G8dto_jYq-Cil-gHshlXnYwc$UUnTP-PPIkb%JEukn!XL(dsfJYV%AJ-b#H> z^1fS?RntLkALRJ2C-valQoNc_QKvs_WgFG(B8^YMNz( z+&K5wPVIVxrtoI%mUV4TM{ZM7m`YmtrO#3lhU|| zz*RWwU>jQsiM{9GeKv6Jh*^Kseotrb8>jOLyq?&Od5+Oh{eF2gUAU-PrPpjc)`};+ zJQ6mXl)}Yd*5~cY%Vi~ID>@Q^WGg;#r1B8Pb9+NEL|A*B{I%^O*~IhWArU8TMAOU}$;H#RGn;vb-Y;los!97Gx_82i zDIyP0*4GrsY3){<2>`t-NjmJ@Y!and|HaVzdt=9vx01+AiNX}7`I?WXH#^s6)WW%3 zSPRM(KSEU@2q1r1$|+=`<+A0GVS-pYlB-+Zlsi+CyxZy$Z6V@UopHjVhr;9_&|i_& zY`U4LO2$DUCW+NdjEucN`ZF-8i_3g1Gee?#8{ z{{yG;Iqq~kbH6Pa=<`0a4EYo|1PT849_N(Zp8fBISN&sn$G%jKQ{VuS2Ja}nRxY=S z59{nO`f&Tw{wk*j7R-Ktj<*|xNIIN-2$4*GK?gj`pA*GgrO?pOiBmg!N5|1Gl_8l% z%6nLHhT3M88igwEpVBYTs1eW0)2;c&dX2)W>2J57@lIZTe!a`lavZ1W<=NiE+|Z{? zMfDF|A^ngY`d^hAd%*R?#6-8#P5t)fTL64KTO}Xp+xtubhxK0$n48zp-OF0`pH(Xc z2OzqmjtBE|@#0uOIRSap{v4am=w?|_J9eLxQK8CAA;p9r(9gfhX`0p69e*rpzqe<0 z;PZ(BP%=oB&T!W1w@X5bMAdQ)a1Np{H%z^4XAlegUj(-wSKX?Zc7L$0V8cbDcu2?i z$~PoGf43p8w%bjWtX#zsMqIXHHO^A17eK=YQ+2MV^|eFeg+?Vt&5X1|FWZYLlA=~I z;&|LwAF9}Hb%$!Z?|@2P_v4fs@g`q3Th9D-(~uql;~!&j8E2_`3#JPYpZIEjBw`c5 z&}d|~CbRylae8ZA+mV_Z3K#As>G?LU=2sN3dxe7cf!_U5{w+ZY?km-1#8r@NYDA3R z1IFMRRmm~)@!w}QYXgG|;{&f|mU`{vz8(jyYIC6UH3@)v;M&jq3gO8R$nl;$E_%45 z^?RQ%kK8-=?tQ9blgvW@VPjiupf|h0v5_J)!2$J=EK+ytpS;FhX;(K=RB&}DFT@!! zo@^RiZegpR_u>%n@Cf(T``CF(XX9;gh8pTBJh|s{eUB_FIfrq!4&v7Bg8BO=d}@IH zfLAb~v?%L5!8ukq?LdDwYE!~yLus_K!at}G4}CA2d4Ud6wxl3-^IhyF%)0Oi7+4E* z3*3eaX4s?aIhtgRj3iISq(8os!_H?8^Q7%m;4eLN-8+I`(- zuF%lbs5WceWHH^R6Usnf>3ss*th^x8m=w2}fZg#bYLtK`He5?$pNCLRs`8fLq$kgX z>o89&aHCS|J5EKKgp1Xt7(k#s`ma^cQ}D)j4u_9u<$fQd^|!G3GNYx04X)D}5jRz+kcq3Z9*^P@`NW%2(`29MIePAf(ECadgYbaCwSL9G$kajm(q4 z;%Z|BmQw3i0OEPetVqH7_S_p98W?EVM=tN-;l99P=!X`fhqJ z=I$=oLpCGhWl!Mo7x0M8ceyh?u`p_R2&8>sgSh{2n94v4-B5IT2bjbG-k9e)yn*%m z6ZV<2=(>!+fKGRX_Z8Npn-NCW&t+n&sva`JD3R z2WMj3z_51qvT2zJsKFd@4-3zD^~Bn_y$oSsLFu3ftsH$dPhPwg>sp#dK0K~QTJ%kB zG#xG>m@U#Rs3wp{td^{Gy%d))e`a>sg$%wb zVB?5teV3R^USWQSOkrYgmDv#uK7lTj63T0}xyy>B@RW4CJ3*5 ze92^LHfpR(p`;pV0|`ucA5D|ITkFQc@X5#U=b5gA#2GZU5f>-sE?y5$PTeaeCtE@- z+hTl45kby@oxULs*Y|uLiC&g18j`GEj8#h6j3hPtSm#X)_!8lW$htaMwM2B{q_^5= z|F+au?K>U(X6Vw}^Eq*?g_jA^+TkyHbZL5(D~=6P`(z()lsLY?DwH>XfN<>OERCB7 z%0?0fQ`o>B!6xG_-2|SIo!2y1)fj#&emk{E9eRg^Lo4e0<&H>OAFBEq^5?QrQXm_IMB;w)M4O z%4)+;4*!EXgA!!!rBkDU)vQKq;xZ{C@exNdT-jRMU-MMI^z`qVD0(=sW?!rgS~DwtRA=8T*py?MBf zgp7OAo7>04#yhk7NA^R_Lj}d;E=taEO;zh{@B5*N?Oi6*9dEK!#JD1B796I z{CRal#a@WC0vKFd!nCx%%^J2Ybd{KTHnly`{!cMNeI@0>fjPqxpLsV74~S~94U^i!Z2(aWmnc8ZYDY~_Ks z7FP=pv_u{RN}-H_Ir-~(R{;xrnyXenOg)ikNZ41g{%2b=+B^YnXTf8b><^4 z$UaAz)-}b~FIi*7^{)JK4Ej9*LVPaAPrIfPjxY0YX;*BxJ%T&(J&h-CGwQ&8Mm>enqx~7sVWzrI{}IqR(O&vDGA)*M~`11 z8X%g&k7Ji;DJ6^!f^b^X(`Yeg624{+c_jTm{QBi#-=1em6PS3}h7F_k3Y!BDZWrAF znFXp(DHhf{)iw*XM*OnuGHdYX#(_2%8@c*$ZL#)u%<_*EJf2LGBtKx~WqQF~pQbfi z%)ybfr%D@oHKufr1+o=+syrHO_z2G#a49E_T{Mm#?Zzm=K57d)=d`(NT8>I%I5Yo# ze4wK-6ThS}vib;YGvZ^l8y$3|oG46}Be@JUs$LC*y1k$OZX#eaw$n7Jo*}9Gv2?OH z*X>2U!HR~_K~Bibf|sJR@Jb6BCn$fmWkV?T`uZ2C+>2o8u)moH4eThDSn4r4U%EAG za6T_<{A@L{^(m+K%5ayCd|EEwN3H$UQSroUn|h`;G-~-Y3O{9?a!1&0T6bao=0==$ ztnh#w^etwRrF?j8jrizBx+*GxbRwpwhbGWDs3C5C_QSTd3`?Q$W)2Ib{P8dt`2n$T#5NXTgdPSPM5VL>hrOOz1$URV$KsOoU< zDN>-~O|m5QXgpGJlYaWX=U?PNBup$#?#bRu85V0fjPWwq$n617%DeFy7Too)v{KbC z!Ng}=(e+WI0p-&1nHck+4LEmk{gLZ9y>vt5l0tJw<)&|y2oPi7jokwxjQla3CXd>p zqJ1S}-+Fh8hrs~XWW|k+3sp#M;+wFiJTu+Y%SP%)DnMi7>Q{S#A)tME5XMoKuzMl) zZY17(hJ@?vLzRlU`cx%r(U;0PAV_!}{XSDMuDEhb)gN$^{f^iAtO-|NZ1m8vER6e@ z>)HMKu+1p5y7JgT`bW_pFLEn!AU^urPZ@zAm~wmceq9&+eD8Gc={I3oz~TR9QlP#N z6ijqa_0Ej9(*wX6*HgXa$T+^rCiVKxTm+G8*u3^Oi+=20_s``Vgmv9$vH$pZ`dh@- zg!t8@T!>dX7vSd?ZJCyN-UcO`9|sn`nv2;|IrwY;j7(>KP~?77CFw&2l*yR_%Glld zD8{zeI8RdlQw}ao(@MSdM%%sC+c`0*K7$&YG4f zlFS;&VznA9f8k5rQzN5E;LBAY68+xD{Jyo}^ zdbN!$x2R$@thWshnEck*b4gTOl)f3?KEU9k>dv1eOBDO%jyGDa+t=Z2Sw>_e#K30S zr$)*tGYn=H*_ zle?W?Zn^Z&i~GO$XDZZ6(vcd$Un}@txikGZp2xUrsJw*MZSB`eiBK~HZn-;Ervy5V zRg?45$#W1;@j8)J|1AmJMZ>c>SLVH$y5~yLjXRVHQ8&ZSJqa9Cf0|nN7(kv;{nWVa zJH#4hLn8J5w%fKCt74O)FvsY!R{xir?6VlgldpDu6vnyiOFeMw61A5eZO;u8TK$do zSF&E4I+*l*3zfKqI0_d@FI0|7l;;VoJA+5%j{4C#oo^;A=xs7Fo`FkD9C+jP!TUe# zsDwW*KKyvA=NjhWC@cH(k8uH4hu|`OP3u-t_iDNz^$X|<`QDupx?80*lXTsFee!wj zn1=-;;L#0r20!EEmM5gqidKcMErOTqHv^g+`D`+$oI^)>*9VII5|VmVVP(VDL8RZT z{*e;zbk2D4W2I(w8H!fj!D3-Lm%ctYnbXrCVT2TY!ez6@RW^0-78v?p&oQ((__I2pXmN1cx_0=46Sd0r)HZm^P5c%X zEBO8n57_pr;L8T%p_Uq^S#pZt@aB<#R*-eD(!Lx6vLx;a%o(H=}TwoP3{9fkW3&yvdO zFQ~e%uBUEB*nRpF-*{;{t`*SkU+RAen!fprkOR;5iG`Vojtx;j;-B*JSdG==(Tf)f zra=Ke;ZaFXx5oWg?W-Ar0yi5|ZX}F$OA5vsS|m-7lfqZ1$J7L%zprSUMyuz0_qsUc#9#nFqy(PNJ?Nm zbam#rI>CCIozCa>G?d@ZH~+Zz@%t=V<^9(-C$!O9YNO|{?q&9mj5e96jZ2eeUR)!^ z+}BTetGPxm7>yw@0$_ICqM3)F>F=7Wnl$ZGHEw;>kmGr)KnTPx5>ewTS1SkQh{dE# zF*>_4p^?Vjg%S1LGrR&r9x?_Mu8&E<7m)c;hxKE4rb>XTG8d>q678dGP*L`9`4GPH z0VlH!2l>71x>H|*Ev`pg!#3kf>7F;9?oFlsO7^mouqx$iMXt-sEnDMG9-1%fpN~!q znH?dw5-PNyJhM{ou?NY&I8}o%u>Ssjd{r!#@}nuLuTNme?5Vya0r@ucc@c=0_+b#R zEu=6hih6h_@n5Ik)-uutms_7*PPE1a;Ro|!u;1cEW!`9_CT^~<+9j~sIk&eYZbdy@lX*;LR zukz0EnELnL86mPfefZTXwEk1Y1T^(OV0XSXme@gA2c~bFX!9K_N&Vu&@G(3|auL%W zg$b#8t*1k&OL<)^buSa$SKUT7{3ws^a1B^Z+Rov7rur^z#M#MNXA#6-_84$Ql+VO@ zvDtOC_jGU-$XYX^mS`P$Pkl-KQj86!t^R=Y1gkxmq!btIu*7#n^HKTq>6)CRrbXBWx8e9tU&NiUPF;-d~@8b8JU zXOCawgmN_ZG~cQ}A96FiDPYRu@xWF)7=8;H%$?$b?6CP;s<1Odkfx#9>4ecK_x#*- zvn{HaYjeYJNRWh(I-(m5OrxjW0WUA^eGr87u?ou)b?v;G7WhW-tHnc>cz$f2ewJgF z6+XZ&mWTL~))CfhXwp6UN$#(Q(~wBW0Y%F*fiTRTIx>XhUk?Pfyy51+o| z63Bfy(EMwg%>GFz{8w!<=-ZF6;^5hWpGm^w=)p$G^fKgI%Ym*>^@|Ne29pEw_W}pu|xlWSt0lAT0qjGdG?N)Y=@j zq=dzZS_f?02VPbcpZ0BL<^N)rOX@r=#3hT-LqSPlc+VOSBOfyDfk1WCGrFhvpg|Lo z6rqd5CDRdy1G`G3G-&Zl3o{4E(EuU)wa1oCT%_pwpd}n3np?3I0NfjtF@YUKoe*VY z2LyQ3e|`tAII;z#*^=x~mUrsNUjmr#zI+uW?l;yVG38Q&<*MaK2B|Q-Aq>|ij|LR} zXHE%xyEShz@|ZC9V>m;CHD)E=?gfDj;S@2in^xyaLL?0h+0nb0T@QAHQ@-_xJBvY+ zNakZ8nXsweRr8V)C+;?x@S3;FHat$gY?VZPq_Zk8_~p1v%uBB6zdt?#5NrciT*Fn6 zAO7NNp38A{!g|Anv`^_yC{z>b-FShVO-(>&QzalVzLF7z9D+ciG1^br-ImI?Y(|R- zi_TZOy4bq$%%@O~iRV-z5mZxA^|lp24KUjyg;`X`D{$`lYDiLF1x+O%@6{R5knD1k zL^>2|vT(8B3*M^EMqg3KK6d2*E#?`+%R5WU>C(dZ2$WV0sW!wo9R5h#sB_fALd5BY zWgbdE-X%=++$IJ%W~W%tD_sasJeSFG>+!s*I}&x~d6Fz7WLFW8c)g0@@ofsP`bd-1 zzBX@~k`!KPxY6Y{gE`0O%%W|Fcj_9LAn9auLY+)5?S8tmWkp{V2v&Kcdhd>raRzdh23P zZecU%mDlx`&zpGOlyne9HzU)@Hr#uC0ZaRaz7DdtA3!J5!{4#c#!KS3u4h0ePxra95P(24j(^RjEW z3Y;7f`@#acO#AZF%l;Y&fc&+oL!o)WbYn6Gb5LjnuHtWo8_f&=PRI8p4K_5Ye37L} zCW}G(`N~JUyu=Ub>2n`lL}1heRD!)4o_tTr3nY!u}2mHR+5 zc}>s4ZL-uf>kFtmzpGY2C$lyZ3-o7Y>VVn)KLxuZ{51W5)WNhhY%W5TDV0;M$0@TT z&*f9QY_jyMhPooNB5R(DL=K6#hHD6wK~Ulm8+-Q~oMr_cAqXVH4e zrn5}6YP{x`YQ4NmuTc(JJN+2fpxKa^aXJyRKbM{z6%)5#lp8aaTvl^*7D@C{Sf>IP z!22~UYVntz*0}wOJGZr*&GIMeBfv{1Gq#Bc_eV5l*9$IPRCvY|F)z6d>}(yct_FmY zIihIBbz9y+R}Xt45nBZ21PsP()FWC~*pir|DO|8!I&as{joKnCP(>12a<#17pzdi| zXWt5)jfan<>Dr8&tVwsLMtkKvA(>1@N~bkrF6?>mNPkRJyd1&KSSPtTJ>AaNZ0%9A z_t>_TPl0uye(8?>X&OL}WUioYeC3`pr9I)Uv*4`Is=|tDf_WBaCUFnXzZ>8m?2y2a(lu+ z2IEl#v~}*sb4E*h?7F{)vZW;rl)#VRh{lnKi8Cd0-NwMODCiD8-BE2Vhu>5E#b2L&wwXD1n#Gy(3{@ z^~uo z0It?o`_bvIps)Yk`~kL*Y}Tbzmw+%;22MSV#j68^!9Y88Toh8P=eT6l&zxbdpQ#w6 z_GnjFI}~d4cD@659nGuYtoGMG@qWGo&L#=uZ@D-Bb-G8sE?I5b<*!O-0F?N~+S%3B z^|A?L*wFrn9V#(Qdk(8b>?yRMR3(LJgH8NK{P3`+J$JN-6>jc|mq5Zm12Vp%>Hq9_xU=Vjo<)AmU@4Qz|b|ZRIy1!Hkx4}+EGgRF9 zPqI0{Lz$~7O#irHJbFIwf#F!&(C_k%0HMPZ?_Y(NSBIl(hCwzw?FPjOHaQw1LdXNd z3JXs%-X=SP7QQ`r{1?4uswQO_!{Gz79hWpMZBbT*Q#8Z3Ub+yZ1X+1u{@TAzsJ-eZF_ zOBVtt>uvR*aO-}bMAOHgCp6cDdR^C_SDxBwlnss@cQ~I*p5?Pd&4c^a=GtWuW<-A5 z2iL_p-n;W%nEICQ_iDOpC0Il3Cl(&Z3#oDhdy{}+4RSs3P+1+Ct?57N=RrTEdBI>H zKycVukef|5oz&8idt;fVh6UQx`>Gkd3*MQ~E?u1UZFy}qa3kF4mJm~WRZA}|;o%cP z7Pijf^ejgw_NL+%j zTJHm16}3o9<5CN7dhBFSgBn@K+t8VMa|dK)R1Llug~RQR<2P4}db$9uzS@f50>iux z8U-M3-vR=(8h#)3*~pMqQ9Wgc9*YRqN?x{$4l>+&59^N?@^BIpC7>CXe@jQbd<=!5 zZORF&8Z}H4-mQZ_GHx{<6-2*ldoHSBlo^nCSITsO76twWwXOrc_4a7q z-;(LUE$fVN9*-PN+;xvae55;T~+ z%L54x$h}|dE&937&Qf&5-c&Y$&QGw5Eqfv$Ao0UhruFJ!YStRgd;H7}DTW;rZx#yR z-D=lZ!1XUL%!coL7FE!38a|f(h`akYO1+N5ztl3rM61V_QUGQ^cGqz*ja` zG5Dw344M830qyH0tmWnH7sBLlk&dn|1?fxpZFyO9-`Df@NKU|iAg_^X zI@>-2u<2|lblvOpX0{DSE`Qwg{fC;=WWMXnU1?ZM_Ntw1@B-NZ4w?vw+VD~$o(jDO zI9-WzlB=A?rqB$x_`LR>cXttw>j!fGSy6xha>7@9TQf zY9AAu%e*gQ;ZC3)7xdH*k&a}%$gp;vzHiP`U)NHg&&a+qW$|3HJ(i z;yul5g>Z0rZvE{*d2#H;*1@XpKV7%?Bb^;CKeQ#vbvFCH)NSXRy+dvT!0X@S|5}^E zByLo>@)6;K3-a`VJ=>y>61P$nPAW6UEJTE3Ua|(`BziW?bN@Ox3^~o|=~3z@vf=ye z5^S-nrCzQNe}A`v;Ma)AbBJOMlPYw)ATLOcLuaU^VklnO-FWNwn9PcS#KPo)qHn2~ zl{vh5`lTuu=D;nRtoINIpZ^ej9@81*(#ivPgc^HmJ+V96+w#gPk0^KwsGKim)GrpL z(0jf%UM!*VeKwrDZ{34$m~s+i^OI7t)Q6>A)gmF{wz z?g94J_@mw@PR^BDGd=&q+BpnW?`W@OM?xUZ{w{%?ycY-y?pR9>!usKnp%>SFVs#r( zXpwW}-fci#_i6^Znth?)ry;?aQ37j5L&gR+}0N%VNeuo!dPJ2E4 z{^KYIV?`yCouP`r_nCF;@fJmmXVb|5gzd%*G-0LR!}h1C7Oj+XvI=>zJ4mc0aQ$*3p{WeLb45T3l{AFzrVCkI0pPg0U}SU$&Ww-hHWz zU$zJG4Khc2w_y7Ju77FpZ{Bh+koGvWwH-B&`U~vpW{BwLlhK}`g*ZSO@|*ksHSMuK zjn&Z^lK1ArZTmP-y^`Hz(GTw2O9zc^NK5@IaBHLU{`q_7tLuyD?3EO} zde>_-s;^=i1n8{oSQ+Ao4_B)r12<Ysfd-eikcCqRKx>R znmu%ETw##s6BN9<{8h4)bK4lnsPsH}_x4oNl7w#PE$QFY#ooIOSl*g-HKij+lX=0Fk%5t#O$wm=^jl?ju@T$ce^|${Y`R7H`GU&o z?3R;nnD&}-aylm_Cf+BtR=L>S0ezbjuwU)`zmW$<{(aXf{}b@w51&Gu=cWVNCCDd0 zmq0`&|3ymj|7S89V4j2UZt9(O9M~Gn8g{mpO7}%=+}vHKY^4D?n*zIzr2NZ8_4Z9y zXNX33ui5&I9=74>n6Ui3d{g1mLjvGGMgYM!2&C1%%XOQg0#yxnL5_DU7M^mO?B=i= z9yBne)nsHW9e*G5QFQ<8-8C6whHVUFA zI>%Su?w8LD3EJuCoaaeWcRo*i*zlj#T50Ny1w<@v55_^tSi`pS*mUGw%$w80wvMgs zWMsZ!r00(DWda8}*w|PZYwc!hdW)U!hmu#mU_1i)ZcWKsGj4(J zF`4_Yw~*|WRaI40ld-zk?Bj5AT2j=Ef9H;2$FHeso0I?-ch@;~;~;AQ&urD!)>cRo z81qX4R;4ku)9WLKlzDI6jQxGg!u%W#uhYT>HRkwoHKK6jE;5*S!$Vd+Y5?`=vD3dN1pN0e$NcG!j7h>0q|tG6l1v3w#eS7Pur}J?B<;824#P zyBz=u)}FCZ3zc|k4vqK@LkllvB3*b<(e(mcVE!}(lRLj}H?gZ;PVI5n ztecXnsL7|R?YVz_(exG7cp&0YkOtw)F578Dv1&EEg4j%qu@3=@*WWfCYe-qMp371# zAsAPuBQ{*`xA1?f?mDBI+`2UP>J=4~B2}6cQIVq31O${S(nNXS0*D}0 zK#))b5(y>rB27R*2oQk)(uL3=v=ruzerx8>T{COG`8Dt2Pr`f3-shZW@AK?^PTW%4 zY!6rTbMEb|8u%|h=|hj?KRsvVWV%D5YYWCvw)tejx7ui3=>$+E@82V*6l=qRJKbdb zKiAR@w^&>4;8YnD3#M7EjsQtCMM;1dt+j=C(p=xPTf?shq69KEH6`}fEG#TsU!Pv_ z8vt#|8n|*-5N2ti(pmi#8`J?l4cJfL4S!Ji$dDuPkt7i|5XYRnVx z*_FoH*C~58FU9(6Qb#VK(_W22$e1Ze7n_B`qfX?;vVl!~s{>Oa;0aJD#PLm;v4(dS z(=gkf_GC@IhL(dbABQgUQj3rak@CjAujuQCVaxjolj#=@XZoDDTkF~NyuNQyfxsdvFZ=jlohew~Z z;5=EQRBGb(HOpVh(5D9iK&H#Ef5Oy-hKqXcvYnuIO$`&V>d@vCk7C1#JkYnj3= zv+V5YgBd7Dt#NuFQ7M2=&ULcJH*jluuWE#MvIRTrvrxSL#lRBWPdeHSkyZHepG}8V zHrbDrnJ;;X8?ftV9~y&S+zrdx>SSkFBN}Wl&|-o*e!VIepQu8IMDH$|CX`t=IPI^E z1KkVu)lFN6uAT7DJk)F6fzEJ)&%hqkP<7v9&#ktwp{y7o@@(3dFjdTK1ViPF&nsnN1MMmEf*vz2$Y@DU> z#es08t=4??xKw1&;bu!N1U!@TFQutsk2=$uumOS8hZxq3Kp^(BJOFylV4?}LB9+xo zT~(dQKuXA*iMDp%yU}7QkN+R;!oUP9~&E!^Ihtwm!OuvEnU+f%R%qEJmBHw)#5#`0cgQpA<`fZFc@Fc zZ+lJOi)>@WHv_NIYr+Ik(H!)zf_ImGHy*(!X#xC$=Dz`oe-h?@M3?`Eh0-tM0oId- zzBhZYDNt$mIILNsnS?Yua4ds2$_LW#&mFIH+kZ-9swW~`LYl&tU@tN-m-5loNk8EZRPVd>E_hke>(3(&;Jg+A z*)PShQNNoZ8`414XoPp`@-8Gh3>IMy%39ey%Eu~E!5nrf`4feM9Ji|d{2wOh?d@w2 zB98cS(svg#sB~~t4>V5sNvIEX(vjud%+3J^mJtESy;Y*S6-}x;h-;~`%7y0M4*pvU znTY52%^k#s<1xUOCr&#mPXJNw(|7v2a?7EYmq^k(} zK+zqdnbbtU_gE3GPCK!FZ8{KH&vDj!rOqeJj)ikxWzwb8(a_j3#X|3fN3=@ccE5FX zkGs}w%ZnqO_1E~533W7#7qo5$zTLPXF=c3DkuD}pWB>&u>NRv#TkfYQdva!XQ0KS}flC+}aKdbIt<5HMvGzQIxxv=N6-ts1=HCDkPrfTiWUIq3Q3L>T3W zCWSit1*X(E!AnYp_x1b^m~Yw}J{tnJzVo6JH`lL^9qx8$;qY4ReIjF};1I}d*aGBG z^3*b~TMHx5a$|{}$r~SaA9YLG%z*Rr`Qx?`na6UDw;4#mOC+Dpro&RF* zBx@W|UKv4~H1Uh%C^wSob%X1F2Ct+y3JC}#Cb(8IrQgXh!&IFFIogBXvd(H|t||jz z#7FMBdFSK1E?t#5=;b!lHBOF>E-zLK!FqM5>@dvfOI8RE`P*R zK5W-nPuf-NzB;uOCdc|T{hQa3Nt&;Yg4Fxt%-FAy`-C>Ah>o0suibd=Qx}D%2D6J3 z)(oKO0xNFvlJv3=xhJwWb~jB?4)Su~(2b9#%cgYs6$hWrc~KeT=4x;Kqj}0z=w)%> z5Jsb+c~GrY4GTgS{bjpQqv9}fLP6TuQf$mvBk2>fb2YE5G%_qsT`fNHDiM1c;|t=h zX_r3mz*XYInYJ6129PAl^4>nr>*#E-+I1zDrp6O6Cem`hOqZD;sX80exYI4>lF07F zC$3CL7)mM3+8R zIl03N5#1c>-l@VzEv?n9vhTMPQvw&V-wC-6g7)_yUd3lxEm)f~id=nPOhnY9SbWW! zoU*>zK}sw-nM@Yf5EBm5VG~o}_lb8BKb?Pp3h|hK%8Z@lK1JV9Un-OFc0HhED(}VS z)g1%a{f;w=##x3ba~2g|rlJt;&sSdR8GXmhD(5!kl+<8M`eJzkD%g={5k`Ygt<7yK zb6A(3Ub|Q3aJ7*|lX!2MDh775ka^5OfBL06En*-+RN+A7VgD0 zJ#QAKAB;6y*QLW{{6D@A=-&8If{>_QkUy|7-b58OHs;wKcDwY-EmiS75!!t}wYayu zqLi4g?2$GwDT#Gd<3|20ePBPplm_uCydJf7G0hi`dRnu2lJI#E=t+X)(j4p4ruaRb zs{n!^c#YJ?Lq}J@FI~k%eB4YLq})`*hJZFb?zpRwPc%eL6ym-Vi-+qHBi2a&U2t@Y{4->UOP3D{5+a)hZVH zX$Q4R!wWMll$(d3-EZ!o3>BTP4S)6iHLNnco8Iv3?sc|<5}vfz0^bYSn!~d?@rWYSBxfm`$lByGEoAUOIZmkqT)F3$Lg0lnR9D zjus{7jW(|I2j)JqlrQ+OksULbQ_7a~)YR(qoJxK4Ltwm7<|@mT0)Yq9rFu~Yie6m3 zsCSlWVl%5gh%pw6TJ?@*GJEN$Sm+jejC>-8dU<>W_ua+sbyoL`vwX8dk@CJU;C`zB z+n^@C=X=?DnkFSzu~z&~z=fI-bPygU6Ph20knuup6fIiEs>REz+GqQXf^*Xi#Xb=U zbXCuenl}hh!){j2+E3|p>wmK4SHR4IFS&2nM|bf??8)fjjP{kT44;H-AGkY5)BMKf z_2aO|kP_6C4Y-TVr6a`b!o_BY{wPxx!Qp+#qf`%E7Uy(OhqK6zUWzK0Af$W&Xxs$c z#aVmv(CQwyje2%%^D`3b91VwHByxM*Ufa<1uetBnAVVi_{pOBySx6S#3i|f0~4E6&{ zpS&?=%ar5NjV_1RsXmX7zOn35`rY-i+QPAPLpnPVD={fBFykF4~p*`xpFSepew4QvOiH_UtR7w{VA&`%XHNcRe3P{< zuTD2*J%DiCC#PlteN(6U58D)>{&ineoKRn+RswoDsq2hp;*i}aq%g;kb)!%?a2QAY zGfozlca|gEQjL_{?Lj}r3k&?)hwcE^8gnO8hneHmCY-S2#ts`BZmhbS!)Ol^hDa`P zd&`j@m>bS;!a%b)Y$p7Qc5>HnW!W%pSXiKIp_3xC-aJ-T7Va~@s^ed=kuUamaGKb$zaxu733QJ}#;&sqipWSSHOgbcx8GQ< zx`~wC#5f+gmXhbL22R3v1Mt1Ir7?V>fuq8{;kyq)H|JhdxP!`>&k^JHq=z0}{~MLs znro4SD!cwz_VYVG8V&KD9osj{Yun$-dg8A=|Las&wRvjSt6p@b=y(#MRkGY7W6Yvb z*-T<6WR^v-Q)N%C3Gn9mZj1DzM}D1@lWH?_jeY#eV3>Z zVK*-RXu&n3__nYFTLZrSA(U20`6>oc&Iblo?@e>p&iEUG+BZBYpYp~{UK3sBco-gs6@m z_AT7K)(n)QM1tzj+=scLS$b!8$m-IoC>PyX#E~~9qor7`A;*Pn9GL+V^ir3pJ)WQ#;=2W#t-j`*;7u9>>A!#w5zmCB_vnr z#HBs-_MaMa%#&St<(efb2WK-V{;Tjp+JN?0vl>&dL-v!Y;csh3D4B$TwQ|J_cAV^% z#${kR$2<&r#A~3$dqo^(_TmzvI;^zM96a&ybZP5{g61ln*ymbJ>w6L+9U(puG!DJN z6Bh4EQ^dA4Ni~>;IJfd^WXYS_bAtGkb*`Px5Fa4fRMe{MyUaoy>Y#_8;2zw@uRh+~ zu*yV;jBRk8yh!{a;4{ZuNd+DuZ$?d~d_5*#_tx072eNk?_v0Cm12}`mauLB>ftu}q zKj8$UG9N&ewhxqn@w=G4^~0^*+W*I+u7PLGXaCTlDKvh$SSm2{cKcB*0D> zII?1B9I!H5-sWx!ZLBpJC(hAqVpjBdjZECXHwxWyG6!XP8SdL$u;Hpgy$?_gFGn4G zJa*LBnVYz9RQ&|(WW>CH`)kH09IV=LGSBKoUO9o2f;cWj6)i9=+OH^x({FwHOPi&{ z1gXb$KP1)IXB1CT69PJmOVBV-N61MTsx3WeaASP>%sgoxX7-$6ZTtFsd#Pk+v(RIc zJn=_-mG}3=yqo&PO&nj=0ayHvhZ2n1Vw0>9X!rSPovX^7!Wp#d-9F4j<=FRl?3!I= z(X*)5@}x5m+VLN^CS@17EBl1iwZ`+rZ$_ng%X6Q zW8}MY@TyO=`=kfWz_x(26uJNHY^vN0+lnTUGC$Q47P=x!yXG)o8r;oJ>eGg%u~^~w zJD0=jrS2}O4{9HuSqEI``r}vpi}OmyxPXbvA`b@Wc^mc%2&B5#^{A8!toa)6j*PQX z;>>5?GEa1mr2)yFk=O2pIX)|TJ?+d(!)U!}eR9Y}x7=0Fe*43uB3tN6!d&a_Pp(<* zd^p^3pee?%P-h5Fpb|}(mor?1Xl~2)xGw_b&S=HmSVJ|T(9=gjL1)IDJ4^-{f@mVH z3koFuA>i{Z9V^fcugW!PE-+6@A=^0yz~m!qM*=1+DmvJXV+FB*+mM|22Tgi<^p{p! zA@SQ$Sgl0D0Lsgo^pVI z-a8Y@nb)wHS%}3u59mAwF&o@zgIepWDIJ8*?&C;%m4lGx4YLEda!Aug4kt#pE41hu zj^`KUr2|eTV+n=VaM`G5Hf5nes5HV`5aC8mevhco{FN&Bza-B8Eo$p_baWZ!D6IMC zj@~n08k#?}slO3$0EFmiIOqVC`_+fbaNHHp&ypX-6B2CFsJ%1W32DL<>a9CRQZ_JD z;(x$qy9`gzX Date: Tue, 15 Jun 2021 14:54:34 +0300 Subject: [PATCH 13/14] Permission Management Module document --- docs/en/Modules/Feature-Management.md | 2 +- docs/en/Modules/Permission-Management.md | 64 +++++++++++++++++- docs/en/images/permissions-module-dialog.png | Bin 0 -> 31723 bytes .../images/permissions-module-open-dialog.png | Bin 0 -> 25747 bytes 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 docs/en/images/permissions-module-dialog.png create mode 100644 docs/en/images/permissions-module-open-dialog.png diff --git a/docs/en/Modules/Feature-Management.md b/docs/en/Modules/Feature-Management.md index 9bbf344a01..471838e5cd 100644 --- a/docs/en/Modules/Feature-Management.md +++ b/docs/en/Modules/Feature-Management.md @@ -16,7 +16,7 @@ The source code of this module can be accessed [here](https://github.com/abpfram ### Feature Management Dialog -Feature management module provides a reusable dialog to manage features related to an object. For example, the [Tenant Management Module](Tenant-Management.md) uses it to manage permissions of tenants in the Tenant Management page. +Feature management module provides a reusable dialog to manage features related to an object. For example, the [Tenant Management Module](Tenant-Management.md) uses it to manage features of tenants in the Tenant Management page. ![features-module-opening](../images/features-module-opening.png) diff --git a/docs/en/Modules/Permission-Management.md b/docs/en/Modules/Permission-Management.md index ad48b60171..05426e9b4d 100644 --- a/docs/en/Modules/Permission-Management.md +++ b/docs/en/Modules/Permission-Management.md @@ -1,5 +1,65 @@ # Permission Management Module -This module implements the `IPermissionStore` to store and manage feature values in a database. See the [Authorization document](../Authorization.md) to understand the authorization and permission systems first. +This module implements the `IPermissionStore` to store and manage permissions values in a database. -TODO \ No newline at end of file +> This document covers only the permission management module which persists permission values to a database. See the [Authorization document](../Authorization.md) to understand the authorization and permission systems. + +## How to Install + +This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. + +### The Source Code + +The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/permission-management). The source code is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it. + +## User Interface + +### Permission Management Dialog + +Permission management module provides a reusable dialog to manage permissions related to an object. For example, the [Identity Module](Identity.md) uses it to manage permissions of users and roles. The following image shows Identity Module's Role Management page: + +![permissions-module-open-dialog](../images/permissions-module-open-dialog.png) + +When you click *Actions* -> *Permissions* for a role, the permission management dialog is opened. An example screenshot from this dialog: + +![permissions-module-dialog](../images/permissions-module-dialog.png) + +In this dialog, you can grant permissions for the selected role. The tabs in the left side represents main permission groups and the right side contains the permissions defined in the selected group. + +## IPermissionManager + +`IPermissionManager` is the main service provided by this module. It is used to read and change the permission values. `IPermissionManager` is typically used by the *Feature Management Dialog*. However, you can inject it if you need to set a permission value. + +> If you just want to read/check permission values for the current user, use the `IAuthorizationService` or the `[Authorize]` attribute as explained in the [Authorization document](../Authorization.md). + +**Example: Grant permissions to roles and users using the `IPermissionManager` service** + +````csharp +public class MyService : ITransientDependency +{ + private readonly IPermissionManager _permissionManager; + + public MyService(IPermissionManager permissionManager) + { + _permissionManager = permissionManager; + } + + public async Task GrantRolePermissionDemoAsync( + string roleName, string permission) + { + await _permissionManager + .SetForRoleAsync(roleName, permission, true); + } + + public async Task GrantUserPermissionDemoAsync( + Guid userId, string roleName, string permission) + { + await _permissionManager + .SetForUserAsync(userId, permission, true); + } +} +```` + +## See Also + +* [Authorization](../Authorization.md) \ No newline at end of file diff --git a/docs/en/images/permissions-module-dialog.png b/docs/en/images/permissions-module-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..6b190484a261a17c8738d0b0860be6aa2fca55b4 GIT binary patch literal 31723 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/permissions-module-open-dialog.png b/docs/en/images/permissions-module-open-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..46631fe12614658e6ebc3904989877002c7b361e GIT binary patch literal 25747 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 Date: Tue, 15 Jun 2021 15:13:32 +0300 Subject: [PATCH 14/14] Added Permission Management Providers section. --- docs/en/Modules/Feature-Management.md | 2 +- docs/en/Modules/Permission-Management.md | 44 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/docs/en/Modules/Feature-Management.md b/docs/en/Modules/Feature-Management.md index 471838e5cd..9677e2f470 100644 --- a/docs/en/Modules/Feature-Management.md +++ b/docs/en/Modules/Feature-Management.md @@ -98,7 +98,7 @@ Configure(options => }); ```` -The order of the providers are important. Providers are executed in the reverse order. That means the `CustomSettingProvider` is executed first for this example. You can insert your provider in any order in the `Providers` list. +The order of the providers are important. Providers are executed in the reverse order. That means the `CustomFeatureProvider` is executed first for this example. You can insert your provider in any order in the `Providers` list. ## See Also diff --git a/docs/en/Modules/Permission-Management.md b/docs/en/Modules/Permission-Management.md index 05426e9b4d..ba4b34d8ed 100644 --- a/docs/en/Modules/Permission-Management.md +++ b/docs/en/Modules/Permission-Management.md @@ -60,6 +60,50 @@ public class MyService : ITransientDependency } ```` +## Permission Management Providers + +Permission Management Module is extensible, just like the [permission system](../Authorization.md). You can extend it by defining permission management providers. + +[Identity Module](Identity.md) defines the following permission management providers: + +* `UserPermissionManagementProvider`: Manages user-based permissions. +* `RolePermissionManagementProvider`: Manages role-based permissions. + +`IPermissionManager` uses these providers when you get/set permissions. You can define your own provider by implementing the `IPermissionManagementProvider` or inheriting from the `PermissionManagementProvider` base class. + +**Example:** + +````csharp +public class CustomPermissionManagementProvider : PermissionManagementProvider +{ + public override string Name => "Custom"; + + public CustomPermissionManagementProvider( + IPermissionGrantRepository permissionGrantRepository, + IGuidGenerator guidGenerator, + ICurrentTenant currentTenant) + : base( + permissionGrantRepository, + guidGenerator, + currentTenant) + { + } +} +```` + +`PermissionManagementProvider` base class makes the default implementation (using the `IPermissionGrantRepository`) for you. You can override base methods as you need. Every provider must have a unique name, which is `Custom` in this example (keep it short since it is saved to database for each feature value record). + +Once you create your provider class, you should register it using the `FeatureManagementOptions` [options class](../Options.md): + +````csharp +Configure(options => +{ + options.ManagementProviders.Add(); +}); +```` + +The order of the providers are important. Providers are executed in the reverse order. That means the `CustomPermissionManagementProvider` is executed first for this example. You can insert your provider in any order in the `Providers` list. + ## See Also * [Authorization](../Authorization.md) \ No newline at end of file