From 0a3b1c346e3231de97ca30e8800bc249687be500 Mon Sep 17 00:00:00 2001 From: Anton Afanasyeu Date: Tue, 23 Jun 2026 12:12:55 +0200 Subject: [PATCH] docs sync --- .../20260521_next_gen_steps_egress_review.pdf | 50 +- ...20260602_REVERSE_SSH_proposals_summary.pdf | 4 +- docs/20260607-2FA-email-mobile-auth-flow.pdf | 4 +- docs/20260608_ALPHA_PRIORITIES.pdf | 4 +- docs/20260608_BE_SERVICES_and_infra.pdf | 4 +- docs/20260608_STREAM_DUMP_DEBUG.pdf | 4 +- docs/20260610_SERVICES.pdf | 4 +- ...20260620_postgres_timescale_db_platform.md | 258 ++++++++++ ...0260620_postgres_timescale_db_platform.pdf | 444 ++++++++++++++++++ docs/ALPHA.pdf | 4 +- docs/ALPHA_SOAK.pdf | 4 +- docs/AV_QUALITY_QA_SESSION.pdf | 4 +- docs/BUILD_DEPLOY.pdf | 4 +- docs/COMMERCIAL.pdf | 4 +- docs/CRASH_REPORTER.pdf | 4 +- docs/DRs/20100611_3_url_shortener.pdf | 4 +- docs/DRs/20100612_1_scaling.pdf | 4 +- docs/DRs/20260616_rssh_routed_egress.pdf | 4 +- docs/DRs/20260617_codec2_ulbw_voice.pdf | 4 +- docs/DRs/20260618_repos_reorganizing.pdf | 4 +- docs/DRs/20260620_live_cast_control_plane.pdf | 4 +- docs/GIT_FLOW.pdf | 4 +- docs/GRAFANA_vs_others_graphvis_pivot.pdf | 4 +- docs/INFRA.pdf | 4 +- docs/OPEN_API.pdf | 4 +- docs/OPEN_TASKS_GRAPH.pdf | 4 +- docs/OPUS_SPEEX_VALIDATION.pdf | 4 +- docs/OTA.pdf | 4 +- docs/PRO_AAR.pdf | 4 +- docs/README.md | 1 + docs/README.pdf | 12 +- docs/REMOTE_ACCESS_IMPL.pdf | 4 +- docs/REMOTE_ACCESS_VALIDATION.pdf | 4 +- docs/ROADMAP.pdf | 4 +- docs/TICKETS_ROADMAP.pdf | 4 +- docs/USB_HDMI_CAST.pdf | 4 +- docs/VPN_DEMO_GAPS_20260613.pdf | 4 +- docs/_pdf_build/build_all_docs_pdf.py | 1 + docs/specs/20100611_3_url_shortener.pdf | 4 +- docs/specs/20100612_1_scaling.pdf | 4 +- docs/specs/20260618_repos_reorganizing.md | 4 +- docs/specs/20260618_repos_reorganizing.pdf | 42 +- 42 files changed, 826 insertions(+), 122 deletions(-) create mode 100644 docs/20260620_postgres_timescale_db_platform.md create mode 100644 docs/20260620_postgres_timescale_db_platform.pdf diff --git a/docs/20260521_next_gen_steps_egress_review.pdf b/docs/20260521_next_gen_steps_egress_review.pdf index 2df20e6..d5edce9 100644 --- a/docs/20260521_next_gen_steps_egress_review.pdf +++ b/docs/20260521_next_gen_steps_egress_review.pdf @@ -35,6 +35,14 @@ endobj endobj 7 0 obj << +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 400 /Length 24486 /Subtype /Image + /Type /XObject /Width 763 +>> +stream +Gb"07D3,]7#r+bfIDN>oR8bod'`SAu9EC/C#"8A$$boZ?I#[5;RjZi[p^HC-@c67&c_>VFGpQ`HBmF0l45n!M-cX)*/DlN&n6e]Th8)M&DX"SUB"C:42\7=Y;O.P_7?m'=IR9s!3W&mX))%SO;,Pm&S/+M*08S&Tj_!n@1C_O2F8.g`(p%fGfLa#p;@u%Dq.E&0CQMi?@n!iGeo)O*cNK3#mUl]g6n!]g6n5!5ddQ+?U,=iGicI*b'%!*[cL-\2O\S_a/P&)ha"!)hc6<+?]'$_W,SH*qolt+nc-!E<6E,H\:fI*/)AG6$S4!6$Sn"_W0Jq4:VVTEGlC0@W)f!-\1]r2[GJ^6$V0(KSS2!KZ=BA4RNZqj)>PNpBKS"p'0Jq!XOj6KCCi?KZCblG_j%!GancNj5(n@%L:s4D\*t!D\*s;JFL'-#`lkhGha6kLY*Q!`sEkNmL@%nE"F)b#2pa!#2sP'#`j=bn2MD@a1Xc`LqQ*!S,gFdhB4oj#N9Z@&0>;!&0<3Ln@1C_O2F8.g`(p%fGfLa#p;@u%Dq.E&0CQMi?@n!iGeo)O*cNK3#mUl]g6n!]g6n5!5ddQ+?U,=iGicI*b'%!*[cL-\2O\S_a/P&)ha"!)hc6<+?]'$_W,SH*qolt+nc-!E<;.8St-O9",!'XAU0oBCf"2,kB>KXo?i_p%.-fk;+dZp?/J@,6$OBp3>S4(@UQCmiMk5"Ggq<+4,;FSNZRK([RP>X5i:kk4i5jmG"-c4mHS1-RINZ+Mgi*a<_fXa(&HJ>+(I_f-o&qgM8%:'R;_1'_okiUidD$,DVO/I4!?uIF4H"+We#M)Tkf\G^S;Fe_A:[c]ulcrWlarih0dr5r:UTE7Z<>GPr+/pT-c'V5cGk5%6Sdg%oXr!3h')nI4U>H7k<=K7o2l.\$YW-Cpi;dCKGD.M87\\9qj'ucqm4:%#/g^DI(0q,^Ka?!.LkCCO.:ntS^X/6Ri_[sOXsf/gY^Fd\7X7,a.2i)4_*,DblZs7V8A3Y3Yc]T@XX]QB$FXm<*?#r"qGqFtpQVPq]A>?'6$OAEGD2qor?m#&9m)3E@5?-i>Jo2+orhW(.(sAFn+K[]/m>A4[.AskUC;B0iWp8jUH-=guJ%i\-e\q=3g>Qca0TFE`bb()3kW5t*7<-Y@u=ppnDK1p4*M*nUccf=;KtkbPfH=%O0WoGWbckV@+JJh;aP^K:KN3^6rf6gSiCui`5o(f:Z&`Oobp6GA=V9.Rcs;6Nc&%6F(Zs^\mo8aI;+#EA4;AGNBBn\&=?DP[,LcZJi^m6f(_Vf\0>PS>1&$KYF;@I[W5qA^LfB,cNEiH4Uejm%i&*ma&sWm]:bq10dIngO?cl@CbC=I[D^e\h!/0q_c&B;G^i=R.%m&A2,pE3S&NgNIEFa4^i(%PEF4O`'!^m.TB`KkJ`/hE=BlP_%f[n1%9q_K,b;=Q-6>d\Fh/aDOf"MD[Pgl"p#TjP]asaj3Gp.s[F\#`mCMb`/]MB7pe33=llpMQuE]>b>YSrG59i4Zk&+b%"u6L>E)(Y&f3a31R,W:N3/n^k(>,nGWHL14AG'ZH5'BDlrX[V29$sC,9"hFSZDGP$aOP`>@^med8*Y=Y9)+[H6=5GT&U:_K1/7Vn2BI[WQ%E=`O)LAq]=K`6#k@ZVu6_khdfe6leFr7StMON2^pFZQiEU=e)$k+IGV1hC00CHW_;(n/:T607\Gb&Fok*>=1d->/Z?@+0a)HP$^4#OTT1<%tB@Fig4FT.N^P[m;aL/=O/h8jfO%G$2%p5X>_NP_lap5A6e@m&pN,r\I[0,U!b5irjPSVM?V7GJ)@ir%Jn00QMrbX*fi(]`8CnqV+52"7a0Y^5p2q_B>eDp**:FPZeK1dE1n*,@hE&7&Asd>fUD-j?S-bbU&H8I-Ggu_0lTdBZq=1SepiIQrckAgKCBG!KCCi$KZCblGT741j5(n@`82V!:&s6mD\*tFKCHB0#S41!#`fWaGha6ka5J.'mL@$#lj^hl":uXK#2sP]#`j=bn.9r!n2LH%a1Xc`*"KjGhB4r!hB4pU!9%p9&0?UZn@1C_&$\&!NtXd'g`(pei?18N%DkL!%Dq-.&0CQMiGgg_O*cNK&:9'!3!"]Q]g6l_%`78_+?[U!+?WC!iGicI*f#C;\2O[(Yr;rL'0pft)hc8j+?]'$_F*Z!_W(b1*qoltEB"5bH\:f!H\:fI!JJM,6$O@Z_W0Jq4N-)!4AGn8EGlC0LP,*+2[Br!2[GHX5^;''KZE$o4RNZq6gP9!irfo7pBKSr3!bRlKCBG!KCCi$KZCblGT741j5(n@`82V!:&s6mD\*tFKCHB0#S41!#`fWaGha6ka5J.'mL@$#lj^hl":uXK#2sP]#`j=bn.9r!n2LH%a1Xc`*"KjGhB4r!hB4pU!9%p9&0?UZn@1C_&$\&!Nt]V%IH=<)c)qQ]dRK6Z3LB]qZ#5UFBZ]=2?H\DEhXtkTg;rpXJ,&K9:Nq-g/`b92Y32/#jSiQH*"++A-Q^g7cP):!hq6.c?2oG>On@_o#*\[Q`&)A9cYQTi=J,@]A?L@TVYs%!Uq0?t!mChn`Y.)@+4L"_5_TuQgh:s*a4`FTq_NC%mo5R1cqY092]'$-WgPG^JG@,X\iR]Su3Hmm-q8&WLUYGhJRC@[dBb196flQJ;io$8rq-CHK!p9mSj@`rM^&7e5[i5D,8e<%o%Y=,"]c]E;<^:m03X!;%p4Dc6=97@]kR\"1fF,Ou?j22gTL0ha?nVcrJ/&V:J.@/"JA!'f!*2@0!'18""87?9!*B9\!U((#&(h9,"(2:c#G=F,4CBfJ%tGB+*e4`On:81p49/DIGQ9c-_?9L`n,QPki;r-R#S5Pq_?40LKEn/;+?X$b#S2G#&0??3Jae3'+?TX)5^38i"Mt97K(&bB!T=(C&-rg!$c3!R"b[,R6QeL!0*i)='bDF:%Y=,"]c]E;<^:m03X!;%p4Dc6=97@]kR\"1fF,Ou?j22gTL0ha?nVcrJ/&V:J.@/"JA!'f!*6OAf0WU@;p$0W2dk]R/+=m.Dr%gb5$:/Rr1Y`[&Pfq(c/90aGVtBZ)OPVhX/l+*MJ0Cl(Dc.ZSj_WHF)^gV:P/$=u>:nA.nPGc5/-%2::R!==b.[)TC/h5$qbKVQ7+*fZY5FlYL8r!'2shbX$Kh?4\.X.s+X5`em7$(TL.Ug=p^"6L!1-VA\K3Ws(+piJI?Z<%8bYV"?oSQqop.PFl-Un;,%]61L?Ylg),QGa]+m%Lk=;&0A%lKEo:">nik?+grF-'0!e7L]nldBUg-hKLB1lVN"$]UT*NX.Sr36;T2)AF2e6"c9QWi?4\.X.s+a8`9c^:A,0rr+%`H#f<8tRWJFe7S11M=l4]'jk.c"rdWfBH)[NL5*q3p47+`n`M8Fos<&L;NV.2fd>`d-efeK#@CV$HEN]atTV)aLRr..C2e%B-o`CrtNlmA2Xfb^ElE]dRUI6o$_E58ON6?39Kg;p]A:_t0MXZ)E&G_N2/j]\p262(Q%eq6.L?Yro/.sd+H`2*Pd$$e1*X<4\ok8Ygt2=X2#XX.Y"/g%^;2`E1jA[k(bc7\Hp=WGAXXk$THrSFY/"09#Z=m@:Q120Wi)3!2;ZjEs<[ihWo#7qtl8UN_/sC]diWq8B%"Q@6B!N/^mr=t7<$ol!Z4mikYSVrt^^B6iGj84QF^\Wd18`6]NH7oU;td9G@XA\$.n1ePdsXMfdkolbS'*R]4+Bb@FsR7`YYV-p/h\Oo(`NMV/lSC+18f?nVcrJ/-A;n;*L>RIC>W`Tjjrg6j*fHU2lVXC+nMMIM/CUsbsc*jM-*RqC,B(S8Sn"R=0T_Y>0Ik/>Oo/m&s6uV-mlu5oB,'(#-n\A,b(`,VT,@0Ftk>G1>/2>>-d\h?5KBUF4Q>1[,->WD"UDggnNSM53@:VOg,['A(hS;6)%1Q^;VM"h(?F<[=%Wd:muo<"Bp`U'*'HUU)Obh1qNdA0bhRkn2?4sVa"T?UuB.C#UScJVD9BhJQ.f4?e`.#s.eo>`4oO"^=8eZR)KI)2\of=(1)*qWNPT@Obc:TG"$p5'V$flSd/bBZI3J?\%e*B5D%A[3tk2RI^!RLXiOK<<[)&0>dG#S2G#D#%:=A!=75:fPte>uSWAn'n=$=Klo+0l$;f,aHuoJa.)%?>V5/P!;5Gcd$4\l5dNoY^^[ClO>.U(PXE-WJWnS;`1a[;j1X>r>m"7]g^CKRN<$"8Vb!=58Pk26`XC,c?uanM@k_W<8Ao[)@u_q5]m"&j^sLZV#dKcHd_#ZrBsSJ@P(;S"$Sl3Lb/OV)T.0raN_[kaelhje*;Q9MEZl01u0fg'b,D#-WBK@Ud]LLg03l:WspYRkl=gJfU?[]i;kKYQDZDclQ7oFk+RSaAYkteS5,<#ODWQ!O)XB"4/*hWa9l%AKUm77g"<-/sfeT!5\j3K(&bB!T=&mO8@bm]&]#IY.EmJYLgC1n(u%f&0A%lKEo:"#S01IW/LH?LHg1^jd1JqlX-9RX%l4l&(h9,"(29]4DWNL=o>H^!49RR2>6FlL[]i-+?TX)OM\?qcF`KEJ?trKm9F\R,p2s(7m?O4cV.&-+Zs-c#S2G#\>0;T*g^5_q-qmbp=a9m*BGG^5^:(N&0:g%+?TYkU$MQ,ZT:lGq./Le#S5Pq_?40LKEn/5Y.EmJ@69*oK0j^LrYcs<9oNS,@8ofc-!G'l%8=2MQI,3HG8+;Q<3_:63H0IYQDZDOu!H+R%sVKRNIG'V@%lBeuNPNam)S^KioXjb5#"B$BLS@"3H.tC8kkhPKh$El!ubi/Xi1_\M^8^A:%K1AJo^PVN8`;Rja=/7#9p$.!#H=T%tGB+*fqpAGj84QF^\Wd18`6]NPZ@SPl7VjfNn^"M@iGBFC.kr1em_qA0rPD1W#:HE&=649Vradl"ohIOfccuC/q=ZRI!Qt?h(.BjcjdBhS[gLOld,Jci860_tri)*Vs,;)j$$S)O=2pM8l2hAaYY]P=RGl8"@nIKM,$i;p.a_?1E*Q0XQ;:fAmB>bt8r:>bW2bL2(lHC$8,Qtp\Tm2c%R;C/Z/_Tnc_I%f@C@PfuNK#c5J5*WR]54A[D&W2Q.LTW?1Z,aM,=riiQ*`NbM5.LF,Z_BYpm?S#Q2E%.0rAn%`]`#ggJZgq_jZ)BmZc\7Q#JeTg5sjpe7qajN#@3$u5^+.oVti9&?d].Ocf"hXFP8Dl`E*WR]54OD1%jK(!KcBF>o9SPVCMRA9\$d^9hgB@om:q:haGplRN<$"8Vb!ebAO4tL/t_7SG?>e'dFF9W4Gc@1`l@kJa!#+bKUr>?I`[Y-82uYj4_]&d"(DL1gdoh*c)!*2>T.$4"+?TX)5^38i"FiNJlil>KYQDZDclirAYSVrt^^:>X5_hUL^g7Qn!%T0S!$)."J[=@5Rr4[dSi0^Oi;p.a_?8..&0pp5J/+mL4T]nRsJ+ZlmQ-88)/:d3i=97@]kR\"1S/#+3H0*RX?i>gWHt'AG8.ZgB.j-qS*='$ll]027lI3:X[0*i)U,D=)sR5Rh.,G`"`14oiCZiS#Gp4Dda3=$/#(k`.J"5s9-6$U0bKSNY<_?91Vn:81p4CAZ96S&H#JbD?R^g7Qn0F-P[(5)*AHQYFY0*i)UKCBG16$T%c&0A%lKEo^eG_j<]4O>,T&(h9,"6L^g`*s9!BFfb$lil>KEtBC%0aJ;s#JpT:K(+:N#S40WKEp35i;n9kGeb;PLKFu%"7:[/JA!'f?k1%@/-b'ap-/03'V=-R\b-H.3I!=uoYAs-9Y"thDF5l7E`V5',="ZR!G,N#iS(P3En,7>%HEC.enb(Xg]cQ4pND4cpo.0k09',;T%qKW$#S5Pq_?8ruo?L!o%pZN:f^YWOO([/6:VPRC\YJJS[Da7N,!-;&>Q'*`c&Mb"PtDT/kQD/%fF,Ou-AZ+#mZ4JPXa&tTY)uZ8grXuFDb_kX/3@kGR]]H;(5),/'ncfQ!Q"s4K(+9s]2'98Mr$=?c+Apu]Bce*meAulHbHDZX.D!t-G.!m`kU\Bjh!uZhR0A%fu2.%)(0XYkI]^-'>5L_1IYHTq?-1)^NiPSo0TRF4Ce>Zmn@!a_93PSU=J_G.!>K"`_8^`(Q\#h+1\)SmsVmlZAk3bqq1[$oaM49gO/b_bn^dP0hsL6TL[)b*WXXa%XSotN;V,0\roP/b^@qcflS4DQSCq+`d?ablG&lL:Rr;4$hR?`hIcYoOjK:@I^$5)^$eO:LbMua6_W*@kIq`Ia)MMgD%jO3`*XE;/$c2um%-NR\T)WHkmRnM^hmqImp>J1i_;-C!5u6B4PA[DsR($[-a=Vn%LkGHuitZmkWqu2PC-f?ZX*lA_HKUetg$(j2J`J<[l5SEZ=)Jf&(nBid'/pF(NW]7-FsCcf.&;;QNXQM8Rh'?Bim54FoN5C&B2EnC*VC2GEW]BZ;9PcM]"GYHg6KZE]#CGpZ-m-dYC:J[Bqd>n3/GNZ,/Sn5p[29+'*Xm,CN$UofjpT79K/VU+9*GH4ZVEKn-5^OV9?nVcrR':T1gq-_qcc3!Sg`Y`FV=1EOOnZuglH,+uCrfoV/iggq4NeH#STpB1\le:/d,GAFeWT(f=(h#T$YSsOGM]`2=_9dEm5qG`k/P[7(";]]i:ua%Sp/`29/PMCA'tR,L1c!YhHtNqjc!ENV12Ch$&c;Epq_lGj.Uc<9NH)CI+,q9_UIA%1^[%-*_(CI4V/[=(PE#efK<$EUik\B%lMYInn\-lHfm%r[@.>%hgE&=/3B$,k/bBnlT+\2m>JBgA4cChf881+-G6js"m,FA=@bc$69f^3j)ci+a.s/BGfHqtW2]0ODpamM&_VSOpVg55V;bXdjiVcdceW]_eJBmrWj#?Fg=q`Gp+X>cm=FbW]c]FF_Z&gpbQ%$KhaR4m;lc6@B(gLrf>p;-1Dk>_UGlI&KYTrKEpiIi;jU,O/7>6Q/XeYrlu4dijtVZO/:Ir*\j&f[iO8e;;ONdc+Dl$D3$WJRSB))Y?t/`=*s9*H[$m;ji:,ePo:Hbp>2ib(Sl5r%8EA(mAEg+9\OGTiA'#[/cF/^0T,=RlJ4iU[k21a`oUD>SotW?>iIU\fGedVs*\ccLG$_2]pSnscB?N.SWrDMGV/$dkZMi;q*k][$8Ao&JlM?ur4j19^npT&dW,;q-+8E1^qa9X'=jjt^("_7ie4W!%'tcQ>;62YHKjuM)/cXlJQ;P6n%O4fk1dZ/l2*8^ElMY_VTUnM>Tc/rm7=#A2!n_)#MK:=!II+W^mt3b/b-quhYGV5\%hO4--YO<1&Yt%jego/^0gk99`90URQ_QHLF9aY5=;8;a"o9jS6H3f7-(E\FsDfmoY6f9><*\oY+tKZ>?l9IEJC%lG(6cWXWST*g820dQa^fh5d^P._Y9dD;OE%TCL]rk,UFH^/ZJ=_UJ4=1d75>\;(Y;BFfb$lil>KF84dh`+&N%U!Ohd&(h9,"6L^g`*s9!BFfb$lil>KEtBC%0aJ;s#JpT:K(+:N#S40WKEp35i;n9kGeb;PLKFu%"7:[/JA!'f?k1%@/-b'ap-:8#S49I_?9L`n:3M)&$Zt)#MK:=!II+W^`4L[:H\Ka-[ngZkL#n25PiH?f:1a[m+_8CKEp32i;n9kGefiE8,#1DlsA*iGMg!lXtTh[ULeW).f?O`n+fTd(.d90u[CXe5[Y+("]c]E;FfAWn8r?qcAM=KV^oGn3sZAL$c3!R"m67hElq3YIlaCI8R123(Go-oA0^4e/f(&:fM#CGccn:m0"4hnJabXMp4T=o]k9D4&(h9,"(2;q$Vr$P;,o1nVSCfCECs_?Gj93)`jR+ahDQ7I,XknZjiu)FQPP4>Z(.KN1_WGdU3hCm:hc@6ta0RSVP`Z(OrHaQ8+XKTg[UpZn7d%Jn5$Yu]U_J1q"r*m80U^/..6/!l451R#CGm&Lm0H7Qs.I::NR=Lt1&K&Wo*:X>p_oufK5dGShbmi?IO@H3!^&I$c3!R"m68S5<7iSXr`&BcGr_/q^Q:5k%_4s0IKB'egU2,2WAUAhDk-59#g[Hg=W\$Z3M!e*k7bf"OU.;q0lk4bf]S'%YLnl)PI1)AB8!7Y10-"d!q1*Tm::8Fp"M#1]b,2!i.od7PiCaNG99D(p9=g2Zg]?mon&YEaYf]:O].$5,7:Se-TQ*fhf7c=Z6(&aS-SrB0-<7B]>g>d2Ei0?Qg!-mX32ATGr?<.?2QJ"83RP,hY[nt]n,Y8/VN@uZaDC6ds4L?ab1_R`\kd9UM)-*>0m1YIJZ%BEih&p8Mq\YrW?Z>edB8m6@C]s^>&XD.ZCoolDCmo7cmCXpa+#2oT06$NC2i,IX(M!7f2WsN,i=,uKj\X_3eR=*3tRk+e%Y;)6L=*VTMZ#j"NlXXkSQs]MTj'L-;ancLUg8Us_f;bI6%)N,?K(&bB_;W7p.3"]k/n`&3ZD$TH9I;7g^QOYTB8%C[`.-Di4FpJ:WYp^OTP,0g-lpgfHobT$.er&7E5Q/<@`9:DMs3;@nf"i[PAN1_FQ!h6&ggF+Ul#W*cA4qi6CHMW=R=N>CF6o.^'c7s'1?nr=3+&YDGj',Y*67"RIU/s?1lLoY"P5P<3+kkg$.Zgdb.6OW=4"gS_GhU>r/n;,=HhH&H'3*Z)VGTN9f](JQ+,8l0cOW>,N7iaQ+'.qk&]_Pbs;`&6FQ,>/gofdbqfoc:$%C7TaQOI0sjM=<'-(Rd6U32@<0X'Udc9U\r/Wp:R=bKO!?9?GbRm$)ea/a-gpKCFE)+?TX)E4GC^j-0/8/R,ie(Kep(X)-ERYh9f19je>iXZs6=a'T@i4O@^hZl)^liCX8$c[b=b,9,AYs.XuiOp&L=A>A[@ej9nQtO:QZ\#)fsb.FC&';rKIaKr,:eqp`hl@P!`9L>ns,R<6N_P#bkt?oP,fZ8BfSNg]65e)"ljcV=]'!II+W!3G*hiK:$XjQ#Dmm=3Mc[XOVhPaN!2:B'd(VrSE^7gM19`_BW8"9hgKLBW/W(Ie0&daHC&RNl_q(Q7R=SeQ6c[:=q;msFFP$'Ca(G_t'Gc5Q:26U@@QZhld"F/Jf(!M(JJta$21L`2"MK55E;raq?EBacattjtj=(Z,[oL-/ifFQMgBQ5F!O%r8JN(8LBX`-!RirPpP>dmWW6af=pr9=gE,3:0I.IDgXp:OGKp#g8AW='pB`/.qk.9.n!WE`jSnrpG!FP:tOj>q8R$7ECY,pkunK-,NGgaeq>q.9Ri_;3lV'Z_*L/5QCQ*A]`$7Lb/AD:OXK\rqW2d=dIiin%H$f94.OY/G[S8^*?:ZDr30?m^V9e=cuCRA4[u-OKYQDZDclirAYSVrt^^:>X5_hUL^g7Qn!%T0S!$)."!II+W!3C_?!-AL"#ODWQ!O)XB"4/2&*j?H6#J^ZP%mYn8GedVs*WR]549-B'i;n9kGQ=gqn,RP9KEpiIi;p.a_?8..&0A%lKEo:"#S01U5^:(N&0:g%+?TWE!oX0,6$NC2JFEP\#_WHL"lTKd!l>&d+V5^!(PE%/$4%/-LHp+"?4\.X.j-qS*KYQDZDclirAYSVrt^^:>X=G(q5HD1AL+u\q22mrL$,QfmC'0\RFc,P1*KW=8;YEhgNigEBo(Xc87(A(XbRDsP^l%8=2MRS1$4eITg?8JT+'dXdhH34bijQ'Fm0P8R6,2\C'GAAeP,f3#rW_n"/(#DJ>i`1ukX@[cURBh,G9i[1CfXgU4>@7=.f'g;"m06ipUHr7t0P57d_hA<3"(2:c#HX#T2,l/l#jR\C>[t;UK0Uu[N!@bq<&cTZ>U(?`er&YP`36/(R96UGjUJ,@,XhUb<'EI2T2N@bZ(NEqU*;'Y:AKU?,U8^n-CdV.l\YLL4cRND,A8F`f>&^c^/=!*?,mn3Xo,#H!EWPe*/A@qQMqJk&as,f/-4rehq&jS-\*$C30R(r[kVDg9I9H&\deZ@2G`,M)FBs"9i;esF@m,M!<[Fc.]4QIM78>$KdcQ-4Gk/0FJ@jn!,$:TLD#AnHLYaNpeg+$"(A(@VWPt@1*aSK[f28=peOEY:%iBj9MN-Tc'%b31M^%3XQrNUILPSV@fC-?XH4Ub-li;p.a_?3gM52ao-nOP?r9R9&\:"=!fps.b-4;RVQo=8fqUM8rf$5l]C#t84VE/">(GMNm-B2q*^$#B*'H%>TRGQ=gqn:28EZUQ(#<->CAWZf-$.MK"XrJ5*!1iN%NiC)<_3@,pr=hCP0=h=)>2*Zno-:L(lrd[ej,U,^'W_#"Bn-$C1In8%qOADK@a3N*!i;niZ49/DIGi1]W^#)4;Q7Zj5^3:1+GJus5QA4m]10J=^)S".OY>U>o1`A._[SQGP1eMk=V?Y3AB>34]HBk]r8fTTOsl)'q\8[2B&cs9F3rNn-/^3t@/meYV_IO7_-`l8d9fDbaGAP"54C"6K"55:d%\bkg,>BSONIdr=sh0&+_^A&LsTDm(7\o)h?qMa5f2`K@@?,ORtBC)cSIdr?%jQ2_8DUi$"q8ucBFk>^8Ub'(BY.NEOY&&:\c_Q$YHf&Vh?&q/B=KCl$p"!>Yag9;W.nd;:j>CeRMnEgi=?MA!%W"[$_Tk+8INfN:"'lYc4sDc;>3k>#J^ZP%mYn8Gi5Z*]68$AeWCt:!*2@0!'18"")!GKu^k&]/V0QD=3Bk^H1kbsVA74^**:gS4t=`,D5ol]M//iPG2HIsk'3>l1s*GJ,ZeZZg(HN)(?Tn2*Rp@*EUl?@CiiV`Va1=EcTI!ArE8kNf5LK.D6JBM=cb5lE^=;N^[#cXWHoRa[>r3rL\(_a-A[YRm5`6jk4O4TS;G_V+9r@G[-Zi=,m4nH)B=@kX#O5EGlC0LP,*+2[Br!2[GHX5^;''KZE$o4RNZq6gP9!irfo7pBKSr3!bRlKCBG!KCCi$KZCblGT741j5(n@`82V!:&s6mD\*tFKCHB0#S41!#`fWaGha6ka5J.'mL@$#lj^hl":uXK#2sP]#`j=bn.9r!n2LH%a1Xc`*"KjGhB4r!hB4pU!9%p9&0?UZn@1C_&$\&!NtXd'g`(pei?18N%DkL!%Dq-.&0CQMiGgg_O*cNK&:9'!3!"]Q]g6l_%`78_+?[U!+?WC!iGicI*f#C;\2O[(Yr;rL'0pft)hc8j+?]'$_F*Z!_W(b1*qoltEB"5bH\:f!H\:fI!JJM,6$O@Z_W0Jq4N-)!4AGn8EGlC0LP,*+2[Br!2[GHX5^;''KZE$o4RNZq6gP9!irfo7pBKSr3!bRlKCBG!KCCi$KZCblGT741j5(n@`82V!:&s6mD\*tFKCHB0#S41!#`fWaGha6ka5J.'mL@$#lj^hl"<8pS4"'.p"ue'TnifLqTWX[-mBEYRUEr8Fg7;?@PY0!-^7//Tn2QqZ/3J^,^g=@b;klkQVut4e%^.N+4k,=*NTQ1N^=C\ZL-*(Idj8MKketm9)p_YGarih0dr-,;JpT!WAGt1&Y9@A#7HSjau0i\Te!stTq29j;&".\q4>unnp&qg1A^m"HZfk%*878kI]k879n2Qs+$;[Yt:\r"ul3t))=Vmh&Lo]m1UML>^f)^WaP+'E2O'eU#IgkEG]9e<=r\Pf0sYFs;-"i&OtI*&X+umDTYFi2Q0$K*D5VO^iORlcVXTC-mcdk5XS,C24Dij\Dc'"8XmG:HN,7:[F8+&&%RjN?+Lja/]+?#Z?Z9S;B@#.gg"[`nG^na6U7n-u'[Q@/_%f%UmMHp8H'F5`n(Ng$JLMXKu`@K^^smXpE@0WZ4/aEU`ISO^/Wl^3,:t22J!K33U"QdGsI3h6_Lkc;\b)a2lX(de&47.bV_Zi9:.@A\%_2;YtdG]`.S7:#af5O&A$/Z?U=/4t=:'c]([:#Z%"400JF3$\uhUV!AlA;=7-nm0`(Hbm_W8G2)9l0;L-LR-OfkpV05.6Jplb-RbYik*5&3BAA02@,A]l/GF\eJh4GT$a63V5$'B"%U#c;=jt@")"dA2Nq.@LZ\\J5e1"B8dE;>ej"O)Gd44+@'pHQmFi\C[1ftg>R4+Mh7@=RmDDL&c^mkEH]HB#"2igN+=N6aA(-">50rfrfq-31GYBTOa2kCm]aKj*k60a`3*d,fi(D=H"2!+Br<"*PqUF,-PAr53>3SmV'AF;PB!P%noGOYS^F],;0@%,1'1TaB>2F[BbJAo%1ii#ts#Yu]$\qe>n_l7X,Bd$Hn\_qun&DW$0>\H*(GXVC\\P55Y;JCMtqlt_;c-0B-04Q1g6TaH8)K(*ir`89\uU(1Xu&dsH2g7etrD`qc(AZ,WsLopDgY=u8THmkl+ZNGM_"$k+4Ok\$stiG"?*hR)Y7iO!!Dl;b0Ac&/4uq`G/1"bead7n@l=HN)u9m5"*iiVr+jqr1sIO0X)XVMj>Wr+^P,'bfPgCLp:I&UZU@>[=3%\HE3'6;#$]#^3.=4oT@NQrG.!J*bAf]?E1QYb2Jk83P&X!oau_VWAOd(l!X2=KSf2S,I_U/r]ZBUCN/sL?)\:..8S8>.6Jpl,!97qY!849[.?\HBDLNRlV,=/G\\E]hC%0[4]\n'1poW^F`b+7.]$`5<;"XhrnsABbNgsT/I**/dn"[)96]iD>.fC\:;([YJkK8`)U9%g4bjJhBT(;[EKB)s>e)u+ICO1fi\9/l2:p5f4'rC7o&KL]Q^g/o"^.6T3X'P2N&Q(i/trshi*$5">`8CrQ.6BnG'K!h3sBf43!%tW.([oW4s-A(PU7jgt?NDd)#8n;mc@R5kDK+$XPUq=M(hVlt+J_[Ue4LbRR\Y*o=n;sILiGgjTnPJrai?@n!iGeo)O*cNK3#mUl]g6n!]g6n5!5ddQ+?U,=iGicI*b'%!*[cL-\2O\S_a/P&)ha"!)hc6<+?]'$_W,SH*qolt+nc-!E<6E,H\:fI*/)AG6$S4!6$Sn"_W0Jq4:VVTEGlC0@W)f!-\1]r2[GJ^6$V0(KSS2!KZ=BA4RNZqj)>PNpBKS"p'0Jq!XOj6KCCi?KZCblG_j%!GancNj5(n@%L:s4D\*t!D\*s;JFL'-#`lkhGha6kLY*Q!`sEkNmL@%nE"F)b#2pa!#2sP'#`j=bn2MD@a1Xc`LqQ*!S,gFdhB4oj#N9Z@&0>;!&0<3Ln@1C_O2F8.g`(p%fGfLa#p;@u%Dq.E&0CQMi?@n!iGeo)O*cNK3#mUl]g6n!]g6n5!5ddQ+?U,=iGicI*b'%!*[cL-\2O\S_a/P&)ha"!)hc6<+?]'$_W,SH*qolt+nc-!E<6E,H\:fI*/)AG6$S4!6$Sn"_W0Jq4:VVTEGlC0@W)f!-]h!93r.\Q>osKNNVrA;PN1O]f'O%P/U??RY\lmr#bXhk-u"GU%/'0-e$2*Xq(`b7dg/nb=3(@pVRDgu9h\ZU,dBd5k>reZF)cZXXll&XXA4^cFY18So-HSL$MM6;mWZG\knJ+MMYNpZhg962JOG]Z[8Isb>qKh&l'LiQ4]r1>nYlo[3"jVQf(s.S2b#HCH^qc<^1df$.T`"`m5kR1<:]00n:8\Fmt78-Tb+#@GaH0!i1ZVSendstream +endobj +8 0 obj +<< /Contents 15 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /FormXob.b047863372ef41b3004606a033908664 5 0 R @@ -45,19 +53,11 @@ endobj /Type /Page >> endobj -8 0 obj -<< -/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 400 /Length 24486 /Subtype /Image - /Type /XObject /Width 763 ->> -stream -Gb"07D3,]7#r+bfIDN>oR8bod'`SAu9EC/C#"8A$$boZ?I#[5;RjZi[p^HC-@c67&c_>VFGpQ`HBmF0l45n!M-cX)*/DlN&n6e]Th8)M&DX"SUB"C:42\7=Y;O.P_7?m'=IR9s!3W&mX))%SO;,Pm&S/+M*08S&Tj_!n@1C_O2F8.g`(p%fGfLa#p;@u%Dq.E&0CQMi?@n!iGeo)O*cNK3#mUl]g6n!]g6n5!5ddQ+?U,=iGicI*b'%!*[cL-\2O\S_a/P&)ha"!)hc6<+?]'$_W,SH*qolt+nc-!E<6E,H\:fI*/)AG6$S4!6$Sn"_W0Jq4:VVTEGlC0@W)f!-\1]r2[GJ^6$V0(KSS2!KZ=BA4RNZqj)>PNpBKS"p'0Jq!XOj6KCCi?KZCblG_j%!GancNj5(n@%L:s4D\*t!D\*s;JFL'-#`lkhGha6kLY*Q!`sEkNmL@%nE"F)b#2pa!#2sP'#`j=bn2MD@a1Xc`LqQ*!S,gFdhB4oj#N9Z@&0>;!&0<3Ln@1C_O2F8.g`(p%fGfLa#p;@u%Dq.E&0CQMi?@n!iGeo)O*cNK3#mUl]g6n!]g6n5!5ddQ+?U,=iGicI*b'%!*[cL-\2O\S_a/P&)ha"!)hc6<+?]'$_W,SH*qolt+nc-!E<;.8St-O9",!'XAU0oBCf"2,kB>KXo?i_p%.-fk;+dZp?/J@,6$OBp3>S4(@UQCmiMk5"Ggq<+4,;FSNZRK([RP>X5i:kk4i5jmG"-c4mHS1-RINZ+Mgi*a<_fXa(&HJ>+(I_f-o&qgM8%:'R;_1'_okiUidD$,DVO/I4!?uIF4H"+We#M)Tkf\G^S;Fe_A:[c]ulcrWlarih0dr5r:UTE7Z<>GPr+/pT-c'V5cGk5%6Sdg%oXr!3h')nI4U>H7k<=K7o2l.\$YW-Cpi;dCKGD.M87\\9qj'ucqm4:%#/g^DI(0q,^Ka?!.LkCCO.:ntS^X/6Ri_[sOXsf/gY^Fd\7X7,a.2i)4_*,DblZs7V8A3Y3Yc]T@XX]QB$FXm<*?#r"qGqFtpQVPq]A>?'6$OAEGD2qor?m#&9m)3E@5?-i>Jo2+orhW(.(sAFn+K[]/m>A4[.AskUC;B0iWp8jUH-=guJ%i\-e\q=3g>Qca0TFE`bb()3kW5t*7<-Y@u=ppnDK1p4*M*nUccf=;KtkbPfH=%O0WoGWbckV@+JJh;aP^K:KN3^6rf6gSiCui`5o(f:Z&`Oobp6GA=V9.Rcs;6Nc&%6F(Zs^\mo8aI;+#EA4;AGNBBn\&=?DP[,LcZJi^m6f(_Vf\0>PS>1&$KYF;@I[W5qA^LfB,cNEiH4Uejm%i&*ma&sWm]:bq10dIngO?cl@CbC=I[D^e\h!/0q_c&B;G^i=R.%m&A2,pE3S&NgNIEFa4^i(%PEF4O`'!^m.TB`KkJ`/hE=BlP_%f[n1%9q_K,b;=Q-6>d\Fh/aDOf"MD[Pgl"p#TjP]asaj3Gp.s[F\#`mCMb`/]MB7pe33=llpMQuE]>b>YSrG59i4Zk&+b%"u6L>E)(Y&f3a31R,W:N3/n^k(>,nGWHL14AG'ZH5'BDlrX[V29$sC,9"hFSZDGP$aOP`>@^med8*Y=Y9)+[H6=5GT&U:_K1/7Vn2BI[WQ%E=`O)LAq]=K`6#k@ZVu6_khdfe6leFr7StMON2^pFZQiEU=e)$k+IGV1hC00CHW_;(n/:T607\Gb&Fok*>=1d->/Z?@+0a)HP$^4#OTT1<%tB@Fig4FT.N^P[m;aL/=O/h8jfO%G$2%p5X>_NP_lap5A6e@m&pN,r\I[0,U!b5irjPSVM?V7GJ)@ir%Jn00QMrbX*fi(]`8CnqV+52"7a0Y^5p2q_B>eDp**:FPZeK1dE1n*,@hE&7&Asd>fUD-j?S-bbU&H8I-Ggu_0lTdBZq=1SepiIQrckAgKCBG!KCCi$KZCblGT741j5(n@`82V!:&s6mD\*tFKCHB0#S41!#`fWaGha6ka5J.'mL@$#lj^hl":uXK#2sP]#`j=bn.9r!n2LH%a1Xc`*"KjGhB4r!hB4pU!9%p9&0?UZn@1C_&$\&!NtXd'g`(pei?18N%DkL!%Dq-.&0CQMiGgg_O*cNK&:9'!3!"]Q]g6l_%`78_+?[U!+?WC!iGicI*f#C;\2O[(Yr;rL'0pft)hc8j+?]'$_F*Z!_W(b1*qoltEB"5bH\:f!H\:fI!JJM,6$O@Z_W0Jq4N-)!4AGn8EGlC0LP,*+2[Br!2[GHX5^;''KZE$o4RNZq6gP9!irfo7pBKSr3!bRlKCBG!KCCi$KZCblGT741j5(n@`82V!:&s6mD\*tFKCHB0#S41!#`fWaGha6ka5J.'mL@$#lj^hl":uXK#2sP]#`j=bn.9r!n2LH%a1Xc`*"KjGhB4r!hB4pU!9%p9&0?UZn@1C_&$\&!Nt]V%IH=<)c)qQ]dRK6Z3LB]qZ#5UFBZ]=2?H\DEhXtkTg;rpXJ,&K9:Nq-g/`b92Y32/#jSiQH*"++A-Q^g7cP):!hq6.c?2oG>On@_o#*\[Q`&)A9cYQTi=J,@]A?L@TVYs%!Uq0?t!mChn`Y.)@+4L"_5_TuQgh:s*a4`FTq_NC%mo5R1cqY092]'$-WgPG^JG@,X\iR]Su3Hmm-q8&WLUYGhJRC@[dBb196flQJ;io$8rq-CHK!p9mSj@`rM^&7e5[i5D,8e<%o%Y=,"]c]E;<^:m03X!;%p4Dc6=97@]kR\"1fF,Ou?j22gTL0ha?nVcrJ/&V:J.@/"JA!'f!*2@0!'18""87?9!*B9\!U((#&(h9,"(2:c#G=F,4CBfJ%tGB+*e4`On:81p49/DIGQ9c-_?9L`n,QPki;r-R#S5Pq_?40LKEn/;+?X$b#S2G#&0??3Jae3'+?TX)5^38i"Mt97K(&bB!T=(C&-rg!$c3!R"b[,R6QeL!0*i)='bDF:%Y=,"]c]E;<^:m03X!;%p4Dc6=97@]kR\"1fF,Ou?j22gTL0ha?nVcrJ/&V:J.@/"JA!'f!*6OAf0WU@;p$0W2dk]R/+=m.Dr%gb5$:/Rr1Y`[&Pfq(c/90aGVtBZ)OPVhX/l+*MJ0Cl(Dc.ZSj_WHF)^gV:P/$=u>:nA.nPGc5/-%2::R!==b.[)TC/h5$qbKVQ7+*fZY5FlYL8r!'2shbX$Kh?4\.X.s+X5`em7$(TL.Ug=p^"6L!1-VA\K3Ws(+piJI?Z<%8bYV"?oSQqop.PFl-Un;,%]61L?Ylg),QGa]+m%Lk=;&0A%lKEo:">nik?+grF-'0!e7L]nldBUg-hKLB1lVN"$]UT*NX.Sr36;T2)AF2e6"c9QWi?4\.X.s+a8`9c^:A,0rr+%`H#f<8tRWJFe7S11M=l4]'jk.c"rdWfBH)[NL5*q3p47+`n`M8Fos<&L;NV.2fd>`d-efeK#@CV$HEN]atTV)aLRr..C2e%B-o`CrtNlmA2Xfb^ElE]dRUI6o$_E58ON6?39Kg;p]A:_t0MXZ)E&G_N2/j]\p262(Q%eq6.L?Yro/.sd+H`2*Pd$$e1*X<4\ok8Ygt2=X2#XX.Y"/g%^;2`E1jA[k(bc7\Hp=WGAXXk$THrSFY/"09#Z=m@:Q120Wi)3!2;ZjEs<[ihWo#7qtl8UN_/sC]diWq8B%"Q@6B!N/^mr=t7<$ol!Z4mikYSVrt^^B6iGj84QF^\Wd18`6]NH7oU;td9G@XA\$.n1ePdsXMfdkolbS'*R]4+Bb@FsR7`YYV-p/h\Oo(`NMV/lSC+18f?nVcrJ/-A;n;*L>RIC>W`Tjjrg6j*fHU2lVXC+nMMIM/CUsbsc*jM-*RqC,B(S8Sn"R=0T_Y>0Ik/>Oo/m&s6uV-mlu5oB,'(#-n\A,b(`,VT,@0Ftk>G1>/2>>-d\h?5KBUF4Q>1[,->WD"UDggnNSM53@:VOg,['A(hS;6)%1Q^;VM"h(?F<[=%Wd:muo<"Bp`U'*'HUU)Obh1qNdA0bhRkn2?4sVa"T?UuB.C#UScJVD9BhJQ.f4?e`.#s.eo>`4oO"^=8eZR)KI)2\of=(1)*qWNPT@Obc:TG"$p5'V$flSd/bBZI3J?\%e*B5D%A[3tk2RI^!RLXiOK<<[)&0>dG#S2G#D#%:=A!=75:fPte>uSWAn'n=$=Klo+0l$;f,aHuoJa.)%?>V5/P!;5Gcd$4\l5dNoY^^[ClO>.U(PXE-WJWnS;`1a[;j1X>r>m"7]g^CKRN<$"8Vb!=58Pk26`XC,c?uanM@k_W<8Ao[)@u_q5]m"&j^sLZV#dKcHd_#ZrBsSJ@P(;S"$Sl3Lb/OV)T.0raN_[kaelhje*;Q9MEZl01u0fg'b,D#-WBK@Ud]LLg03l:WspYRkl=gJfU?[]i;kKYQDZDclQ7oFk+RSaAYkteS5,<#ODWQ!O)XB"4/*hWa9l%AKUm77g"<-/sfeT!5\j3K(&bB!T=&mO8@bm]&]#IY.EmJYLgC1n(u%f&0A%lKEo:"#S01IW/LH?LHg1^jd1JqlX-9RX%l4l&(h9,"(29]4DWNL=o>H^!49RR2>6FlL[]i-+?TX)OM\?qcF`KEJ?trKm9F\R,p2s(7m?O4cV.&-+Zs-c#S2G#\>0;T*g^5_q-qmbp=a9m*BGG^5^:(N&0:g%+?TYkU$MQ,ZT:lGq./Le#S5Pq_?40LKEn/5Y.EmJ@69*oK0j^LrYcs<9oNS,@8ofc-!G'l%8=2MQI,3HG8+;Q<3_:63H0IYQDZDOu!H+R%sVKRNIG'V@%lBeuNPNam)S^KioXjb5#"B$BLS@"3H.tC8kkhPKh$El!ubi/Xi1_\M^8^A:%K1AJo^PVN8`;Rja=/7#9p$.!#H=T%tGB+*fqpAGj84QF^\Wd18`6]NPZ@SPl7VjfNn^"M@iGBFC.kr1em_qA0rPD1W#:HE&=649Vradl"ohIOfccuC/q=ZRI!Qt?h(.BjcjdBhS[gLOld,Jci860_tri)*Vs,;)j$$S)O=2pM8l2hAaYY]P=RGl8"@nIKM,$i;p.a_?1E*Q0XQ;:fAmB>bt8r:>bW2bL2(lHC$8,Qtp\Tm2c%R;C/Z/_Tnc_I%f@C@PfuNK#c5J5*WR]54A[D&W2Q.LTW?1Z,aM,=riiQ*`NbM5.LF,Z_BYpm?S#Q2E%.0rAn%`]`#ggJZgq_jZ)BmZc\7Q#JeTg5sjpe7qajN#@3$u5^+.oVti9&?d].Ocf"hXFP8Dl`E*WR]54OD1%jK(!KcBF>o9SPVCMRA9\$d^9hgB@om:q:haGplRN<$"8Vb!ebAO4tL/t_7SG?>e'dFF9W4Gc@1`l@kJa!#+bKUr>?I`[Y-82uYj4_]&d"(DL1gdoh*c)!*2>T.$4"+?TX)5^38i"FiNJlil>KYQDZDclirAYSVrt^^:>X5_hUL^g7Qn!%T0S!$)."J[=@5Rr4[dSi0^Oi;p.a_?8..&0pp5J/+mL4T]nRsJ+ZlmQ-88)/:d3i=97@]kR\"1S/#+3H0*RX?i>gWHt'AG8.ZgB.j-qS*='$ll]027lI3:X[0*i)U,D=)sR5Rh.,G`"`14oiCZiS#Gp4Dda3=$/#(k`.J"5s9-6$U0bKSNY<_?91Vn:81p4CAZ96S&H#JbD?R^g7Qn0F-P[(5)*AHQYFY0*i)UKCBG16$T%c&0A%lKEo^eG_j<]4O>,T&(h9,"6L^g`*s9!BFfb$lil>KEtBC%0aJ;s#JpT:K(+:N#S40WKEp35i;n9kGeb;PLKFu%"7:[/JA!'f?k1%@/-b'ap-/03'V=-R\b-H.3I!=uoYAs-9Y"thDF5l7E`V5',="ZR!G,N#iS(P3En,7>%HEC.enb(Xg]cQ4pND4cpo.0k09',;T%qKW$#S5Pq_?8ruo?L!o%pZN:f^YWOO([/6:VPRC\YJJS[Da7N,!-;&>Q'*`c&Mb"PtDT/kQD/%fF,Ou-AZ+#mZ4JPXa&tTY)uZ8grXuFDb_kX/3@kGR]]H;(5),/'ncfQ!Q"s4K(+9s]2'98Mr$=?c+Apu]Bce*meAulHbHDZX.D!t-G.!m`kU\Bjh!uZhR0A%fu2.%)(0XYkI]^-'>5L_1IYHTq?-1)^NiPSo0TRF4Ce>Zmn@!a_93PSU=J_G.!>K"`_8^`(Q\#h+1\)SmsVmlZAk3bqq1[$oaM49gO/b_bn^dP0hsL6TL[)b*WXXa%XSotN;V,0\roP/b^@qcflS4DQSCq+`d?ablG&lL:Rr;4$hR?`hIcYoOjK:@I^$5)^$eO:LbMua6_W*@kIq`Ia)MMgD%jO3`*XE;/$c2um%-NR\T)WHkmRnM^hmqImp>J1i_;-C!5u6B4PA[DsR($[-a=Vn%LkGHuitZmkWqu2PC-f?ZX*lA_HKUetg$(j2J`J<[l5SEZ=)Jf&(nBid'/pF(NW]7-FsCcf.&;;QNXQM8Rh'?Bim54FoN5C&B2EnC*VC2GEW]BZ;9PcM]"GYHg6KZE]#CGpZ-m-dYC:J[Bqd>n3/GNZ,/Sn5p[29+'*Xm,CN$UofjpT79K/VU+9*GH4ZVEKn-5^OV9?nVcrR':T1gq-_qcc3!Sg`Y`FV=1EOOnZuglH,+uCrfoV/iggq4NeH#STpB1\le:/d,GAFeWT(f=(h#T$YSsOGM]`2=_9dEm5qG`k/P[7(";]]i:ua%Sp/`29/PMCA'tR,L1c!YhHtNqjc!ENV12Ch$&c;Epq_lGj.Uc<9NH)CI+,q9_UIA%1^[%-*_(CI4V/[=(PE#efK<$EUik\B%lMYInn\-lHfm%r[@.>%hgE&=/3B$,k/bBnlT+\2m>JBgA4cChf881+-G6js"m,FA=@bc$69f^3j)ci+a.s/BGfHqtW2]0ODpamM&_VSOpVg55V;bXdjiVcdceW]_eJBmrWj#?Fg=q`Gp+X>cm=FbW]c]FF_Z&gpbQ%$KhaR4m;lc6@B(gLrf>p;-1Dk>_UGlI&KYTrKEpiIi;jU,O/7>6Q/XeYrlu4dijtVZO/:Ir*\j&f[iO8e;;ONdc+Dl$D3$WJRSB))Y?t/`=*s9*H[$m;ji:,ePo:Hbp>2ib(Sl5r%8EA(mAEg+9\OGTiA'#[/cF/^0T,=RlJ4iU[k21a`oUD>SotW?>iIU\fGedVs*\ccLG$_2]pSnscB?N.SWrDMGV/$dkZMi;q*k][$8Ao&JlM?ur4j19^npT&dW,;q-+8E1^qa9X'=jjt^("_7ie4W!%'tcQ>;62YHKjuM)/cXlJQ;P6n%O4fk1dZ/l2*8^ElMY_VTUnM>Tc/rm7=#A2!n_)#MK:=!II+W^mt3b/b-quhYGV5\%hO4--YO<1&Yt%jego/^0gk99`90URQ_QHLF9aY5=;8;a"o9jS6H3f7-(E\FsDfmoY6f9><*\oY+tKZ>?l9IEJC%lG(6cWXWST*g820dQa^fh5d^P._Y9dD;OE%TCL]rk,UFH^/ZJ=_UJ4=1d75>\;(Y;BFfb$lil>KF84dh`+&N%U!Ohd&(h9,"6L^g`*s9!BFfb$lil>KEtBC%0aJ;s#JpT:K(+:N#S40WKEp35i;n9kGeb;PLKFu%"7:[/JA!'f?k1%@/-b'ap-:8#S49I_?9L`n:3M)&$Zt)#MK:=!II+W^`4L[:H\Ka-[ngZkL#n25PiH?f:1a[m+_8CKEp32i;n9kGefiE8,#1DlsA*iGMg!lXtTh[ULeW).f?O`n+fTd(.d90u[CXe5[Y+("]c]E;FfAWn8r?qcAM=KV^oGn3sZAL$c3!R"m67hElq3YIlaCI8R123(Go-oA0^4e/f(&:fM#CGccn:m0"4hnJabXMp4T=o]k9D4&(h9,"(2;q$Vr$P;,o1nVSCfCECs_?Gj93)`jR+ahDQ7I,XknZjiu)FQPP4>Z(.KN1_WGdU3hCm:hc@6ta0RSVP`Z(OrHaQ8+XKTg[UpZn7d%Jn5$Yu]U_J1q"r*m80U^/..6/!l451R#CGm&Lm0H7Qs.I::NR=Lt1&K&Wo*:X>p_oufK5dGShbmi?IO@H3!^&I$c3!R"m68S5<7iSXr`&BcGr_/q^Q:5k%_4s0IKB'egU2,2WAUAhDk-59#g[Hg=W\$Z3M!e*k7bf"OU.;q0lk4bf]S'%YLnl)PI1)AB8!7Y10-"d!q1*Tm::8Fp"M#1]b,2!i.od7PiCaNG99D(p9=g2Zg]?mon&YEaYf]:O].$5,7:Se-TQ*fhf7c=Z6(&aS-SrB0-<7B]>g>d2Ei0?Qg!-mX32ATGr?<.?2QJ"83RP,hY[nt]n,Y8/VN@uZaDC6ds4L?ab1_R`\kd9UM)-*>0m1YIJZ%BEih&p8Mq\YrW?Z>edB8m6@C]s^>&XD.ZCoolDCmo7cmCXpa+#2oT06$NC2i,IX(M!7f2WsN,i=,uKj\X_3eR=*3tRk+e%Y;)6L=*VTMZ#j"NlXXkSQs]MTj'L-;ancLUg8Us_f;bI6%)N,?K(&bB_;W7p.3"]k/n`&3ZD$TH9I;7g^QOYTB8%C[`.-Di4FpJ:WYp^OTP,0g-lpgfHobT$.er&7E5Q/<@`9:DMs3;@nf"i[PAN1_FQ!h6&ggF+Ul#W*cA4qi6CHMW=R=N>CF6o.^'c7s'1?nr=3+&YDGj',Y*67"RIU/s?1lLoY"P5P<3+kkg$.Zgdb.6OW=4"gS_GhU>r/n;,=HhH&H'3*Z)VGTN9f](JQ+,8l0cOW>,N7iaQ+'.qk&]_Pbs;`&6FQ,>/gofdbqfoc:$%C7TaQOI0sjM=<'-(Rd6U32@<0X'Udc9U\r/Wp:R=bKO!?9?GbRm$)ea/a-gpKCFE)+?TX)E4GC^j-0/8/R,ie(Kep(X)-ERYh9f19je>iXZs6=a'T@i4O@^hZl)^liCX8$c[b=b,9,AYs.XuiOp&L=A>A[@ej9nQtO:QZ\#)fsb.FC&';rKIaKr,:eqp`hl@P!`9L>ns,R<6N_P#bkt?oP,fZ8BfSNg]65e)"ljcV=]'!II+W!3G*hiK:$XjQ#Dmm=3Mc[XOVhPaN!2:B'd(VrSE^7gM19`_BW8"9hgKLBW/W(Ie0&daHC&RNl_q(Q7R=SeQ6c[:=q;msFFP$'Ca(G_t'Gc5Q:26U@@QZhld"F/Jf(!M(JJta$21L`2"MK55E;raq?EBacattjtj=(Z,[oL-/ifFQMgBQ5F!O%r8JN(8LBX`-!RirPpP>dmWW6af=pr9=gE,3:0I.IDgXp:OGKp#g8AW='pB`/.qk.9.n!WE`jSnrpG!FP:tOj>q8R$7ECY,pkunK-,NGgaeq>q.9Ri_;3lV'Z_*L/5QCQ*A]`$7Lb/AD:OXK\rqW2d=dIiin%H$f94.OY/G[S8^*?:ZDr30?m^V9e=cuCRA4[u-OKYQDZDclirAYSVrt^^:>X5_hUL^g7Qn!%T0S!$)."!II+W!3C_?!-AL"#ODWQ!O)XB"4/2&*j?H6#J^ZP%mYn8GedVs*WR]549-B'i;n9kGQ=gqn,RP9KEpiIi;p.a_?8..&0A%lKEo:"#S01U5^:(N&0:g%+?TWE!oX0,6$NC2JFEP\#_WHL"lTKd!l>&d+V5^!(PE%/$4%/-LHp+"?4\.X.j-qS*KYQDZDclirAYSVrt^^:>X=G(q5HD1AL+u\q22mrL$,QfmC'0\RFc,P1*KW=8;YEhgNigEBo(Xc87(A(XbRDsP^l%8=2MRS1$4eITg?8JT+'dXdhH34bijQ'Fm0P8R6,2\C'GAAeP,f3#rW_n"/(#DJ>i`1ukX@[cURBh,G9i[1CfXgU4>@7=.f'g;"m06ipUHr7t0P57d_hA<3"(2:c#HX#T2,l/l#jR\C>[t;UK0Uu[N!@bq<&cTZ>U(?`er&YP`36/(R96UGjUJ,@,XhUb<'EI2T2N@bZ(NEqU*;'Y:AKU?,U8^n-CdV.l\YLL4cRND,A8F`f>&^c^/=!*?,mn3Xo,#H!EWPe*/A@qQMqJk&as,f/-4rehq&jS-\*$C30R(r[kVDg9I9H&\deZ@2G`,M)FBs"9i;esF@m,M!<[Fc.]4QIM78>$KdcQ-4Gk/0FJ@jn!,$:TLD#AnHLYaNpeg+$"(A(@VWPt@1*aSK[f28=peOEY:%iBj9MN-Tc'%b31M^%3XQrNUILPSV@fC-?XH4Ub-li;p.a_?3gM52ao-nOP?r9R9&\:"=!fps.b-4;RVQo=8fqUM8rf$5l]C#t84VE/">(GMNm-B2q*^$#B*'H%>TRGQ=gqn:28EZUQ(#<->CAWZf-$.MK"XrJ5*!1iN%NiC)<_3@,pr=hCP0=h=)>2*Zno-:L(lrd[ej,U,^'W_#"Bn-$C1In8%qOADK@a3N*!i;niZ49/DIGi1]W^#)4;Q7Zj5^3:1+GJus5QA4m]10J=^)S".OY>U>o1`A._[SQGP1eMk=V?Y3AB>34]HBk]r8fTTOsl)'q\8[2B&cs9F3rNn-/^3t@/meYV_IO7_-`l8d9fDbaGAP"54C"6K"55:d%\bkg,>BSONIdr=sh0&+_^A&LsTDm(7\o)h?qMa5f2`K@@?,ORtBC)cSIdr?%jQ2_8DUi$"q8ucBFk>^8Ub'(BY.NEOY&&:\c_Q$YHf&Vh?&q/B=KCl$p"!>Yag9;W.nd;:j>CeRMnEgi=?MA!%W"[$_Tk+8INfN:"'lYc4sDc;>3k>#J^ZP%mYn8Gi5Z*]68$AeWCt:!*2@0!'18"")!GKu^k&]/V0QD=3Bk^H1kbsVA74^**:gS4t=`,D5ol]M//iPG2HIsk'3>l1s*GJ,ZeZZg(HN)(?Tn2*Rp@*EUl?@CiiV`Va1=EcTI!ArE8kNf5LK.D6JBM=cb5lE^=;N^[#cXWHoRa[>r3rL\(_a-A[YRm5`6jk4O4TS;G_V+9r@G[-Zi=,m4nH)B=@kX#O5EGlC0LP,*+2[Br!2[GHX5^;''KZE$o4RNZq6gP9!irfo7pBKSr3!bRlKCBG!KCCi$KZCblGT741j5(n@`82V!:&s6mD\*tFKCHB0#S41!#`fWaGha6ka5J.'mL@$#lj^hl":uXK#2sP]#`j=bn.9r!n2LH%a1Xc`*"KjGhB4r!hB4pU!9%p9&0?UZn@1C_&$\&!NtXd'g`(pei?18N%DkL!%Dq-.&0CQMiGgg_O*cNK&:9'!3!"]Q]g6l_%`78_+?[U!+?WC!iGicI*f#C;\2O[(Yr;rL'0pft)hc8j+?]'$_F*Z!_W(b1*qoltEB"5bH\:f!H\:fI!JJM,6$O@Z_W0Jq4N-)!4AGn8EGlC0LP,*+2[Br!2[GHX5^;''KZE$o4RNZq6gP9!irfo7pBKSr3!bRlKCBG!KCCi$KZCblGT741j5(n@`82V!:&s6mD\*tFKCHB0#S41!#`fWaGha6ka5J.'mL@$#lj^hl"<8pS4"'.p"ue'TnifLqTWX[-mBEYRUEr8Fg7;?@PY0!-^7//Tn2QqZ/3J^,^g=@b;klkQVut4e%^.N+4k,=*NTQ1N^=C\ZL-*(Idj8MKketm9)p_YGarih0dr-,;JpT!WAGt1&Y9@A#7HSjau0i\Te!stTq29j;&".\q4>unnp&qg1A^m"HZfk%*878kI]k879n2Qs+$;[Yt:\r"ul3t))=Vmh&Lo]m1UML>^f)^WaP+'E2O'eU#IgkEG]9e<=r\Pf0sYFs;-"i&OtI*&X+umDTYFi2Q0$K*D5VO^iORlcVXTC-mcdk5XS,C24Dij\Dc'"8XmG:HN,7:[F8+&&%RjN?+Lja/]+?#Z?Z9S;B@#.gg"[`nG^na6U7n-u'[Q@/_%f%UmMHp8H'F5`n(Ng$JLMXKu`@K^^smXpE@0WZ4/aEU`ISO^/Wl^3,:t22J!K33U"QdGsI3h6_Lkc;\b)a2lX(de&47.bV_Zi9:.@A\%_2;YtdG]`.S7:#af5O&A$/Z?U=/4t=:'c]([:#Z%"400JF3$\uhUV!AlA;=7-nm0`(Hbm_W8G2)9l0;L-LR-OfkpV05.6Jplb-RbYik*5&3BAA02@,A]l/GF\eJh4GT$a63V5$'B"%U#c;=jt@")"dA2Nq.@LZ\\J5e1"B8dE;>ej"O)Gd44+@'pHQmFi\C[1ftg>R4+Mh7@=RmDDL&c^mkEH]HB#"2igN+=N6aA(-">50rfrfq-31GYBTOa2kCm]aKj*k60a`3*d,fi(D=H"2!+Br<"*PqUF,-PAr53>3SmV'AF;PB!P%noGOYS^F],;0@%,1'1TaB>2F[BbJAo%1ii#ts#Yu]$\qe>n_l7X,Bd$Hn\_qun&DW$0>\H*(GXVC\\P55Y;JCMtqlt_;c-0B-04Q1g6TaH8)K(*ir`89\uU(1Xu&dsH2g7etrD`qc(AZ,WsLopDgY=u8THmkl+ZNGM_"$k+4Ok\$stiG"?*hR)Y7iO!!Dl;b0Ac&/4uq`G/1"bead7n@l=HN)u9m5"*iiVr+jqr1sIO0X)XVMj>Wr+^P,'bfPgCLp:I&UZU@>[=3%\HE3'6;#$]#^3.=4oT@NQrG.!J*bAf]?E1QYb2Jk83P&X!oau_VWAOd(l!X2=KSf2S,I_U/r]ZBUCN/sL?)\:..8S8>.6Jpl,!97qY!849[.?\HBDLNRlV,=/G\\E]hC%0[4]\n'1poW^F`b+7.]$`5<;"XhrnsABbNgsT/I**/dn"[)96]iD>.fC\:;([YJkK8`)U9%g4bjJhBT(;[EKB)s>e)u+ICO1fi\9/l2:p5f4'rC7o&KL]Q^g/o"^.6T3X'P2N&Q(i/trshi*$5">`8CrQ.6BnG'K!h3sBf43!%tW.([oW4s-A(PU7jgt?NDd)#8n;mc@R5kDK+$XPUq=M(hVlt+J_[Ue4LbRR\Y*o=n;sILiGgjTnPJrai?@n!iGeo)O*cNK3#mUl]g6n!]g6n5!5ddQ+?U,=iGicI*b'%!*[cL-\2O\S_a/P&)ha"!)hc6<+?]'$_W,SH*qolt+nc-!E<6E,H\:fI*/)AG6$S4!6$Sn"_W0Jq4:VVTEGlC0@W)f!-\1]r2[GJ^6$V0(KSS2!KZ=BA4RNZqj)>PNpBKS"p'0Jq!XOj6KCCi?KZCblG_j%!GancNj5(n@%L:s4D\*t!D\*s;JFL'-#`lkhGha6kLY*Q!`sEkNmL@%nE"F)b#2pa!#2sP'#`j=bn2MD@a1Xc`LqQ*!S,gFdhB4oj#N9Z@&0>;!&0<3Ln@1C_O2F8.g`(p%fGfLa#p;@u%Dq.E&0CQMi?@n!iGeo)O*cNK3#mUl]g6n!]g6n5!5ddQ+?U,=iGicI*b'%!*[cL-\2O\S_a/P&)ha"!)hc6<+?]'$_W,SH*qolt+nc-!E<6E,H\:fI*/)AG6$S4!6$Sn"_W0Jq4:VVTEGlC0@W)f!-]h!93r.\Q>osKNNVrA;PN1O]f'O%P/U??RY\lmr#bXhk-u"GU%/'0-e$2*Xq(`b7dg/nb=3(@pVRDgu9h\ZU,dBd5k>reZF)cZXXll&XXA4^cFY18So-HSL$MM6;mWZG\knJ+MMYNpZhg962JOG]Z[8Isb>qKh&l'LiQ4]r1>nYlo[3"jVQf(s.S2b#HCH^qc<^1df$.T`"`m5kR1<:]00n:8\Fmt78-Tb+#@GaH0!i1ZVSendstream -endobj 9 0 obj << /Contents 16 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << -/FormXob.dc6e6a3e11df0edc665d6adf6db5c37e 8 0 R +/FormXob.dc6e6a3e11df0edc665d6adf6db5c37e 7 0 R >> >> /Rotate 0 /Trans << @@ -92,42 +92,42 @@ endobj endobj 13 0 obj << -/Author (Android Cast project) /CreationDate (D:20260611185343+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260611185343+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623103502+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103502+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 Next-gen egress review) /Trapped /False >> endobj 14 0 obj << -/Count 4 /Kids [ 7 0 R 9 0 R 10 0 R 11 0 R ] /Type /Pages +/Count 4 /Kids [ 8 0 R 9 0 R 10 0 R 11 0 R ] /Type /Pages >> endobj 15 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1739 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1786 >> stream -Gat=+hfG8V&:X@\Z&`p?SWrF$%&OE:*9+d+#0,,UD^SSdl$A"\L?A1M>&[NK6[0d.&KW\b0C(JkJf72Cd_XS3BqMcKO';9"C@*AWOh%(lTSUP.?eCLDHgJbr3?nEkn[idK>SY0bJ&ci]3AW%'Jj]g6Lff^Z2Uh=nM@b\"k!;jl>e2*NsM_;I8[L,@+\&=lA5B2Oo.f)Fr@YB:*>R"JGt_KpoaG5HM?^&E=B*f[B'*8c5d:G+leN'G0q@!ZjhZ@uPHgWM7@`l%/M"*X1\A>XC0Q(Tm02t@(E/QN$qPa!@(OXWq^I2n(O=G/HGf+k__\I+rs$"5!MI$/c85Ka4`)A6Ji_3iD7Y72\@ASA1CJ\#ma'7@+'FeuHDfL+<^haVj4pP;!-WW#X]Wf!/;h]Y)hF'W3\VYNXriO+31atTY_e?G<`-T,"-@AYN&=/@pq4uZ\^W4;e:`]n_=cWMAI.(lC:SqcbK5KK>An]NXei]KoBa.M)G*:fcS?7CIXutN%Su[9qm_N[6<]i2L;qOX2Xu>`GAqi?#^(4%V2>3c;"m>lVZY_Nl]jbLbcHQ;N>N+f061iBft5.H39_iAU5=!4N*S$$oI]YrcLY*5f18Hc38#$U];-$69juD,#u]<_'L6DU<(Qia_&h`#GY[dftV(@ekWucK<4,&ri]Do8?Ar@8";9d'@%DRX&9hp:p9'R>V$T_Yuq6LdBR]0usRo>TQ6nMc+7'OWG>:;sCE5S^J"V*B)c)JKB1*^UAW%`+F\f#ft`SjHS!^fSpj58`A`+P\%iqgFa]`3Zb+i([aTQGNhc"d@k[:i(7q_RUgp/DM=1)/:UdB1LIOn`,]h\#@[^tB;Z>JY2$SbmrGp_n/HZ3fu@rIL14!'4ed/-~>endstream +Gat=+hfG8V&:X@\Z&`p?SaR%J+F`N6MO_7fX,\d@H-f4h_+C@*Nkf)R0E'Y;#7)KlZBC6fB$fu5O)Od,>qr#I@J0XS"o'd*o.($(_fPq'-8nP9?p$UJG/@EWa!HsSJqNAE@_%`^3><.lEQbV;=MCH2#K1bpD_if--YS]dDU;dK/iYQ2\DZ.%&3b)ecWl]1,8aZt;5)tT7R="^`jlHjq2ZRLAHm0XaKgIc50%\l$Icauq@87lk:tc!OOC8/B"t:LGeV_/l]81RJDM[#QBEJlG/o3J/SP@iac8A`Xf&&/I#Lj*@05]!2l\bE[)?B?(.\#%`Nb,IeH8$9hW[*.:E&l25@='i'SK]mn'\?XsI$0mK!\GYTP`$]-L7FBcJN$urPYd8u#,YH:KP,K9hbIi:hFGiV$>j\h4^\C^sN>'Bt-3G8R+XB4%e[uWJsl`^'CdJ3Ranbq)0jRU45p`mueVC+k`>Js0THhjMeGaP%F^^_ESbZ$4$&l^4D7Xi.e`Mu1`P#HeXN^V]`\3Kf^:`&](?msG=>bT55d3X^iOk^.PC59[$+*Oogue_)X16SQ&b/FjnAOoN/LPd6N[&l1g[S+fka8`bN0*\UNmD7Ok8Cr&<4F:hU_0eBW^Pe]lg_A]XWIl="4lT=h-4uXce!_HA+m##%>!,c/:;jE[6`IrJu+tk`%d>69ij$,#uQIJkJEg7$3m[PKfUJ%n=ASZ[]qG>MK,!%^M,4qqk`!7q-=p52q7;SoDDW>auG7(4@Y8)e@h@RhQL!ddFFD[!b0FRFS2ibQKgb9jmJ/WURsB$;!os4jnMrM.Xcid:N@/=/%$fpt2aSXJZjKk0>$bKdbNPQ(VlY-eH~>endstream endobj 16 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1512 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1559 >> stream -Gat=*hc&Pn&:Vr4Z&e#S_NJch.1[F;#c4@S*+@RHj@-#Ykd/#(H'\>ZcnUbhU&4Z&\^3M;Qi/^3V/7OmcUkPTO0FJ12X\SA0p&YV!,^LUTjcNZ6KrWRN:q;ao9V5jl+]a;'jq:R5!a7]Xpikk*2ibPjd0c1\oZD[TRa)CNk-;/(^GAY[-&dL)%7VZ'A]>S9YUjO\i*I*faN9p$@4E03n]s5WY?mW#hb>fjoLT,s?a7Or>6T/U40ijpg*<-HfN.**k\)M-1CWN[De*GF'P17=cg/OdV1cQte($g-EKHBk,3@N+B1V^uNqAP=]ikJY;P,8*H$FG6X&uTMsKCOh@a934_+CW'?5.)L?Hd6cMk91-\&)`6e3!o>Od&?n"3mgtC;VUg%olkJ5n$hW_+1plf]CeR#0W^+AbrFsmbomEGh+gU[O3aC9oe:B;+`4VgjecUO?i`/Co[EN/N;8.s0PleV.jK14[@[Q06Jm@:b,3i_:Tb(^%HBAil;]lSNr^AZ7pg*OU6[-)R)gTGJ[q91qJ'Z[TbM%eU==b_s/nJ03i<9g$I=-epm9_M/mF>JCWdZ(AsFdd\`]Cmt3gKLs-fR3)['RM;k$q2+uBJ&-]!koHF)ZkL@?lK0u$7H9`lrnE'Yf=IlZm*uA]8'F9ZYPT*+Mf+\%Cf/b@t4<*#G!).ZF:;8@SEq`k>E_?+meQaWN?D:m2^BbL19#m@jaTZq/P7QQj`MHusaa3r0:i"1GDD`$m%,hR/A#jub6r1WN8c9&cFFkWC`4lbj0VLi7+m_6"AsHT?ZKDlKlU/_d'T8'Rd=O7cQJ#)dW"4f!W+W1+^/bM'I~>endstream +Gat=*hc&Pn&:Vr4Z&e#S_NJch/e8s@aH`(>E.hpeP8D1R`-8ZOZP5Cqd(d7Ea*&FFK^3.kZ$3VQl._gE>l;t2Io6:E4G2Z#"j14r#Lk+bbV%k%2YoJ/X_&+WQ[,)e(fK@I0#_l[FrPFL5=,ab2]BN65_BJ>=bDZ9Et0EKX];4)aF=>`Q1qfl[5.I`ItBSd'Eu^O@[3E6&_bG>%UeuJAfiRcC](gL`X;uY[P6&4"Dr&)5]JB?%PKd`'uFWH1cK?K%fB0rOCb.aR6j"6Q$ED>QK]l]YWs"c=_a6*B&i.Gp$K^8&lIWp87cZ`%AmH'TJfX9B@bf,[j,%i*oKV%e&c-SHq2P.lk(0-G\>A_%siq8(!6?1>aK]bi)l>$+S1/iu=g4\g68Tn*.HOCOVaEIc-@(pUitPq(_F<-u-B?k]iiei\.\^Bu2/4Stn3VF!X$?+QXf\j67aY]MQJ5g-q/@7g)!O4%[:Ad49Sd8W6J*Xf>Q]A;S92<2.[F.X*Y`4VEKhhuVm;^a3tFk2BP(`S:nI+CW&pT3;f&4m0E7o8nWi#B7TmS:nKbB[hK7S`j&gdb+0Mq0.1An$hW_+1plV]?N`P&3!"_G+8unjq*64DPs7Q^umtBHC-ZX9KVWa\S53D=Fb5trUfq``dGXJ(j8EQP`^9b3m7V/Tl33XCC@W+%2Z'Uh2Ms=@-8P\4[<5b)c:]EkQJ&]^[^*qhY4Sf%XnfUCsZ_e^hSr.NK"N_gq?T7>b59h_:Th*^%66COtS2%3e\j*A8)$:,8UR=2.2\sfa4"Q='Z&/b8M>b+^Pq2D/2`36-nCZC9';8Zc\!^,Yi$:jZ,AN`)e@j19#JL?<]aV0\LO;eBe%U8@P`oLP(![jRn("NK6[oBh2<*Nbk3D=;ohr^#rJpq`H&7$iPUmoC#Hs7jNW*^=*dcg9lu%gbb`W_=hYgTK#d$@49im6lQ0a'(Cmrh\,]'!S\6k:-_slB%Mq;LCFGWUG\H?hEQ,QlWnRb"TaJ9+P8\E)"i3/B,d#ShVO?5g)?6T*(ntB?LFCp/>l&k$=$uYW\j:9+oU[.)#$MYB)Uke9a6a?JsnlS?<)/Il4t[JA7^Wfq@morkMtU'e+%A/)R+WA,Yg'#c)u2b1$pidt6[WB*%rRplfZOSkJ'2r?B\=_d3GOlIIB9oT2d!.kV.p,WN5F:dDC8'CS'tA7*PuYsfiKuqd%Z$#$/t_GBuo9/pSMLlQFN=OQT[G"6:)n:ZRd4"V,>U('SBob\,=&*5J@(jVu~>endstream endobj 17 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1245 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1294 >> stream -GatU29lo&I&A@C2lqpM.Q2j-LT,^Sb:8a[EZ/T#1JP!pL9G.a68_'ZP]aKpr8D1;=F>u0ImI%mH\'&%hnF7^jIoZW`T>PRh#nRI8-'6I]@K%'jR#etB8F%->Skk!+6BVm58:6#/B_J!"4cU))FJ(),9*D$rAH=6fE9"`d>:"'a=n+S)E@%"meDMeDJn/4!;V100mPig7G`[R-%6$OhVjA5=*\\EoT6'ruAg@S_B5iqG;\K\>`k)fN)V(7%k7"%I)qDH;rfPeuAK3T#XOlc"SP"tf&g97/t3>.j&1Vb-&j,Z[0;([E;Y>!*MsR9giKR\J@:DadSQ'iI8^$WZt@NTd#k].l(YD'pq].D^Mg.8c2OQVZr,*e)qK.KlOgKF%Hr%&U\H7G[/b\U>jISn8T5kKYH^$PbmRKlY-96P2]NllZ&R\XNGY`raj4#I;9?':?C_V6UhrSBS[HZ?@J],dTK"P%5I7&/!>Pf^i#[i4!#HNVt++08\mL,aM&6j*Vrc(hXD:,FD<'aC4lS61*5!UbB<(%PNLqHQ*Zk`smM&QbJLGegH0NPEWGeZ_r'WBjsLQs6\n6WS)>:8aPE(aklc`X'B24kM._gmA*h/M]7VErBTc]\`7s_L/&-LR:ifVE=(XCh@T/;TGYO(d;$E!E/2bW^S#&"k5!58D>[X2i;_<>dQ#,"8hB<63s8;"9q0MAqjH7l!gf%=)5;/ni\YAHn/29Zb,rT@gN?j]ao*I]"#=kHgH:]1)Jnktp0&V9!>kNe6H_7"[kbendstream +GatU29lo&I&A@C2lqpMnPQ3p5eL/D$\C7FT:96Dk?!n;N&5r]65Z3$pDsmb',Z;'e-QS48;7l_pn92'0$5$T$Hl#G+pJ^kS,6c4t3X;+8"K$[bL["%"Lj#@=-P;7m#+SU)o8$iqR\O7KpEN)!44"tE9*Ac2jT-7jE9!>$[F'uBUA>mrX3.D?Vka@ZN"enmZ`teM"QlbbJmX&7W52]$8'UD]"K('aqT`%9K\(:Pij;3k^kN%S2!cZQMEIjiEu88!,SX8b)?f@CDWFt>;1YeV?-3e=X@qZ>Xt@kW?@o=+'V]Rt,L8W4@Y#SS<#>at.NU,H#eL`[(8mk(LUYGo38mBSN;)h7i';@Z@^=`Er1WH^;rqO(&lQ.d)R.P"Lq$-64+J-Q2K@P%P&]jtFH327+6AkGG0-0*Efh$`1e$.2XL;QhA^1rd5W0hM6e_6NHol$)CZ-XK\;[/ST;FU#[I22qOd\5-LQk"2'-7o1QQY_65c\enu'U=("KM(-P4rC#`9IC[P6uAR^\MOP*2("m!*eP^2l9bS[2UGDVKTrF_;'1d'-3K^m7oPUT0g1nr>KK@`%pdN?P.*[kNYZ(?<.TSn&GZJaemu''cIG4t_^8afl#t/;7#W'ICu\+fN.:TDVh.'(?Mn]QZZplaY'_i3J\h_t[ar$$*=hG4mc=+Qm)'n_ZXXSsheiatnWbnu_A_1o2[,cafZC?V)oPQaIZ3gP4L%EejVg'fmAbB3FH[&r.TQlnp*8#A'!=)m-S:!,))GobUTo[!dC7[4Zp.29:7c=^,_$@3enQLMm5aQY(*uc0^4W/II81kS^B1S&K9nG2ZL.F=>`Zf0$60UK-R/Z`BtN#,aa9kJO&Ui3:Z[]Et+n)Fm)m2g(KdYH6O,(Mb"(edH=U$%IY4])Yd/qI0DEctDendstream endobj 18 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1521 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1566 >> stream -Gat=+gN)%,&:N/3m%YQT1]cInLQ8+]Bq!]7=E:=1d7f)GaB"3r>jNPYH3Eq59AQj4d,7An'&<=IQ"(.rQ!u3Uge!tAVT&-b^"^+Yl_LA0+f_5466#,Y('`)9F!&;N!?/3WRh1GV^ga_^\iK3pO=u/0e'i)m)6>7*gONjsZ]KH$OMnAlQ>tinH*KCJRC]'eeW'NTli(9g+O_W=<))ED>o+?Ea<5;1C5rNJ)#m`5D_'bb[FQqeoN]&r'm3,L-bqVXbB$c5=@"lTk;#'YrU!GR[BKCTn@T`Z#eh@n@&]X+"m[FAP9jeoYZsNYrk4NWLV.T4icksO[$'W-Lfob=OGAVU_`Na"\1fj5iksC$D7?[\ao$nNmh<[;Q>R8d^YXI/-jI?*Q4gSe)kTH!mi+J0+]ZOl;;M]@\%U)AoQnu\MQ.8@GM^4;?#K^1@UM*':ofL+`.5XtN$:48_=uC8TI:4AJRp9j5qN`Yc0k?GOTM7d$8na4Ne*d=+,#SdJN;#VruYQnS6#uP4k-0JYUe\'IeK0kYT^!CW!9DCJ\5T4*h[cU1'"cm744BJiAYWc@gA!Kp*_7u=T5Cj"#f%&H'4kY!PPXN+7-$$?<8`-0Sk4#Hd50RKWA\H`d+"`"VuLQH:\`D1+\l2?Rrr`*4.0b8.5R@:B_X-(dC%&F2:C,@O+D81UWL&&m3Hg/!_PojpelPTj+!bTh8WC=8phnI:HAg\%PY&gKdu)_h-,KQPZ8m)R?"6<;\\GjS^uO3uEJ6.A\lf.qK+T5R*&2T&l5n9#E.kQ%i?a.LhAn'&qF*kN:p#SHH,gSbC2Y+'Q:Rg3%ipTp6/:4t*fC&sW0.!UsZo*=f'LO1,8R>]/%8=O@*E:3@Fc1)H7H1qkp\iS#']uokk"32q2Tj;2O2(+dk#\1)^UddBeJkkR-^c'p0".jf$@hH_GdtI-7,elB#K*OX&^nqbP[`j`8n)5N!p/AV.i5$0.Dg]FIYO%er@.Gs#W0*)~>endstream +Gat=+gN)%,&:O:Sm%YQT0EHd7pn?_-G+'cO30r?6B/J)28P!=-Mp.)"oqC:""UX$2;04l>#pf7Q(V:(A=]3W9U?0-+!IU9Nq$dMM@($'X$&@28\=O^(+&R_K/>=lTA7/Q)ka"\X*f@@'S1]k!")X:V0T/aN6WI#-@oD-9'6k'p&k+#-8eJQN+t30e98V.gCKBb?8l#+RDQRXi@=e1!$S1&""*WK+miW$_%S^$IGKN%kF4$o(Z]mY&gfdun^?gooL,FMcJB:sC,AZ3L/&KY`R;h5>4"Jkdn,;d/3GLfc3[DTo^!P[!(]np%"k''>/3D'2`t6n#]187Ir^ME(+\/>"#F/7#7NeW'NDjo,gQUS\F'R'q__i&2&hp(C`.f``:MIIL8DN[51dj\M\-h,QB$7=+*SQbX:(>e"4(Dri%hKV!BkY7(-I/#u$&WErWS>%nU$:0]KO0rqQ#t[12H].1EKs\;M@*;A"R^*Lal@.ZOJP-[-m+r'p.PDfV`3p6%J1o4&?T<+Hjt'$R!fM6f6&o_mU-pQ_k]D1.clgH?n,eX"6$@iU?XUZ'iQ?$JXUYV^#ZdCL'i4p132^#h)\uHf'=T[C?]U^DaF+0O"SH$$[t.4TVSeN`/AN9'cAoN_X:+0e'3mQ13O/j_\bGBec@He<#r>5Ci>00LQ+W6O":;fSU(c9T(<>dg^[Xr$@NC0GR\*E=?HI@-DdSh?Xim%7@'U'mC)9CjRgGKF?"D^&7ooAV]q.!jRM11^CWE3fPdj-KeVD%KGo]nYFU6&ZO8*]fLD30q[5BJ7I;dEM])bXtNNUt^cJd[!C*@PJa?<,)07/.Pd0#O/42`(?AcV/Dg*P;L=503g/+YR]Mp?_-([?@BAGe_0Z,OVLu%,&tVk;lLK[5,s.Q5$;WA=>kE2^aKJ]S`liYqu5G\(#,=,:BsuZtdL1jU/J`>gk_J5Pq/LD`fK7D:DT?q:K3">-Q89/[,endstream endobj xref 0 19 @@ -139,7 +139,7 @@ xref 0000000418 00000 n 0000028157 00000 n 0000028240 00000 n -0000028508 00000 n +0000052918 00000 n 0000053186 00000 n 0000053454 00000 n 0000053660 00000 n @@ -147,13 +147,13 @@ xref 0000053936 00000 n 0000054251 00000 n 0000054331 00000 n -0000056162 00000 n -0000057766 00000 n -0000059103 00000 n +0000056209 00000 n +0000057860 00000 n +0000059246 00000 n trailer << /ID -[<7980b3b39b2662662624213f08f5e4c7><7980b3b39b2662662624213f08f5e4c7>] +[<4f69c210d19d13122ee77ea4bb2e4f57><4f69c210d19d13122ee77ea4bb2e4f57>] % ReportLab generated PDF document -- digest (opensource) /Info 13 0 R @@ -161,5 +161,5 @@ trailer /Size 19 >> startxref -60716 +60904 %%EOF diff --git a/docs/20260602_REVERSE_SSH_proposals_summary.pdf b/docs/20260602_REVERSE_SSH_proposals_summary.pdf index ea3ff1b..5ffaeb9 100644 --- a/docs/20260602_REVERSE_SSH_proposals_summary.pdf +++ b/docs/20260602_REVERSE_SSH_proposals_summary.pdf @@ -483,7 +483,7 @@ endobj endobj 81 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103621+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103621+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115602+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115602+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 On-Demand Remote Access \(Reverse Tunnel\) Proposals) /Trapped /False >> endobj @@ -1052,7 +1052,7 @@ xref trailer << /ID -[] +[<11e0c9648d0e34b6b5fc15e51a46b34d><11e0c9648d0e34b6b5fc15e51a46b34d>] % ReportLab generated PDF document -- digest (opensource) /Info 81 0 R diff --git a/docs/20260607-2FA-email-mobile-auth-flow.pdf b/docs/20260607-2FA-email-mobile-auth-flow.pdf index 8a095c5..7470d87 100644 --- a/docs/20260607-2FA-email-mobile-auth-flow.pdf +++ b/docs/20260607-2FA-email-mobile-auth-flow.pdf @@ -265,7 +265,7 @@ endobj endobj 42 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103621+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103621+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115602+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115602+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 Email agent config & 2FA / mobile auth flow) /Trapped /False >> endobj @@ -537,7 +537,7 @@ xref trailer << /ID -[<0781db1091e119408594de96d3ab2a27><0781db1091e119408594de96d3ab2a27>] +[<9ce023989e289f6819633476a5f8acf9><9ce023989e289f6819633476a5f8acf9>] % ReportLab generated PDF document -- digest (opensource) /Info 42 0 R diff --git a/docs/20260608_ALPHA_PRIORITIES.pdf b/docs/20260608_ALPHA_PRIORITIES.pdf index 0c08e47..729394f 100644 --- a/docs/20260608_ALPHA_PRIORITIES.pdf +++ b/docs/20260608_ALPHA_PRIORITIES.pdf @@ -208,7 +208,7 @@ endobj endobj 33 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103621+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103621+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 alpha priorities \(2026-06-08 renumber\)) /Trapped /False >> endobj @@ -418,7 +418,7 @@ xref trailer << /ID -[] +[] % ReportLab generated PDF document -- digest (opensource) /Info 33 0 R diff --git a/docs/20260608_BE_SERVICES_and_infra.pdf b/docs/20260608_BE_SERVICES_and_infra.pdf index e53dd81..7ec3144 100644 --- a/docs/20260608_BE_SERVICES_and_infra.pdf +++ b/docs/20260608_BE_SERVICES_and_infra.pdf @@ -203,7 +203,7 @@ endobj endobj 31 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103622+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103622+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (BE services & infrastructure \204 validation map) /Trapped /False >> endobj @@ -385,7 +385,7 @@ xref trailer << /ID -[] +[<8dbfa9f2eeb85b942477caa11fa4018a><8dbfa9f2eeb85b942477caa11fa4018a>] % ReportLab generated PDF document -- digest (opensource) /Info 31 0 R diff --git a/docs/20260608_STREAM_DUMP_DEBUG.pdf b/docs/20260608_STREAM_DUMP_DEBUG.pdf index 719ed37..c03a58b 100644 --- a/docs/20260608_STREAM_DUMP_DEBUG.pdf +++ b/docs/20260608_STREAM_DUMP_DEBUG.pdf @@ -137,7 +137,7 @@ endobj endobj 22 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103622+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103622+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Stream dump \204 developer debug recording \(FR 0.1\)) /Trapped /False >> endobj @@ -277,7 +277,7 @@ xref trailer << /ID -[<5414717d95a706704816768ef651c305><5414717d95a706704816768ef651c305>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 22 0 R diff --git a/docs/20260610_SERVICES.pdf b/docs/20260610_SERVICES.pdf index f22966d..2ff2e7e 100644 --- a/docs/20260610_SERVICES.pdf +++ b/docs/20260610_SERVICES.pdf @@ -275,7 +275,7 @@ endobj endobj 47 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103622+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103622+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 exposed services catalog) /Trapped /False >> endobj @@ -589,7 +589,7 @@ xref trailer << /ID -[<821a3e74e00ad5b4b9fe220c5add2f64><821a3e74e00ad5b4b9fe220c5add2f64>] +[<82e09bcb7eb13164861aeba124022201><82e09bcb7eb13164861aeba124022201>] % ReportLab generated PDF document -- digest (opensource) /Info 47 0 R diff --git a/docs/20260620_postgres_timescale_db_platform.md b/docs/20260620_postgres_timescale_db_platform.md new file mode 100644 index 0000000..7cdbd65 --- /dev/null +++ b/docs/20260620_postgres_timescale_db_platform.md @@ -0,0 +1,258 @@ +# PostgreSQL, TimescaleDB, and platform DB adapters — comparison + + +| Field | Value | +|---|---| +| Author | Anton Afanasyeu | +| Revision | R0 | +| Creation date | 2026-06-20 | +| Last modification date | 2026-06-20 | +| Co-authored | Cursor Agent (project assistant) | +| Severity | medium | +| State | advisory | +| Document type | technical | +| Supersedes | — | +| Design review | — | + + +--- + +**Document type:** Technical advisory (not a DR/SPEC) +**Context:** [repos reorganizing SPEC R1](specs/20260618_repos_reorganizing.md) approved; `ac-platform-db` planned as migration-only repo; production today is **MariaDB on Alpine BE** ([INFRA.md](INFRA.md)) with **SQLite** for local dev. +**PDF:** [20260620_postgres_timescale_db_platform.pdf](20260620_postgres_timescale_db_platform.pdf) · Regenerate: `bash scripts/build-all-docs-pdf.sh` +**Related:** [GRAFANA_vs_others_graphvis_pivot.md](GRAFANA_vs_others_graphvis_pivot.md) · [specs/20100612_1_scaling.md](specs/20100612_1_scaling.md) + +**Documentation index:** [README.md](README.md) + +--- + +## Table of contents + + +- [1. Executive summary](#1-executive-summary) +- [2. When SPEC implementation can start](#2-when-spec-implementation-can-start) +- [3. TimescaleDB fit for AndroidCast](#3-timescaledb-fit-for-androidcast) +- [4. Platform DB adapter layout](#4-platform-db-adapter-layout) +- [5. MariaDB vs PostgreSQL comparison](#5-mariadb-vs-postgresql-comparison) +- [6. PostgreSQL vs PostgreSQL + TimescaleDB](#6-postgresql-vs-postgresql--timescaledb) +- [7. Migration effort (MariaDB → PostgreSQL)](#7-migration-effort-mariadb--postgresql) +- [8. Verdict and recommended path](#8-verdict-and-recommended-path) +- [9. Changelog](#9-changelog) + + +--- + +## 1. Executive summary + +| Question | Short answer | +|----------|--------------| +| **TimescaleDB worth it?** | **Yes, selectively** — for high-frequency cast/WebRTC telemetry and rollups, not for tickets/users/RBAC. | +| **Split `ac-platform-db` + dialect adapters?** | **Moderate effort** — clean architecture for SPEC Step 3; **do not** run two production engines long-term. | +| **Pick one engine forever?** | **PostgreSQL (+ Timescale on hypertables)** is the better long-term bet for analytics, cloud, and schema rigor; MariaDB is fine to **keep through alpha** while adapters are designed. | +| **Verdict** | Design **`ac-platform-db`** as dialect-neutral migrations + runner; ship **`ac-platform-db-postgres`** as primary target; keep **`ac-platform-db-mariadb`** as a **transition shim** (alpha + parity tests), then retire. Enable Timescale only on **stats hypertables** in the same Postgres instance. | + +--- + +## 2. When SPEC implementation can start + +**Green light** once all of the following are true: + +| Gate | Owner | Notes | +|------|-------|-------| +| SPEC R1 **approved** | PO | Done | +| `git://f0xx.org/ac/*` bare repos exist and ACLs work | PO | Done (per PO) | +| Monolith `android_cast` **read-only** for day-to-day dev | PO | You are setting this — avoids drift while extracts land in `ac-*` | +| Step 1 verify: push/pull smoke test to `ac/ac-docs`, `ac/ac-scripts` | Agent/PO | 5-minute git check | +| Write path agreed: feature branches on `ac-*` repos, not monolith | Team | After R/O freeze | + +**Recommended first implementation slices** (SPEC §9 order): + +1. **Step 2** — push `ac-docs`, `ac-scripts`, `ac-platform-web` from monolith history (no runtime coupling). +2. **Step 3** — extract `ac-platform-php` + **`ac-platform-db`** skeleton (this document informs dialect choice). +3. **Defer** domain MS splits (Step 6+) until platform Composer packages publish and BE can `composer require` them. + +Monolith can stay **deployable** for production until Step 8+ per SPEC; R/O on the legacy repo does **not** block new work on `ac-*` repos. + +--- + +## 3. TimescaleDB fit for AndroidCast + +[TimescaleDB](https://github.com/timescale/timescaledb) is a **PostgreSQL extension** (Apache-2.0 core; some features under Timescale License). It adds: + +- **Hypertables** — automatic time partitioning (chunks) for fast range scans +- **Compression / columnstore** — large retention with less disk +- **`time_bucket()`** — idiomatic rollups (hourly/daily session stats) +- **Continuous aggregates** — incremental materialized rollups (better than plain PG materialized views for append-heavy series) +- **Retention policies** — drop or tier old chunks + +### 3.1 Where it helps in this project + +| Workload | Current shape | Timescale benefit | +|----------|---------------|-------------------| +| **Cast session graphs** (`graph_sessions`) | One row per session; dashboards aggregate by day | **Low today** — row count is modest; MariaDB indexes suffice | +| **Live cast heartbeats / WebRTC stats** (growing) | Sub-minute samples per peer/session | **High** — append-heavy, range + `GROUP BY time_bucket` | +| **Remote access events** | Event log, time-ordered | **Medium** — compression + retention if volume grows | +| **Tickets, users, RBAC, reports** | OLTP | **None** — keep normal relational tables | + +**Founder pitch (accurate):** the win is **fast analytical queries over large time-series** with **compression** and **incremental aggregates**, not replacing your OLTP database. + +### 3.2 Practical adoption pattern + +Use **one PostgreSQL instance**: + +- **Regular tables** — identity, tickets, devices, reports (standard Postgres) +- **Hypertables** — e.g. `cast_stats_samples (time, session_id, metric, value)` after live/WebRTC stats land at scale +- **Continuous aggregates** — e.g. hourly `avg_kbps`, `packet_loss` per company for graphs UI + +Do **not** run a separate Timescale-only cluster until traffic proves it; extension install on the primary BE Postgres is enough for alpha/beta scale. + +### 3.3 Risks + +| Risk | Mitigation | +|------|------------| +| Extension not on Alpine/Alpine PHP image path | Use official `timescale/timescaledb-ha` Docker on `be-data-1` or managed Tiger Cloud later | +| License on advanced features | Core hypertables/compression sufficient; read [Timescale licensing](https://www.timescale.com/legal/licenses) before depending on TSL features | +| PO single-engine ops | Same backup/replica story as Postgres; not a second DB product | + +--- + +## 4. Platform DB adapter layout + +Proposed repos (extends SPEC §6 P1): + +```text +ac-platform-db # Contracts: MigrationInterface, SchemaVersion, portable types +ac-platform-db-postgres # Postgres + Timescale DDL, pgsql migrations, pg_dump helpers +ac-platform-db-mariadb # MariaDB DDL (transition), mysql migrations +ac-platform-db-sqlite # Optional: dev-only adapter (today's sqlite path) +``` + +### 4.1 What `ac-platform-db` owns (core) + +- Migration runner (ordered files, `schema_migrations` table) +- **Portable** migration IDs and naming (`001_users`, not engine-specific paths only) +- Dialect hooks: `boolean`, `json`, `enum`, `autoIncrement`, `timestampMs`, `upsert` +- **Duplication wire** (switching engines): export/import interface + +### 4.2 What dialect repos own + +| Concern | MariaDB adapter | Postgres adapter | +|---------|-----------------|------------------| +| DDL syntax | `AUTO_INCREMENT`, `ENGINE=InnoDB`, `ENUM(...)` | `SERIAL`/`GENERATED`, native `ENUM` or `CHECK` | +| Upsert | `ON DUPLICATE KEY UPDATE` | `ON CONFLICT … DO UPDATE` | +| Migrations | `.mariadb.sql` or PHP builder | `.pgsql.sql` + optional `CREATE EXTENSION timescaledb` | +| Index DDL | `CREATE INDEX IF NOT EXISTS` (10.1.1+) | `CREATE INDEX CONCURRENTLY` for prod | +| Time helpers | `FROM_UNIXTIME(ms/1000)` | `to_timestamp(ms/1000.0)` | + +### 4.3 Effort to maintain two adapters + +| Aspect | Assessment | +|--------|------------| +| **Mechanical** | **Medium** — you already branch on `sqlite` vs `mysql` in `Database.php`, `GraphRepository.php`, `LiveCastRepository.php` | +| **Ongoing cost** | **High if 100% parity forever** — every migration written twice + CI matrix | +| **Sustainable pattern** | **Single source of truth** migrations in PHP/DSL that emit dialect SQL, *or* one canonical Postgres migration + MariaDB shim only until cutover | +| **Duplication while switching** | **Hard across engines** — use one-time **pgloader** / custom ETL + dual-write window (days), not perpetual sync | + +**Recommendation:** treat MariaDB adapter as **legacy bridge**; Postgres adapter as **canonical** after cutover date. CI runs integration tests on **Postgres**; MariaDB optional until retired. + +--- + +## 5. MariaDB vs PostgreSQL comparison + +Scores are for **AndroidCast** (PHP PDO microservices, session OLTP, growing stats, VM-first → managed cloud). + +| Criterion | MariaDB | PostgreSQL | Notes for us | +|-----------|---------|------------|--------------| +| **Maintainability (ops)** | ●●●○ | ●●●● | MariaDB already on Alpine BE; Postgres is one `apk`/Docker change | +| **Maintainability (schema)** | ●●○○ | ●●●● | Less `ENUM`/engine-specific drift; stricter types help multi-repo migrations | +| **App code (PHP PDO)** | ●●●● | ●●●● | Both first-class; rewrite mostly SQL strings, not driver | +| **Flexibility (SQL/features)** | ●●●○ | ●●●● | PG: richer JSON, window functions, CTEs, partial indexes | +| **OLTP query speed** | ●●●● | ●●●● | Comparable at our row counts; tuning matters more than brand | +| **Analytics / time-range** | ●●○○ | ●●●○ | PG better planners on complex aggregates; **Timescale** tips this further | +| **Vertical scale** | ●●●● | ●●●● | Single BE VM — both fine to 100GB class with tuning | +| **Horizontal scale** | ●●●○ | ●●●● | PG: read replicas, logical replication, Citus/Timescale multi-node later; MariaDB Galera/GTID (cluster0) works but ops-heavy | +| **Cloud managed availability** | ●●●● | ●●●●● | RDS/Aurora MySQL vs RDS/Aurora PG/AlloyDB/Timescale Cloud — PG slightly broader for analytics extensions | +| **SQLite dev parity** | ●●●○ | ●●●○ | Keep `ac-platform-db-sqlite` for laptop; neither matches prod perfectly | +| **Existing investment** | ●●●●● | ●○○○○ | All prod migrations, `schema.mariadb.sql`, cluster0 GTID docs | +| **Timescale / time-series** | ●○○○ | ●●●●● | MariaDB has no equivalent extension in-tree | +| **Licensing / vendor** | GPL / BSL nuances | PostgreSQL License | Both acceptable; Timescale has dual license on some features | + +### 5.1 Other bonuses from PostgreSQL + +- **Same DB for OLTP + stats** with Timescale on selected tables (no Flink/ETL for dashboards) +- **`pgvector` / AI extensions** — optional later (Tiger Data stack); not alpha scope +- **Logical replication** — easier blue/green DB upgrades than MySQL dump cuts +- **Stricter constraints** — catches migration bugs earlier when `ac-platform-db` fans out to many MS repos + +### 5.2 Reasons to stay on MariaDB longer + +- Production already stable; **alpha must not hinge on DB migration** +- `orchestration/sim/cluster0` GTID MariaDB story is documented +- Team familiarity; zero new extension packaging on Alpine until you choose Docker for `be-data-1` + +--- + +## 6. PostgreSQL vs PostgreSQL + TimescaleDB + +| Layer | Plain PostgreSQL | + TimescaleDB | +|-------|------------------|---------------| +| **OLTP** | Full | Unchanged (regular tables) | +| **Session-level graphs** (current) | Indexed `BIGINT` ms timestamps — adequate | Optional; benefit small until row counts > ~1M | +| **High-frequency samples** | Partition manually or suffer sequential scans | Hypertables + compression — **large win** | +| **Dashboard rollups** | Materialized views (full refresh) | Continuous aggregates — **incremental** | +| **Ops** | Standard Postgres backup | + extension version pin; use `timescale/timescaledb-ha` images | +| **Query speed (simple)** | Baseline | Same for non-hypertable tables | +| **Query speed (time aggregates)** | Good with indexes | **Much better** at scale (`time_bucket`, chunk exclusion) | + +**Rule of thumb:** adopt **Postgres first**; add **Timescale** when (a) live/WebRTC stats storage is defined, and (b) you expect **sustained append rate** or **90+ day retention** of sub-session samples. + +--- + +## 7. Migration effort (MariaDB → PostgreSQL) + +| Area | Effort | Examples in repo | +|------|--------|------------------| +| Schema DDL | Medium | `ENUM`, `AUTO_INCREMENT`, `ENGINE=InnoDB`, `LONGTEXT` | +| Repository SQL | Medium–High | `GraphRepository`, `LiveCastRepository`, `Database::tableExists` introspection | +| Migrations | Medium | 9+ migration files; idempotent `ALTER` patterns differ | +| Config / deploy | Low | `pdo_pgsql`, DSN in config, Docker compose for `be-data-1` | +| Data cutover | Medium | `pgloader` or CSV per table; schedule maintenance window | +| Tests | Medium | PHPUnit against Postgres in CI | + +**Estimated engineering (order of magnitude):** 1–2 weeks focused for schema + repos + CI, **not** blocking SPEC Steps 2–5 if Postgres is chosen before `ac-platform-db` migrations are copied out of the monolith. + +**Duplication window:** dual-write (application writes both) for 24–72h *or* read-only monolith + one-shot migration — dual-write across MariaDB↔Postgres is **error-prone**; prefer freeze + migrate + verify. + +--- + +## 8. Verdict and recommended path + +### 8.1 Decision + +1. **Approve PostgreSQL as the long-term platform database** (managed or VM/Docker). +2. **Use TimescaleDB as an extension on that Postgres** for **telemetry hypertables only** — align with cast stats / live session analytics roadmap. +3. **Structure `ac-platform-db`** as core + **`ac-platform-db-postgres`** (primary) + **`ac-platform-db-mariadb`** (temporary parity for current BE until cutover). +4. **Do not** invest in keeping two production engines in sync indefinitely; MariaDB adapter exists to **de-risk alpha**, not to double every feature forever. + +### 8.2 Phasing + +| Phase | Database | Action | +|-------|----------|--------| +| **Alpha (now)** | MariaDB on Alpine | No forced migration; extract `ac-platform-db` with both adapters sketched | +| **Platform extract (SPEC Step 3)** | CI on Postgres + Timescale Docker | New migrations authored **Postgres-first**; MariaDB shim generated or hand-ported for prod continuity | +| **Pre-beta** | Postgres (+ Timescale) on `be-data-1` | One cutover; hypertable for stats; retire MariaDB adapter from CI | +| **Cloud (scaling SPEC)** | RDS / Aurora PG / Timescale Cloud | Same `ac-platform-db-postgres` migrations as job | + +### 8.3 What to prototype first (low cost) + +1. Docker Compose: Postgres 16 + Timescale — import anonymized `graph_sessions` + fake 1Hz stats table as hypertable. +2. Re-run graphs dashboard queries with `time_bucket` vs current MariaDB `GROUP BY day` — measure at 100k / 1M / 10M rows. +3. Spike `ac-platform-db` migration interface with one table (`schema_migrations`) emitted to both dialects. + +--- + +## 9. Changelog + +| Rev | Date | Change | +|-----|------|--------| +| R0 | 2026-06-20 | Initial advisory: Timescale fit, adapter layout, MariaDB vs Postgres, verdict | diff --git a/docs/20260620_postgres_timescale_db_platform.pdf b/docs/20260620_postgres_timescale_db_platform.pdf new file mode 100644 index 0000000..b3625b0 --- /dev/null +++ b/docs/20260620_postgres_timescale_db_platform.pdf @@ -0,0 +1,444 @@ +%PDF-1.4 +% ReportLab Generated PDF document (opensource) +1 0 obj +<< +/F1 2 0 R /F2 3 0 R /F3 18 0 R /F4 25 0 R /F5 26 0 R /F6 27 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 45.68504 762.0394 124.373 773.0394 ] /Subtype /Link /Type /Annot +>> +endobj +5 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 45.68504 751.0394 188.853 762.0394 ] /Subtype /Link /Type /Annot +>> +endobj +6 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 45.68504 740.0394 168.389 751.0394 ] /Subtype /Link /Type /Annot +>> +endobj +7 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 729.6019 166.395 739.6019 ] /Subtype /Link /Type /Annot +>> +endobj +8 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 719.6019 157.2375 729.6019 ] /Subtype /Link /Type /Annot +>> +endobj +9 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 709.6019 90.52504 719.6019 ] /Subtype /Link /Type /Annot +>> +endobj +10 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 45.68504 699.0394 150.621 710.0394 ] /Subtype /Link /Type /Annot +>> +endobj +11 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 688.6019 181.3875 698.6019 ] /Subtype /Link /Type /Annot +>> +endobj +12 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 678.6019 150.1425 688.6019 ] /Subtype /Link /Type /Annot +>> +endobj +13 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 668.6019 173.91 678.6019 ] /Subtype /Link /Type /Annot +>> +endobj +14 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 45.68504 658.0394 185.285 669.0394 ] /Subtype /Link /Type /Annot +>> +endobj +15 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 647.6019 181.41 657.6019 ] /Subtype /Link /Type /Annot +>> +endobj +16 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 637.6019 190.575 647.6019 ] /Subtype /Link /Type /Annot +>> +endobj +17 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 45.68504 627.0394 210.861 638.0394 ] /Subtype /Link /Type /Annot +>> +endobj +18 0 obj +<< +/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +19 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 45.68504 616.0394 202.517 627.0394 ] /Subtype /Link /Type /Annot +>> +endobj +20 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 45.68504 605.0394 166.189 616.0394 ] /Subtype /Link /Type /Annot +>> +endobj +21 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 594.6019 100.95 604.6019 ] /Subtype /Link /Type /Annot +>> +endobj +22 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 584.6019 99.29254 594.6019 ] /Subtype /Link /Type /Annot +>> +endobj +23 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 59.68504 574.6019 179.73 584.6019 ] /Subtype /Link /Type /Annot +>> +endobj +24 0 obj +<< +/Border [ 0 0 0 ] /Contents () /Dest [ 28 0 R /Fit ] /Rect [ 45.68504 564.0394 93.26904 575.0394 ] /Subtype /Link /Type /Annot +>> +endobj +25 0 obj +<< +/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font +>> +endobj +26 0 obj +<< +/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font +>> +endobj +27 0 obj +<< +/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font +>> +endobj +28 0 obj +<< +/Contents 58 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 57 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +29 0 obj +<< +/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R + 14 0 R 15 0 R 16 0 R 17 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R ] /Contents 59 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 57 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +30 0 obj +<< +/Contents 60 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 57 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +31 0 obj +<< +/Contents 61 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 57 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +32 0 obj +<< +/Contents 62 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 57 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +33 0 obj +<< +/Contents 63 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 57 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +34 0 obj +<< +/Outlines 36 0 R /PageMode /UseNone /Pages 57 0 R /Type /Catalog +>> +endobj +35 0 obj +<< +/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (PostgreSQL, TimescaleDB, and platform DB adapters \204 comparison) /Trapped /False +>> +endobj +36 0 obj +<< +/Count 24 /First 37 0 R /Last 56 0 R /Type /Outlines +>> +endobj +37 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 38 0 R /Parent 36 0 R /Title (1. Executive summary) +>> +endobj +38 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 39 0 R /Parent 36 0 R /Prev 37 0 R /Title (2. When SPEC implementation can start) +>> +endobj +39 0 obj +<< +/Count 3 /Dest [ 28 0 R /Fit ] /First 40 0 R /Last 42 0 R /Next 43 0 R /Parent 36 0 R + /Prev 38 0 R /Title (3. TimescaleDB fit for AndroidCast) +>> +endobj +40 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 41 0 R /Parent 39 0 R /Title (3.1 Where it helps in this project) +>> +endobj +41 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 42 0 R /Parent 39 0 R /Prev 40 0 R /Title (3.2 Practical adoption pattern) +>> +endobj +42 0 obj +<< +/Dest [ 28 0 R /Fit ] /Parent 39 0 R /Prev 41 0 R /Title (3.3 Risks) +>> +endobj +43 0 obj +<< +/Count 3 /Dest [ 28 0 R /Fit ] /First 44 0 R /Last 46 0 R /Next 47 0 R /Parent 36 0 R + /Prev 39 0 R /Title (4. Platform DB adapter layout) +>> +endobj +44 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 45 0 R /Parent 43 0 R /Title (4.1 What ac-platform-db owns \(core\)) +>> +endobj +45 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 46 0 R /Parent 43 0 R /Prev 44 0 R /Title (4.2 What dialect repos own) +>> +endobj +46 0 obj +<< +/Dest [ 28 0 R /Fit ] /Parent 43 0 R /Prev 45 0 R /Title (4.3 Effort to maintain two adapters) +>> +endobj +47 0 obj +<< +/Count 2 /Dest [ 28 0 R /Fit ] /First 48 0 R /Last 49 0 R /Next 50 0 R /Parent 36 0 R + /Prev 43 0 R /Title (5. MariaDB vs PostgreSQL comparison) +>> +endobj +48 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 49 0 R /Parent 47 0 R /Title (5.1 Other bonuses from PostgreSQL) +>> +endobj +49 0 obj +<< +/Dest [ 28 0 R /Fit ] /Parent 47 0 R /Prev 48 0 R /Title (5.2 Reasons to stay on MariaDB longer) +>> +endobj +50 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 51 0 R /Parent 36 0 R /Prev 47 0 R /Title (6. PostgreSQL vs PostgreSQL + TimescaleDB) +>> +endobj +51 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 52 0 R /Parent 36 0 R /Prev 50 0 R /Title (\376\377\0007\000.\000 \000M\000i\000g\000r\000a\000t\000i\000o\000n\000 \000e\000f\000f\000o\000r\000t\000 \000\(\000M\000a\000r\000i\000a\000D\000B\000 !\222\000 \000P\000o\000s\000t\000g\000r\000e\000S\000Q\000L\000\)) +>> +endobj +52 0 obj +<< +/Count 3 /Dest [ 28 0 R /Fit ] /First 53 0 R /Last 55 0 R /Next 56 0 R /Parent 36 0 R + /Prev 51 0 R /Title (8. Verdict and recommended path) +>> +endobj +53 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 54 0 R /Parent 52 0 R /Title (8.1 Decision) +>> +endobj +54 0 obj +<< +/Dest [ 28 0 R /Fit ] /Next 55 0 R /Parent 52 0 R /Prev 53 0 R /Title (8.2 Phasing) +>> +endobj +55 0 obj +<< +/Dest [ 28 0 R /Fit ] /Parent 52 0 R /Prev 54 0 R /Title (8.3 What to prototype first \(low cost\)) +>> +endobj +56 0 obj +<< +/Dest [ 28 0 R /Fit ] /Parent 36 0 R /Prev 52 0 R /Title (9. Changelog) +>> +endobj +57 0 obj +<< +/Count 6 /Kids [ 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R ] /Type /Pages +>> +endobj +58 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 961 +>> +stream +Gatm;9i'e'&A@g>bRkCDrcW=8AQ``d@A2)?\6+_pJsrL)\01eL3e9129@Gk(7;^Q,n'.?bYqm\Vh*pVtAI&,2D%-)i>[H=Li2/jX,)CcC(NnfieB)pkkH>#U[T7&bcLSo/\5P^.E^d0i>Y0^fXd4Rq0GkDnVJd"EeG,IlF[NZ]?=n;fCU!Tict51aq2Rh>O?!r]9@Y:I+hS'8aufs\t/bgM(qbG;L+ZVT`dfgp%F(?X-]M*:ia4J^u_SXMOkV#tbK[lXsZW`]1U:U^YG]FDBqQb0V.8,L"@U"V_]29Y1,mA%qQiSneHDX6"(':X$\_;`^GF_*omH^eioA=^8ToP7pm7[X+Go_rs)QPg./ikfiD^&-h#fBgB/TbU7jL8+OTJOM_TgB4tW(q1j#VApbZ>06K"BZR3&Ys$$/.,%,;((,7_\3Yfh:tT/T#GN,ill]hki#Mr=&?LLl/R;XbHN`endstream +endobj +59 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1027 +>> +stream +Gatn&bAQ>u'Sc@-MLV%.0oSZZ]BeO`R\HC1cu'6pN'uEj8>8`)EV&leP3mfV';S;E#d=KuEk_.;X#V@bq".^5^o%MU2]Q(q>(J%P61l,Ie_*0"r,?;3ZE-Tl"F6TF-nZ0ZN\7Z:&9/V@`FThH"^%@R1?#J'1O:GKDMCZ[3jKn=2M;o!S6,9qk5l2'IrA;IgVrh3F>pS,,8$a'VFN4b3%qBE+Gu)fLgl*2GKSIAr`oNG8\'h8=0<_dL_JWWbN'F#3/1Q!1%G=Q5J4('#qg.FAc&L)2i3ANmS6VTJW,gK2RFgUt(X6kL!^HS6oKCqrKUCKPmFjc@h"<]Ue4CO]'>s5Zh]*:[!XsYC["ns79lfq3uq4[Bed)>)R^ULFMA;>T$M79hKNlf4'FSUnP=e3`Q5VFZWa]1?e/c+C9cI3H-_Ir#L:c2HI<7'j&4;MZuCFXmR8NG/c_)Mr*IY#*2sTBJe,b7tGX6@2S=!Af'i$KL]9F`rhXV[GX6nSQC2c"9YR)+>TeB*#A=&;GC:Ds~>endstream +endobj +60 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 4285 +>> +stream +Gau0GD/\/g')nJ0_2iIQbBfN1HoRongY5*LUe19;"UkO@6sJHfU+0&9]YFH#Zm8;MABVMh'\cS!71Nsb1XA2$238;t%/"hK6KllCRX?iO@A:dG12P3)O#Q:oj4UUlUDR],Rd3&HNP)6kRC_e%G@s-$#Pa>A'a&oU_9>BVR&N+0EJ4g,rk*e.:#sJ4FnI+dU,5I"rdC<._)H,P4NY.%p[%&J!EWZYY8+UP&r,dImJ!iU6+ph*4/KWr_UOA]VQSB"i3,dU!Knfa9>i_`:MLdB:E4i>q(Qf+NJV>lY3qK>)n:nC[12VO#50;VmZWTT-`c=HQ_QP1C_f%@lW]j6&YIkVu0JR1%![3OEN]T;\Rl`rNlDo2nQe=bj=Z'+dOj!@XD;U#Td1@Wi0cPS_#Ri6FMU/G=j`hSm)[R9iB4iPnT+*jFk^Ld]7`D1,V%2DjpSI@Mo=7KYNVM[6T-Ql1kQB"f=A$h8_8r5VRQd&L'W^^BX%$n+YmWl,[2[O8g@#*,uUT5^II`WK+8c`*(R]<7Hlj1)_f$ngc(ZYX&(QF%X6I:8BaC71D691Z*';IHdM_ff+:/Ds9!p"MR40P#*"XYii-5?!$SEF;/.^('HUGN,a9n]$/m3@K9#q'T0'&#rCYS'@JE]IdZ$]]Nit7=##e/oAM'to%3[/eM!Kb1_&l@+%1Kj^VB)41&65k[?U?i2f8,*0)HB1B='U`$:_:1AB$V/n%c#,&'MXQ::pg9-Q!M[*6qn61T\-Fj<8%e_VJ,=rfMc_OR>e$R5Zi%,CJ[H=[.<;p^I'\k&Xo2V]4T1eZQ'Ee+Ct48b\^-Z\3]23(`@'k`<>9DC[W8=+u-#QFVl9_2!)L?$tdH2mOGE8aFnR&,8C'[:lI91WA+^2u9`5\gQEU5+I/Zk@5UWrUn?dUPRa\D)bO;Hd;N;iI:t0JZc#^St,1D+.VO#bnZnCS9:TBbRo6gqaYY4lb3C]gRTb,0s>j>Z6+kQqT1/X.i+r4155n-PG_461@aa)ZA5>nZKbB5YRU%Q1Oj&3#_6hZl;RWejP3CP-"kY`aX)X]>^PRq#IeA'0\5W2c(.&a2,!d_%8bD9#'lcJC6hhHS4j^pl`8%2jTGgPp[-0]QN:L;7$1Qn7AG7?]Xm(-pj#'+7*k`XP^*&+;MgLt+VUW_gB5ZkKl$LN55/=L)bX:PcMq6YEiF\QFm96$NNH2'&1kfjSJk+*R1>_pO:2FV4<+0/>A'I8!N-uR\Vs>8%rHYO:M@#65@n%9Ap:.DQdWbo6m%gaFY3jDEqu.P\h9,EXDMM1;o-Lcg?Zm1s)FhLA6=me-c&uIs6<]=Sk;`GnU29E/lUP?kRoV$\DB`4U:`l$h>4UhXc>6`\#(O6e@X]=;@`T5e]'MOCO>W('uj6egqba@L%5aX/7DN1(cBZk4>W^?F2TNJC#)9Y_%hCNqEd[]7V9Jn-+KrgmXOA60!>/5Kh=A+je*X3#CQ_1pgqT%U5/X&F@6dQ=hn1eQMpIQ4GOaIc$t"M!*#UbZplG"QHm^Sj+6#kACOE0uM&kNrakmA]<]):m<=.%`b%FHic0AX7\7P!,dfr=QeP_A`LF>D#?FJ,tdJjjW3?hs3K0#0,j8s<*dB!=?*/k@FTuKd__"g^74Mp;@fguMGJ7N*bG.3d21dA_#R/uDPCN'7@i'?U:&*F#>[\*Y!_)]K&:i*6b(1sco_&/lYeOKGt+WnTB<]Nq9;C:/kfPc)UcJJ7CNg:&[=HV2j4g%GQYq?*cbE'"D%4MgAs."j=H)H["Pcl`1k;gBG+i[C_\2I'i]E;VLJX=g24!+3f++D0;K1N1j<;rA(QsXE92a49`_ea,D+NF&K)n41glf&o>/#A]IJWB&^[-:6]=[#lLVk&=WF1'OW#@IiV*L\^C]$N,OSP1U)@t\8Uj).#Ji;BEQYa2%k8M^lq_YpcW.9oL0=9L,OG!N4A%5Qdl26]Nd$]i[[ag3p95%LH^$M`LX_Ru')!^6m$Q`4m-!VS?fbE;5pVM1H@W4NMrN2%fO_HN8I-U22m^VsSE[it$kaX]&Pq5Mg2#iq7]e)>L-67n[>,h0(H_Wa@$c?NGacRe=P%ZH0mn4j6)30;dLLV$fWPkH!em"3F,%$*(,O@NC3f+0b7OF*R&V]>MKcpKM]7aI>qt]YAg(`>\kEk`*6PaPE)F%5.pA#9_Kc<\_t1hK^s/S@HTt3jPtt^(PB8C0/&39K+re$*<*Z:tRBD0YRXqG%H;DC%O5A^ES^P.D&TTtA\sp;0:^&L%qg*!!ru!]"[#dYY1:2IEKF\47-LLMMq>WNX'lp8j''.X^7jlSqbqFbIpq)032IgTj9;.uaQ5:oOtCP!3`)"d*Ojm*X]aL<"&J]W/#\N]>2E"QAXs/3gBsT:DqEP6g?EGbQb6:5FM2GR/TB"9MhX[\,K>;9Rl=0F+aJ_`jb!qNhKb<`V/afbKq$PobWZ0uS*3VqQc8u+_:!13Jn8B@T;/F*U!D28(-c+GrQ[u=IBr$?@o^YZendstream +endobj +61 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 4261 +>> +stream +GauHN>BAN>&q801kc1be6P:Vc6_L7#K**B-(Lu%S]i7kj)G:0G,:'BJZK$FaH?;Le&e[0:2jJOHRH^=-mcj_^HR'0mNthQMfE6M)61;,_OpnB#8?/?"C'KmPRt'9ca\9)qBZ%Q__I,>;qMMH83ZQ.nkmUfJ$[l.E5na">=[[;O.>lLpIg_gT1`4#4=T+53E]i"MqVkAEO[klFa[i_=")D$\!#;q/\u$!jBZ)"oHO(Hs_*^K]*\N.hLKStM"T]&6bB4jWo*Y2Uq3H"(:W*b-qJDW_feD]DD*?;'+8#)@21gW0fYfLq0F/(rdqI.o*>cb7pnp_0K:sFe:m$]ALKRC9L&mD'eu)`h:'kRrL;*UaQ4\Dr5(%_Lb3Q4Qo/pK0U[5g?K-M/1(bjaY8":CJ\3=_Wip?fWT=,;g2Q4%t0pP=3'LYMiL)R.b:C1_$QGqmoXLqIrFF^%P4lW6<@"kHhBs6h`-lKo4"0Uo#`G,MHa_#$#i;)dS)NMd#!r^EC_p&B:#Aq8b!WU8b'^&SFikN:,#qXk^Te::M!7Z#+m4OP.Z+V1B4]4aYHP'0/M#:L*"JdMi!ZECT1Q3V(K?et/Q\cn7E+]@3Jm(TVga8j]BEL!07M(?\dT8\1FA3_`5oB6*?'UN6)[D]=7,4CeaHEVj=&Qi3Y^)!Lq4D1iIup-DbK1GA,,[d'BCRJiCV`um1S&%\N0f/9n$VOc%dh5"@.A@?BZOC7BYnr;VcF!:Agp:N6.$tH!t$ZqaY*X60h9Af3"1b4eHN-fPuaEC1$?I9M+<1V)M!4M`ZdE/EPp`N-4)`5j!DaF5,i+:'3K;[7`<:Pj@9Hl1H07P/8B$0[Lh3%^>?e1krnT4,-t2/aSuFKUuH\%m9a"/aA0>G1;i&C9$GQ=NeM&Hc/!omH&`RF)Bu(EGC?15Gf_\e@1e(bQ$dnL*c#c-Ti5)u9a3Ws_]A"qZ&&7=LnA6=3QS'B=t5N`Z&h=\b_2s3>s(Vt"p\77)NDl#Qne^IAcU#nA;#b3*GD[=eo*c0DkfPHdV\opnG1Vh'?6u]5_N%EXa[i7N8&?nO!$]C(gSeW8Cr6B_LFcN7uKPc=RZ?//;.\!oLp8>fnL=LLmQ,Am`FqIk8rXj4?%F/^sJuiGI#/]l_Ru:As$MopGia?*m]r'2Yb=IIEFM,^NhNN]a$W6UXQ7)J?[0?l!]$m)ub]J7\UmFqZM<`-b+V`0`IoiUQ-VFZ4Qr1,]>h0S(Jh0jZURJ0XW4fi0r`g563$FGZ[WPKN,";3`Q>Xe!4+3mqZAjiG;>g$539A_n;`Qj9qm0Y]-lhA)O]2:";Ml?91FG*n>fa\rrI!a5'K9:Y.P)cXWZ&1$U1-#U148.&enUh]n>$[+-d.BTZ_TJ('e(L)qh;7i]r8OUbS'4F?.CN+d:E``_:EO>`_Nl;BoIiGQD*\H,$Q-:kpF'IoRhPJ_cuJ]k4(S-AVb$^OUDEDNfTQ&,eq&OApmakHi5`6T'qug$mqd["*dbi5K-cHaE(GWf'hIFo19"p\K>]q_4S%mNslVq5T[B*dOX)r6'1GqD@c5.S:39u]\9F3r5rdGlJ.h]-:kj]S@^PL6Q]P0CXbY+G)X48hjnXXNr8P],_=^0f*],Er9-3r'0O(M!AUZUQQV27f?.7U@Uh0Z6/6D]?5Q6[hrWX.(@/>VE;'[-aYl#mm+<&5QA0!j=gOL6c\bEAd=Vll.BABh0!1pY[B4^l^Y69t53kJ$(-ijn*_fAJM`oeHl\T0'-&H@-X-O4&9ga'p'&HYCP[je+n7Z-VQbBr-!caRk@dcZ:*7a"?;Pe]l2q=?F^Y)m*Ydf*I>i\?fc_*i]/[1r5c/W:JT)iB>'PaO=skhcZciW&,5\[T<%5$ADPoD4\6@,2KCpL'ltHPoUBh5Wd2!*=s5H?Q&+q1P=3H9bFd8'7;e:8;:o\@#?QDW[MSh$,<3Kfn9aK\,ql=L?!dG_Ob-JJ:E,5].%?,mdJ5cSD-:2.[S(cpcQdgAs2(uC[0EC1j,Db@[XUJDk>=4,WVX)I+m:I084;unOGZa.g=0QBc'GpED*]UdXWbeNXbp)VJ//`&7]>&qhpL@BCT!`lS/3ek'-jV;l\lYKj5/2/c/C=\hWja6&e9)E@?G@9s@\+hb(Ltc%]h5=$T3%Jd-&%puG@F)H8;=:>5K-J)L:!n/>hl9J\&?dSH8mrSAg`&_ZC6)HA:F*f4##\G_]`9(6Up5m4<"QR5Dt"5`0L&67UcC^\.[Ogl*7"8tb8E!?8YLLs:ek0m2Tq&Vo?R$dU!ZdmLuUskn5)Y?M"?$qq[Rf#4t6sf%i(%b\PFUMQ[#kn`EK3@m4<_WZoZaK5Bhj(^CoE,@eagPUrBN0)[iF,.d_9#F""7=%og!G9?^o+m%Jq2k3d6,1O,N`h$f.rjYf`iflBd\)%j&D?38tTi:U3jL)sncM3eL,=2?=,:\.[VPhH/<_o-:XPp\C>!2SSX\Nu%62@le:"/M(fO@h^i+ADN+MiD6Vdg/CiCU'#'kh1Wpd3ut#X'@9ahGM2HA#qL39DrhZ0#5!6TN&kh4l9.SetuY\nG$L]gN$`r,Es]X'a1h3>Q&^r\Y4Q.U]PanIMd>97ap,:&An$RrumOFq@57SUMZjJaqE=Y)u,Y#4uJ&JCRPpL-HNbNf5!iTZO(8&BDY$(^Se0PNa=Af-g"XLdBf/HrmFUZ#1`X@C[b!RkX(h[/9iQuV,G!M9]*6O*hn]'n[o:8(uM(ZjW99T:Dgm!m)^C*c;oiRf_Y"l&&6Lr^ao3YVRs,2+R@0!V3^XTmV>6dfasrT;@NOAAc9&DFX`b\LQPi;G%b3!7e;dj$(TTP'ab7d2ATMh%m^QSBU<7LQ:FfcIMG`iKQKN)=Z(pbI7BdA`T%;a/?u8qaiRt/8_kJ/Kl>SL1I@3=4IlLI,[2XU8g:K9L?m#L,6k916gkonKaZ&Me3IZ0!kV3ZUlB4_mV$P?BW:\bBH9R:ZmX(UXDEnLpH.+C+j&d8-OBq/f&d9C#,RL;L1g\8c-S8Ah8?"b[bF4p.X"J9Q-h9*A2ZL=Vc=ki/R'u0cAXS;gdcdr*[Qd1jLNu).e!++h/?KY[]\+?XGS^)-C-?P4-c/31li@k4echQgEM`84B^*c+ZDS`Sh_iQ-JUd]+s,/uMR_@WN3D\2"ar4m>DWh2"4Qnd[cO:;tS:qGKK;)GJIXmb)TfBro*`[9^jF9YT6nQta<2j+F;&]ifC1F)oB0Q,+ntC)u(Fgg/TlQkBH;9oPECiT^eCY&%AlSVHfQBp1,o]ob2-+VEX\(h+n['Pd$rjTW%E^mGYWU&uOa;W&F/I>d#(e\MUlmr'QD@rRFa$gKJQ>T!]_NWO=`&T~>endstream +endobj +62 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 4017 +>> +stream +GauHNgN)%.&q0LUoV40u,_?h0MJK]D[s5Q$-]Y=QmXqR;+;0hsTh'nf<\c]lV=.=c*)]?u''!!F#6+n8oT")pGZnL"B+L%u@;513kg$Wlq`+"&?$3LPmAN>Q'e.fM6Qn[5l,re./:TYtbpJ<.eY2u1]nN#8[o>55X#dP\QhopPDBfh4BR6^71/TAgbh4hA?E+F8lV4E@W/IO>Ph6,k-+/mR)bJj?OTqgL8aK?(L#f\^=#N$iRZ&qa!tL[67facA8!=,lQGWs8*$H8HfHd.>g_`cf(7=J_i3XBl%QpeQ%F:uu=+1J^Xr/F#NG>MI+OcWkJK1Esd\I?cei3tdm;H4AG^0&;$nJDNr[j4h8lZ9:8auMRGfKhnH^=csu1=Q)'p/aJ#rq&A$h6u-m]]J"n/c6BYHWukF:2:HA9cGX2J,Ks(2mr0Oi8Vc8+2IPNEX1^W9j<;2HQV1_&J6*dGId(IM-T!J4l9l0@UKI;iJrX&]faVf>\!MiNj%V)Qgci9gk]H!jlmdJqr)`/Mb)o7rI>F1N,E"V4@n*$HI.B37lG1^7p!n=\ttE[(QRg;rGi6Pl6PeWj2@DmmI*Ne['pu;>X"1oUh!]nL;8kDQeHX8D5QRHs]&Qfj&Q6"1lQAP2oO]?Y.Cg_X(G5.*+"/c?5o"pFLgm&+547i18=4u;Mq:2hYB?sp;m"R+0;4Je7'^Ei%@m?2OW1!SQGj55e!)0di5O?fok_@D,4h@/ejOT3,0=T]9CE^1F[Bd!?3'KkMK'S5"B=DPo"#^nf/ML^CRAtet+35q\;*4bq1E.Rfo*,j$1fJ$)@G)K+)hInG&*q=!=)=6`!HukXqE,Q8R^lT+s%lV]_N:RMYO=@VW&rpS\d*Y=[(OIl'-`KDV&!/*(,590SA,B;2E6rnUOs5"EjToLm_tM9pIA)k':1ibV&?hCI'_6)5_FEIOJd5CV%\=3t8*"J`dD\R*!^?%hTa9>#4K(g`4\^:h=E8N=j($^sch@+".0W-',,MTfl[)SbS3Pk^(K&LnELd.DoG2K9F+NGA9ZkJW=u;LKXLH$kAR.PQMZn\b>]pInk!0mJV3#PFj;`>!359I%(7KtuqFG']788'"[*q>_iRue*T6d`&9)jL89fk&JKP5ZmhiG[SKk`mKBbaKfb;ehJVH';,D:d/JcB&t>FGXnqCde2&TWfp'p#gj=cPj?R9MIidP/9*8pSj*qVR]\#5+kuUDXSlqZKlgf]R2WS]6^s'/PJk80\H=SW%^e,J7Be&'+MPKAJ!-n\1'f:qdprVL6)HBk[+9GD@!4cUbB_HS7!E]>86?;bZ4ZZ"Ar%B/`XShkda#Uk'W/A1i)?/.HTAF(^3!QW-e\+m]$S3s9T[T'[YE-8j*X=nB+FI=0^VJ[#e>_=o%Jo-C;*fm@1_-ZiMFQ3DOh3+G'<^f+>56*H%\!)pa1=bX)d0EuW@Re0(HIsE1"NFj\GQO3CV0c#LcOIVJFh%Qd:(1tqSrEg&#E'XA--9/CrR2h?*\V^Xtq)>$kY/NE/D"J=W&s+_sGLG6h-\o%Jno#ELjU75D;=)k[Sc1>QcE*iN;Qj,uG[HS@O3H0dBIR0"grk=DQea<-%5-hc#u;VNM*%g).,MUr/(Sfgs`g-U5j4Zh>J8kXni2-^W0@eP8T1/-fBcIX5@3Q%F88R:LJ%VAc7t_ap2qR\@PgMbeV+A/a`,092VRV`dF`5+\3#of6uM1n,I)GcDc=Y,NB\[rMW(p"2nn%Z]:k17!-@:WCnMP;.)G]g?(0+r`6`,K3(B*&7#tMi"2:YgUn[M2n)##U+&F>99X>6ugf#>;jTg..+7i3fR@CL-A&/HWX/Da8P.'CO+uT,DHQY.WT6j6H0d;W56tsiaPMZN*<,g*Z::VF6Kn]Erj`dYV*.IHD:-jYbEhi&DnZnfAXOpm'&c7T$;`D8o$`fr9!k/@b6iX]F8HJ3-/==JDNW?eeY+$c%d!nO/L&Z5h-iB%\[91FbXgB%._49&%\.!@obd.j\:jFnP_Du03kTm-"*7.MA0n_h$LNU4e?n):#/XMhGGru,d,c>X!XF$i+C]`G#r9I"k_R(M5+!3h)M-D;2Y+7]8?9mTDm-I58)AofplFtKb0!qYE7R78RG7me`]+A&;.\/fOhmX)BQ5/4L79jF.nJlh$WAhck$$027T[/'T*aC#5QOC0J#-=6nuD6R4\;-&?]N=a[<7#LrGL;-F/o%S[i]D>^NSSA_):p@[X/>uHH3^UZA`Nfp`P_TtiFQN)!lJhJ="np!ao2:-3O&Mbqb'\7r=#($1Hur>qm&<1+CJMqhAfFu1P:9LaBkJfn%kkSR,!CK:qIttC5YT?+]$K\MXa/kBa7Wq7[fVgbf1-'VWAhE&eF+1mW*o@/MRA9<)gm7UeB(_f90PH:T?.k(LLl*UH8#qGmi+&q+ep&5A,h+`@[HCG59)EMcX_f>dZ&P;UDX>(H<471nT>&G]\Li7Pjh*0iU<0$7%4Zi;]::8)+PNd*-(ZIgYE>TW544pDt>WshgE._\@T<+.GK&m?[]rRrotRaT'*"6:oX%=R(iOiq0IM_hg*tA0;Ykl*ooV@'@YTNFB?9gop1]l"RE.G/ET%`';W*OXsIRVXQ5K"D_X+U:bMIVZ)`7tHFH/4s7'S-^#Ma_3ujCCM9tE@LUJ45BGfr[.l"d`FP&uON8AR/1`"p7p#>=dl(DnX\FL9GA$\nf9/NlZIr=FN%s=uY<+:'TFKNEBUs*UIo83`)HuJ8jlRt.(>efCWj7-^WXoJ;7(&-o7l!_d;61:g3r8)CO]N5.++RRXn@)]Equ5W"%fT0*kQ)^-h"WpJh)/&P(QZ<3QK=4"GKTf/G#Z1*/l/40-SISR]$>3bK(b[)9l$=VhK%CX..aXjAUg0AfDBKX,Clpn03f3]'ftX!c0HimXa7ZORrka)o8\/IkgD^/8QUdbX]/PhC2lt*;Ro\KS$Q1\b+pLoCG1tERI;Sie+WalR`J$fPY1&"W=r`9T`/)e`OMe7N@$)Z/GXplR3OK+!X>\`K90epcoj':k"[Cendstream +endobj +63 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2435 +>> +stream +Gau0D>BAQ-&q9SYfLIs,(kPgln6#cI7jW"IRs8r8c`h$i8$$hL]^F/+J.]2dr4aGl/K_e=mu!1.iA)j#@TTtCj57)3F'RVUle)NGY3P>Q>_euqo+,KO_:"&3JYF@V0PZjMh,G\ShVR;2M]C>aI#O11J$amj1:'"jRW6q4FJlb.YS:]9H5F!@*.'-JshE%KlUclJr1S6hJ.QB:fG,n8&Wj'm[ZkdLo[Q//HDLSE#2J_klF_TkA&qg2Htg?n1eXE`jUTGQt@u=hkt"h]VnT*f;LO27GkaLl;en6Kej]J;;"M)B)2@2DBWSP1.%4[9[Z]=+.!_`:;Z#PFJD7cas*g;@5G.-!Jd.mks0hbqT'-P-LVf/ZoL>J%]6?c;qV`i`VSe^ZpjfDH>Yt;O38Z])H531q4(KMpDj4E1=W\RimOj/ZMaV=$9K:$C7V5iig%-!L`FDfN$_Ok2lh-o"n3P"M8ef\oB?)O0+41B3QDY&WmnAJ8&,+>aJ)fla_!W,Bnbb0l^Jle_Y.6ZLFR#L?ee1>#WdrGVM1CdGSY@0eW+6bo_^rE9gF,*OoHQKhrc='Gt:II.4S%TOj0(f6>&Oa+57k^^>L&lk,J.Od4JS7MEh.6_".2kWfR3fc-/i53kAlYdFWR7CC)aja#5O?69OQefgCHPO!L,aMiRS%Q/9"-L"LO6C]&7l,%[MiDO1?kn:uHNIZ$!ee`I/hhO8_"3V2AnJQrIg)X[qCtB_4`$=4YZ9OS!dZN'#eZd)hpu._tH3Na=cUgi<5EGbUnED`?/I.Y`$"4^P@RVqJ8bLFouIR6iR2!6:S???rD+CH1?Pl#"`TY.I@Le:OSPB,QopE/:'*JQ*F)[+*Wbf:4NH#eN/Vc)e^`qMH(ppLGpL2OlNsO*dpn]drXbDN188K9iEs@%\#l;*AJX6Y2&6\-&:'US^Yj:>#K9Z'oN7[n(!d8/jU7N>5aj*d0''*MqTCMO)W`W1:jGomtk![pac>k^T^1&kkP@mh[c>3OO,Nt_NA_>\9Ud+Z!?!df`&A9g=Y,"5S+Qoed=Uk$V3ln$i![S+;JTBi)@=>%&:4\:XoO:h'rJb%F)f1#1j>7B:8GTTjIbFLa.3ja7A$'A%^uclLcq]U^M[?q+d8M=pp>C#A&J)aA9_el^H8*7/b+4ca1WFD3#D(pu/[AO7RpK[.em`07)KD5P/)+=b+W=!+7(/mM1$pP(G3F9AZ$(ZEW`8TIX5cAk'UDMHSEclBg*<,U"q]GQOo/Gsg5Dc:s.Po^d3"Xhn`\KrrQs]P'OCG3c5iT:d#6Bk=O#_\RpDkSUHe8U91h%2?!ddQ$f?'[1Z$JA+D,\;46EpWuP\\b10eH"t(39nu8GC#P=N%ARi8+q2B\[D`n[7-(Jm2b/F-_XB,G4;V/NlTn51`"[nbq2clZH[@Y6."nQfIK,FKmf7op?CfQWq#_m.'?LhI-@JfSF$!_9`[Hc=,sCg2R2Gqj_Ycab7n*Ke"!kn:Q?Ktc97Hs#Utk&=mQ*IPqb`DdhgX_8&p"[iB[5um$gZo,>f$)"CZJMPPhBGu*[+qlh="'#Q6gHc"m^\T3RDt;Mi=l>354Jf1+E\,+Ma!KCuGg>rrZ.Oen+~>endstream +endobj +xref +0 64 +0000000000 65535 f +0000000061 00000 n +0000000146 00000 n +0000000253 00000 n +0000000365 00000 n +0000000512 00000 n +0000000659 00000 n +0000000806 00000 n +0000000953 00000 n +0000001101 00000 n +0000001249 00000 n +0000001397 00000 n +0000001546 00000 n +0000001695 00000 n +0000001842 00000 n +0000001990 00000 n +0000002137 00000 n +0000002285 00000 n +0000002433 00000 n +0000002511 00000 n +0000002659 00000 n +0000002807 00000 n +0000002954 00000 n +0000003103 00000 n +0000003250 00000 n +0000003399 00000 n +0000003515 00000 n +0000003621 00000 n +0000003705 00000 n +0000003911 00000 n +0000004266 00000 n +0000004472 00000 n +0000004678 00000 n +0000004884 00000 n +0000005090 00000 n +0000005177 00000 n +0000005517 00000 n +0000005592 00000 n +0000005694 00000 n +0000005826 00000 n +0000005994 00000 n +0000006110 00000 n +0000006235 00000 n +0000006326 00000 n +0000006489 00000 n +0000006608 00000 n +0000006729 00000 n +0000006846 00000 n +0000007015 00000 n +0000007130 00000 n +0000007249 00000 n +0000007385 00000 n +0000007700 00000 n +0000007865 00000 n +0000007959 00000 n +0000008065 00000 n +0000008187 00000 n +0000008281 00000 n +0000008377 00000 n +0000009429 00000 n +0000010548 00000 n +0000014925 00000 n +0000019278 00000 n +0000023387 00000 n +trailer +<< +/ID +[] +% ReportLab generated PDF document -- digest (opensource) + +/Info 35 0 R +/Root 34 0 R +/Size 64 +>> +startxref +25914 +%%EOF diff --git a/docs/ALPHA.pdf b/docs/ALPHA.pdf index 3cd34d1..927bc71 100644 --- a/docs/ALPHA.pdf +++ b/docs/ALPHA.pdf @@ -183,7 +183,7 @@ endobj endobj 30 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103622+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103622+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 alpha release & QA) /Trapped /False >> endobj @@ -377,7 +377,7 @@ xref trailer << /ID -[<9e958e14022981bf5a40e5727c09a87f><9e958e14022981bf5a40e5727c09a87f>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 30 0 R diff --git a/docs/ALPHA_SOAK.pdf b/docs/ALPHA_SOAK.pdf index 7066de3..1648812 100644 --- a/docs/ALPHA_SOAK.pdf +++ b/docs/ALPHA_SOAK.pdf @@ -122,7 +122,7 @@ endobj endobj 20 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103622+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103622+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Alpha soak checklist \(LAN demo\)) /Trapped /False >> endobj @@ -240,7 +240,7 @@ xref trailer << /ID -[] +[<62ff1d8c69f4e2aa7b4e34c69a669dbd><62ff1d8c69f4e2aa7b4e34c69a669dbd>] % ReportLab generated PDF document -- digest (opensource) /Info 20 0 R diff --git a/docs/AV_QUALITY_QA_SESSION.pdf b/docs/AV_QUALITY_QA_SESSION.pdf index b751e79..948dba4 100644 --- a/docs/AV_QUALITY_QA_SESSION.pdf +++ b/docs/AV_QUALITY_QA_SESSION.pdf @@ -244,7 +244,7 @@ endobj endobj 40 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103622+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103622+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (AV quality enhancement \204 Q&A session notes) /Trapped /False >> endobj @@ -512,7 +512,7 @@ xref trailer << /ID -[] +[<8790530eb11d5413e4389657b86cbd98><8790530eb11d5413e4389657b86cbd98>] % ReportLab generated PDF document -- digest (opensource) /Info 40 0 R diff --git a/docs/BUILD_DEPLOY.pdf b/docs/BUILD_DEPLOY.pdf index a49656a..def588f 100644 --- a/docs/BUILD_DEPLOY.pdf +++ b/docs/BUILD_DEPLOY.pdf @@ -137,7 +137,7 @@ endobj endobj 22 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103622+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103622+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast build ecosystem) /Trapped /False >> endobj @@ -278,7 +278,7 @@ xref trailer << /ID -[] +[] % ReportLab generated PDF document -- digest (opensource) /Info 22 0 R diff --git a/docs/COMMERCIAL.pdf b/docs/COMMERCIAL.pdf index ca1c290..333abc9 100644 --- a/docs/COMMERCIAL.pdf +++ b/docs/COMMERCIAL.pdf @@ -97,7 +97,7 @@ endobj endobj 15 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103622+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103622+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115604+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115604+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Commercial features \(developer-gated\)) /Trapped /False >> endobj @@ -192,7 +192,7 @@ xref trailer << /ID -[] +[] % ReportLab generated PDF document -- digest (opensource) /Info 15 0 R diff --git a/docs/CRASH_REPORTER.pdf b/docs/CRASH_REPORTER.pdf index f5bfd92..e41266c 100644 --- a/docs/CRASH_REPORTER.pdf +++ b/docs/CRASH_REPORTER.pdf @@ -102,7 +102,7 @@ endobj endobj 16 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103622+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103622+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115604+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115604+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Anonymous crash reporter) /Trapped /False >> endobj @@ -198,7 +198,7 @@ xref trailer << /ID -[<22d958c84565d9778bc748babddf22d8><22d958c84565d9778bc748babddf22d8>] +[<8fa35525e151cb86fcb8749d7347816b><8fa35525e151cb86fcb8749d7347816b>] % ReportLab generated PDF document -- digest (opensource) /Info 16 0 R diff --git a/docs/DRs/20100611_3_url_shortener.pdf b/docs/DRs/20100611_3_url_shortener.pdf index ae3a3be..067dc3b 100644 --- a/docs/DRs/20100611_3_url_shortener.pdf +++ b/docs/DRs/20100611_3_url_shortener.pdf @@ -279,7 +279,7 @@ endobj endobj 46 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103622+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103622+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115604+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115604+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (URL shortener service \204 design review \(DR\)) /Trapped /False >> endobj @@ -553,7 +553,7 @@ xref trailer << /ID -[<0c13123401870dc3636a59ca6043fbfa><0c13123401870dc3636a59ca6043fbfa>] +[<875c6f1c7edbf45055101437d8ba9dff><875c6f1c7edbf45055101437d8ba9dff>] % ReportLab generated PDF document -- digest (opensource) /Info 46 0 R diff --git a/docs/DRs/20100612_1_scaling.pdf b/docs/DRs/20100612_1_scaling.pdf index ee8165d..811f865 100644 --- a/docs/DRs/20100612_1_scaling.pdf +++ b/docs/DRs/20100612_1_scaling.pdf @@ -498,7 +498,7 @@ endobj endobj 79 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103623+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103623+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115604+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115604+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Platform scaling and multi-environment architecture \204 design review \(DR\)) /Trapped /False >> endobj @@ -933,7 +933,7 @@ xref trailer << /ID -[<633c08311ac4fc3baffc5b7f2ceda12e><633c08311ac4fc3baffc5b7f2ceda12e>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 79 0 R diff --git a/docs/DRs/20260616_rssh_routed_egress.pdf b/docs/DRs/20260616_rssh_routed_egress.pdf index b15c8de..2dbc611 100644 --- a/docs/DRs/20260616_rssh_routed_egress.pdf +++ b/docs/DRs/20260616_rssh_routed_egress.pdf @@ -324,7 +324,7 @@ endobj endobj 51 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103623+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103623+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115604+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115604+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (RSSH routed egress \(dev-only\) \204 design review \(DR\)) /Trapped /False >> endobj @@ -663,7 +663,7 @@ xref trailer << /ID -[<007c0311bfb71c5beb7d2970ce25523e><007c0311bfb71c5beb7d2970ce25523e>] +[<8bb82ad74cbc70e21b326c36bdc6d400><8bb82ad74cbc70e21b326c36bdc6d400>] % ReportLab generated PDF document -- digest (opensource) /Info 51 0 R diff --git a/docs/DRs/20260617_codec2_ulbw_voice.pdf b/docs/DRs/20260617_codec2_ulbw_voice.pdf index aa71228..25e234c 100644 --- a/docs/DRs/20260617_codec2_ulbw_voice.pdf +++ b/docs/DRs/20260617_codec2_ulbw_voice.pdf @@ -319,7 +319,7 @@ endobj endobj 51 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103623+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103623+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115605+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115605+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Codec2 / ultra-low-bandwidth voice \204 design review \(DR\)) /Trapped /False >> endobj @@ -657,7 +657,7 @@ xref trailer << /ID -[] +[<46cf1dfdb90851c909d86a9cdac2e0a3><46cf1dfdb90851c909d86a9cdac2e0a3>] % ReportLab generated PDF document -- digest (opensource) /Info 51 0 R diff --git a/docs/DRs/20260618_repos_reorganizing.pdf b/docs/DRs/20260618_repos_reorganizing.pdf index ebcddd5..14964fe 100644 --- a/docs/DRs/20260618_repos_reorganizing.pdf +++ b/docs/DRs/20260618_repos_reorganizing.pdf @@ -520,7 +520,7 @@ endobj endobj 85 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103624+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103624+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115605+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115605+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Repository and microservice reorganization \204 design review \(DR\)) /Trapped /False >> endobj @@ -1072,7 +1072,7 @@ xref trailer << /ID -[<3073a799183ee9db61421d66d854b31f><3073a799183ee9db61421d66d854b31f>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 85 0 R diff --git a/docs/DRs/20260620_live_cast_control_plane.pdf b/docs/DRs/20260620_live_cast_control_plane.pdf index 63efb4a..fb062bc 100644 --- a/docs/DRs/20260620_live_cast_control_plane.pdf +++ b/docs/DRs/20260620_live_cast_control_plane.pdf @@ -82,7 +82,7 @@ endobj endobj 14 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103624+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103624+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Live Cast Control Plane \(P0-P2 kickoff\)) /Trapped /False >> endobj @@ -166,7 +166,7 @@ xref trailer << /ID -[] +[] % ReportLab generated PDF document -- digest (opensource) /Info 14 0 R diff --git a/docs/GIT_FLOW.pdf b/docs/GIT_FLOW.pdf index 223064f..ff31432 100644 --- a/docs/GIT_FLOW.pdf +++ b/docs/GIT_FLOW.pdf @@ -314,7 +314,7 @@ endobj endobj 48 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103624+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103624+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 Git flow \(green `master`\)) /Trapped /False >> endobj @@ -615,7 +615,7 @@ xref trailer << /ID -[<8f8a0b879c915b3676e3731de73457d3><8f8a0b879c915b3676e3731de73457d3>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 48 0 R diff --git a/docs/GRAFANA_vs_others_graphvis_pivot.pdf b/docs/GRAFANA_vs_others_graphvis_pivot.pdf index 7bdf8ff..d2e6a54 100644 --- a/docs/GRAFANA_vs_others_graphvis_pivot.pdf +++ b/docs/GRAFANA_vs_others_graphvis_pivot.pdf @@ -153,7 +153,7 @@ endobj endobj 25 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 Graph Visualization Pivot) /Trapped /False >> endobj @@ -315,7 +315,7 @@ xref trailer << /ID -[<1220a3b30f173e67e1de9b17fb8764b7><1220a3b30f173e67e1de9b17fb8764b7>] +[<1a9859941ac21a0ffe6521926edbbd6f><1a9859941ac21a0ffe6521926edbbd6f>] % ReportLab generated PDF document -- digest (opensource) /Info 25 0 R diff --git a/docs/INFRA.pdf b/docs/INFRA.pdf index de3150c..cdd5aab 100644 --- a/docs/INFRA.pdf +++ b/docs/INFRA.pdf @@ -183,7 +183,7 @@ endobj endobj 30 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 production infrastructure) /Trapped /False >> endobj @@ -376,7 +376,7 @@ xref trailer << /ID -[<3987d7e5e7c49c9d6c3d21b5ad2336d3><3987d7e5e7c49c9d6c3d21b5ad2336d3>] +[<6a21447e613b14d0d348f555435c2451><6a21447e613b14d0d348f555435c2451>] % ReportLab generated PDF document -- digest (opensource) /Info 30 0 R diff --git a/docs/OPEN_API.pdf b/docs/OPEN_API.pdf index c66cad4..1cb14ae 100644 --- a/docs/OPEN_API.pdf +++ b/docs/OPEN_API.pdf @@ -142,7 +142,7 @@ endobj endobj 23 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Crash console \204 open ingest API \(design\)) /Trapped /False >> endobj @@ -289,7 +289,7 @@ xref trailer << /ID -[<107f393aba3f78a44c74cf3a4f0feb42><107f393aba3f78a44c74cf3a4f0feb42>] +[<17f9a5b944b42ce125306ff3734bcaaa><17f9a5b944b42ce125306ff3734bcaaa>] % ReportLab generated PDF document -- digest (opensource) /Info 23 0 R diff --git a/docs/OPEN_TASKS_GRAPH.pdf b/docs/OPEN_TASKS_GRAPH.pdf index 08f672c..2517ab4 100644 --- a/docs/OPEN_TASKS_GRAPH.pdf +++ b/docs/OPEN_TASKS_GRAPH.pdf @@ -152,7 +152,7 @@ endobj endobj 24 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Open tasks \204 dependency graph) /Trapped /False >> endobj @@ -294,7 +294,7 @@ xref trailer << /ID -[<08187b5269d829047bd7f5065873f151><08187b5269d829047bd7f5065873f151>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 24 0 R diff --git a/docs/OPUS_SPEEX_VALIDATION.pdf b/docs/OPUS_SPEEX_VALIDATION.pdf index 71c3444..6668959 100644 --- a/docs/OPUS_SPEEX_VALIDATION.pdf +++ b/docs/OPUS_SPEEX_VALIDATION.pdf @@ -163,7 +163,7 @@ endobj endobj 27 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Opus / Speex / stream protection \204 validation checklist \(task 3\)) /Trapped /False >> endobj @@ -333,7 +333,7 @@ xref trailer << /ID -[<4b48bb56a60d820ab881edafab813382><4b48bb56a60d820ab881edafab813382>] +[<1cd619210883038fac0702297f0173e6><1cd619210883038fac0702297f0173e6>] % ReportLab generated PDF document -- digest (opensource) /Info 27 0 R diff --git a/docs/OTA.pdf b/docs/OTA.pdf index 6191d7d..68088de 100644 --- a/docs/OTA.pdf +++ b/docs/OTA.pdf @@ -142,7 +142,7 @@ endobj endobj 23 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Over-the-air \(OTA\) updates \204 deployment schema **v0**) /Trapped /False >> endobj @@ -290,7 +290,7 @@ xref trailer << /ID -[<7ee18bc160ebf9dc1046423de38ba744><7ee18bc160ebf9dc1046423de38ba744>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 23 0 R diff --git a/docs/PRO_AAR.pdf b/docs/PRO_AAR.pdf index c54c248..08364df 100644 --- a/docs/PRO_AAR.pdf +++ b/docs/PRO_AAR.pdf @@ -127,7 +127,7 @@ endobj endobj 20 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Pro / OSS split \(cast-core + cast-pro AAR\)) /Trapped /False >> endobj @@ -259,7 +259,7 @@ xref trailer << /ID -[] +[] % ReportLab generated PDF document -- digest (opensource) /Info 20 0 R diff --git a/docs/README.md b/docs/README.md index 8ee27fb..d09b663 100644 --- a/docs/README.md +++ b/docs/README.md @@ -49,6 +49,7 @@ Click a link to open a guide. Section links jump within the document (GitHub, Cu | [20260608_BE_SERVICES_and_infra.md](20260608_BE_SERVICES_and_infra.md) | BE service map, validation status, SFU preview (gray). | | [20260608_STREAM_DUMP_DEBUG.md](20260608_STREAM_DUMP_DEBUG.md) | FR 0.1 stream dump spec. | | [20260610_SERVICES.md](20260610_SERVICES.md) | Exposed services catalog — web UI, APIs, curl, validation (2026-06-10). | +| [20260620_postgres_timescale_db_platform.md](20260620_postgres_timescale_db_platform.md) | PostgreSQL vs MariaDB, TimescaleDB fit, `ac-platform-db` adapters — advisory. | | [ALPHA.md](ALPHA.md) | Alpha feature freeze, QA sign-off, defaults. | | [ALPHA_SOAK.md](ALPHA_SOAK.md) | Short LAN soak checklist for demo validation. | | [AV_QUALITY_QA_SESSION.md](AV_QUALITY_QA_SESSION.md) | AV enhancement Q&A: sender vs receiver pipelines. | diff --git a/docs/README.pdf b/docs/README.pdf index 0fe3ae3..3aaa903 100644 --- a/docs/README.pdf +++ b/docs/README.pdf @@ -153,7 +153,7 @@ endobj endobj 25 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 documentation index) /Trapped /False >> endobj @@ -253,10 +253,10 @@ GarnQ4`>s,'\rL!2j,Y2Gf7VIg8H)\3`Pd>,m?5I#W;ibrdKEq;-TkXak$(>48Fnu%%uk//)XH> stream -Gb"/)>BAN>&q801kbhA)0$'L/4`<*A*Hk/mJY#Ug78iV!"K!]BPeVTk6aQ;FUP]U7i55,7R"]Fh@R1WVK^#*_rImnTa3S(TW[!"fJ5#3Y+@4MVUduV!L+6q!#b"'hR3:At!PTm0>X_#QKWOff^SEml_n+$tVEthRu@Co:43JbrJ_?36R`TC)bHeFIofg[c&cQk;c1U)p\)'"KC$#K#BVj6)(iF+ApHTO=4ri8EB@S,Z:*;&op0f6u3N&j*Uj72Xs_lLJMUt4fQHlCDFJHct0bRJsN6:qBjT^+N\)ao6-P.S7O-FZ3:Jc1UssOB%<):PtG"P7C@4N&`3LbSch9C,f4"%@YoW!G$*.2LU#2L/$3Pc+k[gEcQNpEu1L<#3j\!O&8jkTGFR%sZ@7jsT7:9&n,&@nVBZnB$H];U\OG?<`:b3_6(ZL#m8n@>.dbsbiA)U-+_fnjpO9mBN]0N\kJNQi1)SukC,tM*5/F#Lq*3^jZ5jjiDP:Wcj6$9lK40ENW=Q?U`Si*cmMV;AjO.9B;Bd*/lJs\tGcXj>$efEC&^,O5I!Q9hYUhKA\joKnM2BI37pFINOoo/:,db=E:FDR?Iqta_TZELC2LYI,u2j\bF"q3?B(boY,ZZNU0Gg5#9]2[M0/g;&3X_1C=6![>!M($44)&N#TVCORZKf'(d8K9s"!7#oK,1E@;+IRnk1]ebZ+"fC6s_];&21TpKSm]9jNo6p3LUi_)tqnF+t?pfAqam^KCg09o-JOcjf10%aG?Ro;mqAX5IsR_RI\Xgs,,15ljU1VZ0p3o@bZ1AADA3Lf2OZt^ujPjPBQh^sNFYL]a^54R-]?K%!N:*g9mffdRW2'nU.OW8lrnTHoU!_]cO*]qHQ[us?4.=O622MW`_5m*FC3JMaomCYT)[:;FepT\aWAYf=AjGur2%()!e'LABes7GWZ]?rh;[0jI'&*'k2i(4LDILu'!&oYr3Zag!]ANi1IpV/D"p''t,[6+hYu>>3.I#WLQ96L/L;atj@#-hUkWfc+c@Q(/EAVXVdKln[k>n'B)Io;]]W!peI:D5I++:;)Ad^V7L66]>mkM"/]]]RfCHfQh57CYI:#ri!-T4FS_pQB?Sr>5dhtC,>*7s>[0%=PZCn8S4P;Qi'R'[s<8%WpE>Q0<;;r=>#*bn^.C,AC[=QXB:equ75m0!I]_095'1kCY=_$2R^ju@'pFq3r<;d>7F':Q=^Cp0PL2SCiF)3'E[C"B?"c+1GgNOj"`&H(pU`;RfM,%V+iQf>S&Dp^U]\(C3sSJS'$"9ikC#Pbi##>uTtuP:QP%oq66tbfR4=KPN\Mo'!p_V=b/)0Q*)5ee^6)C$[W>k;kr8P7k6F;NR]I&[rZ9sG&/9@Ac;RgA@gkQn@?Qbk6\8G:=Zgrui/n\3pj)3L$&8\@.O>];$PK-Z&e9+2I\;!PikpADX!JAg$^)j%82r.kC.W\7/4d'I,2oaK8TKZ@_h(9LDWScf,aQ*ZLH?,5^cWb0@6r=7hVc;'UmA[0LBU6uH%QV8P$IP^*u6-$j:+:(8>P;U4tK66aW#W;,8he?(jfV'-!+c,:T,R0W-^`W,r[6!01[B:8-^rF47G1662JKk6)b%"c(LLL%0NoI`"7aYYOa74kcC>uaoEhp^*P5($q#A1AGq.WL=&#I$B`@Y*AQ1$/8\t__]X'`jJ1BcGXIal+P`#bbVQK0#^BF*P`Udf%MT14C1O8]i5IhP.JQW9Tjod\a##p-,Js`UVB:_DG[WRk5iN_u?>fIQX$GL0P;NK$`>d>-5\mS_<"=hFVYQdqgt50pgUns7C,G6EI6f;!Zu]jM8[heMkS1FMknDbr3l*fBdZN^_UA0os2d=TI(6j+kZC+?p\0r0TEWdq_l"cl80mS\TBhG?m;`Xf*j:l$XEC40\8kq/*G(RM@HR+H0@r"2@D#Nfs&9fZB_j&qCkM],(F1Xf6<;1Spfm.#@Fh@Q95^:6XmU'M(&a4O=Z#?+of=6dInU+nn<6rKIj6UQ/6.^6<$q*tH9^q;o+GM,H:Eo#%s9o0)X_E[=/I;UoV$`"FoYJBrR*K,5a3JS,RhBs9[Lbnn9WFa7O5LS_s-B6N9k$fI/i)EMS*IWlMHCImOhca;-ikR'tckeWgRh)1C$]n0'R4!O^'s7.D=>Ub,8[1RWG5D[Ai>'W;i'808q7:7/WO1_6STZMk#.NEs,_1!^J'B'_o+"4'YRQtsggf+k"6M*t'$O(sUQK5i:rr@GT2&$~>endstream +Gb!;&CNJ3#np>gSJ%BZD!Gb.kJp\4S4'Wn9^r^GYX&QAA5T:lOH=/hLrd#h$&dH%T>BO#MfGT#!k=e+;Rt-#R,l2@q!I>-`]d#cj/65$3Q3<*XBT!CNI3=<9;S+6!g4BHbU9k'./)g46N*dh:/j`sN"\STWDsqAH?:@Zk]J\KC[LGm]%(FFer/\)W',J?&.M);qU*Opo5A>`q#Ur(lTgQf-#VE;3$VCY-8t0uMJp9L>pbbn\Oi;3r&h684Lu:!irJ!<-cZ,!s>h[Ya&5$p@p\6=3.E3o2FYH`lN*5Ao^eDB-6Hlf(;gZl)jY1&m@2AHGN>5m9XMZUOb8MnJHs)4BbiH(L$8@[&%^09+]6,g:j^QH^`A:kS=Y.!(+a#>,KOP=4lPNGI[\$gFI-kD/M04bI9@tlS>t+a[JeGV(qT]t:kf[Z+(Q[E1l\R'7`!M/N7rU7DGi#K]Q\r-r$Z[i[o5MPq8Q#S[OXs=WVL?p*F%r:Q5O1DWh7:7.qmmkjeClNJ#[Eqs`+^jWeo6pg\uco*0MI]+5!7YK^V<34DHE.K5b/CW5!m+clRFF+K.,@$JC:6;C(m#?m,llI7_2;=$oZ@qmCneu^H-(g;hLA$]boVSEn9_Al="Q*JS,+OleE[SW!^H!D%,'OIaHjeHhR(d:,!)Z"q/3YcVJY$G[12+@MX\GE8[Y[^XlsWb:]:Du$]fY#8Ktq-p5#@t!i+T'?E[pNU%;mMZf.Aq5V*)*MSJ@2Ws,i:!&$.p#6@-Pm@-K9d1K18-$AgI)T]nUd,)(#9U/*mNu&B`s1XXoV>+!\`mX*et3mgX*<>kh-iC5=I+^"h@3XPa)E4q3">a;GSTps4n:4SirJS@f$r\/r;%qEM`N'XWJM^&mf*iuH9!=-Xf*?9]?2NOpsQd=i$_cRg=F=g'eF;*om=RIcu`@.$rW2^*+aBb+\:CZBIK3L(CqE1hK)#MDnn=YAOXdu?$=uB^0<^pa-\abb^%n^gUQqu3bj^bDe@D6`p!(Q6Tn6P&ZQlBZ:YVGG58;L/\h:,0?'s;ka;nqQ-O6UDgpd9Nr+gq,n3;H`QcGDR8mYIq$J2nRd0cA:Si?9Cco<7qMq?]<;Zc"hZa5:ARZh?L.>!$>#%a-eGNUZKu*"C8Y:IgU5b)'>n#,]C):kV#Y2%3W'T$L(GC'1%pbN(nNk-ha!"+0pXrfh!Hd9I5]HLc8%W3+P!75rG\IfN@*Q+M06aDrp'/=]QP76.uCS4ZAk$no>#?m*bQJd)OtYjqUiTAC,]+'KMI:qs'TUb;Ie*UY=iGKe_k&]^-mhmXn1%=%gQHtbY/W-#JXOOCFFSPNH<\B]h5X+krAS=PY@#%SfF#O=e*?G@@hlQBSJ6:qs+Bom_[BDW'Luf=L*Ig;bo'!"i#%+0Y-KaP]!s6]dedTo`UOX:!H5N2)1LE7B^&$pO/_'T_\W2GnqRN,`22JaupcS9>T^.t`nGu/[0P2AliC,@oW1;sCVN5eH51R%?khe)S(oW@uWC@n;]?n<`mhgC?Vu8TB*Xf!=LQ3fIqARmZWE,Ulh9&k8LA=`!e\[8=)ihgPY`1S#$t(_FYXEZ9'cpO@S`>LE!q0UnN+-WHHEG;OX]%6\REd.jWg8RXeZkS\NLH`&.K1nes$q\BP/AKr[K>A?@oJU2HBsP)iAsak\T1.qe&IT*VQ5+rM!+VR4=um]<@@Fpo%8A(GY?[&YdQV4%r$#!fWLagA-JuXl`--f=\e`!rQu2ScjCTs'gE\TcJ\.pH*U#,1T&hn*K8N_.8d*T+/2W,.OBOmn1Y*+StY.f2QS_ea5W2Zl=?KAqCJ_8iV%*?43RWG)[%2cB#(^3#U95suf">Jh.qE'S>$%!cj1M:>*fPl#?_&iBVJqf]8o-X-ghNI3'*I:6n/,2k-lFee$lDbg1!1Gqca0!D1KL@OD>FtTc1+3:=/U-:[0"=.Nb_3[Yg2ku?"8Jaug(!9)]E^gZ38It3I)VQPjL`%Lph3;c_VG2o8Q1=pJZl@m[Y(U>*4R*Gi2`$k'&\CY.;2B8(TC4[/Xfe#nQg#)gES^l*>16YXAe^Yj#@9gH4V904GIc@mc43KPlp;L`#Q.b4\l;M,fp8e$qcCDXeH6X'Lk%dDkb9,E[dNb]@LQUMV0H/BZ060cJqQVAL5T4?=MOOd^ENETQ14Y(EkV/!'+o^.^a)+dRL5L)20D6.U@\?i0*_ElOF#1-j9O1PIQ[S`]iMVXBb@0fbAkpTAV8LtLm!.."%L[K6UeIALn7Kemai5d/^dKoPR@?>jnYO-hmtr;;rG,;ci7PF?Cpj>RaM!Sos:L[opU?<3ppAJZdnC4?h1PRa^tEejBn8<>Jdu^@BaHrDhi*Z4kFQrHFAa(lLOmfp$05f6^?Q>PJ#G$^MdpnpIG3uG)`"rca>]8gZ2_5:B<@r2C"XM(7,GW12mn)rZIK:f_XH1"Jj^gM?"Gt(uun'-$)9q.L3;0$$\f?_'bA`$L*[a.g3Gq:cqendstream endobj 44 0 obj << @@ -311,11 +311,11 @@ xref 0000007001 00000 n 0000007229 00000 n 0000007642 00000 n -0000011244 00000 n +0000011421 00000 n trailer << /ID -[<92c26b5f54e3746e1385e7de7d418327><92c26b5f54e3746e1385e7de7d418327>] +[<21bd418253115595219f2239810885ec><21bd418253115595219f2239810885ec>] % ReportLab generated PDF document -- digest (opensource) /Info 25 0 R @@ -323,5 +323,5 @@ trailer /Size 45 >> startxref -12832 +13009 %%EOF diff --git a/docs/REMOTE_ACCESS_IMPL.pdf b/docs/REMOTE_ACCESS_IMPL.pdf index 8e69558..ee662a0 100644 --- a/docs/REMOTE_ACCESS_IMPL.pdf +++ b/docs/REMOTE_ACCESS_IMPL.pdf @@ -183,7 +183,7 @@ endobj endobj 30 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Remote access \204 implementation notes \(v1 WireGuard\)) /Trapped /False >> endobj @@ -383,7 +383,7 @@ xref trailer << /ID -[<2e5e258f86156f4a4896ff7a73d11ff3><2e5e258f86156f4a4896ff7a73d11ff3>] +[<73cdfebcff903d1566b9858951833b52><73cdfebcff903d1566b9858951833b52>] % ReportLab generated PDF document -- digest (opensource) /Info 30 0 R diff --git a/docs/REMOTE_ACCESS_VALIDATION.pdf b/docs/REMOTE_ACCESS_VALIDATION.pdf index 5c1beeb..a321e98 100644 --- a/docs/REMOTE_ACCESS_VALIDATION.pdf +++ b/docs/REMOTE_ACCESS_VALIDATION.pdf @@ -137,7 +137,7 @@ endobj endobj 22 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Remote access \204 validation \(Linux CLI + mobile parity\)) /Trapped /False >> endobj @@ -277,7 +277,7 @@ xref trailer << /ID -[<273a5779660ef1c3a1fa0fe8ac555dc5><273a5779660ef1c3a1fa0fe8ac555dc5>] +[<1627e3f70ce4b1d1228423dc24c605e0><1627e3f70ce4b1d1228423dc24c605e0>] % ReportLab generated PDF document -- digest (opensource) /Info 22 0 R diff --git a/docs/ROADMAP.pdf b/docs/ROADMAP.pdf index fcb1c0f..9bc44e4 100644 --- a/docs/ROADMAP.pdf +++ b/docs/ROADMAP.pdf @@ -198,7 +198,7 @@ endobj endobj 32 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Android Cast \204 implementation roadmap) /Trapped /False >> endobj @@ -407,7 +407,7 @@ xref trailer << /ID -[<64cfdfbd492de96b1f420ef3af29dc90><64cfdfbd492de96b1f420ef3af29dc90>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 32 0 R diff --git a/docs/TICKETS_ROADMAP.pdf b/docs/TICKETS_ROADMAP.pdf index 1f31fcf..b94290b 100644 --- a/docs/TICKETS_ROADMAP.pdf +++ b/docs/TICKETS_ROADMAP.pdf @@ -132,7 +132,7 @@ endobj endobj 21 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Tickets, Gitea, and alpha smoke delegation) /Trapped /False >> endobj @@ -266,7 +266,7 @@ xref trailer << /ID -[] +[<2691acc5e8ef1ad05f5101edc8066bb6><2691acc5e8ef1ad05f5101edc8066bb6>] % ReportLab generated PDF document -- digest (opensource) /Info 21 0 R diff --git a/docs/USB_HDMI_CAST.pdf b/docs/USB_HDMI_CAST.pdf index 66d57d2..668b183 100644 --- a/docs/USB_HDMI_CAST.pdf +++ b/docs/USB_HDMI_CAST.pdf @@ -112,7 +112,7 @@ endobj endobj 18 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115607+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115607+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (USB-C / HDMI and USB-tether cast \(roadmap D & E\)) /Trapped /False >> endobj @@ -216,7 +216,7 @@ xref trailer << /ID -[<9cd4cb0630e7ead9ac0a5ad348fb7971><9cd4cb0630e7ead9ac0a5ad348fb7971>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 18 0 R diff --git a/docs/VPN_DEMO_GAPS_20260613.pdf b/docs/VPN_DEMO_GAPS_20260613.pdf index 6c6e35a..d6e842d 100644 --- a/docs/VPN_DEMO_GAPS_20260613.pdf +++ b/docs/VPN_DEMO_GAPS_20260613.pdf @@ -102,7 +102,7 @@ endobj endobj 16 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115607+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115607+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (VPN / Remote Access demo \204 gap report \(2026-06-13\)) /Trapped /False >> endobj @@ -204,7 +204,7 @@ xref trailer << /ID -[<6ac300ed6bdcf096c05d1a9c2cf22e1c><6ac300ed6bdcf096c05d1a9c2cf22e1c>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 16 0 R diff --git a/docs/_pdf_build/build_all_docs_pdf.py b/docs/_pdf_build/build_all_docs_pdf.py index e2bd5f7..7044389 100644 --- a/docs/_pdf_build/build_all_docs_pdf.py +++ b/docs/_pdf_build/build_all_docs_pdf.py @@ -32,6 +32,7 @@ SUBTITLE_BY_REL = { "DRs/20100612_1_scaling.md": "Platform scaling — DR (architecture, bandwidth, GEO policy, task graph)", "DRs/20260618_repos_reorganizing.md": "Repository & microservice split — frozen DR R1.1", "specs/20260618_repos_reorganizing.md": "Repository & microservice split — SPEC R1 (normative)", + "20260620_postgres_timescale_db_platform.md": "PostgreSQL, TimescaleDB, platform DB adapters — advisory", } diff --git a/docs/specs/20100611_3_url_shortener.pdf b/docs/specs/20100611_3_url_shortener.pdf index 698a923..a05b8d1 100644 --- a/docs/specs/20100611_3_url_shortener.pdf +++ b/docs/specs/20100611_3_url_shortener.pdf @@ -305,7 +305,7 @@ endobj endobj 51 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115607+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115607+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (URL shortener service \204 specification) /Trapped /False >> endobj @@ -647,7 +647,7 @@ xref trailer << /ID -[] +[] % ReportLab generated PDF document -- digest (opensource) /Info 51 0 R diff --git a/docs/specs/20100612_1_scaling.pdf b/docs/specs/20100612_1_scaling.pdf index d5291dd..9b10fe3 100644 --- a/docs/specs/20100612_1_scaling.pdf +++ b/docs/specs/20100612_1_scaling.pdf @@ -425,7 +425,7 @@ endobj endobj 67 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103625+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103625+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115607+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115607+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Platform scaling and multi-environment architecture \204 specification) /Trapped /False >> endobj @@ -862,7 +862,7 @@ xref trailer << /ID -[] +[] % ReportLab generated PDF document -- digest (opensource) /Info 67 0 R diff --git a/docs/specs/20260618_repos_reorganizing.md b/docs/specs/20260618_repos_reorganizing.md index 4efa86a..5959e68 100644 --- a/docs/specs/20260618_repos_reorganizing.md +++ b/docs/specs/20260618_repos_reorganizing.md @@ -9,7 +9,7 @@ | Last modification date | 2026-06-22 | | Co-authored | Cursor Agent (project assistant) | | Severity | high | -| State | scheduled | +| State | accepted | | Document type | spec | | Supersedes | — | | Design review | [docs/DRs/20260618_repos_reorganizing.md](../DRs/20260618_repos_reorganizing.md) (frozen R1.1) | @@ -21,7 +21,7 @@ **Source draft:** [docs/drafts/20260618_repos_reorganizing.txt](../drafts/20260618_repos_reorganizing.txt) **Design review:** [docs/DRs/20260618_repos_reorganizing.md](../DRs/20260618_repos_reorganizing.md) (frozen) **PDF:** [20260618_repos_reorganizing.pdf](20260618_repos_reorganizing.pdf) · Regenerate: `bash scripts/build-all-docs-pdf.sh` -**Status:** Accepted from frozen DR R1.1 — implementation phased; monolith remains deployable until each migration step completes +**Status:** **Accepted** — implementation phased per §9; monolith remains deployable until each migration step completes **Scope:** Split `git://f0xx.org/android_cast` monolith into git org **`ac`** on the **f0xx.org git server** — full microservice end-state, VM-first cloud path **Related:** [INFRA.md](../INFRA.md) · [BUILD_DEPLOY.md](../BUILD_DEPLOY.md) · [specs/20100612_1_scaling.md](20100612_1_scaling.md) · [orchestration/sim/cluster0/ARCHITECTURE.md](../../orchestration/sim/cluster0/ARCHITECTURE.md) diff --git a/docs/specs/20260618_repos_reorganizing.pdf b/docs/specs/20260618_repos_reorganizing.pdf index 1a3b063..f41714a 100644 --- a/docs/specs/20260618_repos_reorganizing.pdf +++ b/docs/specs/20260618_repos_reorganizing.pdf @@ -530,7 +530,7 @@ endobj endobj 87 0 obj << -/Author (Android Cast project) /CreationDate (D:20260623103626+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623103626+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Android Cast project) /CreationDate (D:20260623115607+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115607+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (Repository and microservice reorganization \204 specification) /Trapped /False >> endobj @@ -839,10 +839,10 @@ endobj endobj 147 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1030 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1027 >> stream -Gat=+9lHd\&A@7.b\<>CMIRTA_m.sWPu^%a'==Z0'`obV8g%o5<9^SnS!4'(KE+>q"nm<7AisQ-!n^bRplAGU56D`e&Khd>)%[Up&3Rj?0_dRL?RoE:\Atf]63r5bh_dALNNbnnjoBFLNeI^/0^?7Qe9kX`ah`pd?tE#.+O$:Ie/E9/&sN`@k(=M*'=lD1P%SM7@2d$5M,^@Kg*Vpb,r7Che)W=/P:VDh!s?6&;)1e=imA2^!\P196Cq*O!]8Ub9[8(fbVKpX[%!^qX:$#EU,i;mOV*"DqR4fJs\t*=ec!.#:G@DREA@u&'m&1:eBE''ZBX>#!R.&TXA9Tt?>I12:V0d_OCT4\"V/C:KFCr#,=]9i4a&hP:Ssm.[2N](5inK__c6>E#R-:e<8MDOKS$MGEgS%88dQ(LMVFkJNqin)E3>"8UT>/Y>I=OF0>\4o.PB$//?s;KL6f5C7Fs$F$$.E>j=!qtS0s3(//@e#Vqp+I@4-J:ZZ9%)H:pc7W'bmgGn.Fd65lM??C(PAQn/?m#&T/':*YD-ViDapLAX*P\ML@rrgu5,hd*&9S"6OT6P(8eS#=u@XQnP,]nYE;X&c_-s.LF-8MM1#:5T+$aGf?#rOMKMIXQ9s$rWCm%,"D~>endstream +Gat=+9lHd\&A@7.b\<>CMIRTT^p2XTPu^%a'==Z0'`obZ$BR+jfer<0#nBrPR'>l1H71MYY-#)!-12QV$fh7l7i?d3AR,c?q,a?(_[Sh[jEN2"rrIFV,E\+5D&E!Xg:,B1;/;_N?F'FS`NI^j%t;-R9g)3r"0W_QGTtZ6,$B.]SOJrd1uFpi*XBt8SWWt1=p`!#_MifO+paAE@[A`4$JsmO]F@!R!=41)>19Yr^Tn5^0\dt?Lds>r@Q5!4HIrb-V!i24^V43>GQ:rW%1N?o``2i4(/354aNK6h3-:)"?4OGU4`l@(pm>J\2KlNWn).eh&96*1,p:)Pgb2O%V!GERCsc^nhRBc_TOS'3eIL]cL)gIgZrh0u7Gl^JP*F:084m6g`Ee)RR#A!kUB9T"4E7LXg#LIC2SnY];Wmn],`bV-YWN^mqcf;YDd\?,'#,6='k%^r=>jO)Td\$Co?GD,PLs.lG3]X(XK":O5'B\RsL*1GqJ?(rT"7Cpk!LIt:aM9*0fq:ki(7`_EhERW7*N3ck9dfI3*g;`4+I+[0gbf_G?T>6H,\@/WMj:%/f46oiC87m4lqNOoGd3ab%:q2A!8!MU*Gt3g05i`M#)@1=NYQf\"&P`Gee9!QZ<=$J&4sMWHE)T3hl.kG&G6K`n5cW-4,T.cf"6ahhl)Hik523)@_Jt>Tl$+gWN]82"q&qRA0Jt=!q#dDlNoqS3~>endstream endobj 148 0 obj << @@ -853,10 +853,10 @@ Gau11gJZcs&;KY!MS:??=D2g-hAJWmWcDLPZ[:`4Xg'^k-V,.e1]fa7^HEh#!$U4(9.m6[#2B*U%tF>\ endobj 149 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 3864 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3856 >> stream -Gatm>>BAQ-&q9SY^n[)_'FEW[EuDr?;YShO,KZA5dXC?k^si_u7glO,'C$4;U!>Q6nDAmORu/@I`A0>^6a=@&&qpaCLNM\^hHsTnPN%pRJ=))b2s`r"[gN`n5<\Sm0'Dp*[#g%P>$Z#[p_O6;D[)#uCZeppnbQ0OaA]B5Rk7fP_aJRO,6=K59\uP'Jut4Z[gLRP&,*M3&ZsC,'-![)KOJ>=IpXed^@81'3$m)mf.qpXAA-IX.&`9;bOhTqSskjuP&rY:ilKJiH0&&Aa5b4iaZX"5W!#ald6@?KN42*Cf6g6L,#5q6u4LK,%Z1njslj3sdeY#.m1XTs+3SX[cNQ>X(n?\P4_%-Q_8B$9g[Dk/7K22@UV_rr-Uq'@Fr)ioAMTh=\8CS&`-r5Dh*s6sLf"M@9N>^FA'-lhGaao*HR_pOpMbhb9G^R(@_JmR-+#Cju'CmIKCSq)#j;q>Eo([aM!_Y8;W#>!ULB6@&W'IZi6NL:1/Y&-a23c_DTc[mgiRI3.NG`IuEaV&qgnUjr?@eH&(TWRB$SaJFQ.61/*@&#WY=&eIkN[,.L)(k.7$g!q*I]od=[QBXU\0lcJ(S4;_DYcLWOkHmG'"*s4\Y%d[T#^X(!KEm;@%Sg_/)Lt,3dH,r$1'R^&d[u@KNf3_>/np'`b=1%#YU=*QEYrM1k@[nCpABr2#0p2#6\t5,7/r?WdeW]Co*IPLbkX*U%d!cnJQFK]9b./N2I'T:=0d^##;j7_%$0+"m[,l:?J]UM^RpM"U1A/\@dM2l_LRh'hcokSjiPXnjBo])*i^hWk&@[Of81M4gq?&oO*sO2dt(+L4a>E_Hr\aJZP-/$@?'etr6JhcMXiTD+H.*i@:$;2^5/@gXekC.@ZK#(@5!;UNAE,ZU)R9>_?it6KDt":m&O%Z!;:66!pK6.0poc'q2pAN^.-a3n#A%5&Hmd#-[YO'0T')V+;bpAoLN)YV"ED[l"D+h7rIf4enMaoq_-u7Y3e71[gj?6_OQ'ma**V#MFh^JnU4+u?Eu1r"EgYKH"J5;8@pi]IGLie%l_u=C3H[3%,'YV(qf0]+Nb-:Q#9^*\e*!7b1_!1r`^GcD1f^Hu?$87".m^t;CVbr%'oE_X;jVVHa#VCjC*LqZ`gXAh^/Oqa`aJ&.ioPI5SQ(EFD'!^J/^:`,1IJbpq5(n/O@t"SZUGJR$d\+M0c8G!JGGksT4JpNJl\55h+)l`teIj,Qa&WQ=Vq2ZkVU>6/^]@T'pE@5p&64O"-%4eN,S9ts#IiXGlM\aGD)FnoX_oC]2/t?ZAC%2HBMO"%*Yl.B"2GXOZatBaRH^iDRE`K+k,+gKKQS(YH&&E@EeR.^LPiM=L(EihAIc_t3]!kYD6&\D?gF4'MWb5mu>j@R8!'SA^!n%A.9BFb#=hdh\9:%Y(ISm5cX#g*D&L-[\D_i&YQSFMd)0a".7F*7:hp/\#]Cq!c1l(XsG`?/)G7M0l-tZK#=8m@>(YLQek#`aN@ll#F[Q8DE"pFi*#pnk[qG4sN)X(J=sDVt%\iFhba;>`AQE^;AO\Ii'OIZd2046E^FcaDS]"X14F$GH6`s\1E@'CV1Y%bV%N8(Po`Be4Da-eRa1gG7#c`UNR4f%nI43CTH-`EV9TD?!BdkIg1ls[+nWXI:7O-1nuT^5bW3"elADf)R'2>mH5XQ4J)3DdAqXgpoP!09&,(EBs>M7ISMKYTBV<:ZhNuTHfneNp?mJgJ]Q-Ke=PbTpK,U=[Uf6$tB\sN.OZ:%InIZ?9VF\U[")@`ekbLV^6k3^PhW,eZ!%CjJ08aj23,#>nL-s'&?)ch_RQ_-P/gn(pa]1YISZ**u--XOUR-Kc2o&7Y_(!s?\317Z7eKM9[`DMocOKOm:g+h6^+Z:h=D,OjD<_/&':]J`CO=uuf?[1[8qa/6a%;=30&SZ&u68ZF80h5Ic]PnVHYs"IXC_o2#hm_q7;HBh8J!ndA'`A-HHG@.WmEor>#H,`e]7pqq[+H$8Cdc`d$cAQ#\LUN;endstream +Gatm>>BAQ-&q9SY^n]@J'FEW[EuDs%;tnqP/'44DN+OgZ"\DB9Oo`YVm]Sh_n1%a4;X$0G9EEcbFr.b4W#ut,'_0p@+S9*!VDei[0Nr@VU.H8,hP'8s`V0`dS#PY8@Hk(P9\YZ5XI6<\im60^Q7eTYK^T^B=Xf_H8Opr+;IocP#:qU83(I-LclK^q(qRh?">Pd@,P(73>(.3ISd!)kNr*%erM9W1V2L-")!_1*-0Cat1l'[,-j%E8018JErT*R^JlG^k(V:5WE*6BQ^k^iSPn_]bqrqY+9L]a,`.g+]$2qD74,3%27".NWb"r0mSO0!]i(?J[NDhLq2#n?oQYnkAM]-mn^I]'3Homr;`ZNp&$sT`(li,L0iPS2Z7[Y\g30TVESjNZ&-+\j:gtM:@*Z8MY7N))\`kk_jY;S7u&c(I4sHp:*1H/?t_nO5C@V)5!_aOHTiX6]13*E7oL$O-4t8c:,aM9J-@XpZ@J\C)8H^9Ji!O[l^P7lYRnX.3^(Nc0*C%j4fMXMk:#OJ6@TR#\e3]8pVD_>%J_7[1&qV='*e>#hP/?jPH@>XN*JS@2RuO8,:=Pl@L>:`DW\kB#rW53hu7UOT8=$ZA?"Q!@T]+)?-@X@BSYRER-"ceD1cRVg^F5hI5^G$+LM2VmH3LDn!pUX6%h.)WpcEC"Q%EP.b2oq.]qe-j]&<,l'`,D]7>93C+L,+?kj<&DS0aPk96g3u&D]s-8'&,a86#T2l1.8Z56?pE5e8^'2&s4[,BV,tLWn6-sq9p0m_*5%[l?D"U9?NEB*XjMf':PAhG6Zbj"3"eO3><"J&l9=q([1F),J[LjQ'/iYhe+_@=)s!j^tM!mH.osa&RE(6V?3gR9>[C_fGN+5RD%+JtHo.1Pb]bE>h'<]UTopata1Y'!OeeRCl$gD''m)!AWQT<$878E_e%YWZNITW0Tcm;*]'X#(@NXV[)-PZ2mRI>`uAK-3>.=+t``.(E]Jl0GCZ+bc;=`#1q($bir(a^.8n/X,Jbo'FT5H6Z>Y])e58!Y&V4[*_3QWgP2H'b6K^5N53`G\4jR0!jm.+DdZ&U#QoqbM"@7p\!d^9&-Ge8p,s3Tc#41'_cW-^ii%iMpm&@K![-=6g>;5W3+CgE:)#F^o[YG54dJ1rQ]0q2?WGo?s5E?k9T-@hnKG@*CL*uRLqYR"+_=$:\hJ-km3ZTR@Wdl2*jUe:jkg'S/Yailp"'kd4J'4\(%$67h,1_KiA*EtM3ff.3aZ$3/pPcXJ/@',/XAiuM:Mf/jk8u8Kb.i1q@[,Q*nOO=B+6gYFGlLNZIO4MkdjYc(jRT=$&Mio;[S/t[\>!@Pq+u.:WSGZE&BpB>J^_*ciiVVYf6;PTZM]S3?WRi*(^^k;#N1SALkHI6(IIe%DA+2NmFB!g:_T:A3=.bGD`Og2/qj*$>r*I.TkS!G;=Ar>!-f..4Ei=^u[/T==7AXX&stfp+526O<;>VaoDJO&i^Pl8#&;PP2n@NXeMp-&43?'0o)M=\PDMdiU/;OGjHC/SISW)l+riii2a-fS=P0@$>YTej*qh3;j=2:"(Aie$1jUNpI4]W@hi/;=H8H8joeGW8bI1WF6a;VS-YMRT%k<[m!.*>S#>M%Cchqg6Pb1SCnQdG%K:o?_MuDQ-#HM,O/;6"s*@Rk_]11ZU.ti;;!.GlGCiM,H\gP=H-XMfogHcF#hPYD&D,]+:^4Ph:+2GNIj=Y&*!T05"5%P:^%VjD.=MK;Tp6WspP\Ypl;r$hGL>\!LP\/^i)r9,"pX49B<>@LSshF#;ccmFK!uB"+,9.FGkUlbm^QsOC`_2,:W6oNK]RP%;Zc,OCN3-V**tD+'&kV:+uA-d6g>tR-0k[2"VZYNY>RY'IY[r10-gppR]`=[kPWd4<6WZWd<6q=$NB7aKc#uR"7jjkEb/]k8d?MGoMp\)0cu"iXtg&Sq#JocPlZ-P#G>\0%)>e*!0p`!!1r`^W5^:hn<=I!;e5t.'`tF+nuC@C`cc*3Y%dEfC\h[F-*L`MdT!Un!7DQ[ZEjk4>F\JqePUR\P!^=ZF/eD]S-5@"\oHNJ'gq5:d"4g>_&5eJ4j=\jEca*o*#cReIqe/DdaN,%,'MbcQa\!0O.RcKLCau1bcaHMF9Zha)Kbc.\Ybqf%^f`'a##i&]l645$P%-S>(VFgfLfTOoX^dJ1g7X$3$>9mhP[h#U'_L7UedL&"QJ>!i"g]E^&JqFXX<;@eVtiS-8$X(lkre0c,o^uUZ28b!4\b<1VK&0ZhYEXg_=k&YjUKrmnaa%Y&NXi:pJU/n3K7?be\O+B8./3D:NXpCRrqL.]2&u=`8-cq^?4^A6.!==mic*I849hp,CQWEQ7]d>-B5kX'6#$]s0VoME^IA57XW!`fmNXn_%b;`hQ2gq;h.t@\O9-8SK]jdeqTpJ^psJ)RnmB>aM8pht&A&oMUVkIbe#ZLSk#!AG-&.3KsiYI@eFIJC;c07p@N[d0;\cZp=7qV'Nk]`S5Ea.>HYI`TGX*;q0h/Y$WKomk6.\Ug_U>,>,%.%c/gdZ>iB27^_tGZV9A&HHrla3Iq000Un]B'r?]cfg!mc-rh@ZegF][3lNu+_O_]jQ_$q1dR-a=d__rmFi*FRms[)Jl'_d@.m]+2u72@6#,$(m>E\5(`XSacFP0hXbT7l785$a*\i55]B_"Z8epgGUQUineC6lo5hQHRHhZiFM8aES-X^H<`0Bd^HW5SacB5r)<2'gjnND1\TY_Qj<^Zug6&Kio=MP38GO.2MpQ]6HE^RWboVkN\,,CD1'7D1B`,U+VD@NHlRSVGA]Xr[PnUC)$GFo5rU4Yh%<:J!V!j@Nj^[P5J?Ylg9fS:?4"O\AGq\m*E^Hl7@c+gH,2KG`%V[l-OeVqm)o0.p69"a:l$*BRhBZ1qlX^lLH(hr-BDD7pCD!Ldg1h!fn)$+qk%p`fE,L!=>/)Y.GnH'6C!Rn+oDq$!@+M-JT$Ig%O56]4\BB5$5ojTq[iAj=f[7uYSFTEG5&MWj:<;C7ABei=,VpUW#Djr9ioX]VD3&q=Gh\Xfl"M6XE"SP/WM=B/ImiT'ANAo:-%g%&f@Zhm%<1oX[5nKadqLS/0=]6Aq2nRdFe7jm\)Mf6*4?,rjq,IP^ikjJ_sSN*IF6P,TmfBqY<8\c(Mo!u>PH?eH&4G0h+d7b]]iendstream endobj 150 0 obj << @@ -1092,24 +1092,24 @@ xref 0000714832 00000 n 0000714929 00000 n 0000715093 00000 n -0000716216 00000 n -0000718415 00000 n -0000722372 00000 n -0000725926 00000 n -0000729503 00000 n -0000733391 00000 n -0000734953 00000 n -0000736448 00000 n -0000740097 00000 n -0000743096 00000 n -0000746504 00000 n -0000750244 00000 n -0000753669 00000 n -0000756676 00000 n +0000716213 00000 n +0000718412 00000 n +0000722361 00000 n +0000725915 00000 n +0000729492 00000 n +0000733380 00000 n +0000734942 00000 n +0000736437 00000 n +0000740086 00000 n +0000743085 00000 n +0000746493 00000 n +0000750233 00000 n +0000753658 00000 n +0000756665 00000 n trailer << /ID -[<53c74cd87848b8b637e106b62ed0d828><53c74cd87848b8b637e106b62ed0d828>] +[] % ReportLab generated PDF document -- digest (opensource) /Info 87 0 R @@ -1117,5 +1117,5 @@ trailer /Size 162 >> startxref -759193 +759182 %%EOF