From a1c97b522e85cae00a0fe2aa36f293112aafa469 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Fri, 29 Sep 2023 20:03:57 +0100 Subject: [PATCH] Add DevTools Tips example (#1013) * Add DevTools Tips example * Update functional-samples/tutorial.focus-mode-debugging/README.md Co-authored-by: Joe Medley --------- Co-authored-by: Joe Medley --- .../tutorial.focus-mode-debugging/README.md | 14 ++++++ .../background.js | 44 ++++++++++++++++++ .../fixed/background.js | 44 ++++++++++++++++++ .../fixed/focus-mode.js | 24 ++++++++++ .../focus-mode.css | 29 ++++++++++++ .../focus-mode.js | 24 ++++++++++ .../images/icon-128.png | Bin 0 -> 14765 bytes .../images/icon-16.png | Bin 0 -> 876 bytes .../images/icon-32.png | Bin 0 -> 1451 bytes .../images/icon-48.png | Bin 0 -> 3892 bytes .../manifest.json | 40 ++++++++++++++++ 11 files changed, 219 insertions(+) create mode 100644 functional-samples/tutorial.focus-mode-debugging/README.md create mode 100644 functional-samples/tutorial.focus-mode-debugging/background.js create mode 100644 functional-samples/tutorial.focus-mode-debugging/fixed/background.js create mode 100644 functional-samples/tutorial.focus-mode-debugging/fixed/focus-mode.js create mode 100644 functional-samples/tutorial.focus-mode-debugging/focus-mode.css create mode 100644 functional-samples/tutorial.focus-mode-debugging/focus-mode.js create mode 100644 functional-samples/tutorial.focus-mode-debugging/images/icon-128.png create mode 100644 functional-samples/tutorial.focus-mode-debugging/images/icon-16.png create mode 100644 functional-samples/tutorial.focus-mode-debugging/images/icon-32.png create mode 100644 functional-samples/tutorial.focus-mode-debugging/images/icon-48.png create mode 100644 functional-samples/tutorial.focus-mode-debugging/manifest.json diff --git a/functional-samples/tutorial.focus-mode-debugging/README.md b/functional-samples/tutorial.focus-mode-debugging/README.md new file mode 100644 index 0000000000..b31270b1c2 --- /dev/null +++ b/functional-samples/tutorial.focus-mode-debugging/README.md @@ -0,0 +1,14 @@ +# Oliver Focus Mode + +Extension used in the [Debugging Chrome extensions](https://www.youtube.com/watch?v=Ta-YTDhiBIQ) DevTools Tips video. This extension simplifies the styling of the extensions and Chrome Web Store documentation pages so that they are easier to read when the action icon is clicked. + +This extension is based on the [Focus Mode](/functional-samples/tutorial.focus-mode/) extension. + +**Note:** `background.js` and `focus-mode.js` are intentionally broken. Try to fix them, and compare your fixes with the code in the `fixed` folder. + +## Running this extension + +1. Clone this repository. +2. Load this directory in Chrome as an [unpacked extension](https://developer.chrome.com/docs/extensions/mv3/getstarted/development-basics/#load-unpacked). +3. Visit a page in the Extensions or Chrome Web Store sections on developer.chrome.com, e.g https://developer.chrome.com/docs/extensions/mv3/getstarted/tut-focus-mode/. +4. Click the extension icon to toggle focus mode. diff --git a/functional-samples/tutorial.focus-mode-debugging/background.js b/functional-samples/tutorial.focus-mode-debugging/background.js new file mode 100644 index 0000000000..7e153923be --- /dev/null +++ b/functional-samples/tutorial.focus-mode-debugging/background.js @@ -0,0 +1,44 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +chrome.runtime.onInstalled.addListener(() => { + chrome.action.setBadgeText({ + text: 'OFF' + }); +}); + +const extensions = 'https://developer.chrome.com/docs/extensions'; +const webstore = 'https://developer.chrome.com/docs/webstore'; + +// When the user clicks on the extension action +chrome.action.onClicked.addListener(async (tab) => { + if (tab.url?.startsWith(extensions) || tab.url?.startsWith(webstore)) { + // We retrieve the action badge to check if the extension is 'ON' or 'OFF' + const prevState = await chrome.action.getBadgeText({ tabId: tab.id }); + // Next state will always be the opposite + const nextState = prevState === 'ON' ? 'OFF' : 'ON'; + + // Set the action badge to the next state + await chrome.action.setBadgeText({ + tabId: tab.id, + text: nextState + }); + + if (nextState === 'ON') { + chrome.tabs.sendMessage(tab.id, { data: 'focus-on' }); + } else if (nextState === 'OFF') { + chrome.tabs.sendMessage(tab.id, { data: 'focus-off' }); + } + } +}); diff --git a/functional-samples/tutorial.focus-mode-debugging/fixed/background.js b/functional-samples/tutorial.focus-mode-debugging/fixed/background.js new file mode 100644 index 0000000000..7e153923be --- /dev/null +++ b/functional-samples/tutorial.focus-mode-debugging/fixed/background.js @@ -0,0 +1,44 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +chrome.runtime.onInstalled.addListener(() => { + chrome.action.setBadgeText({ + text: 'OFF' + }); +}); + +const extensions = 'https://developer.chrome.com/docs/extensions'; +const webstore = 'https://developer.chrome.com/docs/webstore'; + +// When the user clicks on the extension action +chrome.action.onClicked.addListener(async (tab) => { + if (tab.url?.startsWith(extensions) || tab.url?.startsWith(webstore)) { + // We retrieve the action badge to check if the extension is 'ON' or 'OFF' + const prevState = await chrome.action.getBadgeText({ tabId: tab.id }); + // Next state will always be the opposite + const nextState = prevState === 'ON' ? 'OFF' : 'ON'; + + // Set the action badge to the next state + await chrome.action.setBadgeText({ + tabId: tab.id, + text: nextState + }); + + if (nextState === 'ON') { + chrome.tabs.sendMessage(tab.id, { data: 'focus-on' }); + } else if (nextState === 'OFF') { + chrome.tabs.sendMessage(tab.id, { data: 'focus-off' }); + } + } +}); diff --git a/functional-samples/tutorial.focus-mode-debugging/fixed/focus-mode.js b/functional-samples/tutorial.focus-mode-debugging/fixed/focus-mode.js new file mode 100644 index 0000000000..889d4ee4dd --- /dev/null +++ b/functional-samples/tutorial.focus-mode-debugging/fixed/focus-mode.js @@ -0,0 +1,24 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +chrome.runtime.onMessage.addListener((msg) => { + switch (msg.data) { + case 'focus-on': + document.body.setAttribute('data-focus-mode', 'on'); + break; + case 'focus-off': + document.body.removeAttribute('data-focus-mode'); + break; + } +}); diff --git a/functional-samples/tutorial.focus-mode-debugging/focus-mode.css b/functional-samples/tutorial.focus-mode-debugging/focus-mode.css new file mode 100644 index 0000000000..254fa88219 --- /dev/null +++ b/functional-samples/tutorial.focus-mode-debugging/focus-mode.css @@ -0,0 +1,29 @@ +/* +Copyright 2023 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +body[data-focus-mode='on'] + > .scaffold + > :is(top-nav, navigation-rail, side-nav, footer), +body[data-focus-mode='on'] main > :not(:last-child), +body[data-focus-mode='on'] main > :last-child > navigation-tree, +body[data-focus-mode='on'] main .toc-container { + display: none; +} + +body[data-focus-mode='on'] main > :last-child { + margin-top: min(10vmax, 10rem); + margin-bottom: min(10vmax, 10rem); +} diff --git a/functional-samples/tutorial.focus-mode-debugging/focus-mode.js b/functional-samples/tutorial.focus-mode-debugging/focus-mode.js new file mode 100644 index 0000000000..b3a838fab8 --- /dev/null +++ b/functional-samples/tutorial.focus-mode-debugging/focus-mode.js @@ -0,0 +1,24 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +chrome.runtime.onMessage.addListener((msg) => { + switch (msg) { + case 'focus-on': + document.body.setAttribute('data-focus-mode', 'on'); + break; + case 'focus-off': + document.body.removeAttribute('data-focus-mode'); + break; + } +}); diff --git a/functional-samples/tutorial.focus-mode-debugging/images/icon-128.png b/functional-samples/tutorial.focus-mode-debugging/images/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..2088c59e96dad2824f7676f1f1d8c3acb2e37e22 GIT binary patch literal 14765 zcma)DRa+cfubp9VFYZ>{p}4!dySuwPMT!-N;_mLw0HwGUcX!tge%|jNoQovSzD%C% zBzvvwA1X@HD2N1z0000*Rz^bYKO6Etfrt7}D;PZG{AYmfYSLoB)iK84{|*Q)GP>>n z021c^1PI8=!2Xu{(lr{Tw>NidL*m|7 z_aNOeD?Q@q^D*!SfnNk|F&<$h$dWF|FO@cyLiw*vXN>mw?TsJg<#Bb{xc~iixjjRB ze|HLUX6NA=^m_DoapWh|r5|^-)J&)FWr#y@Bq{Q?u-?%7F>fxJvTb8j2;_z8CP5g4LL5A8lUwdgVL z(JG}->edfEd+>H;qtrJ&@}U(AB-|J(46#lc4`Jq4fWUT^$yn#Cxk|Adm}R=SlE2D^ z-zf=y#3P4TKQrj+OG8Wopx>G*2FUEE0u8{AJ>2GUt7-@_xRqvIr#|YDZbGjS*BYnoBzW}dg-89RrB5zlMw<6>5C(7utT4Pw5UbQ_nH*lA61gxL z_BZ9)_0rR%yd9P0D2-Fay*EtC`&VCIUK6%~23~rPb(O5WGcue%KK^||GJ<=%@u$n1 zd5}|h=4=XoO^Xrn`MK9lO&x&fC9!oLOR=<>oDj2BS6j%@5h&^*x=Xo=Ly{7 zdLzkdPUHZ*yQV4yUC=mNDJ!KwHM@i({$CF0x71O%@uI=vI+K^h8{yw7VjV%VtLxkY zKvHJ>06$bfCg^tes4P<{h882i+zHJhZ|u1wOf_EuM`xW~a+b@F_3fX+GToBB2ybG1 zza#GC?#$;)yYt6g#(M0%3tKqQDQ1nU#9VF}z3qqhj&?_@0ly35GCPyF3?(oO0Y5OO zi?+Imwo1T#r@?XkkrCC8bPv)(1g32c*>U$&jU-1F#fM0tM;{tYmt%uT8VbyR^|5pr zGT7)Q7!Ip)<;qU9@n1&$0wD8r_XmG02X}Y!7|&3HyNOtPsSJ@O9a{yvFZpb|-%dSt zjyik6=RQVAaSjC7(3C_F&JDN>e(F84b@qXe%S}UWn?Tx_n;*OYC>JA(q4SG3PhEQ}NTa`5(ipAr0SPr`go2~|Ag^UuLUWZkoyDY$x`=Jfw!xlSzF80@&3sL0-PP*OR{ycTsw_(&^e&h z%`ze-QE|GkL24oqKEFE>VgajGv3vlKvDIy7VSg)_0ctoIgdL2K&x4mP_zbPIp~Qb| zZ91$u1AXsYI{n?quLSgRX3}cadH2wcu-qcZcuw{q;sq3=+JHl>xpBgn~8d+ zRpL+6$szDRq8p-~(MSL^9o@8Bbj*9MVf~^PN!QykN&a_`4in(ym$BheqCz7mAT0*^ zl5U-8{yv_krnx0#q#f=frTl6uZ_|$(%O#Xbx37r7i$TuY>n{=1Ive`Wfjo&Qn` zy=BM2Mug;}i(32<@D}yMV8{992=bwsj4jDjdhY4v{ZA?1gn%{JmH+}lrJd)fK4^{a21KS5My)8)hWqI}F>hAg8rW0MH zSk6M-gsB6?FSnM9S}*!St-=+JI-^2*VKUIPt>S0YT;uoz{nP|23*u0fgYzroWGA+~ z4bJ&pzO?Y?b%>eJjFU6quMGSGAnE*>OR-Ea@m7es-$3SR%cX;PN zesdKyYGPv}RO5cSJ=ULJW&J?E{aN3)xI|{thn7azjFKqe+`lr6X-?^q5dc{xW7(&W z5`;?+!$7G00d4*-D+Q@{NGzY`d?6^g+nZ(D+7x$6QM47x2vmfR(LGOI{=XfJm0R|OC#KyKJgUT_&m#MPdq8rQ!JGGERPm&LWwu_fs#}``zKG!{m}Ib| z16nj^wrY>^ZW`l?@(*o2Bg!FOzw)9A^X=lV^SY`+3To?E_Qz;{O<5#~lU%jyy{@mn zqe_v=uwk?IP{Pc!q)!aHeW@K{lplDx$qNZWWGp<4U9@Y{s~hAA13;4_?$n=qqoJC> z`dmKw(`+jX3T1&yp*XGzqMLEs4az&6@^1GYGiAUp) zdd(x|vq^NO$q=lF^lPZEZ8B=G*6o5D zU}&;I_xu{kg#hp6)%B+vV0=W{UF64#aHVwn<0jKMKgS>0q53(PNT=o9&o3<1J?SS; zZ^h>2%aWfFrhb9BsP*&NrU>Qijzf(}ltU77^9NJsdqEc=i-3wzg3dHsNW!Mn&A!e7 zXav?eME>20!R9##3BM6;h}2L&-8H#(4_YXeObnpRZTjKy+FLAMzy3~!AQB(}hc#iz zo4>fv|KB9W)QkBgjiUn@w)p!{5)6>ON?`lU5sqf$=HTr^s2d+gJLB0SJ?`p8w$2*Z zco(R_sa1XP@;CY`S+5Kw{K=3z)Qs&biK+o1e%%j`Wp7oeJ6X?$%*Lb<@;eJ(e31pj zH}Ipw$Tx%SYiCbXvf!}akhqDy=+*DGk^d>p;$H6k);ecJ}}uBs0(yi;S=

q)1r4jZ%jk(>-M2%S#-8b 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 DxXXq* literal 0 HcmV?d00001 diff --git a/functional-samples/tutorial.focus-mode-debugging/images/icon-16.png b/functional-samples/tutorial.focus-mode-debugging/images/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..038e6b461e4ffe74a70617896aba1616865175cb GIT binary patch literal 876 zcmV-y1C#uTP)7g#zuVlmvaz(OsJY9{qPn_zZfK#3 zf}D(prn|ht>+QI>x3i$0vahba+T5$Mu%(WPtdEJLn3b{1%){^UyxQEezP+uernJV# zyV%>m>g~bm?5mcJrG|>rlg;xrJ}sSo50A6uDO}L#-O#gpNN5& ze|(>)s>1N}#q{^E#l@YHjfi=6c!!T%c7;q~bxU4!M^|lHVR3kHc6x7fY;bsfnWU)C z*2D7ko12)2c5r=fY*}DzHbh%DMqWKkWI<49M^tN2S!_#GXGKzGQ)735ovOLy>9f<+ zuguJ*zQ1~olrKM0GeTNCN@GD!XF^YCL{Vx-RBcLEa7tHhTW^4`+26$T_QUe@!}Ip8 z+TVw(wNhz(J4$3cNn<}uWkF78N>^`QX?#*&a#Lk@tk&GX@AG(;q&`k%J4j+aN@PGx zW=2zMKulm(X?mf@&zr%@JxpRZL|i*ZVL(l0K1yRXKvPp+Y^u}Qq|MV(W_UG1Svf{u zJxO9bM_)TbRBL5q!0PO_;^tIpdNMy$G(lK5LtHvWUpq%%K}T10c6hng*TC-bNLy+! zJW(+|R5d|ZIYnGMMqfWjU37DIw9?YJVJkVPJ@ji%&>QN=`{lOV7y6%Fbb6$j!?yC@d;2DJ?6n zsH}q6TU}FISKpA@*wowt5y)$8YwxJmR3 zo4)`muyE1hB}Yz*tlu)76t&%L_vI(<9#Op0000 zceq>bZe@;k981edskqssVbsP*DSs>i5W6fD)*m10G$ZLuDQ0b{rTST?uwlgrHu9=V zQDLd`l)WoyuWaMr0a%l>x<8%kbZLHp_X4p?!Ap@PZzZ?Zs#cI9!8tM_Y6EAi)t9cS zf0!m>ON+6%DNh$%iC)&Y)_kx6OrkE0uESWzk>wr6!7o`9Pn?F-1cGtGs;%B(SnrN_UtQrPsExxjs0Ie5$&8db^sAlHk zT%Kp*0A;NW*YJH1+QJqUq8+6+RZv#w4;fNg+7Ur;`3**qN$S$#eVQ)me5R}S1+9y> zrLGjBY^m}VRbh&=wk&9|j9x2%K-t5rV#wi(0(}C=%K|Y-m&b5CE~kfZneciMvMN&) z&#~nekUU1gXw8ZYo}W(4EugA#JOM4KDis-X(@7H^`w~fo)2ZbckN5s?a1Y02_M!18 zb>KQS5s8;lGQ^-s!8B*KMjM@q3$K~U!q}ws$*XZ!+3qH9uC{0nW%M)K%H4hh0pW1x z?(f{`>_c))&P`5%%}ZJWvhgG}5C+59sQ6Z~K~&kLr%aK%JWOGKaqoUx-hTK6riGGn z4T5v!?rzaX;dFG5C-2-G%ar-U(jHxMO9Jr_rI-fi#p#^wCUM>5{d{pLq*f>! z)R9O!sVkV+}6KTjl&Z{N{>NPneCGQ^~>C%N6L&6VBm z?r#t02MjNtLlW?V+$Pl#g5e|cDg}*=pTP%2?Ju*R zT_G}7YP-V-n3WzCj3H+nYEI^9f0orx>e2gxK0**?pBpj6%lq@=;dr!%C%x_Zwq_KM zBJ*9O;co#Or6kfpejPh!umcLJWnkiKAi) znxtw;@Al657QizMtl&AA9ya(`rDWutDR5PZ38MJv)Pb6*U<68KB{Lf1Sw745tEY;! zy{`6g=WlNN5sn!|z7zle002ovPDHLk FV1gM+uy6nX literal 0 HcmV?d00001 diff --git a/functional-samples/tutorial.focus-mode-debugging/images/icon-48.png b/functional-samples/tutorial.focus-mode-debugging/images/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..4186379a930ef9e83239420a443c48988885f4b8 GIT binary patch literal 3892 zcmV-456ke0P)QBtQ%V$tu<&D`k;|4FnF7AfXM|LTp*G zW6_K#h871k+1+F}yUCt@_y7H;nycQ+dDRR>TarPMh>O$j`c<#ayZ794&n@z^eq=rJ zq4IorW@dS2nrT(8)y5y&TbY=k(te1g_@hI4`-eZg^5e5B3%7NeI)X^f9NV54AKm@L zu>+?+F3aU#9H1l!ufB2iJOBKRB#HumK$Ieu5}eu6-e_$uEZ*s?HJ|#z7wu~87Xe6R z*_Aim`1h}Uz1wb6ofDnejJcBQJdHy9n1@6!PEYA?e)HKEzbIVy{~b_!W%avf&NSE7 zxXMa46N1)Vd*^Tim|A|wC>b8AX-XHaO^sf>c<}k>9~qFgwAO@@;LdWq*-n<1M}Flr zlk(oTm(E{UT9_XadbsQjd+y{&{lLy$+sDULo`qr98w?obX|5L9gQ;`p_MSMwA1p{8 z2q(+h|rB^{iG4E?!KvHS)_v@ChlGy@uyBDitYM zspK}Q4MCa86-8JriVLK4c#=!o<k#u&^ z%5^x1OsL{`Xz#vz*NpGpQyrU(Ru{uwXUFbcD7sdwwYt{qY_=yx#;@ID zYz0Bw?>n^zD*pEeWY7p6wANkQk&NZGYi+hN$F&=cd)G+U8Q!yZZsEqn=;*%PyP_lw zf^dGN_1O6M@YuK`ZQCg|G;7rBIkWO4eWVD**RN^6$NQTWMNy~Z@sH43v+kkCg;%=& zvONWCy3Xl`ZsNWH;GcX+5ATAYyw#PfcDGC!cLbsLJCT0$^| z@}HZIvb=uy@coyeQOLQOQ%8>6Tw4yppgvS~Tn~bT4P;RW5>`s?@@gxKBhINxvxf(i zG*=141oc8Gid;$?M2&>aJ=2wvc3Y*11HMyQ9p0uk(*xUgw0pe_nv><6bHCqJaVko# zQz|(nXT8}jH_-AP77)ZRxqU~YN-WK!AY5dYR!Uiw3Ru-U|K{MW^ZfWpXLJl$hfaOW z|Iw?%X-qf+hpbKq%c1Bbw>Q>1VZOe$vZgJXdqaC3xW)b~pe%}1ca#1fIP4mdrd5s< z_%qj&nW@;Tj6d@Xc!LY%+OrkWhXK@|zGj6XNAK3KJARtwaS}HpYx@hQ z4?ljGOYy#|*tHrjxk;}pQ41`6^5~IxkXSme3vXReZ*uYh(fll+sJRC1p(T$Jnxyd{ z7<3dHI(8C=_y8zd2jv3(LopVl8E!4vG|^FiquY;S;S5cm`L{bQKVYS8lj9{QcXh}u zmvx?v?Al%)Zjhf2-n)QI@40%J7Bp6A6vuI5mk)pHH%pEB&)bpKLA%|Zx@ctGakGqc z{7|L3Y}@v>Mkx$eIiow;l z^~S0yY_cB&?Ihdx+0XnOG_b8Ja|@S#{MOpc%(1$5xJ4}2^SqFdwQj!|C!kcAWc@tP zIByNmdaX1ia3P_NiA9AFomThUt7mWDSUmFdlY5{3C@SY&K<#&~=Cjk3kt9izIKH#A zH1Qjst8IV(+_#z={Z8j!U;bKar5Q(Q$#L~SK6ju2M5suK9_HoiQ50qgJa($})ckrY z(ym)FO(rweh=8FfVU+rQFg-PMd-3*XYSkTwOy}khn~kfN(@X!uDM{lLd24NMR-Qe* z|Cy)n2N8vF;QRB_H?N%g$@=1w-|O{zeM%WL5DL0Fu&yje`^H4oW9T`;c802T7DmlY z|I+PdKOvL}t!W(RXnkl$mc??VlMJk*X%d1SZ+`EM9S8RUG4J2G9bCKYFq&uZ7jYj? zBKE1%AG;sT;{5GbzxBQD%G%1pB2mHGAj#1c2<6w81`ADp*S7L-#mP|g{a~XP zu59{QZfHZ0D}oM-W<)WY2uTZj40%Bph8wVMUY+uL1Fu@)?Xy3SIpT^0r-OmN+Vu~8 z{!7xiJL5rz-aLEZpZ@+I(m{wq!VYXMBBjx@;7rV-lq2mKx|k5L(z9#9>}o$wGuTM1 zsfaCXVw(!pNEP-EL|9Yh_)Jr3bf6$nM+g0UwD?&*ti3nM6x>FUiIilb{si! zm$pgz>bJlD`hUEV3<9o^aWin?A1qj`UVKm%H@9oEQ6ug+O$&!$%2^1Gp%H=)f(s$H zaM;q^h!5xjIFG$ys>9#6re=?ydIrovbAUTQc>0}OzwpUV3fsv1>dM+z|Ke{uOKZ5# zb4s`$8^HsRC|;14F^>CyC`qw<#10fpOh70Zs#MYxPBsTyltv3-L{PzaY8BxCqpd=H z3@q&ki76AvZq3|WU&c_SOu#T9v^xE5C!QM`ZXhskU%34GnOEA2OCac0NU$8^!YpJJ z%?$xhQiQ||6Usynals`J>NEzD+)xG-!+3^>nR`fzi3K_1tS~jyu)!kG2Ds%Q3ON_O zR%iCob)Kb2W!CNXLhc?t`P8Kgm*0H-+|taP6{q#;Fo=bxGHj%DX~c`3n=tiE3-6e+%gjv{Fh@3YC>)*7V!sJwg{1F%a#Z^PEs?JQ7eez4A02{ z8>P+18|9-1cVPx`U5Vd~TKUqInX~7w;JY+|+svZA&+#xn4C5pka@{A7?p^V%w`SM; zIOi0;C`Vlx$yYJhils4?Vm8Iiq{vQDzVt3Xm7!Ai{larN7x!SP%VRB)1O%Yt8ibli$m|Cgf zqcU}?jSi9Ad~ZN7!&3$mXR?duB#FgU(H$T;U>mX~@JL2z;3u1p=e<}Y;A5vIIwjEYT_&ND#9qI zQ93|@3Zn+$GjTqS5@{P2Yl9NBMOv|vDLGReran-rkebBQE|<{jGzy7_{b}Cob+Jlg zco=am-dgyZgF%J(Z4lLxnbDKnaY~kXm61qNRGej2#4`{xLt!mvB=dts!7UEjC=zyI@f z>5aIyiz0*wAyBd?gv82FIMnn=S%`vp9s-_XmQHimOsvw>Hcnd<+c85~u8?AY$cz*f zFCrjFjAo|GYNQ(wfHn&Hu3hG(k_UAf_@Qi!jz4kyJ7WRMS!d7Cf*}Mj})g z#LyoAZ2VulaG zjaZ{96vzThU>N*ANwbn$LNHK_5Pe`2(uTpn^{6>Qh1rA7K{@0t!8^|Dv8VZu-7ECfXDI<_q^TLY2wV_VvU@!pHKv0B? z8kVEwVGC9cRZvO4*X2T*mYf?7BG$0*OU>4Yd+E7teA^%V=h*X4UH;K|Q__VhLM#S;jv9nnGt|}uqGKdVo6ZL^gaMetP>~Sv!b)kT5nkdr zGK?a}aS&)-h9e{!^8HT=;F02Rypu`-24x_+$HDRPP&xm=~gN}%TAX~4YANb|yPe;jm{KT=3 z|Mq9U`;9X(9I$1GQFc9;vk-AoBr|XI9ovwD$8n(H^IaQl&W4y7t%`#|&$T^cR1j5T zS9H7G0<)y!J>;8wK=}19eEP;uuFPDS!EVi4r8E{MU7To*BFoZ9m?DA-W1LNVADS+x zF<4r1iE@acUX<&?Wg*06uY$a%xqSHlTCiQ`6EA*xZtA7NyO|;pg(jhAA_nk7K>+J6 zK`X``Wk#$3l~1YA+<0mXblePO$(DaHwa0Civ;PH9AQ=a-dQcev0000