From ecdae116387302d20b8ae3f87861df1855c96342 Mon Sep 17 00:00:00 2001 From: harshabacharaju <98797377+harshabacharaju@users.noreply.github.com> Date: Thu, 16 Mar 2023 10:41:00 -0700 Subject: [PATCH] Enable addon migration (#122) * Enable addon migration * Update readme to include instructions on app registration --- .../NCEBulkMigrationTool/Models.cs | 2 ++ .../NewCommerceMigrationProvider.cs | 33 ++++++++++++++---- nce-bulk-migration-tool/Readme.md | 14 ++++++++ .../assets/images/AccountSettings.png | Bin 0 -> 43032 bytes .../images/AppAuthenticationOptions.png | Bin 0 -> 44718 bytes .../assets/images/AppRegistrations.png | Bin 0 -> 12913 bytes 6 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 nce-bulk-migration-tool/assets/images/AccountSettings.png create mode 100644 nce-bulk-migration-tool/assets/images/AppAuthenticationOptions.png create mode 100644 nce-bulk-migration-tool/assets/images/AppRegistrations.png diff --git a/nce-bulk-migration-tool/NCEBulkMigrationTool/Models.cs b/nce-bulk-migration-tool/NCEBulkMigrationTool/Models.cs index 4c0c4e7..084bc83 100644 --- a/nce-bulk-migration-tool/NCEBulkMigrationTool/Models.cs +++ b/nce-bulk-migration-tool/NCEBulkMigrationTool/Models.cs @@ -194,6 +194,8 @@ public record MigrationResult public bool AddOn { get; init; } + public string BaseSubscriptionId { get; init; } = string.Empty; + public string MigrationStatus { get; init; } = string.Empty; public bool StartedNewTermInNce { get; init; } diff --git a/nce-bulk-migration-tool/NCEBulkMigrationTool/NewCommerceMigrationProvider.cs b/nce-bulk-migration-tool/NCEBulkMigrationTool/NewCommerceMigrationProvider.cs index a7f7a17..c2a1bc4 100644 --- a/nce-bulk-migration-tool/NCEBulkMigrationTool/NewCommerceMigrationProvider.cs +++ b/nce-bulk-migration-tool/NCEBulkMigrationTool/NewCommerceMigrationProvider.cs @@ -64,7 +64,13 @@ internal class NewCommerceMigrationProvider : INewCommerceMigrationProvider var inputBaseMigrationRequests = inputMigrationRequests.Where(m => !m.AddOn && m.MigrationEligible); var inputAddOnMigrationRequests = inputMigrationRequests.Where(m => m.AddOn && m.MigrationEligible); - await Parallel.ForEachAsync(inputBaseMigrationRequests, options, async (migrationRequest, cancellationToken) => + var baseSubscriptionIds = inputMigrationRequests.Select(b => b.LegacySubscriptionId).ToList(); + + var addOnsWithoutBase = inputAddOnMigrationRequests.Where(a => !baseSubscriptionIds.Contains(a.BaseSubscriptionId)); + + var inputMigrationReadyRequests = inputBaseMigrationRequests.Union(addOnsWithoutBase); + + await Parallel.ForEachAsync(inputMigrationReadyRequests, options, async (migrationRequest, cancellationToken) => { try { @@ -135,7 +141,13 @@ internal class NewCommerceMigrationProvider : INewCommerceMigrationProvider var inputBaseMigrationRequests = inputMigrations.Where(m => !m.AddOn); var inputAddOnMigrationRequests = inputMigrations.Where(m => m.AddOn); - await Parallel.ForEachAsync(inputBaseMigrationRequests, options, async (migration, cancellationToken) => + var baseSubscriptionIds = inputBaseMigrationRequests.Select(b => b.LegacySubscriptionId).ToList(); + + var addOnsWithoutBase = inputAddOnMigrationRequests.Where(a => !baseSubscriptionIds.Contains(a.BaseSubscriptionId)); + + var inputMigrationRequests = inputBaseMigrationRequests.Union(addOnsWithoutBase); + + await Parallel.ForEachAsync(inputMigrationRequests, options, async (migration, cancellationToken) => { try { @@ -374,9 +386,12 @@ internal class NewCommerceMigrationProvider : INewCommerceMigrationProvider foreach (var addOnMigrationResponse in newCommerceMigration.AddOnMigrations) { var addOnMigrationRequest = addOnMigrationRequests.SingleOrDefault(n => n.LegacySubscriptionId.Equals(addOnMigrationResponse.CurrentSubscriptionId, StringComparison.OrdinalIgnoreCase)); - addOnMigrationResponse.Status = newCommerceMigration.Status; - addOnMigrationResponse.Id = newCommerceMigration.Id; - PrepareMigrationResult(addOnMigrationRequest, batchId, addOnMigrationResponse, newCommerceMigrationError, migrationResults); + if (addOnMigrationRequest != null) + { + addOnMigrationResponse.Status = newCommerceMigration.Status; + addOnMigrationResponse.Id = newCommerceMigration.Id; + PrepareMigrationResult(addOnMigrationRequest, batchId, addOnMigrationResponse, newCommerceMigrationError, migrationResults); + } } return migrationResults; @@ -405,6 +420,7 @@ internal class NewCommerceMigrationProvider : INewCommerceMigrationProvider LegacyProductName = migrationRequest.LegacyProductName, ExpirationDate = migrationRequest.ExpirationDate, AddOn = migrationRequest.AddOn, + BaseSubscriptionId = migrationRequest.BaseSubscriptionId, StartedNewTermInNce = migrationRequest.StartNewTermInNce, NCETermDuration = migrationRequest.Term, NCEBillingPlan = migrationRequest.BillingPlan, @@ -430,6 +446,7 @@ internal class NewCommerceMigrationProvider : INewCommerceMigrationProvider LegacyProductName = migrationRequest.LegacyProductName, ExpirationDate = migrationRequest.ExpirationDate, AddOn = migrationRequest.AddOn, + BaseSubscriptionId = migrationRequest.BaseSubscriptionId, MigrationStatus = newCommerceMigration.Status, StartedNewTermInNce = migrationRequest.StartNewTermInNce, NCETermDuration = newCommerceMigration.TermDuration, @@ -459,7 +476,7 @@ internal class NewCommerceMigrationProvider : INewCommerceMigrationProvider if (newCommerceMigrationError != null) { - result = new MigrationResult + result = migrationResult with { PartnerTenantId = migrationResult.PartnerTenantId, IndirectResellerMpnId = migrationResult.IndirectResellerMpnId, @@ -481,7 +498,7 @@ internal class NewCommerceMigrationProvider : INewCommerceMigrationProvider if (newCommerceMigration != null) { - result = new MigrationResult + result = migrationResult with { PartnerTenantId = migrationResult.PartnerTenantId, IndirectResellerMpnId = migrationResult.IndirectResellerMpnId, @@ -500,6 +517,8 @@ internal class NewCommerceMigrationProvider : INewCommerceMigrationProvider NCESubscriptionId = newCommerceMigration.NewCommerceSubscriptionId, BatchId = batchId, MigrationId = newCommerceMigration.Id, + ErrorCode = null, + ErrorReason = string.Empty, }; } diff --git a/nce-bulk-migration-tool/Readme.md b/nce-bulk-migration-tool/Readme.md index 5d99a91..318b21a 100644 --- a/nce-bulk-migration-tool/Readme.md +++ b/nce-bulk-migration-tool/Readme.md @@ -59,6 +59,20 @@ Note that steps six through nine are only for scheduled migrations. ## Prerequisites * In order to build and run the BAM tool, .NET 6.0 SDK is required. * AAD AppId that is onboarded to access Partner Center Apis. The batch migration (BAM) tool is not configured for multitenant apps. When registering the App please use single tenant app. +* Follow the below steps to create an app if not already exists. + 1. Login to Partner Center and navigate to Account Settings. + 2. Select App Management and then select “Native App” tab. + 3. Select “Add new native app” option to onboard / create a new AAD App. + ![Partner Center App Management](assets/images/AccountSettings.png "Partner Center App Management") + 4. Take note of the newly created App ID. + 5. Login to Azure Portal and navigate to Active Directory. + 6. Select “App Registrations” and then select “All Applications” and search for the App ID created in step 3. + ![AppRegistrations](assets/images/AppRegistrations.png "AppRegistrations") + 7. Select the App from the list and then “Authentication” + 8. Under “Redirect URIs” ensure the first entry is checked and add a new entry for http://localhost + ![App Authentication](assets/images/AppAuthenticationOptions.png "App Authentication") + 9. Click “Save”. + ## Step-by-step flow of migrating a batch diff --git a/nce-bulk-migration-tool/assets/images/AccountSettings.png b/nce-bulk-migration-tool/assets/images/AccountSettings.png new file mode 100644 index 0000000000000000000000000000000000000000..4c778ce369ca3dfa66d3337d3e86ad9670a086c1 GIT binary patch literal 43032 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 pKZ~x;=hFN1*Iwixwe03=ZuR6O-=}8 zSvckyGuiVAjfO2q2gwgtVx@VeYMVXRhl(b#M3Ob;DEHd%XQdRlHbs~222QAT__1V7 z#VA%`U&lj5Ps8+7xqa`({6*xSoHzoKHd`s!rDReZjisK#!DNni%6y1TX#0T?U&qI~ zZ%yL{Q4E{LFR}ThQt5`kImi585Hs&!!7{t_uPQdMGVV@$6dnHRbtMUU=g%`*f=fSP z7}-$mJ)y>Wf$0_Ck2py%mU8t0mOWOl`7VoBo!@PjZ~nue!NbGw7MAb*FzD%s8Z9Lr zAS89)uV>`MPhuSGqhkFI1YUda9V~@8Kr8^U?-zEWW{0K-;g$8TMQ6u+l$EcQ^#d^z z6=Z@jg4Erh2f59(bE}*7M0857U(w^&l2iYP6M1t;ypj+&)|Q`Le8vzk87NH;>Qse% z({UKqO64_$(yUFfXq96WKYgrzoxEWTS(0C;Fso9%(!l5#LUO!=IgySzdIEcaH>V@k z{u9ja#3L5uWj}msE`PzVLGJ=L-mwTrkKx`Bve1E1Uyfsa(HC*qG(KL4;6m2C0Q~SU zj6z=bI8PWxZ53uMLzw0iMy+p3*geOiMnyNmUOGL;Yb--ihg-LNgh0y4^S?ISfol*R zPdKC*?qPwhNRzU%R0rye!?WFhviYeVSoI!(aN@^9HIMSocRf5gnEoWI`|rOksGypq zSAiJZVcP#NNEJh7wpTd%R~}BvWd~>s2C7*;*>La_|10P*KO8LVec-pf^4@EZ=R#SC z5}YJ|%vZ>m6!x^t*7rVa@sZkEVCh(_X&Dbse+zy)TA#L6nUw)RaMefDw0L=hME>9T z+y9^V<^Nh${onoB`aiSB|6lIj?Lw68k;Uye&AD8v&^O0|uCUZ^4D`_WjyIBhZ?AxJy+MP)dbEd)9E2)ViPztC=f5~_h6!0)u(VedQDY3I z_5D2&u77knXaBNV-tv{KCvJzUYRPTp4~)y;;gz;RJ?omYLkCeNa_309@0X=Idn5jV zCMvd7W{LO`QXA&Y4FXAJUkZsoSz+*UmL+sSCDMVNd!LI!R%;}%-!EQxBrMcxTUkF> z_E6rl@eo@n6Yse8mG5RpPC_L}7`h7P6B%T-rkeN!a=QA{}|6Pgm2pz}aXN#0}5SiiY2bzw@B*!px zcrxRQVRNuDq3qn1SBuW^!Xz4f=AP;fDT>kO+z^WG7{yy}xkA~KHL75+-;r@dPI^AP z(oL7tAG7Lt&?O@E+M}-E3oMO%Ub-GC*%W$iMT=uJzRv4!iqRq60PhGVeP2imgOB24VYODgtdlUhxz94h_Y z=;^9OotksRhTbTtv>G@*B$ZHzMiIxKGU{{w{jkGGH*MR)y%6!%N3+*)50mY|NQP=w zsN~92z}^lY1zh;)>KVPOPki2N?{{j1@|B75aG#b<^1qtF%UB!ct=D1UPxi#=i#Pd85>&V`WCjX2dN1KKBkO6;kwQS8D zYzBjOwP!Nbs}Q;A$fls*A-y?=SaJYPO__EICq`06LxLr>8sxygtuY}UE=^p*RM>YY z0fqz9u+F)Fn8;d=$NTs*eCJYRciUUwL`(MH0nTbAxZO3YOL36_GW2#iez3GGhuddF z_J6H?vCG!%cLtYOc3)N!G3Y}sQ8>+%x#)9T&nlaDKd=;A`F$S82R^6jOp#!<(6V(K zxt6@6k`~x_UlM-obGoY2-WOfkD&3Bd6Phnvzw(aPFGA*yfo}ND-*`7eyk081ukoB@ ze>&_AC^~MN3vGIX<)bR*sFEJx^jj3W@0->`q=qlT|LjT%d*Gxn&qQS#AbX{%(hawp zly_qu)|IO=Zp&x#KjXcGz&mWuBe$q4AqFl)t)9*8(d+eJjT62s05XN#&@4c0QSrFQ z2QEL{p9eg2`K|#-C;T&;nkex-l(z1>MF?KL@RI^yf)hS-)g=VGoxb46Qm;IVoL&=_ z?4iP23*}ZU32wp3KpnaQwKC<}q8046>u2K56vMr={cTCuHHe2{~k;c&>;NRn$e%V03r zXJB`|wS#4I(cUpgpqvMML^(Z`zIB7ZU8>{?fq?O1&0Z*>iWguKCz3b&d#^9T{twFD zGAfSl?bi(MuEE{iT^pC+G)|+9y9a_bjk~+My9aj?+}#~QkOV@W!}EXVJu~a9Su^K+ z-Bll|YOUH;`?|0Dw{H+|qR9J$h*5q+Iz*E}Snaa{rSiV8C)ZBDp0viVfgStzp^ED36A$5{rKVIh8tb`#;rj7c>7hT;va$qD z{uV?#i{Wh!n$9pi{AEQGD^aJ{SycdYD~K8Y48@B2PpZS;P55_2{r?r`@ZTT3_bS*` zi@Vs55xh@geIEW)QS!6_Llrf?2T_dqzTIEm2mbvix{4A1i=h7x;vzo3LvYHIwrqhW zC$EZ*&-jt%0Uj6(8PBqRaJ_K%%`f2U(SLx^C*NLAzg?XD{I#PG+*4$GDf+_yDmyBT zyF-q2g-KLAIh=gMh!@GI&Hva%b{DZe-h4YMA*N31-CLC)$V)ad)VO{X$?%k!`coEY(6=#s&}835=osJCSzNEQ#)(qsd9@DO)NxokYOjns=F_q zX3uRv`Y9Wxrh*fH7-l_rc)!xEdGExRxfhVi)$aMF=#xSP{ZnY8f!%NQpLA#b-lbnpgCfJ=w{+sS2lf>_vrJxZ zEPu|s2EPoWLKjiKFn!)_A}?tUq{1~JtsGjPCerXMA$F2=IInYo`Z<$_U||>V?eEHa z$Wbd#-D{Xu3~(fEhwXV~HC}zj;w~HZHvW9$=E+fkZem6~c(Ae^#(Uxh@|aX-?~Gag z{rIrrqp&6(rES|Vc+u0bDk1FpkwL?B^F!b%mG^=fmTjYRY>Cf2{OSrD$>qfylkU)! zc&;Nc&5l#+x#xRh+(7MU!doH%Nf~-}J7y=W#DnMKfcw$mH|h!)R0w+Ab)YL{7vTX+ zODIDHLVh~KbrD=9@} zQ;xFspwP186&WYAlR>krRKPOO#(N=TM@C|+WNiph-;KK7rbQ5s1T~u_5LV%9c~OcD zVn1xy@G0?Un(~)ni2&FRwD3XxOw}30UsABc95Py=&d$zO8 z0nK9K?ci|A$rsWYmIPv&%pYkF1Z9d>h7O+03so>6^#t-hAGF0yfUT72yf|pZ`t0&C z-pW89k_@U8LD^kN2r|y>#%IdxoMU1WK66fUg#d@@2EwbLPN$kBqFJyeOOw51?B2^y z0L`9MhbdIRn)iO1q_N#8Se-o#SU*-h9CI9{r|L+lE(N_SX)}uXkhDCNNpWn!FJq<7 z{q=nA?-LC$i#()OF7~87Xe2836lqga_R+(4?_()ZoF_V3;35goyaQfP-K=(+nj*?lr=DqRL;*$ zSU%%gG2B=~)Amx-=x$0jfwrQHlHm|me*E8UNtLPwT~`fyhmK}o9KEk?D61o zii{e1WcaYTj!AAi*U~ug?J*cQlH)usQX&mjT3=5@S@MK%!ORF{eX>) z6g@04ZL*US>438pWskau`Z}`G?)D%q)>8`duQy;G`M};1iJtsYXQFmk(j*M{CF3lT z*pttolFvSt6N5;2wd={$^m~0NZMtwlqjPWwlW~%0^Dqu#LR&*CBFu-I<2+ ze61xN38RG`$a9h|d`cMkT8bepWwrvvUDCUvp}d2fcz%k@x&p4xVTmx%g*L2!(OaN= zj<-eqiCT7-q0MawwyK_#cGwB5XE#aF#uvqvqiA7MiYAhVPSX|JODkE9w4ouLLhevh zRuoVBq|mOq6E@uq~aJm%>l`p!_emUbfK za4pgw*HdR*gcfbFcQJg-J>OhSKCJI3I>4E7q<`kZHMwCPtn#o`V%7usg763r#g5t_ zod&?T<1EwM8Ft!rXZhLVO=95oVB)*u^5~CV<1k-%rqIxfTE-7xvR>DCPAKf8%0aBd z2^b1SlK~uc`q9aZ-i%?_8_$Hiw-hYcW3!?CAVpM*!Bkph{P4vf+_sbO{X_iyUooen3}E zgr$G1TrO0i8E#(2C>Te{*_MlDkHpb3#??Z(#$)EsK;I}zRB5!rqCGQKOG~=vzX?~O zubwZ}nlrZt81VYhAJG`G3&6|Z5U0y?i%Fopts&rq*VANKTuZ~XCFu`*)^&$RX3X~~JXB)EF zHtRXHkC6M9*p|e{*~JBz&(2Vd2I98Ou`4QORusZmLLvR}s=QZj?#-~Lb@u(NCzIOR5uZ zD}Hci6+Vj-D_ym~4ClAv?(&ayfL`3U51~MW7pgMJcV+&c8Z?bgi<$JB?DZL_NwRoBtf?E$Tu>3*hi&VCLv4@BmFF+- zZ^;>l90U;Ok=sVZB~gsKjZ)Y14f!waQs2=t${E|_@-<(#&^n%rSh^fSc0t&#Bd7Ull+~@Z{opQYBdS`d?w4rXddc3-@lDSKx zeX24W6N+GGD^%W+w==tpeQz&u?~>X(I-8YoYA5pY>uca+ikiq|9o=Z@`B`wB{ORB~ zhAKvq59EA6riMm0^tcypHdXJW%VmXn{g;0IA*CZGsDlsEd-dl?dAp3eNn#z9U#%9M zx&XS>XFAbSZZ5!=k$?aRPcO*$N2lV(Sb8~E0H+YKdSm@BDQ*p+n$#5y{wMY z11`CtI+6&BV{90?dbPE)(zU9PbyIT9Vq5m(He^8Ain&|hM>ts%a4kDT^^WJmIBM02 zX*pohiL9)<#UHZJk^ASevgF=CO}^Eeeb7EX)X_D|8(^1gA7)rKG@^%$l&_|xwwP&l zHZ)OAPHJiY;LLTrClzCeSyzu2gSn!|p%|sH9{iL7OhQ%WQ^e~6Xk6xKi_qZF?5?Ed z?6Noywh9NDc?P1loxjfq1^F~Y`a2%~xE@Mk{kp!KOUg)U|A6bk7ZUd@wJaL*gBn8~ zV&s5x=HIHJ^;JDPOYLf5%`PG%58qAWt;{^RQojfu%{X8$Qz5RjpuM!vKGo9R4+quS zJ~l2#KI*uPB;9pj;v(RC{RMx#?7U>uN1EH%*_KO3&cwBBLA28~ zfs-N;ivZNJ_lEQ7-@(eBjT9yxIYaI<4k1jUq|3VeO!c+HLqquXqFUr4%F6Y|%h05F z|JWokOwto@IeFM9Uwn44ySqN$-HWl6r@JF%7yrlR?1a|zGRt>|reZS4(Fe;nVcNla#){3T*fI;@S=2M8O9 zeCahV`U5E@xmt5#n(cxNcAA9E<2Am!#AsZ#m`c_M3?AmPVQ-&ckCHsI7*~T?bkrncn1=8d|ShusoSg zXXR0?@k_?qG4KxRl({DeOlO9;Bzw~_JUk!b#D+4p+pp&NsZb0Nji_MYwMTwUFe zxMe@BwkjUO-T)n&3ncfDGG&6U8im+!9rIuYA*f%PP7OTarw^CfaHTS30DD>>eK9Lb zjT90_@!u+4p$@$w>JB}b-?ba@J4CVOxm$oNRhiYZ(8YAUAdiX1nvY37OgFm9f zqG5)^1DB`|mvAK{^`ekGo8htjgI9OMNgO7i&&K^9{?M21XVd5JcsWbyZz{|(%J6w- z&Z{!T8k#u@jq)jxkxK>HBMQ641elvV**TY$xAaWZMmWy(0Fyb-YMjC`SA%qfR|je% zL%L&$`G%5ry?F$R6E)7QfG1zqnZ>XJ(mENUN61WPEYypxa+)A*={7eeE<#a4%k_%+SHJ5n6QSC*hf#YIXl=-pjan=)U^8q2jGa?c(|A+*=LN8)0_SLg zd_A3NMdRlaM3F;q^?USh{;kva_8<)Tmm?H^nr#0ALiG$u#aH6brlMPaxp2>4y(Sgm zf6U;Wyoo!y)LTrqr{rrs%IPCm6 zBA699++rCv?bEsY)w1Fci!vU$P-4w%!~B!vs6^pspGkraL$JRh$@qTl*HIBg@7IgZSWIldzYP1~Ajk8@CVm zY=|vt`*@%E&q*Y{f6Mc>z`hdaZAW&_zT*v)BP!}|E*pxX1XM{t1Jh!g1gsxL#hwp8 z1i*g%lIT1PfcIvxJW<2;{w}^pZ_&MY!^fdyzV6e@7lBvBtzyYaSRoeP=d)=x(E-=; z2p00X(1x0H&bs4I`exQUgq}_qiPY}$cqcXe=5oV@JM0oQ*g=}Xl)#R1?d(2i;5J4HH(s(3B+p_>m2gMs0gx=a?fWQ{XNgSg1@mX=0Bvk zh41_Mh~CbyNq5`FSlVwx0arOmuZm-|o;RXtF^|?4xd684wVfpY1((c={7CMc z&#rxIUh9IY+JXM1#xw0h0ijNmSK|TEcZ6wqFPhw#(1ji^>O?O#=S_jztzZejDDe8euAN1 zU^pxkCuzZ{7Iesgk2BCSOQ)>)!qd)Z{7)kphy|(T#}d#waIiCe^hIQfSBAohGfO~{ zio&A(ONH@!u{b97{4Is)l59~1EBdEPVP_|fgH4B&09zSy6iX|Se5%&Kp&FjChA%Te z3Cb?D?i0Cm~52KA?4nx<=l>@8i0@aQUj^l3>zOljmE{PY^uG;1!V3-*yE%0dc;@PA13= z4_&=MqdziZYPULKnFum21YP(83l6YpR5&HShKiFEUXff0s-B*uvY%0q4J~ymfhkui z0$RVUwuUFo2kn>i`>5T_aD@L<64EHR@v9@IAP${9E^+^Llj;y42wz~0a$JT`S(!d? zc84mE)Lf+_3aQFxYw#75x2&U_WufO=K#T+&%jBrm8C2C*34q{fQVYhcXI#eLy_8-M zNr?)arz10>jUe;w+4kG7_P@Wt+L@8|tIeS=7w(Z$G1S$m1Me{##q|nGd1T)9({+B$ zYL-(1yq0^7>Tj;l1LQS9Za%SSax>uBC37EcSy>uar*{+2Qv4qygtL4gzQmTJ0fmC5 zw8X|Zkz!(#60a_1g5Ss4V+1B5hbBC#oQi%h+awgQ3FngdC>pgmLp>%?zVbB&=9&dhPe;yRLATLk z>?m~g?+ZzRr9-d#e58%t7E*~UxU>+99UwMI9EMK9ILhIeh;fgV>(U3-K%S$MD6W>y z$f$j88U~iu%?N~UL^L~6%*ICSsy~_bALn%T4D(0=_$(0;C{BHbo7+%QMyY3XU^a1g z{+zESYD-G-Z^`~lqlsk$;&>XI<;wB&BkR2^PxR>_{j7(x8Adeb;9Sm`NU_P^CU3Yq zzAXDKyp~5nvcybd?Y1g7X6^d}LNqVw0N_!E8$B)isUI%F(`?ImY}m2V*bBl%rd!Nc zvOk5a@cenhYXEJ}+8ic~4IJ`WJ}J9Muk#1950_&**mQr2hP5V|8B^Pz-Z6a@Nngd# zSlN*ev}GBYUQuKZ`Za-;*#Zd$elW^G^sKbk+>(e66X#4PIyEozjuOex&~?K|aq#{H zUN9nAq;AlJvfF>jfGYB8b2e9L44@s}!>*{Rll^LU>nX>T{prAEcm-gRc66#W_iCpU zw&k?g=#255P+Bz@XrHAf_A6JXzG(0rh!8aMgV*P8apia_Y*da2(GzB|_mcTVxX6_D z&wNIcjgOQ}SZA9H@-jjhu^GKP!{gLFD5bWZAKTBNxRyart^LjX>4Bm=Uy@5#hoE`)14i`VjU7)$W?e{In@GgP=q^Q7bGh(=#`{!uMw5bC7e-{Aa_xo-6fA~@KONdR zIgzK3&vvHihfokUYHr3=h3HLq(w?p2%P!|Nt5M?M=Lqq7RaZ_9r#m2B7}@^VfH=4& zPw>SuY3Os7H95%+Tn@c#@T4=mCYk^dYo;R*vrD@p5HacFwVP9zM7SfEag#5X3s07aqO7WgXb?k)e?Z)bVc@c8Y?w+e) z8-9!tbjxdJjUWVN-^zOV;W(#k01eG#{r=J)rSgGdM&lE%rBcnpqh?K{-Fc7k=yaLb zS>;gp6&+5|BlwOxy{VB_zvqYeo0Hr(r~LX6HNCcF3hkEh^v$iuxBa#|aMl|#l^1O5 z0DDkvjKAP0(cT;Xw17BMpUt({FnoP=S!t(JTvCQF8Fc3L@Cl>HL>tKh-u zR;fkvO9wu^+$d9(-k@}~M}p2-kQI_)7U7|+IG^H!jw5HZvze5-=EwT2-Y7qw{EK_C z+&;By*F%<#3O$65u%w`YRw-T(O8rt&wNKOFulYo9sPRLP5(S4@kJ5D@d35|owuGv? zv9wF5m+_et6c~9`t{3M8`>;djm; zkQHc)s9Mo#{p5lQO1`{M2DN7vRk4r988X}0D9mec;ugz)J6EB;%)+l9b~XtY$Mj?# z?F_sm(RtIxK7IcW7j7di@0SRClkX1X<7<2}H~LuA92tJM!?uK8gBMe_+mKS!T1#f_ zrJT8K3hynTX}TLMr+_?MJtTT;?_3S=F%su6kw8*A{gC9Hs@R5CyxGN6r8!_(`vK<+b7NGOsiNI!;dxjpU;1N`{QPx|kUlWFDM$+p zIR;nPjV4b*OQF4VD+y^Bz((Jo8#)%cY%s9$6vmD`La~$WVF?%NX>J|+($I?Tbgz7| zo9Z-W$Y{RK&_HccvDnpN{*&iZ=v7@8{I@>h?#miYQ`0Dss_axY=IuIWK71nCZ3&dk zG4u;mdhOT3`;lnM2dUPqZM1%LS5MN(jzZ>!;l0(coKY0mJin!tJ+(5R`lgaFnkA@u30S0n zXbk$LkR{|{IPwXn8!KTcqd7%5me9d;GO+yWzQKEzY8L#lFwuJwAuObeNRxT7Fg11J zUOg3miy{sUiDeSo23ULcmT4|l12^mYaJ-nfl(w%WorZ1D8fPs3-CeR;d4pSWHKg2) zHdk9&%>6+qJI$-47UnS2{s-~6rjc3HHHLddv`djl2aZRL9x>r7IdIB87EqQ(*y z?S+|)lh?U0}pss#!YH)Mg6yWOUG0x5@ z0D;!je0`of^&k7lmA8bRd34CPD;;Yiq`@^5snI=?p0J66+PlQtr844;vCkzcv}5b< z?uoe#UdeS^W$kKVM;*+1hswlby+ToO!IVkljR9QJGGVHk-^BD+lq{{Vp#}G|o{jk> z4NQSlq8`?w^K&@`O9B>pr?tl`i`c97y(u~T^k)mZXq_`QX31=;XirN|dDzD#30?-R zr6&XX8m-Qf*EO>1aunV0`FV+>+yFv?rSI?8P~0H#`gj?6_uEXchB)kmCM)fwLgKkL2eWp3h7sg}0y9;zW zDp9=(vPl#pH)tV?*T9_*Ml-1v!B2r@t9O*HP^OEuyXv7ziqiOmr?nd@Td6H4M=>L@ z0?%41fwo^fX_}s)(9V}2?L=Ok6M$0|y>!!3TT-hg21CL)Y`)5ZyP2U-&* zhB8qBQRq~t$DIAf-Ai3DRxtpJtCZ%DESDf2E&D{n_cv;C$&t7?F%u_gZ zpR|==djti|eEX!XP{pfVgoca)MtX)BOrVcsu93<_QM_p*0z3hs$_V$aX&fm+8jvcj zS*S;mr;mV$!x$p79leghE0W_<`ty>0wU(TBkz}iKajYqsHdwnPrkX(~MWyD=$#zYKzzFm=aWpNDzI`9eoo6FUmTQ$0;Hcbw6C zJsNl(ZzW!iK3|+SkIOaVodL1qZ6<9C=URe_pHq`Jos_@6{X5BLWS{LvBv^(h8;o8 zC8DZlrG}nXJgaT~FfWk{(vXCTyd@30JR9Wj<+t@gcT}w8^shOx5O~IG4 zhmiKF_ zt_G&(altmBzIPmmy83*!X{eagZVvK7czUGYswV_R{n7slk^!ffBU7u7) zTMIiFr6#!G3tOw;K776!u<0nwcu^E>3=LYJ6>T?Q*DNtIiM#O3Q#a{FXH{#~9EZiR z$8-!(ik-?Sx}q3!?IB)X7O8FENK}yw`ID=~R?k+_)JoiENsFBp*$8eO?raWTX19N) zf1zLf+ExXtc7fTv&+?#Ji(Rx@Vyf<)QhWaOlIL&f&gyQu-juGWg(;)g1z(c}yLk|V@v;sDk_-bx zFLazTX;*!{HW9J9J|7OVBKvkwv2x1!d6BoP+Qh2H56Ud~bB@&Glx8g?P}kxAUS9|6 zoZ+A&aFt|~P&FX;9kQ+g$p|SDOYe;$Tzt^j)6#$)!rZ%My_cP3YIroIH*3R`1;fEj zNkP6t-1h^u8hreNV6S5Rb*5Ca&Baf7ml5(>koqR28Ffrr;sj7}1qLl1V)9Q-$8V2? zy<9|I8>ajFGLGNF2IDy#MIy5&XCD%Wh%c`I&g*JN1O$cZ3(;0)Rcw( z6fM2+xw~a9$kRx*?DORYJ!xFrJpFCN?ZI*|CJwGGiqP?8*JFd}oQ+9Tx{Sh)=5Dhe zt_L9!l+LM)vH%w}@w2AI_(jq5xlk{Mn5L$t<^UJYW8krS4Ww$;siIV$;nqGBUEPn$ zQzKk!VRsuVil9|IVWK1vW4s%$7O2J*D9YLmUANetk6)$Ho==1FLQ~%)*1t-<)9