# HG changeset patch
# User drewp@bigasterisk.com
# Date 2024-05-20 08:28:12
# Node ID ae4b90efb55a54f40a194674d7c70165a82a0f08
# Parent 61dc5bc8ce2ebb0d3d5a06d662331c6a1c4542ad
start calibration tool
diff --git a/package.json b/package.json
--- a/package.json
+++ b/package.json
@@ -26,6 +26,7 @@
"avro-js": "^1.11.3",
"d3": "^7.9.0",
"debug": "^4.3.4",
+ "echarts": "^5.5.0",
"flexlayout-react": "^0.7.15",
"fpsmeter": "^0.3.1",
"immutable": "^4.3.5",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -50,15 +50,15 @@ dependencies:
avro-js:
specifier: ^1.11.3
version: 1.11.3
- avsc:
- specifier: ^5.7.7
- version: 5.7.7
d3:
specifier: ^7.9.0
version: 7.9.0
debug:
specifier: ^4.3.4
version: 4.3.4
+ echarts:
+ specifier: ^5.5.0
+ version: 5.5.0
flexlayout-react:
specifier: ^0.7.15
version: 0.7.15(react-dom@18.3.1)(react@18.3.1)
@@ -1086,11 +1086,6 @@ packages:
underscore: 1.13.6
dev: false
- /avsc@5.7.7:
- resolution: {integrity: sha512-9cYNccliXZDByFsFliVwk5GvTq058Fj513CiR4E60ndDwmuXzTJEp/Bp8FyuRmGyYupLjHLs+JA9/CBoVS4/NQ==}
- engines: {node: '>=0.11'}
- dev: false
-
/base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -1651,6 +1646,13 @@ packages:
engines: {node: '>=10'}
dev: true
+ /echarts@5.5.0:
+ resolution: {integrity: sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==}
+ dependencies:
+ tslib: 2.3.0
+ zrender: 5.5.0
+ dev: false
+
/elliptic@6.5.5:
resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==}
dependencies:
@@ -2550,6 +2552,10 @@ packages:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
dev: false
+ /tslib@2.3.0:
+ resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
+ dev: false
+
/tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
dev: false
@@ -2794,3 +2800,9 @@ packages:
resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
engines: {node: '>=12.20'}
dev: false
+
+ /zrender@5.5.0:
+ resolution: {integrity: sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==}
+ dependencies:
+ tslib: 2.3.0
+ dev: false
diff --git a/web/calibrate/Light9Calibrate.ts b/web/calibrate/Light9Calibrate.ts
new file mode 100644
--- /dev/null
+++ b/web/calibrate/Light9Calibrate.ts
@@ -0,0 +1,128 @@
+import debug from "debug";
+import { css, html, LitElement } from "lit";
+import { customElement, query, state } from "lit/decorators.js";
+import { CollectorClient } from "../collector/CollectorClient";
+import { getTopGraph } from "../RdfdbSyncedGraph";
+import { SyncedGraph } from "../SyncedGraph";
+import { Light9Camera } from "./Light9Camera";
+import { XyPlot } from "./XyPlot";
+export { RdfdbSyncedGraph } from "../RdfdbSyncedGraph";
+export { Light9Camera } from "./Light9Camera";
+export { XyPlot } from "./XyPlot";
+debug.enable("*");
+const log = debug("calibrate");
+
+async function sleep(ms: number) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
+@customElement("light9-calibrate")
+export class Light9Calibrate extends LitElement {
+ graph!: SyncedGraph;
+ static styles = [
+ css`
+ button {
+ min-height: 3em;
+ min-width: 10em;
+ }
+ `,
+ ];
+ collector: CollectorClient = new CollectorClient("calibrate");
+ @query("light9-camera", true) cam?: Light9Camera;
+ @query("xy-plot", true) plot?: XyPlot;
+ @state() device: string;
+ constructor() {
+ super();
+ this.device = "http://light9.bigasterisk.com/theater/vet/device/parR3";
+ getTopGraph().then((g) => {
+ this.graph = g;
+ });
+ }
+
+ render() {
+ return html`
Device to calibrate: [ ${this.device} ]
+ +saturated pixels: ${saturatedCountDisplay}
+w$0#<#5*k9o9Y5=jDKJ6 z>|@i+La?se8~>px4CO+bBIK0$$jH>@3zNq*>G|`W&x>_4;JG&l& BMI>u1}~rfx9IZnsflPF!*TE zC}~e3E;yGvN#sw &Ad;s~l$m3Kt z6ZO$?foYh$3!9)%w=z%n)UU#N$g(%k6&~`QrJI{>MhGd^fzoUTdd26tAcEyK(Xk vHG&SpoHd{;o& zhYLmiBkm&iP}@TYq1{7;ls 4d zib9Gsw>c!@5HrV5GkhV28~~IN;n@V6Zmk8aW`1}7@cr$$9V&d_24X5e+LjAC6a+xm z#)}$raWUgjkw f@SVj&o z3z66L!}X^{b8hbMInWdPD@U6E(GJm4KP !i>5A3Z4}mZtlaJ7o2x$ z)Tu{D9! I7X1cZ;)x%y=(uUy%UEeiUF-x~5ev|zT_>`>;6nWJmZ3AP4 zwZ=f(e91w{R_#_q9|6)>Bcmhe|AW0LZI5$}?A=0lqovYbPk$Xy;@k9GTeARLt1LmA z?Vw7_OcXlC730i31}(oUQoS5_c yRJ5LO=~;7u5dr48iE|M`1;GXKc!R{v zdOiL1mV%bkqfgiTEpFo`@+~>mv|s<|_Y!~p(*Mhm)kpFpL+&J#Hv$iPZhjORmyNbC za*OEh!NRP!NEYxi;$Imp8fBR-+6vl`{ZP@k)Qi!g(S@xG35f!j!DhwJB3XPz^O4mt zGoL3lvH&ZxKB*h{c7X0UQh`+jW0%HWs=3rjkQ9_8X8=$EC_PogeXaKyShjV+SfC6; zg(&BZt~c}^`SR4|`j*CE?Ml%|cO>_Ht5j5heg-CmIJx#@q##y?cuk+5^?ZhWJ6_lZ z9>gdg5ESPYBZLy%32&tHuRpClpv#S5#nnACX5ASo jzH7j$~d;vsM47vo`Br2KNWj-~-fD}Trn}Vf1x;+t+ z5OMRbIMWR9SI%GbYRz4f<~Gk&Ic4_9*L1F7jW%!@6=@bk?tX_##4WEJW0sX# +~L2 zLXdHW+g}HaD|65V0e=nrg)4_cOF|9oO2r`%X# WwQrbwbn$@*fiAWi&0S@RD$}Jq^FOZL#Hs zxaVQdcnjH&*ScOKug{I<@G8?v?Iyhf?lK{od_+kEV<41ypjKR$PJF;Ez$#s;nj*dy z; tdy6$app>q*CB z*QBpeJdA f;3iy(Hdp5y~-&r4}9{Xh2J zGcc~=dLJJ3X7z5lNV3875;}zTBbX98!~_U29ZW*CF`>p_1EIIjjSVCadgvsW0HK9Y z10;lI$#RioNmj2`@&CifvuCHAIWza}O5}Z?Ptt04b@%SQGp9V~dGH8Vi?7#z{eKz% zH&$g62;9d;fQ!>Y(518KFi9o!Z|LXqzNa;vc5Gu5D|n~0otRlvGAux|5m!GJRo_Yr zC`-vPJ7+ded>Lb%)t%q0m&a0nmFplm9!ifOI3z{Pmv)zy4*S+YBCL?edfq_l*%6 zL#i$*hpM6s@An5w+^SP^n&*g0tZ4+r+IBHb^nEe#1@SPnXLWFzu`?pntj5Cz@46tv z&4!p(sXTT~y}`wf6Ng{Y9B|M^_*fHV VDWJEmD{89zFD)sKaO4=zvB^rt K)0xW-tT2dC!Y74^*n5U#rP8> a(oEbeP2Q0|Yy8=v4Ts*{akux$G}V(RM$UJ2+$GNHKl`H`f04}zCKXl?)$8I3 zS4~YR5n52Nfd2qTu0t%5O0#Fe#1;pINQLYI+-$cbsbp^c+<0%mT9hP}#QHiYPcr(0 zKG*XcQQQjp2uZlFI3o5Ia4(Of5kNlBT6olE{9Iw54oE}LQdk*dFZD#_N%LFgLw_My zITtfOQYOUp`Lr)_g|v`aAssvdm1?1aANeKgE^$3 (YEAL~Dt{~6cPkKYD-XM0p@%1O;w3h<$}i|UnY z+&*bqsTbs3VA_=-(f_>W^Sq-C_;H|opv0Jevg}Feg<8P@uCPxBG QPDOm+1yr$nL?;Z@*jxx=GFd{Mru z_%3SfxNiOrWgoh|$nuTHP5;Ll!J7bMXlnp1)-+ef24n1<{?Vc! Ot*#ub)``f{9B_>Gd+V0G3t_-=>L(?N28q)~o zSixkZLjljmczHuAlyPeJ^W{_>131R&XK3gIB1MQXHaBmyCbrA!T}D^HN$=n{g0`td zxzl-v!gWzLRn!CW9|JB~L_F8?95YC{xwf=JhZCIwiJ`s6F0>G;>5#zhBy!ML)p&Km z)zed^udH0@bVV`7-s{KWY}1UNH1x&4bf-Nf-W#wqCmtjBO7B89u0@BRUx?Y+vs x#6YwgTL~4T$7FxX0 z6S3>~aR#aW)>+-@@h1;!LMOc2=VK}d^`a#mQ>ncLiKrh>{x}XBa9C-#+9tmw{}Qp2 zX(yBrh&~1Eh`~81D|mp*)1;2-4!8fl8talQXkDPsj>uj?9w#Iw8?eM`apm&G+Jf-9 zw(F3;{&nJCO@ER!0Uj)UP}qGJBo=%%Mc<%>QbCYAMsaS*tI7MY|HCJ{pIp?o$Vrqc zIAGi-8Ue`($^6^lUWbt _?w%gfwb4Q6o4|brAJH=vKvx}YMBznRO`BoL#hy}6}jT1 zV)*O)mIxUH7QN@?%~P)%N#4N;NF&5#O*)=I+!fBujna0YXgh}vsp7(;I!=PSvfxU} zJE%I2vBnjx)PM{sNeLy5oWz{3r+oe0)bA(`vOOa`#0!d8Sf34>%XhFibq{Bb{t4){%2|FQhXsW$#yR)T%>*c zkENP&3L@b `o=MZ6q7xFwGT&2pH8}Rd5yMCHR1> z3ZZ6T(jvBEQR^bppClC**f+Vq^M3fJ=_%9UZfd&JU+eP>pqKS78{9Bxm02Ka(9$_^ z9IBBv0;0#Z3d9}}i9s*SyU_a1+ox@B`co|CJP`-g iJHw*H|HlxG8-wWE%8_Z zC7KV+fVB&EKtFcTyYk445x6P|{Hc3%nhSAi;+0;H$wFMk1u@9`<=S5&dyGdNYi9k- z)a9uu%TrXrGVYbc0i^-^r}c+* t9LoC p0qgBRNESRAo4bR1F6d zRnM= $C?tl(y>WhR6eJ2R)Yhv!J&*^e6juu?|)4>S5nFgt>XM9 zLvWbp5CS@n68T30XEdF`e?X)yo+^84{j~K93m0mOZ1iMH0&Su=+}!(&V=0HVrq4 zpATy|Od{IA7`<_*am=@tJKFCE_zs(;ZnoR%-C}gXFvgB(h?t;EOwweQS|0^(;Euod z7T?RjI7#qDSU?P1aJ>s6=r&VOlma14-O+xBme*oxmyE9sSVHYkt;eh24IB#y6%LA- zE8EzTIWGG+>oeit?3hCg-f2oV{dPz3ZCC0WX)(GGVdJNJgGS=qRQV5xNwrZVTT%NW zRwli*yG@%bm)A&1NZBW2ACr6)Qv8$v6<|!6{n^c<8davYx8yf$MQLr+JoJfcPc*eW z5ayjU`yS##uia7nu&7PGCZRH#76I+OwP8x|`8SyJ;RauvM>eBw22yW$r1TMwV-Q!n zlsO>gzD#Gd3};W4PYrD{uwl4?#U3GVz -%`yxu|E11G2gf&eRJT(&;~{G3sMok4eF<$i?ZxtH{K>mP{uZX9*yZ5&Nv!CqB0c zEVsCFR>Xt?R|Q~ )Wa&!X&lo55s-+XNwKscMlPfn&9Z zsz7aJZMfg1-(V|*I@o$?{-xTCM6FWd?HQHJ0BdX7B-=XnXT{2)h=9)5Q|xL%sz@0< zp>eWQik!xrQ=}EPZ<<>*UNW#!O ?P&j0_h3qh#|q~Z2);dhQA2(l_*oKhcp~=T;p+fcHEg)6J@$U@fd~?lB8;` zJr4q>HJzrG>m?mTJO;%}k=}sJ4@uL?4^viX8e5P^g-=x_C15obsi(j(#3G$9#I*%R z2|>WyG%(a_sEXXMxP}@+@XkocV2my6T~?M<=5#!#<(x)*CaitV$#rn!=AvNM>?__I zurxT!7`v}C9R3)tm=O^9NyZBi_wgnw$*C&&bnBiF5u(?o1XD#(0>TYZdo$33ws%BB zj0!zKF-1bE+X)5I)S%x0_puX>RUgz^@?F>xp}9drdm +J`Z= zq;m=W1nDc53T(tu )AOJ~3K~()ryoBz3zDX)}o^e987Eo~T z+x5oM_sKaYBLiJ9Ji zJ zwO~81Wu9;vrjV*;ubu62u3Rf6PzBS&^+YI&tKvM8(V2+J3KFqtv4C|>q?>zl(arm3 z?*FgJ`q0ocibjlFw@%% l8lib4yc#C z+{MJy*Hfd~s0&*)%5WFuQT+;UX}<-3f;ZjC1ftfJADqOPtazj14e!@#vuY2hl(fAw z_LlRTE=zt>RO^r~JkkAx^vDfGH`vz-=FgW7%k_k>Q4)t>`&HXhUK@*Xtew+$=4675 zgp94zwq97MxmA%W-S0boPmK6O*V=?*s93C)J)5$3NNBEV4t|7?1wyyY4SxgPD`PLl z*cAm-oxBsWPxx-?cgPgHlc`n^K-xVXoI J^v=UU=HQCzxjS_)|VjE(@NjWDG z%T^Ev)km>~t(~fXr&J5#RJt~0fhRc>CXouhg2RabwVX&PjEi%{JxF+?S7c5&5iG1K zNKD%q=j6)Ul^9YI*f+yyE9v1jZ^h;Lm&0FiqA157O8 0xYSEO0 z;o5br*RdZO#7CCExnmqxw_ZKQ8?YF!Bo%5{0`ua$d^7kB{8e(Qas{8hfQ%1{2!k5z zZ@CiFxZxs>40T>(8@=K~fho+?%3L6jjAjv-XvT0Rm|i3C!|g@4@0Yn>%~ZEdNUA*& z1t!Iosm|l!@ZiUNFiGa-5Qzoh0=EDCSbidO =8+=D8SHLp=upI6s(`7(L#WPk6&c}0(p66LZ TwKrzaCie}^Aho^W{j<-%CX_16GU07ATp~ewBJ78Yl9bip6z}%7MHHJ zS*sF0C@^{5^PpBV_|(M1s^58Ip@YS}#OyH >=!t&(5p)A4>b6TncGKb#P=B8Y zt_=hi0xJ)8Zj0VK0q)}JP=_`sQ_q;S0ZEjkFqwC{DhsOMEy?_ve7f}Jz8U*=R(BFj z%De%~L8j9PL*Rc;`M2q 2)Uvld8E+ah7t;)Y>K;O zkTjW}>V7KD3#;0QA<9QQ+5Kd|e{FI~Jw3-^CI`A2tI+CcOKly-*gq%z(<$1Jq=dM_ z2@w)0$GqVsvhjq#Jz!d#u2x{Q6?S^@6H%D*fJwNY0>nrsV|fN8>ReJ{8J8r|G)xs9 zr|TFGjnySs70(jLPRveCNR8W0la`RCrCBX#T_Apj%J`C)7hM1k&Nd*|{}B_g64pie zcDi^|m8_Be>A gi60ziybVTbdzl2S)-)h7sHQy37RPx;*ARaP~w^YYH4 zybly5hp>7PdKWfWVDT&>Ox1O1gVzokY4w|!S)AFjDGoOg$5pk &Nvbejtn?AP&^`7o3z6 *^93@*bLs|`5e`vfTZ&kcb6?BuMH;!t6VuGA6wb!_c@iX@mAkE^(^1QQf1NFv4W zv99;h>pY=DOOkqRq9#f(`5A--k3llni4gOPu{PtoqsU^qr;gaVQiYu)oP=kCP%ae0 zr7J2|SW8M;DqoCp%J(L{$HQXbqJ~#N*v3gD{u%el*oUWXrky6#<=brmSLv&Jui4wF zDg!a2ZpLNnF1w=j3K$n^(vpFwwB)D>dTXx}CPW%-T=V!h>wXi9lSWx0c2D1Z{AR$a zhWopH7_s?}rTSG{dsAJy?o#4mTvK=rDfl&y5{eQB?uD*Zobb4%v1L66Th@sMG*@b_ z6L`)4#I+jR6OR(NE41@Y+Tn`3OZ*+FDg1m`a@Xn`s1V|X3knuMCjbiO=FRo{ELLZZ z>;#!3 FlZ6a547>SWJ2lxZ*{!AWA%opP0Ee(m)o-Z^!kyE^XRJ=H*6uWF zg^Z#!g20vBr_xv7?t44(b+}JdU)y%=qE?G-=yt0}L+vog-f5MO2=i5~`s?A;rc+(t z>Noi@+55xUfNyA*FB-(HjG6Vgwfo9-ZPaQo?lB^O@XkeH3fFU?Opy!fgcOzYB}R&; zv@w2gFQcg`Q$xHmq=OVS|KaJQd6KY!(u&cC3vIhm+Zxxd<}Je!$112^D~)BlYEr7Z zqhK3B+|x0tcXm$RIj#cNLWV5-J3m3b_x vgziP z${XTVQXRXuO^s@VHxIi>HK|6?uS|R;tn;7_UYbT@Dd7G>>P@ZscR2wnJ3+PwgjJIq zN9cZ2K{sGkvg+;*EbZ{_6Ens}rbmjym#@3r;~kLnaar#&{sZLZsGtl69NRdm|M&Nb zzx#dCzf26OiuYl^o2aax{L>q~Zy*V1jG&EeO&0gZWgjO!@_%b0J)s|^MchLJ3X=&A zwrF3y*QY6U2!4ty6-W!HQUr&{uV|I)Nw~a>T67^wCkBU!u8-ru%mX1Q#9CGIgIcb` zy^O5MoV2w|?Ib9x#1wN$6OahTs-cEx5lYx`m0Ya}G8((hO1VA9#m3d*R?~13{cX7= zL6B|5in_tN@wEX91XpodS8W+lg;kMj+T@zE>M~1TrXh&a%mSrJrPk+A)aQewU%@La zPn10|G<^tfKdacket!`dhU-9p9jc2u!GeMX*62G#EG%3o49V~8AQ}8gG!SjxYy#Bj zg*TvD3B)BVRNjM{pM?t%?g);Oi795PtUg@&FegSeRyAt7biuWGwf29mLTM@lXZYg0 zC@&d_HS*B_$)Onuwab&r@z*XYScH_95Jyo8oW$)HwJl-__lhwFEvvn8X6~89ZAFFD z3#aTLW3vI%eHoq7Q!S%ii#IFYv~Pq2t#(&sk9{-t{d(%xlDwR09!c1tTcK@Nt44mI zfRE@Uv7|F{&QNtUDOc_6wX=U;Jh~Y?)9uDLk$7#chM=)XusB3rosO9qGes@*#hw=_ zFM%|WC7nz5UcEQMD1Lv^`+lDV4^P$l?e~M<$8-Z01%GiNJy7z1_O4MYtC3nr!Bwj( zS99*CX6bCXDBwYAmjcOUVKgxs(j-RG#}QGu(Cem8yCJx`&0pL`)yGI#9%;Y@q^7HO z9SHcS1#h2+4y!^7!iBz}@CIVIGsYXRY06U#YMg*D+NIr;BCbtg7Pw0LZeSbAlgdq& zHR7)0UFt&`4pE;22Ra2VFVNK3%ahAv@x{XtJ(H7!w3 JhdkPDSOBPFy^iJ!I=WQ&lARYpKxHXg71~%D`BRVQXh=w1O z2O>5O-{~8@x7Tl2PydhfkX+3CxWdDA`v-w-(mV$R)t$pMc5lKKE4L8Gz{RSh*jkm0 zb!|%#%~gXWoj6^_3RmfS(`X#LUxe4w>Y>#pBD7XMQyau5ummZ*yS`079<3T?kL3mo zb;z{J64$p~f8yE`GnQvay2`5BfCSi@QjID i#$p*#tzI({GF%OwM>n?W(Txo@4zyE45Ykk) zhb=2UfN^)R%nF>jW@fAxcU-+MQaP9yxiI!xvlnFpmiqL&tftCDUy^@`-)E87xnW__ z3aWliZ~=4S#}`%jN!!^kUcq~cSgbi!&Q?p4N_S1)wY$1ongkQ8hc|Em3IV#?G+mm| zHCiQN=T$qm47aEan$(0;Au%T2^R2$Oo+xu5i)h7g==RdPuMS~WI7}WtGOlxL`>nUM z-@;`a=C;gL`E?TLN=%`&5Rfq>EA?6sa3Fr2`|F=K{@f$YN=`_I`Vyz)oD#R>fIBX@ zLg+og#)0d62+X(C;6MwL3Y~OR0(`We0%AE7ar4C?>7t888F>jZCJsv%^vldjpPZOH z5r2Z;@V8c$ymCdQ`e0FQQ0rE0RUg;x(0(<@cCLk_N(4(a{0mBCiBnRhWF=-v%TDJ= zXTXn4u}@~YHn5OMk)RdlH-#w_vXZqSD5aa94t%<>ZDB!8!2$ILNaH{^wP_~wh fCZzJr7;#QC{nPz3_kXecMdmAP>9pI~Zy2u%ZBbIuS |r$3hd@tdjNnEq<&_lG`(3>lI7(4_TBr#Dn7QTwdf#}u1FyjAfQ z{B=>=B0uqb`EITEr#0ME=&!J5T9>rhXXsI;byQlYgi1k%aK(_YpkM)?!)&N(z!wb` z1N9-#4cO#P!yE_Q5QT*Lp?doJ;G#b!XuT7xOnQ|OK%u%Me4jv>T6P6qQX4~*CYSD( zzFSUWj!JM7CMp8^W$Y&vxYQb*E7Wo#UDMmD-R3m!$bp#Qm@c_@``;Ben#9Ax#a|^X zDqIx&W+5%>MK^I4;if5@Hdg6J%T(7`W^kqoNKm(GB=wHOiTN*GEjPB^cx>abFuJ0v zxPLtP<4_KX9^7kFSgqx7e5`hNUS+X36p;}9c;@BJYp80V$SZ{o&r^m_mz`{%g+7_u zc&J$6AdaCOyOxA9RA?E_)=4#MiRPyEo3t0il$6n~A*_D}#2>o;5bg!xB+`Z~nng)P zQ ^UIRTvJ$e? zI23W=W(Ime{Lx*FX|vo}bZ5Z#ha@J`&~Qmo3B_(1s#|OGOU773RYUx%Cc^v}M_7~Y z5+!H ~aPzSZ|u z &vv z9oot;Y@TUj1-}f8!ao#LLou ~T+w)u4Or%uO7AB*JTrV_rK@@0@~(lj2Ug>V;@j-05oMj@hm+r(;1#|v8*s@kPO zLq>{Rt*63u=KH@>{tJKIcTJ>TND%;$<~xL2S`Z+53=$T#Ez&B);hxq`4%T#VzU>cn z17?if-+4b{Y?t&v?fOHr4uu+o*@@ZK9)Py>;#Y`}gqgGr?EkF)kNBB5?WzUzLYbX2 zJM=)|^$M))dCUZh>f}xBHyzP zsKEiEN~;2TUNJE3I k03xCt-yyhK?#=%wS#gv?*({+cO+<|d~?@0BEA8>Kj@ z_`JOHoL=%m`3v|HYKLlxZ*|4GD=Jee)c^};-tD$}+^M>b!3L}<@1NOpCe!J&I8_po zSQ1=P_s_H!ptLhWIL}Qh*US_Kpwz%tJw}4mi{9vqoG4@(RSQaf4=GV}K&!IXdtX1j z>GZs$yv)SRq=Y2Dj7s2@-dFHy$5t!1%37ZFQ0GI|x4LZIW#VU(lDUA1%ByAf#K_BU zcJ^%R`c70bPf18gVo9dl9Y%)`Ylo<2sKE`bRpam=lQsg##1wv+k>dV_2*doHNkK(} zxj+g(4^mDkjXVjZupsr%AV^I}Juve?UNEn%ByF5lRr48jGw25(h8N0fBZ{7!;3)=E zq51dt#29SAr{tXSugU+?hJN%n(TW|Om3tQ3*iQaasi&_N+|pEkn3)+y>OUewqk4>p zjS%6JoA7?$`*Hrt5SKSm^Le^FYTA2g=hFB3-cvJR9&9;5HA#gl^|yoHez*QR#@NYC zC*Rm^v30t(%^~hF@s=sEU0ArZ;8JT`FO{HMhFd)T(F;BL?1V^ e-lr z$h3HMA}QBbWyWERLHxYy>RqM3;tdfF-WJhLFrU_R8Z>1(uVpm*48>#`hl%OAb?Vj! zWFAmgSvNVE)JDut%8%)B)>qYY>$$x$_Tm90q(}V!8}MjWaZTYhTcvHKm2|M&NI+F} z>I%J7!pQWI%L*?0c=E^A{D!pE^~+n`o*8?Zo;)vq9{rug5W?|mj}MXo#|RQp_TYM> zQi`B7s~$ubue hXEol YE! z$EXPWRx7s(<*G1+v!;%~7;M1M&)JHq dhPq@Yx5|r(G(Wb4IJyOYV%OGvf0Ri0n(8ofrC%Jm2#? za)hw&BOp1Q(CZekab_h#b5y5PBNUBq2EPd 5rv Ea|_M(UI5*_0j$VxSQpE&HhJsnBvgL0xYNNagC&flq@Uo7Oli2-a0c8M2xN z>`quqQr^G2<8G;#Ayre4Ym9JPI2}*&td#Umz8(A)kvl*HV_kQ$AE*C#r?j2;R=sSZ zos=siWvul#4l8F$+dHI-OnJansZA?P7!YvQ?zE=Utj|Y$5riKUl!U|wMxF9DxB$XY z4%aJ<;^ZUAxQY$fY9AR8PU8P`Y?`_$v7RJA)Ny-f(mPkTUhP_8ia$cwfCDx~paYLI zN{@$-D+X7@`D9sLAA~Idhjlizv$~Tpw! Qqj>3#%i1s)%% zDoTnnh{Y!s&Tcw8#9GdWlRvyD@1lQA{uhPWC(1m;0Uj$e<){f!b$ial!G(vMbktQ? z!(!<^rKD@FT Z@_RAUGVg*at#8ICbRX*t=Tw+RR>2} zpz+zzfAs%Db;fqZ*Mp J3xv#_%^yz+eY&0X0DoLoeS79rfMR#cEw#p`IJ%9f# zQ@1n*k-ZulN4RYuf>1=gM)4K@D)(0m3?|*$uAyZ)>8N`EUTj3DMP^*u>9MZIU?NV} zNK&C?3BA_)n)e$9xou5ejamaP*sAzo(g(~ikFca ~|%{F>F zj};`w#O|wi5B{E?^p8%OpWPhE`2uQ+jTK%le_4G{TgVl|1~9Q0nmz=}+9C_YDe?cF z@^9kdAwAs#>km{Pgw->|7MhMNR&D{eKwdh!u;s$|e^av>X9a(gyc$gYUGhmwU7i~5 zN3d3>hS{)_5T ;Ug6wWG92>Ly4) zEIqR4>OG17^oi~#{--uzZEOh5wye1kViC`P-1ca}Cw*7%!xPi%vBO3AM&k6GTutP~ z1?PzULKRE9md5V0(Cf*rkl2j;YSB`nHmlQIHj=LqXJ03=r1SI67v)f57Kr4v0RiuG zuIj7>rMo6op?UcPmX7c{D0KLxfTrY+Lu=>GMH#I)r`g%S;No=`<4@Rq_3n8!d3Sc) z8T#2%W4>c19HZ6KP*qU0m3Ha1(t_!Ya0jjy6fD4>@KL|a+jzUeI0AEV-o %}Gnd3G|VeSmQra{uA&WU>`25J)Xll0E(DQ ztILhB {ntqcCIBCsl zvf<`m$L{Wcnot|qh8cA;glPGq) ;-kqQg?Oc@3jRB%@63NVp#A{-V+l#y4k QTBSjc6SVbR2P|YVGc1+tb)+@EdDaGex;;%aq)>_~lcT13_O9f!9-lQ()6xd0I z2b47(ZVxA})g+5rd9_5xl}(Ve`#1D!+d9%VFO5nQr{N*COWkh6^bOMH=Y)WnuE;th zeI(N;3UpGZU`}%&vhmdgSL07m8<$#&_y`-Bn>RO<+eA#kgg6x)s|{ER^YQi%g0AW= z>uv0LguwMyt79km=vjLh0*J;nQf~V3YLXqPRa^#HL-l8Pq-$uykZ?DXa82Pg<9Q!~ z{u~hdXN)F@d^iDLjt|c|JjgMaoOEM~aPv-6sp-T155qm|12d!O;<+_gn9duh()KWA z#T4x>A|WR+M|$MSf-8~#B`E79wR%NpqKc{tli~+&Js>_pDvwn{Kp!NE@j28Zi-QMD zERgiQe&9Pu+mYz6HI^H&lv7faMYRU$TGqaF8~XtYL1-1Hf8YLl*XxyoJJ@(%^x VAr7E31V%glFoP;K{K7QP|6Lszqa!KAb>b_$2(L z_b>7MLV2(#S@#6_?wGl+F|&SVJU^P$P0+@gtA a#Ob$ixV{QQZ-g~^d~oFIs{E}VFF1$4+5ryDSIK4-K#6;}X`9T1tV zOV(YYK4=|OphlX6hX3HS!5Dq&hT#Ubu?sS{MJ~k%we&g7bDryQTPglf8eu4?` J zJ;oUl8CVeFq=v%$miY $?kLD5>hzm~ixjqxlao zt7D8Elz9+~=8g$ckKgv=Dg+%OOx_s$GvXn>1k+?A@7|ewTyR%A`m!5JkIV_uRY8Ps zZh#WjvBt|iFI%5uRrI8983^zyv^41#BaEXB*aWV@#`8##@pus1pjOoQ!6yTsh@a1F zI@6LU8wC0Ml6B}c#Bo@|VVYG5NI8Dc|ABS6L<&U5Wgka8HYji}Sj}>ZkVQ%nxQNoT z< q{Hn?d`W~pBBp4C#58CPsu%gZ+=Kal(6ed `m^^kb%k8A3_*rV~- zfl`jUt=`S)JU|l1b%oav16v8armBXkM@%>Ze_?rYIdQkXyZG) It f6#gs3Q^!nhegBfF+)@`~?nnsTn5jiH# zTwRzKR0!681CE73>3fspQJh~j|4O^rh@ps3rU0$LO(>mU3Y>RHvwI?y*N*NeboB!P z-t`n0x~XvL{k3WZgEmdsRD7pI-xU>nu2B`Nuo{znHDy${@B6{;J mo1jpVnWPRLB@hOGtyoHYm9z`6)^As1RYv6;MDg zGI5;Me3mt8kHj2gR=l*KO53C+QeW?>8-qJ{iTmr5NuM~qEzx5)_=NHJ%79CgO6Al< zk=>WZ%l HP-z#(ACiyncgJ0)RW-aOZ1;1p<)M;_jAc(|u%QR^b@ 8 z`hq@N)Z~wuPV3{GT-hsz`-Ylu(pot)5Z34txRZo89xZ*8{$xK#*z@zwr+-WjoZNJ> z_k9r-5b=GA5^5;6m=abGtv *uw7adbxu1I59cJ0$co~Q z?6hj9SZ5${+JH?sGv`eDlPN;M{6?~t`w)2aP+fsgD5Wa^7N{RBebh97FOn@N4+-Nn zN*9>|bx_aLU6Xhyu4M-L5DtrGRM8>KsjU95oz+pa3(2!62xjNZ4&{BIbPR;5hRp~? zzZgY4jIrOW`_0r9Q lcSP;tF>BjQgKw?GVn3%)HDw_TfJe#Q2q~N z13o9u!L5@b6iifUKp?~lC=r<-G7>UOe|n%KDu{*!>VvWlGBJQevL)r#(5GFBQM91U zQX`8m+-0Sny<{F@1=O6f@{p5Rvd6a|Lip`hZI3@w^0+m%v^`LisGmtiR7AA6x#(v4 zlLhTX>mZ9jtgzO}7L_u|aedqMY@@*gkz+-K@VSzpI_z>Tg;uBm4-=7~P%yEDDC4$i z+Y;Z|x+_p{ w@MBLeE*B?S9tj7(&c~0@}t%0%~d{QdMMntm`q+p0Em#UA*pM zF_izq*nmUS)(LBt*SgIkoJK!Drw+vbI6pC8yJETq1pBPfM;H%xJ-pwV{j4wNv$I+} z+GVU8yB2lfIkC!mNJG-nG#3R v5!&>~9s23Or&i@7dWc|}2$#~nw1hOyrO-CNc$f70!t1qfMd=raJLs08C~a4h z?6AkTpoK||8Fuld^v(mgb=b}AH-~j!9FTcH9Cjb6UdT_^ms7rkkIZeE`&`d+*R)-8 ze#`l$MQrbkQID(}+HMH(@Pcl@rZ!L1Y96cy%=aEH$8k?b)POcG8{+ykeh4uE;t)o1 zl;YJ(JugWQid9VOPQe(vuOw=ouYRcBv_}$cmrVHO+FyosPM~F$)W{JKYupa$QMnW% zgP_JVlugS60X5mRI_E^-azcFj;RRS%h0*q5jkkoAts@}ap^V_)wdG2Os_B2H$OM_S zRcoctLDYD(U12_XFEO@=c(WpkO&N+qnhNcd6asGrJuPNUm=(M25Ei|HcS*dlRq9sK zBd0f=et*aPCIu1(%9i1}sRrGE5rO5 rB3 z65KX`LUd3m&?d1LO2Ychpk|s=8~2=*dluz`tQuM+J+fKqX3*DYY01)(q*4E(z72g& zXUXHHu(qy3foez`J8&vEpT^;R -xe_8J`QN`l*f84Prh+*~8lBh3>B8q8+w$~MUS6+qG zN`y|16fB##O#G}RQHSUNAz?wm0_3lV$^n#i(#C=+&TV#9fz7Y+949q#xaQ~2Z>(zU zs_qi$FLSTNs`vFFS@tHyyOZ8!v{tAj401us1> -otZze~pcX^fGgBY8p|XK7HnV;vF=5>+W3P_t zj+=^Z>Y3K#Dq_cRVouc9v7}QrZV{rksK8G$e 8)_-SGi#uwYW{*16r8a z0}?nT8x|XJbr(8_9iP&qQfUX(j?)NyG$6O`u5P_rdPMkG1V20#t}_Dhfh4HOad;Lc zlc&0xh6q#Nq G>*;Ba(ZO#k@AK z4M#K_!5I5&;Ip^;-X>~?3P@#k6Gk?Sd_M5`9_f1=pM5+fPvru(jIpZ 2?(%rYLcUkEFC1CMSg_XKbv< &f#bqwx=VKj7DZc=DO;rHdQFYi{k;()B$7c@ChU-Y@~at z+Jrz@$%%g|`;*59(H0CT7n{~yoDb|u-~rjoy(G>ZUE2D$tyELz%~Cgubs)~`PfqfL z#tKlh@SJNPu0om;v^q?LH3Pznt5Qb^!d0LuL_F6WVQbE6oF$RGtiTg`uU%8#H@*Ai zp>4qNrwWUL-eFmG-BF7A1Y?Z1l<>8cqo_7&miNi-C$&$Lwloj$Lvj^mMVLp(f>n@M z0Oc^H;l+{ZBi3z+5y-=%J5bl3yw8cN;ki0>Abh1HiD{@0yhZ93*R;mUl-rL&=^>f> zeEIXt;4c1~b-yu1_gAdD!urlmHC0s(9U233m%xA-o?2v%QE;=Ua1q<+BlP2psJgf6 zu?<0yv6Ki9TK%t6a!wIH3k@&E*m-&9g?p9W*nXp6K|)p6u+nZ~5G)Osr!Chg*dTT< zs=Kggm#7jh6u3(0#A5?~W#TI#o^(pI *>E z3p&&pA**`?EM`KOv}E7!e_yQrS ~wmMOY7-lSk6+=KQ4=gN>;i%JuV5lrgJ zDlW^vjBVtfn#TXM2+PR9)F?eG=d5tg$^4f2Lf{rEp1OK11cBBAQ7uv;b}!{gvWl&! z7&|F<-q;?#fN^LWu+|5L`5Fx1tWFOMF}KMmq2#P}0@udcf9(2WkRznaNU7PpYZsgm zl&9nh$Lf$P941*G3OGY8AS#n9@h5yg_`RvvrLE|Of`*}nEmv;&O3y2 Kq71 z1Tj$epY{KtH2eP0`3JRHfN!*7vi#oSd+E0c{)BG_zeWDKd@y3~rd{E$DZB>ij0)Yf z{WAAsj4ke5%sYd@{kCJi0slB%KO3-eXyvtS*Sd}_crzqLfsQU=h`^*+W-XV&