From 909855de1551dbcd045c584c896950c233b415ed Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Sat, 20 Jun 2026 10:15:53 -0400 Subject: [PATCH 01/12] Fail GBTest run when no tests execute instead of reporting a false pass When AssemblyInitialize throws (e.g. the test web app never becomes reachable), MSTest skips AssemblyCleanup, so no FINAL_SUMMARY line is written and GBTest read total=0. The pass percentage then defaulted to 100, reporting a green run even though zero tests ran. Treat a missing summary / total=0 as a failure, and treat a cancelled run as a failure as well. Rebuilt GBTest.dll for all platforms. Co-Authored-By: Claude Opus 4.8 --- build-tools/build-scripts/GBTest.cs | 66 +++++++++++------- build-tools/linux-x64/GBTest | Bin 78256 -> 78256 bytes build-tools/linux-x64/GBTest.dll | Bin 17408 -> 18432 bytes .../linux-x64/GBTest.runtimeconfig.json | 4 +- build-tools/linux-x64/Utilities.dll | Bin 26624 -> 26624 bytes build-tools/osx-arm64/GBTest | Bin 123944 -> 124712 bytes build-tools/osx-arm64/GBTest.dll | Bin 17408 -> 18432 bytes .../osx-arm64/GBTest.runtimeconfig.json | 4 +- build-tools/osx-arm64/Utilities.dll | Bin 26624 -> 26624 bytes build-tools/win-x64/GBTest.dll | Bin 17408 -> 18432 bytes build-tools/win-x64/GBTest.exe | Bin 162304 -> 162304 bytes build-tools/win-x64/GBTest.runtimeconfig.json | 4 +- build-tools/win-x64/Utilities.dll | Bin 26624 -> 26624 bytes 13 files changed, 48 insertions(+), 30 deletions(-) diff --git a/build-tools/build-scripts/GBTest.cs b/build-tools/build-scripts/GBTest.cs index 32fd6cce7..0b8451d96 100644 --- a/build-tools/build-scripts/GBTest.cs +++ b/build-tools/build-scripts/GBTest.cs @@ -162,14 +162,11 @@ await RunDotnetCommandWithOutputAsync(testProjectDir, "run", buildArgs, environm double passedPercentage = (double)progress.Passed / ran * 100; Console.WriteLine($"PASSED TESTS: {progress.Passed} / {ran} TESTS RAN ({passedPercentage:F2}%)."); Console.WriteLine($"FAILED: {progress.Failed} / SKIPPED: {progress.Skipped}"); - - if (passedPercentage < percentage) - { - Console.WriteLine($"TEST RUN FAILED: Passed percentage {passedPercentage:F2}% is below the required { - percentage}%."); - failed = true; - } } + + // A cancelled run never completed, so it can never be reported as a pass. + Console.WriteLine("TEST RUN FAILED: Test run was cancelled before completion."); + failed = true; } else { @@ -178,35 +175,56 @@ await RunDotnetCommandWithOutputAsync(testProjectDir, "run", buildArgs, environm Regex finalCountRegex = new(@"^.*FINAL_SUMMARY: PASSED TESTS: (?\d+) / (?\d+)\s*$"); + bool summaryFound = false; int total = 0; int passed = 0; - foreach (string line in await File.ReadAllLinesAsync(testOutputLogPath)) + + if (File.Exists(testOutputLogPath)) { - if (line.Contains("FINAL_SUMMARY")) + foreach (string line in await File.ReadAllLinesAsync(testOutputLogPath)) { - string content = line.Substring(38); // 38 is the timestamp plus FINAL_SUMMARY: - - if (finalCountRegex.Match(line) is { Success: true } match) - { - total = int.Parse(match.Groups["total"].Value); - passed = int.Parse(match.Groups["passed"].Value); - } - else + if (line.Contains("FINAL_SUMMARY")) { - Console.WriteLine(content); + string content = line.Substring(38); // 38 is the timestamp plus FINAL_SUMMARY: + + if (finalCountRegex.Match(line) is { Success: true } match) + { + total = int.Parse(match.Groups["total"].Value); + passed = int.Parse(match.Groups["passed"].Value); + summaryFound = true; + } + else + { + Console.WriteLine(content); + } } } } - double passedPercentage = total > 0 ? (double)passed / total * 100 : 100; - Console.WriteLine($"PASSED TESTS: {passed} / {total} TESTS PASSED ({passedPercentage:F2}%)."); - - if (passedPercentage < percentage) + if (!summaryFound || total == 0) { - Console.WriteLine($"TEST RUN FAILED: Passed percentage {passedPercentage - :F2}% is below the required {percentage}%."); + // No completed-test summary was produced. This happens when the run aborts before any + // test executes - e.g. AssemblyInitialize throws because the test web app never became + // reachable, so AssemblyCleanup (which writes the FINAL_SUMMARY) never runs. Previously + // this was reported as 100% passing because the percentage defaulted to 100 when total + // was 0, masking a hard failure as a green run. + Console.WriteLine("TEST RUN FAILED: No completed test results were recorded. The test run " + + "aborted before any tests ran (for example, AssemblyInitialize failed or the test web " + + "app was not reachable). Review the log output above for the root cause."); failed = true; } + else + { + double passedPercentage = (double)passed / total * 100; + Console.WriteLine($"PASSED TESTS: {passed} / {total} TESTS PASSED ({passedPercentage:F2}%)."); + + if (passedPercentage < percentage) + { + Console.WriteLine($"TEST RUN FAILED: Passed percentage {passedPercentage + :F2}% is below the required {percentage}%."); + failed = true; + } + } } if (failed) diff --git a/build-tools/linux-x64/GBTest b/build-tools/linux-x64/GBTest index 8f68d49a44a204714ffa2ea5b93fef21e3c7cd9c..b49deac07027edaab3f8d61cbb078b625699cdc8 100755 GIT binary patch delta 899 zcmZXReN2;A6vq49w(l4^Wik-oVMj>EM-=GW7E57FlrY({4RvO?O(4*Mz%+)@YBo2u zBNfpAfy>gRkO5=qrWvE;;DEp;Rs+)*MfL$%reW){pmRjzBQbt-FaBjPIl1TFJm;L> zb8@|Yl~<1S%IC_}cBAoJPDJZ9_k-MJqsv}iA>?rfi*QZGLq)rkJ>k&uXT<_^QiZ4q z7bIPxF40VNx^X4#G1etw6Teqfz;Kp!Sz;KncvbO3^w6gzPYX=ZL$!NGRI8uz1_IL1 z)Qm=<$Ubp8C=du_*QPTsf4@S51b)22A3puvql$^Ok5}BFst+=OOEgkhs)UDh2WEjT z(tg+u`8E8}9Tm3n{=>QKU>mJE5(fOu;~W}n<6Gp@!%G~RnCjL*V2YX)3TyTW)r)Zo zd3;*d=t}1gkZ-l=rHgV?6Tj?;AfIDgiQl=~xdnOjmvbeDOjP&<0aX;%Rs-Cn*7gQqH%T2yN|<<|M?@t5 z*dsEz?Q@TV;Sh-@KLg^p_f)jJ(a)zORT{U+mNIug;n=z8y*AypC~KF>_HtQzhcb&p*wGyqF>r7ZR2dGh|{K zfZo8d>U+Da8H^Z+~Ff0E? z7u}dE2l{BoLX?0rWWWDy5ca#G)p!%Ju8PGp;TlroRn)nH1!&;!jTi8ZfZ^V;<)|0a z%=!(9dXpp>qB1h~?cG~uON}z?Buk;$DCvzUM#*3?nNtjUtG>iqWHsr`)JHCxMoCTeC>@#(Eq!vU84X1 delta 899 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 M8yY>>gC$+_{{q2{MgRZ+ delta 7642 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 literal 26624 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 NI7a#3>;FFs{3l)AfMNgu diff --git a/build-tools/osx-arm64/GBTest b/build-tools/osx-arm64/GBTest index 67b0b835c8e54695866ae14f09d4e7836f5bb4ac..e3670f8fb7b6e8b31c4e4bb5fd9c411012f8f6f1 100755 GIT binary patch literal 124712 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�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 N#s)_ZbYn?Z{y)%jj%WY? delta 7642 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 diff --git a/build-tools/osx-arm64/GBTest.runtimeconfig.json b/build-tools/osx-arm64/GBTest.runtimeconfig.json index c0db3c7b0..1cf2450bf 100644 --- a/build-tools/osx-arm64/GBTest.runtimeconfig.json +++ b/build-tools/osx-arm64/GBTest.runtimeconfig.json @@ -12,8 +12,8 @@ } }, "configProperties": { - "EntryPointFilePath": "/Users/timpurdum/repos/GeoBlazor/GeoBlazor.Pro/GeoBlazor/build-tools/build-scripts/GBTest.cs", - "EntryPointFileDirectoryPath": "/Users/timpurdum/repos/GeoBlazor/GeoBlazor.Pro/GeoBlazor/build-tools/build-scripts", + "EntryPointFilePath": "D:\\dymaptic.GeoBlazor.CodeGen\\GeoBlazor.Pro\\GeoBlazor\\build-tools\\build-scripts\\GBTest.cs", + "EntryPointFileDirectoryPath": "D:\\dymaptic.GeoBlazor.CodeGen\\GeoBlazor.Pro\\GeoBlazor\\build-tools\\build-scripts", "Microsoft.Extensions.DependencyInjection.VerifyOpenGenericServiceTrimmability": true, "System.ComponentModel.DefaultValueAttribute.IsSupported": false, "System.ComponentModel.Design.IDesignerHost.IsSupported": false, diff --git a/build-tools/osx-arm64/Utilities.dll b/build-tools/osx-arm64/Utilities.dll index 302f41cf771691bf00412b86848cd7c7a8c83650..faf2d8902838c75d3266257e0569d77fd1fc4fd0 100644 GIT binary patch literal 26624 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 literal 26624 zcmeHv3wRvWb^n>!+1ZCyEA6hddKpW`7A%r1%kl#R#(|LaRMonkcKoQp#%q$CWR&`$-kwElLq&9&dg|6 zvh1Y)@9X#V`~Dq!&fIhEx#ymH?z#7#duLYbKJXE85s`-b)G4Ab;>p)afoBKf$PU&% z6{N>~FVFd+vi9XUoA)NObwg%mz>E*p^~clcOs;OXQD+XP>yqiZ&JDeFgPDZUTwLs* zXN%t0MYL9N(cq!Szv0yOCY@VXq_hxS1&VG_Hyy;Y4)-{2qEbn#mflQY{pETV5Ols= zbk&W_%K!6E8)Xt-kh_7O<3vMji0Rk8L;=wL;{eg->3L_v>xjGs`Ci~_3h?Hfu|EfV z`v(D#CvCO$1}0Y>sLf{9><1>gjU&Mg-Hp58T8ZvzHjPvUjI1l&i<@Qb!Ci2zBwAH~ zN^&vV6&LHKlAG!-A^Jf(ks{RpI=EPkEhF-)uCYt;XlPYO`I%kLh`*x2A8qif4eMPN z`DPzcjh0!#nOj{=dUhpJ*B9h9RA-@!|9UQ2;UG5cgE2J5Z!xX>rrjb~mW8PHwS@ zz8Mtl`52ZdT0`IG@FuB-$^_3>eyRW{={QiXXikh zaX6*cK-{MLrnTwIDDnri39j;c+O$+Tdz-8#RGp~_T-;W@%29nTtL_rjp}R_OW*#3Q zvlGlQ%pU$C&+xgRHTgUb@YCPuIk*wzMnxazzL8!LO6&@d$K8%BjancGRtd#osKj4F zu}xse^oq>N?Jh}e4>W3CeMi8nxBNPWNys13!@7BZE8haF*e6^OP515yX*()*MBK5h zpx4B<0oInpw&M|UM;Bfm_Ec8Kb^r@|)EFvm413I5SjP*ULS0-@*jrg;N%Yzhy#*4zwnXnViC#<6Rgk1ZW6zE%h^npgRBo4QeR=k{ zQ)6s5r?^=H8X_$&x)uF^Zn14AmT|@U!BSLPENzcU)5BVAS*4|&3MIVW_?a05^y}tv)R0Ld-GpAw;Mt&?KLgGDzucxF5MtLdm19CZP9)=^Wby$lM8n z->cJcHWUTr1%o!-NEmpgvYFiSn^Jc^Gn zSj8smt(HRSSdBbgW9P_I8=EE1^06v;9py#OUVnHzx15|g#s$hpT#bSDudS$+9)I)A< zd&G^Iwe>x3e$EPMu@6H^Gjrc-V)fjG8 zVp?0hje%Mp+Uc*ws?ey_1}B?4yRgxyNu=}gmTz^$uh~*}gseq}TULaY6`^HCp(3;_ zK3ch1Re& zwh%*PoSh)n$|<%}!?~&}h92@`o_Es+U>?4*e+o(#GnT);GII+*sxr6oqvGn=pW&JL z2qOoZAmDu+3$32Ljj106h<%Jx9|susBHMfrT4q1ND4bkt$VaWWgT_%SKP5bEm~A04 zE?iU&J&MqC>gXrIF~3NysP~U?Qb%-ot{RnegO1=2OS6u`F$70`plC!M1$h~h*Sj*9 zyb#3Z=T(GC9c%`kb-1|jHMnATfsd!Wf~1qn^TdVF3qp9jehQppn0I8JSRl{xvH9{m zV3A|60gq3{V)w8jjwq}(F2bxvn5yCIe~!GSob~j_8lhKHm9CD$2#9nm0Y^hDq6Ha^ zx-Q+T>akC=0tGx_@DxP@jrAVyUB#9#pS_3#)rzqwOY@CY;Nh*<9`Jgw3cLz)i!LL0 z!W51!LzWVAYXh>h%S>WPj3rR3Xdr{GvB)N01+uLx>w#shv0nGw6|l0s)AjI*9-fNr zMIPPJqXs_sGw6YNAN|fVonLP<)!4lvT4qG${c>2M#-on%gqS^ooXmXyW3z!CWS3J% zdCF8rnUJ|3S;b*j>?ocAEcg%LIe(cNg)gyq)jL+p4{JJA)fk+#@pwiZWoke@z>oLK zmt$#E%k3f%@)rm-$Y2Ke#1h^E%QZ%Hi^Z7ivnr5@t^>KSumpGBU%4twack5OG4 zDqCt5b;Ta$Tr{`ELqEk>#&Qk2)Ilk~-u5I6mF??T8 zf8}^sk1i+~f4re~C`8^eg#GtUB#XkjgO zj77DJXK@FqA#Du97_K!3FpL=357&BwHv{S@XTV(!@bmrhiyZgja**^@NO}Y9Bt5ze z9R_~syRU&gg(c@u*r!% zkA$^Tahq=y3ZBaL^#ZoH^KAKT#t)94AMvoOixJ8!=PMI;u}l&2SmR;N*_fq_EX$!Fz3R`MxO%1eYoLUWRIyiu&+I)nzI{W-|;3; z@>88q{n+uet}!n!NA7f6R5 zYV5mUkNDIIpC0=jk~%l11hG^}#r8-^s013Y;TDI&#i0^Qh1mB&n14J}(ss$IQ>TP( zw=z_+-ESAD?3^u`w%WDLD}#bp*fL&&jJDstf9jN8IaQ@V;|4V(+hu*KT>=G~+jhD5 zDF~P}O|Acu&$7U2Z4B6L^sAL2&1odMDu_k~(a2yZSlGy5fr9goqjf>24@1H2Fpsyf zMMY@NeK}P>PsqD$71|i`R_v&ccnh?(70`9|lTuV$ifT(krB1cWP)q65?k)D3A9T7G zeVaN%-@4|1AynFyvbv#kQqj`wezhv(wi>JI;`M6OW8oD%M*jikZ@8=xKKD9OmV&O9 zU&`3o?u;Ewj%OGRd~o?MwTIi(FD5%V7EXh z5cXR>xh(7t1x~Zu$YhX`k(&-og=r`AoJ{Xd1Rug-t7(IzljGS&j!g7V!x2@Cb3w zprRh~EL*`N#KR-RQ=qV|fZLgbD|WPg*-0-h=Jw0vSLLn^4wg_WX%%{3??Fx3A3|d0O&)K;=Hy*AnRj9`FY{JD`J>6C6)R=_5rhm> zk|6vTp7U2osKo6<5Z=lUYtMuryqF`U2Sg#xKpf7Gfb|An_*<=H%uNsa$sMKNaNWPb^*5`O{)p120q9 zj+wW)Z2=3Z$h;#OO2$7U*>r7fm8BtvjOOu4CD5CbOjcZ>ng5>8JxxU`dbffYG6+P491KeuG8>b-20V!sW;{6+f~H@7q| zYFV@p%zPr70z8T?oO=-aAPDcAg>-MuOr{62%&{3dlxd)C>7~6FS??a_uHMqqiM;*5 z6NtR#u1aNgGczuzqHL?ZugJ&B{YF_ta3Q!H_2XvUVI$gw`wHC50yX(unEG&IZ1Q=y z&`a@z38V~{_u?+b4f*m!G+E4a_y~3RUkmH>f7VM%|1aLvAwR{dkCyrAhMJ=&dk{7HX*9&?pD4^z9%OjP!>~BSHSR*a zLE2J2inQYL1%p)T;q<$KUq!-H>Ee191U+bDndqPKa@kcV6{YW1Jy@;NcfskWuE5c< zYI-T;3;OB1Wvs&|{YT4!^mipJtw&0|=iwS}mU>r}u$;dxWy)Q!XOO-fVa}ID&kqaF zXOR0a^^2XoqRHifQPf-SeXu%8_oxi7P=8vZQ%I!!7Oe|YmDuE0V%z6cuI1_)w&daf zr{Avf1*^#`78sCTm?&lXHGzXJowh?xkZuf)hG)~8I+gnApG&wc_XHW<=sj8%rPoWj z-XE3yv?fXyqxLBEi#}JEF}=E&;Yc}KrUE)gXm(G z3m?OAKF-E5x*Y5!dRH5UC(e<)JqlwknoHy0^hVy*+OSg8(*&@`0=pt@@Wk^3Q$rSZ zfna?$)*#rRjWwc{QfesK75OoIezC~>1+X??OUMP8Z1Xm3_LmBFxQ1v1Cuhs1V9N#L z@zI97mE@XJiWk+41@Q`lUnz))h!;!Z!yj zWjsVQLGx+T6l|Md+fmO>Ty_0vc5zOb*+tHo6wlh1DN*FQjdN zQM$-`JJPpTf68r@Qs_x-BYJ z_%tX_2A&06Jd4YITO@4OS;7IgPVW z{#udtcI3z4`P0bH04)u_UZW}s{ge70B-Fb&-KYFUbUsxe&86$~^T_kyS*>_=gOmVjTr?Lx^^lD%uVL&F3sdgWE(P`l8(UVY;{^FB8(UMh z3fQ-8>?cK+!r$JtvF}%2h`IXTZLG6sHBKOZXJg09+0Qi$A)*tCFWie=M99K?|58zl zy>*$5?J6DuR&QfZAumEP8*@X?2sK)mlG4V2wc1z!dX`a}jg^-j0=Cx1_Lm%nw_j;v zk)lIXLAx!?*Mj;giQo4_GvDLIcVHx3Z*x9X^l7T0kJ{Lym3PoAy3@uULyKn9y@E}k z|8%OQfpb~PZI!vOq0~}NFemTaxrKQxQ?LVq-A;FuR_L|##d*wmJ9WFy(dW?SdJ7v5 z98>1fQ5*YS%}c=k!^ST1^t$HJQJfc|ocFe>XOwz+*23sqyddFz!M@IKkoh<>5oqOYR6ZET6_7QC>XH=j9AD95UF z%+pQH7UuPS9oRA(j zjmb*ECg_>q!}?{Ev#}GvE~n*7nA4K7mbw{JCa4p0)LPmhd6txQbU-jm%6j^ojj@ys zRE&txk+PBah}My^kz$f(we|`sy@WYWDBRjBn2od`Q}UNW*Hv>oI0w+W6iHi9rQ#wk zbvk7Jskx_1;JU0Dom!$OxJ*Mn8|Hd6GtfOlb4y^UVLYI=ko#wvP* zeuLHX2;GNO^9XIjDs+UtfK~Dc?ZK*ZgyL8gkI*TshDYd^SOt&JF06h>=vP=H0;r`| zYT1bva4oYSbBN|idY(v|2WexVu(WxQb_nnVtXcCQ=MXgse-m`L1L;#(lbTQqr&<04 z&A~jn81NCKk73@Npe2|uU!%`ro;-opJw_*`jTb1~>bSsb0iUEJfM206$&B+Q8GEl; zxndv0n26&#ksiZ0D_YT8v`}RUZ2~t_NAwr?#xz*=8+u3h-=SoQs=PzLE^`A0s{DXU z5%;}ApR9>0JyNPi{eo5v$|I3FKv&iIfS)gFRFY~$TY~f)@Q0MZtc#T^)YiaOC9Zxd zP)k+HZ>v6_R4J{2tCVZiA9)PGCqqfV`vK=b=OMuB-1`7e21<$3r4&bv6QEpKx)q!+ zdp|5?KMa`^y&386hYZNv9{jXW9s{M){S4p`R@xEu1^s!z$Mlz=$>+V_f`*^2d0jcI zW=ekum;#Ke)%sh2@v^r;F+DE<{@imjU?T96vQYUFUQR7kc6+!L@vO<<%^0{Tmp9BSqhWgi8YdEbtfVi?C8D9g|*oQDBaG zz5k)+=x%sXNVzNQa^+~C+V46bI^>9E)wxcnzp7c}I;NKCD_l2#UJ8G(yn^HOUxI=N zT$wFx9MF4RuRzaTfUGCdfxWI1ieF=Ws%Q1O-ckQX`-tn8sQn(KgVBdwRqDmsa`^&Tql(kC2s@n0Oh23X-M=Bsee(a)5k@Jk7IOH zXb*|^KBP2yO6eixnsSDZ)iC^tzZSW!YKA`wG2B;Gt9=|}bDnlL#?D2c^hZ0jqcm3i z2puKZPr0z?;@>~Gyjd=f72$^OQOF8yk7q;=-d~IatlU%$Td3{b%$IJ z2I|}k(HA}LDi?d&LggO!CQv>s@XH?d#)ky1)^@mG5z9X$z4?%`t9&bbIEfx%zpd34 zDt99`eMS1>73qstq%XpB3*G1r(>(%@2z*T76M%DY5;VtmK3z#4@HJ!S@T%U7x%@a_ z4gC&qF6o|TYNT$!MYIL*650*eK^efyh29I;PFcF&(;?D2B^?*oPoGkDcoUL7B52>ln`Gj|+P&##%Fs^egM|GAz z?&0*a0>{1gDs{BA+S3}jFLbMjJ$zVY19DFIiHau>)jaP05@2uTGk|Zq zjsYf$m~x_;;V$8M!u55e=S%t#q2DBwPgH#a^ar9`HXHqxt|DG?As#_xfNn%sDsCTY z^#ZE6ivazoU4>_t0G1&(QL*2Q07mgtvEo;N{~SOSzFq}*A^cyZi$G(^oaX(b3Yl{N z{WKRafKw%oht3BqMU2C7Q6pd(PFYy;0>DZ{Ju2d(MS!yq<*V3}UI)I+jdUe`vy%mU z3hA}@X-E>>x6uRiGJT(ZNN-c4x=a02^*uG@>T=!gD$!cB_1cwMzjjFboTiO)q*-|F zLj3D5AYARf3z6@1+EG4gp2oMT{B+vagb$(Z1d@9*pDOlF5t@sW;HJezIl zYXPyXudkI8n}*ZthXy+`gM;yOV)<^H+T7ot%b1hsW^-g+JlDUsJ=Za8nnpUeF_TT^ zl9}}Kfxf;i>HhdoZrC)oq;tvC0g=k$7u(_sWD9A!J{A!Lpv~pURBF}8Ml;iIWV0L0 z?qteXA0ISW5!TfhF!rxD(uNs_c6|fOyIVTC+d8|Kv@ULI>t4F5b8-99*6!A>Rc(vg zR&_3H?QCmp@90?6y|BG?)zYp-7j|59;nMD|)|Sr2Z5=I(yB4-}^!4@TjG;9~JYkq3 zovS%r!G$1R)Ypdx%vI1HrVm^6|0dPCGnt&D+Co}CoJz%ar;Mu>QcqWUco2rLuuW*e zhIDGAcPO6b%#KVdW%P3oG3Mk>p>|z698V>4BWTW0+%(JrnJ_M}O-9Zf!JDCY&KMZk zFvP;LAa6)ZM!PwH`qMck^{h>1b9gRWetln`Q&}(GD5Z?9l)+p!!=xrQzRAcYQ%NJ; zZ=lPE3^O-!xiJDk9li6!;P{1DJe5TS>D;1LT81C$v0p4-0xzXy{h2iXCe6mO*V&1w zJ=99w!|DF3S_y);##6(_#(2^M+S8d7^Tf>&V9Vl8Ygovl>D@e)kbrB`vbAx@-Rm?U zw>h4@W;t?}zzA)$Y+WWXoHCYE??^Uh3^w;{z&^=N=Q|e_Gg59f^b>`1zww#AdV?u^;B zKbf-#%cc*7<%zQhYcB9eR=PbgBe$h7XZ8(d_8IHZy&Z9Qazd2v-3vcW(4KfQh1q7a znH(4}n7|F|O2vn=NZUrFrH&Po=Eg{ znP$dh%WpFJjpRO?YN;@VJcFkc*sr-K+lwyQYi82P>mlU#a9es#DY0renMx20IM|g= z(3BN`F|>&n15S2ka%m&y5c=(msXeeQVL zC!Nj3G3Kp~gS|TN8(SJgAH@d@_Rg;Kz9d@56UWxLndCW+dS@mVOoKe8vqPDzu%jpT z=B$F&5bQwrXCTL3TdV;p8aRs#WznOP$Qf25+G8(Cl*5SUwMk^yQUyl?I>ntb=7k!A;cJs=o8-8tO%qR?^ebT#lBCd4ySZSG zj8RmTGuFlX_c96gn}VYY@|n&whIu$SWTcoM4lMKhBtd4+%_Bo-2JEyd-hWMI&mO@$ z4TKhjgl&5myppoW|43ZsIfIyR>g5$IWUDj;%o&moc*%&voj<;Y!UD($r>RQ8) z(8?k7f@wzrMxs53?-zDsu7dMOa9||ZrSjxXWB2gD0J}q;=B%Z8N_#eI4DL>iY)6?r_y_orOBb%^#W%G2) z;v!`eI(xsQ3i2JTFbopI{keQW$H-8G*Xn%6WJgKVm8UzBxW;&TB%fgq6QSplyAd|z z3Ub*cw`7gpy+$f!uUj%M#cA31t;9Z#036@T8=znz&J%f=+GOxDG*ba3q9$Cv46v!GYg-_uz4?L-~=Kwr-W_RX4{20XLH8- z9Ef^{cW2?zAW85~y}8WLb-WEAL}eI%?4a!TJY{!d_LnrbW?M3y$XvHAnXvK-(d!Db zn02j@9sn1nCNr1amgEAvJ5ovf*eNL;$Z?es-j$QJ8P~aR+$R$07xbCdX)8n+W6|%hPY#gWc zJbQf48FaA3O>*?X29B=Oi@$O~y#DZ3f!ee3NTv}5NveYvW^6Ke!q}X-#z>>Dr&BJ= zB-4}`>Vtn^cOYT3V+l+k_P(QV4>EPp&6}21o0(yRRL(?%x@05i>@ImJ=!U~^90*!A zi3wah1wL8GGxOe*)@O3P!$U(E69HJ){(eKYFxX4*kQvTx*t02~9x(D5>{#7aY?&uw z>c}GrBinB#Eiu*@k?F`xX7Tgop*R9PGtJwkVLWDt$|n0T-(sF*Ix<5en=>;NC=B{+ zE<4Z=EASd1F@=mw%a{dT4b_K-9I*%wu65G+>I-~3PZXU}M%})Cc>2%i+=Fsv-?T@ADZ37MX%kSU@yR-_}?bu{I-F z>2!q3ylKd?gV^o_gqMbO$uvUT?CCy=qnIoq;zT2tFYfE(GX%$Ylk0sm53MZ8q0eM) ze$1bFB0%64Po`%qV$TH*hin(lI3~OH=Zv&$!f73%Ds!ZOU=OY{Y}%c+6liM=E&EIg z$ms`FguajyE9^Pr*QKy6BoiAgEF_#{bIRIdC3%X<62qRf9FbanI^55vO-}U%Zrp5l zjIhD_)nki;utSj(O{SpYIIhq4$u#rXwW z_L+oFpJ^~l$TDM{CeKvDnPb4&Y#%z$#C8V3tkPLZ6$<}7tdkYwJH%SF;Z0{%$cg{{ zz;aX9`rjvfs!(YH){g%dh0a>GP^mwdk&l`-;n;d6>r5Az=j9E+OeH4m?*!jCJ;EeA z6RR~J+4&vuEIgPCaa5U2aRQ5QG9kwv*u-!QoEZiWw#aEj$Pz?4#3V-u*jY~@cI-9! zuW>lCeS72CJd&^?i%A0fZ~BsK9puPpvd(X8!c1ehU@We)4??A&J(U!!FAfFgHBPeM z+H6aK^_lCeWd-}boUuM*?ZvQKnDG&bgoz`g{fHo^yati5vf#Cd*T zqIMQ-RUjJR;9Z^@ur|uJf(a&1+4hvjxSSQu)Tfi(Kh@)Vvd-|DsgUgmXXQDAVD|Dq zMEEqm_Vh^MD+Na>Yo)VRD=QG}#(oKl9}cmtC(BtC&l-~_hSFO&QoRO|OPoY12-Y&~hie(y7RWZQ+H-0Gs9td-^iz-@6G z;dhARhdziG$1Csx7$4420xx&dc+s21tKci?06zH7;x%vs@-MKt_JSiWd?t8yBGm}k zES$|YCzool`E!svh%#A7jUzQAlDXVYyn5b+(ih;XMg01#xKJ{cOx1=Wr^}&{|C;7| zD1(1F=)#)!N@@r%)2%kt;pKKl^h<$*xe~}@E$YxZ%K}!r=0Vp&S#;qhymDWSdplm1 zcjDQN*YR8M0(>*@bx7lLI{X}?56>RpU3dk*1!)Sc0rg_kIS7al5np>Yqc$qa>qh6C zO)qja=RH>7N`b?&qE+-PZAvOe*3 zf-;00w8_OczL~FDHCcO|*r`Xf?u4#g(8Po+llk2T7dt_?qI(&*jm(<~JQ(CpMhi2&-l;XCsjo1sgPxAG% zM+|@_wk+lkXcdf;F>ZMXZdLdRL#bltUyM&R@KK5N=ATZ<2L^;oS{Ii<|f%fnlg2zl$MJiG%5mUxaE)LlUEh+8yp05NO^VN)aIfy8sHtR%B@1(F8{ zc9sXVn4&7dpbpXD@h7-YFf{(Mg}wnkFZf)#6lp;cg1NvfuctgbF$VFRmPX2~Aig1Dg#UYdUavRk^@hf8 z360-||1eh&pK$<(VS+(?4T7IBvG^CoaQFj@_!@9Fx%`S)(uFUyVRrmFF^H?kxYk-z~lC~P$A^1xV@mE7RZ2MpjEKc>+&dED|B|D7lP-wpa;I& z^yuMb>N(-@JH5Ee!{hg;;qfCXKA2(}8zdN-=y9X>C)O2};(JB(=WGgJikiXan=Bxv zsSKAYs%o)F&TLY>_KfHS}}pkJtOi@`dd_$Emk^P@%TmPT5cBdt;dgRJzj6P z6Y4@mNS<(Wca5JAuRVT$m1uo1czB;9L;>J>>AXs%_W>Z}75*NOJ9UV@qL43EDmmY%ppdh3DE_@j1XukwCwMc*HVUiDw> zec}F7U;Fj1>%Zas#%Sc!%k$s3LgNJkb4~zvDehrS4^I?(Y`5~mUG0&Iyp`;|GOBo{ zdK8@FuY%mk*zW=kD|-cJJ;UUaI>;DcQj&X@#rrtt1WIn^#5+i=;R1KM6;_73!Hb~- zh?yr!Zj3!1rs5o^R^(NYN5}>AbF86UMlQ}N=y;UD^ri$=n4QAI(%BO*6;D7gmF2|j zb+f|bzbq1hkF`|)fpJ~*`e%AJXw7w>Akz%uIgw9tz8MBye*t~FYbL*lO{(}cy z3N1T>8hhl!y5+p@t%ELg{m%PE{=@IKR`Vf-Q|ReH%p@j|ac)C`cD6 z_#zY+elg5F1OKrzna|F|*PU3E6?_^xdEGVo_pg$&ZX^5KVcZ+>#}7C1A5*X|E{#uO z5eVYf*vNaWAdgw(BUMh=*QVai-ltxD?}sN-2Rc5{Rol7a#rR7sV*y^Lo7n~Em7!rX zF+8}yG;ngdV6~B1m5N`VG4m<*p**%gUc1cC;azHW!LakzbwOtL)eCG-UVtx(xStl} zZ90_LO}%T{TbC>)TbKTFTNiHcA04beZ_gz+-syhp*uTc`cPpH06{qVQZ0ghbJMk8^ z4+F9@h2tE&xg5;)V{{twBA9be)kDT~vrHBCzu5m!3-E8sJ188lCyp z;NFg$G8uqO;q+p_t<;On@m6e+HzCy{o8~?|*JB&HLHM50-hCf~7HPiuvYsm}gm?+I z)&iS=M<;FtQsdZqb=zCU9&8bLOUc(fDYY57ygklhOBu(8Es5N;b4tDS#~@pV0HfbaSJpj%t;A*o{oE#iX~tO~fcNNp*|n!-QA z0TOSn*P@OADaEZE!Vv&lX#j^0*#2X9b02UW8*DmTkn3>T$Czb}v(;tU(K#@XKG+%NuK}%yf(7?a>Ikw4p6a;2Rf0ev53zTcF)ir1sDvYL(jn*B+#o zAg5n=+R)cag|7{HZQ$B1bTl2m;o$z@Ur_PE%ph`7uuvU5a%#`y_2B;bA9@YR-wmeC NI7a#3>;FFs{3l)AfMNgu diff --git a/build-tools/win-x64/GBTest.dll b/build-tools/win-x64/GBTest.dll index 2879d97fbca38d4dca88aa9d2259f50eff4c4b63..bca7aac5424e129b8c4280d43f04b8024cbca3b0 100644 GIT binary patch delta 8149 zcmaJ`3wT?_l|D09y1J4q#aFT|JATPd;@nt%$1f$0W5v){L<7 zsC99kEWtw4OThA!jlxm7W?oQ~u3khhpQl6V74x*QOeDW@o;Oi~i6m@2X=ogzMt_Ti znzuu0V3vnxQetK1mmrY9Q(}eJRRUJjhia~?05PYc)@l-&cvegcje%7}3HPziHIacbyn1?HOV@mu9q^gra2XbSCb787}!ZqqA9aThs{{5YnCceR-O`7PPB*_ zs{!5sGg>j$ck!YX9$9GaO6LnpyWET$C|+dtI-U|zFFz!Pxk3m_d0}=6oV3$!^3=>$ z)Yv6YiDHKm$X+!c6ea3FkXf3o$m5lBc9;Tthh!Md=oI>;AE`8=R@&KJEB0G4*1!%$ zDs6JnQ^)~*t@D)VRgW6&b0A!3?UmMVoRupJAS(*`I$dZNo)TTH`|eDv#q{73eM$5k zY^T1&=&~Z}4z|upsco#=dQ>gU;NW=Hyo9aoTqjM;KZx|D^mQR!X-oe)FMV4`bz3@@ zlh$9;2^ta1JeHkaKh^oJEh?KA4R`*`7PaO?nfjfb|8C2+=4AC-JO9NNT{$nhwDUe& zbZA~Q)cJXc%-e-Pl)K3L+G{uyAz$R0P|y)ELqTU`O!tL$+U2-uq;XHKFrl3*g1$S0 zYGixn9E0^AGH^xe&(T+&s}J~%^$1+2aowL58z78>KHZm#xc;5LpFOK3dtj6fL!Tw9 z1UaYTVo~*EFOJcd2$oR6=t1>CK8(ksk`mb{2lf(D^fFASmw5xm zh||p6BIaEH7tq}eT6Zic7wf($bk2{^@g$DFn#T2$tHOT>Q~1+TVkZ*Y;9N_Iosc9? z2~$IysKj>4pjN>^(D)dP>U-r?A8i_#(CQHD>zof^HA(SG<7`6O`O)hvnoKt(G{F}gzC z87!z=7fOB{j)R4PLi3YeIKK#7pinO`a1%u!JhmV-`k|B2^@5`A*Kl;;%=)>fJR@C% z0wMDk^VXq7@oirr^KT2P#*aZTO5yAt(Zj91& zxo~1PMkzP&*onN>Cle8hU@1Q&#<@aljQt>yjZtdsmd&=bD45@QEA~WRs^{MsEZ57; zF&~b=Wr$OEP%p2nNeqbC6+9(!*UJ-^3${|Ptn1e+6Q2}j7jRH}K$%Cy)V-h*F@P}$ zu-BL~xNWgPCTk&-75LG(DLtkonp5-Z_$BmZ~MXN6|?}w{% zs{ec0S;E<^%Ns6Y#Wm3es#J6xyUzHA*)r4VT?s{Y+iH| zURkaX{m1P)aX<82-ihHbuD-;Gm?z$R#fU(qO$ybcr}324ZEtI;WQ$iL(3&EUikXKZ z*=?(#G(u6!Q{oL$ku8hYmN#&;RN1o8mqFr1QcizP(5dCHUO7lv#JJ>>Rz$_g>#aZ)pgmr z#VTJ`we1{L5b4$+peuo@;I0<5mcY(rX?MaSX>63km_WAX0OrfQD?L(>38mSK2GG=jGOHJ+7}>_b1eH*>(8S4iCyE+@#Aco-{|suSg2F$8hp~ivY_mxtIRF0>;)D%GoD zk4oQ_SnE9PUP5>)g8b9YGM7pZs+Vahz3&uwO5#r>ZkO^4C0!`zE^!J!`@Jt>)=wM) zuaJ@_>3+!nO3-F#SehPo3DH++D_5x-MjnbWL5DOiradPok2t~}KV9p634x!}gu90& zl3Rqi3yFG2m9su0CEdUPZE`&g?du2@pkI3hy^)Ez%;9wvQRcIr7co5J7NV0{J3>B7 zg1%Lzm62G2z$zVaF;5ZoAQeBQTrX*UnpIxXmeMN6n@FhLC1≦a`RaKP8Z;pT0#R zT^~Xg(H=yppyloz@Ye4Vv05{Zb{?SDw5O5Xn8a5dBF76bL2QQj+Xh{Pe`0%|fGj%C ztwKu(4qFIy2$oUM*i1Ct9k7ps%O?fg_0Yw!fi_nsbvgw|smkQj`Ep_f6-ZOOaKKHN zLXs1m6va;wC5Z4nWx2xW8i@}}yjfWZ$r`FvRGM=v2Zr1Yz;FEImw9UX(Kt@M1v<<^Cx)7qAi=CkF_3VYbj){DUY6WpDq|1v0(xVSu8`i&>MH2JltS{=%gV?^LsTre!*rD8XV7Rv z_;rKmFnt-FDlRC7-Cw}7=yHx`5O6--mMdHUL?vfY-GWZa4XMlxt0$56qW-x^51rnuyfkeq4m5L95D(*mmBS6s! zzjJf~pY(13W?VaPi3@E39d{4oh3JTPir#}w1}JRagUwO8ik(q!0>10MhYqq=U5|i% zoIgb~>~8lfw2EcK3XZa$X|L0AxI0ZJ*h`K-(Mh&e%V#H9%)68wXWP70z;}RkGURc# z%hSkOrTw?qA02(rKIYf~yjNnJ?_^yvt&Oxpy9-gL~dsI0^bz|%Ctio8z#3d_&S<8QE-BMjW` zvgumhkF*%|)8o7Y^f$a`SU-gw>v$bK=i0=hOw)GolSrjv2ka@=lbrF_)pxO^w;a#n&q&lDgYdU_JHUv&Kgmuj8Q#mjN zK8OcOlpVxsW>{ML4Iia(_7^_GZr1(>xXZTFM*}UR0!OBSBGeCNHSGnir7>V1T?@QG$}a}? zN=JPXV-lw+Nk4E*Bg~J1BFv1$!xFzJ@ubB2@lfw@J}K#^B|bwb>T&*3(r;$uKuow$ zB!(p}lh`A%m!+t{*(d3}5~n53Kwjy5hTV_3j0>AEzYFw6ZXvn7k{*)umw?-xq==+@ zB<_`XQi-G};;f^cbS?dm?qn};1-AgsR|cQHOlA0 znW+NSfNrL}l%TiBU|npOjWeA$@nifBe#UyCG?@7wE*#ui^PhmS8Mn)aWxtXp$|B2B zykY!*yQihyx&ERb;qOg37wgH)2PWDf=ZQy|3ttUiH@+Tx?La+}D5pmB9Z@+wjMRxL zvwS7^M%s!-xt`Y37pRxMLVffdIuG9+l*c|r*Ru+|ia1 z%jv`FeAYv?@e)aa+d&gFiR(B)<7nhH&{jo~%x77V8DOyPM&NyQKL(D~-ytz%Ep7NT zsJj|&%ld0>ECm0##!V7;NxZ;nXxf~mo@`paKv@?x7rRbvM5qC>+FEM8LwFzCgzq?B z(!bVRT0bDU1Z|*EilG@3WWscirjX?*4N*PvP2k@s@*S`)Z!Bd4r}A6=m$NC$*H&$% zSJkWT_et;&}Rt`?m6H{Zac(*@LdPUQ-kDYkfn&@b% zEK>{h>ElepJB}oR)$#Wy~Vg2^n-#gwm#^nV-H(3ordoL{0$VC z{(;|B7??g`UDjE~PFM#zZwSJgF~2j+Sm3G)UCT8su-ww4g{upgU(@`W0`nQ>*QYC;Dj_~Ji*xxY}~!pi-6%>fv(qyNSVe`eEyyXtVn>E)Rz% zg6NjySb`yl`CqHtoznfbsH{}ZVL;HiBXhLQOo@f73nzC z!1Qglw%o6%fv~2E8gV}tntO!J1J>M{MijDPZ8ZCm@05$)(~>S!GrY8~qA9Bylh zMWaJ4P0i7keZ$SswzjsW!KSvBmZ8|NRo?YEmnQ#eBkRju)kSrOu6>Hw_6xi@gx4g(;*|%okl4RUW4)l+V zT{vY9O^proPE2f!O~wYcCHBQe2m0e<69Yqu$?^E)fH^fjJTe*|*tDTPo}8>7j1M+< zAj^GCt^0;ox3;%LWAUb;;g+VB;r4iITYG10xP9O7aCESxrL|))zO$vdsimzsHas{O zU)|Q$GB`Al7`$@8#AO~!#`jz^GG2e6y*2B+VPa^IF5cYR($-GdykE)Xjn!^g{l!CL zf7#!5dS&c8U&Q~<&REC#CdBu6lXlAA{XX9jr4H((CSWUWiXn-ekPK5Bq%r(S8ilk4 zbTgTFR&O4p(x}+022}wwY1W0%zh{{7y6hhL`Akgt95wU4H z85utD0mSPQ(HT_M#r1Op9M^H3o%vi{o!Q+{n8%K@g2RsPuDa`h-{_3HL)^dWc88$s zUc7&uSDiXlb?VejJ9K~z-Ng>vmA`Y%o|h>7oTEze@>-(SktcTX-OiDUBIoPZ5v{V0 z&26=Iu%PF^XTdatx79kx%6z+>AUEPw@y@pXo^`0NMu=Qt%g2{A=Mj05I+4RqJn5Hh zUNT3vJ8iMSh{Ar7oDqb1RT(!5to^(oRS3@GC!OD_fr=go@51tq(=V(6Ez=# z)PQFXPbI|6%%>rcz!PGIyGj9*Yl2gDm4Fyk^ATDvEXWd4Ftw?p^Bu&>9FwQb;uNW70b#KVwK}{qDMWz z>u1Icv^A|ff3im|G}n?7gr&XQj2oC%_{=Vz5K=GSDVotd2#a}Mx(l2%(sksSa;9vG zz2ph8*ugl4RL#E>OVorx&d`~%EM7ip50h)}kQ~Nk%oO^f%PNg#E9snFCH7k}qOilt z6xV9>31YyW>pUTH)uTq|IWSys)^pZ}&hn`N$npc(%^K2$Cq!23*$3k-=pLA$Pl$eu z?bIh2v#hYXg0)%+wUM=1$JD%38!TFWiLGsJlP2b8B77-*Ur49g(m#z!KN3>imX2nm zHQSp(V+1pcrMuS*Hh*G^O2$Mz&A+xq4H;3YW^MBuwrpueR^a^H&w+91`uo(T$%G6bE>bu&XRbb#uh0QcqXme|9U6IXgw7FsfhbU~! z6VB#~;c_tsPY5($fQhjH!hpN9e<9k*rq4rt@kN5v-F9pKC-yQeQd4PJ<(Qed_#(M1 zLk2v$R^6g|0{%kXA72c2Yi@|p;61LZ1w`XGAogir(me5Ytf^H5Eh ztQYcL2^cHj$$SwZ$W%4o$xu8$i4utz#qe>sQ=>01x*7hY0OwszlSpk9sVv3F3UzHD zx4bRbe-#`D^89(`TrZqo4bGpZ=NhO)VF=BOLSrR#a&$d6fA&6HS#W0k##5S-E`t7` z`L|=%!Exi;zJlg^7qyuIg60R~g!$&E;IQyvICErW;t5_Hx;(eQj<~>IU}o7CSZsg6 zxJlaM6_{mX4l-IX?X>oyOFf?_#M#@@{uD}Id0TpbLVuyzJm#TLA0J$yIdoBji%fL4 z{T7Z<#9v}u3j(PXoa{--Zx61QByo*pa;tnOznS-M5jiBNi0LDguJ*|wv@MR3dgu|L%Zf98zYGIC^qZjY%opbY7Uwy?B zVqNlUz4)jQ&$_wcLY^qXVRLM;bz802ES zjjS;DBS8B+ROm(HGP7b_W>$zTPNh#pQ96$r){iAorN44q5>;N}r*d2pRoY$cp)1Gb zP~|sri039{mL$ZnuXY5zXHwyO@0qEAiQ;2G>?kZ`@y@lYm#j7VM57a1aHjJAGt!Jr zu&JVUe0qro6@w1qqv0^#sh}ZdO?K^4j4ok1y&vUdsX8RS)#N9x5LPKhH`@GBHYVDK zZ<`oo+^(HHk`%Qw6uOcqev{}XzmW9_c`4Dkr9$Ry2qrE0AQkg_W69{kX%dPmo~S^h z$V9~F%vpR>s4@?uzXHhsBSZE#t4aCK){)=JA>R=`Ew8P61)N74NZhL8zu;~`&Co%Ws+Id>?~95%o6h) z??m&ZGG4N5FIvWnW_riGXfE4}_J4WFIPuv|Tp1@WbHbPtm)myYy2J@0N>3;NOWk3_ z5u&UJ*mtpyRoDvADpFX5#AHZ&qAr^85P8C2U$HZ=X0l=y!iTJ3H3jANgzRpaIa~Yn zX>G4!DJSkC64&uLyc1Urn7!L>>K9%Ma39}`QaW+j(AjZtN-p+=`M+?^ZV`zq=^ls8=b#X zRf?;XE|pF>1@4#loWyBTUM=bKPT}Dbhd{&on5NQm4uSKe{1|QasPqv*o1zXm%u-E= z4$%~@QW1?GiIdHseFNCyYdsL&K0oLEGFpY>MEVNGqbx@kT-W zNI}kR#4g9cQ@EnlgE?f@WLsvtR@vtrh zCg$mcqLhijVr(YxE;a*rgjECgPz-pSZ3ez2ZGItfI*Th!be3&b^2xyx@H4@?8>mWb zkbxfZZieJxE`ruv0_|`gaqm?YhcHu0jbNVp;QAiP?kPBeo#ym_>+V202I=02=yxYQ3{F%bY&FuCrR)YtBMQ@Niuk=rC>%&2 z@sq$gWV}ctapPYQ9q0wzIbTO{B1UolaGC|n4E+#%;_nSqxD1An`Haed*i`8!H7M1C z4kz_upkADYBW^}IP{kQIf|4=~m_v0EqY~RCE|GY(#B~xofeb!G-(g@LJqj$QW55ud zB(d}-Nvyb#6w{Y_y;(+GoHwJzoGn@cvJV{e=C_ltTEwi5IdPv>ed$l&w5f$X>!J7tHPaBX%X<&DYDBb<3G`%Q+op z!=9u3Fmq_n^E&3!PVn>Wq-T&-uva~=@Gse3?Z=$)zfeELWL|T;$+P6_voQNs&|<$2 zv!5#e$d|BNw37%ij+>&L&BZi^Q*6HLW4?tpus`!*w#G%uFbip_au|_%K!1qE9A?|y zIgnI%BRoX6(Dxh__@KyfPNnNN zCn+M(xe_-@>{Jp|?X0G?bO-$t9b~`a3Qjxfhw>ik%1d0}?yCUrPT*25V(KY#Ynvjr;(AnE!!eX{2j-Pd|H5Y*3%Zo}e;G zd|G`?c2t@uxOqr!%H3JUB=o>Kb4 zCG1OSD?-Mv3N+sqltWNMOYtqRo7(6RnnTY}JN=O6;ayHyte1APGW>O3g7m-X zKT1QOpMYoUvyxV;xpd`;1EsC3Xdph&xn*|ah7B{RwXd_kKh`anW@?>neOWf^L{s@} z$BDfY-*B8*ZNxa=bHRGGs+D=H3stdz2aB_U`e*=!G)~))jxAOq+;5!=4_RjQz4zDr z%;FKh^{+L%WqZf;J!l`u6Wtcj?bJzI(Rm9#cSOfykww<=$UsmX05TVuR7$XxHkueB&gW$V?TOl){?L%ZjzX)`kIxt)(axM;C#44&U4qsM7 zo8X}rw%t?%&vE?QLjBf++PV`X^&fHTh2|maT;o4m2bx1xZS*~z)X~}rZ=ZQ_?%kce z*IXNGj#?!xwdDnBo<8&-bK$E^5&_a`8DlwR_}QH41=cMs5pOOMMc*O#TJ+5Kk;dK{-MXYk2^!0l@tVX@LQgLHFh?GLyudNX6?BVP8jn!LyY-vU8zlS zx%?r{xepKe4>RBm;1I*Nna}0&xfENh5AAj7L-%Flwg1a5h0zjL>eD-YKL5~&Ew!Aj zMxmGrdb>T`CVXy!Uw!D9HNUmay;t*ac*C4_wU%1nZJpFn;0Q791NdBO2y+=hc;p|t zAek?H2-qb+nlK*F+%R#8*v5jfSX(taYE5q|vX-@#&z__qgeAMwDr>17j|!@}mMb+j#lwSBj(lpV4D*ml&Yjm8>#W_Hzf$7(y9x_f5S z&!~?@d+HlIySii1O--Fm(P(tWrtX;a*6e$%^>ae?ulvm}h%LWLoXo$$TY%rK3h@6Y zGLJZ?_yJG;!trzHe%@w1Kc_O4b;ZA|$(i=+B`^N+>Lc0e3VeAIMOOF6%>Kwg@7BIS zvwLuBWLfVfv(wxWY47XX(%aQJ&>P2O3mp7OD$tzyR~`Y%n6jH;)2-cX+G;8qR3=oiAI01pYF@y7vMtI>pys7= z9AgG{p&&&6h#xT{iu_Xs_9OIPH>?O2A%#N~ve^Sqbye$P4I*A-3fiY5a#8Wo~%Ql@S}6jzUFe25(jW9kXSh+`zt zA938%bYfiH;Hr<$3Mw;Fs>%p)_a+fSWR1b-FbwfMa2OC~sR^cq4|1W6f4J8SP|V)% z%g)R`OG(d*_N9tJX*$y1iYKi=hD-YmB3`a~a~1Ub=ZQio5MDlW%$WE5CJ;`ndl%^t z5mIqoG>vgZe`$Wf;Kv!jSN4hSv%qpTbn~OjQ$m<$l`9v)%^t5T!T=kH?glS=6jj1$ zHWyVvKKm6_i8ikR5wIK4boj!It4f$ZB0_5h*VV`7OhF&x9XWBZ|nO~!KI1e=d#ftruRUVj5inEwQ~k`XH- z5X`KzkQ`zocG60kaWxQ*6k*0f3P>Sw5ht=k$aLt<38u%a3A1LR$E+L8gT5BcgnKNA zPDB^>>aoX&-az!>BSLBrSaT(^M!YLR(E@1dgOsS#;t?U+wG`xXv~jGB|5po5iD`x~ z-W8q~Q@3o#Gh{}ungR3i(>jSKWcN{@Kq`@jp8DuszYD3+8 zir2sj5<&`0dWl&eNI_&+^uZ5>l_e4RAt9YQD6D&DM(=U=ySv}L$K5^dK%_em={4Xt z-`=9~=T8=zTc>Vn)>Lk~rR|_tZn~lE31OdhlF%~{tLY{Dd9q*YA#9!M*OU<^n68ED z6HK?Ymnk;cEvKbkzE4UvZ}HG#xxY6(b|82UbY`QdP`_$Ly*P6(BL-!nVq||#%F`YMXL#n+Y?B|~&clOljME}DD==^$}~|8c@_INL0fs{9k-tSWZ> zyBWE%f5W9i!cauh_t(W~{(?A`dP-J7?;{*@G6i1nH#%88JF25?tTdqw^fZf(CX{wC z(}Y!&%c2P-wNjOhFq;@@S1GQf8mTTXBw3;DtU^&etH&r|w4Rj;5e=+RC~aW+bx|t% z47FBEU5(x8$`^VY*g@fK11lD`x>#c2DxLn1r`VA0tf{MY8qeDt`B8>+b8W4)y7HVW cAKYVfk}!ZTGU+e??q>|9g%%fU_UWSk0B9KsP5=M^ diff --git a/build-tools/win-x64/GBTest.runtimeconfig.json b/build-tools/win-x64/GBTest.runtimeconfig.json index ff061f894..0feb20dac 100644 --- a/build-tools/win-x64/GBTest.runtimeconfig.json +++ b/build-tools/win-x64/GBTest.runtimeconfig.json @@ -12,8 +12,8 @@ } }, "configProperties": { - "EntryPointFilePath": "/Users/timpurdum/repos/GeoBlazor/GeoBlazor.Pro/GeoBlazor/build-tools/build-scripts/GBTest.cs", - "EntryPointFileDirectoryPath": "/Users/timpurdum/repos/GeoBlazor/GeoBlazor.Pro/GeoBlazor/build-tools/build-scripts", + "EntryPointFilePath": "D:\\dymaptic.GeoBlazor.CodeGen\\GeoBlazor.Pro\\GeoBlazor\\build-tools\\build-scripts\\GBTest.cs", + "EntryPointFileDirectoryPath": "D:\\dymaptic.GeoBlazor.CodeGen\\GeoBlazor.Pro\\GeoBlazor\\build-tools\\build-scripts", "Microsoft.Extensions.DependencyInjection.VerifyOpenGenericServiceTrimmability": true, "System.ComponentModel.DefaultValueAttribute.IsSupported": false, "System.ComponentModel.Design.IDesignerHost.IsSupported": false, diff --git a/build-tools/win-x64/Utilities.dll b/build-tools/win-x64/Utilities.dll index 302f41cf771691bf00412b86848cd7c7a8c83650..faf2d8902838c75d3266257e0569d77fd1fc4fd0 100644 GIT binary patch literal 26624 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 literal 26624 zcmeHv3wRvWb^n>!+1ZCyEA6hddKpW`7A%r1%kl#R#(|LaRMonkcKoQp#%q$CWR&`$-kwElLq&9&dg|6 zvh1Y)@9X#V`~Dq!&fIhEx#ymH?z#7#duLYbKJXE85s`-b)G4Ab;>p)afoBKf$PU&% z6{N>~FVFd+vi9XUoA)NObwg%mz>E*p^~clcOs;OXQD+XP>yqiZ&JDeFgPDZUTwLs* zXN%t0MYL9N(cq!Szv0yOCY@VXq_hxS1&VG_Hyy;Y4)-{2qEbn#mflQY{pETV5Ols= zbk&W_%K!6E8)Xt-kh_7O<3vMji0Rk8L;=wL;{eg->3L_v>xjGs`Ci~_3h?Hfu|EfV z`v(D#CvCO$1}0Y>sLf{9><1>gjU&Mg-Hp58T8ZvzHjPvUjI1l&i<@Qb!Ci2zBwAH~ zN^&vV6&LHKlAG!-A^Jf(ks{RpI=EPkEhF-)uCYt;XlPYO`I%kLh`*x2A8qif4eMPN z`DPzcjh0!#nOj{=dUhpJ*B9h9RA-@!|9UQ2;UG5cgE2J5Z!xX>rrjb~mW8PHwS@ zz8Mtl`52ZdT0`IG@FuB-$^_3>eyRW{={QiXXikh zaX6*cK-{MLrnTwIDDnri39j;c+O$+Tdz-8#RGp~_T-;W@%29nTtL_rjp}R_OW*#3Q zvlGlQ%pU$C&+xgRHTgUb@YCPuIk*wzMnxazzL8!LO6&@d$K8%BjancGRtd#osKj4F zu}xse^oq>N?Jh}e4>W3CeMi8nxBNPWNys13!@7BZE8haF*e6^OP515yX*()*MBK5h zpx4B<0oInpw&M|UM;Bfm_Ec8Kb^r@|)EFvm413I5SjP*ULS0-@*jrg;N%Yzhy#*4zwnXnViC#<6Rgk1ZW6zE%h^npgRBo4QeR=k{ zQ)6s5r?^=H8X_$&x)uF^Zn14AmT|@U!BSLPENzcU)5BVAS*4|&3MIVW_?a05^y}tv)R0Ld-GpAw;Mt&?KLgGDzucxF5MtLdm19CZP9)=^Wby$lM8n z->cJcHWUTr1%o!-NEmpgvYFiSn^Jc^Gn zSj8smt(HRSSdBbgW9P_I8=EE1^06v;9py#OUVnHzx15|g#s$hpT#bSDudS$+9)I)A< zd&G^Iwe>x3e$EPMu@6H^Gjrc-V)fjG8 zVp?0hje%Mp+Uc*ws?ey_1}B?4yRgxyNu=}gmTz^$uh~*}gseq}TULaY6`^HCp(3;_ zK3ch1Re& zwh%*PoSh)n$|<%}!?~&}h92@`o_Es+U>?4*e+o(#GnT);GII+*sxr6oqvGn=pW&JL z2qOoZAmDu+3$32Ljj106h<%Jx9|susBHMfrT4q1ND4bkt$VaWWgT_%SKP5bEm~A04 zE?iU&J&MqC>gXrIF~3NysP~U?Qb%-ot{RnegO1=2OS6u`F$70`plC!M1$h~h*Sj*9 zyb#3Z=T(GC9c%`kb-1|jHMnATfsd!Wf~1qn^TdVF3qp9jehQppn0I8JSRl{xvH9{m zV3A|60gq3{V)w8jjwq}(F2bxvn5yCIe~!GSob~j_8lhKHm9CD$2#9nm0Y^hDq6Ha^ zx-Q+T>akC=0tGx_@DxP@jrAVyUB#9#pS_3#)rzqwOY@CY;Nh*<9`Jgw3cLz)i!LL0 z!W51!LzWVAYXh>h%S>WPj3rR3Xdr{GvB)N01+uLx>w#shv0nGw6|l0s)AjI*9-fNr zMIPPJqXs_sGw6YNAN|fVonLP<)!4lvT4qG${c>2M#-on%gqS^ooXmXyW3z!CWS3J% zdCF8rnUJ|3S;b*j>?ocAEcg%LIe(cNg)gyq)jL+p4{JJA)fk+#@pwiZWoke@z>oLK zmt$#E%k3f%@)rm-$Y2Ke#1h^E%QZ%Hi^Z7ivnr5@t^>KSumpGBU%4twack5OG4 zDqCt5b;Ta$Tr{`ELqEk>#&Qk2)Ilk~-u5I6mF??T8 zf8}^sk1i+~f4re~C`8^eg#GtUB#XkjgO zj77DJXK@FqA#Du97_K!3FpL=357&BwHv{S@XTV(!@bmrhiyZgja**^@NO}Y9Bt5ze z9R_~syRU&gg(c@u*r!% zkA$^Tahq=y3ZBaL^#ZoH^KAKT#t)94AMvoOixJ8!=PMI;u}l&2SmR;N*_fq_EX$!Fz3R`MxO%1eYoLUWRIyiu&+I)nzI{W-|;3; z@>88q{n+uet}!n!NA7f6R5 zYV5mUkNDIIpC0=jk~%l11hG^}#r8-^s013Y;TDI&#i0^Qh1mB&n14J}(ss$IQ>TP( zw=z_+-ESAD?3^u`w%WDLD}#bp*fL&&jJDstf9jN8IaQ@V;|4V(+hu*KT>=G~+jhD5 zDF~P}O|Acu&$7U2Z4B6L^sAL2&1odMDu_k~(a2yZSlGy5fr9goqjf>24@1H2Fpsyf zMMY@NeK}P>PsqD$71|i`R_v&ccnh?(70`9|lTuV$ifT(krB1cWP)q65?k)D3A9T7G zeVaN%-@4|1AynFyvbv#kQqj`wezhv(wi>JI;`M6OW8oD%M*jikZ@8=xKKD9OmV&O9 zU&`3o?u;Ewj%OGRd~o?MwTIi(FD5%V7EXh z5cXR>xh(7t1x~Zu$YhX`k(&-og=r`AoJ{Xd1Rug-t7(IzljGS&j!g7V!x2@Cb3w zprRh~EL*`N#KR-RQ=qV|fZLgbD|WPg*-0-h=Jw0vSLLn^4wg_WX%%{3??Fx3A3|d0O&)K;=Hy*AnRj9`FY{JD`J>6C6)R=_5rhm> zk|6vTp7U2osKo6<5Z=lUYtMuryqF`U2Sg#xKpf7Gfb|An_*<=H%uNsa$sMKNaNWPb^*5`O{)p120q9 zj+wW)Z2=3Z$h;#OO2$7U*>r7fm8BtvjOOu4CD5CbOjcZ>ng5>8JxxU`dbffYG6+P491KeuG8>b-20V!sW;{6+f~H@7q| zYFV@p%zPr70z8T?oO=-aAPDcAg>-MuOr{62%&{3dlxd)C>7~6FS??a_uHMqqiM;*5 z6NtR#u1aNgGczuzqHL?ZugJ&B{YF_ta3Q!H_2XvUVI$gw`wHC50yX(unEG&IZ1Q=y z&`a@z38V~{_u?+b4f*m!G+E4a_y~3RUkmH>f7VM%|1aLvAwR{dkCyrAhMJ=&dk{7HX*9&?pD4^z9%OjP!>~BSHSR*a zLE2J2inQYL1%p)T;q<$KUq!-H>Ee191U+bDndqPKa@kcV6{YW1Jy@;NcfskWuE5c< zYI-T;3;OB1Wvs&|{YT4!^mipJtw&0|=iwS}mU>r}u$;dxWy)Q!XOO-fVa}ID&kqaF zXOR0a^^2XoqRHifQPf-SeXu%8_oxi7P=8vZQ%I!!7Oe|YmDuE0V%z6cuI1_)w&daf zr{Avf1*^#`78sCTm?&lXHGzXJowh?xkZuf)hG)~8I+gnApG&wc_XHW<=sj8%rPoWj z-XE3yv?fXyqxLBEi#}JEF}=E&;Yc}KrUE)gXm(G z3m?OAKF-E5x*Y5!dRH5UC(e<)JqlwknoHy0^hVy*+OSg8(*&@`0=pt@@Wk^3Q$rSZ zfna?$)*#rRjWwc{QfesK75OoIezC~>1+X??OUMP8Z1Xm3_LmBFxQ1v1Cuhs1V9N#L z@zI97mE@XJiWk+41@Q`lUnz))h!;!Z!yj zWjsVQLGx+T6l|Md+fmO>Ty_0vc5zOb*+tHo6wlh1DN*FQjdN zQM$-`JJPpTf68r@Qs_x-BYJ z_%tX_2A&06Jd4YITO@4OS;7IgPVW z{#udtcI3z4`P0bH04)u_UZW}s{ge70B-Fb&-KYFUbUsxe&86$~^T_kyS*>_=gOmVjTr?Lx^^lD%uVL&F3sdgWE(P`l8(UVY;{^FB8(UMh z3fQ-8>?cK+!r$JtvF}%2h`IXTZLG6sHBKOZXJg09+0Qi$A)*tCFWie=M99K?|58zl zy>*$5?J6DuR&QfZAumEP8*@X?2sK)mlG4V2wc1z!dX`a}jg^-j0=Cx1_Lm%nw_j;v zk)lIXLAx!?*Mj;giQo4_GvDLIcVHx3Z*x9X^l7T0kJ{Lym3PoAy3@uULyKn9y@E}k z|8%OQfpb~PZI!vOq0~}NFemTaxrKQxQ?LVq-A;FuR_L|##d*wmJ9WFy(dW?SdJ7v5 z98>1fQ5*YS%}c=k!^ST1^t$HJQJfc|ocFe>XOwz+*23sqyddFz!M@IKkoh<>5oqOYR6ZET6_7QC>XH=j9AD95UF z%+pQH7UuPS9oRA(j zjmb*ECg_>q!}?{Ev#}GvE~n*7nA4K7mbw{JCa4p0)LPmhd6txQbU-jm%6j^ojj@ys zRE&txk+PBah}My^kz$f(we|`sy@WYWDBRjBn2od`Q}UNW*Hv>oI0w+W6iHi9rQ#wk zbvk7Jskx_1;JU0Dom!$OxJ*Mn8|Hd6GtfOlb4y^UVLYI=ko#wvP* zeuLHX2;GNO^9XIjDs+UtfK~Dc?ZK*ZgyL8gkI*TshDYd^SOt&JF06h>=vP=H0;r`| zYT1bva4oYSbBN|idY(v|2WexVu(WxQb_nnVtXcCQ=MXgse-m`L1L;#(lbTQqr&<04 z&A~jn81NCKk73@Npe2|uU!%`ro;-opJw_*`jTb1~>bSsb0iUEJfM206$&B+Q8GEl; zxndv0n26&#ksiZ0D_YT8v`}RUZ2~t_NAwr?#xz*=8+u3h-=SoQs=PzLE^`A0s{DXU z5%;}ApR9>0JyNPi{eo5v$|I3FKv&iIfS)gFRFY~$TY~f)@Q0MZtc#T^)YiaOC9Zxd zP)k+HZ>v6_R4J{2tCVZiA9)PGCqqfV`vK=b=OMuB-1`7e21<$3r4&bv6QEpKx)q!+ zdp|5?KMa`^y&386hYZNv9{jXW9s{M){S4p`R@xEu1^s!z$Mlz=$>+V_f`*^2d0jcI zW=ekum;#Ke)%sh2@v^r;F+DE<{@imjU?T96vQYUFUQR7kc6+!L@vO<<%^0{Tmp9BSqhWgi8YdEbtfVi?C8D9g|*oQDBaG zz5k)+=x%sXNVzNQa^+~C+V46bI^>9E)wxcnzp7c}I;NKCD_l2#UJ8G(yn^HOUxI=N zT$wFx9MF4RuRzaTfUGCdfxWI1ieF=Ws%Q1O-ckQX`-tn8sQn(KgVBdwRqDmsa`^&Tql(kC2s@n0Oh23X-M=Bsee(a)5k@Jk7IOH zXb*|^KBP2yO6eixnsSDZ)iC^tzZSW!YKA`wG2B;Gt9=|}bDnlL#?D2c^hZ0jqcm3i z2puKZPr0z?;@>~Gyjd=f72$^OQOF8yk7q;=-d~IatlU%$Td3{b%$IJ z2I|}k(HA}LDi?d&LggO!CQv>s@XH?d#)ky1)^@mG5z9X$z4?%`t9&bbIEfx%zpd34 zDt99`eMS1>73qstq%XpB3*G1r(>(%@2z*T76M%DY5;VtmK3z#4@HJ!S@T%U7x%@a_ z4gC&qF6o|TYNT$!MYIL*650*eK^efyh29I;PFcF&(;?D2B^?*oPoGkDcoUL7B52>ln`Gj|+P&##%Fs^egM|GAz z?&0*a0>{1gDs{BA+S3}jFLbMjJ$zVY19DFIiHau>)jaP05@2uTGk|Zq zjsYf$m~x_;;V$8M!u55e=S%t#q2DBwPgH#a^ar9`HXHqxt|DG?As#_xfNn%sDsCTY z^#ZE6ivazoU4>_t0G1&(QL*2Q07mgtvEo;N{~SOSzFq}*A^cyZi$G(^oaX(b3Yl{N z{WKRafKw%oht3BqMU2C7Q6pd(PFYy;0>DZ{Ju2d(MS!yq<*V3}UI)I+jdUe`vy%mU z3hA}@X-E>>x6uRiGJT(ZNN-c4x=a02^*uG@>T=!gD$!cB_1cwMzjjFboTiO)q*-|F zLj3D5AYARf3z6@1+EG4gp2oMT{B+vagb$(Z1d@9*pDOlF5t@sW;HJezIl zYXPyXudkI8n}*ZthXy+`gM;yOV)<^H+T7ot%b1hsW^-g+JlDUsJ=Za8nnpUeF_TT^ zl9}}Kfxf;i>HhdoZrC)oq;tvC0g=k$7u(_sWD9A!J{A!Lpv~pURBF}8Ml;iIWV0L0 z?qteXA0ISW5!TfhF!rxD(uNs_c6|fOyIVTC+d8|Kv@ULI>t4F5b8-99*6!A>Rc(vg zR&_3H?QCmp@90?6y|BG?)zYp-7j|59;nMD|)|Sr2Z5=I(yB4-}^!4@TjG;9~JYkq3 zovS%r!G$1R)Ypdx%vI1HrVm^6|0dPCGnt&D+Co}CoJz%ar;Mu>QcqWUco2rLuuW*e zhIDGAcPO6b%#KVdW%P3oG3Mk>p>|z698V>4BWTW0+%(JrnJ_M}O-9Zf!JDCY&KMZk zFvP;LAa6)ZM!PwH`qMck^{h>1b9gRWetln`Q&}(GD5Z?9l)+p!!=xrQzRAcYQ%NJ; zZ=lPE3^O-!xiJDk9li6!;P{1DJe5TS>D;1LT81C$v0p4-0xzXy{h2iXCe6mO*V&1w zJ=99w!|DF3S_y);##6(_#(2^M+S8d7^Tf>&V9Vl8Ygovl>D@e)kbrB`vbAx@-Rm?U zw>h4@W;t?}zzA)$Y+WWXoHCYE??^Uh3^w;{z&^=N=Q|e_Gg59f^b>`1zww#AdV?u^;B zKbf-#%cc*7<%zQhYcB9eR=PbgBe$h7XZ8(d_8IHZy&Z9Qazd2v-3vcW(4KfQh1q7a znH(4}n7|F|O2vn=NZUrFrH&Po=Eg{ znP$dh%WpFJjpRO?YN;@VJcFkc*sr-K+lwyQYi82P>mlU#a9es#DY0renMx20IM|g= z(3BN`F|>&n15S2ka%m&y5c=(msXeeQVL zC!Nj3G3Kp~gS|TN8(SJgAH@d@_Rg;Kz9d@56UWxLndCW+dS@mVOoKe8vqPDzu%jpT z=B$F&5bQwrXCTL3TdV;p8aRs#WznOP$Qf25+G8(Cl*5SUwMk^yQUyl?I>ntb=7k!A;cJs=o8-8tO%qR?^ebT#lBCd4ySZSG zj8RmTGuFlX_c96gn}VYY@|n&whIu$SWTcoM4lMKhBtd4+%_Bo-2JEyd-hWMI&mO@$ z4TKhjgl&5myppoW|43ZsIfIyR>g5$IWUDj;%o&moc*%&voj<;Y!UD($r>RQ8) z(8?k7f@wzrMxs53?-zDsu7dMOa9||ZrSjxXWB2gD0J}q;=B%Z8N_#eI4DL>iY)6?r_y_orOBb%^#W%G2) z;v!`eI(xsQ3i2JTFbopI{keQW$H-8G*Xn%6WJgKVm8UzBxW;&TB%fgq6QSplyAd|z z3Ub*cw`7gpy+$f!uUj%M#cA31t;9Z#036@T8=znz&J%f=+GOxDG*ba3q9$Cv46v!GYg-_uz4?L-~=Kwr-W_RX4{20XLH8- z9Ef^{cW2?zAW85~y}8WLb-WEAL}eI%?4a!TJY{!d_LnrbW?M3y$XvHAnXvK-(d!Db zn02j@9sn1nCNr1amgEAvJ5ovf*eNL;$Z?es-j$QJ8P~aR+$R$07xbCdX)8n+W6|%hPY#gWc zJbQf48FaA3O>*?X29B=Oi@$O~y#DZ3f!ee3NTv}5NveYvW^6Ke!q}X-#z>>Dr&BJ= zB-4}`>Vtn^cOYT3V+l+k_P(QV4>EPp&6}21o0(yRRL(?%x@05i>@ImJ=!U~^90*!A zi3wah1wL8GGxOe*)@O3P!$U(E69HJ){(eKYFxX4*kQvTx*t02~9x(D5>{#7aY?&uw z>c}GrBinB#Eiu*@k?F`xX7Tgop*R9PGtJwkVLWDt$|n0T-(sF*Ix<5en=>;NC=B{+ zE<4Z=EASd1F@=mw%a{dT4b_K-9I*%wu65G+>I-~3PZXU}M%})Cc>2%i+=Fsv-?T@ADZ37MX%kSU@yR-_}?bu{I-F z>2!q3ylKd?gV^o_gqMbO$uvUT?CCy=qnIoq;zT2tFYfE(GX%$Ylk0sm53MZ8q0eM) ze$1bFB0%64Po`%qV$TH*hin(lI3~OH=Zv&$!f73%Ds!ZOU=OY{Y}%c+6liM=E&EIg z$ms`FguajyE9^Pr*QKy6BoiAgEF_#{bIRIdC3%X<62qRf9FbanI^55vO-}U%Zrp5l zjIhD_)nki;utSj(O{SpYIIhq4$u#rXwW z_L+oFpJ^~l$TDM{CeKvDnPb4&Y#%z$#C8V3tkPLZ6$<}7tdkYwJH%SF;Z0{%$cg{{ zz;aX9`rjvfs!(YH){g%dh0a>GP^mwdk&l`-;n;d6>r5Az=j9E+OeH4m?*!jCJ;EeA z6RR~J+4&vuEIgPCaa5U2aRQ5QG9kwv*u-!QoEZiWw#aEj$Pz?4#3V-u*jY~@cI-9! zuW>lCeS72CJd&^?i%A0fZ~BsK9puPpvd(X8!c1ehU@We)4??A&J(U!!FAfFgHBPeM z+H6aK^_lCeWd-}boUuM*?ZvQKnDG&bgoz`g{fHo^yati5vf#Cd*T zqIMQ-RUjJR;9Z^@ur|uJf(a&1+4hvjxSSQu)Tfi(Kh@)Vvd-|DsgUgmXXQDAVD|Dq zMEEqm_Vh^MD+Na>Yo)VRD=QG}#(oKl9}cmtC(BtC&l-~_hSFO&QoRO|OPoY12-Y&~hie(y7RWZQ+H-0Gs9td-^iz-@6G z;dhARhdziG$1Csx7$4420xx&dc+s21tKci?06zH7;x%vs@-MKt_JSiWd?t8yBGm}k zES$|YCzool`E!svh%#A7jUzQAlDXVYyn5b+(ih;XMg01#xKJ{cOx1=Wr^}&{|C;7| zD1(1F=)#)!N@@r%)2%kt;pKKl^h<$*xe~}@E$YxZ%K}!r=0Vp&S#;qhymDWSdplm1 zcjDQN*YR8M0(>*@bx7lLI{X}?56>RpU3dk*1!)Sc0rg_kIS7al5np>Yqc$qa>qh6C zO)qja=RH>7N`b?&qE+-PZAvOe*3 zf-;00w8_OczL~FDHCcO|*r`Xf?u4#g(8Po+llk2T7dt_?qI(&*jm(<~JQ(CpMhi2&-l;XCsjo1sgPxAG% zM+|@_wk+lkXcdf;F>ZMXZdLdRL#bltUyM&R@KK5N=ATZ<2L^;oS{Ii<|f%fnlg2zl$MJiG%5mUxaE)LlUEh+8yp05NO^VN)aIfy8sHtR%B@1(F8{ zc9sXVn4&7dpbpXD@h7-YFf{(Mg}wnkFZf)#6lp;cg1NvfuctgbF$VFRmPX2~Aig1Dg#UYdUavRk^@hf8 z360-||1eh&pK$<(VS+(?4T7IBvG^CoaQFj@_!@9Fx%`S)(uFUyVRrmFF^H?kxYk-z~lC~P$A^1xV@mE7RZ2MpjEKc>+&dED|B|D7lP-wpa;I& z^yuMb>N(-@JH5Ee!{hg;;qfCXKA2(}8zdN-=y9X>C)O2};(JB(=WGgJikiXan=Bxv zsSKAYs%o)F&TLY>_KfHS}}pkJtOi@`dd_$Emk^P@%TmPT5cBdt;dgRJzj6P z6Y4@mNS<(Wca5JAuRVT$m1uo1czB;9L;>J>>AXs%_W>Z}75*NOJ9UV@qL43EDmmY%ppdh3DE_@j1XukwCwMc*HVUiDw> zec}F7U;Fj1>%Zas#%Sc!%k$s3LgNJkb4~zvDehrS4^I?(Y`5~mUG0&Iyp`;|GOBo{ zdK8@FuY%mk*zW=kD|-cJJ;UUaI>;DcQj&X@#rrtt1WIn^#5+i=;R1KM6;_73!Hb~- zh?yr!Zj3!1rs5o^R^(NYN5}>AbF86UMlQ}N=y;UD^ri$=n4QAI(%BO*6;D7gmF2|j zb+f|bzbq1hkF`|)fpJ~*`e%AJXw7w>Akz%uIgw9tz8MBye*t~FYbL*lO{(}cy z3N1T>8hhl!y5+p@t%ELg{m%PE{=@IKR`Vf-Q|ReH%p@j|ac)C`cD6 z_#zY+elg5F1OKrzna|F|*PU3E6?_^xdEGVo_pg$&ZX^5KVcZ+>#}7C1A5*X|E{#uO z5eVYf*vNaWAdgw(BUMh=*QVai-ltxD?}sN-2Rc5{Rol7a#rR7sV*y^Lo7n~Em7!rX zF+8}yG;ngdV6~B1m5N`VG4m<*p**%gUc1cC;azHW!LakzbwOtL)eCG-UVtx(xStl} zZ90_LO}%T{TbC>)TbKTFTNiHcA04beZ_gz+-syhp*uTc`cPpH06{qVQZ0ghbJMk8^ z4+F9@h2tE&xg5;)V{{twBA9be)kDT~vrHBCzu5m!3-E8sJ188lCyp z;NFg$G8uqO;q+p_t<;On@m6e+HzCy{o8~?|*JB&HLHM50-hCf~7HPiuvYsm}gm?+I z)&iS=M<;FtQsdZqb=zCU9&8bLOUc(fDYY57ygklhOBu(8Es5N;b4tDS#~@pV0HfbaSJpj%t;A*o{oE#iX~tO~fcNNp*|n!-QA z0TOSn*P@OADaEZE!Vv&lX#j^0*#2X9b02UW8*DmTkn3>T$Czb}v(;tU(K#@XKG+%NuK}%yf(7?a>Ikw4p6a;2Rf0ev53zTcF)ir1sDvYL(jn*B+#o zAg5n=+R)cag|7{HZQ$B1bTl2m;o$z@Ur_PE%ph`7uuvU5a%#`y_2B;bA9@YR-wmeC NI7a#3>;FFs{3l)AfMNgu From 23f24d2db798264112f16a878ec74bf7cd3fd50d Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Sat, 20 Jun 2026 10:40:34 -0400 Subject: [PATCH 02/12] Build test web app before launch and fail fast when it does not start Root cause of the ubuntu-latest test failure: StartWebApp launches the web app with 'dotnet run --no-build', but nothing in the test pipeline builds the web app (the Automation project does not reference it). On a clean runner the launch had no assembly to run, so the readiness poll timed out after 15 minutes with a misleading 'page not reachable' error. Fixes: - Build the test web app explicitly in StartWebApp before the --no-build launch, applying the same MSBuild properties (incl. ShowScriptDialogs=false). The run's /p: properties are passed after '--' so they reach the app, not a build - hence a dedicated build step rather than dropping --no-build. - Set _webTestProcessId in the non-container path so WaitForHttpResponse detects an early process exit instead of polling to timeout (it was only set in the container path). - Fix WaitForHttpResponse swallowing the non-zero-exit ProcessExitedException: the throw was inside the try and caught by the bare catch. Read ExitCode defensively, throw outside. - Improve the failure messages to point at the WEB_APP_SERVER / WEB_APP_ERROR log output. Co-Authored-By: Claude Opus 4.8 --- .../TestConfig.cs | 59 +++++++++++++++++-- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs b/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs index 85fd401ad..201629c22 100644 --- a/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs +++ b/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs @@ -1327,6 +1327,42 @@ private static async Task StartWebApp(CancellationToken token) ]; } + // The web app is launched below with --no-build, so it must be compiled first. Nothing else in + // the test pipeline builds the test web app - the Automation project does not reference it - so on + // a clean runner (e.g. a hosted CI agent with no prior build output) the --no-build launch would + // have no assembly to run, the process would exit immediately, and the readiness poll would time + // out after 15 minutes with a misleading "page not reachable" error. Build it explicitly here, + // applying the same MSBuild properties the run uses. Note these /p: properties (notably + // ShowScriptDialogs=false, which keeps the ESBuild step from blocking on a dialog in CI) are passed + // after "--" on the run command, so they reach the app rather than the build - hence the dedicated + // build step rather than simply dropping --no-build. + Trace.WriteLine($"Building test app at {TestAppPath} ({_runConfig})...", ProcessName.WEB_APP_SERVER); + + CommandResult buildResult = await Cli.Wrap("dotnet") + .WithArguments([ + "build", TestAppPath, + "-c", _runConfig!, + "/p:GenerateXmlComments=false", + "/p:GeneratePackage=false", + "/p:GenerateDocs=false", + "/p:DebugSymbols=true", + "/p:DebugType=portable", + "/p:UsePackageReferences=false", + "/p:ShowScriptDialogs=false" + ]) + .WithStandardOutputPipe(PipeTarget.ToDelegate(line => Trace.WriteLine(line, ProcessName.WEB_APP_SERVER))) + .WithStandardErrorPipe(PipeTarget.ToDelegate(line => Trace.WriteLine(line, ProcessName.WEB_APP_ERROR))) + .WithWorkingDirectory(ProjectFolder) + .WithValidation(CommandResultValidation.None) + .ExecuteAsync(token, gracefulCts.Token); + + if (buildResult.ExitCode != 0) + { + throw new InvalidOperationException( + $"Failed to build the test web app at {TestAppPath} (exit code {buildResult.ExitCode}). " + + "See the WEB_APP_SERVER / WEB_APP_ERROR output above for the build error."); + } + Trace.WriteLine($"Starting test app: {cmdLineApp} {string.Join(" ", args)}", ProcessName.WEB_APP_SERVER); bool ioExceptionThrown = false; @@ -1352,6 +1388,10 @@ private static async Task StartWebApp(CancellationToken token) .ExecuteAsync(token, gracefulCts.Token); processIds.Add(commandTask.ProcessId); + // Track the web-app process so WaitForHttpResponse can fail fast if it exits before becoming + // reachable, instead of polling for the full timeout. (Previously this was only set in the + // container path, so a crash in the non-container path went undetected until the 15m timeout.) + _webTestProcessId = commandTask.ProcessId; try { @@ -1651,19 +1691,26 @@ private static async Task WaitForHttpResponse() if (testProcess is not null && testProcess.HasExited) { + int? exitCode = null; + try { - int exitCode = testProcess.ExitCode; - - if (exitCode != 0) - { - throw new ProcessExitedException($"Test process exited with code {exitCode}"); - } + exitCode = testProcess.ExitCode; } catch { // ignore - the container building process can exit silently and all is fine } + + // Read ExitCode defensively above, but throw outside the catch so a genuine non-zero + // exit actually propagates. (Previously the throw was inside the try and the bare catch + // swallowed it, so a crashed web app was never surfaced and the poll ran to timeout.) + if (exitCode is not null and not 0) + { + throw new ProcessExitedException( + $"Test web app process exited with code {exitCode} before becoming reachable. " + + "See the WEB_APP_SERVER / WEB_APP_ERROR output above for the cause."); + } } await Task.Delay(1000, Cts.Token); From d65ac8d64059bc80672b1738a732749e2eef2616 Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Sat, 20 Jun 2026 15:00:07 -0400 Subject: [PATCH 03/12] Build test projects in correct config before --no-build launches The previous fix built the web app in Release, but 'dotnet run --no-build' had -c Release only after '--' (an app arg), so it defaulted to Debug and looked in bin/Debug -> 'No such file', never starting -> 15m poll x3 Polly retries (~1h20m). Core unit tests hit the same class of issue: launched with 'dotnet test --no-build' but never built. - Web app run: move -c before '--' so --no-build resolves bin/Release. - Add EnsureTestProjectBuilt: build a test project once, in _runConfig, before its --no-build launch. Used by both StartWebApp and RunUnitTests (fixes CORE_UNIT/PRO_VALIDATION 'No such file or directory'). - Serialize these builds via a semaphore: the web app and unit-test tasks run in parallel, so building concurrently raced on the shared ESBuild lock (AcquireBuildLock exit code 1). - Build-once guard avoids rebuilding on Polly retries. Co-Authored-By: Claude Opus 4.8 --- .../TestConfig.cs | 101 ++++++++++++------ 1 file changed, 68 insertions(+), 33 deletions(-) diff --git a/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs b/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs index 201629c22..f4cf177d1 100644 --- a/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs +++ b/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs @@ -857,6 +857,62 @@ private static async ValueTask LaunchWebTests(ResilienceContext context) } } + // Test projects are launched with --no-build (dotnet run / dotnet test), so they must be compiled + // first. On a clean runner nothing pre-builds them, and the web app and unit-test tasks run in + // parallel, so building concurrently races on the shared ESBuild lock (AcquireBuildLock exits with + // code 1). Serialize builds through a semaphore and build each project at most once per run. + private static readonly SemaphoreSlim _buildSemaphore = new(1, 1); + private static readonly HashSet _builtProjects = []; + + private static async Task EnsureTestProjectBuilt(string projectPath, CancellationToken token) + { + await _buildSemaphore.WaitAsync(token); + + try + { + if (!_builtProjects.Add(projectPath)) + { + // Already built this run (e.g. a Polly retry of the same task). + return; + } + + string projectName = Path.GetFileNameWithoutExtension(projectPath); + Trace.WriteLine($"Building {projectName} ({_runConfig})...", ProcessName.TEST_SETUP); + + CommandResult buildResult = await Cli.Wrap("dotnet") + .WithArguments([ + "build", projectPath, + "-c", _runConfig!, + "/p:GenerateXmlComments=false", + "/p:GeneratePackage=false", + "/p:GenerateDocs=false", + "/p:DebugSymbols=true", + "/p:DebugType=portable", + "/p:UsePackageReferences=false", + "/p:ShowScriptDialogs=false" + ]) + .WithStandardOutputPipe(PipeTarget.ToDelegate(line => Trace.WriteLine(line, ProcessName.TEST_SETUP))) + .WithStandardErrorPipe(PipeTarget.ToDelegate(line => Trace.WriteLine(line, ProcessName.TEST_SETUP))) + .WithWorkingDirectory(ProjectFolder) + .WithValidation(CommandResultValidation.None) + .ExecuteAsync(token, gracefulCts.Token); + + if (buildResult.ExitCode != 0) + { + // Allow a later retry to attempt the build again. + _builtProjects.Remove(projectPath); + + throw new InvalidOperationException( + $"Failed to build {projectName} (exit code {buildResult.ExitCode}). " + + "See the TEST_SETUP output above for the build error."); + } + } + finally + { + _buildSemaphore.Release(); + } + } + private static async ValueTask LaunchUnitTests(ResilienceContext context) { Stopwatch unitTestStopwatch = Stopwatch.StartNew(); @@ -970,6 +1026,11 @@ private static async ValueTask RunUnitTests(ResilienceContext context) _ => throw new ArgumentOutOfRangeException(nameof(processName), processName, null) }; + // dotnet test runs below with --no-build, so the unit-test project must be compiled first. On a + // clean runner nothing else builds it, which previously caused "An error occurred trying to start + // process .../bin/Release/.../*.Test.Unit ... No such file or directory". + await EnsureTestProjectBuilt(testPath, context.CancellationToken); + string cmdLineApp = "dotnet"; List args = @@ -1294,7 +1355,10 @@ private static async Task StartWebApp(CancellationToken token) string[] args = [ - "run", "--no-build", "--project", TestAppPath, + // -c must precede "--" so it sets the run/build configuration: with --no-build, dotnet run + // looks for the app under bin//, and without an explicit -c it defaults to Debug and + // fails to find the Release build produced by EnsureTestProjectBuilt ("No such file"). + "run", "--no-build", "-c", _runConfig!, "--project", TestAppPath, "--urls", $"{TestAppUrl};{TestAppHttpUrl}", "--", "-c", _runConfig!, "/p:GenerateXmlComments=false", @@ -1330,38 +1394,9 @@ private static async Task StartWebApp(CancellationToken token) // The web app is launched below with --no-build, so it must be compiled first. Nothing else in // the test pipeline builds the test web app - the Automation project does not reference it - so on // a clean runner (e.g. a hosted CI agent with no prior build output) the --no-build launch would - // have no assembly to run, the process would exit immediately, and the readiness poll would time - // out after 15 minutes with a misleading "page not reachable" error. Build it explicitly here, - // applying the same MSBuild properties the run uses. Note these /p: properties (notably - // ShowScriptDialogs=false, which keeps the ESBuild step from blocking on a dialog in CI) are passed - // after "--" on the run command, so they reach the app rather than the build - hence the dedicated - // build step rather than simply dropping --no-build. - Trace.WriteLine($"Building test app at {TestAppPath} ({_runConfig})...", ProcessName.WEB_APP_SERVER); - - CommandResult buildResult = await Cli.Wrap("dotnet") - .WithArguments([ - "build", TestAppPath, - "-c", _runConfig!, - "/p:GenerateXmlComments=false", - "/p:GeneratePackage=false", - "/p:GenerateDocs=false", - "/p:DebugSymbols=true", - "/p:DebugType=portable", - "/p:UsePackageReferences=false", - "/p:ShowScriptDialogs=false" - ]) - .WithStandardOutputPipe(PipeTarget.ToDelegate(line => Trace.WriteLine(line, ProcessName.WEB_APP_SERVER))) - .WithStandardErrorPipe(PipeTarget.ToDelegate(line => Trace.WriteLine(line, ProcessName.WEB_APP_ERROR))) - .WithWorkingDirectory(ProjectFolder) - .WithValidation(CommandResultValidation.None) - .ExecuteAsync(token, gracefulCts.Token); - - if (buildResult.ExitCode != 0) - { - throw new InvalidOperationException( - $"Failed to build the test web app at {TestAppPath} (exit code {buildResult.ExitCode}). " - + "See the WEB_APP_SERVER / WEB_APP_ERROR output above for the build error."); - } + // have no assembly to run. Build it once, up front. (See EnsureTestProjectBuilt for why builds are + // serialized.) + await EnsureTestProjectBuilt(TestAppPath, token); Trace.WriteLine($"Starting test app: {cmdLineApp} {string.Join(" ", args)}", ProcessName.WEB_APP_SERVER); From 81b32a4cdcbcac39ce8f2442426300a413479f6d Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Sat, 20 Jun 2026 16:10:39 -0400 Subject: [PATCH 04/12] Surface web test failures and inject ArcGIS API key into test web app After the build/launch fixes, all 405 web tests ran but failed, and the cause was invisible: the FINAL_SUMMARY 'FAILED TEST DETAILS' section was blank. Diagnostics: - GeoBlazorTestClass: capture the actual exception (type/message/stack) for a failed web test, not just browser console text (which is empty when the page fails before logging). - TestConfig summary: replace the hard Substring(26) - which threw on short messages like 'Test Failed' and, with no catch in AssemblyCleanup, aborted the whole details section - with a guarded prefix strip, wrapped in try/catch so one bad entry can't blank the report. Likely root cause fix: - Inject the ArcGIS API key into the launched web app as the 'ArcGISApiKey' env var (ASP.NET maps it onto the config key, overriding the appsettings.Development.json placeholder). CI provides ARCGIS_API_KEY but nothing plumbed it into the web app; only the license was injected. Co-Authored-By: Claude Opus 4.8 --- .../GeoBlazorTestClass.cs | 20 +++++++-- .../TestConfig.cs | 42 ++++++++++++++++--- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/test/dymaptic.GeoBlazor.Core.Test.Automation/GeoBlazorTestClass.cs b/test/dymaptic.GeoBlazor.Core.Test.Automation/GeoBlazorTestClass.cs index 4196521a1..67d05389b 100644 --- a/test/dymaptic.GeoBlazor.Core.Test.Automation/GeoBlazorTestClass.cs +++ b/test/dymaptic.GeoBlazor.Core.Test.Automation/GeoBlazorTestClass.cs @@ -207,9 +207,23 @@ await _retryPipeline.ExecuteAsync(async ctx => Trace.WriteLine(messages, ProcessName.WEB_TEST); Trace.WriteLine(errors, ProcessName.WEB_TEST_ERROR); - TestConfig.FailedTests[ProcessName.WEB_TEST][testName] = $"{messages}{Environment.NewLine}{errors}"; - - Assert.Fail($"{testName} Failed: {errors}"); + // Capture the actual exception (Playwright timeout, assertion, navigation error, etc.) - not + // just browser console text, which is empty when the page fails before logging anything. Without + // this the FINAL_SUMMARY failure details were blank and the real cause was invisible. + string failureDetail = $"{ex.GetType().Name}: {ex.Message}"; + if (!string.IsNullOrWhiteSpace(messages)) + { + failureDetail += $"{Environment.NewLine}Console: {messages}"; + } + if (!string.IsNullOrWhiteSpace(errors)) + { + failureDetail += $"{Environment.NewLine}Errors: {errors}"; + } + failureDetail += $"{Environment.NewLine}{ex.StackTrace}"; + + TestConfig.FailedTests[ProcessName.WEB_TEST][testName] = failureDetail; + + Assert.Fail($"{testName} Failed: {ex.Message}"); } finally { diff --git a/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs b/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs index f4cf177d1..482b85c5c 100644 --- a/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs +++ b/test/dymaptic.GeoBlazor.Core.Test.Automation/TestConfig.cs @@ -526,15 +526,37 @@ public static async Task AssemblyCleanup() Trace.WriteLine("------------", ProcessName.FINAL_SUMMARY); } - // trim off extra timestamp from web browser and split lines - string[] errorLines = failedTest.Value.Substring(26).Split(Environment.NewLine); - Trace.WriteLine($" {testCategory} - {failedTest.Key}", ProcessName.FINAL_SUMMARY); - foreach (string errorLine in errorLines) + try + { + // Trim off the optional "[timestamp] " prefix the browser logging prepends, but + // only when present. A hard Substring(26) previously threw on short messages + // (e.g. "Test Failed"), and because the enclosing block has no catch it aborted + // the entire FAILED TEST DETAILS section, leaving it blank. + string rawError = failedTest.Value ?? string.Empty; + string trimmedError = rawError; + + if (rawError.StartsWith('[')) + { + int closeIndex = rawError.IndexOf("] ", StringComparison.Ordinal); + + if (closeIndex >= 0) + { + trimmedError = rawError[(closeIndex + 2)..]; + } + } + + foreach (string errorLine in trimmedError.Split(Environment.NewLine)) + { + Trace.WriteLine($" {errorLine}", ProcessName.FINAL_SUMMARY); + } + } + catch (Exception ex) { - Trace.WriteLine($" {errorLine}", ProcessName.FINAL_SUMMARY); + Trace.WriteLine($" (could not format failure detail: {ex.Message})", + ProcessName.FINAL_SUMMARY); } } } @@ -1351,6 +1373,13 @@ private static async Task StartWebApp(CancellationToken token) EnsureGeoBlazorLicenseKeyInUserSecrets(TestAppPath, licenseKey); } + // The web app reads the ArcGIS API key from configuration key "ArcGISApiKey"; without it the basemap + // never loads and the render tests fail. CI provides it as the ARCGIS_API_KEY env var, but nothing + // injected it into the web app (only the license was), so the app fell back to the placeholder in + // appsettings.Development.json. Pass it through as the "ArcGISApiKey" env var, which ASP.NET maps onto + // that config key and which overrides appsettings regardless of environment. + string? apiKey = Configuration["ARCGIS_API_KEY"]; + string cmdLineApp = "dotnet"; string[] args = @@ -1420,6 +1449,9 @@ private static async Task StartWebApp(CancellationToken token) .WithStandardErrorPipe(PipeTarget.ToDelegate(line => Trace.WriteLine(line, ProcessName.WEB_APP_ERROR))) .WithWorkingDirectory(ProjectFolder) + .WithEnvironmentVariables(apiKey is null + ? new Dictionary() + : new Dictionary { ["ArcGISApiKey"] = apiKey }) .ExecuteAsync(token, gracefulCts.Token); processIds.Add(commandTask.ProcessId); From 16868dbc6f4407674c67a36039d203a7384e70b6 Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Sat, 20 Jun 2026 16:52:33 -0400 Subject: [PATCH 05/12] Avoid enum reflection when building test URL (BadImageFormatException) With per-test errors now visible, all 405 web tests were failing identically: BuildTestUrl interpolated the BlazorMode enum, and Enum.ToString -> EnumInfo.Create threw BadImageFormatException / CLDB_E_INDEX_NOTFOUND (corrupt enum name metadata in the automation process) on every test. Map the enum to its name via a switch of nameof constants, which compiles to integer comparisons and needs no reflection metadata. Co-Authored-By: Claude Opus 4.8 --- .../GeoBlazorTestClass.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/test/dymaptic.GeoBlazor.Core.Test.Automation/GeoBlazorTestClass.cs b/test/dymaptic.GeoBlazor.Core.Test.Automation/GeoBlazorTestClass.cs index 67d05389b..b83d8e32d 100644 --- a/test/dymaptic.GeoBlazor.Core.Test.Automation/GeoBlazorTestClass.cs +++ b/test/dymaptic.GeoBlazor.Core.Test.Automation/GeoBlazorTestClass.cs @@ -234,8 +234,20 @@ await _retryPipeline.ExecuteAsync(async ctx => private string BuildTestUrl(string testName) { + // Map the enum to its name via a switch of compile-time nameof constants rather than interpolating + // the enum directly. Interpolation calls Enum.ToString -> EnumInfo.Create, which on every test was + // throwing BadImageFormatException/CLDB_E_INDEX_NOTFOUND (corrupt enum name metadata in this process). + // A switch on enum constants compiles to integer comparisons and needs no reflection metadata. + string renderMode = TestConfig.RenderMode switch + { + BlazorMode.Server => nameof(BlazorMode.Server), + BlazorMode.WebAssembly => nameof(BlazorMode.WebAssembly), + BlazorMode.Hybrid => nameof(BlazorMode.Hybrid), + _ => ((int)TestConfig.RenderMode).ToString() + }; + return $"{TestConfig.TestAppUrl}?testFilter={testName}&renderMode={ - TestConfig.RenderMode}{(TestConfig.ProOnly ? "&proOnly" : "")}{(TestConfig.CoreOnly ? "&coreOnly" : "")}"; + renderMode}{(TestConfig.ProOnly ? "&proOnly" : "")}{(TestConfig.CoreOnly ? "&coreOnly" : "")}"; } private async Task Setup() From ca9299feac065e004d4d91f3bc1eb998a31e1346 Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Mon, 22 Jun 2026 14:38:53 -0500 Subject: [PATCH 06/12] Fix for geometry engine failures --- .../Scripts/arcGisJsInterop.ts | 2 +- .../Serialization/GeometryConverter.cs | 59 ++++++++++++------- .../Components/WebMapTests.razor | 1 + 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/arcGisJsInterop.ts b/src/dymaptic.GeoBlazor.Core/Scripts/arcGisJsInterop.ts index 942cb3d45..1320f3904 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/arcGisJsInterop.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/arcGisJsInterop.ts @@ -125,7 +125,7 @@ export let queryLayer: FeatureLayer; export let blazorServer: boolean = false; export let ProtoGraphicCollection; export let ProtoViewHitCollection; -export let geometryEngine: GeometryEngineWrapper = new GeometryEngineWrapper(false); +export let geometryEngine: GeometryEngineWrapper = new GeometryEngineWrapper(true); export let projectionEngine: ProjectionWrapper = new ProjectionWrapper(false); // region module variables diff --git a/src/dymaptic.GeoBlazor.Core/Serialization/GeometryConverter.cs b/src/dymaptic.GeoBlazor.Core/Serialization/GeometryConverter.cs index 6af3370b4..e7fc4929e 100644 --- a/src/dymaptic.GeoBlazor.Core/Serialization/GeometryConverter.cs +++ b/src/dymaptic.GeoBlazor.Core/Serialization/GeometryConverter.cs @@ -17,52 +17,69 @@ internal class GeometryConverter : JsonConverter return null; } + Geometry? geometry = null; + if (temp.TryGetValue("type", out object? typeValue)) { switch (typeValue?.ToString()) { case "extent": - return JsonSerializer.Deserialize(ref cloneReader, newOptions); + geometry = JsonSerializer.Deserialize(ref cloneReader, newOptions); + break; case "point": - return JsonSerializer.Deserialize(ref cloneReader, newOptions); + geometry = JsonSerializer.Deserialize(ref cloneReader, newOptions); + break; case "polygon": - return JsonSerializer.Deserialize(ref cloneReader, newOptions); + geometry = JsonSerializer.Deserialize(ref cloneReader, newOptions); + break; case "polyline": - return JsonSerializer.Deserialize(ref cloneReader, newOptions); + geometry = JsonSerializer.Deserialize(ref cloneReader, newOptions); + break; case "multipoint": // multipoint is in GeoBlazor Pro and must be loaded via Reflection Type? multipointType = Type.GetType("dymaptic.GeoBlazor.Pro.Components.Geometries.Multipoint, " + "dymaptic.GeoBlazor.Pro"); if (multipointType is not null) { - return (Geometry?)JsonSerializer.Deserialize(ref cloneReader, multipointType, newOptions); + geometry = (Geometry?)JsonSerializer.Deserialize(ref cloneReader, multipointType, newOptions); } - return null; + break; } } - if (temp.ContainsKey("rings")) - { - return JsonSerializer.Deserialize(ref cloneReader, newOptions); - } - - if (temp.ContainsKey("paths")) + if (geometry is null) { - return JsonSerializer.Deserialize(ref cloneReader, newOptions); - } - - if (temp.ContainsKey("latitude") || temp.ContainsKey("x")) - { - return JsonSerializer.Deserialize(ref cloneReader, newOptions); + if (temp.ContainsKey("rings")) + { + geometry = JsonSerializer.Deserialize(ref cloneReader, newOptions); + } + else if (temp.ContainsKey("paths")) + { + geometry = JsonSerializer.Deserialize(ref cloneReader, newOptions); + } + else if (temp.ContainsKey("latitude") || temp.ContainsKey("x")) + { + geometry = JsonSerializer.Deserialize(ref cloneReader, newOptions); + } + else if (temp.ContainsKey("xmax")) + { + geometry = JsonSerializer.Deserialize(ref cloneReader, newOptions); + } } - if (temp.ContainsKey("xmax")) + // Operator results (e.g. Union) send a computed `extent`, but deserializing the concrete + // geometry type does not carry the nested Extent through; populate it explicitly so callers + // (e.g. map.GoTo(extent)) get a usable Extent. + if (geometry is not null and not Extent + && geometry.Extent is null + && temp.TryGetValue("extent", out object? extentValue) + && extentValue is JsonElement { ValueKind: JsonValueKind.Object } extentElement) { - return JsonSerializer.Deserialize(ref cloneReader, newOptions); + geometry.Extent = extentElement.Deserialize(newOptions); } - return null; + return geometry; } public override void Write(Utf8JsonWriter writer, Geometry value, JsonSerializerOptions options) diff --git a/test/dymaptic.GeoBlazor.Core.Test.Blazor.Shared/Components/WebMapTests.razor b/test/dymaptic.GeoBlazor.Core.Test.Blazor.Shared/Components/WebMapTests.razor index e073d32c7..1fea007d7 100644 --- a/test/dymaptic.GeoBlazor.Core.Test.Blazor.Shared/Components/WebMapTests.razor +++ b/test/dymaptic.GeoBlazor.Core.Test.Blazor.Shared/Components/WebMapTests.razor @@ -49,6 +49,7 @@ } } + [CICondition(ConditionMode.Exclude)] [TestMethod] public async Task TestDymapticEnterpriseWebMaps(Action renderHandler) { From f22424fdf3f2a7173e53c88ac17bd2b068b79bac Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Mon, 22 Jun 2026 14:53:30 -0500 Subject: [PATCH 07/12] fix for setLayer in Widgets --- .../Components/MapComponent.razor.cs | 87 +++++++++++++++++++ .../Scripts/baseComponent.ts | 21 +++++ .../Scripts/cSVLayerView.gb.ts | 9 -- .../Scripts/featureLayerView.gb.ts | 9 -- .../Scripts/geoJSONLayerView.gb.ts | 9 -- .../Scripts/geoRSSLayerView.gb.ts | 11 --- .../Scripts/graphicsLayerView.gb.ts | 9 -- .../Scripts/imageryLayerView.gb.ts | 9 -- .../Scripts/imageryTileLayerView.gb.ts | 11 --- .../Scripts/kMLLayerView.gb.ts | 9 -- .../Scripts/listItem.gb.ts | 14 --- .../Scripts/sublayer.gb.ts | 13 --- .../Scripts/wFSLayerView.gb.ts | 12 +-- 13 files changed, 109 insertions(+), 114 deletions(-) diff --git a/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs b/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs index 81c9c5ee0..ab8fff9f8 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs @@ -494,6 +494,93 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, return currentValue; } } + + /// + /// Asynchronously retrieve the current value of the Layer property. + /// + [CodeGenerationIgnore] + public async Task GetLayer() + { + if (CoreJsModule is null) + { + return Layer; + } + + try + { + JsComponentReference ??= await CoreJsModule.InvokeAsync( + "getJsComponent", CancellationTokenSource.Token, Id); + } + catch (JSException) + { + // this is expected if the component is not yet built + } + + if (JsComponentReference is null) + { + return Layer; + } + + Layer? result = + await JsComponentReference.InvokeAsync("getLayer", CancellationTokenSource.Token); + + if (result is not null) + { + if (Layer is not null) + { + result.Id = Layer.Id; + } + +#pragma warning disable BL0005 + Layer = result; +#pragma warning restore BL0005 + ModifiedParameters[nameof(Layer)] = Layer; + } + + return Layer; + } + + /// + /// Asynchronously set the value of the Layer property after render. + /// + /// + /// The value to set. + /// + public virtual async Task SetLayer(GraphicsLayer? value) + { + if (value is not null) + { + value.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); + } + +#pragma warning disable BL0005 + Layer = value; +#pragma warning restore BL0005 + ModifiedParameters[nameof(Layer)] = value; + + if (CoreJsModule is null) + { + return; + } + + try + { + JsComponentReference ??= await CoreJsModule.InvokeAsync( + "getJsComponent", CancellationTokenSource.Token, Id); + } + catch (JSException) + { + // this is expected if the component is not yet built + } + + if (JsComponentReference is null) + { + return; + } + + await JsComponentReference.InvokeVoidAsync("setLayer", + CancellationTokenSource.Token, value); + } /// /// Called from to "Register" the current component with its parent. diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/baseComponent.ts b/src/dymaptic.GeoBlazor.Core/Scripts/baseComponent.ts index abf1eae12..0cff47c89 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/baseComponent.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/baseComponent.ts @@ -30,6 +30,27 @@ export default class BaseComponent implements IPropertyWrapper { getProperty(prop: string) { return this.component[prop]; } + + async setLayer(value: any): Promise { + if (this.component.hasOwnProperty('layer')) { + let { buildJsGraphicsLayer } = await import('./graphicsLayer'); + this.component.layer = await buildJsGraphicsLayer(value, this.layerId, this.viewId); + } + } + + async getLayer(): Promise { + if (hasValue(this.component.loadStatus) && this.component.loadStatus === 'not-loaded') { + await this.component.load(); + } + + if (!hasValue(this.component.layer)) { + return null; + } + + let { buildDotNetLayer } = await import('./layer'); + return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); + } + unwrap() { return this.component; } diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/cSVLayerView.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/cSVLayerView.gb.ts index 961c9874f..351acf06f 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/cSVLayerView.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/cSVLayerView.gb.ts @@ -171,15 +171,6 @@ export default class CSVLayerViewGenerated extends BaseComponent { this.component.highlightOptions = await buildJsHighlightOptions(value); } - async getLayer(): Promise { - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetLayer } = await import('./layer'); - return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); - } - } diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/featureLayerView.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/featureLayerView.gb.ts index 53f5e8055..825e5298f 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/featureLayerView.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/featureLayerView.gb.ts @@ -109,15 +109,6 @@ export default class FeatureLayerViewGenerated extends BaseComponent { this.component.highlightOptions = await buildJsHighlightOptions(value); } - async getLayer(): Promise { - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetFeatureLayer } = await import('./featureLayer'); - return await buildDotNetFeatureLayer(this.component.layer, this.layerId, this.viewId); - } - } diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/geoJSONLayerView.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/geoJSONLayerView.gb.ts index 6726aca77..7052564da 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/geoJSONLayerView.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/geoJSONLayerView.gb.ts @@ -171,15 +171,6 @@ export default class GeoJSONLayerViewGenerated extends BaseComponent { this.component.highlightOptions = await buildJsHighlightOptions(value); } - async getLayer(): Promise { - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetLayer } = await import('./layer'); - return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); - } - } diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/geoRSSLayerView.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/geoRSSLayerView.gb.ts index 5daceac95..767f1b009 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/geoRSSLayerView.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/geoRSSLayerView.gb.ts @@ -40,17 +40,6 @@ export default class GeoRSSLayerViewGenerated extends BaseComponent { return await this.component.when(callback, errback); } - - // region properties - - async getLayer(): Promise { - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetLayer } = await import('./layer'); - return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); - } } diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/graphicsLayerView.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/graphicsLayerView.gb.ts index e613b22d4..317687b0c 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/graphicsLayerView.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/graphicsLayerView.gb.ts @@ -73,15 +73,6 @@ export default class GraphicsLayerViewGenerated extends BaseComponent { this.component.highlightOptions = await buildJsHighlightOptions(value); } - async getLayer(): Promise { - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetLayer } = await import('./layer'); - return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); - } - } diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/imageryLayerView.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/imageryLayerView.gb.ts index 6903c2db8..dc77063a2 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/imageryLayerView.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/imageryLayerView.gb.ts @@ -77,15 +77,6 @@ export default class ImageryLayerViewGenerated extends BaseComponent { this.component.highlightOptions = await buildJsHighlightOptions(value); } - async getLayer(): Promise { - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetLayer } = await import('./layer'); - return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); - } - async getPixelData(): Promise { if (!hasValue(this.component.pixelData)) { return null; diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/imageryTileLayerView.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/imageryTileLayerView.gb.ts index 3d16accdf..3b11ee233 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/imageryTileLayerView.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/imageryTileLayerView.gb.ts @@ -45,17 +45,6 @@ export default class ImageryTileLayerViewGenerated extends BaseComponent { errback); } - // region properties - - async getLayer(): Promise { - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetLayer } = await import('./layer'); - return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); - } - } diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/kMLLayerView.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/kMLLayerView.gb.ts index 238aec05d..452fb155d 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/kMLLayerView.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/kMLLayerView.gb.ts @@ -79,15 +79,6 @@ export default class KMLLayerViewGenerated extends BaseComponent { return this.component.allVisiblePolylines!.map(i => buildDotNetGraphic(i, this.layerId, this.viewId)); } - async getLayer(): Promise { - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetLayer } = await import('./layer'); - return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); - } - } diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/listItem.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/listItem.gb.ts index 6f348cd0f..0ca79e82a 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/listItem.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/listItem.gb.ts @@ -87,20 +87,6 @@ export default class ListItemGenerated extends BaseComponent { this.component.children = await Promise.all(value.map(async i => await buildJsListItem(i, this.layerId, this.viewId))) as any; } - async getLayer(): Promise { - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetLayer } = await import('./layer'); - return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); - } - - async setLayer(value: any): Promise { - let { buildJsLayer } = await import('./layer'); - this.component.layer = await buildJsLayer(value, this.layerId, this.viewId); - } - async getLayerView(): Promise { if (!hasValue(this.component.layerView)) { return null; diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/sublayer.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/sublayer.gb.ts index ee528e74a..784c703f0 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/sublayer.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/sublayer.gb.ts @@ -286,19 +286,6 @@ export default class SublayerGenerated extends BaseComponent { this.component.labelingInfo = await Promise.all(value.map(async i => await buildJsLabel(i, this.layerId, this.viewId))) as any; } - async getLayer(): Promise { - if (this.component.loadStatus === 'not-loaded') { - await this.component.load(); - } - - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetLayer } = await import('./layer'); - return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); - } - async getObjectIdField(): Promise { if (this.component.loadStatus === 'not-loaded') { await this.component.load(); diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/wFSLayerView.gb.ts b/src/dymaptic.GeoBlazor.Core/Scripts/wFSLayerView.gb.ts index facd281f4..92bce80e2 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/wFSLayerView.gb.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/wFSLayerView.gb.ts @@ -169,17 +169,7 @@ export default class WFSLayerViewGenerated extends BaseComponent { async setHighlightOptions(value: any): Promise { let { buildJsHighlightOptions } = await import('./highlightOptions'); this.component.highlightOptions = await buildJsHighlightOptions(value); - } - - async getLayer(): Promise { - if (!hasValue(this.component.layer)) { - return null; - } - - let { buildDotNetLayer } = await import('./layer'); - return await buildDotNetLayer(this.component.layer, this.layerId, this.viewId); - } - + } } From 43a4b73bd56511fb8f1c5bdc284db5348c190eb3 Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Mon, 22 Jun 2026 15:35:46 -0500 Subject: [PATCH 08/12] Resolve GetLayer base-class collisions and add layer-sync trigger - Make MapComponent.GetLayer virtual and add the missing UpdateGeoBlazorReferences call so it matches the per-component versions being consolidated. - Remove the now-redundant generated GetLayer() overrides from inherited components (base provides them); keep Graphic.GetLayer as an override since it returns Parent rather than querying JS. - Add a one-shot SetLayer trigger to MapComponent.OnAfterRenderAsync so a layer added to the map after a component is built (id-binding pattern) is pushed to JS. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Components/ActiveLayerInfo.gb.cs | 44 ------------------- .../FeatureSnappingLayerSource.gb.cs | 44 ------------------- .../Components/Graphic.cs | 2 +- .../Components/LayerSearchSource.gb.cs | 44 ------------------- .../Components/LegendLayerInfos.gb.cs | 44 ------------------- .../Components/LegendViewModelLayerInfo.gb.cs | 38 ---------------- .../LegendViewModelLayerInfos.gb.cs | 44 ------------------- .../Components/ListItem.gb.cs | 44 ------------------- .../Components/MapComponent.razor.cs | 15 ++++++- 9 files changed, 15 insertions(+), 304 deletions(-) diff --git a/src/dymaptic.GeoBlazor.Core/Components/ActiveLayerInfo.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/ActiveLayerInfo.gb.cs index b6e2ab9f5..ab927f7e3 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/ActiveLayerInfo.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/ActiveLayerInfo.gb.cs @@ -286,50 +286,6 @@ public ActiveLayerInfo( return IsScaleDriven; } - /// - /// Asynchronously retrieve the current value of the Layer property. - /// - public async Task GetLayer() - { - if (CoreJsModule is null) - { - return Layer; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return Layer; - } - - Layer? result = await JsComponentReference.InvokeAsync( - "getLayer", CancellationTokenSource.Token); - - if (result is not null) - { - if (Layer is not null) - { - result.Id = Layer.Id; - } - result.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - -#pragma warning disable BL0005 - Layer = result; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = Layer; - } - - return Layer; - } /// /// Asynchronously retrieve the current value of the LayerView property. diff --git a/src/dymaptic.GeoBlazor.Core/Components/FeatureSnappingLayerSource.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/FeatureSnappingLayerSource.gb.cs index f5f8bc33c..e7ca0fff0 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/FeatureSnappingLayerSource.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/FeatureSnappingLayerSource.gb.cs @@ -99,50 +99,6 @@ public FeatureSnappingLayerSource( return Enabled; } - /// - /// Asynchronously retrieve the current value of the Layer property. - /// - public async Task GetLayer() - { - if (CoreJsModule is null) - { - return Layer; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return Layer; - } - - Layer? result = await JsComponentReference.InvokeAsync( - "getLayer", CancellationTokenSource.Token); - - if (result is not null) - { - if (Layer is not null) - { - result.Id = Layer.Id; - } - result.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - -#pragma warning disable BL0005 - Layer = result; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = Layer; - } - - return Layer; - } #endregion diff --git a/src/dymaptic.GeoBlazor.Core/Components/Graphic.cs b/src/dymaptic.GeoBlazor.Core/Components/Graphic.cs index 8c5e21c29..90e482011 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/Graphic.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/Graphic.cs @@ -196,7 +196,7 @@ public Graphic( /// Retrieves the from the rendered graphic. /// [CodeGenerationIgnore] - public Task GetLayer() + public override Task GetLayer() { return Task.FromResult(Parent as Layer); } diff --git a/src/dymaptic.GeoBlazor.Core/Components/LayerSearchSource.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/LayerSearchSource.gb.cs index 4770ff324..9214228f8 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/LayerSearchSource.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/LayerSearchSource.gb.cs @@ -335,50 +335,6 @@ public LayerSearchSource( return ExactMatch; } - /// - /// Asynchronously retrieve the current value of the Layer property. - /// - public async Task GetLayer() - { - if (CoreJsModule is null) - { - return Layer; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return Layer; - } - - Layer? result = await JsComponentReference.InvokeAsync( - "getLayer", CancellationTokenSource.Token); - - if (result is not null) - { - if (Layer is not null) - { - result.Id = Layer.Id; - } - result.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - -#pragma warning disable BL0005 - Layer = result; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = Layer; - } - - return Layer; - } /// /// Asynchronously retrieve the current value of the Name property. diff --git a/src/dymaptic.GeoBlazor.Core/Components/LegendLayerInfos.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/LegendLayerInfos.gb.cs index fcce3af86..cf64172ed 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/LegendLayerInfos.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/LegendLayerInfos.gb.cs @@ -37,50 +37,6 @@ public partial class LegendLayerInfos : MapComponent #region Property Getters - /// - /// Asynchronously retrieve the current value of the Layer property. - /// - public async Task GetLayer() - { - if (CoreJsModule is null) - { - return Layer; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return Layer; - } - - Layer? result = await JsComponentReference.InvokeAsync( - "getLayer", CancellationTokenSource.Token); - - if (result is not null) - { - if (Layer is not null) - { - result.Id = Layer.Id; - } - result.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - -#pragma warning disable BL0005 - Layer = result; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = Layer; - } - - return Layer; - } /// /// Asynchronously retrieve the current value of the SublayerIds property. diff --git a/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfo.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfo.gb.cs index fd4ec2b20..5ab13f20a 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfo.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfo.gb.cs @@ -66,44 +66,6 @@ public LegendViewModelLayerInfo( #region Property Getters - /// - /// Asynchronously retrieve the current value of the Layer property. - /// - public async Task GetLayer() - { - if (CoreJsModule is null) - { - return Layer; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return Layer; - } - - // get the property value - Layer? result = await JsComponentReference!.InvokeAsync("getProperty", - CancellationTokenSource.Token, "layer"); - if (result is not null) - { -#pragma warning disable BL0005 - Layer = result; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = Layer; - } - - return Layer; - } /// /// Asynchronously retrieve the current value of the SublayerIds property. diff --git a/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfos.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfos.gb.cs index 7e7e23bf0..df89d553e 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfos.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfos.gb.cs @@ -58,50 +58,6 @@ public LegendViewModelLayerInfos( #region Property Getters - /// - /// Asynchronously retrieve the current value of the Layer property. - /// - public async Task GetLayer() - { - if (CoreJsModule is null) - { - return Layer; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return Layer; - } - - Layer? result = await JsComponentReference.InvokeAsync( - "getLayer", CancellationTokenSource.Token); - - if (result is not null) - { - if (Layer is not null) - { - result.Id = Layer.Id; - } - result.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - -#pragma warning disable BL0005 - Layer = result; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = Layer; - } - - return Layer; - } /// /// Asynchronously retrieve the current value of the Title property. diff --git a/src/dymaptic.GeoBlazor.Core/Components/ListItem.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/ListItem.gb.cs index 12dee0527..c367d0b54 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/ListItem.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/ListItem.gb.cs @@ -502,50 +502,6 @@ public ListItem() return Incompatible; } - /// - /// Asynchronously retrieve the current value of the Layer property. - /// - public async Task GetLayer() - { - if (CoreJsModule is null) - { - return Layer; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return Layer; - } - - Layer? result = await JsComponentReference.InvokeAsync( - "getLayer", CancellationTokenSource.Token); - - if (result is not null) - { - if (Layer is not null) - { - result.Id = Layer.Id; - } - result.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - -#pragma warning disable BL0005 - Layer = result; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = Layer; - } - - return Layer; - } /// /// Asynchronously retrieve the current value of the LayerView property. diff --git a/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs b/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs index ab8fff9f8..e42ff1790 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs @@ -499,7 +499,7 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, /// Asynchronously retrieve the current value of the Layer property. /// [CodeGenerationIgnore] - public async Task GetLayer() + public virtual async Task GetLayer() { if (CoreJsModule is null) { @@ -531,6 +531,8 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, result.Id = Layer.Id; } + result.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); + #pragma warning disable BL0005 Layer = result; #pragma warning restore BL0005 @@ -1110,9 +1112,20 @@ protected override async Task OnAfterRenderAsync(bool firstRender) AbortManager ??= new AbortManager(CoreJsModule); } + // A Layer can be resolved after this component's JS object was built (e.g. a layer added to + // the map after render and bound by id). buildJs* could not bind it then, so push the + // resolved layer to the JS component once it exists. + if (!_layerSyncedToJs && Layer is GraphicsLayer graphicsLayer && JsComponentReference is not null) + { + _layerSyncedToJs = true; + await SetLayer(graphicsLayer); + } + IsRenderedBlazorComponent = true; } + private bool _layerSyncedToJs; + /// /// Tells the to completely re-render. /// From 1729bf9ce51ae0cc0e17e869b0c22681bb557b3b Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Mon, 22 Jun 2026 15:42:41 -0500 Subject: [PATCH 09/12] Bump CoreVersion to 4.6.0 for release Co-Authored-By: Claude Opus 4.8 (1M context) --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 698713f3b..b13101a72 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -6,7 +6,7 @@ enable enable true - 4.5.3 + 4.6.0 Debug;Release;SourceGen Highlighting AnyCPU true From 0909150b6b7e307564a0f67e5eecce7d7c7c3435 Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Mon, 22 Jun 2026 17:09:14 -0500 Subject: [PATCH 10/12] PR feedback --- .../Components/MapComponent.razor.cs | 2 +- src/dymaptic.GeoBlazor.Core/Scripts/baseComponent.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs b/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs index e42ff1790..260d6cd25 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs @@ -548,7 +548,7 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, /// /// The value to set. /// - public virtual async Task SetLayer(GraphicsLayer? value) + public virtual async Task SetLayer(Layer? value) { if (value is not null) { diff --git a/src/dymaptic.GeoBlazor.Core/Scripts/baseComponent.ts b/src/dymaptic.GeoBlazor.Core/Scripts/baseComponent.ts index 0cff47c89..ffd0dc5cc 100644 --- a/src/dymaptic.GeoBlazor.Core/Scripts/baseComponent.ts +++ b/src/dymaptic.GeoBlazor.Core/Scripts/baseComponent.ts @@ -32,9 +32,9 @@ export default class BaseComponent implements IPropertyWrapper { } async setLayer(value: any): Promise { - if (this.component.hasOwnProperty('layer')) { - let { buildJsGraphicsLayer } = await import('./graphicsLayer'); - this.component.layer = await buildJsGraphicsLayer(value, this.layerId, this.viewId); + if ('layer' in this.component) { + let { buildJsLayer } = await import('./layer'); + this.component.layer = await buildJsLayer(value, this.layerId, this.viewId); } } From fa5ee35b84a672a975b9711e803c222f8a96de86 Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Mon, 22 Jun 2026 17:09:59 -0500 Subject: [PATCH 11/12] PR feedback --- src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs b/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs index 260d6cd25..95f68aad5 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/MapComponent.razor.cs @@ -1115,7 +1115,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) // A Layer can be resolved after this component's JS object was built (e.g. a layer added to // the map after render and bound by id). buildJs* could not bind it then, so push the // resolved layer to the JS component once it exists. - if (!_layerSyncedToJs && Layer is GraphicsLayer graphicsLayer && JsComponentReference is not null) + if (!_layerSyncedToJs && Layer is {} graphicsLayer && JsComponentReference is not null) { _layerSyncedToJs = true; await SetLayer(graphicsLayer); From 0f36533211d4ca0d67eb4131a9c9225d85814ef5 Mon Sep 17 00:00:00 2001 From: Tim Purdum Date: Mon, 22 Jun 2026 18:12:36 -0500 Subject: [PATCH 12/12] fix for absolute paths in build tools, remove overrides of SetLayer --- build-tools/build-scripts/ScriptBuilder.cs | 51 ++++++++++++++++++- .../build-scripts/runtimeconfig.template.json | 8 --- .../Components/ActiveLayerInfo.gb.cs | 42 --------------- .../Components/LayerSearchSource.gb.cs | 42 --------------- .../Components/LegendLayerInfos.gb.cs | 42 --------------- .../Components/LegendViewModelLayerInfo.gb.cs | 37 -------------- .../LegendViewModelLayerInfos.gb.cs | 42 --------------- .../Components/ListItem.gb.cs | 42 --------------- 8 files changed, 50 insertions(+), 256 deletions(-) delete mode 100644 build-tools/build-scripts/runtimeconfig.template.json diff --git a/build-tools/build-scripts/ScriptBuilder.cs b/build-tools/build-scripts/ScriptBuilder.cs index c6bf79787..5a8ea1c99 100644 --- a/build-tools/build-scripts/ScriptBuilder.cs +++ b/build-tools/build-scripts/ScriptBuilder.cs @@ -32,6 +32,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text.Json; +using System.Text.Json.Nodes; using System.Text.RegularExpressions; bool excludeMode = false; @@ -424,10 +425,58 @@ static async Task BuildScript(string scriptName, string scriptsDir, string process.BeginOutputReadLine(); process.BeginErrorReadLine(); await process.WaitForExitAsync(cancellationToken); + + // The file-based-app SDK bakes the source .cs file's absolute path into the generated + // runtimeconfig.json. Rewrite it to a stable relative value so the committed output doesn't churn across machines. + if (process.ExitCode == 0 && scriptName.EndsWith(".cs", StringComparison.OrdinalIgnoreCase)) + { + RewriteRuntimeConfigPaths(scriptName, outDir); + } + return process.ExitCode; } -static async Task CleanScript(string scriptName, string scriptsDir, string outDir, string runtime, +/// +/// Replaces the absolute EntryPointFilePath/EntryPointFileDirectoryPath that the file-based-app SDK +/// writes into a script's runtimeconfig.json with machine-independent relative values. +/// +static void RewriteRuntimeConfigPaths(string scriptName, string outDir) +{ + string runtimeConfigPath = Path.Combine(outDir, Path.GetFileNameWithoutExtension(scriptName) + ".runtimeconfig.json"); + if (!File.Exists(runtimeConfigPath)) + { + return; + } + + try + { + if (JsonNode.Parse(File.ReadAllText(runtimeConfigPath)) is not { } root + || root["runtimeOptions"] is not JsonObject runtimeOptions) + { + return; + } + + // Remove the dead doubly-nested block left by the old runtimeconfig.template.json + runtimeOptions.Remove("runtimeOptions"); + + if (runtimeOptions["configProperties"] is not JsonObject configProperties + || !configProperties.ContainsKey("EntryPointFilePath")) + { + return; + } + + configProperties["EntryPointFilePath"] = $".\\{scriptName}"; + configProperties["EntryPointFileDirectoryPath"] = "."; + + File.WriteAllText(runtimeConfigPath, root.ToJsonString(new JsonSerializerOptions { WriteIndented = true })); + } + catch (Exception ex) + { + Trace.WriteLine($"Failed to rewrite runtime config paths for {scriptName}: {ex.Message}"); + } +} + +static async Task CleanScript(string scriptName, string scriptsDir, string outDir, string runtime, CancellationToken cancellationToken) { Console.WriteLine($"Cleaning script: {scriptName} for runtime: {runtime}"); diff --git a/build-tools/build-scripts/runtimeconfig.template.json b/build-tools/build-scripts/runtimeconfig.template.json deleted file mode 100644 index 835174faf..000000000 --- a/build-tools/build-scripts/runtimeconfig.template.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "runtimeOptions": { - "configProperties": { - "EntryPointFilePath": ".\\GBTest.cs", - "EntryPointFileDirectoryPath": "." - } - } -} \ No newline at end of file diff --git a/src/dymaptic.GeoBlazor.Core/Components/ActiveLayerInfo.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/ActiveLayerInfo.gb.cs index ab927f7e3..ee4b6559d 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/ActiveLayerInfo.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/ActiveLayerInfo.gb.cs @@ -689,48 +689,6 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, JsComponentReference, "hideLayersNotInCurrentView", value); } - /// - /// Asynchronously set the value of the Layer property after render. - /// - /// - /// The value to set. - /// - public async Task SetLayer(Layer? value) - { - if (value is not null) - { - value.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - } - -#pragma warning disable BL0005 - Layer = value; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = value; - - if (CoreJsModule is null) - { - return; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return; - } - - await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, - JsComponentReference, "layer", value); - } - /// /// Asynchronously set the value of the LayerView property after render. /// diff --git a/src/dymaptic.GeoBlazor.Core/Components/LayerSearchSource.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/LayerSearchSource.gb.cs index 9214228f8..178abd4a4 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/LayerSearchSource.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/LayerSearchSource.gb.cs @@ -609,48 +609,6 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, JsComponentReference, "exactMatch", value); } - /// - /// Asynchronously set the value of the Layer property after render. - /// - /// - /// The value to set. - /// - public async Task SetLayer(Layer? value) - { - if (value is not null) - { - value.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - } - -#pragma warning disable BL0005 - Layer = value; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = value; - - if (CoreJsModule is null) - { - return; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return; - } - - await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, - JsComponentReference, "layer", value); - } - /// /// Asynchronously set the value of the Name property after render. /// diff --git a/src/dymaptic.GeoBlazor.Core/Components/LegendLayerInfos.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/LegendLayerInfos.gb.cs index cf64172ed..d2368b2d5 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/LegendLayerInfos.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/LegendLayerInfos.gb.cs @@ -120,48 +120,6 @@ public partial class LegendLayerInfos : MapComponent #region Property Setters - /// - /// Asynchronously set the value of the Layer property after render. - /// - /// - /// The value to set. - /// - public async Task SetLayer(Layer? value) - { - if (value is not null) - { - value.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - } - -#pragma warning disable BL0005 - Layer = value; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = value; - - if (CoreJsModule is null) - { - return; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return; - } - - await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, - JsComponentReference, "layer", value); - } - /// /// Asynchronously set the value of the SublayerIds property after render. /// diff --git a/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfo.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfo.gb.cs index 5ab13f20a..4aed9fabf 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfo.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfo.gb.cs @@ -149,43 +149,6 @@ public LegendViewModelLayerInfo( #region Property Setters - /// - /// Asynchronously set the value of the Layer property after render. - /// - /// - /// The value to set. - /// - public async Task SetLayer(Layer? value) - { -#pragma warning disable BL0005 - Layer = value; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = value; - - if (CoreJsModule is null) - { - return; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return; - } - - await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, - JsComponentReference, "layer", value); - } - /// /// Asynchronously set the value of the SublayerIds property after render. /// diff --git a/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfos.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfos.gb.cs index df89d553e..7cbebc635 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfos.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/LegendViewModelLayerInfos.gb.cs @@ -102,48 +102,6 @@ public LegendViewModelLayerInfos( #region Property Setters - /// - /// Asynchronously set the value of the Layer property after render. - /// - /// - /// The value to set. - /// - public async Task SetLayer(Layer? value) - { - if (value is not null) - { - value.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - } - -#pragma warning disable BL0005 - Layer = value; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = value; - - if (CoreJsModule is null) - { - return; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return; - } - - await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, - JsComponentReference, "layer", value); - } - /// /// Asynchronously set the value of the Title property after render. /// diff --git a/src/dymaptic.GeoBlazor.Core/Components/ListItem.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/ListItem.gb.cs index c367d0b54..00d597273 100644 --- a/src/dymaptic.GeoBlazor.Core/Components/ListItem.gb.cs +++ b/src/dymaptic.GeoBlazor.Core/Components/ListItem.gb.cs @@ -1014,48 +1014,6 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token, JsComponentReference, "hidden", value); } - /// - /// Asynchronously set the value of the Layer property after render. - /// - /// - /// The value to set. - /// - public async Task SetLayer(Layer? value) - { - if (value is not null) - { - value.UpdateGeoBlazorReferences(CoreJsModule!, ProJsModule, View, this, Layer); - } - -#pragma warning disable BL0005 - Layer = value; -#pragma warning restore BL0005 - ModifiedParameters[nameof(Layer)] = value; - - if (CoreJsModule is null) - { - return; - } - - try - { - JsComponentReference ??= await CoreJsModule.InvokeAsync( - "getJsComponent", CancellationTokenSource.Token, Id); - } - catch (JSException) - { - // this is expected if the component is not yet built - } - - if (JsComponentReference is null) - { - return; - } - - await JsComponentReference.InvokeVoidAsync("setLayer", - CancellationTokenSource.Token, value); - } - /// /// Asynchronously set the value of the ListModeDisabled property after render. ///