From 33163c1ee44707e0149baa61c9b152ddbec74bbd Mon Sep 17 00:00:00 2001 From: "Percy I. Marzoratti Hill" Date: Thu, 10 Sep 2026 14:48:59 -0300 Subject: [PATCH 1/2] Complete NBA I4 SQL and Power BI remediation --- CODE/.env.example | 14 +- .../Analisis_NBA_BestTeam.pbit | Bin 6374566 -> 6372771 bytes .../Model/tables/analytics dim_season.tmdl | 2 +- .../analytics vw_bridge_team_season.tmdl | 2 +- .../tables/analytics vw_q10_recent_top.tmdl | 7 +- .../tables/analytics vw_q1_hist_perf.tmdl | 2 +- .../analytics vw_q2_age_vs_current.tmdl | 2 +- ...nalytics vw_q3_player_context_offense.tmdl | 7 +- .../tables/analytics vw_q4_ppg_by_decade.tmdl | 2 +- .../tables/analytics vw_q5_consistency.tmdl | 2 +- .../analytics vw_q6_home_away_impact.tmdl | 7 +- .../analytics vw_q7_balance_of_def.tmdl | 9 +- .../analytics vw_q8_longest_win_streak.tmdl | 2 +- .../analytics vw_q9_physical_profile.tmdl | 2 +- .../analytics vw_team_season_basic.tmdl | 2 +- .../analytics vw_team_season_metrics.tmdl | 2 +- .../Model/tables/analytics vw_teams.tmdl | 2 +- .../01000_textbox (28d44)/config.json | 2 +- .../config.json" | 2 +- .../dataTransforms.json" | 2 +- .../config.json" | 21 +- .../visualContainer.json" | 8 +- .../00000_Subtitulo (4dab6)/config.json" | 14 +- .../00000_Subtitulo (f70c7)/config.json" | 8 +- .../00000_textbox (e4aa8)/config.json" | 2 +- .../dataTransforms.json" | 4 +- .../01000_textbox (90110)/config.json" | 2 +- .../dataTransforms.json" | 4 +- .../config.json" | 23 +- .../dataTransforms.json" | 2 +- .../visualContainer.json" | 8 +- .../config.json" | 17 +- .../visualContainer.json" | 4 +- .../00000_Subtitulo (66065)/config.json" | 14 +- .../config.json" | 8 +- .../visualContainer.json" | 6 +- .../config.json" | 8 +- .../visualContainer.json" | 8 +- .../config.json" | 21 +- .../dataTransforms.json" | 2 +- .../visualContainer.json" | 6 +- .../04000_textbox (76d01)/config.json" | 34 ++- .../visualContainer.json" | 8 +- .../10000_textbox (dc975)/config.json" | 12 +- .../visualContainer.json" | 8 +- CODE/Dashboard - POWERBI/README.md | 4 +- CODE/README.md | 2 +- CODE/SQL/20_analytics_views.sql | 16 +- CODE/SQL/30_reconciliation.sql | 3 + .../00000_textbox (e6685)/config.json | 2 +- .../00000_textbox (e6685)/filters.json | 0 .../visualContainer.json | 0 .../10000_textbox (849f8)/config.json" | 0 .../10000_textbox (849f8)/filters.json" | 0 .../visualContainer.json" | 0 .../05000_Subtitulo/config.json" | 0 .../05000_Subtitulo/filters.json" | 0 .../05000_Subtitulo/visualContainer.json" | 0 .../06000_Subtitulo/config.json" | 0 .../06000_Subtitulo/filters.json" | 0 .../06000_Subtitulo/visualContainer.json" | 0 .../07000_Subtitulo/config.json" | 0 .../07000_Subtitulo/filters.json" | 0 .../07000_Subtitulo/visualContainer.json" | 0 .../08000_Subtitulo/config.json" | 0 .../08000_Subtitulo/filters.json" | 0 .../08000_Subtitulo/visualContainer.json" | 0 .../09000_Subtitulo/config.json" | 0 .../09000_Subtitulo/filters.json" | 0 .../09000_Subtitulo/visualContainer.json" | 0 .../16000_actionButton (a6ab6)/config.json" | 0 .../16000_actionButton (a6ab6)/filters.json" | 0 .../visualContainer.json" | 0 .../17000_actionButton (4e465)/config.json" | 0 .../17000_actionButton (4e465)/filters.json" | 0 .../visualContainer.json" | 0 DOCS/i1_i4_verification.md | 12 +- DOCS/s1_s4_verification.md | 10 +- DOCS/technical_documentation.md | 6 +- README.md | 15 +- .../local-sql-express/sql_reconciliation.json | 43 +++ scripts/update_powerbi_project_i4.py | 250 +++++++++++++++++- scripts/validate_i1_i4.py | 31 ++- scripts/validate_s1_s4.py | 13 +- src/nba_pipeline/model_validation.py | 7 +- src/nba_pipeline/sql_loader.py | 6 +- 86 files changed, 514 insertions(+), 230 deletions(-) rename {CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers => DOCS/archive/powerbi_pre_i4_visuals/000_Inicio}/00000_textbox (e6685)/config.json (94%) rename {CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers => DOCS/archive/powerbi_pre_i4_visuals/000_Inicio}/00000_textbox (e6685)/filters.json (100%) rename {CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers => DOCS/archive/powerbi_pre_i4_visuals/000_Inicio}/00000_textbox (e6685)/visualContainer.json (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/10000_textbox (849f8)/config.json" => "DOCS/archive/powerbi_pre_i4_visuals/003_An\303\241lisis_3/10000_textbox (849f8)/config.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/10000_textbox (849f8)/filters.json" => "DOCS/archive/powerbi_pre_i4_visuals/003_An\303\241lisis_3/10000_textbox (849f8)/filters.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/10000_textbox (849f8)/visualContainer.json" => "DOCS/archive/powerbi_pre_i4_visuals/003_An\303\241lisis_3/10000_textbox (849f8)/visualContainer.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/05000_Subtitulo/config.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/05000_Subtitulo/config.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/05000_Subtitulo/filters.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/05000_Subtitulo/filters.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/05000_Subtitulo/visualContainer.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/05000_Subtitulo/visualContainer.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/06000_Subtitulo/config.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/06000_Subtitulo/config.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/06000_Subtitulo/filters.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/06000_Subtitulo/filters.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/06000_Subtitulo/visualContainer.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/06000_Subtitulo/visualContainer.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/07000_Subtitulo/config.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/07000_Subtitulo/config.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/07000_Subtitulo/filters.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/07000_Subtitulo/filters.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/07000_Subtitulo/visualContainer.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/07000_Subtitulo/visualContainer.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/08000_Subtitulo/config.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/08000_Subtitulo/config.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/08000_Subtitulo/filters.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/08000_Subtitulo/filters.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/08000_Subtitulo/visualContainer.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/08000_Subtitulo/visualContainer.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/09000_Subtitulo/config.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/09000_Subtitulo/config.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/09000_Subtitulo/filters.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/09000_Subtitulo/filters.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/09000_Subtitulo/visualContainer.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/09000_Subtitulo/visualContainer.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/16000_actionButton (a6ab6)/config.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/16000_actionButton (a6ab6)/config.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/16000_actionButton (a6ab6)/filters.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/16000_actionButton (a6ab6)/filters.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/16000_actionButton (a6ab6)/visualContainer.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/16000_actionButton (a6ab6)/visualContainer.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/17000_actionButton (4e465)/config.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/17000_actionButton (4e465)/config.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/17000_actionButton (4e465)/filters.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/17000_actionButton (4e465)/filters.json" (100%) rename "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/17000_actionButton (4e465)/visualContainer.json" => "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/17000_actionButton (4e465)/visualContainer.json" (100%) create mode 100644 evidence/NBA-I1-I4/local-sql-express/sql_reconciliation.json diff --git a/CODE/.env.example b/CODE/.env.example index 5b10b48..55d3171 100644 --- a/CODE/.env.example +++ b/CODE/.env.example @@ -1,14 +1,12 @@ # Copy these names into your environment. Do not commit real values. -NBA_SQL_DRIVER=ODBC Driver 18 for SQL Server -NBA_SQL_SERVER=localhost,1433 +NBA_SQL_DRIVER=ODBC Driver 17 for SQL Server +NBA_SQL_SERVER=.\SQLEXPRESS NBA_SQL_DATABASE=NBA_Project -# Docker / SQL authentication (recommended for the reproducible local demo). -NBA_SQL_TRUSTED_CONNECTION=no -NBA_SQL_USER=sa -NBA_SQL_PASSWORD=replace_with_a_local_secret +# Local SQL Server Express / Windows authentication (matches the PBIT source). +NBA_SQL_TRUSTED_CONNECTION=yes NBA_SQL_ENCRYPT=no NBA_SQL_TRUST_SERVER_CERTIFICATE=yes -# Alternative: set NBA_SQL_TRUSTED_CONNECTION=yes and leave user/password unset -# when using a local SQL Server instance with Windows authentication. +# Docker/CI alternative: use localhost,1433, ODBC Driver 18, trusted_connection=no, +# and provide NBA_SQL_USER/NBA_SQL_PASSWORD through the shell or secret manager. diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam.pbit b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam.pbit index d569433f89cc21a069fcdc88aa364566962bdea8..c1bfc1568c7217c1891efb329a6e67c43efda30f 100644 GIT binary patch delta 54904 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%0Dk+`S83$?(Kr{cJnMPjp? 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 @@CQKPS2~nhjv3afl!;GpAG z3qwx+^yM|2sTBM+^Ak?z3Jx*yH(jr^TEVjmsP^m90~JRCVD`3p;i!VvgOa0^lKDrl zPxcT%&D0kjHQtN(i!`yIK@6HSt90d?gz0#Ct`gEW44pkU@^8}!^WG5(Bxg}OTXtvN z^8(FKu!F`M@2*U~yaQe($!l`>zvFef0P*rG;8*hIe>$XE#NuKVJaEY-Y2U{c^`!V!s^wMnu4e$p(-nV86;_nTz~;Jz z7in5j|Fdp;LaGY6leKW&iII|i&8ya{^0WyBde4|lcKdQGwr*9|y5ddtmRE7ziCxo- z!I9I3y}PYcna{=Tz>9L-FRuUgVKh&Or*eG7YmFL+DWG0wimP^~)iZil*5YfKok>(x z4tLIWA=Ui>t#BY#`ezP}Pi0hn>AEMhjiG@pM=HIFlJMgIuBP$u8(2 z(c?<4Q^ZHwUr%?k=7}U6i{E~wTHvTsC;V@`+?m?q$wf)=YOUI_gRup?wq<7h z@rJMchJReWo5J{^G(6V|F*eDyf)~Kt#-cv57(f(7(crC%T@fy-S%;S}GKSHzQcXIB zy7v*oQ{`X`=C;pHZ&PK+rQa;zd0XviGjM#{&kzkqh3d(&Ck|Hlh&o_GeMyaC%ZTHb zX&8Vh(367?297OmX4D>9OY#g~2pM?}jr9fZo@eH6J@&NJ7hMW$;0uY9x*MJ-m#{YQ z2KapXx=WZhD%sBF_n@eNhHYW6mKerDeE_fL@MBlfm>mGVKOqW!Uz zjBRkh(SQ!S?r{5pi{Qk9VM;i}9wT|npy1w8NOs;VbbSmdFhU2#nAV9!ecHLts5Yaq zJs4Y#a+r3Y`tN11+D`$;p05l*mzwEdMnB>k$tN-u;--%}T!@$+c&5oGBIp!+rV0Ft zk$;NAd4R*VQlNaju~%XsXrN%%Bqo1OeY>qKx8kbD7wi1;X>L(nnlo#a$HdmeMUB|? z7wsPp!yT-spDGDcki7B~m*qEq{=@Pcy}XTp2U+H1uo=?0m~F!5d}}Zn7%)T3Xk0fM z0n`rO7RJ|7x^4DkVg5&yom2Ayp3`k!)lmU4DD4}?l`c=e{}%K+$$FH3L3Ab5N(EIc zg; z=@+F?$7E>vSETZ!t{@L>S$-83Ol7rHCm+T~qRb3tB0;KEDwvqp>e%+?#aeuHT>)&|h#DW}j@+ zJ|ea$>g^|Y(ktUBD8EO$@yTb$jD4nY=rCbY?~O>}^#fcS5yx)fr0W_WTe(p+O8=3-+~w73Z8dnu5Wx2^72e+!BJUQI6y z{|Ox%Js%4WTK<7Alcc9^b8@yJaVF_d;|XLh&!)Yst`rHs9g%HZ4MC>{#rt~-)1DTo zs!gYhF9TK+w@T8b(}G$>r+-bnFAY^O_II9wg;s%`p9|NvdOP?uUY0-k`w@Df7>alL zSo{6>YGK4%wW|So(60Z$gfisNT5+&o-W{36$i@LIkStC9m;a)8N$iN89mlvqdiyT& zkA}~Wln34V5vHz?1S;njiZ)KKGDhD$Nx%~~^GpY#A5@tpd?a}x`KTu%y1QfM~kSc&A~**?LK> z#R6cu&qt|;3AT->HN60{7MBXt9%~X{I(sE!6hp+n%K37l2kh$DZwk-PDI;s3v<7wh z80*rlZuuVy#8h7ciBh}149Da~H~ptj-1iv83JuRY`32>omaSQb=G0bEs+yH{QT^9T2hBa#t@$pesA?Al;IOEOPKwkLPd^7OQiKv#V~C+}RxuAO9e8-5{U( zZBufG@X`^r*Y(p&O2ZFou4g+4#lA1F;1;$psy_W`O|KbD7BA0Y!q4m98i(>eZQpM4 zSm>sRa33Y!y$+}eV=kuPZ2MN`aCQqoVT|Eo+9$+&KYJTsHBpo5!8sN19^qg2?E7svmqG{ds986ihBdG!uuPr%d8GIu)?dydopQHt$>OFQFUnQ$<>XKeZZM z=zkNLFfkdi6ByU<&A6z=dc+0lV?pDWHMQexxd-vQ>=nc6E70!r=}jdx8~p+#53k_h zQman17Y6gFRH`uXhVwE_G{#qF(sD(5d1DDFhE*$8B5=rL>8Fl#m*zTcJ_;bjJ8HcU zKW+ZwaJ8UwUi17#)^(G@rT47b!1rSjna)2P;f zDJR)hn<^Gg!i^!GF?aI!b@E4E)(WXss-dgyzImV37*@^h>k#(LpX|>#G-_p;=)wfq z%VsiD=BqF7W>=`mq}By2a#M_Yk_`P{+Th=(rmVn+*7%Mn8UiR65P*_6R|t!NICluQ zj(vxWw<{u(XHd9yontz1aV?W4rOCxxX2ypQW>s%&U74}-JI;&EAMHpRY)kGV0%}jx z!yc%6XVJ6>)s^DwcV|?6L>U%mu$LMC!QO z`~R|063P=#2%IkE2Y8|(<+a}PmrW9Pf*1^WMir`z7LMwuja zQ!pezB%~m}k-B2T{1nA)l&z+Ne3`V}nzjy}Y9UpT*DCG|CXJ7n0gsMUDJy!Mw2L{(i*=jp}k4jrZ|{#0ESKdyXj6k&~%q zVL`p4j0kwzr?g!$&+~kqBq&(!eZ;-vQh`B`p%(Fmh2SUDF_BCPyJRN)KcXp4kJ1kG z?yX{=gK6;_LQ(~!(llw3ZK3sr*S`9`sVp3>9YC7j+r_ODrmeg8jTr%O=DUpjv;i~Q=AN2PMc60Nq*3xBeU1t7K->gj59se-S?T=?F~&`SI>>4T}o$d?%`+Q z4TlCh>5O7<_pk6GkJ)H@XabK`xG7*P_HtRm-`P>EK}hIH(nQAopXzPPP9@EAl(mz` z8E|P#0ImG~Yb!tszh^Pt93t+RjgDJG1bzp___#tPylD86t0VJsx2a1v5F##*TrMsr z8k;MyjGF{MQe)Q`#xiH$%!cce*o5(Ha2;DLMRBKnuXv}+!Z_$tL!0B3E26s$N3C?t z-DClm2ls{~W*)70{+rq#7ZiUvuj-x|0$o+RjZw^V4n)lLJ}@_q3hnetx~g$Mp-)7_ z>|xOYs}0>kS|_5o~U^z3^1+g=K zo85ZnVQH(SQLKi)jBELW+lmFnvOjJQTld4k7?Ct?NREn~3877EMSRl)`+}VZ0Dt~G zp)spzfrzxK#x``3i=z@xY@J0^wn2jTC&R6&F;tvmGJ00tN~q_35>IW!>pSX9@xg=$ zYriJ0spkFd-;LZyFRsRaz}IP7?pjY`(!%eocrtq$UgSkoq{x=8*zYCtNiEXU`9Pqw zy(&Fdkm-mHfXgMRI?NN9-cSey z4i&lWV7xpT$s>+E9jOGZf=9ddJu`Srn1E=|*t#3(2!~{pa9ppXQQuITz}*m4n%Isp zj+L~pJwlSPqQzgD74W0u;)Lw^Hssz1*^%Ast1|!Ee`FPrp){Ficb98VUH5jApW(ys z+3xPXcH(SSwN&_-rOl~j&}l+R*hcBPQyso|P+a-zOYZYxm+=FdfC{*_1LQoQVpZa` zX?JLx6SPR#6GtUOT3h^mF3w`)3(?)rJ1bHa*)o5%urL1l;vQkVz{`Nu7ItqoyNGL}kK9CVB^3INcW%`Q3 zLVWKE4?!BV3bp#T04gUrm`Pgm><`pR;dHAMgDg(v_TFuMq57%bTvS6)=9Cr^cE#XJ zqh<)S234B{>IHE7!?WKGagO&i^_`5_Gs2M3E;{_GYOXi>sCIE;KE0 zCaRH{$4ox9J(VD-lDlf55)0nKnbdschgJK2x0Lr~v0??YIFN$s<5{z~oV64f!N?O} zQsyX9Sa5rnd^zZ{uHB*pM>59aTp*l5mzsc7AHN@KX9CY!ygMfdqYL@oj6KH&-xLIL zz%aF{YbnP4|D1arLK-d2*n*QakBR6b?UA+6j0xdH;!CJRnlN8VeC(Um{yX&!L5kc? zwfxtU2aLzt5ks2GAEy$$gNBJiWX)>}LSx6P{0JvgUg;Ipg`|7&oL}et$$WVoX9(06 zbUWvF7zE^(O)_9BQr=fH5B{^NZ9N;y%!DYe|=dX4t|vQS7)3~K{x9ln=gWUx{LvD3WO?) z3j)R$_An8*8H;;JOaHd%R?WO}->%IE=KP9wJ+PB=gZ&Nf^V!)Hm+9aA>}|?g6r6i_ zBmPfy+Bw|kxZQX9xo(qHbWI~Yt;&%V=bt<_FgC?vFI#Ydvdc=W|uBz=0A10alsNYFyK=28%;~{ z)(ciL(f2k%dc5^r3Cqr)#G7`J;k8#^?S=5EvE2s46R9v=y(f%-zr$1mNv<4YUbJ?{ z&qlexB_4m;^TgwqHuP!vVNsOZ)%Kj@r;3?W4;l+8UwCQqN68$XmDD zJhTi{yPdRLDw`hxr+~i5$NbK-C(omYzn?WH#A;GYRfRJDQRz)lXWKR+#77{G3@P>w zpSdR8I?#i_`$w@Vk{#c{@30p#7y0@~!zEj87!+wGx#t;Y#A;pDD-ZJ?@zm6#D2~ih z`RN@-H$e0`6*=o)zf*C3G!691JD>I>%HRXq;*CDklfqJZu?6^b&dpn!D4&)%*L6?0ewyy4fl^O#^ zOYK3Qy8ur;hcTC#YPoolMdw(r%FX>uy{vr|T`Zc0Cy>lxw0U`qkSf9jlqlvB=w7PM zDjwuINy;Ske9G?hF7Q;PGUy{nr6TUL7+uD{y8^*Jq_U=g(rA zp*airlsps7}g{Q10L)8f8GAN=n*H1PE6)iuyk$~vQ(D>>;o)0~&&bqK|mwv?*9 z^C+1a*|$J0M_Az2GQsB={j4O!c6;AM|0?>KBqzf->>_c%K_Gmsw-@jyPHh|8g@yY8 z%Ej)tpX66t-f*pl?vmtW`nuEBTQv9re!>gOQz!ezw{V=;$?}Z=sq1_GOX16p1f&{u zI@&ci3Cbzq`0R!Rew;9}%?}+~HTJoT;UsSQ)55cXBV2+gVXR27Xt(H!!@ih(&d%Z5R0wd({sLon&(!|-EJaq*R?jG+4)SFS7y@tr+@{Hvk03mVPgds;GfqUOZ<+|h%rC<+(B{yKy&gmY zpg5fi0l}&?*CY}i^N{h=@DLMDD8B`}#rXB4>-lGz4^>c+TKr#Q#@SW(f1NRYUcB3{ zEKKeOvIUwu9WOU_JSWZdl+v!Y?8A2|*G?t?6AgoWuRmhT!0PW{QoZ4%t#7c@Dp>8& zQAxCF>a{1Sa8Im4G0`8^FzZwnKiI%Np1~KXGyurJ+m~uf;Wbe2o35$NEWj)Z(BEs(l^jr*(D})z2L*4 zqszZlR=Cmt%U-~-(tP#ws(=>7jCz$mW%Rp>39f??`+bYgKBYi5TxYDZr<^N$ACQ-NMTAA}Doy~R8 zw{p|PV=Kj;9l1O+(NmrJ18U{Bs{mF%dO?b(2M-14f2|M-to*6w!BG21Sod!)9x6Sy zg^r}<}SJ!KNgB|th`+GKI59cSt`mzi@Bv) z47==Z$Mbd-n}^l53G1Hs#+}WMEu}0q>Mv4>&-l#DXd$H`j8eSVFGX3fg<%+&6wL`?Jc4f7kj`_=@pqwZY3wz#TQeeY% z&l@%ZE~n={{?ViZu2W~Oz1!_aVqnCo@i!HNur)-tKJbr)a#PKv_?M>%FaOeqw{z{T zu3Y^R+R2IHNGn^D{GRYD@rxm9_KWhXQ)v1Xx=V07wYB$a84XL6>M)mAYY@di-jJoO z<(EaB!Af#2{v`gbEXwN%OO_=RfV%$7ZJD{*RjtDnK00VxPhA(_v`TGc`UL%ftw2vo zSoet}0f^>B;zk(3&HBs-iJcxc7#Z02iw=^77$z9DN-A25`}PmKbxZ%!WYR zf;cBM$NwvPw6*5Y3^4hJj&a18 z=G*4s>+1UlJKf4%)dnz=Zl4gA$F0fy6qE~g<_vNAgtmm0k!Gx?=FbpO4d%1L1siis zy8nuhYcw}sc%ynmZm_HH5j$2iBm2{*^ z@XZr;X-Y3nVB@Jl zTqY6{%7UE1oWSprt=|t`hZOPqaREv#B~hW+sn_9afQ^2N7amqv@PSayep=zpt=0tW zkLbto%3QW3$sm0&cP^C@e_BT5a|W}T8&Hvpxs{?#T~t9VqFW~|Ce+*^MN)7;1 zR{jQzf^4@bziS3y%Mt>-LzM#%C6aS`*o<~z4o|Kea|kU}TLF6Z@yK)Cm(=ftX1@mu zwm^wDtouroaFU1D3$(Ndax%_a_yskSx}`pBm{%`-yt21HIX2)^i=2u{ zsuTl?x#k$?-<&VJQ`R|0U9j!sB){5jV`T%1TqPwA#u;=|tLpS<2NT+p8RwEr`*NuJ zH{6+!m}ab|REmN-XFy#ujuB1=Uabx{l&%7Ku99>1|79Qw8gtpEr7X|gW(^n7H9gAh zW)*^AUE*&B%bnqbLw?;VCG(e)oAP{OU4;zljhMotbma`SVAgd=r-Z`0iV`8DA8Fs)Tfyi)q!SkDX~`u^VbeZa zZkUIcsCR5gAA*%~B9dPO_-J0sTj>p+G*QDZm8DXUYxt{ElFwtNwd=D>zx|R9Rv7J( z!$xen-Tfd=cxh5!Qne{jONjW*&(A5r?`krqN^stt3?!l#`-%sm`5+XcHui0)h)<21 z@5_?u=l$3v{}o_f%9hYO{G@eSu{7W&EKok94*A?GiOc2{$jWaC5Z>1PbXPl~pb~n` z@td_RRe?n%ZYp^{o^a!>1L#($*|z zaY9|J^v*Sxs1~A;V6LM8{^Vfm0}PdD!nw86cI?0UD(B8I_|7C{hgah6@~~u|15JBtH9 zb|)}6oUh2*NjErh+}hu!szZ|!<}U?EeJ7K@o5QXV5@qznF=|)tkxT9i-wR z<8W5!_yR-{MHXm13anU_x7=mlnyyyuM=F@=)#;BwCR^{4AYbky7jZaajYN}RWDUL= zuLYgk(l!>&!f_E(O(*;@o`nkBPH)xWANu>dJJNIb`ors;_j>I(O)LVRx`tdU0P z#dSu~LWR*1wYVtECb9zV{i2>VT;!XohwDchO*Ev_^vX&MH zaHdX6*_P{LylTHVPPMUh<84j_U2V&njr)Aj#IU%VG->zAp>ij-Ol2rQ$CD4tr8NJJ zVmtB0HHXhne`vNhd(38E7|&m*+5X9K|CGdM9oD-^PXjH)nIeJY{Grp^1D#GDL5s=e zQQ|fDL7)ay>mVo|v-POR>9XTsh`Ut^s2Wh-*5=}AAD9alW^EU(X2Is3m4b@`v`jm(axy^lD%5FC ze%L>)hepeJ?=P!-S1U;*xSlCmcYpB4lgFqTA8NlQfMy;l(q8R}T>Q*DExWXsnWGl; zL!Xdhhu%WcvNAm8^m{F>rk8wW_^z@fM%JTo7gHzAqx&H&xl~n%Hp%G=enIxkzl}00p%(}f6<$1$;uwHz4~8~cvf07+qGs-NuEdP_1{~8?bcj^iD_(%E|1}7E6ll%G=Y+AUZ)w#i)JwNX`G{S-sIH>3U;*{1ZWmB0N zJ5`q@FKynqEB0pBTu1SL9e(=}Q*}KyJi3Fu_H+7NR25b`!`y%D=c?yE)fx)v4(@w5 zIxcAiWXe5mDb_XMQYhRmefW^)WuVaQTvBeo=^#%#jJq?ns(V{^Pp9%McB-Rx-sd`z zOZS>|a7llUssaeIXgt{0y}o)yqm|rm6~NWwvs)!+unUtDv)o_!(qkV-&C~-L4&odD zXKpNz4y>wiE0joOuVYT6wg_6ZK{JJyO@1TQoC6Z`HY-Y_W>=_6wqbYOk6%@C3xh1- zoML%Mzx77YgoP+}%a*pW^*Zg(lN)xSr$AVKveRQXu4~6G5^-av-10A8 zPWXT$bi?QR{kZ)pt2}`|JBH)MI3B*`t~*W_HmTx`57$QJP~$Z0(^YH#|HIZ<2DKG+ z@4iX}E2Tj30tJc}*FbTH;u552a0^oOv}kcFE-4Z$NO1{LTHGxGf)$q_#T_p1|GqQ# z-kJO1JahK?kT03+*;)JdJWFBGs#iD4ZYyyRu{*=n;vA6&_S1v48hA{a;j1Hu{GYU+ zdLX1{U&{ux=`9xMO%kL;E37tiI+#8&URP5=ce&yVtJ?0;|HgN#SgUN*O5{=?1r9KQ zn~zv%6gnQ*h~Rw5I%R6?^Hxlm~RbBl|kKK)Z(xSm>&T`-3jO@>C62 zvnA?hfP(|lR!&_HUX}N@w8>Xq943}I-NwY}PvIPWAClh)3@2H{}oue8dAqnJav zb&-&d!Rm%;&vGI}$64S}&IMXM^CW}r&lllK;p)k-t*kT4(FkYt} z=?%~9dm_xO{j1>bLeRi%iK=mlmlUeRql#IDY?bCDaVGn7O>bt7j(YR-QBJv9POrqG z$RPy1x>=&dK8si>yxOKnmpmglA2KL<{8KUD)AeE7{O($r^TII)%3OZ8PKY(bLY+T~ zGN*5A#ChNqhRr$qjq^ibrDbn$9o9e`xHFr0WqesXtfUx!zLUSP^*MhQ+me&rd0h*t z^3Y2wC{h-;T)ax0@IQUUF%c$~thtEDgd0vi@0!OPH=|Nf=N{tMVB)Z)#$=c&H_ke~ z>Sul9YU$uB%*Wd%9fvZX0?+{2p>X=NsAw7v1!(FwdmzKPsW8wnc&#=tY-=yBG{X-; zFh80N<6OyxSjVEP^L?tyeZPW*kHnpczriD-H^-lxhl{$Gn{xpcH({n9PnC2l%qE$p zUXZ(8{-_hQMW`Kx2o&hp9!YCx%yV7kkv)5WN7Q+T8HM3tCvj)K6S2Uv1)~0?gFs0B z_(JT|6{@m79w-dsi4Qv%2_k51;@T;zk7_$(P3{>P?2Oaw3ER1(Glz1&&L*UdtMqfj`*ZJdk>p0al`(CJH)#cKtSN5q*4^GQ$b*fy zd!lMl)3e71c{hC@{M`iYik~Js)utK(u`fkc*vhIQ%|dxUcnzzJUON4mOKmhjkFT{l z6=0SuT1~~Q4r$aV?l*9^VjCMzMXS}obXmq4K%J?KH)v3T1y)FPhSo1?Rdf++Y%LT^ zL^J45ml9L|fSf4pR(G+6UJQAbnt#*5JFSi|n`uBhE*oH>x!pr#20Iqg(z&mScU^ai zotDMARe*t`|66XET%%JrW7BT_f3n64T|J#uKD<03)Lo&Zg=f@Kv~BF_1(wEgXmgGV%Hm_R>-3~!qlDt-7RN+96u(}3ba`=SHB}+SRw(qMElMY@4WrVS1 z+rEbE+Z>C+1;!(C0kAKTi52e@AcvULimBYz>?=EPwD-_eXRojmZBS)WVTNPrQw%f03_F+YYg5+GI-ay zcdiMSfY@UMngSs-F}5ba195Iwf&xfU!F9-0ij?$Uj4^gh7-6xS?ns-Gq!p`D&{TZyU=J83Wf z@pyLU#_lF&wC{CU)c-Axa%?l*;y*p6>0t2r`?!F`l!)%{!$%ci`hQSMidyU=lw59s zV6Pvy4>iKF&dgX&u4l%E@!fjN=eo?kxo*BriTVFX`TX2DrMg661!>)0u`=~5bTEP7 z?!z5xMpr#wseU#h%%#75P5ISZ)mC3P91QaE-v8%j1JMH&Y@tS z^R%nltKXMf2llAX^lzD}TYMTkY)%rth`;<3-itqp9^7`IUYcydQ#K_&0<+-_RjDfZ9BX#_Gt1XSXJ zy3j>gF$k!Dfdt+T&q(7vq_2R$4i4r~f6i1orv&egE0A_<{1!F$T297qgJ-W|=6)^3 zo|%ovVRuL>L86pOSo{%w)4l37&7;t8NsDT|iIU%~Dm<_n8@%h#*t$C8;snXwdyh-~t@`@tp@_V!SDeGmvfqTf2E#SZL+`#U__0?DlYnM_gUvSbV ztgu#zz;sY@i)n54n{1vki85qWDr*eZvX6N9JnP)Fu73dDaawS%5t*98cFQ!_GmKrIRKuFVp5jzlhJFZRr&;$6s~% zlCsmPKPO*_#^H_|^CX84;L#3%>_dRR^17ZnmrXxUCGo34-qR*YHO`i(x6)w6BI0Ui zUZ0zsc!_%4rt)1$gGo-1ky(nhqozZJRmMauAp69AIu|6IB+bC^tI~Xo>9rY1IEB|D zh=+ta3SsRydbD{^XETqZ3agsJnH#vNxqP`ZYy)@>-fUAgQaO&8GVRZ}*2suDhMy>N zj6N(3XbVu60u4jEO}6diy}TSqT{!hD;x9_mY;*YkOzc)tz53*I;A^)&VENJos09iD z9v-S!p&243{UQ|UZ2Rll7jD+2^k|{voXt9M{*xZFJhaABRU-sTFsDI=ospeZ$Tn;N z^L(+uT+{&*M;*#82A(Z!SmI_QHnA4VaOoHw9*F3NGU&H4KeLWf>LG@vS2Q>7iZwx4 z?YDkO)}A6+Iz{I|kA}@DQp~(aC!Yg@y!+=RSjFOIa<>iR&VIIX`gi?g_{uL1(?!Ct z$1qHcQZ4m|wZGX@Y;E6Ll5Em;b`1dBvwQ@6#K+x~V>Er>8B2gR+61ps@j4Z{xS-ck zShp%|k@LbE)aRcY^OSl+$(MWp?hsr~gA24-jGB7^RmKl;kcYbSTukpK8Ufna#LE)0 zmHvJH$e0>x2ll~Iz=Dr~r%dGetiih2=3<|I&l@uQ@OMh1=24^;HLvqJr%F4g#0Bu; z(*p+exrzf=3=j2sp=-zIc{1IGj`=#~6 z|9(|gpEa*XyY7g7Mv3M~UthoQF~e@XHij+tH-XYu{qGJ@rcLhfunL66SyT1fLAl-f z87~S}?A29c=}gn_jJdz14z2d%;$sH^Kcvai9XwoDS4;B`+`gaJ0lJKFcWq0ex|*B6 zBbzU)?rfU1C3tH1CZa+c48kcnDudtAl`2-LKQ6TBgdJ=8-dsjCTYEA14>_PdT$J7@ zsiY*_T-@_2jKJQrj-I%$KYOF)4IBA^Jg4=ijm>Owy=hITNI97kA0?BsURfAik3REF z-TYUxAR)laZHlyk0QdZAYa;vF719ok^fnI$?zLclo!xFi4vE}vZtjx4I#lk3@@f@p zT=DrP!Qg(5h}{$zdtmf~Cxw`t40m`dk_#%VvXwjwm94|MfxL`R3;w&kaS^MsyPVW~ z_?ZfA__GkbMk95ooB?sD)2OajbiPM3_O*E1yo%3bvq$R!_}~rK_p)OC0;wgd%D`0Q z6jzvMA5Um&Y?eBUD9gv_E-S4j8EeVUXza;3g4krim2M`|_WzXX$joXyP1#9qppEap z3neM@=J`3j`%O(aXs^1}{=TH)f;*VUU{IJ9m1&0Dm@K06(WB$FBhygCSsm!{bCJV<`q z3T-X(=a@~ez$AU#g|3h%xp9&3&fx$q#^8d0O{%JHt1<712Kd3q8FavOo|oLgvVRR7fk_styoDJ4o>@+4An`8? zV=D*j@(g-@2R()#`mP(Y8S%H}f%4*aTH)(vEd-QRen;pLgCLN!AU@5~har3(g7r>0 z+Kfp5vVw2Ea#BT0**OO{>2WQGu$&hrtfJD(y2CHdxNfb@pU&pd^wW|Dz70|Cqi>z= zahM;2xUIQOcx^?WpJYvz(!4J3JYQ!jh;#;g?Mh=B8wns^ZT6;qNbOsyy0uw5nt^ZQDt1ywYS#v{X9!@|`i%#2EA2-*2Y7-lvB3!fXQh?RcU6pYo zRG>@xRA{ZP-#zj-aWR7qpE=sioU8k*w?t*?GP}-IGbsk&pu;zeqenq@gn?I{^_Z_ccG~5KQ93J~YWZLKR|KzZ z?}{1~+CP;|9Ti>9v-M}xM!z;VKYzD$eTpyl!w+HF1SzF%q^VO`| zR`HNHgJCB%b!P9Mtg;e6VUV_DVOK!=li+fjigEx`Of&UcbTYFiUpp{;RCYh>gV2DB>^bbEw)pc zHr5NB(Tb+w0G*m#&&i03-yQIO0!|4=U%HC5`>QXfG>m`d{@O+1LaUS#h!!qoZy;GC0)tA_SO?VyH9$ z7iu3d*Z%Hl(HJzkf@rbfi6%$5mfDrb@=>U%hOZ^LcWGAZ>c7)5QsxNeSxh$Up&^~N zMF`8Ssz=3iZ+wo50p!`7g!?^Ukn@je0jzCzjWkEFV;yTPt|xhtv<*dxVDYEyG-M9% zw}c>p4gR6emkZ(Z8WiHQOui>G@pNqgR#DrwE;;-_0Ri9wko?C$V%m7z-$I4 zy=|f>%=Q;G^S!_)UqHofkx!|nt@s+%M7rnA3f}S#VSiddx(r2l18{(!IYlgmUOCR$ z2|YR~4hFhGC|O6*QLM=>a4H=Or#zvqg~}`9#Zgt9{Egf19?PwM*fvlL4F}nUJ(>Ld zGA}l|9!E_?ap6F8BqnrZ&ARY9%AWO@A2`P8-C32}cyBwMTDQ5}nq-wmh1Thmh??*Y~8DC00f zTWwLZp4Ijc7vODrpco@WcAu=AR0z}Gs-;wEL0sXRC^=WIcDk*TzP0kPyua%=LObl! zYBu9|ae1@Qf^p(*@oIz|7!s=)JST$nOUCxb^QGWxzv5U3ztO49Sg3QU$9CDlBbXc+ ztfs4%V~*`#d8BBc{wyjOy#cMf=6_{lSc6m&u;VCd1~y{CLd3hQ3(V!Y&wRo&WdX1s z%x@>sGt9yn!4X9AwX;G2aN5B|KWKe4_pds?B*;ei_Tk=emg>MV5yWg4L&r-oOAOjMIbYG!MrPm(Uc_M>HHv$=78d zp;?^ad{p*8RC*75BU}_1Jk>=}i*)0feykgqiE@^UrsUt98*dm;`Gx#ZPh3M`K2KJV z9;1@b`FC1-c}du|gPfyW1G0-qz1#I*^4HzN4_h?L0t3v+juMWSPD{I@!0Nm~lJmUR zK>uea_vN3@W#bvtU2Mh10_+>Vpe7DCSKdF@l|=Mo?r8+o7q%~m7STY7E#`62MV2-H z*n3<@o)jKziH$lnzvSO>f|%zy&-kk?RA#F*f6>oTTc4d$+Qc(ZM#<2ifMXZrBx<|6!t@fBMW>&eGDIk=Q-`aB0 zX#4uuo$52bC9kCOj{-6=zattV6D9+*;lyHlsqV6DrL8{=rmB^0*J*{B>KS)8!sz5l z{its@MfZqWuFrLxOsX9MlDb6C(j0%-?gec#nuoz8WtrV{E7#AX-;wTvY~Ig)JlV?3 zLp}Ahsuqv5Hb^?QXyTUOQR}GhLmH;|CmpY)Ywr!(SeN&fFb^rMl;Uy1++N&CCj7WVXlB=P!Dq@|618Q!QE7qq{95t%BTs2?-{yK<)k`zcrkQ zCO&UGT4hMIrR#gFjv2roN5zm#4oA8}56`to{h!u&_Y2JaI@ z;=(r;Gyf`L%V8u7|nHE0bRN-bQ7Q>hf$}+xT}ku9fAbcw^(6ZUl$evz_9`u9?}x^QLE7 zB_M9iXC_y1=N%X7nI@vhAW#@t4E0g^wq5K>(*7eZ9(`iY$JxMJ9?J88WpC5!zut`$$-lhGZFIWo^o|J%~TPO6<2Buzz#VDlk~F>EF2Pg)35A zR-p$rNg4~D{6^AjD&`?1%RZT}xwaTsm+VZF;mppEFjZY?cgnC(wuUSftn_wnpbwT9 z`m5zSBqWOR=>?3h!Go+uAuY!}nLeLeOpuk#!(t{MHVn`3xiX-u!z6qb)4Im%)%o&g zRu4hF|6w-UcK*w3QhigMh}PyCD$Q|nubcblx#e#?#3Q_2lKMh{TFgLDQ_Iw06?&-B z0rl%?zEJ@idof!#QStt4{9TbSYXvR@yoA|cKpFlz`)=P5hP?eQlt$*zq*v5pI$!H{ zYgq{FH6TdiZhe}u>R$3XS$NJa8B29yaj1@6o5<*XQ&ZzV(I}i!ogkdjroj5KOYI0N zuA*1lQ(VrWt6DDe3Uy+6%QPLm?KL+g%R80ADGz#A>ylAz?_XC-kIU~h{Pnb)6jIa( zT&gv_L7=4RLtT&)6b2|U`TVKW{>?CP*+5RSA%Sw@F zp$dPdd~zb%WbRs}OL9SRr@X%FPX}fY5^O-0?VuC3qapC;8aSwF#e^*NFv z9J*Ev05`j|H`#LJ3*?Q5U0SyX?K9Fv#JJo3e!9|n*o=%#2^%E6M06vmmr`Squ#RZ% z21e00`vdR8>tCM2{{LE=O!kQN`Tnww*ap~qgx2^zy%KX#-;C<>^qz>VkMn3p8JRm@!Y-n|ZEeU%R+-U?RiRCcd`u;p1_)p+x1J~ug|WpsO2e(IJ>juh*qu+$ z^Q5;;wjNY;&cmmW`JTSp#!A)Am0m0-oOc!DZTZQk)xWw-Heb*TyGY*3@^kmPTM*=k^VOtE+pvbcKmtkT z^_nsdA{9OvZ;r&yDG@z$xcgbija%@6JlQ&Jd}QuNW+@RpW|te^<9R-1yrKO(Ji!5x z&UeD>0heIORQ5y)7N?R~=#7X-b)Z<~^1Be< zR0XoDo|V%c@~5HuwRM=_yx>hu9P3^7*FXyXF^J=oF=RWsZH6WI#;F3e1^Nq3mXZ{eJ>~d(pA@;tXFw95Mmp$O zziy~ovHj_S*6=>a#i{0DwbPUEZ8AA<20)lNxMR`2*n zS-r<7p(K?!h>sXlVBH$f^dW8nxp#S-yPxU2Is_BZiM~E|yYxACzFBR%wbubPm69#$ zBgo3$78hhKb*$$$KKF86I^3P6NAWMK4B^p>(oh0%7d`%#pd!*9-ykTf~l! zwZ^IJoL9X&Epf>Qd(DNov}2jWP^MgOvzjHDA*<%fU53+~d1j*DCcCE|xm{+HrFvjB zOY?%LT>fE8%cK6cqsgD;M)r)k%BJ_@UX3wmphPu^Te_>v4ovI>BvU7=xQ+H|m6&D6=)t_{8 zdnw@8*wrM-p%pcdh1I`VGA5w!kQYkCx>zA-24TknDJJ6m^y-PMXr+N;C*Db{eD(Dk z-?bwszByHWn%B(mYM>NtLVqU>bsE*64V`lT!8mZq1>APuPR$0m>D8OaT#I+;r+F!U zkEcjX8;IU}bir4ZqQF3s(_tW(xJ|J~NiJr-rSELm9LMc1y#K&2lwSLa7?S( z;bw8f4_u_3iXMK8S~hxN57#8{SHLF#w1B`XX*S0K5=g-VXq=39@#Dc8ah8dQpqCO) zLGFJW)2~~?&)B97#6G;RDPn||B%RgjPA`E7RB@`GwQOWO{Fz=Zj!!O!^l+~<aAAKe-Fe@2Oak zq3Ors`G^J#hWk~W-Dn(K@2IgT*c!A{ya}e+Jg)Ygfi~nfFh{DDH%@yMO^L~Uv|;Y> z@im%wTt}S^_L~3YGh61RY}NJWF=$*-XQ0*~o7>9U2NkoxVG_=JKYh!*ETVSUS*CD` z8E6w6vve09dZbYN3i6;M4ePq*Bg0+N7S>%h1x0#QRTfnw*yw?)B!(VMWj57GxOrJW zz*DMP!0f9F>SW@M?7TD1#C6GTcMeyOLtP~bk$tL^;1;E zIAQA$Q|Vi~0cPe8T*BzHS2Uh~TQ$u9fc0mLMd#o;x^-}!*-TbGI(l~>DN6RG&0<1a zZYLuKBX0@l*}clcHk>cm`S6If&g6q$SuCMggigjrcJBT>oPEXehmDY1EO9f@{8wDn zoT9>Sp@aKb*97v`6MO!N#p)Y&QA}MOg6&5=0h49P;Bu=HhJ+Qji6B4|x1M9={55gx z#*J#;rL(5wbe7MM*b*QhA8$>U{aVC8WQE~}z>p$);PC2#X@GV85T@+g0NUD_FbOdB zNv2zKhQhq?RojZUX4gv485KJmf7%MygB-%>U&h`37|(;`svWtMjw?%7SYkMMRYl(Q zHjZ%h(iB|t@*dK76#!(`3GUBE?G@EI-rctaqJ4+|aZ+Z7vjsTQA zur~{=k3l%OrR*=sFFm@?k5h)!StlbdT_gm@?LH4VijCXsK!Av%=xKi{pO1M{jr|yl zkUyl{!C__QX83y^3-1ln2+a6iiWsifzK^zcGLeM9`hK`(=1W>-<_8QV=MZ{sw=0*- zlT*cTjlD9LTd+`_T8BE~oRUlLf7i|9adh&{r&<@EV;&m)H*R82kbZQecf7NLGt$d&LmXmf-}LDaO2(V zwKE^>K9t$S>7ma>HmpA^8hS3B*Ly?1XQ?i(8dvEaB3R}Mn(v$HNz8>UX>qf*j~aWR zj#Rz_Ljh68GumjIbRu}P6Qq|o z1|_KiZnQ|c)H@5ECSH_3N>0ojGQ-Wv*bJRK=+X8xuhfxD`@9mJ>li4|j{5tDl2=O$ zxT9nX%Gidw)yIoqaI|yKB-FCN^QJkpXYI~c%eI~<@{I3TY{n?a|2EGzs zrV_^+FONe;tRZC}E3mGnr(iGq;~wHr+G%zArFva$Lc!izwitNfN@|`m5?-=fcTMN9 zWT*qmk>D4$7B!~lve3*{0zAAkd`4TKr!K!j+qHh`o{F>_qX+7V_X+oMw{W^?dbPAD z+tnw9(3%@oOXKrGwPKLQOj%wUmHOd<()-)Z0>f(JS~}O;?m@h{RD^$^N2a?ug)GFs6!cr$JfeJ z2cRQW*|v|t=Tw=5z?*A4kD-BY)a*>byX$d;J2dMDxFz74Ku>h$Po68O9sB#%d%kCQJ>~9POM>^hm74 zUd#1WXdpS8l)0=z>C}=naHh-jc z&GE+2nbV-}XW2|Vcfc#`0_k791I-Ft%W=6yAq zNapTBSV>mqXB^K}ywccP%~kgA)5KU+v8T1VSAN)2D$MdyK=G@+P`n{}N5?==BHI6z z*#`pZ4kOy3<%SpQu6HM=I9q~PFY_0~ggiabZ`P48?clCW!>7^2jd9tM+>dikHRasi zLEKo^-E3b_%Db^VOcMYiMmEG5DyFh}#0w)EQpFL3uH4Fs5_RTH>YZodo)uf2>dgi! zztn7-ghfPe~}!TPr$!feYx(u!azCPyK*%3;P3~ z=-%r+Rm<)3VtN?Vv@1Q}<9rsMWQ=O%6k#+a*XEnCXeg~7t9@4}#&c4RndM|=Gi*Fa zL#)$MoI{a6u)qbBUUxb_kwm~2O%t+P&f&8$^`pAhVI(b+V&F@TQEKCJi!{p8f0g0A zfiJ|9BSRt5Q|o;gm{^9rSHZBJgO`&v6w~re08%52w1%EUFOcjE*?7qz$M<-PVmCeC zd3Y7*)Fkf3WZ^ksb1KtP^E9(qQfv{2?|JVPfJ=RV>=~a-CbzLx#;t4JW5fL&$zMOU*^<=A1*7xdZSylIfI6eGG z{d;Hxc#-Qr;nN_eQ0taw;>SZh!rzH`>0UZ%&R!FHbEUW?$oTcdx1{W;kj5iWqSTP% zIWAQb;Joi6LmLiK-8jp(#<$v6cSqi5N2tD#jhO1!S0;keseit`kRF5u*+LCZk`;(W zb5AV!y~ymbEl548wtf34{0;A0_K?p?t&{jM?~=EV4`hX8mx8l}?k;Fx8xHKby{zAi zCH42UP8;I|L{Q1of}LmACykiy{U?>{PtFHE11~C~3J>@y<+1V^T}ZzL4x6w}w_u4aARcO;Jghg*P zpPuElRG+0XF; zn$qTC*AIpo?R3$6#tVsR3$~mTZ9YtTUh5ePy)wJW@!yTx@fte7-JR(seWz4Ve|~M9!z)?+`{)P-wo4jLR3J!TUY2`k zoR!5_Z`Btnye7oOIHVjteT5?GNgZ@%PL7Q|F9`YUKd{#A5HPSNm=YN|4P2!T#!laf zscB$`L%>{u!RXxnCoNj4;Ukf83yd5}XJCzNRLJ_!OEkmOqwe>?O7KB;Z+nDq=k)XA zLEWdlB@PHSu2>QKyZ{l1V3uzC!o>d33M}D&P%;nAxkSL@oPYIDb)7%Bi>rQS6s?** zU%~PMDH>}AuqAS&1KAIVI3IFR3Ns)7SaGJeWe^Xzsqg7dWxM*LOlwqNk2@2__ADs2KK6@@~ds>#->#+aIk$| zpa7VN0_4r#3ki4|A$2})Spk;`R-1`Dzq;K}0kXkS-dht1WEXeSQoe0z#KUjpqoz}7 zw|TkA9?a@Drj+`=&oX{UbL%W_Nb2P0(@h6{d6MN!gK|5Hb-ex!AJyRM@+I#by$(}R zfs5K%G4JvwRYmzy|V zWl5Z%ED>A)Q0w(cDrl;jh{4N|?ugqm_jkU{o;*cE181aTw*qv_vvzwNVoi}GQOJ;I z9f*Gnq_g(tkHV!FNu^RklA_>vH4E5Nq$4 z;q2bYXZUwh1qFRAA!XW$UR?EGD5|26uCsPJ%LNLbcP8B`%GsQ60+3OAM?HDr6C%bt zUz5xvKnYyR*GT%k9XDL@iIewP^ggNsMnKW`9;KjiL*(2y->v~!sOU7|e1C592WV0s zH`G;6%|-CN;!T`^tRYg(?_ws>Z5gl$jOW-BEx;>6k4%%NwXt9GbD6Ma9%QhECSmEXL0DRkHd@yt9Aoa>C}h3 zwKCh6>{4?v+NP_vtx}~~P28g3cT0q&Ue7P#%s(mDnFl56ze;@II{%7?3lQKEJ+%&b z`bavhM}}Zvp%o_mK77%IXzs(K@|nqa6kj|` zHN_*i54oh*diGJ`f#g%2s;7_WzW36<$e-A!dl9^CMs!zHC$V@jK+*oDK~W@d+h1xF zM|0u0fF%E`@%GfPQfcmuA2Owr###{3;n`UAt~OL6)w$4vl`~|Uy&v({9t?Yk#X-u& ziwWfbWRK^X?LfAEMcdRvHZ^*=EmbCJ6YDKajl&aRj!ev-+eVfTCw5Idi=#ZP46+Bkx?n8^Ys1a7Q$})3 zU4hk=pXdYMgvH=8wAK-K&>pT{zDbVZ9i1~c0HXf}%52Hm5KcynWT!W5&wk=Q8YuY% zgfg=FzJu_5=Y=kq{UI{+=edChe}r*TTB*WDXstYo*J2BsE;Xt6RZrKPI#uIs6kg@i zv|wg8e~Afe{`F(dD`8kgjr|M3g}Ng$#C^A*>`sTm+1^B~yJ(ix_Effe(03Q_y(*R#vVMDa{^3f`@}>)48?xxf z@VZ$0#VW9~>RUWm=cHoU9*e)0eV0$s51v7Mt13OWQ%=l>QJm-XU(LS@%cTK(Cc0vn z0xz!LM%#pFteJJo!D7T_sctq#9ZtgTy^~#Qi*q{B8cB5F7Qnf+t1sbW8ghyxLl$Cc zCpQgut<@A<8BaSp;^mnZ_}||!Xmx*!RkviVP7v9>q4#X2LQN{or>R)7TP#Nss95pP zuo9iL5@XjzwDAjt?;X2UX#tDq@KY$LAociV(+ez&yh)Qyj8DB!CnM@~9Tuavlg**- z#TI!UHZlQw_H=r=3Qw|4D)g5rOA~8b&qUaaWh+hqw;S7BQq2$_mKhrn;Y}%`vFV}z zkC$U{N0QE2Yk1fx*;L2dH*@6^`yJyZ=ysNcSo3N9L?j#{OR(H?eK9G>tSI%(E99ACRF2CCbPG3^s$0;Zc&fy&SF}I-jLPZ zphKG@nIkuM0m{v8@Z*+*F=DD)J^`za8Y zrd+Me9@jh&eo*pq1gCUkOpH#KSksXmGA79XQZ@VQT?8`(czXvH_m>!PvF|0{s)YPg znogtO5BLw@C{4BI`8B9HjpVU&Q7g^&>=4&QgApGQct#)X#dD9?MbReG@x%52wvrD$ z=YO02$YfKO3(+Rl4s}l*nN~*>?_-DX7;&tB9~p64F|Ds{^LdL)*(88y5u10CICe;M z2m3&n`T+^6b&KZ2bqoIth-QgI-+DN5ZbZL}mFPOLZO+MtO|*Z#`F3N}Wf3CRDC4~{ zE5_($b!#B_lC<1Ww=j65qfkqCP)&V!zy_{n&~o>Q*1R*0W1G;Uuug-61zGP%(Vx2X z5S8hxPu9){-!a5?$hWg>4X@YwDF zz1m01m@ifu6h}Q1qY#CT12$(GMH+Hp(FA1%qHn3xeIdon@<`)UA4GwF{@pir!5+nF z5UooiiaRaYCa#tJ4z2H@2V>yp;Gj(hH4N$~3mTO5v#5JjDscqqTKvx>8keS`1e>Zt ziM!~+^a%e3my)rqfE(<}<}2wyUtl!Psyg(J`s<8+fL4{cmt^Q^XGf;H4Lf=*g8Ls* zUwg9YU+*P(f1!Bmvp?xBt8eVr-MygQ5ztGI%pEcw!Rw*37b6{=QbyUsJ=veA55f_c z$y^fUGjY4GtqFi2x0BfGHBC20%Xnwb-Gi-S*Mrl($x7WFAn5knVRm0JFuIb$^S-S( zj+qGxy1vP^k#3BWJO~rj>{XM!6f2_0XzP8o@YZi<3)|df z>bOtZ>6!XWiONy)tXuE$-h-Kmv)da9CmLKXSgH9mYywTq$bGORkzv?Ws2KHi<3w9+ z5Z2#u2vR@Ul(NQ$bo?#?mJE?}--|WvD}4wf+2>GHc`x5#+D8dm0ndL-byhXYyRFox zN#Teq%!EswWBqhrHRqJogrF^s8;#(g&?Dt@ zeQ^O&P7lPB0!}hzGIG~X+tKw0`?==2j(@&;`W;$q_NN?3X7`E$=h1#Fz;_F8`uc;Q z=A^b1T9x%_Hg9$~-mL2fQckOER?Sk~FodqV1XEWg+!}ygMsV@UT9VQ=Hg3D&rORYT@d4iZK{q51TX&mx%wYueH zHY#Nrc68Q^MD4Z!KKk86h+1YCG?D+UZ;-K)NeG@0pYs^Spx#cXm`4MgT<)44%qyp3 zp?xeauan15o)?IGNpkhOV@fDQP?7y(wRXwsqK}AI(xrY^^zrvjcpm!?_q$Z(Mv{7-W3LhTKIUz1|r>mWJw%$sKK=|0ce zQe9|tG9?5Ss<5+E2m#M}J85PD8#rg{^xX`bV&TbYSbxL!nS#RKHkD|A55C8VG9teE0Wv-M_%frAg+W@dllNRjmcj&P@0)tVwhA=(Q^ zciai!e=f;g&~7Kv1ZkOTPF5rSO`vEyC(F0DZTN@hDk3PwT&v~3Od<8~|1gC-;de~o zz`9&NjBAcjw7a9lBp^97psV~(m}G(L2fMSsQbI4Ozw88k*L8p+9=HCjV$Rgu7TRoe z8-0ox2l*xy`0#(nR`I{rxtsO_uLd3w9`;4XP4RDLW8giV9w$$+l}>HH)>Rp7IVm?7 z^;?N;-r13~IW9U)Mtdk)EDF~N5(UZbOsKfsfw*4!b_n>uc{eqY_(Pz)b(y>i!?j}Wu#-GcCc(|u5u z$%LRsXP14Re|&93!%$R^Q_MYTNah0@Vc39}+n&Kc7rV?kSd>M;q*S8p$gccYIYx{w z3KjAM;JnAv{}6F1VwFqFCh2Z0z&<%eesM-le>hX+^c*6{em zJrxmVc?X?JcQR20Ky97`IiDuxkbehrNy=g}DEHWnB9|v;FtEuqrQJF|Lu4PP?YUp@ z8@uxjvjrVON}4CMvDpOfPkMMTli@eNZke967AF@vzsaIYoLsxkuUi*#y}fYh?|)?rq*KFwH&Zs}4yeJ2Pmc;= zgL;vNr|Qvyxmh*>2ZdF8I)xB;3%)1m=SHO*!$mte zjO=ygamq~XL&aRvbX8%qh2TF$dz0m6S077FXR;Q6;_(M}EaD1hbJO{E>MR?XRy_`t zT7g;<<4T4S*wbUWea0P2gmuaIMjM@HY`vPmLv^x%FNjLAVpYnzm6ouP(e5^HLsS;D z;&;d}t&QWt z|Dx-y!lDZJu5S?qX%Oj>R#Lh_xoNxu1b96xwl)hf>lAWb$&mR3 zEnm7pIWGpx?Op8@)1$(_f5<$?DN~xCUQKDUgbPjRHMKTv%KxzeGnZT~dpjLylnFvH zeopZylf^LPX4~zp8wfF!3dGK$Xlt!XYj(3ls&Va314XBmt~c=%rGg{B;pzLcTF*N?o?gUiaya&CsVZ=mQuVzHB_`e*<%m156 zjFb`kdC&tPG@1Fq)v;iGYy1MZtxgd4+Ge{wd*R*m6fMqx#)7=Q!x|UE6W-{>_5lCH zf~&r`_O$O=zsZt#Cyf1>dSLw_(|B{(@{#!y*UsPLZ5F$I70ELi(-IUew^RkY{d{NWOzyP2|>wk)8HN&~OH+1B$v)`Azt=2HXP|B)P&=EdU zWQelbF5Q3av>OjX^cyP3W1FyT@L0P5HT%f(6)hxueE3l7d}0&jFAdCu`1$I8O)N~t;S+5xB|5g zj{+)$91*KvF>=z~$udLvUCA;j$w9mv*5y|Q!NKH}lsKUI*9hyoE*xz>f>XeB#bzn#D{{qigE;PZIf zjBVfDm(K;B{%={$Ta2@bveaMB-qn4CMC-b@LDmDa6tmOTsp#Jqefp#E{jb;bkGT$G zcUpJkz2bXyc5M^^fjA^CRv?wQ2)M1!z$vvagVlBu{1D`Fl1m7GoRsqvwD-Izh&kfI zcy4}ANr*<^)4At9@9M5O4z?!DooQO4FtD1PvF$4HE5-<& zs}9f!{;$LXVgGqLM0c{%_0(|_5-ts;gcNrY=p5TfvjdEwZ;v;yB_B1rN~KY`H)bgy zj2pA;bPOA_oZY2XBL}Sq$)QdveasOixTa*z;3p-Y;cMUEy!O5>e0$wl`du6>KjTm- zu}>0W=_`R)N-hG1%q*GMY`p)K$rMxJp*=B)j^!FU3QBz=swFOojzcdxOWu--=KBM4 zfV&frZ2`lWp5hN_CQ7qjprQEUVg_3D`$gqUl%(4 zNy!_F`U^zz=ua-&VtJ>|(AQpc=f()N0EX&illc?3CHWk1B zGS627wdR~1%8ZYOYRz*Xn^wEI@1$@7Dm#PZ9Q#4bVSQWG!^c8&AFhTjLEU zIrY22F4X~QY_lIIOv)B79P8u(nD?`bPRy9~jBz=g&2^FXx++js^9$V=%%*m4XTqv$S?Z2p!$e&N<+uzQ{9GG*O z@LM-(311y}!!h29)39=Eo)`^StS+?B+xCzc5s$x?w>y67( z3k%k190mx{_I^9)bdO>~1YzG(Dwn-uTIA7oXRNj_Dh@eU6(x>mN}L}0oq_w!on5L3 zxTKWmq%s*ZYkwL_8s}sZmX1{O*mu7swMvgSHItpWg)!bI$;T(xvUwJv zu=-h^A`F!*28~gm<0f&;TcC)=Ek=?^i*gSKy>#RXv`mQAYO8w2f%Gf9Xf9JC++ol3 zwm?>sMY2C?=kc*@w88EwW!76Ap05jy0Atqogov6yypD_?(+F!#l)Obtjb21?oyTj@ zXXmW}#`p%HzhTB%$Vl$$(m$4{ypu0>{r;sFAM@A;ZTz>D216+Yqb9$bQftjA)=2A1 zbF2SYxe~oZaowt>ZDQBGr`ECkimf!QgM>#(wU?7-$>^PY)ka_b4FWaT=I0p)EBop{ z$~f`U*+g4o(;lT_x@@``u`f@1YzE4}2zXIocbJwvn?Iix3C=%&oP#%lwJHV`x{edMzWIJ8deA13}L(C z#@Gg=|4^)PsqFcwuixQpQ`#=lss7}+3Dv3CQ8i}&@lZ25k=lD-8%IFZi;`4PD6VA7lXRlv>gBxy7WJowosvKhayPkcq zfSI61{hYVrq*Bcp zl&3gF-^(hz)yx91;d;y!@zGjSXzb3|!9sJeL%2nDLv#-h9>X+wt4*T6HK1SKd*KYS z$!Ud6zz6QHYoQ@H6qD^WCeKeOThxJ6p4Nc>3Kyjgz8j=EyycuV(8oJWs948he#O(a ztL1x?8c!_q^@QSdME~;8nOMKSq0Q&W?S1jPc}f(GXWT;*$fku=vvi*RPCdM26pX9C zkUJt$VCgQ65pUQJW6MdIh(Z63-0j+q`|;$gqC>_)v}0jp=^B}T?yyAuskj22^xZyf z_GstR0m1Z5kI%xj4+e#bp^Yd-)H2XmO?sNnKW`8^;1vG+%f|RwBiH0vV=V!w@n_S+ zfQMB1q-<1Fo)F#%=kh(&Gq}!LT5ga{MOQA)-s+%89W!Khd0fM#4>I!&Lp^?Z+#BBi z{jGG|-%Z!?O8j#j4qHcPb?QFEf7t(B(#WSO8LsMJt)JV)gA9|MFSQ}$-PC%g74Q{Kl0xLv`bv33S7J*__#kR@S0U%_2&{1* zM)6-Be+s}PsyeOus>Nx0V&OM?A9##SZKL$@prd842hM2oj>s~WpNH{3Z zFT(kQ)@h;9(<6U^z!Oim0g{_K%e|n%1Cf1NoqEhM!zjL?BFpus|40>cd2Rv!K@D9_ zdiKO#v|=0{5Pw#lyJ?_P#494Wl^y9U;_%)nWCv-M?XD3w;n1UUZ?P0ZY8D(YT{e$j zdAD(F(vd{8dA0w2joyn@F=M~UJhqb*G*KxxrMD}5TH!vWY~u0Z7%9v3Zka=OUU^}N zFL!jXs_0y72Psj=ZE0Fd&t-W(&x_CF#4#7Lo-*_dytn>p&Iod<6^7re*l!t@AUJ7} z)M_YgP3}%oy$4ye9i4m?byA)5I)dx2@ZJ@D7e0v%SxT> zdYsmI8Rac|hJrL-1}?%6UwC1)^H~Ls(N}=Z17EhsMagmG9DG4D>5tb%^GGt4suixA zS2i`kLzHQ5lYQXs#|WMc6*M#}8lrLR=k47Px%93_lOuF0`l`ONwA|67z|M?6ljE=_ zR*r5?>EWe!!bY2P7$}K=?xI_{iC>p7?)ST2eV(AQ1O4{lUyg%_=(B9?pEgJoi*1`G zFDG%?DDeVI2gG6^6pIwG{X-$0_8)@}cyBI%nw_w?M4mG2DN)STn$#cqN?p%+bH++N zogq8ms3T_3^u2F2x!rR_)IRp-uxEDv;3sbc64#c>t*_+cR+Pe5sA{#_g)(VOG!EER z2Q3*Q9#{A9HKt_?OrZx>>+tPg#%+3f4W?8T1xj-gmUT;+_Jq;h$RVk%mgpr1@^AJGZAC3et=;tm$$eDm@xZr#(l7TX z*EXA`NgpdA*yG+m>zAw8qev#F?z?%} zYD@Y#w@y#+pW?F4Wb5mJljQ~O$pz8?L>L=*w4(GER#C_miS@gdnzqni@e59Tpu}^G z^>@W#{k;v%YkmEja#eZxN^;2GhL$%zemO;@0|__iwk{~kGOfFsG&qdR#!9!y?mi5C z50HUlM6{QrFBNcu+FO9OoDBFER#tn4R0LXA(jgP07fj28DN2nYdT|Syj*fdkaPSpz z$E7K9FB7j+#L>;33CtRi6_$rt)%^Ewb#x4uGx;3CtOB>{O^SxRpPF1H2 zG`9qm)+~p(|0}@%JTe{D$g4)z5Xh6#8V-Y%$}YuPWMmrN{^6RJY)GsRyc>>R4Y?bx z(D`_o#L`OeUule3EgFd2>M%n^c8!wr6#)!mGmrJf59|n#Ixs8atIe&B&{{bns^{t2 zh0!xJ>`zZDu9{1)4rAxyIE&>@WyB%4rN6ci1Elz*8Y85_Peb659I+)?_dah!;XfL2My(Ty-Ql;Eyvcg@j>GrmP|()%UL zk*6ou?LJ3uc*AyDGmKbN{!h_V`)_M_yp2Jo@hm4HlnkNTW-T2~UyIQltA)B3Cw<_B zBeY}bcNktHK;)`h(|h@rDZD&-@b|`+9RW*WUr0`WZmUKs5Hoq|O!of*T9_QfW!Qa~P!DO`{igrEe%{bF!nA*f^Nd{`pqF zPp;UTuQjcdmxT#0bs4wc^mTLTm)y4_%f2q7)V|C{UG)_|OW)>`g1}w)O2UyHw#0F| zJG^8k%EYmF8unes#xhf$rzuv&S{{Ikv!(uIT=al7;rAqKU3c#EGyqoFzI|Iu&1bJ! zKKYj3DZWCN+^=Xku|^ZIx@d;r^pKK}O>!-0{%!71fb#%D{;!X|HUu-~G2`3E(@oU{ zl4iB4{_j-}ipE4h_E?Nlrs+<@BB3*1smNKT3gVwkGixj|uTiX2x;|&5G#omaM?Nj% zG@>N8u!ZT=x9li1S^_&&gKh8mvpTo*7UOCbc8EDT1Gn!da8v$#NV;CiixsF%{IsNLE z@J7|siE=(>t^EE)aqIOQb+^X;(z?N-M5}K+$h#Vvm3OA2?7*S4CZg(eOYQAHziYvf zrp&-E{W?CN50!UuRRcU;Jb$HwIF`|JPi zsp)&hy4rA@30`c||Ts}nxVfT9zFL1R?}(<$b6}2$Of4Ox?{K`;)pdFq?R6u zgy%{}s?ZgekL2R-sSScoNbQYbRl2kSDy9^xq4;abhbW$GIuj94cPSL!Y#uZp3B{)@ z@7JTt8fAimWp!P2>MFxRW})EW0EyPLMdAEjK|u`SB9PNp-)KvF$9H5jwX;The`!1$ zOE{iuNon$u7^)U{Eddfbr~|{Wo)YdLLxNrSg+Zv&c#)~(Umb;pdu#+t4{Fc3Ye_4b zCE2ZMRw?0yl-A+sb)lXoSWkI9*w#*xU1T+sG2{0H7)ABkkM91BEa?mGQiWG8Q%vC4 zp`+T@2DVXd-z6EJOXs#i;<;9d>kl_H!P{Oab!HETo3xFrcCKW2G@)^F$k_-OwnkRl z_&nj<(%DEn8e5z=;&d^MQ=-51awuavyu2BCy?N=V#o31Q4=@=>0M~Jh*`afVpSUstAxP%1EQ-=mo@MHk zF@h^IX-WPl>Xi32iWQk`jFHkK6JILW+>H(@SO<3N`Udb-%2*xPzcv>Jc`(ED8!}oi zzWQ_HC=d(K2N69{d;A*+>cg&|<=k?JpEIdpcFs0yNd2s3fox%;X$R6+%)=)6W)7lC z0a6;Px*_pNJP?fI34P;dmupunCEiJ zmMw3G|I`(=C}h`D$geddWZCy&ow)M==#E~~_RjTH45^RmU6SwfT;Gar9i3GyNL`p> z>ePHN`;J1&%wKI*k)aQy;Sz63`l79p-$aMYO+4glGnu8ZGb|}V*i2WI1uY6p6+?Ya zzwWE}H$kxPO>2Zd^@px?qw3FG39^)97{_Q|T?wr7;}&eGxyt}f+z7A&rl%vxQ z`GOt#R9ot2v!jAMj_-!V#}|^S{-g%``^Up?9G}szC9O|KOQ=#7{XAk#Cd4lnK^m@K z8LIxc{Dt^&m{#O#;U`UO#WyMFT`>0YcYmCIg=Q<-56u`^)ecl|xp%q^S2m?uvF|7o z?T$qqhftR~ByZ=z`E`3;31T$N03K9Pf`fxuQG)%!R<9)+`{SIAYL%+!9LD60IkvN# zb5xJgW@X&cr6!xnnvHiQmv0V9Y;A|ARa4cME&))U7nacyr%jZv9OYOvP*DK0d+&&$(myECBKh7>-DbIN(s znKc9P1kLVZ8NP4Zh5q?>^zZbI4)?kamYvXTA64mb(00_y*XXE}4K^R~`w|y~_7e19n}<9^x53+dhFz zSbpZ_C;~q!gT$_`bgAyNuOLOUk30dFsEN)Sk2Tw${IrTsA2}(1mE~i_Fy7B_;xVA8 zFQ1&s+ecpHzlR=|Vf@nbVt#jrr>;}hnGPqSsonCErI?AVU!`9^b~Jr?<3fYQI=FBj z`D;0{*n|eE)2-%L6@b*LLnMw=(SG;LE_4wkF!zwDaIMhDA#wKI)p)_oHdUTVLqDEB zb}n=s+0uNeaTsZw)0x1$ITj{c(|X}Vu=7ThzUQUl+^sMujOkAnx%C@)wru5{w3N%` zG&W44cP4~%eh9H9PYV&hCKdfsoV!01k&VkY^gEj5ISLv5-3EfU*m<_>Uy`j$&M$*P zHKkFYP0}9sAuAIeU}5N_3G5UWaWaA9A-W4=hM`rW^Jnw1XXe79NGIXJJy>b>_p$dd zmXrzRebSUM_!3OwaqN2>50Ozb2`+5hTl#ww@NjCsV)Uf?x?=JR>$Y8c> zH$3(&2FjfeK!W3KZ&@5BTNJN-u|@4@iZ^$ZSZ2g2{tg7Hd8E;;lxt2DfdZxBvG1>s zZyo*V?i9sw$_Jq+X{>J!s`D9m7QLXAMoXERNY~wC_#-$ZNn?h~PgZ}cRhVcp+7rCN zwrf`-5nQE(o3B}FKreu9`m}`c>yFrgeI~KwH*0Et8PBiUJGku?ohax(j#Z@G6sJmMG8l(mP@H9m7Sa71X!@L_vI=>SIug+_pk)jo2d49viFPLE7 zEA$-%x{Uo9*-lOGk$w=NsY3(Dyv`S>#m;56eCGPaU*GF9?Od9f`$I&MPGo z*g87@oWJv3oV-l&%xn$%c?J%{ZJJyNyw$dt)}UQ(yU;QL%C>e#JfkoZ0;||<53`t_ zAt*t;nQuq(j(xe%T9ndke$WyS`s`3fSCJh9lz4#9f(?R>E7>xX^?rQ$BGb?~H*`p$ zIZS5p{JGIY)*2T+AfcRTNIkCM^~-JA&kPlmu#q5`-TLhrF(#m(_e)VFlhMSEw77sd zxo4g~qYvE%+zZVIH=_@UeMq6E?bG+(i0jDgGN!gYK(2IjQ)Px%`@_T@ocb# z35Ym-I)sBrN?FV((wVu2$H8?Mr8d=##ECFnO@z-p+RISr2T$ z#om2T@CkS`&p|(cVY2$3egH3F74<@RPRln~d5%S?*n95=NwP^v{Ld6QJ+dXj>+~N6 z1ga!}@s0&q_H7Y?i~n47X4hZ&ObSor@7j2?-k`TM%x6E)&?H#O+YiojRBG)-9r(Y* zMGNJU10J)K@U+R9Wqq~?6evDySh`56b8`cd-aHa3MklvL^_Sh1o;F@ZXy*U^JR5)v zrYTWkj1?rFG3bf;gdeq&hwQu)LE1i=52QRyA!xaR>~FrA*Ad<7mizeDS`g0N(8UGR zpL)FhN4OVWFS$t)cxbuNVoo}7S2o6KCbMXw0Klz{drtxSi&m&wq{?T|Q(e4&;V^|* zh3sVsB`f$!=jL(ynum?ck1^`iD*O1jPe_CGtQD56Cso7*)0|929+s+5g?UjWcl0wQ zOdCFZ2(ANOgxcje2Q~T9YigY-?;ChLgwlOQN)EGyrUJ5-E%`)$^wptC1Qjtd8Pt&s z%w)%ZeiR#`YErocpIu{Ci#$qq9~E4cVUCzLA&yh*=fIy5osY506oOT8l)iSIp7~C6 zev;x*DMx-my4ckRQ_NEsZCB8rI<23iC^1QD*@QYZU9fYR)$)ZMm|Si8MCq=nvl&L?gKJK*;M$_8;Jr%@+WR=UiL9ymNdNA(YF869WZz8T;c zh!>!X2CU2YH^v>39^OT3${vwR4nuQ!E7aoL?&;G1*i;-$gqVTo>eigUAM_G?)Hnv7 zY96Us(5fI#Cs3ZtBzov-Rc9DrAOW2WtYDbTn~*t}*ao4a{JgtdNk$2*2iTe9S2aQ}!w z-!-g}ODN(Te;8uQ?^L{8vBE(r^xe{jGM)Wj+sM7DJ z-WCWytkBEEBmKd_%|nIG$KH^L9CVPEomUo4Y<0**Ur6T>GbxoaJe$YUfseQ{&0Qwu zQa*B4dLVh`3z6~whZh3S^+p4EkwY2Birb2@@>vd%kwC zV+>t>+PdOaoX+i-B2v>4J^dyMUm@Gee*7bR;pv3z&y&VfF13J`KSvRKAcyG_28JSQ zocF4T*gNi@E}juFfg_^R1S{{QWiXh2DSD}iqRJHnafZ&mu@4UTfNv8q9&;eIUMo!f z)qF((ejZCE^Pvx*Dn9qv+89msRvg9-NqZV3DTZmVS!q$S5Iw;wruv>~^jn5u?WQV* zVKu+C1slXzG}}I1dM}Us47D)H_%+Oa`rca^j&_HYhcA1A#8LP=VjH|Kf5+4>wX5DE z9*W4|C(CKpa9Y!IrkG~$Jw`}NmPvg*Xm>H!9ogu`yl@l919L8nG|b-@S!76vq@%?= z7l8?T;?D)ULvDm`K<*%Rm{La=o%t9>$_!cS^gfHDvAyHlF|mv@!COoWiXcJ`$&W$R8xsQRNDpD4Cc1P z_ww^P&FZC@A)}}g!*eahkFQSU?dDD*meO(_0c9-Peef0CsHpv->SPG0&L(Lhn104R z&m?w$Cf|yb+D=3jwRuq@Wh!`aBQcbq_>bnfVkq$6?LJ+@;ySlmemBy(MeT57#F_>O z7)Rmue&)kQ_QcK9Ge@C*=!ciKs;$IfO-d6a(sv{wo@E~~NM@3LiDME-kjUW`W0ASe z7h^%^gJ=4#`p|p(97DAAXl1DwOn!TWez5XtAiRl_r9?+o`j+SG>(5>B%w)6PNzYgCYVT$$6XT;;i^>OpDQe+Z8Ql52Z*ju(J}i`o(Y|$*k;7_nk0Py( z&+yc{%x*_Iu z*x6LJX^^wU7 zk}2F#OfWEe9VuNyYxH`}V9ABBsZZflxQIKBPjYHp4bek$>&}gaB5-w;8=1j}W;V@c z76;&OK@R;rkG#L$Q9H#Qr2_IxeqUr(G@rufbXc9@Pzk>VE>kB(S{*UXhwh0UF}eD9 zu&L<6=>;jU^#xEM(#`*Hk-Sxq6j|tVb?(emTRNY1zcvqn_3hlVPK=_4yQ@r6-t@js z$n<$gggDc!+Qy#OUiBrJWRY>~DA|l~GaqURtpA3$yqp{ETWY-jCJ$H?Ukk5;eR_h&FB$5J1RZD2$^wBbFbOHjHEw)qdwq7#$AtNs-XVlk@nnrMsqB}u zsn&E{bR8r_jzR+YmKs2#qlF?QtidN}k7_-vE5$ZUR#nDD^G7YB>WRD~ZV#vaRE~qY z|B~2W?xb@*hU%Jzf?KJjoH#jSh1XXyjfV2goz!eGQD%-g9^N1Suzf5Ng zI`S(b4d6Jr;6ao73)349K;!AoMqVGdwdk^{3dCh8Zhp!`4yX$aSbUX=fj}oLY=1+(B7q&f*8p}(Ee5P@8fz7H@#B=a?sz|x@yg+LZC#XH&wB{I@Foi1Dn@z z!TZh+eLb+oTt7(dDF4EfH54=*vZ_-$v4tf|w!0<{A4A>uPv#VEHqHVgRAv)o-LvaT zV?Z6U8c()=<=KM7z4|BIs~mV&?xPVC#MXpYy7qMYZe}qjMm50K;O29jA8N&;Vig7e zhLEcU(fcn63$n7@gh90*Ey^E_$65e))qid;dAmWjh4{6v@)WFv7F{<@`CO=8j3?bC zlPYo4g`eF3Q7X_6`KiO^gmwPzKGJYY(>|n%sF1Kn9Ykvg+G~3AEDqE5oTb9K>>z`C zdDn!Px3oH{jzfVlA-e2moiGcl0+gt~IY1Hus9{QUC11xLuXm}M ziBgm9I_4G3#c*PY>jW@%h^{E4CTMavorp%zHED~+6yWhvduzCp;kC_8ubdDtd^Sb#5nA;^bN!K z2Dj;&K_5?*#wjA@c{eV_C2Csr7jJQzvlV$V@=h-zbSHV9B7pjZGh&;&Ao{SPru5Q% zq^G~eFyBmfd<+9wHJI=3Tkq7fmoES3AoS*yE7Dap*@M^dGofwn4XsmJXCao7ztv!A z|HD;i*37AJ5Zw8&=E*|v*f>ulr#l1$cNKiamcaVLaQ-}8U2suxb4$3JP`<5*Jt^2a zsDx4UT&tUT4M1r4q%0#laiS(Q6IE#jFpDq0h4_*x~ShHoy$~C z?~$@hIzu!Jr_~;oLfPPnnsLMLYzB&j20Rx4PNE;17w)#|$gCugT=l>?@ihWEzDaiGn-_rdhM2fq3A zo)SGR-X7#G_)={;Hbp(J{Wpyem)ny(!od|#U`H5s()T*6sd_YewetI*e;hL(==U7$ zSaAkh0UfhWMU4tHyZQA6;$xvhsFd_2&KP&k6g?6^RU#Ukt9*Gj(PFtYXau1jR79 zEWLfgt9Ng{1C4B#j1<6-vUUBk?PT;O4Rup~eVevrZ{9i6{Zkl-DyXl3W1n)P?D%ea zq)jqV=Z{(Ra19>tw1gviFkW+YEi8K-Y79Fpf1H(yIU~dj ztU{fFqSI@EFgN}E@4(0m1oF$U>p(0?j9-v!r{j%vIZ zs8*z68Pr^Gl?OQf)1JmW3}f4;PcRHDzrxoF|9`ToaLr)VzOq4|T^z7l0^O0F(Vv$q zE1`;1{LQiLb3O1$kwXPZiLYFE}QwPxs+Ju?RSv2N0^Zx3EaY626dl z_3-_GhTu?QHA87x$Dz@M!J%0OxV#2$3ZHOHHsuPx?#LLFQ2qbPq1i$~gJX)$%F7hT z3Lu$XJ@pjzKui=fMs|Utl3j8QUkl0(9jK0zctYU+>2l&iS|2`woOm%cN~OC@5$)#W znqw}9kFTr?s-Ye4T*<`yVf_&XHZ;h5ub#wr~H%Hh;GP9#OCu=zfg zeHqn2altg&3O=yh5|-4(RPLALyclJE0474zvu`wcpS^a!IqN~h8|g2s+$xS*o;n_K z&M^oFGj61u9)I8F4LkK~wBHY&yoNXO)Dm!_1*@yGVnT+^7ln7G88-IvJfpd^yyyXC z9I*?Y{=yA#M9^OBQ3;%uKbTibkagy;TBFo|R6vg{rp|&+yE?5#X4LWu#K)ll&|!G2 zxq5#}fr&Q)_5ud0?M|{^8lj!XLy+~7BMCH1!sBWr8j0SeLvo|tl@A)9HG;oYT)glO z5npm>aYfwT2G0665_vSWfBJ?R6a_M*@9a-BMD_Yt+<~?h{tt9DkoPy{fIK;JMwcxR{iK)THCo#Ch&Ob2`(pFl8jhA%?IG}z zb0DpZ!Axh@VNtfjG_#^>|C6`w`Vgr?$-e5Bm5OiL;q?IB1c`iU+0HgDaK4EpM5_2< zyV4oQtc6FRKu6A&t?$;UKDm1kr1(s6cLPBuA-U&S5Ls_LVXjk*-hbBZAl>ruE4fC6 zr`?1Q-4^?Voip#z*5l!0I~ob^?lrEO;|SH#Cu4}u%$ksLbLo4!Om*1jJVg{Sn%&50 z<8!dBz-AJ07?KEtaZxCM0{MSMMxU9uMXtHA7g2odETVEZ3UDkrZ&@#Cg+GLa$TwJ` zqBK}a)iyJ*t}6EE5bZWqC4IpETxg4#taT{d(QVy0NWWR5;f&oLD&?K#*oK+WDBf?G zuci=+{lZ@U{S0U~>3n`G!W+B@`Hrz?BE9=n%V^yn#?)*wZoAkCfNFiH$t1IEGZ|7@ zFv_%S7vmAXWn*2wVZp$>e3O*SA1SE{T9F`~KQTgX^a>J6YgZuOYz!3&C-@gH9QYqG zqx*=-_Jzggb!hK@<;r#$9;Mr$#gyW zg-Dz?u(-cO*=AeFf=x$dcBT@|-goxj$Zj+4xuC%IY85 zoquTSk5v~reLdjM1FVbtzM&wMu zLfa2;waC)i_}2YT*`LIpciJS;q+*dZOg0Ar7%0EKMdnx8D4bx^xf^ z20{>04U-+WPz8)k46>$UU`P43Dgv`C7;PolLaR%+pwpXfup_xh)=^S)+RwG2}Ilh@(P$7d_XSdo-yIJ;brJmNyEfa`1!`|H`B26DLA)mRuc; zg~twaXL844l!#Kp-9}8?mlDlvae4GuhDMyXg;2&pt$q ze%F}Jc>)rue+@Qs<57Oi@;XA^cz;Inw|+Gj_eH)uGzdUIB4f3n?Fo9x2B6tZY%ZvV z#-~+JU5}OrDeZ;A42EKqx_cK2kRDP*5$wWtxt0q*=Z80u2Qa?;VIC2H#apbkDM*o z{e+1jYUDQ^!Uc!mx<+*3As~*Hy;~sEqdw!?z9O%|nJ@VPNOZuQ_z-cCC!2LJn zeHzZwD>iZ)Q<a{8bVliXm5Cg2r97}lR|I*9rF2>>J;o{ zt%z3f8%(hDOi1uHF?hGOYg+pH>;Kt?7`^X6B%~U711_jWLD-m2cxC z;YyVsQ3_F86?yE-QO*7CWV)-S+^IHg^6!Sy2Nme`SnQs=n6?J?@wWRBfS%77nO(hifsReQnVIhTIM)tK1UJng2tyyjkA{cu?q>}-uW2Jl8 zU=AoNXM&qpIHfX+0cQkdN|W-lZn*C$+TXtG_BZfE}67k;8g<539j zZE>9ZD5A1)B++MME2n64d#Uts$1N3oHTt|hs zlQ>lL))H9VHbwT4XTb?!=*FoahjG)qFU2UOpbcwiXA(zWr|nqujYHPMSRpmgaslJa z+q20O49Fj^ijsxTuf8`)(MJ1;mFnvd+gM-%NEpUqZj?ow(&^ueGRVhY{h0{$ak;MH z)~r7|TB(oHYZzf8!8(h~1PHK9x$GH9m?Ha4{WCF~KMKk|CAaMQLsVONKksv;&s&mF zu?W}yJ+L=~P&|b_)_c--ycNMi;isPYbIn9UPG<#hXt{9FgFZ&e?3V6i)h$(vYj$-UUmL#_%uf%kg-aM-my9V5c z=>??o6JGnQ`TL}*!BcJmf{xXGm}|$X`~wg9>F*Iv1&yKk&aiTd25#a*b)~W6ynSuk zFf}_KdQDqvMf^_B&iyDH4w%SC6UWNrUEbcv?vXd-eCI{t@1V?d`$2^$F`+qD-}+@# zs=Eqy`$WrJV#2wt0Hth38UZ`LgKo)trok~2fx2RjN_dxBxx#}Gf0EF~wdoz!lJ0rw zBCM?p7K0e8L>f+xraaeB51-cW&v_E0e9iylEvzCp{pHcA1Qlr3z1}>)pU{Ee+Wh_I z;O=mCDJ2)_Mh6P!D8CkTF1u4FQHHGamVn7N)TF}GaxGw;MA-M_SNj4bqh1KTiN1RD zF>HCk?KYDZhjH4|(SF@3$Y2LrrSgmo#U0NB&t#H7L-h-ce*+r53tQONXeNGxEcct~)@OgRzF}u5DS2!OsvczZAz7 zU3OLh&rRI1n44~^^T({EDm}6mNkPUK63#i2DS{ZUe%ut5Raj)44*mU*?o`mR zMK_R#W#}h26(DcXMHkbPbRW36u=3eGdgp49fBe^);rkA}O>yz}63i(}ZCEUaSrE2u zgIPn(9VIOt46AL4ECHF5b&;I)+>XYt7=mD*a$bkl=61TF{iFlIz`cdm1M_Z;_E{>= z7GIJ#7@FoUaSj7TY& z>>D%&$yK@_h-po|d15&-k&Zq1{GUaQK4V(Phi6I$O7r?3T%j`7bA&ptCWHYHJm2|0 zCdB`G5OY?avX1L9kPG^p(kUHvgqo3MEj%p5Zjrro6SaVb$T*tDEFk4+BE_Hm7%Oex z%QzCX`Vj#IwGP)56iuRrPl=f#D8tT7=WN{XMxHX<7%N@Nds|y(@Z&XJ;JAbZn)KH0 zBKEDaa5pko5P;a7pT1q^@^M1xHxaLA%o2{cr`wPJaxpRkN2-nq-H91hu9GLQCoFxf z3KUeg_2D$moj8%WF~l8sQ$`z4a)J^~3WF^_E*nlfhWBL=B(TG$>r~)mM@qA?nw>xp zll!tQ*~r<-zMGorojP2+N8b#d(pBLVb(uzsOtBhUA#k5_=oLw zr+j}4L5lfWexIm^l&K((Ptg(mq(DP?uJ-3l!e<8#YlB-z%TgCxryA+3k?~b8qVGkF zhlC|~pfZH4NOFar>pYJ|u{MFJH13eL$uiU#KjzDXt+I=|mw(%cnD5&q7N0~G8thYU zS$y3r$^c`^SjVuw54VchLit^az9sVz=u$@UvI6|8zZDeOlu_RvWtDS2~9n_sIeIpO>9CzE)v z0Ku$9SOj<~v!J^C?n9)3k85g>Q=^4hdC8}aF5OOl=;=4E?E9a%UBbfIr@d2|TKpqc zA!aIWa#;O|slECZ9twXMSphUOt?eI#x|su8WkVfFTa#&w={6=aP-`s{b<@K)I)TWO z=~pJ4Nq-ad)QQI0CSK%p+m%fVKQz=gom?+2O@cO2`G2FlTRoeMu;}K0!&bdEpalDe z0+ptZ4KN$NmFliCt}@cb1g>-L}DtQsz!GON@W`D9^P=8+&VGV(va33OU)xf(n>RyB-~1~#sAaQT?R!NwT%N8 zK@ma81!h^-w&YJX)3$#R|!Wb((Fl6+9%OOM|6gkSdeVwx_QySmg@I;@Ri17_UPKtcBnth{dwnEa14h%Z{ems#i~tCTvJ>>iOlHRE&N3d3^=wt$4F&+(fyya^w4ME4G=$(B!m-N}nJ6 zgZ#bD8xMdKnuk^?Sr9PgR0U>sKwK{t^e%0-{O`H?QzjV0r;Wd;n8<{h^X;_+%T^vdg{vqzlWh8|R|bK5Nxx<8pyv@!|` zu4e3jYiYL)$!1qyVrZlwWj4c)MeaKO^?eQ-PTC_W^B!nj=e?p`UZefgQ7oC7#ka@Q zf6QIqQGvcalAf-3*K$+0$MZVTMrEk1Dr zEo(cMk??7xY=YenCLc@rZOTVMio3{DDY$@oh zDPJ~-p(6^a3YXl|dkym_V4?Tv3fBGvfBVp-78l<JLb#h6TAA5?rnNOdJ z*wgrjVU*J=*bCoXAt<1xZ(`kK{7G0?e%a>cr`R1Q0ED+sQEK#U-B$Ib8 zbn5qQ;IXfREhXxGb|e(pt23nKp=zf176*FRLQRtknul-CyDr`(z<&t?i;sQ(&?246DHE})!#yBt#8+I!A&*?>9rqPG5{t@z+gYTIF*KF^HjSPs-jZ94 z*IJ4vrDb8&tnZ2rGbG@>(AW%r8FUOkosvv1SzGUWG6 zrHhfr0nO3-^`K7Q59IIPMz8#`orK8EK~UE^+oYrSK6lyFbm@N}4uF4}e&9SJ0JQEI z((VjI5Y-r#j0ij~r(qYpbRWRJ_fl-+`|~L9?z~TH^A~cbuvfsci_S3XR^k3WnnC4C z(y>sxOOl5*_zHef)CuL*=Wq@*eixiFFW&Oz@7VGcrbU%C@0Z};me z#@@`1qoMnEwxtegJPGfKjzytn*U=h%$-CS4Z{;$eFp>*SucHO4;i)ZQex*{sKV2nC zT0g4rmThytI=#tRn@OIXt^8uSGp*h^=W{v4y_@fmH@@fBp#=}gd-GQm;Wi5oe%|Oo&_9%6jUTRc)Sy7`C)8Tv~1Op;*@SP&sYTto8&GaTo(AO)?Rd7H!DV zv1%<-^e!Urh-iqQBlFDgq%0r~^^iupLnCO0MtU;Oz<*xKA$o2cQsgukFF08c#S8_G^IQnDxXvC`&-kC0-FbhSIOv(TjiGKM(Y;WxbAe57ct$SX-*> z^^VZ=s!w5af&c!jVFY4LpGeHcOy5t`&cCWKhp@}pBp{y#0}@tluQ|oDc0^8KDBouu z#_9fu()#rl@sV6zrCv&E7fD9D zdYj3C^YS5OW*JxQ!SgP}0a5Xl)N0Y=-O9@Ww%yW{A@==JDixpLO~JTIq2;VfJ7x0! zl&}=w3GMh$z1-hMAA;e8yH9b_6Tro?qc3pM+s%>7XU?yx-8q_?Fid3uNgJp_>5 zu=e4VfV0EeROGJ@!fpqbHcxkuRaOSN*J}D_N~ik?C%G*kU9#OF29<_W={;P+1o7D@ zVj^~Y_pn)oe^i3B%`W8b25_~u&7h=^f%RXGamaF%73cl-TT&ejd;+RFckVp6v)J;` zlKW<2r1tThI~fyq?vMgeu&s}+*4x((Z}jb*;SNySeM^_O^ePm=^5NrliBAL`A^Tn& zE2vZTy%KN_82UEYp-bguWmR2VL-UGPaeX9k753h^myOk%&cu!tJsi~ zS!eF8tfliskw?y7Ci%WWH|9ehjbp|r-f3y(*f(8^2X4@nSgOd3f{)Tc3Z%m2sO`{P zF2vB!uZ8G~@<53`XSKJ7o`~#=E#Fq*8;I-eFgQmqZ38M+D|w_ zDLZ{Kl4XKHGH-`E^#NB0h`5Q8F2&EF>H#z2$-G-AHnKZr_0YtrZ+to8TzXWI@F${Ec+%PKdn z&o?r!uE<42CVFaBp2HU}UMdT)k$J$Ye}ungg6PvQqhPHD+9%O4Cl@v&GWz{aZP%A z*=kd>7b|5P&{S~-cakCr0=S*<-3Y9UF^y+ktm4O=7U=BnA2+c#+sYp2ZLcAxK1su! zF6`RE*5Fb7*sKToK1qmVnM88kbSFbxsX@;DBq;p39%NKU<+(SrOGd&60SBNiZ!9Vm zZO+fi?D|(yy|}m_CwV6;cjilA#e+F9e=3mGBZixt!H926!#G!y%2T1(*N?*}CId&e3zvQjss+_}j*TTlo>dM{`@3dmajwlCXbf5Mo z){I6s&D>G42`kmn`Yiaz3KLzp{~TiG5NZ{HJmM`H?BNbJ&g86FJZEzXuAKD8A-|~` zq&4l1JCLI%HD6sk*Q}MBSIGQM{Znpo?+b@FlLcG;?E5K1H5>tMV0a5o$YWUildqm) zj#tkZD8OvoFw27Dr@c;nLuLJFfp5-2dEhkVdg$K0Uv@uzPEf_1SO*Q?%>dS0As zlah;6LhTr~ggwojTwJys@5{Fdu23y(+!&KnKb~cC(UP1mbIv%?m|7$@@Cc<$`3Je8 zN2Nl#;PUY$aJA2Aq+jc6lmm_0x4@^gx^VqcIJ{8D)BbirjGI%Zz6wRIfwu3z=(T%16&0%xbq_30gjpHeJ1G!H^@NRB`oJ zej8Fv5RC^X9%)sK@BSdyjG8RR)@5`9i7L0YJm>3( z^xa>;Z}6kgJ?ArE4jZe=P_fg+JYzEoCgU-SeX{Aet$pQ}XxPNa#a#(vFdD z?aYcfYFimUI8Kl7A_F3WTYH{`^pKLCLgoL$=U>8^k4V0;Eu`r#dcckN-d`6))ELt? z;4N{}!@{~%Y|scqKxcK@Zb0s~zI$jav;WCXm(#cKWc zNaz7;pnqc-l!t(0eZEw{#;l4ntsG;sYi;Rci;OxFVX{LB8>ZWGe9T*>yn24r75*jv)lrvg2@ z&x)FTnEdan(`6%mpT58MZ+1GOgP)@+97C8KqhZLh&P1Q1Sk|z8i_yyA0bj4<8NpWJ z>T4!;x>0|zz^|9D+QD%__~DL?Z&wKV22wY!gZ$y5>)|sciWG##=J5W?1~SBfrDc9` zvto+&aU~bnv%dbZ$mrJ#;}$(Z4+iWp~lFIB(!uZO%bTEvEw{3 zU#R3w3pI34+;YP$p*784$j{%4rjU_}nz@i+ZIO2^W)f_L=8l(WJdb zJeyeVf0x-*xEppnjY5?>no zK-ipwn?gOI%#ciju<*U%aQ4TE@t!Aqbpnbs_9QyLUxv7SiQ|@fViPCi`o!)%-QW{- z5R9{Y2VIcx%++};m;x0{8xyzSSp@0rA)e&P@EG!{pmO=00F8%HPge4AbB`NT~O1A3X0A8Up2Y8ST}R;^K$H{TbvV)@_@ zF_t<|lKvITFoBC&mq}?qW<9j_e8D-I-S-v0LrMh!^c-r9(ouZmw}xbepF20|{G5t!i8ExPWlx#r%h)4lX$mLyxM*?KH? ze>VCLW2VPE__w4=FXhjPxQ>+9Z47%WdRnyXz=1mr8^(MJ5xF+KX<+@G7OsAs?X*14 z)~Q-yIUkV%jM(>mG_Ssr?YH2ql|msjJNFZ{-zp!+G~Y|HO0kJCMvrazU*(96gF*Ii z1Mnf{6pYu+QH1K-n3L4zS!3)=@*c1BzbB}_^2opeb8;KpInom{OrLpjV%|VM%+q=5 zGssjjD3FJI)TXSF5t1UB%x<=3nCT!K>h;D~aQdPlCV^Yng=kq$COXS9zKbdBBXo6T zV}epVdj{BzDrME}d~p5{g1~(VL7%~+Y$YB`+<&sW80rw^XNYwR1}D9?g{dQp1nO-@ z9u0ge4ZU+NEvrZgjV3L_^ZS<28Kp;_B9ZpzrJ-mBV*@JKw0fV(o7zPlhQtbtJ{A zL9X81dK-@(YXr()yY+BVvM_N-<5#@+b040$kpZk%N}Io(O?uXI|TyK-iK=bbQX zD^MRcw~c-{N&OJE+-JF|H&M;B6s@#f8zN7!%jQ++^!F{M5z|)(TN5e}!9Bp;cdazp zeygITKO*Xt8x~tKLd6J$$Vg6>pbP+S_ zCO>kzIkIH$*8`xfF71qi20oUuGXxqu*T5-Cn{JX>ksqB|D3V%sVv5QfGX7dQj?C=D zqEjFD33^YKvZ##c<(a%JC(WmN9nWqsyrbrrqFI{aI6Ya=NDG>38JW`OVq2L{L&{yJ zefFW-{al};EqXyBk$mcT**3M5wZ{fy(qMBRc}-`1V#wk-pU>fDn!*p`Z~OO8-7U1V z=-O8z1)X1KnD`4pI%M@-3b@^q@s=aXk2=EX<3?KnK z0z3wg0>}X5015ylfC>NtPy=WHPXM$4IsiR@0l)}g0x$!f0-gb$16Tm805$+SfCIn@ z-~w<1cmTWrKEMkAKR^H=2oM4Y14IC#05O0#Kms5MkOD{pWB{@NIedmXHozXjY=sMEl#BBu`{{MUgkdpYn2WXR65Vw`SyNXJ$ zrhLhl%(23hZYyESjc>z_mrgEi%bVUTVfzvvoP76xM=^1Ch0`r0ffq;_p8YpOn%*O6 ztA!uk{C}aBQnsr2<}Lp-Qc53}vX#4=L6=S@ZTk^_24?lYpUKPElBM%_TT!NON&~;k zZMFVyTnpc3(&oRTN9p}CwhH)`qPG7DJxNEru;onGl(i-K&xF&>Wo_y22Fauc$l9{q L&y=+V=Jo#o`@#5! diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics dim_season.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics dim_season.tmdl index d718c67..e598abb 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics dim_season.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics dim_season.tmdl @@ -40,7 +40,7 @@ table 'analytics dim_season' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_dim_season = NBA_Project{[Schema="analytics",Item="dim_season"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_bridge_team_season.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_bridge_team_season.tmdl index 690dc3e..19b29f9 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_bridge_team_season.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_bridge_team_season.tmdl @@ -22,7 +22,7 @@ table 'analytics vw_bridge_team_season' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_vw_bridge_team_season = NBA_Project{[Schema="analytics",Item="vw_bridge_team_season"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q10_recent_top.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q10_recent_top.tmdl index 49d2ced..9c6dd2c 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q10_recent_top.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q10_recent_top.tmdl @@ -48,10 +48,9 @@ table 'analytics vw_q10_recent_top' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q10_recent_top = NBA_Project{[Schema="analytics",Item="vw_q10_recent_top"]}[Data], - #"Columnas con nombre cambiado" = Table.RenameColumns(analytics_vw_q10_recent_top,{{"ppg_10y", "Puntos por partido ultimos 10 años"}, {"winrate_10y", "Porcentaje de victorias ultimos 10 años"}}) + analytics_vw_q10_recent_top = NBA_Project{[Schema="analytics",Item="vw_q10_recent_top"]}[Data] in - #"Columnas con nombre cambiado" + analytics_vw_q10_recent_top diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q1_hist_perf.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q1_hist_perf.tmdl index 8129a68..ace7653 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q1_hist_perf.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q1_hist_perf.tmdl @@ -66,7 +66,7 @@ table 'analytics vw_q1_hist_perf' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_vw_q1_hist_perf = NBA_Project{[Schema="analytics",Item="vw_q1_hist_perf"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q2_age_vs_current.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q2_age_vs_current.tmdl index 0034dda..075a91b 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q2_age_vs_current.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q2_age_vs_current.tmdl @@ -49,7 +49,7 @@ table 'analytics vw_q2_age_vs_current' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_vw_q2_age_vs_current = NBA_Project{[Schema="analytics",Item="vw_q2_age_vs_current"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q3_player_context_offense.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q3_player_context_offense.tmdl index a99a566..506ac33 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q3_player_context_offense.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q3_player_context_offense.tmdl @@ -48,10 +48,9 @@ table 'analytics vw_q3_player_context_offense' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q3_player_context_offense = NBA_Project{[Schema="analytics",Item="vw_q3_player_context_offense"]}[Data], - #"Columnas con nombre cambiado" = Table.RenameColumns(analytics_vw_q3_player_context_offense,{{"avg_ppg", "Puntos por partido"}, {"avg_fg_pct", "Porcentaje de acierto"}}) + analytics_vw_q3_player_context_offense = NBA_Project{[Schema="analytics",Item="vw_q3_player_context_offense"]}[Data] in - #"Columnas con nombre cambiado" + analytics_vw_q3_player_context_offense diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q4_ppg_by_decade.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q4_ppg_by_decade.tmdl index 5e17689..78f7663 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q4_ppg_by_decade.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q4_ppg_by_decade.tmdl @@ -23,7 +23,7 @@ table 'analytics vw_q4_ppg_by_decade' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_vw_q4_ppg_by_decade = NBA_Project{[Schema="analytics",Item="vw_q4_ppg_by_decade"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q5_consistency.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q5_consistency.tmdl index d6d81d2..1fbc163 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q5_consistency.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q5_consistency.tmdl @@ -31,7 +31,7 @@ table 'analytics vw_q5_consistency' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_vw_q5_consistency = NBA_Project{[Schema="analytics",Item="vw_q5_consistency"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q6_home_away_impact.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q6_home_away_impact.tmdl index f7bbccd..1820b12 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q6_home_away_impact.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q6_home_away_impact.tmdl @@ -77,12 +77,11 @@ table 'analytics vw_q6_home_away_impact' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q6_home_away_impact = NBA_Project{[Schema="analytics",Item="vw_q6_home_away_impact"]}[Data], - #"Columnas con nombre cambiado" = Table.RenameColumns(analytics_vw_q6_home_away_impact,{{"ppg_home", "Puntos como Local"}, {"ppg_away", "Puntos como visitante"}}) + analytics_vw_q6_home_away_impact = NBA_Project{[Schema="analytics",Item="vw_q6_home_away_impact"]}[Data] in - #"Columnas con nombre cambiado" + analytics_vw_q6_home_away_impact annotation PBI_NavigationStepName = Navegación diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q7_balance_of_def.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q7_balance_of_def.tmdl index ea9d764..7bc8e68 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q7_balance_of_def.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q7_balance_of_def.tmdl @@ -28,7 +28,7 @@ table 'analytics vw_q7_balance_of_def' column 'Balones perdidos' dataType: double - formatString: 0.0\ %;-0.0\ %;0.0\ % + formatString: 0.0 sourceProviderType: float summarizeBy: sum sourceColumn: Balones perdidos @@ -49,10 +49,9 @@ table 'analytics vw_q7_balance_of_def' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q7_balance_of_def = NBA_Project{[Schema="analytics",Item="vw_q7_balance_of_def"]}[Data], - #"Columnas con nombre cambiado" = Table.RenameColumns(analytics_vw_q7_balance_of_def,{{"fg_pct_avg", "Eficiencia de tiro"}, {"tov_avg", "Balones perdidos"}}) + analytics_vw_q7_balance_of_def = NBA_Project{[Schema="analytics",Item="vw_q7_balance_of_def"]}[Data] in - #"Columnas con nombre cambiado" + analytics_vw_q7_balance_of_def diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q8_longest_win_streak.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q8_longest_win_streak.tmdl index c71c134..856942d 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q8_longest_win_streak.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q8_longest_win_streak.tmdl @@ -30,7 +30,7 @@ table 'analytics vw_q8_longest_win_streak' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_vw_q8_longest_win_streak = NBA_Project{[Schema="analytics",Item="vw_q8_longest_win_streak"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q9_physical_profile.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q9_physical_profile.tmdl index b59a04f..7866582 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q9_physical_profile.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q9_physical_profile.tmdl @@ -41,7 +41,7 @@ table 'analytics vw_q9_physical_profile' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_vw_q9_physical_profile = NBA_Project{[Schema="analytics",Item="vw_q9_physical_profile"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_basic.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_basic.tmdl index 4f0e011..0a35ec0 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_basic.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_basic.tmdl @@ -31,7 +31,7 @@ table 'analytics vw_team_season_basic' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_vw_team_season_basic = NBA_Project{[Schema="analytics",Item="vw_team_season_basic"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_metrics.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_metrics.tmdl index 4a8b1f7..014d456 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_metrics.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_metrics.tmdl @@ -79,7 +79,7 @@ table 'analytics vw_team_season_metrics' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_vw_team_season_metrics = NBA_Project{[Schema="analytics",Item="vw_team_season_metrics"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_teams.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_teams.tmdl index 3f788d6..7db7749 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_teams.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_teams.tmdl @@ -30,7 +30,7 @@ table 'analytics vw_teams' mode: directQuery source = let - Origen = Sql.Databases("localhost,1433"), + Origen = Sql.Databases(".\SQLEXPRESS"), NBA_Project = Origen{[Name="NBA_Project"]}[Data], analytics_vw_teams = NBA_Project{[Schema="analytics",Item="vw_teams"]}[Data] in diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/01000_textbox (28d44)/config.json b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/01000_textbox (28d44)/config.json index 09f05c0..743cfb7 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/01000_textbox (28d44)/config.json +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/01000_textbox (28d44)/config.json @@ -24,7 +24,7 @@ { "textRuns": [ { - "value": "Descifrando el Rendimiento y Evolución de las franquicias NBA", + "value": "Rendimiento y evolución de las franquicias NBA", "textStyle": { "fontWeight": "bold", "fontSize": "28pt", diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/05000_Rendimiento en funci\303\263n de la Antiguedad/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/05000_Rendimiento en funci\303\263n de la Antiguedad/config.json" index 0b75b71..661a2a1 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/05000_Rendimiento en funci\303\263n de la Antiguedad/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/05000_Rendimiento en funci\303\263n de la Antiguedad/config.json" @@ -219,7 +219,7 @@ "titleText": { "expr": { "Literal": { - "Value": "'Equipos ->'" + "Value": "'Equipo'" } } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/05000_Rendimiento en funci\303\263n de la Antiguedad/dataTransforms.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/05000_Rendimiento en funci\303\263n de la Antiguedad/dataTransforms.json" index f02c7cf..0cb16fc 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/05000_Rendimiento en funci\303\263n de la Antiguedad/dataTransforms.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/05000_Rendimiento en funci\303\263n de la Antiguedad/dataTransforms.json" @@ -109,7 +109,7 @@ "titleText": { "expr": { "Literal": { - "Value": "'Equipos ->'" + "Value": "'Equipo'" } } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/08000_advancedSlicerVisual (34242)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/08000_advancedSlicerVisual (34242)/config.json" index 9fbc94f..77b5339 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/08000_advancedSlicerVisual (34242)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/08000_advancedSlicerVisual (34242)/config.json" @@ -4,11 +4,11 @@ { "id": 0, "position": { - "x": 962.8571428571429, - "y": 84.28571428571429, + "x": 963, + "y": 85, "z": 15000, - "width": 355.7142857142857, - "height": 292.8571428571429, + "width": 346, + "height": 90, "tabOrder": 8000 } } @@ -138,15 +138,10 @@ "background": [ { "properties": { - "color": { - "solid": { - "color": { - "expr": { - "ThemeDataColor": { - "ColorId": 3, - "Percent": -0.25 - } - } + "show": { + "expr": { + "Literal": { + "Value": "false" } } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/08000_advancedSlicerVisual (34242)/visualContainer.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/08000_advancedSlicerVisual (34242)/visualContainer.json" index e5cac66..d17e40d 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/08000_advancedSlicerVisual (34242)/visualContainer.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/001_An\303\241lisis_1/visualContainers/08000_advancedSlicerVisual (34242)/visualContainer.json" @@ -1,8 +1,8 @@ { - "height": 292.8571428571429, + "height": 90, "tabOrder": 8000, - "width": 355.7142857142857, - "x": 962.8571428571429, - "y": 84.28571428571429, + "width": 346, + "x": 963, + "y": 85, "z": 15000 } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_Subtitulo (4dab6)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_Subtitulo (4dab6)/config.json" index 445c278..26814d2 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_Subtitulo (4dab6)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_Subtitulo (4dab6)/config.json" @@ -24,22 +24,10 @@ { "textRuns": [ { - "value": "Precisión ", + "value": "Eficiencia de tiro", "textStyle": { "fontWeight": "bold" } - }, - { - "value": "de " - }, - { - "value": "tiro ", - "textStyle": { - "fontWeight": "bold" - } - }, - { - "value": "por partido" } ], "horizontalTextAlignment": "center" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_Subtitulo (f70c7)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_Subtitulo (f70c7)/config.json" index d070783..3360904 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_Subtitulo (f70c7)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_Subtitulo (f70c7)/config.json" @@ -24,16 +24,10 @@ { "textRuns": [ { - "value": "Porcentaje de " - }, - { - "value": "balones perdidos ", + "value": "Pérdidas por partido", "textStyle": { "fontWeight": "bold" } - }, - { - "value": "por partido" } ], "horizontalTextAlignment": "center" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_textbox (e4aa8)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_textbox (e4aa8)/config.json" index a66c505..7ae68f9 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_textbox (e4aa8)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/00000_textbox (e4aa8)/config.json" @@ -24,7 +24,7 @@ { "textRuns": [ { - "value": "Eficiencia y Consistencia", + "value": "Eficiencia y consistencia", "textStyle": { "fontWeight": "bold", "fontSize": "20pt", diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/01000_Puntos promedio por partido (481ef)/dataTransforms.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/01000_Puntos promedio por partido (481ef)/dataTransforms.json" index 9f9ee7b..58adeb6 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/01000_Puntos promedio por partido (481ef)/dataTransforms.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/01000_Puntos promedio por partido (481ef)/dataTransforms.json" @@ -242,7 +242,7 @@ "Restatement": "Promedio de Balones perdidos", "Name": "Sum(analytics vw_q7_balance_of_def.tov_avg)", "Type": 1, - "Format": "0.0\\ %;-0.0\\ %;0.0\\ %" + "Format": "0.0" } ] }, @@ -260,7 +260,7 @@ "selects": [ { "displayName": "Promedio de Balones perdidos", - "format": "0.0\\ %;-0.0\\ %;0.0\\ %", + "format": "0.0", "queryName": "Sum(analytics vw_q7_balance_of_def.tov_avg)", "roles": { "Data": true diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/01000_textbox (90110)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/01000_textbox (90110)/config.json" index b668613..36fcaf1 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/01000_textbox (90110)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/01000_textbox (90110)/config.json" @@ -24,7 +24,7 @@ { "textRuns": [ { - "value": "Eficiencia y Consistencia ", + "value": "Eficiencia y consistencia ", "textStyle": { "fontWeight": "bold", "fontSize": "20pt", diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/07000_Eficiencia de Tiro vs P\303\251rdidas de bal\303\263n/dataTransforms.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/07000_Eficiencia de Tiro vs P\303\251rdidas de bal\303\263n/dataTransforms.json" index 5285893..7028c01 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/07000_Eficiencia de Tiro vs P\303\251rdidas de bal\303\263n/dataTransforms.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/07000_Eficiencia de Tiro vs P\303\251rdidas de bal\303\263n/dataTransforms.json" @@ -254,7 +254,7 @@ "Restatement": "Promedio de Balones perdidos", "Name": "Avg(analytics vw_q7_balance_of_def.tov_avg)", "Type": 1, - "Format": "0.0\\ %;-0.0\\ %;0.0\\ %" + "Format": "0.0" }, { "Restatement": "Promedio de Eficiencia de tiro", @@ -293,7 +293,7 @@ "selects": [ { "displayName": "Promedio de Balones perdidos", - "format": "0.0\\ %;-0.0\\ %;0.0\\ %", + "format": "0.0", "queryName": "Avg(analytics vw_q7_balance_of_def.tov_avg)", "roles": { "Y": true diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/config.json" index d3f7c48..8391027 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/config.json" @@ -4,11 +4,11 @@ { "id": 0, "position": { - "x": 941.6666666666667, - "y": 226.66666666666669, + "x": 942, + "y": 227, "z": 13000, - "width": 366.6666666666667, - "height": 258.33333333333337, + "width": 367, + "height": 90, "tabOrder": 9000 } } @@ -64,7 +64,7 @@ "showBlankAs": { "expr": { "Literal": { - "Value": "'Equipos ->'" + "Value": "'Equipo'" } } } @@ -105,15 +105,10 @@ "background": [ { "properties": { - "color": { - "solid": { - "color": { - "expr": { - "ThemeDataColor": { - "ColorId": 3, - "Percent": -0.25 - } - } + "show": { + "expr": { + "Literal": { + "Value": "false" } } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/dataTransforms.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/dataTransforms.json" index 8b4b95e..9639ae8 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/dataTransforms.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/dataTransforms.json" @@ -11,7 +11,7 @@ "showBlankAs": { "expr": { "Literal": { - "Value": "'Equipos ->'" + "Value": "'Equipo'" } } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/visualContainer.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/visualContainer.json" index 551be2b..0ca43e0 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/visualContainer.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/09000_advancedSlicerVisual (fa73f)/visualContainer.json" @@ -1,8 +1,8 @@ { - "height": 258.33333333333337, + "height": 90, "tabOrder": 9000, - "width": 366.6666666666667, - "x": 941.6666666666667, - "y": 226.66666666666669, + "width": 367, + "x": 942, + "y": 227, "z": 13000 } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/10000_advancedSlicerVisual (b0ea8)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/10000_advancedSlicerVisual (b0ea8)/config.json" index d57d691..90b8a8d 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/10000_advancedSlicerVisual (b0ea8)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/10000_advancedSlicerVisual (b0ea8)/config.json" @@ -7,8 +7,8 @@ "x": 995, "y": 85, "z": 17000, - "width": 313.75, - "height": 132.5, + "width": 314, + "height": 90, "tabOrder": 10000 } } @@ -100,15 +100,10 @@ "background": [ { "properties": { - "color": { - "solid": { - "color": { - "expr": { - "ThemeDataColor": { - "ColorId": 3, - "Percent": -0.25 - } - } + "show": { + "expr": { + "Literal": { + "Value": "false" } } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/10000_advancedSlicerVisual (b0ea8)/visualContainer.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/10000_advancedSlicerVisual (b0ea8)/visualContainer.json" index a3cc1bf..7dbb7ff 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/10000_advancedSlicerVisual (b0ea8)/visualContainer.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/002_An\303\241lisis_2/visualContainers/10000_advancedSlicerVisual (b0ea8)/visualContainer.json" @@ -1,7 +1,7 @@ { - "height": 132.5, + "height": 90, "tabOrder": 10000, - "width": 313.75, + "width": 314, "x": 995, "y": 85, "z": 17000 diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/00000_Subtitulo (66065)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/00000_Subtitulo (66065)/config.json" index 6f45896..db1c156 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/00000_Subtitulo (66065)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/00000_Subtitulo (66065)/config.json" @@ -24,21 +24,13 @@ { "textRuns": [ { - "value": "Total de " - }, - { - "value": "jugadores ", + "value": "Mayor muestra de ", "textStyle": { "fontWeight": "bold" } - } - ], - "horizontalTextAlignment": "center" - }, - { - "textRuns": [ + }, { - "value": "fichados" + "value": "jugadores por equipo" } ], "horizontalTextAlignment": "center" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/03000_Perfil f\303\255sico promedio de los equipos NBA/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/03000_Perfil f\303\255sico promedio de los equipos NBA/config.json" index d530a4f..94f5392 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/03000_Perfil f\303\255sico promedio de los equipos NBA/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/03000_Perfil f\303\255sico promedio de los equipos NBA/config.json" @@ -4,11 +4,11 @@ { "id": 0, "position": { - "x": 15.714285714285715, - "y": 500.00000000000006, + "x": 16, + "y": 500, "z": 7000, - "width": 530, - "height": 248.57142857142858, + "width": 900, + "height": 249, "tabOrder": 3000 } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/03000_Perfil f\303\255sico promedio de los equipos NBA/visualContainer.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/03000_Perfil f\303\255sico promedio de los equipos NBA/visualContainer.json" index 28c7ef7..14c5b6e 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/03000_Perfil f\303\255sico promedio de los equipos NBA/visualContainer.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/03000_Perfil f\303\255sico promedio de los equipos NBA/visualContainer.json" @@ -1,8 +1,8 @@ { - "height": 248.57142857142858, + "height": 249, "tabOrder": 3000, - "width": 530, - "x": 15.714285714285715, + "width": 900, + "x": 16, "y": 500, "z": 7000 } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/05000_Eficiencia ofensiva de equipos NBA/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/05000_Eficiencia ofensiva de equipos NBA/config.json" index cc42852..10f1c6d 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/05000_Eficiencia ofensiva de equipos NBA/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/05000_Eficiencia ofensiva de equipos NBA/config.json" @@ -4,11 +4,11 @@ { "id": 0, "position": { - "x": 15.714285714285715, - "y": 161.42857142857144, + "x": 16, + "y": 161, "z": 9000, - "width": 727.1428571428572, - "height": 324.28571428571433, + "width": 1279, + "height": 324, "tabOrder": 5000 } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/05000_Eficiencia ofensiva de equipos NBA/visualContainer.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/05000_Eficiencia ofensiva de equipos NBA/visualContainer.json" index 3130cb5..b081afc 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/05000_Eficiencia ofensiva de equipos NBA/visualContainer.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/05000_Eficiencia ofensiva de equipos NBA/visualContainer.json" @@ -1,8 +1,8 @@ { - "height": 324.28571428571433, + "height": 324, "tabOrder": 5000, - "width": 727.1428571428572, - "x": 15.714285714285715, - "y": 161.42857142857144, + "width": 1279, + "x": 16, + "y": 161, "z": 9000 } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/config.json" index 3e748b1..5c80dd1 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/config.json" @@ -4,11 +4,11 @@ { "id": 0, "position": { - "x": 975.5555555555555, + "x": 930, "y": 500, "z": 14000, - "width": 333.3333333333333, - "height": 248.88888888888889, + "width": 365, + "height": 90, "tabOrder": 8000 } } @@ -59,7 +59,7 @@ "showBlankAs": { "expr": { "Literal": { - "Value": "'Equipos ->'" + "Value": "'Equipo'" } } } @@ -100,15 +100,10 @@ "background": [ { "properties": { - "color": { - "solid": { - "color": { - "expr": { - "ThemeDataColor": { - "ColorId": 3, - "Percent": -0.25 - } - } + "show": { + "expr": { + "Literal": { + "Value": "false" } } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/dataTransforms.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/dataTransforms.json" index 8b4b95e..9639ae8 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/dataTransforms.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/dataTransforms.json" @@ -11,7 +11,7 @@ "showBlankAs": { "expr": { "Literal": { - "Value": "'Equipos ->'" + "Value": "'Equipo'" } } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/visualContainer.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/visualContainer.json" index e8efc25..474f2eb 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/visualContainer.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/08000_advancedSlicerVisual (a910c)/visualContainer.json" @@ -1,8 +1,8 @@ { - "height": 248.88888888888889, + "height": 90, "tabOrder": 8000, - "width": 333.3333333333333, - "x": 975.5555555555555, + "width": 365, + "x": 930, "y": 500, "z": 14000 } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/04000_textbox (76d01)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/04000_textbox (76d01)/config.json" index d30fb27..7b1f7e3 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/04000_textbox (76d01)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/04000_textbox (76d01)/config.json" @@ -4,11 +4,11 @@ { "id": 0, "position": { - "x": 0, - "y": 350, + "x": 120, + "y": 215, "z": 0, - "width": 1320, - "height": 408.5714285714286, + "width": 1080, + "height": 450, "tabOrder": 4000 } } @@ -27,7 +27,7 @@ "value": "Fuente: seis CSV públicos versionados; 30.638.984 bytes y 161.111 filas de entrada.", "textStyle": { "fontWeight": "bold", - "fontSize": "12pt", + "fontSize": "15pt", "color": "#e6e6e6" } } @@ -39,7 +39,19 @@ "value": "Cobertura: 65.642 partidos únicos entre 1946 y 2022; análisis descriptivo.", "textStyle": { "fontWeight": "bold", - "fontSize": "12pt", + "fontSize": "15pt", + "color": "#e6e6e6" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Alcance visual: 30 franquicias actuales; rivales internacionales, All-Star y equipos sin mapear permanecen auditables en el núcleo, pero no alteran los rankings comparativos.", + "textStyle": { + "fontWeight": "bold", + "fontSize": "15pt", "color": "#e6e6e6" } } @@ -51,7 +63,7 @@ "value": "Calidad: 155 duplicados en cuarentena y 53 equipos históricos sin nombre actual representados explícitamente.", "textStyle": { "fontWeight": "bold", - "fontSize": "12pt", + "fontSize": "15pt", "color": "#e6e6e6" } } @@ -63,7 +75,7 @@ "value": "Reproducibilidad: contrato v1.0.0, manifiestos SHA-256, reconciliación SQL y pruebas automatizadas.", "textStyle": { "fontWeight": "bold", - "fontSize": "12pt", + "fontSize": "15pt", "color": "#e6e6e6" } } @@ -75,7 +87,7 @@ "value": "Límite: la muestra no es 22 GB, no contiene datos sintéticos y no predice resultados ni retornos financieros.", "textStyle": { "fontWeight": "bold", - "fontSize": "12pt", + "fontSize": "15pt", "color": "#e6e6e6" } } @@ -84,10 +96,10 @@ { "textRuns": [ { - "value": "Última validación integral: 28/08/2026.", + "value": "Última validación integral: 10/09/2026.", "textStyle": { "fontWeight": "bold", - "fontSize": "12pt", + "fontSize": "15pt", "color": "#e6e6e6" } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/04000_textbox (76d01)/visualContainer.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/04000_textbox (76d01)/visualContainer.json" index e19acef..b23c27a 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/04000_textbox (76d01)/visualContainer.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/04000_textbox (76d01)/visualContainer.json" @@ -1,8 +1,8 @@ { - "height": 408.5714285714286, + "height": 450, "tabOrder": 4000, - "width": 1320, - "x": 0, - "y": 350, + "width": 1080, + "x": 120, + "y": 215, "z": 0 } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/10000_textbox (dc975)/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/10000_textbox (dc975)/config.json" index a26455b..3dcc145 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/10000_textbox (dc975)/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/10000_textbox (dc975)/config.json" @@ -4,11 +4,11 @@ { "id": 0, "position": { - "x": 0, - "y": 221.42857142857144, + "x": 120, + "y": 105, "z": 12000, - "width": 985.7142857142858, - "height": 180, + "width": 1080, + "height": 85, "tabOrder": 10000 } } @@ -24,10 +24,10 @@ { "textRuns": [ { - "value": "San Antonio Spurs — perfil histórico", + "value": "Metodología y evidencia", "textStyle": { "fontWeight": "bold", - "fontSize": "60pt", + "fontSize": "32pt", "color": "#ffffff" } } diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/10000_textbox (dc975)/visualContainer.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/10000_textbox (dc975)/visualContainer.json" index 83aa335..c67c08c 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/10000_textbox (dc975)/visualContainer.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/10000_textbox (dc975)/visualContainer.json" @@ -1,8 +1,8 @@ { - "height": 180, + "height": 85, "tabOrder": 10000, - "width": 985.7142857142858, - "x": 0, - "y": 221.42857142857144, + "width": 1080, + "x": 120, + "y": 105, "z": 12000 } diff --git a/CODE/Dashboard - POWERBI/README.md b/CODE/Dashboard - POWERBI/README.md index c294d4f..433fe46 100644 --- a/CODE/Dashboard - POWERBI/README.md +++ b/CODE/Dashboard - POWERBI/README.md @@ -16,8 +16,8 @@ I use built-in dropdown slicers and descriptive conclusions only. I do not claim ## Refresh 1. Run the ETL and SQL loader from the root README. -2. Confirm that `NBA_Project` is available at `localhost,1433`. -3. Open the PBIT in Power BI Desktop and provide the same local SQL authentication method. +2. Confirm that `NBA_Project` is available at `.\SQLEXPRESS`. +3. Open the PBIT in Power BI Desktop and select Windows authentication. 4. Refresh every page. 5. Compare visible KPIs with `CODE/SQL/30_reconciliation.sql` before capturing evidence. diff --git a/CODE/README.md b/CODE/README.md index f3c8e47..68ba374 100644 --- a/CODE/README.md +++ b/CODE/README.md @@ -8,7 +8,7 @@ I keep the executable assets in this folder while the installable Python package 2. The ETL writes immutable run directories with canonical data, quarantined rows, JSONL logs, checksums and reconciliation. 3. `SQL/script.sql` creates the database, canonical model, analytical views and independent reconciliation queries. 4. The transactional loader inserts the completed run and verifies the 15 SQL objects consumed by Power BI. -5. The PBIT connects to `NBA_Project` on `localhost,1433` through DirectQuery. +5. The PBIT connects to `NBA_Project` on `.\SQLEXPRESS` through DirectQuery and Windows authentication. Canonical outputs: diff --git a/CODE/SQL/20_analytics_views.sql b/CODE/SQL/20_analytics_views.sql index 3a4a6ad..50c2c72 100644 --- a/CODE/SQL/20_analytics_views.sql +++ b/CODE/SQL/20_analytics_views.sql @@ -52,7 +52,8 @@ GO CREATE OR ALTER VIEW analytics.vw_teams AS SELECT t.team_id, t.full_name AS team_name, t.abbreviation -FROM core.dim_team AS t; +FROM core.dim_team AS t +WHERE t.is_historical_unmapped = 0; GO CREATE OR ALTER VIEW analytics.vw_q1_hist_perf AS @@ -84,7 +85,8 @@ SELECT teams.full_name AS team_name, teams.year_founded, recent.winrate_hist, recent.ppg_hist FROM recent JOIN core.dim_team AS teams ON teams.team_id = recent.team_id -CROSS JOIN reference_season; +CROSS JOIN reference_season +WHERE teams.is_historical_unmapped = 0; GO CREATE OR ALTER VIEW analytics.vw_q3_player_context_offense AS @@ -99,7 +101,7 @@ SELECT players.player_id, players.full_name AS player_name, teams.team_name, performance.avg_fg_pct AS [Porcentaje de acierto] FROM core.dim_player AS players JOIN core.dim_player_profile AS profile ON profile.player_id = players.player_id -LEFT JOIN analytics.vw_teams AS teams ON teams.team_id = profile.team_id +JOIN analytics.vw_teams AS teams ON teams.team_id = profile.team_id LEFT JOIN team_performance AS performance ON performance.team_id = profile.team_id WHERE profile.nba_flag = 1; GO @@ -107,14 +109,16 @@ GO CREATE OR ALTER VIEW analytics.vw_q4_ppg_by_decade AS SELECT (tg.season_id / 10) * 10 AS decade, AVG(CAST(tg.pts AS FLOAT)) AS league_ppg FROM analytics.vw_team_game AS tg +WHERE tg.team_id BETWEEN 1610610000 AND 1610612766 + AND tg.opponent_team_id BETWEEN 1610610000 AND 1610612766 GROUP BY (tg.season_id / 10) * 10; GO CREATE OR ALTER VIEW analytics.vw_q5_consistency AS SELECT teams.team_name, - CAST(100.0 * STDEV(CAST(metrics.winrate AS FLOAT)) / + CAST(STDEV(CAST(metrics.winrate AS FLOAT)) / NULLIF(AVG(CAST(metrics.winrate AS FLOAT)), 0) AS DECIMAL(24, 12)) AS var_winrate_pct, - CAST(100.0 * STDEV(CAST(metrics.avg_ppg AS FLOAT)) / + CAST(STDEV(CAST(metrics.avg_ppg AS FLOAT)) / NULLIF(AVG(CAST(metrics.avg_ppg AS FLOAT)), 0) AS DECIMAL(24, 12)) AS var_ppg_pct FROM analytics.vw_team_season_metrics AS metrics JOIN analytics.vw_teams AS teams ON teams.team_id = metrics.team_id @@ -164,7 +168,7 @@ CREATE OR ALTER VIEW analytics.vw_q9_physical_profile AS SELECT teams.team_name, COUNT_BIG(*) AS n_players, AVG(profile.height_cm) AS avg_height, AVG(profile.weight) AS avg_weight FROM core.dim_player_profile AS profile -LEFT JOIN analytics.vw_teams AS teams ON teams.team_id = profile.team_id +JOIN analytics.vw_teams AS teams ON teams.team_id = profile.team_id WHERE profile.nba_flag = 1 GROUP BY teams.team_name, profile.team_id; GO diff --git a/CODE/SQL/30_reconciliation.sql b/CODE/SQL/30_reconciliation.sql index 188085f..9c1dc9a 100644 --- a/CODE/SQL/30_reconciliation.sql +++ b/CODE/SQL/30_reconciliation.sql @@ -2,7 +2,10 @@ SELECT (SELECT COUNT_BIG(*) FROM core.fact_game) AS fact_game_rows, (SELECT COUNT_BIG(*) FROM analytics.vw_team_game) AS team_game_rows, + (SELECT COUNT_BIG(*) FROM analytics.vw_team_game AS tg + JOIN analytics.vw_teams AS teams ON teams.team_id = tg.team_id) AS current_team_game_rows, (SELECT COUNT_BIG(*) FROM core.dim_team) AS dim_team_rows, + (SELECT COUNT_BIG(*) FROM analytics.vw_teams) AS analytics_team_rows, (SELECT COUNT_BIG(*) FROM core.dim_team WHERE is_historical_unmapped = 1) AS unresolved_team_rows, (SELECT COUNT_BIG(*) FROM core.dim_player) AS dim_player_rows, (SELECT COUNT_BIG(*) FROM core.dim_player_profile) AS dim_player_profile_rows, diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/00000_textbox (e6685)/config.json b/DOCS/archive/powerbi_pre_i4_visuals/000_Inicio/00000_textbox (e6685)/config.json similarity index 94% rename from CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/00000_textbox (e6685)/config.json rename to DOCS/archive/powerbi_pre_i4_visuals/000_Inicio/00000_textbox (e6685)/config.json index 5e6b499..abf3e0a 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/00000_textbox (e6685)/config.json +++ b/DOCS/archive/powerbi_pre_i4_visuals/000_Inicio/00000_textbox (e6685)/config.json @@ -32,7 +32,7 @@ } }, { - "value": "Descifrando el Rendimiento y Evolución de las franquicias NBA", + "value": "Rendimiento y evolución de las franquicias NBA", "textStyle": { "fontWeight": "bold", "fontSize": "28pt", diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/00000_textbox (e6685)/filters.json b/DOCS/archive/powerbi_pre_i4_visuals/000_Inicio/00000_textbox (e6685)/filters.json similarity index 100% rename from CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/00000_textbox (e6685)/filters.json rename to DOCS/archive/powerbi_pre_i4_visuals/000_Inicio/00000_textbox (e6685)/filters.json diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/00000_textbox (e6685)/visualContainer.json b/DOCS/archive/powerbi_pre_i4_visuals/000_Inicio/00000_textbox (e6685)/visualContainer.json similarity index 100% rename from CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/000_Inicio/visualContainers/00000_textbox (e6685)/visualContainer.json rename to DOCS/archive/powerbi_pre_i4_visuals/000_Inicio/00000_textbox (e6685)/visualContainer.json diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/10000_textbox (849f8)/config.json" "b/DOCS/archive/powerbi_pre_i4_visuals/003_An\303\241lisis_3/10000_textbox (849f8)/config.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/10000_textbox (849f8)/config.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/003_An\303\241lisis_3/10000_textbox (849f8)/config.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/10000_textbox (849f8)/filters.json" "b/DOCS/archive/powerbi_pre_i4_visuals/003_An\303\241lisis_3/10000_textbox (849f8)/filters.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/10000_textbox (849f8)/filters.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/003_An\303\241lisis_3/10000_textbox (849f8)/filters.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/10000_textbox (849f8)/visualContainer.json" "b/DOCS/archive/powerbi_pre_i4_visuals/003_An\303\241lisis_3/10000_textbox (849f8)/visualContainer.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/003_An\303\241lisis_3/visualContainers/10000_textbox (849f8)/visualContainer.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/003_An\303\241lisis_3/10000_textbox (849f8)/visualContainer.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/05000_Subtitulo/config.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/05000_Subtitulo/config.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/05000_Subtitulo/config.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/05000_Subtitulo/config.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/05000_Subtitulo/filters.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/05000_Subtitulo/filters.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/05000_Subtitulo/filters.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/05000_Subtitulo/filters.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/05000_Subtitulo/visualContainer.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/05000_Subtitulo/visualContainer.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/05000_Subtitulo/visualContainer.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/05000_Subtitulo/visualContainer.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/06000_Subtitulo/config.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/06000_Subtitulo/config.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/06000_Subtitulo/config.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/06000_Subtitulo/config.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/06000_Subtitulo/filters.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/06000_Subtitulo/filters.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/06000_Subtitulo/filters.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/06000_Subtitulo/filters.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/06000_Subtitulo/visualContainer.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/06000_Subtitulo/visualContainer.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/06000_Subtitulo/visualContainer.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/06000_Subtitulo/visualContainer.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/07000_Subtitulo/config.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/07000_Subtitulo/config.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/07000_Subtitulo/config.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/07000_Subtitulo/config.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/07000_Subtitulo/filters.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/07000_Subtitulo/filters.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/07000_Subtitulo/filters.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/07000_Subtitulo/filters.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/07000_Subtitulo/visualContainer.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/07000_Subtitulo/visualContainer.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/07000_Subtitulo/visualContainer.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/07000_Subtitulo/visualContainer.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/08000_Subtitulo/config.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/08000_Subtitulo/config.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/08000_Subtitulo/config.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/08000_Subtitulo/config.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/08000_Subtitulo/filters.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/08000_Subtitulo/filters.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/08000_Subtitulo/filters.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/08000_Subtitulo/filters.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/08000_Subtitulo/visualContainer.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/08000_Subtitulo/visualContainer.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/08000_Subtitulo/visualContainer.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/08000_Subtitulo/visualContainer.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/09000_Subtitulo/config.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/09000_Subtitulo/config.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/09000_Subtitulo/config.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/09000_Subtitulo/config.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/09000_Subtitulo/filters.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/09000_Subtitulo/filters.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/09000_Subtitulo/filters.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/09000_Subtitulo/filters.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/09000_Subtitulo/visualContainer.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/09000_Subtitulo/visualContainer.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/09000_Subtitulo/visualContainer.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/09000_Subtitulo/visualContainer.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/16000_actionButton (a6ab6)/config.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/16000_actionButton (a6ab6)/config.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/16000_actionButton (a6ab6)/config.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/16000_actionButton (a6ab6)/config.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/16000_actionButton (a6ab6)/filters.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/16000_actionButton (a6ab6)/filters.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/16000_actionButton (a6ab6)/filters.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/16000_actionButton (a6ab6)/filters.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/16000_actionButton (a6ab6)/visualContainer.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/16000_actionButton (a6ab6)/visualContainer.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/16000_actionButton (a6ab6)/visualContainer.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/16000_actionButton (a6ab6)/visualContainer.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/17000_actionButton (4e465)/config.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/17000_actionButton (4e465)/config.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/17000_actionButton (4e465)/config.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/17000_actionButton (4e465)/config.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/17000_actionButton (4e465)/filters.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/17000_actionButton (4e465)/filters.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/17000_actionButton (4e465)/filters.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/17000_actionButton (4e465)/filters.json" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/17000_actionButton (4e465)/visualContainer.json" "b/DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/17000_actionButton (4e465)/visualContainer.json" similarity index 100% rename from "CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/006_Conclusi\303\263n/visualContainers/17000_actionButton (4e465)/visualContainer.json" rename to "DOCS/archive/powerbi_pre_i4_visuals/006_Conclusi\303\263n/17000_actionButton (4e465)/visualContainer.json" diff --git a/DOCS/i1_i4_verification.md b/DOCS/i1_i4_verification.md index f49bc5d..fc9150d 100644 --- a/DOCS/i1_i4_verification.md +++ b/DOCS/i1_i4_verification.md @@ -1,6 +1,6 @@ # NBA-I1 to NBA-I4 verification -Verification date: **28/08/2026 (America/Argentina/Buenos_Aires)** +Verification date: **10/09/2026 (America/Argentina/Buenos_Aires)** ## Real ETL run @@ -33,17 +33,19 @@ SQL integration evidence from [GitHub Actions run 33223853500](https://github.co - 1946–2022 coverage, 53 explicit historical-team records and zero null, duplicate or missing team keys; - committed result: [`sql_reconciliation.json`](../evidence/NBA-I1-I4/ci-sql/sql_reconciliation.json). +The same load was repeated against local SQL Server 2022 Express on 10/09/2026. It selected the same 15 objects and 65 columns, retained 65,642 games, limited comparison views to 30 current franchises and reconciled all integrity checks to zero. Evidence: [`local-sql-express/sql_reconciliation.json`](../evidence/NBA-I1-I4/local-sql-express/sql_reconciliation.json). + ## Power BI artifact - File: `CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam.pbit`. - Versionable source: adjacent pbi-tools project. - Compiler: pbi-tools Core 1.2.0 on .NET 10 with major roll-forward. -- Power BI Desktop available during compilation: 2.157.879.0. -- Size: **6,374,566 bytes**. -- SHA-256: `18B49F8F2EE420D470358F08A08504C82EAB2CD34040ADD6A5D96756058478F5`. +- Power BI Desktop installed during compilation: 2.157.1354.0. +- Size: **6,372,771 bytes**. +- SHA-256: `FDD8498F49F70150D9CB33D20B8080B1A35DD545D91D4C915C7DF2091578F98A`. - ZIP integrity: compiled successfully with `Report/Layout`, `DataModelSchema` and required package metadata. - Pages: six, ordered from `Inicio` to `Metodología y cierre`. -- SQL source: only `localhost,1433/NBA_Project`; no personal host is embedded. +- SQL source: only `.\SQLEXPRESS/NBA_Project`; no personal host or credential is embedded. Compilation proves that the extracted report and model produce a valid PBIT package. It does not, by itself, prove a successful DirectQuery refresh. The screenshot protocol therefore requires a loaded local SQL instance and an explicit refresh before publication. diff --git a/DOCS/s1_s4_verification.md b/DOCS/s1_s4_verification.md index 625cca9..d04373b 100644 --- a/DOCS/s1_s4_verification.md +++ b/DOCS/s1_s4_verification.md @@ -1,6 +1,6 @@ # NBA-S1 to NBA-S4 verification -Verification date: **10/08/2026** +Verification date: **10/09/2026** ## Scope @@ -13,12 +13,12 @@ Verification date: **10/08/2026** - Format: Power BI template (`Analisis_NBA_BestTeam.pbit`). - Versionable source: adjacent pbi-tools project (`Analisis_NBA_BestTeam/`). -- Size: **6,374,230 bytes**. -- SHA-256: `1D0C1EC57C70E910E3217629926C35615D9D31BEF76DF44E6F166F063265EBBA`. -- Pages: **6**, ordered from `Inicio` through `Conclusión`. +- Size: **6,372,771 bytes**. +- SHA-256: `FDD8498F49F70150D9CB33D20B8080B1A35DD545D91D4C915C7DF2091578F98A`. +- Pages: **6**, ordered from `Inicio` through `Metodología y cierre`. - Converted filters: **4** built-in dropdown slicers. -The PBIT was compiled with pbi-tools Core 1.2.0 and recognized by Power BI Desktop 2.156.951.0. A complete visual refresh could not be performed because the original local SQL Server was unavailable and the current SQL script still lacks model dependencies documented for NBA-I3. +The S4 cleanup is preserved inside the current NBA-I4 artifact. I compiled the PBIT with pbi-tools Core 1.2.0 while Power BI Desktop 2.157.1354.0 was installed. The current SQL model is complete: a local SQL Server 2022 Express load on 10/09/2026 selected all 15 Power BI objects and 65 columns and reconciled integrity to zero. See the current [`NBA-I1 to NBA-I4 verification`](i1_i4_verification.md) for the expanded model and connection evidence. ## Repeatable validation diff --git a/DOCS/technical_documentation.md b/DOCS/technical_documentation.md index 61d1663..455367b 100644 --- a/DOCS/technical_documentation.md +++ b/DOCS/technical_documentation.md @@ -71,7 +71,7 @@ The loader obtains every connection value from environment variables, validates ## 5. Power BI -The semantic model reads 15 objects from the `analytics` schema at `localhost,1433/NBA_Project`. I validate that each TMDL object exists in SQL and that every referenced column can be selected. +The semantic model reads 15 objects from the `analytics` schema at `.\SQLEXPRESS/NBA_Project`. I use this generic local named instance so the published template matches the documented SQL Server Express setup; CI continues to override the loader connection with its isolated container endpoint. I validate that each TMDL object exists in SQL and that every referenced column can be selected. I restructured the report into six pages: @@ -92,6 +92,6 @@ The versioned test factory creates a small, deterministic and clearly synthetic CI also processes the six real committed CSV files, loads their outputs into an ephemeral SQL Server 2022 container, runs independent SQL reconciliation and uploads lightweight evidence. Synthetic fixture results are never presented as the real portfolio volume. -## 7. Remaining operational boundary +## 7. Desktop evidence boundary -Power BI Desktop refresh is a Windows, stateful step. The repository supplies a compiled PBIT, the complete SQL model, a CI-proven database load and a screenshot protocol. A screenshot may be published only after Power BI refreshes against a locally loaded SQL instance; a successful compile alone is not described as a refreshed report. +Power BI Desktop refresh is a Windows, stateful step. The repository supplies a compiled PBIT, the complete SQL model, CI reconciliation and a repeated local SQL Server 2022 Express load. I keep the screenshot protocol separate from package compilation: the PBIT hash proves the exact artifact, while a future screenshot set must also show a completed DirectQuery refresh against the loaded local instance. I do not treat compilation alone as visual refresh evidence. diff --git a/README.md b/README.md index 51a1af5..b6ea8b1 100644 --- a/README.md +++ b/README.md @@ -86,19 +86,19 @@ python -m pytest --cov=nba_pipeline --cov-report=term-missing Copy the variable names from [`CODE/.env.example`](CODE/.env.example) into your own environment and provide a local secret. I do not commit credentials. ```powershell -$env:NBA_SQL_DRIVER = "ODBC Driver 18 for SQL Server" -$env:NBA_SQL_SERVER = "localhost,1433" +$env:NBA_SQL_DRIVER = "ODBC Driver 17 for SQL Server" +$env:NBA_SQL_SERVER = ".\SQLEXPRESS" $env:NBA_SQL_DATABASE = "NBA_Project" -$env:NBA_SQL_TRUSTED_CONNECTION = "no" -$env:NBA_SQL_USER = "sa" -$env:NBA_SQL_PASSWORD = "" +$env:NBA_SQL_TRUSTED_CONNECTION = "yes" +$env:NBA_SQL_ENCRYPT = "no" +$env:NBA_SQL_TRUST_SERVER_CERTIFICATE = "yes" python -m nba_pipeline load-sql ` --run-dir .artifacts\my-first-run ` --evidence-dir evidence\my-first-sql-load ``` -The loader applies the idempotent schema, loads all canonical tables in one transaction, creates the analytical views and verifies every object and column required by Power BI. CI repeats this against an ephemeral SQL Server 2022 container. +The loader applies the idempotent schema, loads all canonical tables in one transaction, creates the analytical views and verifies every object and column required by Power BI. The published PBIT uses the same generic `.\SQLEXPRESS` source. CI overrides these local values and repeats the integration against an ephemeral SQL Server 2022 container. ## 📊 Power BI @@ -122,6 +122,7 @@ Every analytical title states its period or sample and unit. The final page reco - [Versioned contract](contracts/schema_v1.0.0.json) - [Real-run evidence](evidence/NBA-I1-I4/real-run-lf/manifest.json) - [CI SQL reconciliation](evidence/NBA-I1-I4/ci-sql/sql_reconciliation.json) +- [Local SQL Express reconciliation](evidence/NBA-I1-I4/local-sql-express/sql_reconciliation.json) - [Security review](DOCS/security_review.md) ## ⚠️ Boundaries @@ -129,7 +130,7 @@ Every analytical title states its period or sample and unit. The final page reco - The committed dataset is a historical analytical sample, not an official complete NBA warehouse. - The 53 generated team records make historical identifiers explicit; they do not invent franchise metadata. - Duplicate rows remain inspectable in `rejects/`; they are not silently discarded. -- Power BI uses DirectQuery to `localhost,1433`, so you must load SQL Server before refreshing it. +- Power BI uses DirectQuery to `.\SQLEXPRESS`, so you must load SQL Server Express before refreshing it. - Source access, redistribution terms and NBA-related rights must be checked before reuse. ## 👥 Authorship diff --git a/evidence/NBA-I1-I4/local-sql-express/sql_reconciliation.json b/evidence/NBA-I1-I4/local-sql-express/sql_reconciliation.json new file mode 100644 index 0000000..8b435ec --- /dev/null +++ b/evidence/NBA-I1-I4/local-sql-express/sql_reconciliation.json @@ -0,0 +1,43 @@ +{ + "database": "NBA_Project", + "inserted_rows": { + "dim_player": 4831, + "dim_player_profile": 4171, + "dim_team": 83, + "fact_game": 65642, + "fact_game_summary": 58021, + "fact_other_stats": 28261 + }, + "loaded_at_utc": "2026-09-10T17:45:18.085394Z", + "powerbi_contract": { + "columns": 65, + "objects": 15 + }, + "reconciliation": { + "integrity": { + "duplicate_game_keys": 0, + "missing_away_team_keys": 0, + "missing_home_team_keys": 0, + "null_game_keys": 0 + }, + "kpis": { + "analytics_team_rows": 30, + "current_team_game_rows": 128764, + "dim_player_profile_rows": 4171, + "dim_player_rows": 4831, + "dim_team_rows": 83, + "fact_game_rows": 65642, + "fact_game_summary_rows": 58021, + "fact_other_stats_rows": 28261, + "first_season": 1946, + "games_without_result": 2, + "last_season": 2022, + "q1_total_team_games": 128764, + "season_rows": 77, + "team_game_rows": 131284, + "unresolved_team_rows": 53 + } + }, + "run_id": "nba-20260829T002154Z-0af8b4ab23", + "status": "passed" +} diff --git a/scripts/update_powerbi_project_i4.py b/scripts/update_powerbi_project_i4.py index 73fedd7..36907db 100644 --- a/scripts/update_powerbi_project_i4.py +++ b/scripts/update_powerbi_project_i4.py @@ -21,6 +21,14 @@ } REPLACEMENTS = { + "Descifrando el Rendimiento y Evolución de las franquicias NBA": ( + "Rendimiento y evolución de las franquicias NBA" + ), + "Eficiencia y Consistencia": "Eficiencia y consistencia", + "Porcentaje de balones perdidos por partido": "Pérdidas por partido", + "Total de jugadores fichados": "Mayor muestra de jugadores por equipo", + "Equipos ->": "Equipo", + "Equipo ->": "Equipo", "📈 1- Rendimiento histórico": "1 · Historia y evolución", "🧮 2- Eficiencia y consistencia": "2 · Eficiencia y consistencia", "💪 3- Talento moderno": "3 · Talento y perfil", @@ -92,6 +100,35 @@ def replace_strings(value: object) -> object: return value +def remove_redundant_power_query_renames(text: str) -> str: + """Use the final SQL aliases directly instead of renaming obsolete source columns.""" + lines = text.splitlines() + for index, line in enumerate(lines): + if '"Columnas con nombre cambiado" = Table.RenameColumns' not in line: + continue + if index == 0 or " = NBA_Project{" not in lines[index - 1]: + raise RuntimeError("No se pudo identificar el paso SQL previo al renombrado.") + source_step = lines[index - 1].strip().split(" =", 1)[0] + del lines[index] + for return_index in range(index, min(index + 4, len(lines))): + if '#"Columnas con nombre cambiado"' in lines[return_index]: + indent = lines[return_index][: len(lines[return_index]) - len(lines[return_index].lstrip())] + lines[return_index] = f"{indent}{source_step}" + break + else: + raise RuntimeError("No se encontró la salida del paso de renombrado.") + break + for index, line in enumerate(lines): + if line.strip() != "in": + continue + previous = index - 1 + while previous >= 0 and not lines[previous].strip(): + previous -= 1 + if previous >= 0 and lines[previous].rstrip().endswith(","): + lines[previous] = lines[previous].rstrip()[:-1] + return "\n".join(lines) + "\n" + + def set_position(directory: Path, *, x: float, y: float, width: float, height: float) -> None: config_path = directory / "config.json" config = read_json(config_path) @@ -106,6 +143,62 @@ def set_position(directory: Path, *, x: float, y: float, width: float, height: f write_json(container_path, container) +def update_column_format(path: Path, column_name: str, format_string: str) -> None: + lines = path.read_text(encoding="utf-8-sig").splitlines() + column_markers = {f"column {column_name}", f"column '{column_name}'"} + for index, line in enumerate(lines): + if line.strip() not in column_markers: + continue + block_end = next( + ( + position + for position in range(index + 1, len(lines)) + if lines[position].lstrip().startswith(("column ", "measure ", "partition ")) + ), + len(lines), + ) + for position in range(index + 1, block_end): + if lines[position].strip().startswith("formatString:"): + indent = lines[position][: len(lines[position]) - len(lines[position].lstrip())] + lines[position] = f"{indent}formatString: {format_string}" + path.write_text("\n".join(lines) + "\n", encoding="utf-8", newline="\n") + return + raise RuntimeError(f"La columna {column_name} no tiene formato en {path.name}.") + raise RuntimeError(f"No se encontró la columna {column_name} en {path.name}.") + + +def update_turnover_visual_formats() -> None: + page = SECTIONS / "002_Análisis_2" / "visualContainers" + for directory_name in ( + "01000_Puntos promedio por partido (481ef)", + "07000_Eficiencia de Tiro vs Pérdidas de balón", + ): + path = page / directory_name / "dataTransforms.json" + payload = read_json(path) + for item in payload.get("queryMetadata", {}).get("Select", []): + if "tov_avg" in item.get("Name", ""): + item["Format"] = "0.0" + for item in payload.get("selects", []): + if "tov_avg" in item.get("queryName", ""): + item["format"] = "0.0" + write_json(path, payload) + + +def make_slicer_backgrounds_transparent() -> None: + for path in sorted((PROJECT / "Report" / "sections").rglob("config.json")): + config = read_json(path) + if config.get("singleVisual", {}).get("visualType") != "slicer": + continue + config["singleVisual"].setdefault("vcObjects", {})["background"] = [ + { + "properties": { + "show": {"expr": {"Literal": {"Value": "false"}}} + } + } + ] + write_json(path, config) + + def move_once(source: Path, destination: Path) -> None: if source.exists() and destination.exists(): raise RuntimeError(f"Existen origen y destino: {source} / {destination}") @@ -122,17 +215,79 @@ def update_methodology() -> None: paragraphs = [ "Fuente: seis CSV públicos versionados; 30.638.984 bytes y 161.111 filas de entrada.", "Cobertura: 65.642 partidos únicos entre 1946 y 2022; análisis descriptivo.", + "Alcance visual: 30 franquicias actuales; rivales internacionales, All-Star y equipos sin mapear permanecen auditables en el núcleo, pero no alteran los rankings comparativos.", "Calidad: 155 duplicados en cuarentena y 53 equipos históricos sin nombre actual representados explícitamente.", "Reproducibilidad: contrato v1.0.0, manifiestos SHA-256, reconciliación SQL y pruebas automatizadas.", "Límite: la muestra no es 22 GB, no contiene datos sintéticos y no predice resultados ni retornos financieros.", - "Última validación integral: 28/08/2026.", + "Última validación integral: 10/09/2026.", ] - style = {"fontWeight": "bold", "fontSize": "12pt", "color": "#e6e6e6"} + style = {"fontWeight": "bold", "fontSize": "15pt", "color": "#e6e6e6"} config["singleVisual"]["objects"]["general"][0]["properties"]["paragraphs"] = [ {"textRuns": [{"value": value, "textStyle": style}]} for value in paragraphs ] write_json(path, config) + set_position(path.parent, x=120, y=215, width=1080, height=450) + + title_path = SECTIONS / "006_Conclusión" / "visualContainers" / "10000_textbox (dc975)" + title = read_json(title_path / "config.json") + title["singleVisual"]["objects"]["general"][0]["properties"]["paragraphs"] = [ + { + "textRuns": [ + { + "value": "Metodología y evidencia", + "textStyle": { + "fontWeight": "bold", + "fontSize": "32pt", + "color": "#ffffff", + }, + } + ], + "horizontalTextAlignment": "center", + } + ] + write_json(title_path / "config.json", title) + set_position(title_path, x=120, y=105, width=1080, height=85) + + +def update_player_sample_label() -> None: + path = ( + SECTIONS + / "003_Análisis_3" + / "visualContainers" + / "00000_Subtitulo (66065)" + / "config.json" + ) + config = read_json(path) + config["singleVisual"]["objects"]["general"][0]["properties"]["paragraphs"] = [ + { + "textRuns": [ + {"value": "Mayor muestra de ", "textStyle": {"fontWeight": "bold"}}, + {"value": "jugadores por equipo"}, + ], + "horizontalTextAlignment": "center", + } + ] + write_json(path, config) + + +def update_efficiency_card_labels() -> None: + page = SECTIONS / "002_Análisis_2" / "visualContainers" + labels = { + "00000_Subtitulo (f70c7)": "Pérdidas por partido", + "00000_Subtitulo (4dab6)": "Eficiencia de tiro", + } + for directory_name, label in labels.items(): + path = page / directory_name / "config.json" + config = read_json(path) + config["singleVisual"]["objects"]["general"][0]["properties"]["paragraphs"] = [ + { + "textRuns": [{"value": label, "textStyle": {"fontWeight": "bold"}}], + "horizontalTextAlignment": "center", + } + ] + write_json(path, config) + def main() -> int: for folder, display_name in PAGES.items(): @@ -168,18 +323,103 @@ def main() -> int: for name in ("05000_Subtitulo", "07000_textbox (9fccf)"): move_once(target_visuals / name, ARCHIVE / "004_Insights" / name) + move_once( + SECTIONS + / "000_Inicio" + / "visualContainers" + / "00000_textbox (e6685)", + ARCHIVE / "000_Inicio" / "00000_textbox (e6685)", + ) + + conclusion_visuals = SECTIONS / "006_Conclusión" / "visualContainers" + for name in ( + "05000_Subtitulo", + "06000_Subtitulo", + "07000_Subtitulo", + "08000_Subtitulo", + "09000_Subtitulo", + "16000_actionButton (a6ab6)", + "17000_actionButton (4e465)", + ): + move_once(conclusion_visuals / name, ARCHIVE / "006_Conclusión" / name) + + move_once( + source_visuals / "10000_textbox (849f8)", + ARCHIVE / "003_Análisis_3" / "10000_textbox (849f8)", + ) + for path in sorted((PROJECT / "Report").rglob("*.json")): write_json(path, replace_strings(read_json(path))) for path in sorted((PROJECT / "Model" / "tables").glob("*.tmdl")): text = path.read_text(encoding="utf-8-sig") - updated = text.replace( - 'Sql.Databases("100.74.116.125,1433")', 'Sql.Databases("localhost,1433")' - ) + updated = text + for previous_server in ("100.74.116.125,1433", "localhost,1433"): + updated = updated.replace( + f'Sql.Databases("{previous_server}")', + 'Sql.Databases(".\\SQLEXPRESS")', + ) + updated = remove_redundant_power_query_renames(updated) if updated != text: path.write_text(updated, encoding="utf-8", newline="\n") + update_column_format( + PROJECT / "Model" / "tables" / "analytics vw_q7_balance_of_def.tmdl", + "Balones perdidos", + "0.0", + ) + update_turnover_visual_formats() + make_slicer_backgrounds_transparent() + + set_position( + SECTIONS + / "001_Análisis_1" + / "visualContainers" + / "08000_advancedSlicerVisual (34242)", + x=963, + y=85, + width=346, + height=90, + ) + set_position( + SECTIONS / "002_Análisis_2" / "visualContainers" / "10000_advancedSlicerVisual (b0ea8)", + x=995, + y=85, + width=314, + height=90, + ) + set_position( + SECTIONS / "002_Análisis_2" / "visualContainers" / "09000_advancedSlicerVisual (fa73f)", + x=942, + y=227, + width=367, + height=90, + ) + set_position( + source_visuals / "05000_Eficiencia ofensiva de equipos NBA", + x=16, + y=161, + width=1279, + height=324, + ) + set_position( + source_visuals / "03000_Perfil físico promedio de los equipos NBA", + x=16, + y=500, + width=900, + height=249, + ) + set_position( + source_visuals / "08000_advancedSlicerVisual (a910c)", + x=930, + y=500, + width=365, + height=90, + ) + update_methodology() + update_player_sample_label() + update_efficiency_card_labels() print("I4 aplicado: seis páginas, dos visuales redistribuidos y origen SQL local.") return 0 diff --git a/scripts/validate_i1_i4.py b/scripts/validate_i1_i4.py index 3f422e1..be841a0 100644 --- a/scripts/validate_i1_i4.py +++ b/scripts/validate_i1_i4.py @@ -11,7 +11,9 @@ ROOT = Path(__file__).resolve().parents[1] EVIDENCE = ROOT / "evidence" / "NBA-I1-I4" / "real-run-lf" -SQL_EVIDENCE = ROOT / "evidence" / "NBA-I1-I4" / "ci-sql" / "sql_reconciliation.json" +SQL_EVIDENCE = ( + ROOT / "evidence" / "NBA-I1-I4" / "local-sql-express" / "sql_reconciliation.json" +) PBIT = ROOT / "CODE" / "Dashboard - POWERBI" / "Analisis_NBA_BestTeam.pbit" PROJECT = ROOT / "CODE" / "Dashboard - POWERBI" / "Analisis_NBA_BestTeam" EXPECTED_TOTALS = { @@ -30,8 +32,8 @@ "Metodología y cierre": 5, } EXPECTED_PBIT = { - "bytes": 6_374_566, - "sha256": "18B49F8F2EE420D470358F08A08504C82EAB2CD34040ADD6A5D96756058478F5", + "bytes": 6_372_771, + "sha256": "FDD8498F49F70150D9CB33D20B8080B1A35DD545D91D4C915C7DF2091578F98A", } @@ -83,11 +85,12 @@ def validate_model_files() -> None: require(len(tables) == 15, "Power BI does not expose 15 TMDL objects") for path in tables: text = path.read_text(encoding="utf-8") - require('Sql.Databases("localhost,1433")' in text, f"Non-portable source: {path.name}") + require('Sql.Databases(".\\SQLEXPRESS")' in text, f"Unexpected source: {path.name}") require("100.74.116.125" not in text, f"Former personal host remains: {path.name}") + require("Table.RenameColumns" not in text, f"Stale Power Query rename: {path.name}") sql_evidence = read_json(SQL_EVIDENCE) - require(sql_evidence["status"] == "passed", "CI SQL load is not passed") + require(sql_evidence["status"] == "passed", "Local SQL Express load is not passed") require(sum(sql_evidence["inserted_rows"].values()) == 161_009, "SQL loaded rows changed") require( sql_evidence["powerbi_contract"] == {"columns": 65, "objects": 15}, @@ -100,6 +103,11 @@ def validate_model_files() -> None: sql_evidence["reconciliation"]["kpis"]["team_game_rows"] == 131_284, "Team-game grain changed", ) + kpis = sql_evidence["reconciliation"]["kpis"] + require(kpis["analytics_team_rows"] == 30, "Analytical franchise scope changed") + require(kpis["current_team_game_rows"] == 128_764, "Current-team grain changed") + require(kpis["q1_total_team_games"] == 128_764, "Q1 visual grain changed") + require(kpis["fact_game_rows"] == 65_642, "Unique-game total changed") def validate_report() -> None: @@ -118,9 +126,20 @@ def validate_report() -> None: "2013–2022", "30.638.984 bytes", "155 duplicados", - "Última validación integral", + "Última validación integral: 10/09/2026.", + "Pérdidas por partido", + "Eficiencia de tiro", ): require(required in report_text, f"Report methodology/title evidence missing: {required}") + require( + not ( + sections + / "000_Inicio" + / "visualContainers" + / "00000_textbox (e6685)" + ).exists(), + "Duplicate cover title layer remains active", + ) require(PBIT.stat().st_size == EXPECTED_PBIT["bytes"], "PBIT byte size changed") digest = hashlib.sha256(PBIT.read_bytes()).hexdigest().upper() diff --git a/scripts/validate_s1_s4.py b/scripts/validate_s1_s4.py index f0d6585..d3a4ceb 100644 --- a/scripts/validate_s1_s4.py +++ b/scripts/validate_s1_s4.py @@ -120,10 +120,14 @@ def validate_security(check: Check) -> None: if line and not line.startswith("#") and "=" in line for key, value in (line.split("=", 1),) } - check.require(env_lines.get("NBA_SQL_USER") == "sa", ".env.example lacks the local demo username") check.require( - env_lines.get("NBA_SQL_PASSWORD") == "replace_with_a_local_secret", - ".env.example does not use the expected password placeholder", + env_lines.get("NBA_SQL_TRUSTED_CONNECTION") == "yes", + ".env.example does not use local Windows authentication", + ) + check.require("NBA_SQL_USER" not in env_lines, ".env.example must not define a demo username") + check.require( + "NBA_SQL_PASSWORD" not in env_lines, + ".env.example must not define or suggest a committed password value", ) audit_log = read(ROOT / "CODE" / "etl_audit_log.txt") @@ -150,7 +154,8 @@ def validate_powerbi_source(check: Check) -> None: payloads.append(json.loads(read(path))) except json.JSONDecodeError as exc: check.failures.append(f"Invalid JSON: {path.relative_to(ROOT)} ({exc})") - check.require(len(json_files) >= 850, f"Power BI extraction looks incomplete: {len(json_files)} JSON files") + # I4 intentionally archives obsolete visual containers outside the active project. + check.require(len(json_files) >= 840, f"Power BI extraction looks incomplete: {len(json_files)} JSON files") sections = PROJECT / "Report" / "sections" page_dirs = sorted(path for path in sections.iterdir() if path.is_dir()) diff --git a/src/nba_pipeline/model_validation.py b/src/nba_pipeline/model_validation.py index 0ef5671..70c8729 100644 --- a/src/nba_pipeline/model_validation.py +++ b/src/nba_pipeline/model_validation.py @@ -66,10 +66,15 @@ def validate_static_model() -> dict[str, Any]: marker = f"CREATE OR ALTER VIEW analytics.{details['object']}" if marker.lower() not in sql.lower(): raise ValueError(f"El SQL no crea el objeto requerido: {details['object']}") - if details["servers"] != ["localhost,1433"]: + if details["servers"] != [r".\SQLEXPRESS"]: raise ValueError( f"Origen Power BI no portable en {details['file']}: {details['servers']}" ) + tmdl = (ROOT / details["file"]).read_text(encoding="utf-8-sig") + if "Table.RenameColumns" in tmdl: + raise ValueError( + f"Power Query todavía renombra columnas que el SQL ya publica: {details['file']}" + ) if re.search(r"(?im)^\s*DELETE\s+FROM\s+(?:\[?core\]?|\[?analytics\]?)", sql): raise ValueError("El modelo analítico contiene un borrado silencioso.") return {"powerbi_objects": len(objects), "contract_version": SCHEMA_VERSION} diff --git a/src/nba_pipeline/sql_loader.py b/src/nba_pipeline/sql_loader.py index 8cd0ce9..861edc3 100644 --- a/src/nba_pipeline/sql_loader.py +++ b/src/nba_pipeline/sql_loader.py @@ -247,8 +247,10 @@ def load_sql_server(run_dir: Path, evidence_dir: Path | None = None) -> dict[str integrity = sql_reconciliation["integrity"] if int(kpis["team_game_rows"]) != int(kpis["fact_game_rows"]) * 2: raise RuntimeError("La vista equipo-partido no reconcilia 2 filas por juego.") - if int(kpis["q1_total_team_games"]) != int(kpis["team_game_rows"]): - raise RuntimeError("La pregunta histórica no reconcilia con equipo-partido.") + if int(kpis["analytics_team_rows"]) != 30: + raise RuntimeError("La capa analítica no contiene las 30 franquicias actuales.") + if int(kpis["q1_total_team_games"]) != int(kpis["current_team_game_rows"]): + raise RuntimeError("La pregunta histórica no reconcilia con las franquicias actuales.") if any(int(value or 0) for value in integrity.values()): raise RuntimeError(f"Integridad SQL incumplida: {integrity}") From bab038b6e21f24c3979a080e7a35cf9b7171b3e4 Mon Sep 17 00:00:00 2001 From: "Percy I. Marzoratti Hill" Date: Tue, 15 Sep 2026 21:23:07 -0300 Subject: [PATCH 2/2] Fix NBA I4 DirectQuery refresh and streak visual --- .../Analisis_NBA_BestTeam.pbit | Bin 6372771 -> 6372749 bytes .../Model/relationships.tmdl | 12 --- .../Model/tables/analytics dim_season.tmdl | 5 +- .../analytics vw_bridge_team_season.tmdl | 5 +- .../tables/analytics vw_q10_recent_top.tmdl | 5 +- .../tables/analytics vw_q1_hist_perf.tmdl | 5 +- .../analytics vw_q2_age_vs_current.tmdl | 8 +- ...nalytics vw_q3_player_context_offense.tmdl | 5 +- .../tables/analytics vw_q4_ppg_by_decade.tmdl | 5 +- .../tables/analytics vw_q5_consistency.tmdl | 5 +- .../analytics vw_q6_home_away_impact.tmdl | 5 +- .../analytics vw_q7_balance_of_def.tmdl | 5 +- .../analytics vw_q8_longest_win_streak.tmdl | 5 +- .../analytics vw_q9_physical_profile.tmdl | 5 +- .../analytics vw_team_season_basic.tmdl | 5 +- .../analytics vw_team_season_metrics.tmdl | 5 +- .../Model/tables/analytics vw_teams.tmdl | 5 +- .../11000_Racha hist\303\263rica/config.json" | 11 +- .../dataTransforms.json" | 8 +- .../11000_Racha hist\303\263rica/query.json" | 9 +- DOCS/i1_i4_verification.md | 6 +- scripts/update_powerbi_project_i4.py | 95 +++++++++++++++++- scripts/validate_i1_i4.py | 9 +- src/nba_pipeline/model_validation.py | 11 +- 24 files changed, 150 insertions(+), 89 deletions(-) diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam.pbit b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam.pbit index c1bfc1568c7217c1891efb329a6e67c43efda30f..51bec86975acccd4c41083494fcd777c9b509f69 100644 GIT binary patch delta 21627 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 KSCR;j&Hn(_(FM)` delta 21767 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 diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/relationships.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/relationships.tmdl index b7a592f..3f07168 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/relationships.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/relationships.tmdl @@ -2,12 +2,6 @@ fromColumn: 'analytics dim_season'.decade toColumn: 'analytics vw_q4_ppg_by_decade'.decade -relationship b0426d34-7bfe-4b3c-02aa-e2f288b5893a - crossFilteringBehavior: bothDirections - fromCardinality: one - fromColumn: 'analytics vw_q2_age_vs_current'.team_name - toColumn: 'analytics vw_q1_hist_perf'.team_name - relationship 4b008a12-c759-f4de-7c60-4fe8487c7f6c fromColumn: 'analytics vw_q3_player_context_offense'.team_name toColumn: 'analytics vw_q1_hist_perf'.team_name @@ -20,12 +14,6 @@ relationship ce99328f-730b-1a82-ba7b-a3116104b3b3 fromColumn: 'analytics vw_q7_balance_of_def'.season_id toColumn: 'analytics dim_season'.season_id -relationship 9484f463-a32f-35bb-2a87-249fb1142237 - crossFilteringBehavior: bothDirections - fromCardinality: one - fromColumn: 'analytics vw_q8_longest_win_streak'.team_id - toColumn: 'analytics vw_q10_recent_top'.team_id - relationship 0f32ba4b-2c17-a8fc-6d17-1e5835afd555 isActive: false crossFilteringBehavior: bothDirections diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics dim_season.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics dim_season.tmdl index e598abb..f599994 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics dim_season.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics dim_season.tmdl @@ -40,9 +40,8 @@ table 'analytics dim_season' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_dim_season = NBA_Project{[Schema="analytics",Item="dim_season"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_dim_season = Origen{[Schema="analytics",Item="dim_season"]}[Data] in analytics_dim_season diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_bridge_team_season.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_bridge_team_season.tmdl index 19b29f9..6f87fd1 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_bridge_team_season.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_bridge_team_season.tmdl @@ -22,9 +22,8 @@ table 'analytics vw_bridge_team_season' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_bridge_team_season = NBA_Project{[Schema="analytics",Item="vw_bridge_team_season"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_bridge_team_season = Origen{[Schema="analytics",Item="vw_bridge_team_season"]}[Data] in analytics_vw_bridge_team_season diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q10_recent_top.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q10_recent_top.tmdl index 9c6dd2c..bbfae2c 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q10_recent_top.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q10_recent_top.tmdl @@ -48,9 +48,8 @@ table 'analytics vw_q10_recent_top' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q10_recent_top = NBA_Project{[Schema="analytics",Item="vw_q10_recent_top"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_q10_recent_top = Origen{[Schema="analytics",Item="vw_q10_recent_top"]}[Data] in analytics_vw_q10_recent_top diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q1_hist_perf.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q1_hist_perf.tmdl index ace7653..aa0f5de 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q1_hist_perf.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q1_hist_perf.tmdl @@ -66,9 +66,8 @@ table 'analytics vw_q1_hist_perf' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q1_hist_perf = NBA_Project{[Schema="analytics",Item="vw_q1_hist_perf"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_q1_hist_perf = Origen{[Schema="analytics",Item="vw_q1_hist_perf"]}[Data] in analytics_vw_q1_hist_perf diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q2_age_vs_current.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q2_age_vs_current.tmdl index 075a91b..edeae5c 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q2_age_vs_current.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q2_age_vs_current.tmdl @@ -49,9 +49,7 @@ table 'analytics vw_q2_age_vs_current' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q2_age_vs_current = NBA_Project{[Schema="analytics",Item="vw_q2_age_vs_current"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + Consulta = Value.NativeQuery(Origen, "SELECT team_name, year_founded, franchise_age, winrate_hist, ppg_hist FROM analytics.vw_q2_age_vs_current", null, [EnableFolding=true]) in - analytics_vw_q2_age_vs_current - + Consulta diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q3_player_context_offense.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q3_player_context_offense.tmdl index 506ac33..0806a16 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q3_player_context_offense.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q3_player_context_offense.tmdl @@ -48,9 +48,8 @@ table 'analytics vw_q3_player_context_offense' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q3_player_context_offense = NBA_Project{[Schema="analytics",Item="vw_q3_player_context_offense"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_q3_player_context_offense = Origen{[Schema="analytics",Item="vw_q3_player_context_offense"]}[Data] in analytics_vw_q3_player_context_offense diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q4_ppg_by_decade.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q4_ppg_by_decade.tmdl index 78f7663..5635ba0 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q4_ppg_by_decade.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q4_ppg_by_decade.tmdl @@ -23,9 +23,8 @@ table 'analytics vw_q4_ppg_by_decade' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q4_ppg_by_decade = NBA_Project{[Schema="analytics",Item="vw_q4_ppg_by_decade"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_q4_ppg_by_decade = Origen{[Schema="analytics",Item="vw_q4_ppg_by_decade"]}[Data] in analytics_vw_q4_ppg_by_decade diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q5_consistency.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q5_consistency.tmdl index 1fbc163..7bf1de1 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q5_consistency.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q5_consistency.tmdl @@ -31,9 +31,8 @@ table 'analytics vw_q5_consistency' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q5_consistency = NBA_Project{[Schema="analytics",Item="vw_q5_consistency"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_q5_consistency = Origen{[Schema="analytics",Item="vw_q5_consistency"]}[Data] in analytics_vw_q5_consistency diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q6_home_away_impact.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q6_home_away_impact.tmdl index 1820b12..3ed2d74 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q6_home_away_impact.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q6_home_away_impact.tmdl @@ -77,9 +77,8 @@ table 'analytics vw_q6_home_away_impact' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q6_home_away_impact = NBA_Project{[Schema="analytics",Item="vw_q6_home_away_impact"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_q6_home_away_impact = Origen{[Schema="analytics",Item="vw_q6_home_away_impact"]}[Data] in analytics_vw_q6_home_away_impact diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q7_balance_of_def.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q7_balance_of_def.tmdl index 7bc8e68..82db88a 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q7_balance_of_def.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q7_balance_of_def.tmdl @@ -49,9 +49,8 @@ table 'analytics vw_q7_balance_of_def' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q7_balance_of_def = NBA_Project{[Schema="analytics",Item="vw_q7_balance_of_def"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_q7_balance_of_def = Origen{[Schema="analytics",Item="vw_q7_balance_of_def"]}[Data] in analytics_vw_q7_balance_of_def diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q8_longest_win_streak.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q8_longest_win_streak.tmdl index 856942d..e5f679f 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q8_longest_win_streak.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q8_longest_win_streak.tmdl @@ -30,9 +30,8 @@ table 'analytics vw_q8_longest_win_streak' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q8_longest_win_streak = NBA_Project{[Schema="analytics",Item="vw_q8_longest_win_streak"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_q8_longest_win_streak = Origen{[Schema="analytics",Item="vw_q8_longest_win_streak"]}[Data] in analytics_vw_q8_longest_win_streak diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q9_physical_profile.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q9_physical_profile.tmdl index 7866582..a0743b7 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q9_physical_profile.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_q9_physical_profile.tmdl @@ -41,9 +41,8 @@ table 'analytics vw_q9_physical_profile' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_q9_physical_profile = NBA_Project{[Schema="analytics",Item="vw_q9_physical_profile"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_q9_physical_profile = Origen{[Schema="analytics",Item="vw_q9_physical_profile"]}[Data] in analytics_vw_q9_physical_profile diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_basic.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_basic.tmdl index 0a35ec0..1afa57a 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_basic.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_basic.tmdl @@ -31,9 +31,8 @@ table 'analytics vw_team_season_basic' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_team_season_basic = NBA_Project{[Schema="analytics",Item="vw_team_season_basic"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_team_season_basic = Origen{[Schema="analytics",Item="vw_team_season_basic"]}[Data] in analytics_vw_team_season_basic diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_metrics.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_metrics.tmdl index 014d456..70077f7 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_metrics.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_team_season_metrics.tmdl @@ -79,9 +79,8 @@ table 'analytics vw_team_season_metrics' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_team_season_metrics = NBA_Project{[Schema="analytics",Item="vw_team_season_metrics"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_team_season_metrics = Origen{[Schema="analytics",Item="vw_team_season_metrics"]}[Data] in analytics_vw_team_season_metrics diff --git a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_teams.tmdl b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_teams.tmdl index 7db7749..9cda8de 100644 --- a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_teams.tmdl +++ b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Model/tables/analytics vw_teams.tmdl @@ -30,9 +30,8 @@ table 'analytics vw_teams' mode: directQuery source = let - Origen = Sql.Databases(".\SQLEXPRESS"), - NBA_Project = Origen{[Name="NBA_Project"]}[Data], - analytics_vw_teams = NBA_Project{[Schema="analytics",Item="vw_teams"]}[Data] + Origen = Sql.Database(".\SQLEXPRESS", "NBA_Project"), + analytics_vw_teams = Origen{[Schema="analytics",Item="vw_teams"]}[Data] in analytics_vw_teams diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/config.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/config.json" index f259cb1..a72e831 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/config.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/config.json" @@ -23,7 +23,7 @@ ], "Category": [ { - "queryRef": "analytics vw_teams.team_name", + "queryRef": "analytics vw_q8_longest_win_streak.team_name", "active": true } ] @@ -35,11 +35,6 @@ "Name": "a", "Entity": "analytics vw_q8_longest_win_streak", "Type": 0 - }, - { - "Name": "a1", - "Entity": "analytics vw_teams", - "Type": 0 } ], "Select": [ @@ -64,12 +59,12 @@ "Column": { "Expression": { "SourceRef": { - "Source": "a1" + "Source": "a" } }, "Property": "team_name" }, - "Name": "analytics vw_teams.team_name", + "Name": "analytics vw_q8_longest_win_streak.team_name", "NativeReferenceName": "team_name" } ], diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/dataTransforms.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/dataTransforms.json" index ea5d62e..a641f8e 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/dataTransforms.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/dataTransforms.json" @@ -189,7 +189,7 @@ "projectionActiveItems": { "Category": [ { - "queryRef": "analytics vw_teams.team_name", + "queryRef": "analytics vw_q8_longest_win_streak.team_name", "suppressConcat": false } ] @@ -204,7 +204,7 @@ }, { "Restatement": "team_name", - "Name": "analytics vw_teams.team_name", + "Name": "analytics vw_q8_longest_win_streak.team_name", "Type": 2048 } ] @@ -272,7 +272,7 @@ }, { "displayName": "team_name", - "queryName": "analytics vw_teams.team_name", + "queryName": "analytics vw_q8_longest_win_streak.team_name", "roles": { "Category": true }, @@ -284,7 +284,7 @@ "Column": { "Expression": { "SourceRef": { - "Entity": "analytics vw_teams" + "Entity": "analytics vw_q8_longest_win_streak" } }, "Property": "team_name" diff --git "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/query.json" "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/query.json" index e663831..01e0818 100644 --- "a/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/query.json" +++ "b/CODE/Dashboard - POWERBI/Analisis_NBA_BestTeam/Report/sections/004_Insights/visualContainers/11000_Racha hist\303\263rica/query.json" @@ -9,11 +9,6 @@ "Name": "a", "Entity": "analytics vw_q8_longest_win_streak", "Type": 0 - }, - { - "Name": "a1", - "Entity": "analytics vw_teams", - "Type": 0 } ], "Select": [ @@ -38,12 +33,12 @@ "Column": { "Expression": { "SourceRef": { - "Source": "a1" + "Source": "a" } }, "Property": "team_name" }, - "Name": "analytics vw_teams.team_name", + "Name": "analytics vw_q8_longest_win_streak.team_name", "NativeReferenceName": "team_name" } ], diff --git a/DOCS/i1_i4_verification.md b/DOCS/i1_i4_verification.md index fc9150d..0060e70 100644 --- a/DOCS/i1_i4_verification.md +++ b/DOCS/i1_i4_verification.md @@ -41,13 +41,13 @@ The same load was repeated against local SQL Server 2022 Express on 10/09/2026. - Versionable source: adjacent pbi-tools project. - Compiler: pbi-tools Core 1.2.0 on .NET 10 with major roll-forward. - Power BI Desktop installed during compilation: 2.157.1354.0. -- Size: **6,372,771 bytes**. -- SHA-256: `FDD8498F49F70150D9CB33D20B8080B1A35DD545D91D4C915C7DF2091578F98A`. +- Size: **6,372,749 bytes**. +- SHA-256: `16AA1CD74E54334D3D481A780AEEA153D3825231F22C70576623070B436F010F`. - ZIP integrity: compiled successfully with `Report/Layout`, `DataModelSchema` and required package metadata. - Pages: six, ordered from `Inicio` to `Metodología y cierre`. - SQL source: only `.\SQLEXPRESS/NBA_Project`; no personal host or credential is embedded. -Compilation proves that the extracted report and model produce a valid PBIT package. It does not, by itself, prove a successful DirectQuery refresh. The screenshot protocol therefore requires a loaded local SQL instance and an explicit refresh before publication. +Compilation proves that the extracted report and model produce a valid PBIT package. On **15/09/2026**, the compiled report was opened in Power BI Desktop against the local `.\SQLEXPRESS` instance: the native `SELECT` used by the age-versus-current view was accepted, all six pages rendered, and the streak visual returned the expected ranked values (Lakers 33, Warriors 25, Rockets 22, Spurs 20, Hawks 19). This is local Windows evidence of a successful DirectQuery session; it does not claim a hosted Power BI refresh or a 22 GB synthetic dataset. ## Repeatable commands diff --git a/scripts/update_powerbi_project_i4.py b/scripts/update_powerbi_project_i4.py index 36907db..8a0a0ed 100644 --- a/scripts/update_powerbi_project_i4.py +++ b/scripts/update_powerbi_project_i4.py @@ -289,6 +289,91 @@ def update_efficiency_card_labels() -> None: write_json(path, config) +def normalize_streak_visual_source() -> None: + """Keep the streak chart self-contained so it does not depend on a missing model path. + + The analytical view already exposes ``team_name``. Referencing that column + directly avoids a second, unrelated ``vw_teams`` source in the visual query + (and the resulting blank visual in DirectQuery mode). + """ + + directory = SECTIONS / "004_Insights" / "visualContainers" / "11000_Racha histórica" + + def normalize(value: object) -> object: + if isinstance(value, str): + return value.replace( + "analytics vw_teams.team_name", + "analytics vw_q8_longest_win_streak.team_name", + ) + if isinstance(value, list): + return [normalize(item) for item in value] + if isinstance(value, dict): + updated = {key: normalize(item) for key, item in value.items()} + if updated.get("Entity") == "analytics vw_teams": + updated["Entity"] = "analytics vw_q8_longest_win_streak" + if updated.get("Source") == "a1": + updated["Source"] = "a" + return updated + return value + + for filename in ("query.json", "config.json", "dataTransforms.json"): + path = directory / filename + payload = normalize(read_json(path)) + for query in _streak_queries(payload): + sources = query.get("From") + if isinstance(sources, list): + query["From"] = [source for source in sources if source.get("Name") != "a1"] + write_json(path, payload) + + +def _streak_queries(payload: object) -> list[dict]: + """Return query dictionaries nested in the three report JSON shapes.""" + + queries: list[dict] = [] + + def visit(value: object) -> None: + if isinstance(value, dict): + if isinstance(value.get("From"), list): + queries.append(value) + for item in value.values(): + visit(item) + elif isinstance(value, list): + for item in value: + visit(item) + + visit(payload) + return queries + + +def use_native_query_for_q2() -> None: + """Avoid Power Query metadata recursion for the age/current analytical view.""" + + path = PROJECT / "Model" / "tables" / "analytics vw_q2_age_vs_current.tmdl" + text = path.read_text(encoding="utf-8-sig") + if "Value.NativeQuery(Origen" in text: + return + marker = "\tpartition 'analytics vw_q2_age_vs_current' = m" + partition_start = text.find(marker) + if partition_start < 0: + raise RuntimeError("No se encontró la partición M de q2.") + source_start = text.find("\t\t\t\tlet\n", partition_start) + if source_start < 0: + raise RuntimeError("No se encontró el bloque M de q2.") + output_marker = "\n\t\t\t\t analytics_vw_q2_age_vs_current\n" + source_end = text.find(output_marker, source_start) + if source_end < 0: + raise RuntimeError("No se encontró la salida M de q2.") + source_end += len(output_marker) + native = ( + "\t\t\t\tlet\n" + "\t\t\t\t Origen = Sql.Database(\".\\SQLEXPRESS\", \"NBA_Project\"),\n" + "\t\t\t\t Consulta = Value.NativeQuery(Origen, \"SELECT team_name, year_founded, franchise_age, winrate_hist, ppg_hist FROM analytics.vw_q2_age_vs_current\", null, [EnableFolding=true])\n" + "\t\t\t\tin\n" + "\t\t\t\t Consulta\n" + ) + path.write_text(text[:source_start] + native + text[source_end:], encoding="utf-8", newline="\n") + + def main() -> int: for folder, display_name in PAGES.items(): path = SECTIONS / folder / "section.json" @@ -357,8 +442,14 @@ def main() -> int: for previous_server in ("100.74.116.125,1433", "localhost,1433"): updated = updated.replace( f'Sql.Databases("{previous_server}")', - 'Sql.Databases(".\\SQLEXPRESS")', + 'Sql.Database(".\\SQLEXPRESS", "NBA_Project")', ) + updated = updated.replace( + 'Origen = Sql.Databases(".\\SQLEXPRESS"),\n' + ' NBA_Project = Origen{[Name="NBA_Project"]}[Data],', + 'Origen = Sql.Database(".\\SQLEXPRESS", "NBA_Project"),', + ) + updated = updated.replace('= NBA_Project{[Schema=', '= Origen{[Schema=') updated = remove_redundant_power_query_renames(updated) if updated != text: path.write_text(updated, encoding="utf-8", newline="\n") @@ -420,6 +511,8 @@ def main() -> int: update_methodology() update_player_sample_label() update_efficiency_card_labels() + normalize_streak_visual_source() + use_native_query_for_q2() print("I4 aplicado: seis páginas, dos visuales redistribuidos y origen SQL local.") return 0 diff --git a/scripts/validate_i1_i4.py b/scripts/validate_i1_i4.py index be841a0..c163b5e 100644 --- a/scripts/validate_i1_i4.py +++ b/scripts/validate_i1_i4.py @@ -32,8 +32,8 @@ "Metodología y cierre": 5, } EXPECTED_PBIT = { - "bytes": 6_372_771, - "sha256": "FDD8498F49F70150D9CB33D20B8080B1A35DD545D91D4C915C7DF2091578F98A", + "bytes": 6_372_749, + "sha256": "16AA1CD74E54334D3D481A780AEEA153D3825231F22C70576623070B436F010F", } @@ -85,7 +85,10 @@ def validate_model_files() -> None: require(len(tables) == 15, "Power BI does not expose 15 TMDL objects") for path in tables: text = path.read_text(encoding="utf-8") - require('Sql.Databases(".\\SQLEXPRESS")' in text, f"Unexpected source: {path.name}") + require( + 'Sql.Database(".\\SQLEXPRESS", "NBA_Project")' in text, + f"Unexpected source: {path.name}", + ) require("100.74.116.125" not in text, f"Former personal host remains: {path.name}") require("Table.RenameColumns" not in text, f"Stale Power Query rename: {path.name}") diff --git a/src/nba_pipeline/model_validation.py b/src/nba_pipeline/model_validation.py index 70c8729..e96f48a 100644 --- a/src/nba_pipeline/model_validation.py +++ b/src/nba_pipeline/model_validation.py @@ -22,18 +22,21 @@ def powerbi_contract() -> dict[str, dict[str, Any]]: text = path.read_text(encoding="utf-8-sig") table_match = re.search(r"(?m)^table\s+(.+)$", text) object_match = re.search(r'\[Schema="([^"]+)",Item="([^"]+)"\]', text) - if not table_match or not object_match: + native_object_match = re.search(r"(?i)\bFROM\s+analytics\.([A-Za-z0-9_]+)", text) + if not table_match or (not object_match and not native_object_match): raise ValueError(f"TMDL incompleto: {path.relative_to(ROOT)}") table = table_match.group(1).strip().strip("'") + schema = object_match.group(1) if object_match else "analytics" + object_name = object_match.group(2) if object_match else native_object_match.group(1) columns = [ match.group(1).strip().strip("'") for match in re.finditer(r"(?m)^\s*column\s+(.+)$", text) ] - servers = sorted(set(re.findall(r'Sql\.Databases\("([^"]+)"\)', text))) + servers = sorted(set(re.findall(r'Sql\.Database\("([^"]+)"\s*,\s*"NBA_Project"\)', text))) objects[table] = { "file": path.relative_to(ROOT).as_posix(), - "schema": object_match.group(1), - "object": object_match.group(2), + "schema": schema, + "object": object_name, "columns": columns, "servers": servers, }