diff --git a/.changeset/famous-birds-remain.md b/.changeset/famous-birds-remain.md deleted file mode 100644 index d8c73e9fd5e4..000000000000 --- a/.changeset/famous-birds-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@cloudflare/wrangler-devtools": patch ---- - -chore: update devtools patches for release diff --git a/.gitignore b/.gitignore index cbc4bb8e245c..717249ec217b 100644 --- a/.gitignore +++ b/.gitignore @@ -190,10 +190,6 @@ packages/quick-edit/web packages/wrangler/config-schema.json packages/wrangler-devtools/built-devtools packages/wrangler-devtools/.cipd -packages/wrangler-devtools/.gclient -packages/wrangler-devtools/.gclient_entries -packages/wrangler-devtools/.gclient_previous_sync_commits -packages/wrangler-devtools/.gcs_entries packages/wrangler-devtools/depot packages/wrangler-devtools/devtools-frontend packages/miniflare/dist-types/ diff --git a/.prettierignore b/.prettierignore index 8cd1d94f152b..b4b1ab75efe2 100644 --- a/.prettierignore +++ b/.prettierignore @@ -24,7 +24,6 @@ packages/create-cloudflare/templates*/**/*.* # but still exclude the worker-configuration.d.ts file, since it's generated !packages/create-cloudflare/templates*/hello-world/**/*.* packages/create-cloudflare/templates*/hello-world/**/worker-configuration.d.ts -packages/wrangler-devtools/devtools-frontend # dist-functions are generated in the fixtures/vitest-pool-workers-examples/pages-functions-unit-integration-self folder dist-functions diff --git a/packages/wrangler-devtools/Makefile b/packages/wrangler-devtools/Makefile index 24d25342dfce..8f3cfc214960 100644 --- a/packages/wrangler-devtools/Makefile +++ b/packages/wrangler-devtools/Makefile @@ -1,7 +1,7 @@ ROOT = $(realpath .) PATH_WITH_DEPOT = $(PATH):$(ROOT)/depot/ # The upstream devtools commit upon which our patches are based -HEAD = 279239c4c670edbde12345aca4fadb7f07d503e8 +HEAD = 64208f10b3efe06a92c58d345bd828832d09c4a7 PATCHES = $(shell ls ${PWD}/patches/*.patch) depot: git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git depot diff --git a/packages/wrangler-devtools/patches/0001-Support-viewing-files-over-the-network.patch b/packages/wrangler-devtools/patches/0001-Support-viewing-files-over-the-network.patch new file mode 100644 index 000000000000..1632c6e17063 --- /dev/null +++ b/packages/wrangler-devtools/patches/0001-Support-viewing-files-over-the-network.patch @@ -0,0 +1,97 @@ +From 24644cc732ec4bf8589715e853067eadd1b52e29 Mon Sep 17 00:00:00 2001 +From: Workers DevProd +Date: Mon, 2 Oct 2023 18:13:34 +0100 +Subject: [PATCH 01/15] Support viewing files over the network + +--- + front_end/core/sdk/Target.ts | 4 ++++ + front_end/entrypoints/js_app/js_app.ts | 2 +- + front_end/panels/sources/sources-meta.ts | 11 ++++++++--- + tsconfig.json | 3 ++- + 4 files changed, 15 insertions(+), 5 deletions(-) + +diff --git a/front_end/core/sdk/Target.ts b/front_end/core/sdk/Target.ts +index eed909ea64..5e1778885d 100644 +--- a/front_end/core/sdk/Target.ts ++++ b/front_end/core/sdk/Target.ts +@@ -82,6 +82,9 @@ export class Target extends ProtocolClient.InspectorBackend.TargetBase { + case Type.Tab: + this.#capabilitiesMask = Capability.Target | Capability.Tracing; + break; ++ case Type.Cloudflare: ++ this.#capabilitiesMask = Capability.JS | Capability.Network; ++ break; + } + this.#typeInternal = type; + this.#parentTargetInternal = parentTarget; +@@ -255,6 +258,7 @@ export enum Type { + Browser = 'browser', + AuctionWorklet = 'auction-worklet', + Tab = 'tab', ++ Cloudflare = 'cloudflare', + } + + // TODO(crbug.com/1167717): Make this a const enum again +diff --git a/front_end/entrypoints/js_app/js_app.ts b/front_end/entrypoints/js_app/js_app.ts +index cafecfa4ba..213ca7fecd 100644 +--- a/front_end/entrypoints/js_app/js_app.ts ++++ b/front_end/entrypoints/js_app/js_app.ts +@@ -38,7 +38,7 @@ export class JsMainImpl implements Common.Runnable.Runnable { + Host.userMetrics.actionTaken(Host.UserMetrics.Action.ConnectToNodeJSDirectly); + void SDK.Connections.initMainConnection(async () => { + const target = SDK.TargetManager.TargetManager.instance().createTarget( +- 'main', i18nString(UIStrings.main), SDK.Target.Type.Node, null); ++ 'main', i18nString(UIStrings.main), SDK.Target.Type.Cloudflare, null); + void target.runtimeAgent().invoke_runIfWaitingForDebugger(); + }, Components.TargetDetachedDialog.TargetDetachedDialog.webSocketConnectionLost); + } +diff --git a/front_end/panels/sources/sources-meta.ts b/front_end/panels/sources/sources-meta.ts +index a0c126df12..4b8244ea69 100644 +--- a/front_end/panels/sources/sources-meta.ts ++++ b/front_end/panels/sources/sources-meta.ts +@@ -41,6 +41,11 @@ const UIStrings = { + *@description Title of the 'Snippets' tool in the Snippets Navigator View, which is part of the Sources tool + */ + snippets: 'Snippets', ++ /** ++ *@description Title of the 'Cloudflare' tool in the Cloudflare Navigator View, which is part of the Sources tool ++ */ ++ cloudflare: 'Cloudflare', ++ /** + /** + *@description Command for showing the 'Search' tool + */ +@@ -454,14 +459,14 @@ UI.ViewManager.registerViewExtension({ + + UI.ViewManager.registerViewExtension({ + location: UI.ViewManager.ViewLocationValues.NAVIGATOR_VIEW, +- id: 'navigator-files', ++ id: 'navigator-network', + commandPrompt: i18nLazyString(UIStrings.showWorkspace), +- title: i18nLazyString(UIStrings.workspace), ++ title: i18nLazyString(UIStrings.cloudflare), + order: 3, + persistence: UI.ViewManager.ViewPersistence.PERMANENT, + async loadView() { + const Sources = await loadSourcesModule(); +- return Sources.SourcesNavigator.FilesNavigatorView.instance(); ++ return Sources.SourcesNavigator.NetworkNavigatorView.instance(); + }, + }); + +diff --git a/tsconfig.json b/tsconfig.json +index ac0d4aaf68..29c726e185 100644 +--- a/tsconfig.json ++++ b/tsconfig.json +@@ -16,6 +16,7 @@ + "inspector_overlay" + ], + "exclude": [ +- "front_end/**/*-legacy.ts" ++ "front_end/**/*-legacy.ts", ++ "third_party/**/*.ts" + ] + } +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0002-Setup-Cloudflare-devtools-target-type.patch b/packages/wrangler-devtools/patches/0002-Setup-Cloudflare-devtools-target-type.patch deleted file mode 100644 index 029cd416e600..000000000000 --- a/packages/wrangler-devtools/patches/0002-Setup-Cloudflare-devtools-target-type.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 6fbdae0bba47eeb10a779fbfbb15bbe6f17fa798 Mon Sep 17 00:00:00 2001 -From: Workers DevProd -Date: Fri, 25 Oct 2024 16:06:06 +0100 -Subject: [PATCH 2/8] Setup Cloudflare devtools target type - ---- - front_end/core/sdk/Target.ts | 4 ++++ - front_end/entrypoints/js_app/js_app.ts | 2 +- - 2 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/front_end/core/sdk/Target.ts b/front_end/core/sdk/Target.ts -index 0b3f0f9def..ee384b197e 100644 ---- a/front_end/core/sdk/Target.ts -+++ b/front_end/core/sdk/Target.ts -@@ -86,6 +86,9 @@ export class Target extends ProtocolClient.InspectorBackend.TargetBase { - case Type.TAB: - this.#capabilitiesMask = Capability.TARGET | Capability.TRACING; - break; -+ case Type.CLOUDFLARE: -+ this.#capabilitiesMask = Capability.JS | Capability.NETWORK; -+ break; - } - this.#typeInternal = type; - this.#parentTargetInternal = parentTarget; -@@ -260,6 +263,7 @@ export enum Type { - AUCTION_WORKLET = 'auction-worklet', - WORKLET = 'worklet', - TAB = 'tab', -+ CLOUDFLARE = 'cloudflare', - } - - export const enum Capability { -diff --git a/front_end/entrypoints/js_app/js_app.ts b/front_end/entrypoints/js_app/js_app.ts -index 6a154030b6..1a6644df92 100644 ---- a/front_end/entrypoints/js_app/js_app.ts -+++ b/front_end/entrypoints/js_app/js_app.ts -@@ -60,7 +60,7 @@ export class JsMainImpl implements Common.Runnable.Runnable { - Host.userMetrics.actionTaken(Host.UserMetrics.Action.ConnectToNodeJSDirectly); - void SDK.Connections.initMainConnection(async () => { - const target = SDK.TargetManager.TargetManager.instance().createTarget( -- 'main', i18nString(UIStrings.main), SDK.Target.Type.NODE, null); -+ 'main', i18nString(UIStrings.main), SDK.Target.Type.CLOUDFLARE, null); - void target.runtimeAgent().invoke_runIfWaitingForDebugger(); - }, Components.TargetDetachedDialog.TargetDetachedDialog.webSocketConnectionLost); - } --- -2.39.5 (Apple Git-154) - diff --git a/packages/wrangler-devtools/patches/0002-Show-fallback-image-on-Safari.patch b/packages/wrangler-devtools/patches/0002-Show-fallback-image-on-Safari.patch new file mode 100644 index 000000000000..57b41d317058 --- /dev/null +++ b/packages/wrangler-devtools/patches/0002-Show-fallback-image-on-Safari.patch @@ -0,0 +1,1819 @@ +From 0ccfb994361f1fa467f7ea441131f4a079cea607 Mon Sep 17 00:00:00 2001 +From: Workers DevProd +Date: Mon, 2 Oct 2023 18:18:45 +0100 +Subject: [PATCH 02/15] Show fallback image on Safari + +--- + config/gni/devtools_grd_files.gni | 1 + + config/gni/devtools_image_files.gni | 1 + + front_end/Images/fake.png | Bin 0 -> 100371 bytes + front_end/entrypoint_template.html | 27 +++++++++++++++++++++++++-- + 4 files changed, 27 insertions(+), 2 deletions(-) + create mode 100644 front_end/Images/fake.png + +diff --git a/config/gni/devtools_grd_files.gni b/config/gni/devtools_grd_files.gni +index f0007ac34b..5e2281b2e7 100644 +--- a/config/gni/devtools_grd_files.gni ++++ b/config/gni/devtools_grd_files.gni +@@ -58,6 +58,7 @@ grd_files_release_sources = [ + "front_end/Images/check-circle.svg", + "front_end/Images/check-double.svg", + "front_end/Images/checker.svg", ++ "front_end/Images/fake.png", + "front_end/Images/checkmark.svg", + "front_end/Images/chevron-double-right.svg", + "front_end/Images/chevron-down.svg", +diff --git a/config/gni/devtools_image_files.gni b/config/gni/devtools_image_files.gni +index 042be12dfd..7439a30ab7 100644 +--- a/config/gni/devtools_image_files.gni ++++ b/config/gni/devtools_image_files.gni +@@ -8,6 +8,7 @@ devtools_image_files = [ + "accelerometer-right.png", + "accelerometer-top.png", + "chromeLeft.avif", ++ "fake.png", + "chromeMiddle.avif", + "chromeRight.avif", + "cssoverview_icons_2x.avif", +diff --git a/front_end/Images/fake.png b/front_end/Images/fake.png +new file mode 100644 +index 0000000000000000000000000000000000000000..61468f4e731cdbbc8fa26ab74b72b93b509d5a54 +GIT binary patch +literal 100371 +zcmbTdbyytRvOWw62^QRafZzj!;2zw9>!4v^aCaxT1_>H8xI=J<1eXMNcXwy7->}cQ +z_nznb{s==tryr+!KHUv} +zdrISVwIPC=P_Prv)>R|>EMS<$!!?sB#KIe-;DLhq0bXt8%{%n^4_%Q_=!hf1L%#K{ +z+~2utO0HDOe6OA~$5&2K8{hz=m<8u34epo}2yhi^;ax#+n0YO;@uIP~ov&-U-id?~ +z$lB+VYRcF*ksc@9cJ)>PY+inl3F^c$eevCc=Auvg))oj+!HA3$=bc~YZhVRk0RqR +zF>sz^uygabI11WsM$BvEaq1kvRNzg(XS(wc!aQRcQS6P!Liqa6uPk3X0bDlhUvvPt +zKJ!Q?lMt1!jI$$%ScR^lh!mip%${QIi?+lVU=kLb%mRm^)w@JV-gg1>{e^q62G?Yb +z7LzvKzQco7RNq(y3FT|2;bkJQy#k+8iGbgB6=U+_Zgd4Pc=h0$R#Js{b$!(`f84_C +zJq!Bv=-^#SFGh-6a>6>uM3}-_$1C?UN^RvK2y{w$2K{8M8wK>`Avkz%(D#vWY?UAq +zl_CW-ngWwPlm9A`^<${&ju$2#w0EF)4OiKwrh|febNjWNyK1N&O86SC(P@`x17H*C +z7F_s_Pd|fBKkX0lm&EM=)|acFU%h}Mll~-!cncsw;)4?3tt7P2A=!N!rD<5C!~rFarH_-I!y)V53XP +zAw*MB-$*&3Tj?g-vRI8h`VM1ME)&rjci=@D(^KhL_r(!PzX1ee2841o2pt7@uCAW! +zAg1CB{S*w|I$g{>2^^7elWtJhpk +z7;?Muf$W#?8rmYroCcNDlFXB=z3&d?RyFU~?B@W1JPzvnYLwlNHxeu3v!dml^i6R& +zaqMto#}W6Jm$Z^siyxfk+8xgy;eIwl?CehZTv=*fefB;&ITgN7uQvIq81f!&8{Ls+ +zjfyu!4g=vPQ7J$%h5X$Mlb^&xy~qvltSg8wMCe0boC1hG2F{xPa%Oq0`t!{@f_Q(2 +zA8$%u@BgCxfp>u5`O{|vDat=?$IbicfJ5klgAWE~I5#I)a +z3sH)Lh_e%S%;NptkG|s|PycL^9XASg5^6%wi_pkv9({fB)&r|G$|Z+&1pdvZfn;9qkwFrM3|g;gdrS-=TCX&|Od9?<5i;m*suVh)R_HS4A*&Bz;z3aS*?42@h2KVK +z5PjT5a>8}b_y~90+m2O;@Y0{`SKLq9NNQv3d`wwnyuiaivB2>Y&>m$AHFg-EI8!#i +z7k*sWY}amAcNbch#~L!2?i9=ZvpCgm?1A)BEr#kW$0I)LZboIZgwjx&`rE(i8o?8cD$Z`mT1*>0+9 +z472f#@wM@M1LgyI10)a#L=}RuNeJ;fBi*bW@JtwH5LS9D%q{|#bg0Ov#})#WXR{nc +zHxma)7!xdHE_3pgP>bXWIVV&n?j|sbIn)u=>lhWC>n!pt0`~AGlPrumQ91MH#B0H| +zD77ywk|v-N{ddh*5$u9Ni +z`9?*ZQ~i^m;%bBK;GqJnVCrP*8*2P7g(UWnF3-i-CZ8s+#rKOIi~CKP7dsw)9=sld +zm&BJxyX(+8C>vDuf_pD>>X@X6bIkIstMP2#1GO#5_t$l=D_@VJ)e+Z_ydfkedQB4k +zW|}DD{Q>(J+Zp=+mo~&{p>R6clc~PXcmHikr$bk+nm5jATI?8eZnaIjt;yoT;+6D;g09EkX^Klb$oUmRyxIe2^Qh8rF +z-y?L!b-CqcdwO)0b(ecyd9+)`pCR_J;eN4lx{`O2 +z2a@S3jliZ|8DDa`<-_Oku346Zea!FE5%v*eL@l$m!4_cowY%KUxp*>*>ypu_yhq?F +zpDI8jLs0zJBv)axx(0YKM+$gGgxcR +z5h&mmq_D>fDOAWFZ&x)~Hn6(+w5Ye}w{iQvdNL1o?Fo-G{kHUtiQTi>tD3P2iU9oO +z@vGz@=0JY-*fHC|W#i2j?dH@r!)D$l8NLOIW1#h|^ +zJZg+T@+-R%zSEaE;|Gc}*dCE4)P$v7+ +zDC@8GiNxZ>aJgoDH|CidOapqYnaV!*(I$!I0XGQ20NEhZKs#`YrR`)t*qc +zOs`6P9!U~b5^~a_)={(9Hp&;gZYJ`wNUhl);cdlMlk<~t8krS#MKd+QRgzWtp4K;W +z`OaJWiDh?HLY5DgvQGn0#(-i8^<(Z6F5TIk`bwL))%-L0OfFQe(aMJa&Eh!s(#;js`tnTyad! +zPFojE7qKp*UddhwEhp6-_dNc1C_^Mf+(XwUE#(vESDX6G@zHX}_P51>jjYX{0I5eq +z?QF^I2v!I+e^d%-nLxg`)vo=(>1{8fPPoo%g;0fy^xp!vh0ZGb>8k4rdX^F9`#fYW +z(1mZ`*$al=57(ug3%OpjY~OYg5E2lxHtAWJxmpWfH18jW@GbBWvoso5G#%JCHac2u +zpE9*+D(Is%cx(~h&2{g`PV?KoU1*q1n49#Db3LCeThOVnAy|C$G9A+ESgi8gyJkEh +zS*UpI+=_P?Bdx5ExXMhK*FvU~L +zcF<1ucH5XR=VPgd`NP?Yfsb$Pb@cwRJB<(LjmIfTD>wgAQ;RiOD0#yZ%kkp&HH6|q +z=-|HZ#_dXVte_yXz>CrwbT_$Wd0zj+))n#mHKGJ5o75H4=U>4l#&9Pdh;S3eaAtPC +zl0>Y_PyKIVk3kTmdph7U^}uhm&wMveHcfCd&1g35-`lhq;YQWq)&$}94g?m0 +zuPmy(^Cm*=D1PulEj{%4Zn$Ze9Uo(^hfM+M&hWySPp`PjytJ0x>JwoeML0xD#zbBo +zjuCc_1cv}m4EG9l1`peX;7R`bToRrh?&V+CU%m(<}UI@E@Y$pwJ +zgoDGUdEVh=RNkJz+MhO8({j?1|Hx-#Yt3S4Yzv04xLMmhw*x2O#s@pKhBz4l+^nr^ +z9QoV?ss1X#2Rnbh%t{6LtB8}OAeEN950RrG+dB^gON(co200=l3oA9ZKOa8k$ +z>_0&&GbblIK2}y&S63ESb{1O)Q&u)!US8IB?^)l!XNHwvc67IKGIV3MaisoNBmdQo +zIK_f$2*Sytok3f{=Ze# +z9U%^4w$`vdorL~JUjMHApEv(qQGoUN(f?yA{x#2kU4>1w5Q+fne+x|rWzs7W=GelK +znu{x{!HzI3`|B4D`%4eopO3J85=jP^hXoGq1DuSwh?*PxK{}!rt^`Ss0rm%vW6rFA +zO!{t7Wy-A3?@r?4BE>KKFR(q1Tj|NfJ(LmP^JLW3l+0Dc5dDu1_Na0qb74}i+_^8YfJH0tljRWAa>zyd0H*@Zi1+a97! +zm~im_cyk*yr+T6#@z) +z!v-7Av#^qr&BCLCCGZnp{a+g45&M8+926`Z9u^r2=&MZo70UI`#Iz#dcXA?yi)okX +zFD9CHjKI7o3sCKejAu7>kxe>!RlkIoPUrg~1;9kF6$rezz@oFUA9ul2;22yC)H~Zrv1Ox;Y +z94MUj1pIb(%$mIKSOnj^p>i2u)OweBo}L8>r~6A}qDCrVyOLqA0ulb99>?$?45hUK +zY}Kj)xx2K&0v3vzf6(tQxcko5ITfv;UuI=g<{XkXAv4kuy-<7wqB71ZKmrl^#RSQ0 +zt$qUhBY7}n!gcZWZxiv~m8MxIdG&qD^?08Acl128&U+J>#=E;Kr2kB77e2y)$+%y- +z7+wzvF`3Rc+U-=8h=rh!)s^X>HJ9zK%L%o$1w;CrB4Mv83NmVRSa^7Lax!7B#|P_w +zCSy4G0_3-Nl~Ln3Zc)U1&*R^=sENR5`7ZaE_#>ju+tb}s^$wlPy4wB_0bV`^4;Py% +zL2Gmr)0p=cmi#|kr+zZLkdY`|pIFJPmi*UK5g*6P;OzbiKnz|q8O%ucxZbtYN?dr~ +z+1Y76T(0MIv6C6k;_XqaRY_I(QVUE2>zdT1Pco*%-MDU@t;jgfSx=%V;8GzFnk@ELP1biL^>M6Tj7HvIUJLqbAA +z2kkY%KT--<;Unr8wJyG+RKtPY*;&&~D}Jf|O7@8!w0#EO$9uIbQ3>!glR}#B&4|bx +zvu@6sEKI0sc@~_qNi6B5S1XU+eBMxw+dG3?TKQD-Tl>pc+<~4*VutNf3OO*}XLJA3 +z@1L-$-l;Q&M=6ks;0y2I^hS^O$I*5B((OQNE#tWjgc!AJ=v!~6bUGMIzh=mU3q3tH +z9|y9}8Z~}L#Rn#5Z(Eo+aN8{8QqaBEp`IEvTk#a%mC$g1B$w8 +zY~MM0({kOlV>v8F)v+MC#oi+c?PaNV66s~;Ovd-sq!z~*}%gJdu +zB~CH`y(H;g_LnYJ*>pZTV=UfWNBA2e25jO;hicJn^r$zrm~*}&zfB-FXqQ!v?&v=c +za*D6}WH@j(N1|3^FE^m|{f8Xj@odmXmbIh3^-3F(bYWT%_x%Zd{GmNqHL@_~Zn7wz +zvNz(Ym@j_V(|LQy;5%GpbnjhA5DFf)3Q=X&&IgAp5bykuUsiu{-H;MwFoD|k7%UoE +z%bxh5Uw;|cb9P!rBcWBGm_AmlUZkC{RJQz~Sz&-K*uT_jw$OFiC+z(}fqy9`WnXp| +zmT@}2XCm}!SKiOh&xHMdU!JQnAr+B-DoJnjehwc*)5@TDY?eZ=6;)UU;b8=+YWN%f!5b>C4cTC9qFL>U*`pFT@Ql8W6g=Bu2WeAyMI +z;=o+*toM>M20W<6Mboz(}AC&rR|QbtH1 +z6Aq|KU?H*fo<}KNCuDc=U+~?0;A%bnY`qw$zuedm_5Qv-ek{LIyv>~yOFqkeUgZe< +zCw&jP^+$)peoU<-)INi%>5C6WrQNFNM8S1ZKGgLBRHTq@T`-r*%c9-zndSB_wP??Y +z%w^tUIxArO5T}Gv>c~j*hmlnDz`F=M@mwMF-ej%aBC$jy(9X9x)nGY?=|8M`X9X_S +z^8-ij_81hrUyG6P@`X`sYttNP4;43IvqEV5M)Z&w`@a=oJofkUN3`&)30;7yxvr`@aIg@7jNPH1{ +z*#Ko`HTQmP*>qmVmP4(+i{-<4C*1?<(?<<)@m#BQ84pV3stV32?;LAA0$e38&R;Vef}aQICtASfC}PZdI{*3FGiO)NTW`duLyl-WJ_3 +z1ahmf?}RoKH65I~d%F*IFDqfH~SzDO*lIXpb0nc +z1-zjKAg-B;cDs=QYb}g#4AHQ+;Do}}MG#C-%MjN)m@{fMsjYn3h>ie~%>C+{K_r4d +z{B<9VkVorL$+%frU-;;wY|Q52p@hNJ4*qf31aSy}Nnfq-Z+I{aQJ<;7={XOcO6BKC +z3}xHnn4U#rrr(o)jA-dvol{6jj4h6J7p~0|#Qp(udVC$NXwRh87@M{)01Qr%$t_NU +zl1e?Vk48gd@f``H#wJTlT_^Jds&=eeFsz=}xVIrwY1iDBVKGrEBNl=dT|FH^z@ij#b!eQ9p;Mb3m0p@|2U|ZRJYA2m +z*3wiRL^cPLq6ZS0q|ivXvI(B9g-hC=_*^0rSq&r)LdPl$e6?FW@W_OmwCXm)yCagm +zqm%KgY-$?RTJ#d!T_5IL?oVSyhcMra6)3WH=;GzRK5mt|B;j}$N$Iimo2ZBnCOeMB +z7W;rIWY>6=JlXMiP79^WN#jneGpryEuDcK7NYwbrIe!2Zo?T#fPW8Qo=yQUYUzj{I%rI^9kInecde +zGyEBbn8hkIQBcPP3;&$PqvBVyhV${V?+131p+xsguX`*!b|hbJYbem;<|Iq)*Hrl? +z^?sEH*GH}S+WYT8Z;EafuT%RC=uJC2C_u;pTvqo{3YpNPqs4aCG7NVhufs-e&zI$b +zDhN0N3k0mPm?Y+->)>*5lf);r@9U|84369#Pe#)StYK#Eb6aJ@KC0%j#%+l0sK;T@ +zyr2LzSy|aqm0W4VCWp=9v=qTpa@0DHYa#$M?QQhl=AfprH?;^p46ejounl$P1Oj#G +zv&Q?BTuA8}EGD^2G0U}UHM%YZ26UV#KtOjQR>{@-a)5w!}0W$CpYY$9s_FR +zyq-1(6678MH=9Wh7xS^pd3UNA0*&2n9h)9RBkdJCbYIkU+CJ4c9`gHqz3mJUbhZgs +zXZvQHjAwl6bg}2^GP`aH*-AI5ecGF}+{u2TIZel;U*7#lg-I6Bf>$&U^j_8CG{Eg-1>Q+qpoF6S@H4?DALnC#bQB5EROT_&3}{w=0C-;m$9j$ny3(U#ny|DUy}HpE$|7 +z&-7JDy1UBjV@j&&&t+MYkf4*#PCegJ-qDYsL?>86$DpcUU}uo)pShdTHnM+j@*BYe +za5bpD7HWE*$^Qy;5S2hF&#`!3`hln#KfWH_-7VcgoGj;uG{#x65u1myQTTD6XI%t7 +zbHb$1{({I+`+S{p2m8`E38zD{wSB2&_3%JlR`sFPU8Sq{4$Mlgb1rEGGq=l57GKyr +zyq>Fl+~_US3C!4v5gI&c(SLw~pXRlu4QEz(e@`HQ{6v1Sk!O&vZHBp^2IDPziA4}F +z$9uDa>K5XYLk%{Pcg)T(Q)ht+tGM|1lIuNDSugLd2Q71=xvYirxUA3xW3y{}) +z!_ZEF&&~pLGpSYk+hgw2XFt)Mi>O3S(<`evK$q6l7>TV~7TbDHKP!p)_B-(x@%?fNXm*oWakkki_Qwkn8gpf@$PUEe=Z4l9?^D +zG-cFn_#xJ*U*{F1WTj0y6G>dv5Ts|p^O2AaU60G={;m5`zWlycHUZ1dWOMs{fJ)^W +z)5KQXRMkH|qn +z6t}3#AC;8eZDOIDdx%7&tgLpnkM40My4LG8bJe(=z6TjI^??n?Qfl`P9lYdtYB}+u +ztQqZfSNErFm8MET##YAoFJ@_J4w~u3JtT_;NGg;E6PatWV`7vj-=v8>J(wcr72xeC +z=;IGpE*4~(@xn}n*cU*2_sMd-2rk>D?1bG{mas)MhfkEpB=sg_{E*)@_xr>mi*nty +zOK&YTY<2%KKqc@H-F35M?z0RF%FHP}44<#I5p#M)TTHmgDMWXFmb45&HT{_R5jeE~ +zGp{EJ8$OoV>xd+JEa~=gowmAvN%Gw-!sKncow@R}{2Ok(pQ+-{QmyTc+{$>_HZzaw4{oyUCC^cTgR`Y|y0aaeYS`<@_>hEK{dh!W{1)%?dM^ +z@-EOl(5K>$f_gz!0>6fx)?0`-L|~IaMeoY-ZUElnW*TlFUWhYj%UZ56f|Gmk$?qki +z`65)l>hb0@hoN&l@TG5f-A% +zs8dH;YhgVqM3~@6UT^C7HmA!2-RAgE?{^`gJKr-}!o$HKX~iUW8dkmlDaetEdh1dP +z9vv8N&R}FEYyFiQhGRA#Ej(Zn6!@t?ulXvz{R2E7lWvh#OP4>h!pqm_V+)1x06F|n +z43{owt~|-AM!Z;PwNI8j33s1+^{4&jKf-+$u7O&sFR{4eRr|lvJM +zrgJG@<1imkD^@G|DzMyait&Y%O*f;u`OmgqlghU$NM7yy*Y1eGlIZTd0*%8tjy~HT +zrM(oA{-xAXQ6ryyydh+5PjsT666svY`RvyaydNe7JnnBQjc*T&C*$c9$;&D>JkDb14hg4=A4N3r$_~Cpl4b9wY>JPgD*#z!fyJu2K8gEIMZ +zYtKyl{v=g@h4ebjKID%&UVLwO;6*CLc{o3+P2df`?%bnVMK3smZf;k +zKs-CIK=APJ92OUD4CU*l{g4BWt~H*c)MYjWV9WVs(XRrH;lzqYA%64jF7fdm`P8z< +z!b&6jX0y|j_3bv-W1&NR;DW08Ud^|Z0D`B}GuRUGDv)^tbV}y9@{`iKb)tAPr_qwZ +zFUo^%1}pM7iQN?4V>_L%#<<_Xowbde&p4(jL7=L6{->XqabwxYU@`c8)4S(&0PlRO +ztCTL3LN_h`bN^2IW6dGmgzwK!)`A;-v@agDPw$L2Ll#^41u5ky|^AUGHl~rUw{d2ly0rXZTMwoszSPed`Jd5*6$Z55OZBHpkgYqRW{+1L)U3_+FB)HmZ-F12J +z#K=QLWA{D8tX#=A-(#(z`{g%g{Iwo5l8xjBG}i2N;ir#Ay;@xR+e3Gwefalmnk71bbijry`CN8b0Mup7>N*;1nTqAoq1r7r%$-U8>R3zpkou#9(yumI*blytO@t=O)Wo;9)cp;1SJe5B}yRnv0 +zU15|LduYRDh+1Qn#0njI7vgpA!}|cXoDiIfLm_X(zIQ>u8)9B?VKHMgspRqXGV?0M +zA%j;L@!L4mRzQh*Nn%Q2Xt(R1RPIR=EMTA&3?CZYuU{%=5o;nsu2S3K+Zr&u(^4zI +zu3%{Y)w!WS} +zVzH8^@?mp?(nrHGH9bu-nuxVMsd3oeNJ@4!0o%Agc&)Rych25=>cHLU@%|Oaib>0; +zawLjOc(6+3-v&ZJgBOjNo+1!Q-^sVWP;0-@RN&E57zV)pnC+IaLh1I5#kHX-R)9U2!wjxo^$A +zk}xv5Md(Iv`?4520+CMf8_TwuMyTd2I6+nST-n%>6r%Qezvdrg2JFVt=T#?ilT_0-`lTtm56Q#*Hi2(MU +zoywCcC&F-gbY#5O{A_b3wI!<@wsYcvVJHArR$J{Bry|uwR=uj^L{=Tz`8ib2o1D-P +zUiUF^kmo3C%a5_9?xZ+%=m==nmTBHcaBEPNls +z=Uj(WWc3PU8aO|_ozCBHVj)nB;he_pie9GEoH&Mxw>)J%ukI4gLoVPZJx99K=H06V +z=bvFn}kS<7+Ei~jvFpTa`~A9XgKC%p6O3xz3`;@QMRG@K9xze(Wz +zy7}8amFxsfgEH|lVQ5T=4vl_@<+OFYJFtmq>o9LIE@7N>Z&*X5tVgTL7#YiDT${d# +zU>%KwPnz$7S-U0v@wT^0zisEL(P^QIII!X7=#C;#b&mD@ofy{M2^!X!5^LYtRUQ7F +zU3bJ|l36g4d4HIMxqK?e*X?^Y@CG54!g-sMZ8hGxdBWG(F#Q;a$qq1>M9`w)>V86d +zrLOMyA|{JEaD+=b{JKa?LU>H15J1xm!Hi|KgwupBCNV`< +zU{DJO4A>1I9x`Qc1s+kdgaBDwduSr&cgHK*$+1jC_c^{qMn~5o2e*|UHo^iI#V&OZ +z$&JB)2(#aXu^P(d$vRwyr4!AH2JA>Ux>7jCuYv-*PULX#Ae9z!cEem`PWy8bfm(bF +zi{3sn7RbD2sx(W3Se?OPm;s(as(s@l{&iopcE)lmCA>yjr7$QXExgK;2?BCC8#B@^<@p4cXgyS*Ah7^PdO#9m1bk2hp(ztAAWxu_Lj1d$h +zpTmILF#}(Uf;c)wEY!mIW;8{mFjX$^dQfn{x&XRjlCZCk(3gbx5?p@GTV#T=K$I#q +zVJHcM;p+%4TKO6Q1MkMs#&D@Y|L}v^Y9e(kaF6Hv<-rpA%lk7_C@64ZzG`#Vv+J0p +z{*qB!t#mm2A{*1jP9Fv=9OR~TUkr&$u2O*Ld8K*c1-)+GY4nL|@Hx&%DUj~5#@X>z +z%VTvQM+fnwX~Ahp1yZO{y>np#BLe4h1K&*+Yh>ZCg~SLwT+L%?H(HeaR`D-A#i5Nj +zPS#O5$iXlwwCxq0ip>F9$~5}zz5>Yt^KCn~1MY*dBhF_|%`bMas>S+3$reIaFh66)ck=tKtK{Ea}($~T;MOlQ0-PMD3h`q7;FG(F)c=vhAl +z5Eqb&0$#=Oo7=wWUwgBv)u#f6UB0fxn!?n5TQg3 +zN-iova!+Q_ +zYfq;q|EQ;P3_M0%t-wZY%4+LZAOqh^yfRR$EN9qt!^eesyH%>wDY+v&a^a}&?goFR +z7c%4NO@4LIbY#KwYAJFz?odIMSNSxlGw?JA2iT{gpaUgg#EK+NZTr2GW;A(q0C|K= +zqe`NaK@+&bFjIebb5#OLSMSgYJuWTkB>J!BU@s5O?xN{ur=N`K#c!SQvgj{|l$eFh +z6x54bZ0P%*!*xY2T&QBmS-)X#gtzw-%nkZQ1q8?3h~#2K6x!wtCH$1+wS}pkhZL=P +zX0%S7O+lvb5<~TC^c}g|v(3p4qpBaKXSw$IZ6TN5w3Ci7!$v%8t;@zJ>TUP*Rk{g0 +zeUg0@^Z4~s5|TutIM1@Z#aIJn>%&#*nLrjg$iTZbMj`W2^9r&h7WV7lPwz*H!k2%8 +z8E|6tY;)^k^94-kaH;Mk7ntyWBWY2*ZT3EjK +zPM6o>Qh8xGeLhpjTb8quuWBhm47gg*f$z3FV6DVygwY;M|0mrLDI_r_|OF8Aj{9&a98!3D*WmOuseI*dzYH=aq) +zg7V*6GYJ%7K`W&Ixl1yJG>0g1e%j+d*X>UI26)Oaycn;XHx6?1)14|3P|!eHB7|jN +zHXXP>F1I;29{H`>*jqXkfRHUgG%o16mufl3{UEJ44PXs=$ +z9wJ*KwP}C!x!4({-o@{vY|^OEmur8#YPQND1xND12L9uItUrYl)xMC69UUY)qx2V) +zgfp1*b)e*|XMds!;#i`?Fsd2+X4iaSMp*-L#iHg59AL1;Q5dg7<2SbN2=N3T8gnI)uWFV*`}rqeL(;*iob0~1bzg=4}N1e&0EJcs6OfIqugI; +zJm>I?+Pn*WCD7=&8IIF!S)rcj8>q+Jr;(dE6>M6UX4-SqI(Y1ZAHeSig+=NkI44Vu00 +z>ed7wGl2?)Fsbc1JKan#8yg7JHK;H~t4(}=Y*tw)=&|C+Y=C|s`Wtc8pVic#G)i%9 +zj)|IhJ#Zo3q~&Odi10-A3&hU07&%1t#nlkEQdC6*}ECA6Pvs}W~{DyeK?oW~>d +zTZn0%1r}GGk8a)nH~Hic&+=BiL?g%Ja^G?qibIVR*QT59=y^oPK<9!o-)c!m#_yrl +z@yY`KMnmM4e^^>zZ1GocB0_P_a_#lak)Z_e~#|Xtubq$+F@WGFB>C +z-*Pi?_P*OJ%pHh3AC->D!w~En5+_~zvdr3=8XF6cV_hjy9}Iz+#Wp|=EUZ|k`!3{f +z!!J@Nid0k4L1t5wmO~2_LHoQl +zI^CvSPZSa5o=N=np68$WdF|g2E@R5xGJP6^g0%R-Z!II<3(c<4EP8FCyIsrv4peFk +z1r2REPV)9Be`AG?2}I(dn&K7q=E}Qs7S4L(DhrYqZ!6&wqth&&t!T8}V6{sO(e^3ddtGc)WjqJoP74rJ)O5#{`=na*IY}k-z7t12brY!efGz +zsl13olpHlvcnk%sm+RzR4BACr?oF0(=VAN5n0L|%wHC6t%)-_95wmg!0~ddM4#A+H +zLO1Fw>PDm(G0k+Xv@QgDeU-iU^`PZe3OitchSA+nuUK +zP3Lp}S`|i^PQvX?u&>|GYy^#*-8lA@L2q_B)D~?pIrxrGOe`4?@+QejEtwntZ6u+& +zJwX-S&R7U%sX;sWWYHm$*u&+aDM%4A5T8FRyl)m{J$r@+<6IfMA1(z%yb^)YbrP(X +zJWBXDt;hO`hufcc6(R^&=e?0bTv+(pxT0i<=B}Z=Vp)%Oloq)7$fH9MNAw8k_x>9nvw~j;oiLxVXT@ +zAMyNJ$NGy!eK?%;v4DtqhRWZlqJ15dK-^zinpnk +zHk?9iTL@6sJ!bdw@U-`eI-1B +z|KHWOKm0iWOS>?kAxLT`G +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 +zwAQe`ai7~pC3z*DS_+-ZtcrvU +zGmmLIZD?zHOV$Ka1R%i&!JRs7S92xEhi8p8!yT=T+bl|ET7^jUI&+X^Jd>=YM#qr* +z2iAVq^mYs!;^nymZ)J?XfujCwg=s;b!*Sn8Gc&wtW&#XQI;L3W+^66wH&DC{jKGVC +z;UOla8!}zb6>N6xo_!UOSgcW!FJb8kxDY4^q>tzZ$)|9RpRFIfMaG>&8F!Nw;HIGD +zkc-TPVW6FzMp^fp>q9u*b0P)#8)nxa-lTS3<_o#I0tR|Xmg`K~ZM#HH3;%S-B;X1U4u&}WF9WyOsnti;W +zU$CwOt`XXx9$BI5cNIO9)^i*j9uszf_2Z!{e@jJDd>Ewg{k31^T5 +zD!~YiuWzSKYfEd9cSuw)q@S4`ISA;5i$jDZ5@SSDPZN0R4|~eboPL~^)8jDSQ~z&R +z$U!;eDpTc`|Ep4_Rg}M>G%(gUpdVA35uE<^Cipo`3I+L#3{5Z|4L%0;-_qd!p>%&(drn=$e-#p_ +zGzI*|pqQbH386uE2|4Njm(JH8k9Gb8z|03~JYe#0)>YxX7nU1iA2ubbphRB>QXtT) +zO#{vZ^?!FE|0lF}@)0>OL^yj;vs`eTZDnf<8JAflbS%&Fm)FY)uOlQ_4&u-6E6Fg> +zM=a)Yff@cI;onn$e`OA=fN(x3Ykc_Wy&Hd7`u|va3!u2R^k4fVAqf)P3GUKBaCe6Q +z!68_13+^5W?gaPXZjC#^-Ccvb)41GC&YAmt|9hq;Gjnf>s#JAD_ugx-^{&^R-|F_h +zeT(|Zs3@7ELMX%_Vo2A%6809 +zYKAN6`2XRc|C%=2PXH(YTw)<2A_fHnjKr<|halZwQ>v8|fY&;S;PiAesHmyu^c56e +z{8zU%f;s}FCIAH3It7Yoc<=(T_((&)Co=wyY_x*B{=|TYp}_;*LOj0@to}a4Wn=&# +zIVaPEE<~)q(lU)dKlOtJdL%5ej{n(zG9UiDI70j<2vVWsX@#F3O&&WXe!p@ieOCc# +z-?E;IXZnwy9lP*%*J%r|2X(NJa=v@Y8{>omjC8+xO0I!izU<7sf1R8_AlD9qy04Z{~3aRgM9e&mtjbsU|AtSy$n5F +zO3^$2e0y8S9qHG!Zmk0D%!XF>{MGMleuNtge?*L18lGtCIZPSW-f4`Pgy(mx^!X=)51j#G +zQ<#EMO9zaNA~To1NW*pPHvX?~;FtZw8^i;j{9EUTdlU?GeglotUZK`yV_TWL{~ +zS`#WT*J-8Vs8eTZy6(RbJuAYrMI2O;%l@yQ`g +zev(G5?X50on$J&vlq48DlyVuTXJ4fyTuiTWnFMOZc_WXi&+`U0?Bx7BixL|A=3RCp +zs1cg#D52g~RF!^no3kIr8)WMy2lqQW0-&K^2x&I>^ae&CPy>ewiN#wt$Qj*P!mXNn +zt(y1bWDa2=BB=W1LKtj5g#E~Fy)|@NKI^ypshvILS_5*9v8YgLn^zeazne_}@(9e) +zKF_ZB^gWpP#aw3fVF-zExJ2NWhAFRx8~fC@n8?)-Sevv%yGib2<15?)N|5voY%}vS3*q86hA7Sug^T;#uVt-EB +zjXA2ZDOgTgn_yK>HwPF|(#>RR`YjmJ7zhdqieSy-Z8$!!oA{3(KWqenW}u8BwF>#v +zMrSI$u8<+wv6r+d8&CqVa6dEQezz%mp$YuqU4(Xm#Skb=4ovH@&rQPkycTgi{}^_s +z)p2^V*psOLe=xBH0#Eqt!*e&=7(JV7NXxvh%i!()zOEWQlm(!Ba!ogo6q8-WB;c~y +zS)7<9?VbmeSgSde0)FiZjQ5`{yi)c!h%0ve2RE3xA7 +z+odQG11v=eNbe^NiG(k+?vfRdZ>Jgz)jp_yj&?N@0wQ8AP*;$W<_DnXsvf&!PgP?F +zhod=z`HtPW?r9ZM*s*LWiZdlBZdNVRvC4!17o*-9Q$S}DxJ!7?Us20YZ+XBfsz#^E +z;r5K?Vp`_q^z@d0y-g?Vc!???=w|ECYdTq9)sJ7&Y&mbM(gMwQ-x&P-@YRQ@&uTl1 +zF81b@6s7c<_3!-=AIXP-#FPX&jqrW050l1Icpy!S^s33^S6N)qdT +zJ%v@A=`>IL%nBpg+v~|fmFzZOxY=Sl4KL$%KWQ60*V!;qFCJ=g1wyzCQG!d{+{`3W +zhIbTlE6J4#l(QZ8*hWfFZ88AA!CRz9P*xVu5*W*WSVa|odT!ExJvZ$}D;*F6245pA +zI!(|cb*Ihliof&CITfeFd0z8d=b?-u2RzP>K1X}MLT#TF64CMd+gPk*1@iD*AUx^D +zIZdw9Hq#zZ1MBC=k@$BOv||hTg?(>rCA`iw0`g;i_9%%QPRH+1%(Nb?x5sb$eH`Le +z=Nnv_I$nmf5VDys@aM{;h7>05faA2CeQ{V#- +zS8a$zM5j}Xa5!2N0|kN9GT57_Jg}^96aokyAGV;%D^!_?JcNI1ivI92l74#PUSIt_ +z7#piLj-Os!WH_XG5MN5K7Jtro9$fwk5nCXffN#n)j#}wky~7SLIc~GM$)hG5DA0MCDe76G%5;OL; +zK^G5;!A7O!#&xmLIcjq#HGA0R+8IFKJI1crZBeBoUiyQKj*(}nj}+-~JtEqXx?*OY +zZHpmq9>=P_yIGg)Olj7>uPfAsdRXiCoMCsT_Q=D!Upbs!4!`pE2ZR~IGAm7rMHq|T +z94#9CQ7#XlP~6PMpZJs(v&Epnxa~W@T01)QLL?X)Ba;H89cCUSz2^0SQr}XZywZc2 +zZ{zi8pM}L@y$D;$GSZ=$f580P?B_4x#wg6^8c5g**j;$oQb;O<^Sl~ +zQZ*>O+YEght*t7+nYa(xGUkKHANHnp=my8JSCcmAcgD=X2VjO2QwD2-uZS9G>TX2X +z?~kybsxdaTF*Hiw!}%V1Ot%5=h3@0c#Oc?~F?@xz%i$B$O5;)a1f|R_b&Cp=_ZHqo +zma+7Jr5W0m>vYvBurs;2ief#PVp8}qx!1X!dingh@rw5~8XB6uB50Y+BX^(7;c~vr +z0xyN#dZ7%q@O<8JUl?epVg)&his|wKR%PBv4 +zG#OwC74{)$x$$@+r*PVTyyzB1KRMW8pJ~e9MbbyEn;+a$J6bF7{k0$SOqPz00`;+@ +z_bts$KKY^#s*^-LLB6CC`nABak?zpEFL1R+s|U8bLa7@3!EN`|x2*~SPr3wDf*7Kt +zHa%@RLa!7cY|AL+*zSQxmaJqi1!Cp$1m{nZoW((XiA-kXJWiiruDji9C9RFP@a+$F +zF}?7LT`qPhQi^TXdt}=EZt~T8N#?aI0K6&AdUrxMB~Z0fG&XtJt>W9m)i_F@_0KQO +zf>ajP0^r?&mzcfM5%xz*Jc%6ci6OM+hBtR~_K#qSjh@K%_YkMOT9>AorQ_y!g5dJ! +zFJ71juiIz$#fX4*$^8tf6AD#|v!WcoGvwhUki*hNO>8N1*?dVf>drq|d!N(DZk5E3W;EE6t|y6AUVs +z^GnS(-3}YC?KTJ0kQpdxr4!kw-lN7%dlB~Edlwlsg%@Ik{@UCWTSUdw1u&+cI{rd& +zbzr3PEMEx3rizYnICgTrOAKweQMycIG|7l55#4x;_mm0M?UanB2bw;5$R+-S>4Wjm +z@BKQo#zil|ak(&HVah@*2X%?h0o3wdWD{U8DrZJ^+p*UxsADnn-J2BuY+;sMa+)pUDGVh`q~?C=3-aYsH!sPf{tDhl_ErC%sW!X5$81MQILq +z?;Q_c^_2O8cKcFkxnex8e?jdZdF&Z=+Vo*j1#4mnD!(t(*^W9cTarHpKM)^9I$5ky +z0dV~jP`MRFp#J2F@;0?7F80M&(5MurzipeP1<-Oo7rpGGz0xM?Vyvp5)%7IH=4`mt +zRCMY_;_h0Vc5+<`hE#2!aYnk-esU}9V1B#RLkf!{#^^}(evmC6AoTaqxss2M9eVmXA0CVnCXgC~#ayx+eB8}n=BBAd2Z3@jP7AiG{FnEjmPZ5o%@uTYv%=HZ= +zMWG+A9|}8oSL)6%eR}zkoSmF{+1L0Pj%WUav<@ +zDGtm_r9Pf?r&a28%hXd`q-17f=;J5R9WUttx;6RYk;IJQd>*$4(B;qk{QYz7+{R#2 +zldYf<^T!Qg&O(fD01Qx_{UfOG2^e0XSgy9O4NutwG2Jg>Vsm+fB$Tcn|yL48IYj@s(iI|YjA +z@$RY_o$(vP_p@(l-e$X9E*jqK9eGk}?7y{L-RjZJNMu>cd1AHBaPOUBZ);793@@n$ +zrxfmS@PHwj1>}>Ghf;Yc3a@XbqK~|rrQN(itTt**F7TRYH_sqL`hD?Ur$I<*gGnsb +zJ*@`odF3{IY27U5yTbSH)*l|5-EXPb*@c@eH7EcTAVs2p6v=S>BDSws?@Fusa9AqEn0G&3T%#lmHDM`pTZI@UpPeO$0tp(V^^DDL;=e +zG2BmWjpwo=opJ}Ts{wnPkv(|=knr2b=|alR +zqL`4~X-u35Q&EweGazjzuIlv0bF^YSl8K7fE4s-hX83Zw^K@>{@=0J~BO}lZw_vdX +zMSqsp7{Y&`mX&~PFqpv8Pi>b@gI~tu2dqq>cUbHR%UlAxUX~~}#@9I9YBk;V)3Xw! +z;Y71YVa$;}j9BBa*iafEPbZ(#so#;Ls|+79dIJ4yg85f*+-x_WeoV&k)FTJyD&ByN +zv}c!ZkJymP6C6$WlCQ)DCa6&NVZjauOHxT}mXV8Ai}oE2S%phMVaTSzSr>&3TxOa-2}zfEqZ%03^KkAR#FEmj)z +zhoiW)`yEBf4%TdN9QhBVGRe;KmAf+nJ%3R|^Q!CVA=IDujv={e9)hKf8d}gFQV$Dp +zCf7V>m@|O>SO82}V$r))~wM|-g`-9}mh*$9YVgL@B`KOK)h@9*%4=iU=fdU|3g6>B?l=~;E?UNx!&4wLs +zy%N!rzJjlqFE* +zFS^8HbovrALI;>^17tcopwTv)D0tMpwncQ6r$}y%Hgi?g`2tGK4Ur5dcv4)yY^l}q +zgJ-_VijCMF4Q)sN>Y@e3lJz_@prTN3zt^HlryI75=m1CCekoh|ruy=y8A9+boADR7 +z>5x8%bBXHfn}>-yV6EMsjs8gr2nJBMLuTikXTckJ02?q@H40P1=YA6{7s-sVdVxDh +zmoD+Y3ohpssQUT6`n`!Ui7aL^OP%|&$7*n3AP4lxz+kFG==FgYJ53)L-MQTNBcSbv +zjuD5yctTwEc48pGcAXuvn)TESQn^#1&+GZjs3$_Mpr0etn +z-xfpu`euSqS^n{A%^{&%yB2gosaX$b$k<0+!TD}{Ima-=sN$Oe^XVZD3YuP=)w{EuwY}tL$Ko=ew +z-vBe?x@!PQU20Hwy` +zBQD2I^eqmF3*jx}hoND>YkXe#;x+9f^$!gGm&luCt~JB@7tQytO@JP4DoJSgP?VO2 +zVs-cL=n%Yj@rSUETo0JUqoZ-` +zLlS*wjpDIK^C-E~mAq8ZDM8SO1lSmEg?-W*z#a@b%0CPd#lr3c767-NB5Mut2pv4) +z9~CYOe}cFul%fqA2$C#*TF5j;c8#F2#*8t#<6aKL(daDFQ-yG95U7&4o +z@4HpLZp9l1KbIZPM^rkw{Gt$wb!l_n5Mdb&5qhl^9`z*(nJ9Aj`e^B77sK&S +zMhO#gy|~M$iw?y^P8|ytmkrA?stPacGI`3FJ$dMI^gX&11$>X( +zrUp_8gW;ubf_a3ihEv%r@#`EI^#>?#xvW>Sro_^gc;1VoF{0=%q6z*uA+E=u(6WUr +zyNiix)e~hfl=FV+?hfqq0-@Md^48dkMr?#U@GtteC|uoBs^>5RI-^;df~8hU+ZgOI +z$j)h=Q*x=@kd+|&PZKRqDHP1$^38!n6RhSksTz99$EbI{)dv$0>2!s7v+oK$4DqAKbUFip(qf9T0aKTqA$3pVG +z4!9T1R%cpMOYf0+%M7C!O)9fO2(XYNdU|5I9J5}^Zbc!kWZ4!&X +z1|PfgtfQ$Ef24VMM-aKCCyI#a89yFKufr$(fkhRXO?4m(Mg2Gw!!zQD4@P=ATgr%9 +zvmgtk>!H#s#vF*_Xs-d&owv_VD?4?y?A{-ncTo0E<^|}Nb=Qe_lKYQ +z%u*L(j;03b?=!kbeErl|b(ekBOF^h9q@%ttC3#{gBDC()3kjzyQR1-F*B~llrw%XUt?ZqJdIAHl+h)fXgXcO +zZXFv{;a%h>SgYEf>$jMG=CaPx-y1^MuN^>fNx)9JP&72of~*^jN;6dFf7+%N{Mgy` +z6tg^jPfuhouf8h(m}5tE?TK(D2G{aB`6D#kD9}I_yCoUX84JE!vRU< +z$Yt4#M!It;&fy8fq}y@sudgPk6C(zY2;6VszY)i{U7w;HsoB`X5K1|a^G@hLho +zMD|En4(O~SbP&PTSS*rT&I5rtan}4^CD1&_>2c>XpvQ!G|3EKB1GrTxz27=NVl!qr +z2DOZ;Qpl!~i_qL9s|sgbj5ra3`fgmB4G6#@XE}<}@jmQPshzwfIJy5Lz>+(9mexWc +z=rna&+?y+Z+%flu%w(Zb_U2$xkL|td@oMl!o^1R +znHeAw^i;W)-BcKk`aO{+-9n@v3z5%B5#W0yn(oM?V!vBx(yk_o1joS=4Z&caIRf2E +zVEo`hRe>Q-)oZEMzesiP`^OCsQ>xpx((Zn9`;bC1AOSefx2{owsgF*r`T?%0huW%o +zpc4IA!NZfPY1PBF&|w=j9=B7#RLMN$8Nk?w@wosVUwD|35Ct8eWhAOSoMbiwKHJjt +zQCB5u2m9#Pn>D>p;}q#QfiL4?zQ{ai1J)tz17nbP^q&1Zz(3h`nAlLHLnRS3dUhM9XfAPG5n{BgJ?w9SqSVt`3v$VO<(7_bCpDm|%$3izs62fTe)0mVBj_d!bk-|FRfQ=C}1D +zetu-9SZ|QSfzAt987(c5{M;-54I%%~Xc-j_8~t1zAzEEp7G+*PKR=UEucaa_C1Gzc +zv<%QV{BUziaI;t1LM631Fp(ue;;w=Q(x?H@elmEP(|{%rpN{Ges(e^*EUh-th27&f +zSBb{0{#*WPi8}R-UXo3cwzkDu0GoZEOkAksyvBk|T;@9^e6X_HX*_hy28gZ<3d{_K +z2=yCa4D)BBQpn1M1dw;pY2#{*CY*yVtS8wApGtbUH!PeuFyI*z)1DDzn*%WNNDs0Q +zsWyE-Q|RV;UqM)?lPRiLo!prtH>q&2 +zzbHFtJ1w`U4Y9Pu4GRE&#sk+{y51Mua=O}0!&M7V)?Xe}P}a|m2DSH;ACP)7Y)^K0 +zKH4T@&})(VFSlr0Qhy+9A<_+MjN?-PIx8$s%Oj +ztTB=>{>3G2CQ@nVe6TYzQNHBWfhikTh_7;QAbWxDLYjeU@8i$1zPT8aH9ts)nN-@0 +zTo~TWLL^}4!yc}IL~ZSl!w5CxYuI- +zh20yGrn%0gpmYc42V^L^h{3K$yf=oO)CqjX +z`~=iMt{#AepVWYFAiEu={%?NgF+D^2^b~SrBdX*GVo;aAJi4Am-Gzcuy~v6V2;S0> +zjp#I>)~stwhnF1%x`6f9F&%2+Pj^Fy#~0jtwJ5TETK0Xpb6&{X|>_An6CTDi+ZN@6vvM_xk9dreK_gn3d7f%S!h(wL`|oGAo$;nKGtS_JbZ+Rsu=%LHbT8 +zDBB_l%U$uj|s`R-2maL%dIC`uK&D{$@I<>9<+1wYGt_^iv}M|!u%D-H0?#h$EM>K!sr1SL!1HYtBs +zh1cL%t~*iU{yM>3`|eW`HI&+g{NaML57$)OMNrC+<1haL$FhY=H>}0bu`ydRcBD^( +zsAqMiUC3X3soYL5Iqy;B#jYqaa`?`Vc7EsCENdZ`(g&_Y!hVH2f*9X3+M~LHaFX97 +zM1gea_LK846-m-EUPCk8voe9{id*I8&fE>U$2v&a6H&B=0XN@1yq;@$Bm@o}nA;0F +zcPCR4!0^w|`w^Ou#a2Gz@3p=y(wN%_B=Y7c;;ncbgjPw8sA#$wnJzyJgg~h+q+Wuz +z=v9lb&9`sY?^pX`XmCWO#-@XhxXUlCC!KyZG(1_qIaGaX%_i}1&E&pdcgOh%-y-Cn +z_ii#57iV=Li|etVa^VlF?%g$=OU4?#fLlGit)fjI(I(bJC=2Nn%qh|2%RCpfYz5|E +z80^ywJf2Z`!nN_Pg-|UDIF2LnS~)8pqk~}Cim$!_yZa~)&{OcBRaB@}r|TOsmo==i +z_4#6AH*;!t?6~JZHjURnwW~f#xmZ1_#*v}jMvM{YbI5~M>(MrrTjewQhN3)+NGf3gP2&^KI_+JG6-CMz;eJpAfvzGK4!vIc2iQ_tK +zb~Z|QXXco+PiMp39xla*-Om>#!Fsmt4jk1)5lm05m?sV@v%*y5b%fOQZxuR;of)|a +z;uSmX*gF&VeXO#136PwFJvj|#OvLV$tHW>t@a#o@gkv)SlIAC!%Ye>W!xRmsubZBJ +zzoI8hjprEr+=$oM!q2YEsPoGe3(UfLB6;3!3|_trCE$}dG}^Fz^l*Q3G6OKQ#tXsjY0&m2g6WL#v}Gpz +z%7B5y$i3{yH8(b>pSzrnr9JO9O&Z=nA(N8x@=jm=q7k!VlFWAthZsNp;`stAnWxut +zMX;htU0O_k3*DXXjC(r1(?Fhf%d<}R72c!EjsBf9JkLFe{i!`RV{t0phZ(vd%(u!M +zYUuj+s`=b8clEVm(wDx3!S@NnZY!b_QIf%ERKhI2^!5fsQjU7t5*}I4e%G<#bP3%k +zBQQ0hL$c$2#h)V7{>mN@L=N#If@W=t*rU20rCzXL0cjm@anZI +z&Yg<+^761Nq6blxCdNGx$YXFJD45puWl(AqGRdSEy;gbZHL=E9xs8&v>QzzwC}hnU +zW7(2D_7CIDLYOWW``89O5ve$A1(qHD)vJ>0S(~l^uRw9Rm2QxW)dnXw%UI39=Wy0T +zjE50#)m)(D8GU#-Ln8N4$Lf0mQg`0>P4~fL$4O-+eEOq>Iw|!U^CzLfF_9HPIm|Bi +z$SqqycV3LAZU>^m5nhP1wZomAyQ5fF5}OVKK3r;&YI3=Z)8#x|2DGHV18QA;y0GiR +z6mODdG+YYK5~-CWO(($#g{H=5o3xcqy^M9G7K?HBa|XJ|J2Da3V|=a{;*WP{hzE;~ +z{2E)BSq*Yk;k1pA?IjWOKHzI&c-vBZLG~$>JYSXWy-abn*=`YWvj7}ODlWLjHJ;DBLmj& +zG{V?^AnBL)w~0rRNK9KQ!@iLs+^}c~+Tv6TiQ*c@Jhu--8GEl`eDL8~D~_=LMA&te +zjt(R@b*v+F@V?-B6{1>?`wT3pp(FRcPz9!Hk;E7 +zAI}^b*R37_Xf +z^3(AL!6u^xRc@cos^2?a-_L5-$~dU^9KtQW1peE^Q2HbQur{hq&S&J=;*s94=yZY$ +z%j_D>ZVBYjXFi9|!x;d{e%qS)LZ`yyB@BV76_Re_fGeUlA|Pviu9M-De%eRx6ZSb< +z3OM=U{`)g`!NIR7zpYyyv3gCD_1M^vbfr2w;VYfGKZCYCP9ovwWQdNr-^b0$}#E +zp?kuC$)ypHlnujrocoa5U++mXPR&wJ0#Lc{Xz*2A_D35MtwE}mM-Mvy4#b0O&#D~i +zNr}{BV$s}b!hnIik=P{x_xFxAoH*X2o|xS>g6go$Mn>#Vmbz2wEo-H5?v&hf<`nAb +zNk(SC3Tan3@Dyv9FoC{-)Z~TM^M)54cNao|^c(S_D8lxU%fq`*b8i?tJwLGO@INle +zOb6-BYrudl7HS1lO0+Un+af|TH}W#O!^Wej#@`6w*Q}kaiRFw{e2A!mDx$jDuNW8; +zjL~a|h7->AEz98hWIdBVo=cU16{Sj9@ESmNUoh>TMt`N4>TnxHJZH_b_lzm*BjB|Q +zKvHZ*`=0NlB2{hG$%%jQzI!ET1i8%6AHK^8#R;@Mw`hpe6LnrPhUH!4|CvY%n%mnq +zaYz#SYHYw*UDs`gqSAr#|LFYlq~m(xpPeAr2sX>!p?q_w5!)7|^%k2sqoY&Kug +zq;n!x+KsvQ(1>J*8dXqSq-)4hfe)lMgn_n|k<5T%DW$@XYF#@X-q)hsR$mUti;PAV +zaXikXscvoxb!}>LfuarHOiA&eJszT)X8i^8UH4SUebhPTz)Oe2F->ay>mTAgZaW9@ +zbnnRy(aBLcj$gdEO;*AHpZk;Xgws!j#Yw>$)|+BntT6sbcp6P4Y*Fu{Xm$H)fNJ~ +z(UR-^(mYmp1 +zRTB8>FQJEagPUp5v)V0*?lT!nuZU5%KU#sf*yJi(GF@yY8WAI-+G9$1<_qbL=`q=x +zIsoz`mW*a~HU@dBqr?uK3oV}7s?ED3;oWj0)q350%$5&=3A|FVvL?&TFUJ08kN9za +z&{x*BtfU@8xk;%A +zV{CP}aD9H{$=Xf?2(jjnNyVY6C!aC%zzs#$4#eaLI5y+~-kU?k&DZv}#CfnmOMm;} +zNHhEiB+LJ+AX?ulBf@^?_U(}%+lSR)kMGl^Q};?G)XOPLq6e27r~aqtS>OAU7~uht +zagZB62q5}Pl_MrAT-jDki;>W2l?S4I)23;AbhpDS;G&>M#Zz1$fiX7eFJ(Cc`4-V_ +z=I@+|j=#3G3eb0&9=@Wn@Rtuh<$NvHSs|}<#>*!?reJc^7~hM9K_{-jGI}V)Wv-;wf|0njxf# +z*#oqi&5TA>Y)kCX(Qmti&Ti6#3eyomBK5|M+ +zaQLnF_To^cx1$|sT@1pH{jEXPK|YQn4CW&)RXf}8zx~`9z;jjhItAbWu?B-M>FEFp +zd2q(?(g8HJQpcalSESWcz`WbKN{yjDfSEz;@Yp?7>698Ff{hCpH}+IOoq)}Bf^wo< +zNWJ|dDqMpT@3$=hj*c)qsapI!s_EerF0pp8kjTAq-OemPfk+-_g(pDsQ92cc-)JZ~ +z=JrZu8agUS5q=ZAVAb_7+Zmec2VOm}8?eYqvl9xn*r^9BKPA2?D$!kR>- +zEfESs9(;n0P^5-MuMwN-xnfaeU%1)Pjq~wXgwIN;xutJ%&t_t0`_`@Mkfte&sHfiX +zQ9!&y99hH&x_Y9k3`+j+qQaE{gE0aAu#ZVSjBRH&diMOw9}UEAWPPS%MRjC!4xumx +z?aP?nbd@*TnWU#WZA!MPCPSM<9C-pVvfYTt_cw^q&ymoFpVPA#=exo0P9sl+Gv<-v +zH-IK+_45bn`#8<#;&_9^La?L(22`bYeeeqbn&QtSp|eft^>)N=fr#v$cy)_wTc+ac +zHN={PE1h>|x%(K5usleHBBg;z^T6>8A#cHjAqIW1ncUhlo>V`nQ);Z0OAFbgBdQD+ +zU!7Q$iLd_jU;C`an;G9$$`-u(fL0=G6!2OefxrzZd@krMr}i4KS>;H3K8OT+Xc7|? +z=?0$biNZ(i{L&!#?O9i?FP=Z3=sSO4+2~710a}T5FUvW%Y|oK8&b)EY>)HTUn)u>f +zhBuc$EH7W5i5gmmZCU|n$x!GO?u=_V7%N--$ErJbOVw=vH+U6Pv*CD%J{XAM^LbrQs?($>zaPcFKtz9}TJ(mGGlZFg}viG?4g +z_*#cuIhZ)LgFIEt4QPNK)^Nu76OItvgsqgX2df?haxp-6)Zv658&BJ~v!v{}uR~)h +zG?=|*&3XK#TH~W<;q-{mX_RaO>WNB8mYgoSs&ZqDb_Mi0*iN~=z)Kl!OCMwS~vttpgN(3 +zqbxEBf3abPRq%Q**yCq`6X0h|cj9Eitaa_m@oHbjXmum$^EjQ0Q%Vuf*mE)!BS;aV +zPkAueTYuD!GphE8@tEvGZxbA2t)hyvUhB*p%WffZ5W@Nxe|e@s!RDLHYuW6kc$37K +zZUAvfYoYhiX&1$Tec$bm*mP3gb}qCsR3x=^abr<8gov__a{Tj$P}g9D<1v5iJAvn> +zV_E4d!D-oOja=C{WpbUzfwycH +z4)roKrpkb_0Hu(hov0kppF{b+w5;!OS_E$AqF6oWY!@4a>?XpaNIt>on%aAEZ&w;s +z9}m-z{q-AgU_M&S{w!EN*f4b6kRaWVkG9$LgIB4@JyB8(m%Xvx)ukVyRAk$4u^&Rv +z^HTYUPUV8tjxZq@UnNq9n#*1alLb~w;Mj_>uZZfgV=o#MXp~OPfFsEQ@DHX0G2oa) +zLvesgvv#@E@M@5y?_`b-463*n>d`t!oE(XHYM@1+Gn2!a!&%P#9X8y%xhiv7&F|K! +z_4X+*)t2291SPZzwvZ5=ONl`-5h-E3?x!%&!{Hw +zDeS|YtuU!-<|#}aQgBJ6t0dX7b>E+{c9vOG>yf{hUPIxwM*!Pe#Y+_T#{c0UJ>!A6zx=1c`_B=VV)4=nte5&Np +zmP<0I+^duggRXve&G7uS2BItSe3e;vl$KX_P^Af9x*zgE}6D9Pc$kPJkRHP6N7%m!KF+=w&l_xy0ZgdQ +z!DSf^NkVBq6Kr+a>JTZ8dVgOkNp7VbB$YiuR(l~C(4!FcM1Y#Oe72MDbRN0XT;Q){gEtMpA%=c-WkNYYveFE-dkXhgdTC>zM)@b!gF +zs-Ez-xDNBKrLUZ6aO4GAP3E^{EXO{b<`7EHtjMiCSfE+)$~}=IGswGN@GF$^zxG*y +zciV`6nh7YYLJ}5-G32@-wrD@(=WstpxvsSpX5McG?ex10z11+7`Mq-xCU%_qe&_K)tSbTFI?Pq +zb$qE&>)`30!s$051X#dUELoIm~Ng(28E4 +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 +z7fH*K(7`0oVgvRns}cBH(&cx}IqR6R +zF5<^JD0+fpnBHDV({yr|IjoU`W!Qx~_wnVBU9DSA&lq;2HvSWPbLzEPZP!fU7o1Zx +zw4LI7cN1Tzr%czXB`m>Kf@#OQB(LTx6KvS=x-BcjMoXC}dY#;#=V=y~Zm)7A8Pt&W +zev?0JBio+w(zJ6r!cU0R90*Bi@mhs0RBL`?>Ea35D8B(0rBOg~(c!i}B)-AUTlUFr +z25~OLLde5QEl+DvEV!T$_N$O*E|=4o%Y7*>BdYK$SCbS0Yq-?Gfvd=<0e`T+ +zpEs7o@|o!}U#o8D6j&g_AoQ(`*Z<)+wHA_>eeNXx2Zu!#W`{l(?;7NP@JjA7 +zK|tpESou~E)VCTz=mFS1YFViC_1*bQ7sl{@`@G|wO6vjq&3dsoE<$FenU#ROQviIchmdw|`MW??#h0_UN +zAx<9#qG1F49l*2*Mi@M}5qHl^0kL1r<$|w&ED%VV4zG4rP~>SIFoNZoVhxN!_o!&k +zJ7nX(blsm$7n+~b9M^ +zYJJ_!Boo8*O^1A`2^2E!)-hcEv8bM}t)Aq>TErk-mrbjZjiHpk-20wIE7zB>-^_>d +zZ(eB|t=BPek4uyc5?tXf%MOW;3Q?P$BxxdJNyBJka9oMpB`@l_!?zBYJkL_YuI85N +zgPfg;xZZ>3*I@~F?sixmbEvb2ec45vQR=)ck!UjauKn%7D#uSid` +z_9mXUw7ETOvBmc60~j%LJd<67(mt%q;nuBgwBX>6AXEyB$)X3mY?+h=3K4Z={TMoJ +z|FHeXxQnAZDZBqg*IPzKxv*iQd#i|)ASsAa(gR302ojPbox@0XcPj$Y&CnnnLk^uI +zAT@M12sm_i^F4dN?^)}7=UwL)zgP?AnRPw)ece}#F#)5F*fo!=U(%i-%}^hmcgDHt +zK +z{Pv?87~!8{3Hfl0DXHWd)KRI;&ni&AnbJQpdAy!!jRasgX_fw?q~HlDkx`)wOXGOl +z@Z?IX@aDwPoy)_Jl6=a!+BJ`!Sk}@0)F0tdvZxTJ@v)zM$oa{NdI*_~?R;f=_xTR> +zxErNFECPKs)>|0f5|+dUcGbJ!Ki7e9&O@mdn%PQS_wsr>K_O75gDZD#h=_A~ +zT)}PNF)2GyiM8_n@@?GZH5!Llr6DCGiwVmVl{#(uAlzb)DeC6{J?vL}K`TSdZooIX +zWsJ$>xqX^IZ!RH!I@)80p9b+c#98T!s6 +zET##l>_zagi8qX^L1)$a7--HwO^mFQ!e}ZSRwEteAxtbeGLzP@BaPa@cxN~?O~laF +zO<%<|sP>QbMnHpIP8*q$wg}U2F2U$&b1-GxbeI^agHc_&gT;lL5cBnAMw*rs66>AIti?RV2{bw9rB6d4LR8J;2-f0oqZQx#fy%Fh)badNFZia8*n>hkqd_t}+;usiWxx|)Sy^ag9kq|>t +z{(%KW+PJ)B?T}q=lrEr6qSYiIhcoiR? +z!>>KV6$^f>casC!e|mdMsrylluBGDxbvigY3(%B@M4Un&IT1Q-1Q*|KT~6jqo1Ax2TOJy`rmCDWFB`P(g%a15Un)0+yMa9pUl!@xc(1OH +z#B-hTh(sOQgZ#=HY4*K2yAHw>i4nFJRUZ>kZ0SU^Ky +zDP#laPuou<_x?hYduLbDnfpim$BesO&&kNkBHso4R81CYe|$!z*!18*eYl%v3lFOlmvhz% +zq9WwMag{zVx~o+N|2FOVH1u0Xq=Y&u`3%Q5NuS>t&&hxBuHGS+5k}dKzxxqLCd&(e +zCKYgCC&Cz&=SC$KQrIAlf{)%Ed|>R6(K!3#F8jWNNt%@F +zjBKu>la*NChu-DAStJt+3NH@%*e(1*gwjJF6h#1JB@Bd!4U +zK7Ui-@Af9o`+^FPXpNn*)>-1RRJ9 +zAKYH&5HSwNURKF%iOES|9HW0UI2z4qI0HLO6ZI2Wm0YQ8+90Rdy|qa1i#KD-5Bu>) +zS*FSgppVB4mC3scL2x(e%AissC_?#d0Hmd@{Xk;Mc0r=2>u90PH#$c)S|;?#aKKgd +zcn|aLM*gXfP0-H7R=5l?6&+4FW#`!|_aftZ6)vF<*9jBZu58V32j_8fzDH+%s=3G+ +z3mk<+_<|;k+F`jN)+_eb7H7Ki-aa?LMM5*+O;^ +z7vKn*0eYH&yq~DhL}hVqbt*`E+OIQ}d1Fn~i4SrW!0U0ZPuJN(C&6wHzzG9+4OTlfe!Nl$h +zgxu!bzk_yO+PHqL>nZZ>?j)jVWqXuU30Q&+!Vx9JuA(8rQ~7C&(?LWwoMB2Q;{G(- +zs#m(FFJ(N#XG;Gr5-@l}8V~Jk;!WgmJ@YWASVZ9X-tB>-MhohbIFf%9gjxJ!T@No=&#yyw}%wUkYJ;H@#ZfIX!HFNc9w2|x0HKmUvM@g +z4YgCL8O}a78DrpIvpE_x-zMFGx6bHQqfa$npW;B%G{l@qr|)}J);2Q;Ec|z^j%DMG +zwiDSLBE; +zG}`hLQE|H8pWTPPzPCLs^0+^ZkX1M~0W8X$J={fVueZv(Il-~2=sfNCu1=QCouf7!w1&EjaD|qB(hDm~CNW#wQi-RJI^|rH>J@EAM|_ +zB}rlox}rD`un_7Bf5?7eZi=2xq1&pTHEd>qe`@ATtQZ|D$0nV@+n)H6`Rr@H@nJ1m +zruqWcE;`Y>dD1(0?Z_K3xZz&z;M{DsC7IM`&37P0kE}4QAKn%HaHdtg22Z@VaswfR +z-&GmP#F(NNgr>~h^dj4%NEKf9uXwK}tYqY481(q=m+O%tl-|sZZt0r4Z&$5$#}Ctr +zWb)gH|0@5;x*k%ZWyXL{RQaXI +zzq!dyZQ5!yMc&8!p&7M(IZT^+Z)+_a3BAQ_0+^%O;L6gz2HT>#&c#Nww`V&3YJW7Z +zeuiGPajaL=Z}SO`Fyg|pore)!iC=cZ-ch>LL5Eh~CpZ3f?;+Oo*EsV+n9zW~QQ1(5 +zG~TckbmOvvA8c*W6zaz4=(AK|ofPc7r6E_==`2&$>4f1%I2p%pi{^J5(Z1~d_A~TO +z)$KX3r7|0&^kS7m{A36pofMaMmWt*Hmq{PX^$dqhMhn7s?SQAi-utMTpJmXXb=WRz +z*80;yg&T&TO~du;;y4dfJ4!omTl<~uGqxMgCW6BJ?66wh(aQb7Np|B|SBo!;m@nZ; +z19>{enB+H;^4dsDjiySNJWxY4{R~C-%Nj)RdZzt60$Sy!cGdE5cn>MLuzjPGaDVf2 +zyY+4)b8n(v$yR4+=4z){X;4*p_}phu-F8H$z>%@nNJ3{?W?4ak_QCAsJ4a4>#pB~O +z#cJbxBU7|Uaf|l&do=Ey2 +zDG(t432zKOw@3eZVLQG5fyZ&X;#5RH8?0;@)UbVtMN>ogb@6TY!_TF61OKHBX3;B= +zK%S3ktM0N|=CC;Tx$P1n-t5kXJGCRH$Vwc>b$)~$o}gX&i%J1+cRZbt{`RLGayD}5 +zF~c~pu4N!1$)~;=b^9y>7y@)xOYJpBoxgD2Yfli;P~D!YYK#4@MNzv69?ry2MdXDRfiD=k+nOT16>=q+;}{DJAg}r^ +z)9UwCznABlw8+oo`@UXz#2GY)o1_4oZ3ftJy0qG8+J{?&KAFB|wMq!d#ztgfJOv&U +z42ZD!c6Hc!sa|M?v6?^mSu-YodxdP{t5JtESuk!|Rfn8M2Q-O2Ove#KWh?DOHC +zQRWJgiB|P!4RT88*fCDCBs7Ucv-^3d+^i@UUcD!3>~;4qaaqKtA6ntt-SMFh5shj2n`?A*H +zv(DD8`YJuETX7XzO{UI$Vp>f`yd|Rz%@9qydM9t)Ryn=vf`Gl15RGHD5@N3MuK`eh +zItGZ^Slh!rAvAx!lw0WB@hQoYmTeP)bTQD@)u)rzwHf>n +z+WjVEr}Vxa+S}Kxe}yC0AAAs6bp#Mt-J(41*&M~L9P_P-^R})a)gBu&OV_a}RBN^D +z$#F0fkL=Q;1R4c)OJ3(auA^M3XHlNV-oJKTS9>I+xW9i+f-!o{Hof_-u%V0v^Y1(3 +z62E_&v<)uzfxgiDqqY*2Ol^JJvHA#H<450ZQb*ZfI>?nPe!aTXcc#;5uH9I#*J{qh +zV3y>otHqZI)+UbU#rG#C?($e-z4~BUGFzIYQkv);yj@X30PfMMzMBLPbS@7jum3{W +zjxx2y<9nE!uC8Fca*%e&p?VC-yBzK^XqD7d45u}pAr>>Ta>!FREK7h(CGHo`^@frY +z@;cX_`be%@akVqtXiTWkOLN7gTuRt%IKCu0DP!B8F3Vi|&s^U4GheOb9r45g+AOsa +zUb_#bEPT(nTMM!7ms$d3F641SFqOQ- +zqpS+ow&6no)Y|m)vSu92{fZw`Z$YJf@AO$&r` +z91B#^=lgV_uvz0b@;@c7xzumA*q(X*wDLy_4F!-a#RH)B;d`@5K+59KR! +z7sX50ivWIo8R>&uIqZqUaH3r0jL(Wzzf{-em@cz`dl-2A=T)ULEpqYr9uKvK3%#N8 +zO9)`k5@%Zy-DRwkL``K2fHJv*Ne3$%|Na;&R7;?aaM&tthz7+C_ulRfY%IQl*RsJ$ +zvaORUKGn*U6)WZk*VrsQIbt`AD1}1AZGvi@zfqYiL?jBMg)!~-_nN4~v$U>!pCX5^ +zF5@Fs8|=pJAMUeP(I~aD^}1*Z!1$zXGg;hT-$A(QYl!BKs^n@*5c`-cRTul9P0p%e +zR=pvI?))D~>yq>%kkMRSC*LxVq3ZhGC?+w7fenz=kxo;`qWX^P +zPJJ)`Z<0F2$)>eWf<1jkMG@qxa;%D&_!$W~G#ap6YU_@PpwngLw02xlFH^#+M~}0{ +zzkXo+<=wS0)(eIjf_~?|#nO1e!2|3gzKozBV6GXV7inO75D<(V&bK(34tLWRa*vyvx|Z2@ +zV$@wFi<}HIhgr^~O4Q0g_QF=NMxMQ(lS`6z6ZWahZX3W=ipdXW*4ODUyr8wgV^+=U +z6|;yfdv=Bp1+`u0J;JGw8P?;FVs?76#PMmw0f +zH#IRFDxR1~7cuYSK%e&h`NW<2JbU;|RAjv`iO5#P^;>NqFQRCtvN8DG=b=Ecn(b*% +zgy6{(73^`7RhrXsFGmI@W~u6^Q(w9Jj3|Dy{`fcc-m#lEI2v=4EHu(`S?j&bbBEQj +zw!m$34D~m%_l?k@mx^L8wn_kKX}uyG +zK5=03&WtPovrDUQSLRp)qif)ZQebNM(IkeNtbzg_omoXv^W@u?_Lt5+=wl6G&&7CW +zYg7FdL|LF9(al(iw0JltlaLa$YPIeV%r?3Qx;_f5-jV-&`3TQ4xz{zkZ2)Q_&}!rpZum^oTxtEWs#BXOtphdsRQ +z79|H>vupkL?$dZOrje|}nbgcBn3?6@u-xpl2+vHsN|6&42lC6-9{zhMa&)5*bIxB` +ziV%NisdHz&Mm`UOq-M=~b)>$0P&R>Uuz5$syB=pX65WiVq@B@qYmK#Bq+0~_bm7mf2iERVny+L3c@|+t`O~U!=F!% +z{{E<<)0Ai(!wtL+23jGnqYyD&^C0={cho;U#8w2vp4%_r?mQBJ{2Vg%rf@MJBDJl% +zc`ub{cqV2n9fJgv;S8u+-dnv2v??794A=g#f(?2BZK?w6g8 +zx42|zROd9tn53&4TE$; +zUpI=JNzC~Bmu0Vr>b{(B8BX(VX761^P?oivc-O#_hRF{mDKT_>%7yrECEkdKzrF$M +zZl69MKxy~cu6$k>nRWWj@xOu{qEAyrA|xj0zB^{#QZ90b4v4!moE8%? +z=T9e&;{CHTn(_PhhW4y*;M!FEu65;IcE^{k7?_Y4*DDm>_LO%zv13(YVR;8d%{64u +z)d8Z<7@m54foKii;L_Hf(A{n30I9TI7!XqkHe@*TdBi5@{Q_m>=W8m#9aXb}?=YjV +zIFoIc7BYZh<9--iz+@;Pc&@I?utn3Ycj59aGqWSrA +z%)+|R^_dMztpH{Fmay9^wu{8Of_J{qbA>sCE7@RjwZ4=6a!GLeJD$;G5H;nkCvz_$ +zJ5CT%(vXIA&i!Y{DzJl}0As%;@_Muh&Vq{`>=F)|dnD9a92Q5ig!< +zB^UhX+S{sMjFV_0@OZxtLPJ@0q)`;O=97$@r#ZmM{k>Z7*;wwMCRTSDEPRW$*xPQzxzYyP&;I0H5oRK>T!hCTrBNQdy!8mE}TweIUZga+U6 +zOLY&Dz}!3@h1m~jgqtQfYEabVI3?N=32{l@uE-V5E&qv`PPKCkxq!E=3P=bH6XkSyBSCUIe>4WS|aeNUC9Zmp8}5MnqQR; +zpQ`X|mux&4X@tvYl%L`~sYz8)p7okMLM|$Rb5faGp;cs&C4aK2S8#d?kXz<6`$J!`#;yHXwS3oF^^LS3@d}ja@tEh@R??R$v`>_l>zs%83{YbUXvJ_xT1<-<`LftPTknTdI7 +z%ry>$@^noE%rE}FS>O;etEzt~V2^rl$()=O{}}eb+C2h9DX~sdo2wh=r+7CDy@bT% +zgY?Bgq?n~ +z@&ej;Yc>>*`u0DZ`j;<)5~TjlJdQ3}VHCV!U+uOdx@vrT#29h(lyvca010s_ +zMk^$?@9l4{e9@0$aYiw8xF-TQ-AtAEM6Vojs9q3 +z+j?x6F#wri2W2T`wJKsypYr&;nbDwmC8PSaEGm*9vqV50uAhqi3`cu#{y7ZRtNlac +zdgpec0sU7a@_pN``UYbf=?9s>PGGELJ>05|>0RxDd<@~0faSV^%v>J~sioznQ{oD0 +z8x5L0d`K|fy!r^-?&Xv-*Y8(swIxupSx^`GH7#**ZmaO8;Zwg3w3c$iCzUw8BF?75E%;ZZgw^#VvkF4H^7230w0?Y>yyT5&5vHL~NP#isC}QRjykn690E=8a+R3 +zdtseJGa%Kqw%E({MK~*tyo?z?YbG{g24eAWerCcP?|0L`6%M`2KONqAF60PcrxuZ{ +zUF!PuCgz1*coj`WsqsPp-Z9*s{^bhR+xwg>#{P*X@8Ox9c>Np|Rz9^({{=ex_pA!< +zukWO?sCR^TehxW>P*5#4rmL>K(NlrX{iwD{{TJEp8rQW_1&Y#2r!~agdRX4RO}<~M +zQB{1;PFAkYF}jz=ACY&lzmT}o+H()u7v+nu((Iwl{Y1oCf^2F!Ptf4fqGhhWP?m0-7)?L=kRfGK0z%6uiq``l0)Sh3W9qKVID$>|YOKSLmrk`NNxA!jxP!;z +z1l9IRzi&U{cB{}UGbGFX_z&J`8t2b?3vXxuk2B!y(t&NVNX<6~;YNMZ+zVfB^!9Mv +z{u3R|18!hRYioFV$JWawOj>-B9VnLhY*Xgk%BEq>?X2|Ta@5#(!P$LDy)~O{@W!v&`T&+@rwzs(I$$G0o}ByR)kG+8)|Qg=m(2 +zPG|lQ4IGlu$?2t0i6zwBz`EW3KkN4UpXt=BO(V7uRHkW3s=K5d^Y2;j&2Qf8kjYKj +zF6f2j>SK9oR?N!dkj>+|ZU&Uvwe}F{jjaA8ZKnKCS;==Mk}TR6TXUM%%=SlMk(bK8 +z+990Hvg&0YRXY(-G%%lgAhq)7u*Bw3co)L7?|q}wvkIlY_{$m{)Eqe(1?&3FX&)o= +zuY;raLQcC8#5$bgGG{EG&P(|g@tXNf_`g&7fgX5Y3wg;m`I)p&SAMn4Ywj?!ecE@| +zr0{|K#q$S1i%U=!Lm!~=FM8=DGaX2NG(er3`iI&Lcb6xCI@}t|YXa^Oap+KBL<&*` +zf*KiS-+=FvNlY|K<|EoFrUuG4M;Jbz1!g|e7Z6RWq8e+=bZIZxFu$;yq;Ne>d&LFR +zG448Xt@D{xK9xK*px`pF7U+goMvE1c1eMD$C_S}W-zkH+fcgjpc%41p@_9U_*{ +z#i_+2kJ;_ax2|cy5XVWDL?z`MRx)*>r?uH^)|zr!fl=|g*Lk06yKRdUyPnF-CJkrh +z@bTJqd<3@%@p5@JtjhUo#D6X~5ZIX_3s%&V=~K(+w=zr8{3bLBo05q5Sk(b-)Uq5& +zZ397O`}Xn)O&SrZE<4wzR@ZAu2qyZRu`YYB*X2{L3M82B_PKtxJG~~x8)dmqLgO1z +zt9(O1xrSJ=i2WVSTECyh;a7-WvA=NIO=Q){v@jM|A~oD}*zi<(g^Ok08dBo?3p%;M +zt{rEU&}&pvnDj{rXk>_^NaUaf*sd}w!hvPr=Hv_qYkCQlzr?gPG~Kz*=PCDROi@!R +zDyf*8-Rn!Bf9U-#sZm3?*FfaT)UWG_O_r}I%Ghgj&Doer?Z~THay`Jl0e&sjzcHLJ +zUB{|mUykwy1Ocv=mt`)Vg$Ems!HIR$?cElEl@!&wxGmbbTjk)jDC*kE +zCmPhyDxch?-D+M0+{}D<$Dxf!|KQNK{|kp;sruj)J~q7c+h#QlE0O66J$f^T4K971 +z{&8vHlF$E;SZn!0=7yrs9nXm-Lc&I8c03 +z5gYLg88>R}6{vY$wfd-?GHQhkJ@*bBdj09)vdOBCWF}ia6YWaG(DS>i9_%B~`Ivk~ +z;>O>uihxqWDm;b0Io3wCIAj2zl08td^~sfrtr{Y5q=$@~hi1JKp3{m|DUUZGl>kQO +zEZL|F4ejF-0bK#xbdX&)Dnl}zw9{o2F!+})nX6|x(0_C`rRmq2{&Cc@jhPe#{Ohi& +z2_rp;8qA3@Z1dC1a%4m4Drwp5ugi9WQfCYc5kl)vXCtGLvEf1H@tdaKrMh--AQTWL4aW +z(>v!(8^J@e|1tP{!D4z5&B%_k))gt;iCJ6wxE|0Vu0AwPmK3gjP&C!qN{hoNzIE@~ +zJ-%fGi76#FeeB)}C|#GlJvkgDYOdMmbKwsGT;ifVV~KEnQ}rs^#(XrRFOp+gl*HsU +zF|4Rt`C3|ccWlQzDFBURlaaCPQ0Krnba +zdlvKTMbMQW4k>T_&Pw!2w>gT` +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 +zS3QdLWskkagAtE*8ehk +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 +z%kTMi!z`}|!#(9ivZ;)C8d*$+%p*iP +zgM*2e{{>p%q>*hV;HjoF!gBdq!(3JXWB9_Blfua +z1}by6sFvNTg(OW@`(IRPf@*)cRyA&bwMu%~Uw`)3f5+BY5!J;o&a@AX3wo}DtacD$ +z^UnRrgu%eU*m}zlxw{Ox+_7EOBqPUY@NlsEoZGrAN^s|aT)uiQV9c1zcw*I}js^z_12&2hy+*lcD~YyR9S +zH#{O~4bx^9sS(q;o5xE013UwtQR)L{2uRpf%Ebm#Vj00 +zF$w6;ixB+lQATOn{~_%y!{TbQZP5q>C%6W8C?LU|;83_zXn?}qU4jL73GNao+&w`H +zcemgU!5vP0-TU09PxtA*`|kU%R`F1^co);g9CJ*@*Ze(;$S!ySx#l*o)1T@Zex(tf;Wftuk(~hvDG7Su?sKQm1q( +z7>?d*H1Vv@`+O&86;4C+)y8Agg{{j(OMRKeBD=+#+jxN;LdNex3-s@g&7h$JMsecp +zANj3!-`Xyf=@*sjypeODr}_@E-?E!RScyJ97u@0^?P9z#UkodR3A+YR+^nV$*%Fa_i{S#SbK?pS~R_QuZ_nKxv( +zzA|J0VUcL8y%iVLz-DXER`CW_xCNp7)Vyf8Z~5b`tagJ@lve)aYf$K0*OFm~M~KW% +z_FD{-$}Dco$@MosQ9iRi1t7KaUaWEXi?e;WYGGfOJQxsu?ED~PS^A1cLV`1wuz3?E +z4$#wRy`~IYn8J6|&2v58u$WZs25W3QgZpIFKlXWaeq< +zO_${S*Y;NTT1Y@@Y1*eH8J+IO-cCK?rSob`_Z&!2D(YZ~M}#?F_S)gmcdex($~5#H +zZ1f}MLg4BjI|o-;%bAvTHanb&03rr#J!FC7#IYF#ot=`B|fr@{M6mhzPOk7<&+38e7*E; +zh+W0dyteabZRFKCR-v)j1or&nJDpsPZ}cO&Lw7N?z71WFGMa|L4=b_yU{PS +zVh_%^P7NVn`X^C(=7U~D#w$r!4k6&&{;iXvduSiJ!EC~K9l%JwUcs$wv4U=?G~ +z-Brp`LQS?n!`htfg;9j%hPj+1M66H;+QL(pHymsqT>w|j +zW4fppDbq#o7bB0K2W`!Tp>KD#qCeaP_7`(?;oJ`Fc-tOsxn}&Lc<0~jyZhD@AJ!bR +z_uYj^8DEK*HRlR&7qN)?*pt6~u{$g++spXQ!`JDeV>!F53q~(oMZ+xq)bF}tE2>Csx*Nf9uZ|&`}J6i1<_jj;}1=BJ*jGI-^vw@B# +zFC1;-j|g!7{7l2$Kb)`LRBQ1fOFCx8hvg +zesd(5*9^)c`)U|SB2_||YN$BM%A&v)RZMY_K}l+OnO`}|Ev-(iH+?r*PHv{VvnTCt +zDJG!jU5_@Woy)tC;ncW`wVRpLNxL)|DRI-cFXVp-YyMo3{hi5j#c;2I1*38)wLGY4BAAH&&EIsh?YXf(rpp&h?UxtX!$chKOCF}! +zZ1(El)#`VQHSU@n95)ByiJpH&Y#r{xIQ5W5;=sxNIG?5ch)-myFg_Udy$@LHJqgtRA`;h?Xq?bqB!gp(WJp)@?>=&0(Gz(LUdsWGyiJ7_(z++q*R-@5i@u$S)=xE_&DvB +z!YpSjMAzda_BR$bIZkWi5;5= +z6)zi@T>fM3r^Q_s<~ziHqd0DFhdtl?K%UuYpCo6>4%1Bf)3;2A>Ye$#^c=&tP^4I2+<32` +zG=};2g^~2%;evje?0K>BX6TCNN)vHdP$ac==5>2h2YlAYhL$~C-4tF}{My}|-cJIk +zrb&)yOFq9Au_U7Wzdr%k_r{VTp%QTgR_L}{aB`55*%1jf(c!XcKp9Es+{j+5$C_|S +zrbbCp?Ys1~+Tjs=`fL8j91)Nu9GqvXn_E<#oj=HVVD5+k|2075%SBrDJlm`-GEziA +zS`0_tK@10g0J|ITcWK}n>e#I0K@ESd$@Q0piK{Yv2HsC!fr%_q+oUCuBiX)TZS6ia +zkQg}(sO(=yPs(2v!S(XYes_nUl$7SOpW8A*-Zwae64mkVl!gUp{|rr{Id9Dqg4X8d +zzMZh@W$@M6NWOmUOWGI~e)r9v@vqUH-YRD>R5-s|`rm!be|rBn3uO*+&2Wg0>Ez*p +ziQ$1Bhc_zjztG(NMb_g)x=jK_Rz1wJ9n1gi})&Q@0=S{wIRSO;(5;)-wvx>SjQ>kLhx>lxJjb +z{&j}!zwwU$5*!;mNG8lQVFFPkc?nVZ?_&1W1z8@c&4BUw{^7oN{5X +zM-*BaD=Ik@Z1r+ejP^r|9dwa>G9}qz5?hoYj3LoU~o7@!1r~IG%-CI&` +zO38=lb@9?hc=5oQYjx4+eq33UsQNe?Wa7T7z8V(_oCPZ0KuQTO;{9K%PZYy7d4UN5 +zz@HiMM%UaTTg +zNdQ31yA3q9fssJ5vYC65Dv*Z71DkOz>i7AU(6{Fn09; +z>m>ZUodS#L5#u*I;&|i@R@QT6Yy5BNOPugqFIzuRJRO0;PtP(wc;0TfJjw;FMNR!N +zA67or#-Qobnwgm^Ra{pUZUlCR34ZjSOxLfIb__>6hsSH&7Trjob#$7%Sm+HVaL +zXTH>>gD~@~Pae4Pz)JYMBEQoEch0E!^^u61CL0;|e1t%c5V}&QK~$leTPN7cklC#2 +zNwhDUMDap90{vF*Zz(oiYZIDR88>!OsS4FOHLu0!ltt{h^v;y)zmC@oq+_t&n*R{P +zw|&|<&@*PCAwq_y@Ejw2QYSqu)jm*X$M3;uDPfo$?W}#G0RH`OrJy90{cnTkU-7dO +z5uo3kHf!@7@#gKL#eIq51=yZWA-nL5y(7^_o`^5Dt6S`%U~TziYkUHmnYd!rj*Eyx)l7y4AmExy_0vSOvs( +z4)NKDCqMuO3CMkd^Xu2C`yL-;`MtkmNxe5Y6c)m%CVxSp*Zq~ybZZ7Q#!tVutf#mB +zjiFiEq%NuD9p+mtW|}#l&UP|aD-7>a9r~S({d838J`5Y@WfsNpkD+iSRb^LjO@{Q* +z9||y^Z;*HP0~x%_-glFQ$1K9BR=QM{j0RM8mT;&wrBAsh0GbxJ_RY7yAOB+A3&1!J +zY{4>N*l4A3^A=b@BQK>vvAZMLpYy_i7o1{f-SCJfd+FUx>;QLkcU-EI<^EyqaQvP^ +zhJ6}dAHTxaf8JktHpYpLxft%6x7bJx45dAdu2kCdI^~B1_B_gy-(OXLg`B=$#&G5S +zK~i-Tm@lCtrDHR_=zni*$mMvIt?&@;n@^moNJ9P8jmF?T>0G>hA};CsDs*NgO%dru4s!`G*>HmI3t#NL7V%#m14rcu#BSitn7iy}|McDxtL46YVVr47t)+CM +zeo{cHDX7n#18|qm_n>){BkTv990eBX`frV-GkEk!opU%&k<#2%2=zr1DfG!RNoy8R +zOFY(XG>l0sL^4YU0J;lhapt-yp~x=|xcl8Tc&3srMu(!GxS=O3JS!5A9o(n4PKk6u< +zQf^K>O)_Fv$8tLwOFkbH_t{wSu9YWAQb}|!rw-4J>g*hm$=x5s#M&z}re35KF&RWr +z?f}$MKgSm4HCa(L%E!_G2HpknY~?X2r%`sKoqklL?n5V*>m$*DwwknhU!jkTtyL-* +zQoj9<2@3ff5=5)@>#X&%90dghhoSU~uHBk)AUsSq`FW?|Lpwz +z9nj(y$Y~E6mQW*X$I4o&RRPdx1LnzUR>m(_C-1McIOj=T%~wfC?g?88tb~Wt`Uwk% +zBfignC8Xct8Kp8cnMis0i?~wxs&qEXY>$H^w+y`hd{{&9*2p3=@F+1(ZRfI{3)m7rP^lp +zF}rbo8YpnJE-qdQB+iJ*v_PpLglQax0?TM-j*li}IoW-?;Tcqz`fR!Tj?yw=U*IwVGe!Y@jb^S^MK58iVg+eU0P)~jf#%4Kru8`aeZ +z(O{`Q-$zW&2j|XW;lY92mh{YoSC?R$PK9SPy80FBPXDkd48YFb?UM%Te-8CO;orax +zdb>;Q0upL3cx$@$RmFXKvn5+i+k`jdhY)W(C$ +zY-BTTaX2b?IT90Lk~v9pny)B)z`O~6Cxr`^K>-P(}cSE<0aG?85Q*r%s0 +z8KAJSgI99L6)T%9NWQBj?8SdV!}z`RualVh$aMAJR>{NZry*}2pw62_9!boK9Wm1s +zYebxoa0^Ab>gvQACj=%Y7o72PB+7=!kF@Q2B`^+yjNzpGji +z@%58b$c*q%(+iz(y?ne~Qt6gnOI;c*fQH~!xRO!=+NjORsV5$J#KaK=@5QGfc0X5E +zypyWMkXmDgUwdBYUnDP67uT}=o-Ip2K_4~&|9J^LdS(60DE5A>Gx7S=mQAmNe(9n@ +zCCb}!ntBa^Ol?V%^2ft<{Mo&WN80^VBUs2MG_*YP){jS;fimXx)jklLsykpa0S{{Nh6}Cmqch=ZjAA +zS>=OP1Ky8}C>px`0Fi^$c31gZ;n9=tS|nD)J(A@$9R+fPGKp#8_k;BVjZ;pR%7zxS +z+|2I@S@a9kIut^TrMB94^zxJ26g)MIm)>m?UNUMYKHhd<-bf!9_?=(1ORRE|=H*_-J7!7~ZhUTdEkoj8wtQ7pp~aJLw^SP--E1J5BI_l|q9AwP_pH7P +zCb*O6B$VCTvRisPzUSq-AZErn#EyQ{4N|lE8n+~bftYNB(|DR0wg$|zwxaCcW}Gz` +zcY^1Lsn}RrJ$DF&r^}Kpe-O{D&fxB5Jf+K%lgMS8N%N|NE2Zuct!ncmHT38z@1i2{ +z=e3nB8TZ5S62@Bnx+M!PMg%*%8I~F^0!*ItajaT}*hDkG5v{w>TWorI5Gi%OPK{Tk +z51#XVTPb^=*E>+TouCmp<4G!>*IGw)Q9kqtxl`I&EWbX5pP-GAf~>p#3UmuGr*e7m +z1@2xgxSyczM|?a@dmrcbbdR3xR;YNUFSFF4UXdUaGn4Nx86~4N&A!?sqVLUW;^Jr4 +zsKMw%-(Qz6bw^V5tz4aiQV(o+zV5}GN%tIJsWc +z1wdj+?OHAcbLtpYEhM>iOCfL1v(~DjBc;&eI@Ab}k8S}Af@`+AOIyNRGG!$jE18#v +ztOAWV=XPsx-ee_mVN59rhGPnMt7yLaCX~;<)o8pP?-v`kFPBH$TAOyA&QZfp8!t)P +zd{^5Pgk0`?Z6*_qJUe}Kbn#l4pg?}dAUWkDJWcExuMqKxttjI8go?19#^$USWQn?j +z8eitreB1cBx9SBC>Px4nZWZOOu$yk +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 +zNB&4N@m1HiU`?Hh4ec;$*5GD^x{_M(Nc328Df +z^UB==O&0KBXnUdA8qgYazn%~`1pT@o_b5FL87mo)HsvhLJcCol6(UT#S5g%_BPs~C +z58}!u>|C%>R(qNxftpHd-mS81Xt7amq`nrh<29hS^BN-Xo`7d`!%=0VojvXnn~wgu +z93Q+3b9#$$3;{KethY8EjT_pAqV{kGQ%MI!HutIQIBT1{4186%OpG^Wdqc&l+{pVg +zOOwn@zWFTzHkdz6oMM_NVU14)V?K@~n+I2)Zvh5AE0Zy|xW;zsF>Xs!17&BbI9%3h +zrdhMnkF?y?c%s=RfQR`%@OJ;j$QJmmlwx?o6fhdqs_&c +zEHTDJppo!Lwo$?Ggd$CYliz}WR1n#~`easqn&p-QFKw7|&`$ +zQ8GIdSLBl&lm>+c65K*Ga?F^dWpuBZ3Vpe>T?=sck=)ECNYZ39?g!sj6C_s}_j#7< +z3s;ydWgUm=ftc!VBG(=Q7w)xoq&ybayA#LD%B*K^uHMt%`Xx8n2v=lS!JA@s)}koj +zuNYavgHC+k!w^)`9QT+IAKo$GPli?Oa9K&kigHS*%IeF(gG#6fdxv16myr9tcLXuG +zT5`L~YaDkct8J+q4#Xl9c)0ymYo9ys%LEbWE)*boIodFgkc^wlz{)FB^z6*Hl)%D{FZd~|<&TwD6nFF_fkc}h*8eFD%YAJq<|dfdk1upozpbQ2 +z0s^W>zVgj)RS}qrMnEUa-*?&>xXwVTfy-~aKkK}4D$!`h^0`em?M$8O$q2qKHjfjn +ziTumI0M;Aqks~^Tpt5ij=GYq5lkCnC5-9lbMqE-SG%vSa#O1o3VME0-+`)r9$P$v{ +zp)tbL!hQxcKYo&`izI)d$T}5aw{xuGMB?tsW))DR2@aG;5J9ZL;SQ$c5A!k5CmJ6c +zRL^Z#q+wItB=g7@#1EhnNuIP0t}*#xwL6M4xN};A%!>==#iEqxJQql1&7w9OVe~#X +zLvM9+5o0RaJ+yWJSJoL}HZL0K$yzA2hMkyGX){63OK;$GCWwmFM$W&d1OSeA>Iu{q +zzrIcUv=Dh4N>UK5)@hW&sTy+6M^IeJ7^ +zNDmCn#d>#XI_LKq=Pa=5XJP)W-Hy_IV=VwLh;8{%Lhu(}?Yw#}m8MphEXe<&S;Bu) +z8nFNue0M`E@wGhLkxf*#Mk99nL02;ZBdPY%C|?f}gMM<{w68i)^{B%D4cBUx&^{fk +zNzffu>tTpKVVa22K;2kbH$nDUGwKBrimFBMsa&q#khTgO&CAHRJ`nJ`;tpuhB)Vw;vRx{>uCut3|ZNZmuOF0 +zp;4{V*R>J!0RY7ggt`ELRF|dAT9&SkL~LOj@n+|J{G{Jwn)-5TGGYE=eJthhPt2)- +zPD8Q5@|zsjqpY6H_9a1&cjYIV#INft3nLIxSDp?I1QH*#lg-Z3^D*v6SV73lf>>aa +z%~4M73LAazPRmZQ_9cP-pHHT6clUQCnPX2U +zbc+qU!u%*Y?Lv2I$X?;q3a~*Uva)Rnafh$;8`>htlpBuIG4y3xV_0_vilj{O(>b_K +zNR8gywkz>Q1+l-s;F+U=zezQBDxQXu5B;2N_e3Y4lrXI?6P7;hxDMwt)uaqKt!RIk +z$umZ{%13Na*a29tJ+Y2FScE0vvMDzZctHrBCmyz>VKKk+#RcBxKK%+c4Fit|nE&7h +z-VIk#E%+<}v*BVE6gThX6l8<8F9;G$eOSrW;)o?$LbA%UBPxaa)iT(}i|5o7uxM&N +zmaUiHK3+{V1G&zb+HqopI)c|Famf=aB{7}w_>Pul(3pD%W7!=v)vWL?t7M5SFxM00 +zwoCTZn4rjMd?}BXf?M{0hOot`swEo=CL_)WqsONi3h5z4R&6-a!FM%j1EO6$Nka@a +zSIBH@ZGFVhYRlv=W=_GLn&^vQ6R2reRQ8=r25xLY)yC&1HY@%B;6@gd(jJoYZ;863pMa_n+_hbP_`kG +zcE^A`Wb+9B>RMVnyQdsEXvNgui2+x5|vqPTJ@v8!K^wqf8$%g4(@&e#Ax5TKeN +z(=uB`A}4n%ET0i-q@2!_hif7@-9T~bwq80B7R>v%=3ae!A#!W^xo^$eyIDJNUrx)C +z-!kM +z&VZs^r;xRaV+15^rB!jMgA)1|%7O`V%T5*#7!H36%E)?k0d2C$)V=3vv)Tod6-KX_ +z8&?AxHr+f=cK#|19Ipr?voCN9{e+k9o)#Mj%TPBRVbYI&5Z>UJtE2QeY>{NQeogwz +z_M6PS(I~5Q{IyD>H>Dp1jk#JxZ>l-vC^$x+Ud~*QQ3?MO58%}s1*9e_DDt11{IP!2 +zMoX*x1DDIC5cx^@EDh?bKB;VJOqIWyw>S8FIy0cweMRlI!5Ym%Tre7;aBxKx!aLXk +zUY4aV8|{d_5*yO1?`sl&kX=h+{CfSI{aDYsAyLX%&hiG%KJx +z!CFTYv+V*ZwR}koF4?VmrXc<1j&>d7KgDR+&4V_w=n#|Wu)S15?c!q``MDZ%C$vh(t_P(lwTI|OGc_8%$x +z(MhEHI_I?EJ{`KvN72CwCa{o)|EYl0>u)er_DN0?`Pin~HD66b7s=G5yn7q1oQ^c5 +zVk83uAL`kFrhLiy7w`}~R@IP}hYJp7T_|apQR&-1`fe5gKnOtJKd&Cbb~OLR-buB_ +zs1DX`@%P#%j9}tC{@IL1*kda2?dSRwv=dXusTv7Za~nx{1N%nGtS$M4u6*jb;oXjR +zKB{73fa#!Y`t87KRzc>aKQCYaywDkS;o}oG4O+c*NeGLUvq%awv*u<&XjP(~N#0^@Ee9PU&aRyhXuL)yERV6Kb4QVUNdh)BB;6dnq+ +zm`lhvLXxX?E)3-t*IBhO$Qc*%nfXMImyL?gqNL01o6G|j{TTU3TvehcqzS|~BS +zx0L@LzVlMp#x#8NPTPF*V_iZL%^Due +zP?d_@r%(VxvxCjW#)EpaMq7mTOv>8Njpevr$sx!el>f+*vZq6&rzF+X#S5v`td+60 +z0TOFKRz7bCm(P?=CvteY{Z;}&d( +zTT=Vs4Qf3S*`%G~T>XZf>(PCGsZxx(iRnt?l=Zum{18U#x$J!mo-|5n&|Fukno=$Q +zA@eo@fy5@O^$aEiJ(=T>+%C0lYXA6q_-QF|3upgCxrz1i=Aw|$SPH!4E$U5qMZ&Am +z!hd;nm7BULX{xhp%L*g13Dn2Bq&^9)e&YNOEFI{Pez@6d^8Y_LW!xa{!o&Oz&! +zKnF+0oTppz#0(y4!l^~|Ifd4PyGi6szI|qi&xdb@?z`}Ev3&32CU@lGZhU)6g`KRA +zWpIzH(n~|hG?koN`>2;&QdzTUHaMBQpA~VYa(@Jig)s4zmreOo0CH?*b$6JAwO>b4 +zp=g%|1JXH_f7p3VBiHoQS_!zQ)QjTq*y7#Im0RgZ2y$0#@H?!2V0&uK99GtxaduQj +zO$PnC`mO`>KFJ79u*F~XRXf&tst^Yd2zvfIGgqG~ikP3ddVXE(PH;e!ISQulSME$1 +zpz^oyR-?zn`9>r=Wi=1h>$LoqTz1xDa#V3qJ5e+88?=^Sw>`*GpPg{}IyfN(Wfmjp +z@OZoL#=o4LDQ+%jdI7r@2mE7hHtdQ$C8tRXn&8$7d$zr1N_vgnj{sYLn?C%NLXuQF +zy^cd>Fg$8H@O2dN(lE;f2X{sJ5X`z~^M>QF7&b&`N5ac*bnGUQ +z06@ZoxZQOIY42dU1jm{W76;C6XLYv9H><6}JfivV@M^tA`I>m^&2e!VfIt=C6V`@ao|WTT +zt{qy^Z@7@=QsXo6vsSUOs92k$-ct53-hPzGh6A=shBNrp}G{1K#UA3*p9& +zHLsZ#U0?;@{oOUV!y)Waec{b4{w!XVIR7AQ!DTBx!)14jL_E>Ccr2$S4fREub+X_M`zc6#KyDt<;C +z!}zH|Qt%ecga$`56FG8 +zF73az&M{g^Aa>E14oR6@bO;K8QM6cfTugZUvNl@W5-p;2{Y$&vMLqD9y|Y%psg9{I +zx4?^HreY}C>ycBz0+sBDtw+qo3!(V+0-d_jbRTagz>AIQwD5i%vEF6ssx?l>-wj|e +zmsfvki45kRIXnnfvu)5Sl6Tt)4;*4PXTe8viBuyO>x#iP6?usZY~0usTwLKQb4m|! +z?f+On{wsl0mvv$ZO`d-3jv>SEnTWMotrc`(dj$x-ZhV$SGn3zeWsbPudhd{~cjykY +z!E!fSi?B@$uwv{>a>4*qt)i3v)D6SJk2=+CBPLd}weIHm0yD@plJc1%FfstOA+IHjQ<}5^Q|c}M +ze5cIlWrxXf15Bb9>Au%))8@4_|D`Cqx7;ghsnJTO!{@wTj5jX6j0v_Vjl+OEosDtb +zJKQny_CZ4t(>_v9exNat=snx5%f4fhu#Pe0;zd1?S{x8;{B?;yPa>J_6 +z6>iE-(|%?7<?y{D+u_Z= +zFD6YH^{3s^}@-A=IXG +zMi5O|QWDbb_s6I{F0l@>uW<_({l*74NSV|EBMzWD*v58z&NLR9F$VO?<%hLOljM5F +zDx!700h0%vGP}EGnz}O5x5*>ezU+Fug+Hs=2VSZ((rMI)>%y9tpyAI3W^4w$V)`+S +zIaQyqt+j_1e#H5_>hCaD7JqQ|O%h$*H<`&Xa*?x|kitE^w>N^_+CwJ&&a^xFcME`vK;>o4JC=Hg-9v=r`W#{RqdY +zjt%BX%hA5t;3#+bR2bSH0QoyNwuZ1gl#OYw0+>ChY=t(q8_Z3=HPV;_(dFO47fJpe +zy8%>!ysXPE979I5kECO_2l%O!t4*Ok?-a8YJ7C3~Kw)nk7g|{7A8Cgu2DT}5lDwcB +z{kU!G-uxdAH>w*5m4j_Za4Z#&qzOCcgg0VXCp*3m3BkttHOEV5`Jq`sS|5!TBqyu0 +zty_QQNg8GjP(5v-w4$3vVYdC2Q^QfDx4dyX&nNKIAp{?}=M2FdG+^*mykAd(n;yeFn +zXHdO2jk2*byHmX&bpz5C+7{07U%6! +z=S-fX&G&o1QjBwg+9dJYJSumn5rJflTHKlp#5FDLwf``F9 +zj2y~#lT{O&gokg1CnO+<2}aT`_65ldFr_GeX4K(wprU?&SN_~;RwBCVYCApHQ36Bo +zeI?SXBp@(;3wSK>#AdoETTu3_Qjm#1fn~GfQ4&|sA{eQmV)w6r#peVISjRtK1Km4Y +zKV)mR)6rXB!eUeHK>Hpno~R6??W4=L2-jks!ulR;tKoU`EQ(t9*5@3-mnUNPhddT>J&f`ElChG2I_ne#vY@+%hclPapoes)ImKPoCmbc +z>cYB{spL$56+)yOzy=xs5`2U2;E#ERzt?@A9nn5~ih4Yp86x1d>QYgmcNj2Ydu;Co +z{?5aLhMIGaK0U4c9RD!Foe&H8t@Q9A47{efTKM~i#%D_kEVQ0^z4FdacG?vDAP4 +zAbt+37MTKY=D3_sVzx#sy)g^u&rE!aYhqQcD28DD3!J7p8$cz0^>%G&aD@6v_1lLy +zhX=_8vp;4i&_>Uq072EZEgMY2S%{1zR}#?!QG^a#&(hyPlKSMbAeZKpAWE_=M2wb{UE|oa?KbE%mxkfQ^D2wW0j5_Y-pP*e%e8f^O~Y +z31W>va|6u!dU_l;1xwxxQf>^iuD~`rAPxE3q{GhBTaT(k2iWra3syk)cTJFh?>6Lv +ziR+COo@({rU}XT{6Es6#=ZYjfN>*0!MDvqSuT5>0E^*5j29Fd*i5@>`teG$gZP95! +z$J-RhNcE7x1pa>>x$@tI!@*1(&mK@)Ap44u{jPmtX +zIQQz-^IVHlQ3fB$CfocMC0&HA;f3(h{u0g5w4=6z63~&+=c6+m;XDTL%jZ`<%NJ;j +zss}>#M=lLG_3qnt1#^c#%x+RxU~}{_i`C<0u2FK8B3*fN2moz%0#uyAz7IvHWMF;{j}utkcXSuQVY!G3lB#;R +z%wJWbXA{jLgUxdk4QEkpu3CRw9}3Gi(Vb2eG85v2JkWbpT9vlAaug8necNWT7@8%i +z$sqHZzcc#a<;3_~q(0UJHlK!aVape_B;vN~Yr0Pqu2Y*9uwm!GUj!&i_h6@?fFK6f +zTgq?qX+svkpkE_$6wrU59{#J0-NpKNc>OZqMu3{$~`(<#S)h8n9nFroEk>) +z8P-3;Y4ujdu}o%0*d4m?M4b(Tq27n3d_p?a!Su8NuEwClhLQO6t4d2lX@1;hHs~_*vMix_{-|YEfM`sOur1TJFAOJ`>GJ%rlu29GG|y?ji#Dz@Za%}< +z&AO+eTHKx%ibcFXF~-rTm5T-6JKvMR1E+Ww?p>yl$3wXhYJhJcTz0nVhY1w +z0zjQFpbrwc%djOOsqN!JwSHnm%9iol8L5aAiKqgVP+VfRA(Nguyk#)f8p64@$Aiii +zFyd!-MLaPQY~o2p^wc($Q%hRZ!kY{XyGI`hz?wLp-;fI)yc5jQbvq>MZD7DJ2Ve&e +zOC(NqE}Z?4Jm{4or_!nNf6a~PqzwE5JrE=^Y#Y38H=puaYFj5e4LQKe92M|#?XFU#5jo=tR;{eK`*x>Yc}oDhwB!X +zSIQ((QK`uS##28b!@~-X@}q%^N&{re#PpB@sYpNAWIHw6-u)3Qk4#vq!>#i;AH|?- +zs*_-6rrLS{X_oM$8iS6rk}0R0lPpzwjyyEjW5?XHxdB#rP|UH{I+O7fR9Udb#!Nk% +z?Xo!=#9ARMWy%&VP+nI5Pa*cZh#G +z(brLg2Q{COs=YSB{EM=-&;Gs6sJS<|j3CA_MoMqUdoE&2D!q!p6NpFU$~*)ESRbkU +z>xbC+G4lE%?dXvam8X38I|0EzE#F8b9%f_?i7L|-&t1Fvc9vGqcx3pVzAwr_C+Uqf +zkrs9e+3>2GPe|P(19PtuDHo``llqTipkJ4yexDw<7L*ATesg{{*3KWu!#|rNh-T0( +z_=t9VkpPncm5Xhadu1*#$$#wN+n>!Tm$|6 +zDej~U04=MWBTp*BhA%fZ +z0kvc99|bbOm%ogieb123H_#l{65Y?)z@ZLoL>!(EN@;$GgtE!`YX~V(@yHg2KY47v1Cp*}qwF&{ZnBg$hMvq>H=*H-sF=kKR?^}DX^?v((*SFWN{bvpj +z4xamdp8G22d0po<0#398GbH~fw^DiZPK;6nZ4`~NfAZ+wTr82Y`I5l- +z>YiTen3|Jla9swo+jX&6#<$lj8eGj0zs6C# +zbLRHOvl9kYFUp^*GrXaNX_N$WMgu$EnqSgZ=uxxiEhr0icWJA#Q0z88&Ow;624m#< +zOatXN25j{33xsXffm{6*ksg8Phw~Mh@A}B5a(|T!f$DcCL<8=}a2ur5So%i4Z+Oqj +zm9TByHiWU)d%fBPw|>5gA0&$_+v62F21Gt<+2B^_)}zmWKSbMc`W{9oI^V12QDg6q +z$$lIE(7`8OeSiYqPM$8wSs;FfoWoPgY9JlW=$ew7Xi`+GpQ7Ea0 +zT4?svl6v46j*+jq(V0qPh?6s|FsE}$c^6AAVqak2sF=N}BvzqD+8+EAR9#WUxiO&| +z9aPcILCf#-^0H3vwNoTc$aOJ60_&gs&cvopo9k{%&m)wBq&fx7)wvmw4Tm3?@MSw+ +z(eD*^lX`M3J^4Zt&iwB`Ziil&j2U?{s(;aI?D`(q7jPWC{@i9dCkWxMJqOBvFYBGv +zN+l_0)+s+bInLY+(N})6Uu34g|7!LTOr=YdrEKZLQFV^!5;drnm9aW3y?~Em`?7s1 +z`?G0)k{4%?+mZNV9P&j}#hr4Va;^R(ww}n@#HgF;8))wp*G;CjO(#Q9D+SiOz=a}H$N}FSRTvCnIsb`k<#YG<=cB-+eOutqB +z$Dhf{moYzP3$oeiORx%-bB)6D1@U|2IJUl9C=tAzV>~~9im4#CiFVmPD9?9@;8^X) +zu&cjl*#=jBy8G|VlriJM{FPdR#}LGEejGxjdl&Fz*^J+Hi$&klpn6_*Ajs6lhF*p2 +z>D2dd4a{Ia)3?VMvF@o1{lmAi8T=k}VG$Ai%}0!1-tld6gPuNR^))xv5O8=`oh7v4 +zbce5v@5BA#`kzYgU9)%{c^uROQVWiJRwkZj{VZUl=V3E~kP+V`o<7d{?cMc0dIRIZ +z)DR3}YIH$p3lAMNV-K{h9ESq{*0{P_ZAU93dU}bZaP_R7J?dG-IJE=wkf{_ks?mBU +zr?dM4>m|c^DiQGjS$ziIg>ON+GxEm;WI|N24O{8B*>^SK`k&d7_E9Jq;2ik7H8F~{ +z8_Dc%OpWb!^bKsd!%_T+r{ZM$IJewylHhC6oj~1tfSxZt^_nHV+o0cRIDVg$Eb!oM +zagMk`c{=xiBMiOAhy|V3-;Y56#ozaVmD?pKYaF^v|4?%SUj=@Dw`NqQT|;Q>Cgw{K +zUrZx8%=Nt{Nh2(Jr>B_TB@yMe;ONXxC#X0c|B~MQ9mA#g$#17s>y>*7&86ng*`dP~ +z(takbE)IX>-tJDY@|v_tL4NZbvARq8lCx)_fXWWKyV?C}=J}icKeF5MX3w6S>N4ta +z{84au?9=13B3j9wlFtF~TEoV9FRX7g$2Ne1M$VKG_}qkY6Z^-GucO+!^BiQqEV|a>wWD@0q_& +zSA6_lRl3|K8Y(F@K9bMa`J6(BoL#;B7x`;;Y(4S2!{OC2tLuBRxO8buyP*2C#&O>D +z`=^gMB~kCg#Y1z-cnPb43JgROQO$64`C(&Y%@QdxR2mR=eYkkKHU|-KS6deIA=yAe +zbFr_bn>+aB_)xi +z*rVh)tJJI<8x@zrP~=vutfgpsGfSe`Wov$I8c!>?C^3A#@};qc)Mj`r&Zwz~yaF9f +zZV~dnj|25~H5mx`DD1PhVg>1X+5JV2%S^aR)^&64KK+_V=N^%ZJfh&PwaIIS&uojP +z%%*k2&ciK9wS*v?62^B;3s_joDAybg34k-*`5!!Z;{g-(E{Eu>mqn{rE+>(=m6G*z +z$lvzI>>h!9C*PbU;XABQFD>n0@Je?FHl>d2qASJQnP=U4=q5AL6fl|#L>uky3u9v>oJ)bI(3gWZ*` +zt=<$5H*n0fAgPAHv^oCrQtx?{4bh^{AJNdQT6>{bri_=z4urh=(lx5)dWTJpew1Wgo5>nBqQ;Irsi5buHxn +z8Z!^bw74Ht6uF>N%9hi4^bw82u{ +z(G*k6j6sx7aZL9{k!(FqGU6k^htfpuVav}ainA>#+Ci5g9=Ai*junA~wxeTAZ}da( +zv~ICjw))1bu*5QqA^V{6oP<6FsSPi6Zia{^3jhP_}q}!{d*}m4K3d6 +z0$c@g$cczW&Co<5l}3cVcj1`awPiM?bCGtVAQ60?`_=T7lnmV;*4rt4iYs~3`1Hyr +zXJ@0#^pF0h9Z8J2`!L*tH(OPob9>eklAhkAN2UJ1moEC_%!IRBu}GmIKZ?Q(HM)7zrr?ANSStf|4xHZ`ZNQ0h78Dv9W5yi@+<%Nh-w6dJg1`?A=b +z#r9^ibL*t8@axx%*W)UwoGPTSOCYDtZ^k~Q!xO`K5x1c^~mD#>*vfy +zn=_0~^h@!1T?Thd%Z!V+9}UnSE;8}B8`I9U`{Fg)&PPE`sl4_-zy8EGQt9B2ITF6Q +zX!J_{GuR!h{ZaA4sW8*P9pXfK@XbudkIK_YPiN|dsQ-i1YTcnw{YYb98=natwsp3U +zYrouBc|73Tz}R@&MH$?*)#3v^@bcnn?AOwHB{Gui +z;hl&ZbcA+tGAKv&gW_ww>dTCA-pfk_>y4t-gx+AQ+6( +zKZ+rbE1GMpXx80#<}UgV>9&+vRS^*Q*&6b$Q?&)_?t+s($iy)Z6UXB>HKN-NvMSWi +zEOjG$_lmwpNn?Nv;#+s`6PjK3+o)-cW;FSQg?RwS>DGtYBHP~uGowBM{C;Umx8Wv{8xZ6D@hgF%APs}dK->9< +zi?sY3gddykiA3hfnRpkr1ngm|vn2y&7aV(L0J0o+EHj@puhj~)%0#RykA^E|Wb +znyKAdDR%H8MtaD`QHiM{Ou@EqcL;5thR59`51anjagB6ftQl>4j1zxr*#Z5Y5=pyr +z>|CEb2~(g}R#8jpgt?w(T~T&+s~8G?kd?>QxtIHtyY-V*$5ZPEskoQMC)$Z<1yU6x3(M08q^ +zMW@{p!%OVjRPSg$*1E*X^Ok>L!_6)C$X*?wPM6LLTu;Pd&<2aoTlfX|Q}FIw?uz6} +zfb+xKupqX*TH`i+y)x}kPSxDfPXBWprNY~G(1V^>?uPc>sXjYWy*zQ6JDs-f$5k$y +z(R+{mF*$;oM(R{d`9)$g3fO=xK5373W?5^yi+n3D(6t3Qgt(FpcEf|e&2I0dNPn>_ +zEVuKn1Ag-NYNe?TjO-5^ +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 +zZW!knJR`Yh`1bS!%cr)WC~` +zEXI1VIleWV>zG4-_M(qT3>_r?zXF0L37to{^DKm#aH^1h2)Ng4Y8->U>MZPr8+*!# +z9|JDdKD-_DhT{gA4y^d{?TCb{8aXbWYt&=x`J60^E_=CTN-P1wd^5NGaH{jS@BY)r +znf-0zH*M_ +z4^Q`|wBy<9P}sqUgiKD_!0Rwzi3K!Vdjpn)WzRl6&^cNeNHQmmqtZJ^^JT%Oz4^fdO<4Vbezrsbj|q;^)hTs$k5q|EpIQ5x{PS#=se$k~m~vbN`7X={ +z{Z*CD;m;2wXrsQ?@uJGRi6SJ4sw~Xw)VYFV+SpTRqU0pV9`z{Ha=c^+d}n&MNk0{Q +zPCSe=)HL&gCA1&<6N~p_7jzTGlt2EgjW3R|)T37^-Ly=tnvqI#))=VLYilnsHe<84 +zTd%T&%HjcT{19;i?p*C%x^WqM8vS0_2$wcXHZp|MG^ziw4z{pOEflrG4?9YxEgGff +z@kR)}o=KQamt-wOdo*;`nNfMWi#yV>&%mAiuKTHFN+p?kGdD6D#y1q^_?rcrqndG+ +z_lCY%nHU#8sK330l`v=qlAZvpLM0LMgAGGsm#Dz=#!V}D==qFRHSG(IbQ1t)M%7T- +z!ctKQjq_N0cKKZo2OdsQadtIQGmNNUePyIUAKbJFN?#~+bTa2Yv}4DYnVY5G_&v*~ +zLn4?a>I6+6X?X{bpiaw7WUb!NPD;`GQcp?V^mPrGM4OFYIfd>Aq{f2dxJ^unuJM(>ZBxPbt*jb>2>Y+g|j5ohv3QZReA} +zGwPHFgFG)}bFlSne(B^~UwL9$y5hu`_ivjwMdOTLuP+ +z4-35X<{Bn`4i7m6CnVJu{HnYGH!J}S0BtrG(*~{C6IWN{`#r%sU@xH^0ucXuQTyRz +zX?Lxq>AhN@27oNV1*=n@7qy)UR)y~?)aQ;(Zc!k6)4 +zV_`1}7h-ls<*-O5da9&MX|GPfxg{G|SB8fwW`7Q_TJ>jCC~7oMhWmL)KX$?g2aa5% +z_L&)`LZzJ}HJ`YNF(woNKKRgo4fau{y29cJ;XSztdnZ?R9FGH`A^OKJ`}5 +zHVHt(Z}$U`yq4fum?C*Ez{0<8JYlGDU=Vm__hZSK2^W=y3u|yCu2+O!Nhbeh-mZZi +zs{3x&De?O6XdbVAIxa^2hPQ7_x$_LZ5f%;f2;tbBj`pNMt3AR^Xv_&R?RVB$+Vd?# +z4OGn|Hale(MG+7nok~RGkwIHY?q`(sX8dkR%Yo2m=3DjXOTBDvN5f-nD6&H*f3V>a +z@nebpRQU8KLco!nk2qpGK`DrLNoOBg4?$R;`o--W&fdQHFVQG2INcGtQ$wX!5K;xA +z%xCpR0D51-@GIxMUO0w|MbLPa#Xf65DHM^Y`N%E?Vs%7KHy?S!?Mm}((T$L)(6*ke +zZ~73LGj>Z%^NkI1&OMeG*EdqiMU#COyHsLEk4SUYkx>iuZvYLT@^KoIb~Ys#D>f~1 +zHeIQ3lARA(me&%t6o)(Y>M3AO6v1(6#b#lGWXiGy16Cs&fO9bh>;`t;J=k1^b8!4Z +zlLz`+Z&fOcw{jsBXUtYdV11hISQQzQIlFIamF7-M?VXQMf>$0cncsc;GTqhWKn9C% +z$cG90pXu-@W}6I-hg6;9!b(tT@z#s=w+1?f3Ue3&HkG`BzS#a*Q?^ELD=G`lyf?C1UDXONpR*4p5UBW<` +z7)MHk+~=1%s>i?xGKsPxPN1(z+#*|~SG +zP%;PJqITwYI=z2&J|&g5_+npT&v53ADM%)gqo2PMTC4bI&r}eSlCN$%FFwD>QE3ol%Z3MJJ3r62PJiIc%$F%-^I|YZE+HJcZ5kM!E0di%p&U}< +zf4t6gG?ZS6_;$(Q{%OK)V)zmI`?WvhQStzr+-DN!jXJ!&#vy%_O&4p-5^4C&IuZqcl4}y%9M(yuG=i)8p4`SAyQL&5;jFE$CX%LmP%a2zMtr) +zO0{7R#8UYW0kse9b#7na84XpP1m7?Q_J}|ELWwv$j{K)&_3!16eWF*S@UeFytMXn+ +zpYM5NB+*57L~C*6>`a2cCkvb;XF*okFB}ZzP}6)@CUFjTv`(+3(uiD<2?4!v0d)4F +zBDIxy#p9*1sG7phTu(Rr;P`C~fOcZ);Ci#7&gd6xovKnQGVD5B_kWMnz +zo4LoPEv3F~MP4$2OF`!;A2M&Z&BK#QL;%(Z>XM_`iOd+sk3;ziBcXzNWnoFz!z3Mz +zwtgwbKGJI@3VDw#?NY*`ziKcj3DR;T-OS+5`JibwSS1AOk(OMlS66v)b6jeLw!sv` +zzeDp>h4q-&E2Yx*2BitelZ{+jq=zLcV-ZcVH#<%t9Ei=!@$mj%fE35$7k;72!Ev=% +z;iaOhFtE0iqr0Iy^GOO*!rjPczyeYybzT{NYi?`H5w +z-*4w?Pj5@pzlp37v4nlPo{s!Y9Btco>Uqp1n$}Bvj%?%0J$7@J2r6~{t$O#(M|L08 +zUdc{X4BTS%)+;hhpWmW|Ie&$!xrfYo(ugq0=)^j=%f7^AtUGa3zU@s^~uF{9@5{ua!=tJJti|3 +z(gsBm4R`5F_B*cM#BKR}ht8}w5E`x8Q_iB6f*)NzXHgp^axFbiDD +zOK2*1?|wV!Lx+S)XQa@Q$ju?PZ&~35jX?gqB#rQ9n1*8p`#s_|)~EKaqv;Q3%y{ok4GzOfGoqQ!hfQGF2q`H`_INDzPoE!R7k7 +zteNK>Jez&@K>YW|OXiE3R5bD1tn7gc7(OkBI5z%XPj;5swVUHcRQZ-ufYF +z>UEVH*8Wn+j@Hhad-jy+$oFUU_&v}H=5fzZVM6)E^|t9T;2!8#P=p5>Rr5xusy3le +ztx*X!t1A?z@XtvOF6RjeG^NXwn(AO~I{Y0utVPiFVbl$9G{_E4PNhw@UuZ2IdiNE! +zBi3?!wnYo)4%`#Sg#Gb_zLZRyY}}M7Aa7_G|775pZe5|as~W@aU6z`6ZB6890<)8# +znfjBaKQ_jrt?q$Kojjljzl4;_iUne{7!T$nC +z;Udy?lXZ@efhr{QL}h(}9X;n6bYM;?EU`olUb4F9UZJedfb%b&HR;DAG5jjYaOwTH +z5DusQS~*0t*ZDpQooLsCV$<obp=sk0CoAZL9S?5eo_gyDEf(Ai<=4oRX8oMB(yG54!tkSh +z%hXgoEkAiGpz|3o=sttV`_jpw^SsDaZNp%Leciz(_}%cF2RDJ +zL1+?~MZtcKFSI16!vPdj4(Ai`x1+s@8c5OE%zRBKhr$Ktm-|FMaUOy3TC1N +zyr@N5aYuVw(3z=myD55Z{Xyt{N_rl^u>xewkxMYtFn-M=)5=Uqn=N7dGGExN_P%Ae +zK5P^ZzTF6yypa7YAp#Sm7YoufpuRp%hyA!FcXJp=7iQ_6ma>fR6M$A|##K}{2fj!n +zcGxz#jL3C)4m%TW&aQvfnOd<7wjgx&L-%~1{*AH8x$hqJ#Kc(X?xR68@G*?58EmHi +z`(J20pvAA4xZ92tKG$;YjD2yrIXrB66L7ugFxJ!w%O|BZVOF5k(f-9jigU4n2ehOQ +zEL%40G3&gjCE&PgCg)}kG}=2#*U4kxEm7dh!Jwe&+Gr1m;N)DD{#yOmH`bV&>e@|R4z=W7Ej_a?vwzx#>LMO63uL1S}tEabXRT9$C(e*bkW$R8*^`m9GG9LGgKQkT}4sccUi +zU8Sufhh955q)Ll}fV%X$D7eBj@oFW&Kz5dfh^*xTi~1W{pf5 +zDh=Q4D+{mBD3T4_19`kt*X_gM8I3T0z}9d=<%-*Ice-Nf?QtvF5em@C`nsEPChwTd +z4ym&sdW$XPMevvsug~^anVkragCn=^Rb9(-Hd`xlxZCo5?1o=BISbD(k|X~82?aJ| +zBNqE|4TG9Q6DR69*MEfM9*A+z<`d^7xc-yN{Y)FB1g#_?eD5FaolczlDQu05LTZSU +z9KVxL=DiZMA1e&YK>z`Jua?x421ssgY1QU{Y^Ypc+dz2&QXD!~kC-?<9{LH4e9Yk~FJ +z5dK;R1>_~0?$(ESviNvKD^izvuydMdrHO5R<(`0@WvxDr4dU(!3_Lv_J!NrsCT%l8 +zKrp>+0*U0c5QSE$H0+BP7#FE7$#!2I{JsKVo%3iZebBNd_U+RLSIw7=R13!?nadKmOsIrrKW- +ziOpdmporvOUT4d^45{MT^wMY}nZx4?#vR2La`^UKLCFJ?>S4{6iQP)m-Tt<49NV(W +z3l63f9oX5FNXBd3AoE-!U^n4c)0PiPT4A#d127M^c%pYDapCf|o3|$bJ!^w&{#&cB +zfdy2c5jHWF;M5AKG|`Am8l8+|GUmk8?2!(h-ZeDN6FTaB2+rF%+b@^WPwz-sA0+Cx +zfuL{Pd3H9ZambSyOa_vRy+Mtv-!Kb=p7UZjBpf%6UD>B0Rz9--73zCD<9*MKAu%=0 +z+VFwH=y-u{OHJ!UIk_DM&T3chmr}yn5Q>Y_!#+jR1b%tAGu|_lcd)uGfU-P@d=B=N +z0xD+fzi`fC7rXcaN;^`XjQ<@GIWZO$>A546)w?uEhgYf4+`jwhpR7*DEGdv322Q!{QCL90I_ +z$cms%Y3xqS*V%4Zb!;wIX&+ +zcTU>s-lgrW&SQ<(Iw5jnkro@A>4K-Vb=XLR56C>>J8`zq*8N+Fxr@{d1JkSu^#^!-|Sla6nQl(j5l0sKB|q +z=}W^#`#GI`me%R0g@)7Y3gjDm@b&p1(fWFELe@45$=q(2!`UF>;b333N*zI_?eAWf +zcjZdxy%OQ-EkQe>n+vDM@kn96cspy<=NUC7u^pj=nW5Iv+#s*nGAkf?jE|bJ{E#hv +zL)Jo06rN*Bj)>FGqOcA8bEFp-rV9Ty3!@K3Ag)0~MHd>p-*aV0QeZKD7J4HwsAw{A +z?MD(tk<_ZlLjUUfN&a!CHxso8c*@IQT7O*u?r)B%G@6j^y`RAgWYcn*$p+LXm +zFT}$SxiLmxQQ^vYn&K>RTxEd%bfsiIYH1n|Kqc?sdz^aq@#PCawVV9~6~y;hh4UL~ +z>XO(j)-I`nY1H1Y@8va#UX1YMHT2hlyTqj)<-SKdu26`uRixt!%@ICM*6TG|az +zysb4LDdGM_Ofaz3j=3(7v#*O@T(!2m72;*SWNqi2iAA%D^Dg3qz$I_ +zb^6UB_dJFE#;(9c#rtE`bqfC>{LvSkY +zkMnG@s?w<>{KfOl;`<~CxDxet)56^x>W6QNzMew&Sy~X5X6f`gYlFv(^fNvLDbXXf +zQTTsj&Q*vGLoT8-wqDM1}y-iqV!;_GgKAK>farnO~-^f_E* +zFT9hFSQK+Tun#hmDOyRdSv}z`-X%H4oZ4Y8`V#t$_GJyjp8aJ;1=T37a%pEErI(y% +z&oEMHk}j=5#7%Lu4;)qWk1B?et{l{Y+SJU(&uc4?5xq*&I-7KtgZ8M) +z2E$|s2dpo_XA+Pjvtz*^c<8v3{ukQ-IjA@3k^7)vqkE +zs#2iWT(bAtHyOfxFY!Jc0Gw*&+14|hjUyIjkJntdlPvlxD$H960aR3uw!fVHLZ@8x +zRhppVtwM;yeSaOCVT%&kK}w|^dk=w&S1?l~mfa4~lVOwBpU#pMSo(8ZJ9lhipN|AQ +z*7H@Wv}tTE|4htr^*!^)<`mGT`4ps)FM8P&q9B$0v;zl+?_IH +zQQFz`7fqJ@uLTLW?x0(x)bD|CkS|B@O^Z@=#)sdEq>qn8VE}2##Pu_|&0W7>Qr5tu +z!y9wJnKw#Yza1SE%6T@9BlnL+d-Dgb?~Tk`;c5diC#nOT7S{K7`E`TPnA#79jcnva +z`lrerAN9q}@Bq%aGV;S;_3~>Pu@T}{#zjnILPO#Z--REQ&giptLai0+o)%jUNCvBnc%6Q>zHfmC7?JpH#W=3^303k_SLo)~ +ziZHL0j|-HxZW8K|i7dRDxASg5a!gOz+M-VrYE)$WHN-^#hTb$xa?#-=Uij>%ehX?N +zIDn-uhovcM;h|;AkGRG6`(i%PIY&$GJJjv-=`+1QLO23%767LOWs}7P&zs7~vu+c& +z3Rbw~wUrUU+5Bmo_fNEq|yYXPj9jZ)*)HM>t!pwNVEB2$zD$?1ZSg5f^Lt; +zcuL?29sp8hO7olKvSCk9maF=iZ(IWLYY1V~RltiGq&ndEP{B(Ghlj@BcmD?rjqp8Y +zNjg7UAhbkET;6te>c6<6-oG#5Ex~K`L+p)BG{RGIVy;Oh@baR~d&vJ!N6F>3Lh)Ku +z>74JPk6l#kHhH-Rm609iKdPq?PxcdNPkx^tqXyBn4*26kB_kaao&y6*!8c5EJ7*Y7 +zDSWi|t4E4ltxX{3s<%5-LfVmJCC^#2W7HXv+%tQ&HNp#RG#aCNV+vd9Bh +z{lx1b+vXC*Xe*(em>M^F{; +zJeOvv4zc?WqMhXt1;4m34n)wLJ9txH40+&}>+M`5_Zrcze`4=$y7sXBvn@@D)o5)ugN)WMAw_7sSfj|brR?XV|~Tq +z`Up(&ga8LQfp}moQAzFY4%)q^%fG0Lacvo{>40n{y2=I|Qozx;_~kBk|0=?wC!Bgh +zY6{0fC502)De^qyJ=+$axBDm&Vep$F3+1d2uayQ)p)P=;%M628kUt(QNzkQIN +zzaHp0mF&-lVa;rye?SApGWl@Q0nT&Gw5ei*D1(rtXU-zo62!Bz?M;ag%xiBUGg&H4 +z-^h0UTe4HMYLm{&Mer`~;;b#DIn=j9q^S~V;O +z$juDHUS(ISmK@uCfP0qay4Eyo@ee+-rhtz{1(Ao(5HgWyP<_ZY8^820RnDYNyd0$N +z(2xvpL3jpK1nccpSZ_fZ$G>IdEm6C;uo@Ut(muDlxe}81EPCnR@s1#~LeC-8_nP^3 +zXcE2OLYylODB5aoN*2t#0ePL43SO5S_c~B0 +z)wb0PIrPtsNQ?s<`G8EyxgSE`E(K#eAHzqjr7?+La)tXO4dr%p_DEv^pLs!?~g()LJ=ln$dv_3Y6atv$loA!ezTv&E>9(;Br~ +zvoUI~5UMmtL9p@k?cjy-8pN=*1S-Te~u^OnLFqz;@y7 +zsbsn?KXxqKkmm%2<|cMRcxUdUC$#N;IWGJG+3sT)#*I*+7PRqeqU!Df52u}&Rly9? +zN9(Jpj5JiXO}~EHBNoo?b@GA=grhpj6|K24)L84#^hB$Q#pXvo5)QPDU<2RU#QiVD +zfwzyF?hrtWv?noI)|MHa;B~Vn%~4rt?MPrL<5E$1s-sAF8A85V(&DQL@8yjSL4!iJ +zQfMIu+~WPp(=&EE*r1xucj~jW2gR8kK*FAlANSvFX?a|Y&qE6P*ESiB+Y1Fkr#H&3 +zldBc~@^Mn}oYBIU2ftf?h=9esy?hqSv5l3^aBVi#aMDkHMBW*Ys-;|or`ZBevg*=_ +zJ7H-~fWy9>%O6_ui&dDv#;fe@C|i7jiwXSx;#n-E`kS>Hk&FyFWdYJNBE=>68p$KXX7IAc+4F6wH(a79oH}=1PIGWFc!lZG2^bAZPlD +z_IK(dMKG%PB(!zUk{TCLh4xUQW$7aI*V|IQR9ZY;|Naab$F^5r?bA0)dg$Q=MXc#{z4y(z7*z8*FOmgUs6jw>|!*5e^dld+jbn{(QGt_#y{>$l2yvu +zVER4Lz}FQ9B?8146y$429u4NqhS0>@5$!7i7GiQzTon3 +zNN6KWB`Z7qngUBYftDNq^Nzb1|>z~{v3J$N&!k)Rx~E# +ziY7NE-Kk&$q3P8gP~IdsdBU5G!Nf;|rZG3r@cE*n`^vF=z4qYoX&04kV7p|oZ&II# +z66KG@*)`;U_L@ilo8wscwx7t!4!+s3@w^qZVyzyG>RYcyRYdAE&&Ci3m@21ZaLZr~ +zocp-U`QQ}1x%Y2ex8_gf%a~s=Ch1<__2wtsKK)3JA}a`G{H?K&9)40Ad_C|!$FfK7 +zjGW&f5i!*--}s^kikj(Bt{aIUNb5IR2-Dzy-luIh0IAG_c{))SJ$=0%?X!-+ZPN3L +zb|zOWk{B!1d+qbhVp%aWbz8I2P;)cKTw}bZT!r5d0sftTD}&}*&yJ`t9_MhYafzd4 +zJR2rYcnulgLz&bWbl*s_|L`#x+v~TU4~w0zUwhk@juP?DZspUDR391r)-4UeYsUCv +zUM}}CA|@N{9q9FMNRKH%L#}o~_uM(u*Sd3hQ{RML^;#P9(o4^eh` +z0n&KYpnBNp`C~;2xeEERCZ9_R?-eZ8wyCJU>xs;R3%0Ky5mjgAir6Pkhs~e+@YMC< +z{a``aB45g@BX7;)EPSio>NPG&1(%*jlxm!Q7c19<_FteIzntjx%EQ@sn#(Cund?s* +zgYP0)-*8ndf$JS(w5f1lvs7NFYzTNK6DKK9Hl4QAJ{~!h(DRbG=wF*?3dGfkRX@fq31kf106sNl#apEAr5lZ +zz}8O`VP#-ErhPR_FX1bo3g@eaDNd^;w!C5OW@~RA +zP0lW_Av6)Aeap|j?^WalSXlL3E$4OA^|`YhdbD +zXN+yWB=yd*cW$wmDkd34&W^dk4U$5b(q4!dN~H2UxT{q9HV;v|3B}l3_N1MRyUqA) +z+>207DVG*SU{to6N`c+)>Z1iWBUrkh-dMSlb8~PlWuR%*?8K=oI}(?|Ozvc^d4V0& +zaQV$Gvh^axE%?NwlR>H2x=aF;sDbQx8cD*LYNXrovStKE&uy<$1O`bz@2t`mM(>Dd +z#9NkK#fUo@miN`=ytL~9h7_kn*r`KCQ5P;0!nyw3tkq~U2G-qEMkZF9ajQeD+){$x +zZVl=Zh7F?vS&mK49(u(tr)TlPd6jifV +zG*5CV>7quSNP9wQ))*5HHbWg!Wa+YVt3HUftVhqE77c8;^?@fTMkVMGw5TjeIQBYr +z8@&^9>}w=te9`RW7fLk}7sX=6<>E`LC$=ij%GA(#Xc~Nm%59ipSqeTib&v#I5?S@( +zWVu#ka#COJYx^mX-16}End%jKDl+N>cNK4To8EXPQmO1y(Au4MJF~RUX5N#P{=>HN +zo2#YM-sZW}2_7YXc!G2*&F&U#ReWLM6kBVxnC#H0)a=m8+4_KLU?&6ezs>GxT|+Sa-fTqG7QxcIuE +zzg^1j8SEl9Xrt5P-zPVEr|Q>PuGdv>Z@m5t@3!i!$HFx?MUuZ2Bh6)1YTJWv}5v>`3sUt91z$N`n{M( +zzStBik1;B~!C4q!zqwrI+vG#~#`u-7VsoZ&o;;p!=CxodK=xTs;Gv%UzqeBUw>XQ> +zVDOzF2!lYimTu0ot50p4TJ)!YvWu&9UCz-36wtR(U#Yab_5Cw3`>22AEcc~#p*XL +z`&tHA1g*|%!=PXI)?jVw^`Vz(DFsy?_hwg~%ZW(11B*|@uwIF7TSU=wtq{?4C&+mn +z+RL`7-jBr)uD_1Ca8{TaLbbe<`a~1)p;G;G+W{Z{fUbP<>`f5*|Cet5L*7(Lv-tvC +z>Jz-);)4$57XkQNGwjY%G~x3z(d77f_HjhzdHXqqOB}~5s(MOZlHnM=u#KIrCGmZKwjoO +z#h?(;azCnD*ILg;c`w@6B0=EY1AED97Ys|nGu^d#Q5B02y`@)=mTTJxFS{yjX(H*D +z^CJn7{t%@eYcF2vsq +z)s`u>8cETmnTX$)Io!FKz`3|Lk2KbgGV#Tek6g3b!*%Y*3_(MN8-md+riB-6!Fw}z +zFB!%g1L86=Gc)sl2VYw(I@T4l2Tgkc?tW%t4!nlVF+z$How&J1vk%BCIRukAx}*O_ +z81{Y1v+ocXYlR8|>28IN=x^p}S{B%dgCh*PBPbECmJ|V-8TKqW#EDM8i2zt(zHQ(k +zphf^yPN^~0j3{aFSy!+)xF|LA05y1V(@4V96nKICf9ckKa`^F+DYa0((>A5|Ya#vD +zQC1dS#I&FGQ0={De;lfU>@3FtqgV3HCl4T1Y>$`28`Lb!s}1`V3quSVSL2gQQ@Qqa +zj(Z>&P`qnEpe)CldwM^i*Zn8i(l@^5e@@dC^9dOiw=`klVpbpAt24PDg;ZZaS9-(W +ze4tM+5_?kEDtKtEo92I)j@n*Y>>Nv^V>KV0L5I +zk^mKRDwE|Fkxw>!6{5K%8O?!?ig~U9 +z)8#KI&3D>Na5~mG3@u`Z6PG$5uDNm4RdDe3uwkj$KgxLYXX}!XF#dzHc~o~dSh|+W +zsxht6J1<;W>43E0w78U1p%Rv9Xp>OpLwNGnDlE4dD|E!Pe;CLloH!}Hh$|}fAU$Ku +zH5-U?BK4FnTlah0J_SLEl|*m%s`Kp#Wxub)4BIFFXOUhhy6JF&BRil~UcuI`>Ar +zl@(yOLxrsJFWLvsj*c(@=UhAFIe=@vpyZP);NE=n%Se0TzBK&%3)LT%myc>)QiisC +z5#GJaHswowS84l)nPZ< +zMwGmNBDL4Gi2Z0V`NvTJSwS}p8 +z!Fcd4l5<>oLXrV#QisU2V7rOd??RGpmdt$MgCA&P8KP>meA@Kb!9fJA0FQ+2&r%wq +zkq6jW4*?jWstHhsfGQ5T)>mtMPinnJD0TTN2$>Y1@#CQ^melFVS;E;m4yS~{V1KTx+gS%19&>xA^ +p0~TzT#KDg{5~?iunZb02JwCv-fD=R%Is*LNQM-G)?50)N{{X-*nYRD{ + +literal 0 +HcmV?d00001 + +diff --git a/front_end/entrypoint_template.html b/front_end/entrypoint_template.html +index 1edaec9604..945aa6d816 100644 +--- a/front_end/entrypoint_template.html ++++ b/front_end/entrypoint_template.html +@@ -14,7 +14,30 @@ + } + } + +- ++ + +- ++ + +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0003-Support-previewing-subrequest-responses.patch b/packages/wrangler-devtools/patches/0003-Support-previewing-subrequest-responses.patch new file mode 100644 index 000000000000..a2e4a9fad852 --- /dev/null +++ b/packages/wrangler-devtools/patches/0003-Support-previewing-subrequest-responses.patch @@ -0,0 +1,63 @@ +From 95b2dc1f6cf0f02c3c52da17c0cec1f6fdbf6035 Mon Sep 17 00:00:00 2001 +From: Workers DevProd +Date: Mon, 2 Oct 2023 18:22:08 +0100 +Subject: [PATCH 03/15] Support previewing subrequest responses + +--- + front_end/core/sdk/NetworkManager.ts | 7 ++++++- + front_end/entrypoints/js_app/BUILD.gn | 1 + + front_end/entrypoints/js_app/js_app.ts | 1 + + 3 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/front_end/core/sdk/NetworkManager.ts b/front_end/core/sdk/NetworkManager.ts +index c8aa624961..6201d73bba 100644 +--- a/front_end/core/sdk/NetworkManager.ts ++++ b/front_end/core/sdk/NetworkManager.ts +@@ -705,7 +705,7 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher { + this.updateNetworkRequest(networkRequest); + } + +- loadingFinished({requestId, timestamp: finishTime, encodedDataLength}: Protocol.Network.LoadingFinishedEvent): void { ++ loadingFinished({requestId, timestamp: finishTime, encodedDataLength, cfResponse}: Protocol.Network.LoadingFinishedEvent & { cfResponse?: Omit }): void { + let networkRequest: NetworkRequest|null|undefined = this.#requestsById.get(requestId); + if (!networkRequest) { + networkRequest = this.maybeAdoptMainResourceRequest(requestId); +@@ -714,6 +714,11 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher { + return; + } + this.getExtraInfoBuilder(requestId).finished(); ++ if (cfResponse !== undefined) { ++ networkRequest.setContentDataProvider(async () => { ++ return { error: null, content: cfResponse.body, encoded: cfResponse.base64Encoded }; ++ }); ++ } + this.finishNetworkRequest(networkRequest, finishTime, encodedDataLength); + this.#manager.dispatchEventToListeners(Events.LoadingFinished, networkRequest); + } +diff --git a/front_end/entrypoints/js_app/BUILD.gn b/front_end/entrypoints/js_app/BUILD.gn +index a917511e25..f811d117b1 100644 +--- a/front_end/entrypoints/js_app/BUILD.gn ++++ b/front_end/entrypoints/js_app/BUILD.gn +@@ -15,6 +15,7 @@ devtools_entrypoint("entrypoint") { + "../../generated:protocol", + "../../panels/js_profiler:meta", + "../../panels/mobile_throttling:meta", ++ "../../panels/network:meta", + "../../ui/legacy/components/utils:bundle", + "../main:bundle", + "../shell", +diff --git a/front_end/entrypoints/js_app/js_app.ts b/front_end/entrypoints/js_app/js_app.ts +index 213ca7fecd..ef5c568e96 100644 +--- a/front_end/entrypoints/js_app/js_app.ts ++++ b/front_end/entrypoints/js_app/js_app.ts +@@ -2,6 +2,7 @@ + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + import '../shell/shell.js'; ++import '../../panels/network/network-meta.js'; + import '../../panels/mobile_throttling/mobile_throttling-meta.js'; + import '../../panels/js_profiler/js_profiler-meta.js'; + +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0004-Better-Firefox-support-for-network-tab.patch b/packages/wrangler-devtools/patches/0004-Better-Firefox-support-for-network-tab.patch new file mode 100644 index 000000000000..2c20056e6b80 --- /dev/null +++ b/packages/wrangler-devtools/patches/0004-Better-Firefox-support-for-network-tab.patch @@ -0,0 +1,49 @@ +From 83b63469d06e2318f880c417c168f5494edf89fa Mon Sep 17 00:00:00 2001 +From: Samuel Macleod +Date: Thu, 19 Jan 2023 15:47:52 +0000 +Subject: [PATCH 04/15] Better Firefox support for network tab + +--- + front_end/entrypoints/js_app/js_app.ts | 2 ++ + front_end/ui/legacy/components/data_grid/DataGrid.ts | 5 +++++ + 2 files changed, 7 insertions(+) + +diff --git a/front_end/entrypoints/js_app/js_app.ts b/front_end/entrypoints/js_app/js_app.ts +index ef5c568e96..f6a3a1641f 100644 +--- a/front_end/entrypoints/js_app/js_app.ts ++++ b/front_end/entrypoints/js_app/js_app.ts +@@ -25,6 +25,8 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_); + + let jsMainImplInstance: JsMainImpl; + ++// This is not supported in Firefox: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView ++Element.prototype.scrollIntoViewIfNeeded = Element.prototype.scrollIntoView; + export class JsMainImpl implements Common.Runnable.Runnable { + static instance(opts: {forceNew: boolean|null} = {forceNew: null}): JsMainImpl { + const {forceNew} = opts; +diff --git a/front_end/ui/legacy/components/data_grid/DataGrid.ts b/front_end/ui/legacy/components/data_grid/DataGrid.ts +index 88c258f54f..0648649ccf 100644 +--- a/front_end/ui/legacy/components/data_grid/DataGrid.ts ++++ b/front_end/ui/legacy/components/data_grid/DataGrid.ts +@@ -218,6 +218,8 @@ export class DataGridImpl extends Common.ObjectWrapper.ObjectWrapper *under* the ++ (this.dataTableBody as HTMLElement).style.height = "calc(100% - 27px)" + this.topFillerRow = (this.dataTableBody.createChild('tr', 'data-grid-filler-row revealed') as HTMLElement); + UI.ARIAUtils.setHidden(this.topFillerRow, true); + this.bottomFillerRow = (this.dataTableBody.createChild('tr', 'data-grid-filler-row revealed') as HTMLElement); +@@ -500,6 +502,9 @@ export class DataGridImpl extends Common.ObjectWrapper.ObjectWrapper -Date: Fri, 25 Oct 2024 15:26:38 +0100 -Subject: [PATCH 4/8] Support viewing source files over the network. This - consists of: - -* Replacing the default file viewers (Workspace & Snippets), with a network based one called "Cloudflare" (see sources-meta.ts & js_app.ts) - -* Supporting a `?domain=` query param to customise the network name. Without this, the protocol is used (i.e. `file://`), which isn't super friendly (see NavigatorView.ts) - -* Enable JUST_MY_CODE to hide Wrangler's injected middleware (see MainImpl.ts) - -* Enable AUTHORED_DEPLOYED_GROUPING for a better grouping between source-mapped and compiled code (see MainImpl.ts) - -* Support the mechanism by which Wrangler provides sourcemaps, the wrangler-file:// protocol (see PageResourceLoader.ts & ParsedURL.ts) ---- - front_end/core/common/ParsedURL.ts | 2 +- - front_end/core/sdk/PageResourceLoader.ts | 4 +++- - front_end/entrypoints/js_app/js_app.ts | 16 ++++++-------- - front_end/entrypoints/main/MainImpl.ts | 2 ++ - front_end/panels/sources/NavigatorView.ts | 5 +++-- - front_end/panels/sources/sources-meta.ts | 26 ----------------------- - 6 files changed, 15 insertions(+), 40 deletions(-) - -diff --git a/front_end/core/common/ParsedURL.ts b/front_end/core/common/ParsedURL.ts -index 832d76c19c..968439ade4 100644 ---- a/front_end/core/common/ParsedURL.ts -+++ b/front_end/core/common/ParsedURL.ts -@@ -366,7 +366,7 @@ export class ParsedURL { - // Return special URLs as-is. - const trimmedHref = href.trim(); - if (trimmedHref.startsWith('data:') || trimmedHref.startsWith('blob:') || trimmedHref.startsWith('javascript:') || -- trimmedHref.startsWith('mailto:')) { -+ trimmedHref.startsWith('mailto:') || trimmedHref.startsWith('wrangler:')) { - return href as Platform.DevToolsPath.UrlString; - } - -diff --git a/front_end/core/sdk/PageResourceLoader.ts b/front_end/core/sdk/PageResourceLoader.ts -index 7b11de87c2..e11fbf3010 100644 ---- a/front_end/core/sdk/PageResourceLoader.ts -+++ b/front_end/core/sdk/PageResourceLoader.ts -@@ -381,7 +381,9 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper +Date: Mon, 2 Oct 2023 18:24:46 +0100 +Subject: [PATCH 05/15] Remove unsupported network UI + +--- + front_end/panels/network/NetworkPanel.ts | 35 ------------------------ + 1 file changed, 35 deletions(-) + +diff --git a/front_end/panels/network/NetworkPanel.ts b/front_end/panels/network/NetworkPanel.ts +index 65f0094c36..edad7d4781 100644 +--- a/front_end/panels/network/NetworkPanel.ts ++++ b/front_end/panels/network/NetworkPanel.ts +@@ -42,7 +42,6 @@ import * as Logs from '../../models/logs/logs.js'; + import * as TraceEngine from '../../models/trace/trace.js'; + import * as Workspace from '../../models/workspace/workspace.js'; + import * as NetworkForward from '../../panels/network/forward/forward.js'; +-import * as IconButton from '../../ui/components/icon_button/icon_button.js'; + import * as PerfUI from '../../ui/legacy/components/perf_ui/perf_ui.js'; + import * as UI from '../../ui/legacy/legacy.js'; + import * as MobileThrottling from '../mobile_throttling/mobile_throttling.js'; +@@ -74,14 +73,6 @@ const UIStrings = { + *@description Text to preserve the log after refreshing + */ + preserveLog: 'Preserve log', +- /** +- *@description Text to disable cache while DevTools is open +- */ +- disableCacheWhileDevtoolsIsOpen: 'Disable cache (while DevTools is open)', +- /** +- *@description Text in Network Config View of the Network panel +- */ +- disableCache: 'Disable cache', + /** + *@description Tooltip text that appears when hovering over the largeicon settings gear in show settings pane setting in network panel of the network panel + */ +@@ -150,10 +141,6 @@ const UIStrings = { + *@description Text in Network Panel of the Network panel + */ + fetchingFrames: 'Fetching frames...', +- /** +- * @description Text of a button in the Network panel's toolbar that open Network Conditions panel in the drawer. +- */ +- moreNetworkConditions: 'More network conditions…', + }; + const str_ = i18n.i18n.registerUIStrings('panels/network/NetworkPanel.ts', UIStrings); + const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_); +@@ -414,28 +401,6 @@ export class NetworkPanel extends UI.Panel.Panel implements UI.ContextMenu.Provi + this.panelToolbar.appendToolbarItem(new UI.Toolbar.ToolbarSettingCheckbox( + this.preserveLogSetting, i18nString(UIStrings.doNotClearLogOnPageReload), i18nString(UIStrings.preserveLog))); + +- this.panelToolbar.appendSeparator(); +- const disableCacheCheckbox = new UI.Toolbar.ToolbarSettingCheckbox( +- Common.Settings.Settings.instance().moduleSetting('cacheDisabled'), +- i18nString(UIStrings.disableCacheWhileDevtoolsIsOpen), i18nString(UIStrings.disableCache)); +- this.panelToolbar.appendToolbarItem(disableCacheCheckbox); +- +- this.panelToolbar.appendToolbarItem(this.throttlingSelect); +- +- const networkConditionsIcon = new IconButton.Icon.Icon(); +- networkConditionsIcon.data = { +- iconName: 'network-settings', +- color: 'var(--icon-default)', +- width: '20px', +- height: '20px', +- }; +- const networkConditionsButton = +- new UI.Toolbar.ToolbarButton(i18nString(UIStrings.moreNetworkConditions), networkConditionsIcon); +- networkConditionsButton.addEventListener(UI.Toolbar.ToolbarButton.Events.Click, () => { +- void UI.ViewManager.ViewManager.instance().showView('network.config'); +- }, this); +- this.panelToolbar.appendToolbarItem(networkConditionsButton); +- + this.rightToolbar.appendToolbarItem(new UI.Toolbar.ToolbarItem(this.progressBarContainer)); + this.rightToolbar.appendSeparator(); + this.rightToolbar.appendToolbarItem(new UI.Toolbar.ToolbarSettingToggle( +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0005-Support-forcing-the-devtools-theme-via-a-query-param.patch b/packages/wrangler-devtools/patches/0005-Support-forcing-the-devtools-theme-via-a-query-param.patch deleted file mode 100644 index 0c956636dc76..000000000000 --- a/packages/wrangler-devtools/patches/0005-Support-forcing-the-devtools-theme-via-a-query-param.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 0f7a1adad6b0bfbafe60fbc4c161fa9a7ef0381f Mon Sep 17 00:00:00 2001 -From: Workers DevProd -Date: Fri, 25 Oct 2024 15:05:56 +0100 -Subject: [PATCH 5/8] Support forcing the devtools theme via a query parameter, - to enable it to fit in with the Cloudflare dashboard when embedded. - -To test, make sure that `?theme=dark`, `?theme=default`, and `?theme=systemPreferred` all correctly force the theme of devtools ---- - front_end/ui/legacy/theme_support/ThemeSupport.ts | 11 ++++++++--- - 1 file changed, 8 insertions(+), 3 deletions(-) - -diff --git a/front_end/ui/legacy/theme_support/ThemeSupport.ts b/front_end/ui/legacy/theme_support/ThemeSupport.ts -index 87d8a05a43..3f5a289fd7 100644 ---- a/front_end/ui/legacy/theme_support/ThemeSupport.ts -+++ b/front_end/ui/legacy/theme_support/ThemeSupport.ts -@@ -165,14 +165,19 @@ export class ThemeSupport extends EventTarget { - } - - #applyThemeToDocument(document: Document): void { -+ // Get theme from url, to allow for theme inheritance from the Cloudflare dashboard -+ const urlParams = new URLSearchParams(document.location.search); -+ const theme = urlParams.get('theme') ?? 'systemPreferred'; -+ - const isForcedColorsMode = window.matchMedia('(forced-colors: active)').matches; - const systemPreferredTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'default'; - -- const useSystemPreferred = this.setting.get() === 'systemPreferred' || isForcedColorsMode; -- this.themeNameInternal = useSystemPreferred ? systemPreferredTheme : this.setting.get(); -+ const useSystemPreferred = theme === 'systemPreferred' || isForcedColorsMode; -+ this.themeNameInternal = useSystemPreferred ? systemPreferredTheme : theme; - document.documentElement.classList.toggle('theme-with-dark-background', this.themeNameInternal === 'dark'); - -- const useChromeTheme = Common.Settings.moduleSetting('chrome-theme-colors').get(); -+ // Disable this—it adds blue headers which are out of keeping with Cloudflare styling -+ const useChromeTheme = false; - const hostConfig = Common.Settings.Settings.instance().getHostConfig(); - const isIncognito = !hostConfig || hostConfig.isOffTheRecord === true; - // Baseline is the name of Chrome's default color theme and there are two of these: default and grayscale. --- -2.39.5 (Apple Git-154) - diff --git a/packages/wrangler-devtools/patches/0006-All-about-the-network-tab.patch b/packages/wrangler-devtools/patches/0006-All-about-the-network-tab.patch deleted file mode 100644 index a9dee1b74b0c..000000000000 --- a/packages/wrangler-devtools/patches/0006-All-about-the-network-tab.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 3b484138dabb583349363df0e2d69ffe3c1dc039 Mon Sep 17 00:00:00 2001 -From: Workers DevProd -Date: Fri, 25 Oct 2024 16:05:12 +0100 -Subject: [PATCH 6/8] All about the network tab! - -* Display the _content_ of responses (using cfResponse.body, a Cloudflare-specific extension) - -* Enable the network tab for the js_app type - -* Hide unsupported UI (cache disabling & network throttling) ---- - front_end/core/sdk/NetworkManager.ts | 8 ++++++- - front_end/entrypoints/js_app/BUILD.gn | 1 + - front_end/entrypoints/js_app/js_app.ts | 1 + - front_end/panels/network/NetworkPanel.ts | 27 ------------------------ - 4 files changed, 9 insertions(+), 28 deletions(-) - -diff --git a/front_end/core/sdk/NetworkManager.ts b/front_end/core/sdk/NetworkManager.ts -index 8735116e61..953d3fc7b1 100644 ---- a/front_end/core/sdk/NetworkManager.ts -+++ b/front_end/core/sdk/NetworkManager.ts -@@ -34,6 +34,7 @@ - - import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js'; - import * as Protocol from '../../generated/protocol.js'; -+import { ContentData } from '../../models/text_utils/ContentData.js'; - import * as TextUtils from '../../models/text_utils/text_utils.js'; - import * as Common from '../common/common.js'; - import type {Serializer} from '../common/Settings.js'; -@@ -794,7 +795,7 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher { - this.updateNetworkRequest(networkRequest); - } - -- loadingFinished({requestId, timestamp: finishTime, encodedDataLength}: Protocol.Network.LoadingFinishedEvent): void { -+ loadingFinished({requestId, timestamp: finishTime, encodedDataLength, cfResponse}: Protocol.Network.LoadingFinishedEvent & { cfResponse?: Omit }): void { - let networkRequest: NetworkRequest|null|undefined = this.#requestsById.get(requestId); - if (!networkRequest) { - networkRequest = this.maybeAdoptMainResourceRequest(requestId); -@@ -803,6 +804,11 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher { - return; - } - this.getExtraInfoBuilder(requestId).finished(); -+ if (cfResponse !== undefined) { -+ networkRequest.setContentDataProvider(async () => { -+ return new ContentData(cfResponse.body, cfResponse.base64Encoded, networkRequest.mimeType); -+ }); -+ } - this.finishNetworkRequest(networkRequest, finishTime, encodedDataLength); - this.#manager.dispatchEventToListeners(Events.LoadingFinished, networkRequest); - } -diff --git a/front_end/entrypoints/js_app/BUILD.gn b/front_end/entrypoints/js_app/BUILD.gn -index c44a7a352b..2ee6e03a03 100644 ---- a/front_end/entrypoints/js_app/BUILD.gn -+++ b/front_end/entrypoints/js_app/BUILD.gn -@@ -15,6 +15,7 @@ devtools_entrypoint("entrypoint") { - "../../generated:protocol", - "../../panels/js_timeline:meta", - "../../panels/mobile_throttling:meta", -+ "../../panels/network:meta", - "../../ui/legacy/components/utils:bundle", - "../main:bundle", - "../shell", -diff --git a/front_end/entrypoints/js_app/js_app.ts b/front_end/entrypoints/js_app/js_app.ts -index 1724a33bd4..884c6264d2 100644 ---- a/front_end/entrypoints/js_app/js_app.ts -+++ b/front_end/entrypoints/js_app/js_app.ts -@@ -4,6 +4,7 @@ - - import '../shell/shell.js'; - import '../../panels/js_timeline/js_timeline-meta.js'; -+import '../../panels/network/network-meta.js'; - import '../../panels/mobile_throttling/mobile_throttling-meta.js'; - - import * as Common from '../../core/common/common.js'; -diff --git a/front_end/panels/network/NetworkPanel.ts b/front_end/panels/network/NetworkPanel.ts -index 71c40a6873..abf30cc4e8 100644 ---- a/front_end/panels/network/NetworkPanel.ts -+++ b/front_end/panels/network/NetworkPanel.ts -@@ -75,14 +75,6 @@ const UIStrings = { - *@description Text to preserve the log after refreshing - */ - preserveLog: 'Preserve log', -- /** -- *@description Text to disable cache while DevTools is open -- */ -- disableCacheWhileDevtoolsIsOpen: 'Disable cache while DevTools is open', -- /** -- *@description Text in Network Config View of the Network panel -- */ -- disableCache: 'Disable cache', - /** - *@description Tooltip text that appears when hovering over the largeicon settings gear in show settings pane setting in network panel of the network panel - */ -@@ -158,10 +150,6 @@ const UIStrings = { - *@description Text in Network Panel that is displayed when frames are being fetched. - */ - fetchingFrames: 'Fetching frames...', -- /** -- * @description Text of a button in the Network panel's toolbar that open Network Conditions panel in the drawer. -- */ -- moreNetworkConditions: 'More network conditions…', - }; - const str_ = i18n.i18n.registerUIStrings('panels/network/NetworkPanel.ts', UIStrings); - const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_); -@@ -422,21 +410,6 @@ export class NetworkPanel extends UI.Panel.Panel implements - this.panelToolbar.appendToolbarItem(new UI.Toolbar.ToolbarSettingCheckbox( - this.preserveLogSetting, i18nString(UIStrings.doNotClearLogOnPageReload), i18nString(UIStrings.preserveLog))); - -- this.panelToolbar.appendSeparator(); -- const disableCacheCheckbox = new UI.Toolbar.ToolbarSettingCheckbox( -- Common.Settings.Settings.instance().moduleSetting('cache-disabled'), -- i18nString(UIStrings.disableCacheWhileDevtoolsIsOpen), i18nString(UIStrings.disableCache)); -- this.panelToolbar.appendToolbarItem(disableCacheCheckbox); -- -- this.panelToolbar.appendToolbarItem(this.throttlingSelect); -- -- const networkConditionsButton = new UI.Toolbar.ToolbarButton( -- i18nString(UIStrings.moreNetworkConditions), 'network-settings', undefined, 'network-conditions'); -- networkConditionsButton.addEventListener(UI.Toolbar.ToolbarButton.Events.CLICK, () => { -- void UI.ViewManager.ViewManager.instance().showView('network.config'); -- }, this); -- this.panelToolbar.appendToolbarItem(networkConditionsButton); -- - this.rightToolbar.appendToolbarItem(new UI.Toolbar.ToolbarItem(this.progressBarContainer)); - this.rightToolbar.appendSeparator(); - this.rightToolbar.appendToolbarItem(new UI.Toolbar.ToolbarSettingToggle( --- -2.39.5 (Apple Git-154) - diff --git a/packages/wrangler-devtools/patches/0006-Remove-unsupported-profiler-UI.patch b/packages/wrangler-devtools/patches/0006-Remove-unsupported-profiler-UI.patch new file mode 100644 index 000000000000..247326b45aac --- /dev/null +++ b/packages/wrangler-devtools/patches/0006-Remove-unsupported-profiler-UI.patch @@ -0,0 +1,39 @@ +From a1602867b77541604c03f67da518044bb2209f8a Mon Sep 17 00:00:00 2001 +From: Workers DevProd +Date: Mon, 2 Oct 2023 18:26:03 +0100 +Subject: [PATCH 06/15] Remove unsupported profiler UI + +--- + front_end/panels/profiler/HeapProfilerPanel.ts | 2 +- + front_end/panels/profiler/ProfilesPanel.ts | 2 -- + 2 files changed, 1 insertion(+), 3 deletions(-) + +diff --git a/front_end/panels/profiler/HeapProfilerPanel.ts b/front_end/panels/profiler/HeapProfilerPanel.ts +index 02a484f266..9d6b63c3ed 100644 +--- a/front_end/panels/profiler/HeapProfilerPanel.ts ++++ b/front_end/panels/profiler/HeapProfilerPanel.ts +@@ -26,7 +26,7 @@ export class HeapProfilerPanel extends ProfilesPanel implements UI.ContextMenu.P + constructor() { + const registry = instance; + const profileTypes = +- [registry.heapSnapshotProfileType, registry.trackingHeapSnapshotProfileType, registry.samplingHeapProfileType]; ++ [registry.heapSnapshotProfileType]; + super('heap_profiler', profileTypes as ProfileType[], 'profiler.heap-toggle-recording'); + } + +diff --git a/front_end/panels/profiler/ProfilesPanel.ts b/front_end/panels/profiler/ProfilesPanel.ts +index e865c98e21..a175dfb050 100644 +--- a/front_end/panels/profiler/ProfilesPanel.ts ++++ b/front_end/panels/profiler/ProfilesPanel.ts +@@ -170,8 +170,6 @@ export class ProfilesPanel extends UI.Panel.PanelWithSidebar implements DataDisp + this.clearResultsButton = new UI.Toolbar.ToolbarButton(i18nString(UIStrings.clearAllProfiles), 'clear'); + this.clearResultsButton.addEventListener(UI.Toolbar.ToolbarButton.Events.Click, this.reset, this); + toolbar.appendToolbarItem(this.clearResultsButton); +- toolbar.appendSeparator(); +- toolbar.appendToolbarItem(UI.Toolbar.Toolbar.createActionButtonForId('components.collect-garbage')); + + this.profileViewToolbar = new UI.Toolbar.Toolbar('', this.toolbarElement); + this.profileViewToolbar.makeWrappable(true); +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0007-Limit-heap-profiling-modes-available.patch b/packages/wrangler-devtools/patches/0007-Limit-heap-profiling-modes-available.patch deleted file mode 100644 index 8fa7a21e1e28..000000000000 --- a/packages/wrangler-devtools/patches/0007-Limit-heap-profiling-modes-available.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 01012531546fccc62536fba7d1bfde6c5cc1a6c2 Mon Sep 17 00:00:00 2001 -From: Workers DevProd -Date: Fri, 25 Oct 2024 16:07:24 +0100 -Subject: [PATCH 7/8] Limit heap profiling modes available - ---- - front_end/panels/profiler/HeapProfilerPanel.ts | 8 ++------ - 1 file changed, 2 insertions(+), 6 deletions(-) - -diff --git a/front_end/panels/profiler/HeapProfilerPanel.ts b/front_end/panels/profiler/HeapProfilerPanel.ts -index c5670bd8e4..cbb63b9a8a 100644 ---- a/front_end/panels/profiler/HeapProfilerPanel.ts -+++ b/front_end/panels/profiler/HeapProfilerPanel.ts -@@ -25,12 +25,8 @@ export class HeapProfilerPanel extends ProfilesPanel implements UI.ContextMenu.P - UI.ActionRegistration.ActionDelegate { - constructor() { - const registry = instance; -- const profileTypes = [ -- registry.heapSnapshotProfileType, -- registry.trackingHeapSnapshotProfileType, -- registry.samplingHeapProfileType, -- registry.detachedElementProfileType, -- ]; -+ const profileTypes = -+ [registry.heapSnapshotProfileType]; - super('heap-profiler', profileTypes as ProfileType[], 'profiler.heap-toggle-recording'); - } - --- -2.39.5 (Apple Git-154) - diff --git a/packages/wrangler-devtools/patches/0007-Support-theme-url-parameter-for-forcing-the-theme-fr.patch b/packages/wrangler-devtools/patches/0007-Support-theme-url-parameter-for-forcing-the-theme-fr.patch new file mode 100644 index 000000000000..86581a3bbcce --- /dev/null +++ b/packages/wrangler-devtools/patches/0007-Support-theme-url-parameter-for-forcing-the-theme-fr.patch @@ -0,0 +1,45 @@ +From 8b11e3150fbb5b70d328888664475ca9ebec39fa Mon Sep 17 00:00:00 2001 +From: Samuel Macleod +Date: Fri, 20 Jan 2023 19:19:37 +0000 +Subject: [PATCH 07/15] Support theme= url parameter for forcing the theme from + outside + +--- + .../ui/legacy/theme_support/theme_support_impl.ts | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +diff --git a/front_end/ui/legacy/theme_support/theme_support_impl.ts b/front_end/ui/legacy/theme_support/theme_support_impl.ts +index a16673168f..04bac851d3 100644 +--- a/front_end/ui/legacy/theme_support/theme_support_impl.ts ++++ b/front_end/ui/legacy/theme_support/theme_support_impl.ts +@@ -134,19 +134,21 @@ export class ThemeSupport extends EventTarget { + } + + applyTheme(document: Document): void { ++ const currentSetting = this.setting.get() ++ // Get theme from url, to allow for theme inheritance from the Cloudflare dashboard ++ const urlParams = new URLSearchParams(document.location.search); ++ const theme = urlParams.get("theme") ?? 'systemPreferred' + const isForcedColorsMode = window.matchMedia('(forced-colors: active)').matches; + const systemPreferredTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'default'; + +- const useSystemPreferred = this.setting.get() === 'systemPreferred' || isForcedColorsMode; +- this.themeNameInternal = useSystemPreferred ? systemPreferredTheme : this.setting.get(); ++ const useSystemPreferred = theme === 'systemPreferred' || isForcedColorsMode; ++ this.themeNameInternal = useSystemPreferred ? systemPreferredTheme : theme; + +- const wasDarkThemed = document.documentElement.classList.contains('-theme-with-dark-background'); + document.documentElement.classList.toggle('-theme-with-dark-background', this.themeNameInternal === 'dark'); + +- const isDarkThemed = document.documentElement.classList.contains('-theme-with-dark-background'); +- ++ this.setting.set(theme) + // In the event the theme changes we need to clear caches and notify subscribers. +- if (wasDarkThemed !== isDarkThemed) { ++ if (currentSetting !== theme) { + themeValuesCache.clear(); + this.customSheets.clear(); + this.dispatchEvent(new ThemeChangeEvent()); +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0008-Basic-support-for-text-colour-in-dark-mode-in-browse.patch b/packages/wrangler-devtools/patches/0008-Basic-support-for-text-colour-in-dark-mode-in-browse.patch new file mode 100644 index 000000000000..f9c8b2eb691f --- /dev/null +++ b/packages/wrangler-devtools/patches/0008-Basic-support-for-text-colour-in-dark-mode-in-browse.patch @@ -0,0 +1,73 @@ +From 4f06ecdab94922e227b3f4d098d0875efbb724a1 Mon Sep 17 00:00:00 2001 +From: Samuel Macleod +Date: Mon, 23 Jan 2023 15:12:38 +0000 +Subject: [PATCH 08/15] Basic support for text colour in dark mode in browsers + that don't implement :host-context + +--- + front_end/entrypoint_template.html | 38 ++++++++++++++++++++++++------ + 1 file changed, 31 insertions(+), 7 deletions(-) + +diff --git a/front_end/entrypoint_template.html b/front_end/entrypoint_template.html +index 945aa6d816..14d3e0071b 100644 +--- a/front_end/entrypoint_template.html ++++ b/front_end/entrypoint_template.html +@@ -13,8 +13,34 @@ + background-color: rgb(41 42 45); + } + } ++ ++ .platform-mac { ++ --monospace-font-size: 11px; ++ --monospace-font-family: menlo, monospace; ++ --source-code-font-size: 11px; ++ --source-code-font-family: menlo, monospace; ++ } ++ ++ .platform-windows { ++ --monospace-font-size: 12px; ++ --monospace-font-family: consolas, lucida console, courier new, monospace; ++ --source-code-font-size: 12px; ++ --source-code-font-family: consolas, lucida console, courier new, monospace; ++ } ++ ++ .platform-linux { ++ --monospace-font-size: 11px; ++ --monospace-font-family: dejavu sans mono, monospace; ++ --source-code-font-size: 11px; ++ --source-code-font-family: dejavu sans mono, monospace; ++ } ++ ++ .-theme-with-dark-background .platform-linux, ++ .-theme-with-dark-background .platform-mac { ++ --override-text-color: rgb(189 198 207); ++ } + +- ++ + + ++ ++ + +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0008-Use-the-worker-name-as-the-title-for-the-Javascript-.patch b/packages/wrangler-devtools/patches/0008-Use-the-worker-name-as-the-title-for-the-Javascript-.patch deleted file mode 100644 index f5b5fb15a81d..000000000000 --- a/packages/wrangler-devtools/patches/0008-Use-the-worker-name-as-the-title-for-the-Javascript-.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 57b100b2455fc3adb794218c4d15c44052a16f52 Mon Sep 17 00:00:00 2001 -From: Workers DevProd -Date: Fri, 25 Oct 2024 16:11:10 +0100 -Subject: [PATCH 8/8] Use the worker name as the title for the Javascript - Isolate name in the Performance tab - ---- - front_end/panels/timeline/IsolateSelector.ts | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/front_end/panels/timeline/IsolateSelector.ts b/front_end/panels/timeline/IsolateSelector.ts -index 11cba9dc15..145a526353 100644 ---- a/front_end/panels/timeline/IsolateSelector.ts -+++ b/front_end/panels/timeline/IsolateSelector.ts -@@ -52,8 +52,12 @@ export class IsolateSelector extends UI.Toolbar.ToolbarItem implements SDK.Isola - const name = SDK.TargetManager.TargetManager.instance().rootTarget() !== target ? target.name() : ''; - const parsedURL = new Common.ParsedURL.ParsedURL(target.inspectedURL()); - const domain = parsedURL.isValid ? parsedURL.domain() : ''; -+ -+ const query = new URLSearchParams(location.search); -+ const workerName = query.get('domain'); -+ - const title = -- target.decorateLabel(domain && name ? `${domain}: ${name}` : name || domain || i18nString(UIStrings.empty)); -+ target.decorateLabel(domain && name ? `${domain}: ${name}` : name || domain || workerName || i18nString(UIStrings.empty)); - modelCountByName.set(title, (modelCountByName.get(title) || 0) + 1); - } - itemForIsolate.removeChildren(); --- -2.39.5 (Apple Git-154) - diff --git a/packages/wrangler-devtools/patches/0009-Fallback-to-location-for-domain.patch b/packages/wrangler-devtools/patches/0009-Fallback-to-location-for-domain.patch new file mode 100644 index 000000000000..254b01b00562 --- /dev/null +++ b/packages/wrangler-devtools/patches/0009-Fallback-to-location-for-domain.patch @@ -0,0 +1,26 @@ +From 597f5cee506058efa09d952b94e7b9a2ad384e9d Mon Sep 17 00:00:00 2001 +From: Samuel Macleod +Date: Thu, 26 Jan 2023 15:27:04 +0000 +Subject: [PATCH 09/15] Fallback to location for domain + +--- + front_end/panels/sources/NavigatorView.ts | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/front_end/panels/sources/NavigatorView.ts b/front_end/panels/sources/NavigatorView.ts +index 01532aa06a..72c037d297 100644 +--- a/front_end/panels/sources/NavigatorView.ts ++++ b/front_end/panels/sources/NavigatorView.ts +@@ -792,7 +792,8 @@ export class NavigatorView extends UI.Widget.VBox implements SDK.TargetManager.O + } + + if (!projectOrigin) { +- return i18nString(UIStrings.noDomain); ++ const query = new URLSearchParams(location.search) ++ return query.get("domain") ?? i18nString(UIStrings.noDomain); + } + + const parsedURL = new Common.ParsedURL.ParsedURL(projectOrigin); +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0010-Hide-unsupported-settings-UI.patch b/packages/wrangler-devtools/patches/0010-Hide-unsupported-settings-UI.patch new file mode 100644 index 000000000000..005f09cd6c54 --- /dev/null +++ b/packages/wrangler-devtools/patches/0010-Hide-unsupported-settings-UI.patch @@ -0,0 +1,66 @@ +From 3c9b2a24e6afefffe5485516fab7bfb38107c9d6 Mon Sep 17 00:00:00 2001 +From: bcoll +Date: Thu, 26 Jan 2023 15:30:34 +0000 +Subject: [PATCH 10/15] Hide unsupported settings UI + +- Show CORS errors in console setting +- Show XHR requests in console setting +- Disable JavaScript setting +- Devices settings tab +- Throttling settings tab +--- + front_end/panels/console/ConsoleView.ts | 4 ---- + front_end/panels/settings/SettingsScreen.ts | 4 ++++ + front_end/panels/settings/settingsScreen.css | 5 +++++ + 3 files changed, 9 insertions(+), 4 deletions(-) + +diff --git a/front_end/panels/console/ConsoleView.ts b/front_end/panels/console/ConsoleView.ts +index eb61914002..f7b9f0a912 100644 +--- a/front_end/panels/console/ConsoleView.ts ++++ b/front_end/panels/console/ConsoleView.ts +@@ -468,14 +468,10 @@ export class ConsoleView extends UI.Widget.VBox implements + i18nString(UIStrings.onlyShowMessagesFromTheCurrentContext), i18nString(UIStrings.selectedContextOnly)); + ConsoleView.appendSettingsCheckboxToToolbar( + settingsToolbarLeft, this.groupSimilarSetting, i18nString(UIStrings.groupSimilarMessagesInConsole)); +- ConsoleView.appendSettingsCheckboxToToolbar( +- settingsToolbarLeft, this.showCorsErrorsSetting, i18nString(UIStrings.showCorsErrorsInConsole)); + + const settingsToolbarRight = new UI.Toolbar.Toolbar('', settingsPane.element); + settingsToolbarRight.makeVertical(); + +- ConsoleView.appendSettingsCheckboxToToolbar( +- settingsToolbarRight, monitoringXHREnabledSetting, i18nString(UIStrings.logXMLHttpRequests)); + ConsoleView.appendSettingsCheckboxToToolbar( + settingsToolbarRight, 'consoleEagerEval', i18nString(UIStrings.eagerlyEvaluateTextInThePrompt)); + ConsoleView.appendSettingsCheckboxToToolbar( +diff --git a/front_end/panels/settings/SettingsScreen.ts b/front_end/panels/settings/SettingsScreen.ts +index a1c443c74e..3648b2d74a 100644 +--- a/front_end/panels/settings/SettingsScreen.ts ++++ b/front_end/panels/settings/SettingsScreen.ts +@@ -379,6 +379,10 @@ export class GenericSettingsTab extends SettingsTab { + const uiSectionName = Common.Settings.getLocalizedSettingsCategory(category); + const sectionElement = this.appendSection(uiSectionName); + for (const settingRegistration of settings) { ++ const name = settingRegistration.settingName; ++ if (name === "monitoringXHREnabled" || name === "consoleShowsCorsErrors" || name === "javaScriptDisabled") { ++ continue; ++ } + const setting = Common.Settings.Settings.instance().moduleSetting(settingRegistration.settingName); + const settingControl = UI.SettingsUI.createControlForSetting(setting); + if (settingControl) { +diff --git a/front_end/panels/settings/settingsScreen.css b/front_end/panels/settings/settingsScreen.css +index 583c2e345e..e574de5002 100644 +--- a/front_end/panels/settings/settingsScreen.css ++++ b/front_end/panels/settings/settingsScreen.css +@@ -238,3 +238,8 @@ label { + color: HighlightText; + } + } ++ ++#tab-devices, ++#tab-throttling-conditions { ++ display: none; ++} +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0003-Add-ping-to-improve-connection-stability.-Without-th.patch b/packages/wrangler-devtools/patches/0011-Add-ping-to-improve-connection-stability.patch similarity index 60% rename from packages/wrangler-devtools/patches/0003-Add-ping-to-improve-connection-stability.-Without-th.patch rename to packages/wrangler-devtools/patches/0011-Add-ping-to-improve-connection-stability.patch index f480c65b59f1..e6f9a96e3bc4 100644 --- a/packages/wrangler-devtools/patches/0003-Add-ping-to-improve-connection-stability.-Without-th.patch +++ b/packages/wrangler-devtools/patches/0011-Add-ping-to-improve-connection-stability.patch @@ -1,31 +1,30 @@ -From 233ae8633d7a84f662ebdea564070fcbee2f42d4 Mon Sep 17 00:00:00 2001 -From: Workers DevProd -Date: Fri, 25 Oct 2024 15:04:17 +0100 -Subject: [PATCH 3/8] Add ping to improve connection stability. Without this, - we see frequent "Devtools disconnected" messages in the dash and Workers - Playground +From b2e4d126f70ba0a96163411c7bd60c2fe7af4872 Mon Sep 17 00:00:00 2001 +From: Samuel Macleod +Date: Thu, 4 May 2023 03:21:58 +0100 +Subject: [PATCH 11/15] Add ping to improve connection stability --- - front_end/core/protocol_client/InspectorBackend.ts | 8 ++++++++ - 1 file changed, 8 insertions(+) + front_end/core/protocol_client/InspectorBackend.ts | 9 +++++++++ + 1 file changed, 9 insertions(+) diff --git a/front_end/core/protocol_client/InspectorBackend.ts b/front_end/core/protocol_client/InspectorBackend.ts -index ad2d1fe357..d7af79ede5 100644 +index 99e6b17d14..1263a56cc7 100644 --- a/front_end/core/protocol_client/InspectorBackend.ts +++ b/front_end/core/protocol_client/InspectorBackend.ts -@@ -259,6 +259,7 @@ export class SessionRouter { +@@ -259,6 +259,8 @@ export class SessionRouter { proxyConnection: ((Connection | undefined)|null), }>; #pendingScripts: (() => void)[]; + #pingInterval: ReturnType; ++ constructor(connection: Connection) { this.#connectionInternal = connection; -@@ -276,11 +277,18 @@ export class SessionRouter { +@@ -276,11 +278,18 @@ export class SessionRouter { this.#connectionInternal.setOnMessage(this.onMessage.bind(this)); this.#connectionInternal.setOnDisconnect(reason => { -+ clearInterval(this.#pingInterval); ++ clearInterval(this.#pingInterval) const session = this.#sessions.get(''); if (session) { session.target.dispose(reason); @@ -33,7 +32,7 @@ index ad2d1fe357..d7af79ede5 100644 }); + this.#pingInterval = setInterval(() => { + this.#connectionInternal.sendRawMessage(JSON.stringify({ -+ method: 'Runtime.getIsolateId', ++ method: "Runtime.getIsolateId", + id: this.nextMessageId(), + })); + }, 10_000); @@ -41,5 +40,5 @@ index ad2d1fe357..d7af79ede5 100644 registerSession(target: TargetBase, sessionId: string, proxyConnection?: Connection|null): void { -- -2.39.5 (Apple Git-154) +2.39.3 (Apple Git-145) diff --git a/packages/wrangler-devtools/patches/0012-Support-sourcemaps.patch b/packages/wrangler-devtools/patches/0012-Support-sourcemaps.patch new file mode 100644 index 000000000000..ccc2260e833c --- /dev/null +++ b/packages/wrangler-devtools/patches/0012-Support-sourcemaps.patch @@ -0,0 +1,60 @@ +From 85b0de956a4c57150c9b43fd1e6096074809df27 Mon Sep 17 00:00:00 2001 +From: Workers DevProd +Date: Mon, 2 Oct 2023 18:30:44 +0100 +Subject: [PATCH 12/15] Support sourcemaps: + + * Recognise `wrangler://` URLs as "special", and always load them with Network.loadNetworkResource + + * Support a `text` property on the response to `Network.loadNetworkResource` to support providing a raw response, rather than a response stream + + * Enable the experimental `AUTHORED_DEPLOYED_GROUPING` and `JUST_MY_CODE` by default, for a better splitting of sourcemapped/deployed Worker code +--- + front_end/core/common/ParsedURL.ts | 2 +- + front_end/core/sdk/PageResourceLoader.ts | 4 +++- + front_end/entrypoints/main/MainImpl.ts | 2 ++ + 3 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/front_end/core/common/ParsedURL.ts b/front_end/core/common/ParsedURL.ts +index 7e667fc467..d4719f900d 100644 +--- a/front_end/core/common/ParsedURL.ts ++++ b/front_end/core/common/ParsedURL.ts +@@ -358,7 +358,7 @@ export class ParsedURL { + // Return special URLs as-is. + const trimmedHref = href.trim(); + if (trimmedHref.startsWith('data:') || trimmedHref.startsWith('blob:') || trimmedHref.startsWith('javascript:') || +- trimmedHref.startsWith('mailto:')) { ++ trimmedHref.startsWith('mailto:') || trimmedHref.startsWith('wrangler:')) { + return href as Platform.DevToolsPath.UrlString; + } + +diff --git a/front_end/core/sdk/PageResourceLoader.ts b/front_end/core/sdk/PageResourceLoader.ts +index be22f944c1..190b4c3891 100644 +--- a/front_end/core/sdk/PageResourceLoader.ts ++++ b/front_end/core/sdk/PageResourceLoader.ts +@@ -338,7 +338,9 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper +Date: Wed, 4 Oct 2023 00:57:43 +0100 +Subject: [PATCH 13/15] Enable debugger when query parameter `debugger` is true + +--- + front_end/panels/sources/DebuggerPlugin.ts | 7 +++- + front_end/panels/sources/SourcesPanel.ts | 18 +++++--- + front_end/panels/sources/sources-meta.ts | 49 ++++++++++++---------- + 3 files changed, 44 insertions(+), 30 deletions(-) + +diff --git a/front_end/panels/sources/DebuggerPlugin.ts b/front_end/panels/sources/DebuggerPlugin.ts +index c403f0e37f..d7f8798497 100644 +--- a/front_end/panels/sources/DebuggerPlugin.ts ++++ b/front_end/panels/sources/DebuggerPlugin.ts +@@ -253,10 +253,13 @@ export class DebuggerPlugin extends Plugin { + this.scriptsPanel = SourcesPanel.instance(); + this.breakpointManager = Breakpoints.BreakpointManager.BreakpointManager.instance(); + +- this.breakpointManager.addEventListener( ++ const debuggerEnabled = Root.Runtime.Runtime.queryParam('debugger') === 'true'; ++ if (debuggerEnabled) { ++ this.breakpointManager.addEventListener( + Breakpoints.BreakpointManager.Events.BreakpointAdded, this.breakpointChange, this); +- this.breakpointManager.addEventListener( ++ this.breakpointManager.addEventListener( + Breakpoints.BreakpointManager.Events.BreakpointRemoved, this.breakpointChange, this); ++ } + + this.uiSourceCode.addEventListener(Workspace.UISourceCode.Events.WorkingCopyChanged, this.workingCopyChanged, this); + this.uiSourceCode.addEventListener( +diff --git a/front_end/panels/sources/SourcesPanel.ts b/front_end/panels/sources/SourcesPanel.ts +index 8a06b6c6e9..10f2c33c86 100644 +--- a/front_end/panels/sources/SourcesPanel.ts ++++ b/front_end/panels/sources/SourcesPanel.ts +@@ -242,6 +242,11 @@ export class SourcesPanel extends UI.Panel.Panel implements UI.ContextMenu.Provi + this.splitWidget.enableShowModeSaving(); + this.splitWidget.show(this.element); + ++ const debuggerEnabled = Root.Runtime.Runtime.queryParam('debugger') === 'true'; ++ if (!debuggerEnabled) { ++ this.splitWidget.hideSidebar(false); ++ } ++ + // Create scripts navigator + const initialNavigatorWidth = 225; + this.editorView = +@@ -347,12 +352,15 @@ export class SourcesPanel extends UI.Panel.Panel implements UI.ContextMenu.Provi + panel.splitWidget.installResizer(panel.sourcesViewInternal.toolbarContainerElement()); + } + if (!isInWrapper) { +- panel.sourcesViewInternal.leftToolbar().appendToolbarItem(panel.toggleNavigatorSidebarButton); +- if (panel.splitWidget.isVertical()) { +- panel.sourcesViewInternal.rightToolbar().appendToolbarItem(panel.toggleDebuggerSidebarButton); +- } else { +- panel.sourcesViewInternal.bottomToolbar().appendToolbarItem(panel.toggleDebuggerSidebarButton); ++ const debuggerEnabled = Root.Runtime.Runtime.queryParam('debugger') === 'true'; ++ if (debuggerEnabled) { ++ if (panel.splitWidget.isVertical()) { ++ panel.sourcesViewInternal.rightToolbar().appendToolbarItem(panel.toggleDebuggerSidebarButton); ++ } else { ++ panel.sourcesViewInternal.bottomToolbar().appendToolbarItem(panel.toggleDebuggerSidebarButton); ++ } + } ++ panel.sourcesViewInternal.leftToolbar().appendToolbarItem(panel.toggleNavigatorSidebarButton); + } + } + +diff --git a/front_end/panels/sources/sources-meta.ts b/front_end/panels/sources/sources-meta.ts +index 4b8244ea69..749065fdeb 100644 +--- a/front_end/panels/sources/sources-meta.ts ++++ b/front_end/panels/sources/sources-meta.ts +@@ -609,6 +609,32 @@ UI.ActionRegistration.registerActionExtension({ + ], + }); + ++const debuggerEnabled = Root.Runtime.Runtime.queryParam('debugger') === 'true'; ++if (debuggerEnabled) { ++ UI.ActionRegistration.registerActionExtension({ ++ actionId: 'sources.toggle-debugger-sidebar', ++ category: UI.ActionRegistration.ActionCategory.SOURCES, ++ title: i18nLazyString(UIStrings.toggleDebuggerSidebar), ++ async loadActionDelegate() { ++ const Sources = await loadSourcesModule(); ++ return Sources.SourcesPanel.ActionDelegate.instance(); ++ }, ++ contextTypes() { ++ return maybeRetrieveContextTypes(Sources => [Sources.SourcesView.SourcesView]); ++ }, ++ bindings: [ ++ { ++ platform: UI.ActionRegistration.Platforms.WindowsLinux, ++ shortcut: 'Ctrl+Shift+h', ++ }, ++ { ++ platform: UI.ActionRegistration.Platforms.Mac, ++ shortcut: 'Meta+Shift+h', ++ }, ++ ], ++ }); ++} ++ + UI.ActionRegistration.registerActionExtension({ + category: UI.ActionRegistration.ActionCategory.DEBUGGER, + actionId: 'debugger.step-over', +@@ -1399,29 +1425,6 @@ UI.ActionRegistration.registerActionExtension({ + ], + }); + +-UI.ActionRegistration.registerActionExtension({ +- actionId: 'sources.toggle-debugger-sidebar', +- category: UI.ActionRegistration.ActionCategory.SOURCES, +- title: i18nLazyString(UIStrings.toggleDebuggerSidebar), +- async loadActionDelegate() { +- const Sources = await loadSourcesModule(); +- return Sources.SourcesPanel.ActionDelegate.instance(); +- }, +- contextTypes() { +- return maybeRetrieveContextTypes(Sources => [Sources.SourcesView.SourcesView]); +- }, +- bindings: [ +- { +- platform: UI.ActionRegistration.Platforms.WindowsLinux, +- shortcut: 'Ctrl+Shift+h', +- }, +- { +- platform: UI.ActionRegistration.Platforms.Mac, +- shortcut: 'Meta+Shift+h', +- }, +- ], +-}); +- + Common.Settings.registerSettingExtension({ + settingName: 'navigatorGroupByFolder', + settingType: Common.Settings.SettingType.BOOLEAN, +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0014-Show-Profiling-panel.patch b/packages/wrangler-devtools/patches/0014-Show-Profiling-panel.patch new file mode 100644 index 000000000000..2c27a20e75f2 --- /dev/null +++ b/packages/wrangler-devtools/patches/0014-Show-Profiling-panel.patch @@ -0,0 +1,159 @@ +From 0488c38300b4125cd9c8d1956894baac47d03d9a Mon Sep 17 00:00:00 2001 +From: Workers DevProd +Date: Wed, 4 Oct 2023 01:11:14 +0100 +Subject: [PATCH 14/15] Show Profiling panel + +--- + front_end/entrypoints/main/MainImpl.ts | 1 + + .../panels/js_profiler/js_profiler-meta.ts | 99 +------------------ + front_end/panels/profiler/ProfilesPanel.ts | 1 - + 3 files changed, 2 insertions(+), 99 deletions(-) + +diff --git a/front_end/entrypoints/main/MainImpl.ts b/front_end/entrypoints/main/MainImpl.ts +index e4d10c442a..e66c539007 100644 +--- a/front_end/entrypoints/main/MainImpl.ts ++++ b/front_end/entrypoints/main/MainImpl.ts +@@ -439,6 +439,7 @@ export class MainImpl { + Root.Runtime.ExperimentName.OUTERMOST_TARGET_SELECTOR, + Root.Runtime.ExperimentName.AUTHORED_DEPLOYED_GROUPING, + Root.Runtime.ExperimentName.JUST_MY_CODE, ++ Root.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE, + ]); + + Root.Runtime.experiments.setNonConfigurableExperiments([ +diff --git a/front_end/panels/js_profiler/js_profiler-meta.ts b/front_end/panels/js_profiler/js_profiler-meta.ts +index 2c0f3e64ec..0bcdf01551 100644 +--- a/front_end/panels/js_profiler/js_profiler-meta.ts ++++ b/front_end/panels/js_profiler/js_profiler-meta.ts +@@ -88,7 +88,7 @@ UI.ViewManager.registerViewExtension({ + title: i18nLazyString(UIStrings.profiler), + commandPrompt: i18nLazyString(UIStrings.showProfiler), + order: 65, +- persistence: UI.ViewManager.ViewPersistence.CLOSEABLE, ++ persistence: UI.ViewManager.ViewPersistence.PERMANENT, + experiment: Root.Runtime.ExperimentName.JS_PROFILER_TEMP_ENABLE, + async loadView() { + const Profiler = await loadProfilerModule(); +@@ -96,20 +96,6 @@ UI.ViewManager.registerViewExtension({ + }, + }); + +-UI.ViewManager.registerViewExtension({ +- location: UI.ViewManager.ViewLocationValues.PANEL, +- id: 'timeline', +- title: i18nLazyString(UIStrings.performance), +- commandPrompt: i18nLazyString(UIStrings.showPerformance), +- order: 66, +- hasToolbar: false, +- isPreviewFeature: true, +- async loadView() { +- const Timeline = await loadTimelineModule(); +- return Timeline.TimelinePanel.TimelinePanel.instance({forceNew: null, isNode: true}); +- }, +-}); +- + UI.ActionRegistration.registerActionExtension({ + actionId: 'profiler.js-toggle-recording', + category: UI.ActionRegistration.ActionCategory.JAVASCRIPT_PROFILER, +@@ -136,86 +122,3 @@ UI.ActionRegistration.registerActionExtension({ + }, + ], + }); +- +-UI.ActionRegistration.registerActionExtension({ +- actionId: 'timeline.show-history', +- async loadActionDelegate() { +- const Timeline = await loadTimelineModule(); +- return Timeline.TimelinePanel.ActionDelegate.instance(); +- }, +- category: UI.ActionRegistration.ActionCategory.PERFORMANCE, +- title: i18nLazyString(UIStrings.showRecentTimelineSessions), +- contextTypes() { +- return maybeRetrieveTimelineContextTypes(Timeline => [Timeline.TimelinePanel.TimelinePanel]); +- }, +- bindings: [ +- { +- platform: UI.ActionRegistration.Platforms.WindowsLinux, +- shortcut: 'Ctrl+H', +- }, +- { +- platform: UI.ActionRegistration.Platforms.Mac, +- shortcut: 'Meta+Y', +- }, +- ], +-}); +- +-UI.ActionRegistration.registerActionExtension({ +- actionId: 'timeline.toggle-recording', +- category: UI.ActionRegistration.ActionCategory.PERFORMANCE, +- iconClass: UI.ActionRegistration.IconClass.START_RECORDING, +- toggleable: true, +- toggledIconClass: UI.ActionRegistration.IconClass.STOP_RECORDING, +- toggleWithRedColor: true, +- contextTypes() { +- return maybeRetrieveTimelineContextTypes(Timeline => [Timeline.TimelinePanel.TimelinePanel]); +- }, +- async loadActionDelegate() { +- const Timeline = await loadTimelineModule(); +- return Timeline.TimelinePanel.ActionDelegate.instance(); +- }, +- options: [ +- { +- value: true, +- title: i18nLazyString(UIStrings.record), +- }, +- { +- value: false, +- title: i18nLazyString(UIStrings.stop), +- }, +- ], +- bindings: [ +- { +- platform: UI.ActionRegistration.Platforms.WindowsLinux, +- shortcut: 'Ctrl+E', +- }, +- { +- platform: UI.ActionRegistration.Platforms.Mac, +- shortcut: 'Meta+E', +- }, +- ], +-}); +- +-UI.ActionRegistration.registerActionExtension({ +- actionId: 'timeline.record-reload', +- iconClass: UI.ActionRegistration.IconClass.REFRESH, +- contextTypes() { +- return maybeRetrieveTimelineContextTypes(Timeline => [Timeline.TimelinePanel.TimelinePanel]); +- }, +- category: UI.ActionRegistration.ActionCategory.PERFORMANCE, +- title: i18nLazyString(UIStrings.startProfilingAndReloadPage), +- async loadActionDelegate() { +- const Timeline = await loadTimelineModule(); +- return Timeline.TimelinePanel.ActionDelegate.instance(); +- }, +- bindings: [ +- { +- platform: UI.ActionRegistration.Platforms.WindowsLinux, +- shortcut: 'Ctrl+Shift+E', +- }, +- { +- platform: UI.ActionRegistration.Platforms.Mac, +- shortcut: 'Meta+Shift+E', +- }, +- ], +-}); +diff --git a/front_end/panels/profiler/ProfilesPanel.ts b/front_end/panels/profiler/ProfilesPanel.ts +index a175dfb050..28d46d7378 100644 +--- a/front_end/panels/profiler/ProfilesPanel.ts ++++ b/front_end/panels/profiler/ProfilesPanel.ts +@@ -753,7 +753,6 @@ export class JSProfilerPanel extends ProfilesPanel implements UI.ActionRegistrat + ], + /* disableSetting? */ undefined); + infobar.setParentView(this); +- this.splitWidget().mainWidget()?.element.prepend(infobar.element); + } + + #showDeprecationWarningAndNoPanel(): void { +-- +2.39.3 (Apple Git-145) + diff --git a/packages/wrangler-devtools/patches/0001-Expand-Browser-support-make-it-work-in-Firefox-Safar.patch b/packages/wrangler-devtools/patches/0015-Basic-support-for-Safari.patch similarity index 64% rename from packages/wrangler-devtools/patches/0001-Expand-Browser-support-make-it-work-in-Firefox-Safar.patch rename to packages/wrangler-devtools/patches/0015-Basic-support-for-Safari.patch index a7f38d212e53..0b912beb1bab 100644 --- a/packages/wrangler-devtools/patches/0001-Expand-Browser-support-make-it-work-in-Firefox-Safar.patch +++ b/packages/wrangler-devtools/patches/0015-Basic-support-for-Safari.patch @@ -1,29 +1,15 @@ -From f33a1c016aca11dd75e912ba3373be01fc7480da Mon Sep 17 00:00:00 2001 +From 8b0cffa7ec0679ca5aff6eb86654b08956fa33f9 Mon Sep 17 00:00:00 2001 From: Workers DevProd -Date: Fri, 25 Oct 2024 14:15:43 +0100 -Subject: [PATCH 1/8] Expand Browser support (make it work in Firefox & Safari) +Date: Thu, 5 Oct 2023 16:37:38 +0100 +Subject: [PATCH 15/15] Basic support for Safari -* Basic support for text colour in dark mode in browsers - that don't implement :host-context - -* A few firefox-specific patches (with detailed inline comments) - -* A (vendored) custom elements polyfill for Safari - -Acceptance criteria: -If updating the commit of devtools upon which these patches are based, make sure this patch: -* Displays console.log() output with sufficient contrast in dark mode -* Allows devtools to load in Safari (loading with _any_ UI is sufficent to check whether this has worked) -* Supports viewing a list of requests in the network panel in Firefox (without the patches here this goes very obviously wrong) --- - front_end/core/dom_extension/DOMExtension.ts | 2 +- - front_end/entrypoint_template.html | 38 ++++++++++++++++++- - front_end/entrypoints/js_app/js_app.ts | 3 ++ - .../legacy/components/data_grid/DataGrid.ts | 5 +++ - 4 files changed, 46 insertions(+), 2 deletions(-) + front_end/core/dom_extension/DOMExtension.ts | 2 +- + front_end/entrypoint_template.html | 8 +++++++- + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/front_end/core/dom_extension/DOMExtension.ts b/front_end/core/dom_extension/DOMExtension.ts -index 940ce81924..e9542743ff 100644 +index 6fb8d5237f..6b1e3d1342 100644 --- a/front_end/core/dom_extension/DOMExtension.ts +++ b/front_end/core/dom_extension/DOMExtension.ts @@ -132,7 +132,7 @@ Node.prototype.getComponentSelection = function(): Selection|null { @@ -36,46 +22,15 @@ index 940ce81924..e9542743ff 100644 Node.prototype.hasSelection = function(): boolean { diff --git a/front_end/entrypoint_template.html b/front_end/entrypoint_template.html -index 8e0e11ca35..0d422c3cda 100644 +index 14d3e0071b..fa96b72fef 100644 --- a/front_end/entrypoint_template.html +++ b/front_end/entrypoint_template.html -@@ -13,8 +13,44 @@ - background-color: rgb(41 42 45); - } +@@ -40,8 +40,14 @@ + --override-text-color: rgb(189 198 207); } -+ -+ .platform-mac { -+ --monospace-font-size: 11px; -+ --monospace-font-family: menlo, monospace; -+ --source-code-font-size: 11px; -+ --source-code-font-family: menlo, monospace; -+ } -+ -+ .platform-windows { -+ --monospace-font-size: 12px; -+ --monospace-font-family: consolas, lucida console, courier new, monospace; -+ --source-code-font-size: 12px; -+ --source-code-font-family: consolas, lucida console, courier new, monospace; -+ } -+ -+ .platform-linux { -+ --monospace-font-size: 11px; -+ --monospace-font-family: dejavu sans mono, monospace; -+ --source-code-font-size: 11px; -+ --source-code-font-family: dejavu sans mono, monospace; -+ } -+ -+ .-theme-with-dark-background .platform-linux, -+ .-theme-with-dark-background .platform-mac { -+ --override-text-color: rgb(189 198 207); -+ } -+ -+ .cm-editor + .cm-editor { -+ display: 'none', -+ } -- -+ +- ++ + - - -diff --git a/front_end/entrypoints/js_app/js_app.ts b/front_end/entrypoints/js_app/js_app.ts -index 45028f436a..6a154030b6 100644 ---- a/front_end/entrypoints/js_app/js_app.ts -+++ b/front_end/entrypoints/js_app/js_app.ts -@@ -43,6 +43,9 @@ async function loadSourcesModule(): Promise { - } - return loadedSourcesModule; - } -+ -+// This is not supported in Firefox: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView -+Element.prototype.scrollIntoViewIfNeeded = Element.prototype.scrollIntoView; - export class JsMainImpl implements Common.Runnable.Runnable { - static instance(opts: {forceNew: boolean|null} = {forceNew: null}): JsMainImpl { - const {forceNew} = opts; -diff --git a/front_end/ui/legacy/components/data_grid/DataGrid.ts b/front_end/ui/legacy/components/data_grid/DataGrid.ts -index 93a117e746..d9e37e3d7a 100644 ---- a/front_end/ui/legacy/components/data_grid/DataGrid.ts -+++ b/front_end/ui/legacy/components/data_grid/DataGrid.ts -@@ -217,6 +217,8 @@ export class DataGridImpl extends Common.ObjectWrapper.ObjectWrapper + var supportsCustomElements = false; - this.dataTableBody = this.dataTable.createChild('tbody'); -+ // This is required for Firefox, else Firefox will position the *under* the -+ (this.dataTableBody as HTMLElement).style.height = 'calc(100% - 27px)'; - this.topFillerRow = (this.dataTableBody.createChild('tr', 'data-grid-filler-row revealed') as HTMLElement); - UI.ARIAUtils.setHidden(this.topFillerRow, true); - this.bottomFillerRow = (this.dataTableBody.createChild('tr', 'data-grid-filler-row revealed') as HTMLElement); -@@ -505,6 +507,9 @@ export class DataGridImpl extends Common.ObjectWrapper.ObjectWrapper