November: the 14 OpenVibe sites that went live since October, the counts that moved, and the coworker link (?PAE2)
Changes
@@@ -47,7 +47,7 @@ endobjendobj8 0 obj<<--/Author (Alex Frison) /CreationDate (D:20261021063644-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261021063644-07'00') /Producer (ReportLab PDF Library - \(opensource\))++/Author (Alex Frison) /CreationDate (D:20261106171201-08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261106171201-08'00') /Producer (ReportLab PDF Library - \(opensource\))/Subject (Data Analyst: SQL, Excel and Power Query, compliance reporting and automation) /Title (Alex Frison - Resume) /Trapped /False>>endobj@@@ -58,10 +58,10 @@ endobjendobj10 0 obj<<--/Filter [ /ASCII85Decode /FlateDecode ] /Length 3015++/Filter [ /ASCII85Decode /FlateDecode ] /Length 2985>>stream--Gb!#]>>s9I(4OT53,_0-D9%fXR!i+YaUYY=&7B-`X7F])g3+!i>3Tp54>f?P^XFdXL&_\uC+:B<**rEr^[n"[Lq<A<r+D0+*F@4,pCThK?-aqaGPZE07OQf+^:]<f-O3"D*5tcf+"uPuV`Vhh&O$&/k&53@e=>EklPsQX'^bMFEPs6n9epuamu=WaGY?Z'e+MU#g*ce\O>n5@)MrGcl+uhD&u#;R&/rs+'.f#n<0O:jmW?jNs%_eLhN\f#AWh_/iq$CN':8Rc!8i+?;7eb.O)RZUdspr/b\Pr^UoU]U]7>NPA?(M^U@WT/GfMc-ca@V:F6+1feDL1+b2QJ[Q,`6rHo-;WY<.BVgKjg(Z1O>($R]UcLhpYY!F:+7CXL70+u9j#8f)e&%=P7P=g\MbQC/@S,0@o()[DH"VaTWg/tCW5Z,,Y#HH2*1h=Gr"rTF*+Er!IU&dJ\`O>s$^DZ7L[_V`Od]d`ls3VCF_%UI6@lEOh'j)/q^2_%"I+e_K8IRpllQHM^[email protected]=+un$-VI5#lpeMq9cQlJnV8a\o]XbW:.[)HR?CcF]))2+HRg5:QcGH"eE1A/l"(7mYu6s"+k%daU/nbXrB%"<<YeH"'rB&"La-5-d^EgmWQ^'k5FqVSL,<R1h4dm$`Dd5/>(8c#,"8Xe<*;FrBdso+G8_WaFHIi6&IGb!hfP,dgTf<Dml9\dkH*+AAOoq('.'0U<*;=:D^F^$E/H-.X@bh]qYVjcXt*.7CY);a*oDdF6^J9'b*b.#150M+P6J'2(GA`V_8kUeG-9/2;655P+[/XIQHDl\]UN,U5ht`25A'1]dTkjrX>J93;1j9FFC55FCo"[sOg::L$F50e3*TLg\$a@>;)l]AD%;I;/Wtgs$7^qGo6b]lLANVub@g,)hkt+"=1\SFOO`5q:;$i:m_eXH$RBWtKse!tk@sgDh<RTPGjVsiDJop/>5,l"f>G^3$#LrNe?JhZP(&TlFic,O&(QG;(!c$eh@$eX;[email protected]_hZ*!WTb=Ueh-E]@HLX-R)f5jrEe;sCi@c\B\!.PTii[Q[_FS(Tr=/??*B[O6/952[/qUp`VdTCu$L2u+YfgV*'o(@`QP6/:u99n:R&GN]VWJ<+i0h%"k>b(5&6+=I$]<;OZ$U);Xqj?d)]"*qe?-ZON(I"(IYZg/:-E,\Z6ep/0>TY%OYA\nIGg6.MdWo.6.X<L]?fNg?L-Rr4+1.@aQ1UmcR;sh'E)@hZOrMEVAAP0UZo"fIjhSd5ei1%FKgja8##s:haA3PZarGL**dVq_iL=6dT<ApO8S7W?rg6\gecr9(2mefJ=F2PS?094#!;Heib0KH0mo#%]I=BqF1K@CuhY%l0>?$Ip59<X0W\WIq/@r75GF@'Df&hBF,bP!XEH6>No&8eCLX=n,_lLKRQM[?E05`07CYbDA#*LbNrC"ue'(hSeC17;.+#.<WDYIglKPnH?[dLY>3T%pK)s5\GYu`BS<P"F*FqU$e;U$ZY`^AZ">qc@0G%f8BFs!^IR!Re8n1Z#.2tOt/=o12tNP%*(qDLQ.pB?O<^"UqDFubjhc'_B'*(Eqo27GUVR1ImO@iH<gVO=aKpiWft!iT>?C^.9-,J(f;Alc=d7fD:SVll!`#<Ze0M.TTn!Uq4UJK+*Y9VK)#Opo_5oD.IG>q:\.>VNC8M4m1QSE^GgTj!@*W8Bq0Zs="@QkEtekI<r=jgJ5o=f&^C+_*;W4TS5=UUsNH#u)o,H=f2?%E92g9c;("eR_T:?`-L8aJO\XR98,PYb8*`V'QrV(1k4#R/ZYM9J$o9p?50f:j,!k.IbcEod'<emh?<t1[lN>mLJ+)MrGg9QS.B3%VS\C1jTY\fEo-N2%Uh%a5Frhg5B['H%?0W<f^XU3ESH>:[email protected]#hqI1](.:P(3Z=3)FDNCU>LBPdq@+$^'tH5Te9I.02H(>Cd:EKD.Yb0@j;QAlUn::kCADRG5<o<p39BS0]aA5Y+Li"cC^IS<J[C[p`KfesS#(,U,"VL@Au_nS.,)IOR%MfR@+G3c0-#L!a3;c8M'7l/a?*=%M-pOE;!GSdTN)W=;]5<?T^0;ZR#7N+&+86EO7"-5*j6MrJaVjfRZ:\:2cC#XncSR)VC='&Ho!l"gI[/QseUFssd@^N;4%,\.!bMH`X<pj%dg(1[,36"3i&U#:i*4RN_AO&]LKlLb(=b1d^(T^pgm:3Sf#K3:A<oMCTt6/[uiCL.5W![_Ei#[kbaXe5XPN4JT0F,21[/;=Z>`e,tP>*!DmVRDV:4rMtdlZsRhQ#Rq+m05Y=W"TK1bu%(7LM-dacU9Q-Nn_eXr=C[5GC47B!5FUZ%kRs_o46)s(?j'0/t)e=*VsN3a(aCmD2@3n9M7Y"r/5&+[[G./_Fq!n]L.n@(//\Qbk.oYeW%MgZ6&5-.q70L*3cK*ir+U@I"*;Vn'bHhDpt_Q3'4L'7^#cI(R('8fCAQ,e!E\!9BBCq?T-62'92$BB!.M6R-63&Q#/et]@=l>>([hLnlf=DJDY1]kkRs*<me1&']IiSN%b=_bC]BoeCU8qFPE5#nQ3S$"k's[nLh_L*&[jfI]6/W^2r[4a(Vg0q=-RskT095L(M#@m+?U=.Pt;IZfjVmM=CkRH#!qsh/##[AeT^fShWLQNY-K%TDQ;l3W0KIkGt&k5IK;U>F(@sTYq!R2\uo"Q6[+Q/d?J3O7pY/?R!pP!qEUFQAO%qQP[4gpRo"Ka>.\5_rgd#AX8MI9](*iMGrR]7jT=Ymk]sY3nJ$fg8k=?0(i38ipYV52N%@72bMYa.2,\^?WlIq9AjQG0p]*<H"Ao6U[[:i?gZto@NYB6Aj-oC'l#RmcU4SmY4_jT)DI7lmaeY\gV!-t6n%h(4UoW)T>%d=o'O'=TpMY]f[+6I^]Kk<f@d;j5(%24p4KmI'W?fg#rO3ApWTkM'hf(e$8f(A$j!'mi3uZ5<>\CaOZ8:s_/88"P5[Qhgu\?g^UOS<j4:@*+<Cs.0TIF,,*qLhIT=bek5X/a8)j~>endstream++Gb!#]gN"3(&q0LUjP.bfJ>'L[mE;5^G;LgQZI$nB7eihD/tb\i?1"Y,0GF'JHa9YcO=U\gXI-6R5e&J4pQHuR*GXW4j$2R_kkLJ#^$ecFU>$Q.HEA7E?I7BmS'Q"6eW]q4/e4XOlOY`-HE03ET-6AqD<>bU=Jn?t9=GeaNi7$?B1Et+q-]`80D+*LX7NfBq`EX5NMV'AcNB#VdBJoR<K\F$IOGfn*sSDZ)RY/c;35NjQ-Z#H)t`#BI6*`diERj((b%Y^V*At!(\R=#3uBlfUX9X>">p')J'>R6X^&I&lFdQbpeE.cDoFbaVt,%ZPQ'@iFtd!8;,7)7X$Ys`Wi7guO6+:,MgaFHfA:E:GE/N/r)>XAj'8Bql],ZLnY/<^?XfFda:l/9.r"3W.F#Fi:pEQVaC@e2(>:`mbWdCGV_d;]hMCi[0@`.17.7;1Hh*fPbONjWp.=TqbX(6=<k.r5IgLUCrq.W4%qjB2EB:HUV9*5foLJ<FQu>s:+$i5aC;#^DXW<adi,W!ErqH`?I'.K=btjXqf'/`G/K-\hBAsGme+q,+0qFM7jYA!gO>ONEXgo+,o:+2J>%r%:9D,<9pfJt=]T>^UB:VN(h>TL8Hms-7c'f8VA&Jt_.qoqZ/QM)Qd2t#h=@4"VTl*[NlscuK8Z]\!8s(5t(TODTZ8@gSKfc](>.TOMdYJ`C`,E68D!]efMKbTaQ?-)@gbL.VeZf`^=t2+qQV5GH$_3s^3%^>UJ3O!RSa"RcdFpHfJ]G6okKp%oa)\&:KM:>CjCD#$aMeNuT(=\iR[rbc>ib4CCl"-NZ)&WZ%e"!F+:ts8_2kR!8t(Z3P*H5t+_n4lKas&lM7%H70N(rW<)+4u!+u]*osRn(-ZV]pUs3=fX@9ek<^B0:[@Y_4ro!:BC&(FcrVQNP@^8d;+'JR@jj^DPi''9t\NmI3:fto@G+Q,QfY*-kOk5&[iXU/$XDo?+IQ\a%Q-_uE8I`:]-gA)X<L'XPr(qft<UPf@mCdHH,c0O#:oS<u'\au7]pqL9AF/UAp@oWtGs,6Z8H"@JY1IR-%Ib1='U.1J_U1HV>o,9oUHu@5/#9`*k\"\687VT-(s7!UA/C6Oak%K7NH=0p/l[5E6/:M?k8q4-`tU+KI!r`T"mu"1mCjnY0D#6SmpieAlfL\5FLbZR?hdGm_J5?-)l%:HO)[tYF+&B4]Y;'fs#'EF6t]YjX8&[(I>u,E(]sNkIaD?!7+16rUrof"_aT.SMshJbiru'Dd`SN"QNIbr>2S#Q%MnHK),P$;+?u.G13LqQGj*OlO)G5.I(i?,a/RUMpg[@%BbRuphpG%k@I6si]#]tu!:UL[OfdMLhMi5Sqt.<_(Fh)QGhX_oDbqV.r-1J\WChS7ZKTjpgLjirZSCqG+o1K6la*)PZO\ErH\?PQCL6ZSYhT>7IrRP1h!!%J1m"4nkU1]=<hRc\<Y691s+DQ%Ek=j%'6N7t[^AVJbP=Vn?Sel<NP%lS8u3JpBdZ3ga5rhcFu02:d5<_AI#f'!62Qe%Ni5%n":l/DHTP"cQaNGH_kED$;;^O!c@&!R<k%XAQsEI`<HI;$5)3"#7E)B(6fu;Z^t>*qJ8$?H3.;lbUB'Qp1ReCs\O)Wb7*MYHg8I4ulr:Aij+(dE2V'F:+TNSE/oV&%Pq$mbFdrLoJ%[email protected]^;G"nc(JP;EYU!)oU?n/SpY]%dc&/'C=>[q';%V'geuB66cm=4!c8X_4M0csV7+jckl9?!ZSmo6%(;JS]'<P_ukc!=P>'<*F=imni/'_t9:l@VV=8Yt&HLJ?nLo9S&P-X=(hCHma^ER=PS\FSG:5DC>9XF6Q/3kC=HS$_ul=NLc_`=TRInH44[Bd9]LFb]>U;[!Dkmbe`S\J&5_Pj1ZWK;)m^ZT@g'AO9?iM_1<M/?_^%-Us-5K?]1/h"T!(_:,0g-/Hn1o&)IQ)]&%*8Rs![H6OCV[A8^Zp?)'>)F-a2M!$Nf=,q)4rF&!?Ogm2dt=D,bnPDDd")T&\o`i#eSpk;80@f(;il*TQ+f1(*M387h!VjF;H>Tm+>5ghedGV6dkVm\uJ<.RRq9Ec!#0ns,&$aj$(R>Bsr/;cp1Qa`D2iVG\R,8:;@@N#@=M0X;"dHMF^)miaElr!+'HKeo$8]V+Oj@`$[q0@mhf#R9FJAeJC6GXJ3Ggm\>*ilqef]rG^Q+&:-=VMB8=Hb]eNjfrVAJL9D4N.Be\\3#P@_,t.3snocos!OVOg2/`fL0JOKe&t2FS@cNVTsV;J\Yok81@#+F!i!d2F^92CG0sdZ3sqP)li\FSl-E^q;A4QiZ`s9To10U`lJp$/U<GUN/L&EF3(g!nGm1?&EY&V[=a%cQO9jH5%tp?JPf,WWErZo!D0-PRTNAnqtCgtFBDItmk9p]I9FJVAK'*^Ard^ui@EHsp%U*/Fh52joVKpp;RdF\Qc8R]F@OY&1KD@L9'7k,Kj?tTCZ4QJem(_(XB+L*^pb79H@F>N;dV'u5rc>*+]/)O)6d7`L116AgR5qK'4Ia>=kp[dP%"n2'>K[%94^5:Y^=g'[email protected](9#[V*9lnk"89iUYaq%$_>3'urefsC$'e*RuT#@Ol.o\FNE#eSF/^$_YcrJ0n6Un[*LD(idB-);S93/?PVJsW3t,\&hN"$;?0GN?+a&a;W5pt7f)7:Flm$XK3JLg+e&R?pl]o6f1G$VC&hD_u^X.<1lOOq?1<WCCc2l<GL?2LnCYHE)7qpMC2jl1A;#<3.?D.`raFijKd[[`]N2=So`dg]'#'nWL(rEs8fZHqcC=MPLY<)U.@fdW8?6K`2AsLcK[[f\p](Bk--9I&<J>B$F-/iu*'H5VhZP_@m#fBU2JJ"g3BZZ[I7LnCUe/#BAug:_<d@C/jWhO^W)OQl;t>BP(Nmq4[B;[m\8J(d'Nm3/gGFD<.%Dr]DI]c/kA.\.(jnet)IU*Xon>DT'sIQKjD+WhAV$rrL1b4q@~>endstreamendobj11 0 obj<<@@@ -83,11 +83,11 @@ xref0000000902 00000 n0000001249 00000 n0000001314 00000 n--0000004421 00000 n++0000004391 00000 ntrailer<</ID--[<0708869bd847a2f084ce65d9fc9de7c3><0708869bd847a2f084ce65d9fc9de7c3>]++[<5d29013ba6b75c536fae594dd3cf204e><5d29013ba6b75c536fae594dd3cf204e>]% ReportLab generated PDF document -- digest (opensource)/Info 8 0 R@@@ -95,5 +95,5 @@ trailer/Size 12>>startxref--6392++6362%%EOF@@@ -47,7 +47,7 @@ endobjendobj8 0 obj<<--/Author (Alex Frison) /CreationDate (D:20261021063644-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261021063644-07'00') /Producer (ReportLab PDF Library - \(opensource\))++/Author (Alex Frison) /CreationDate (D:20261106171201-08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261106171201-08'00') /Producer (ReportLab PDF Library - \(opensource\))/Subject (Software Engineer: full-stack TypeScript and Node.js, payments, identity and live streaming) /Title (Alex Frison - Resume) /Trapped /False>>endobj@@@ -58,17 +58,17 @@ endobjendobj10 0 obj<<--/Filter [ /ASCII85Decode /FlateDecode ] /Length 3349++/Filter [ /ASCII85Decode /FlateDecode ] /Length 3240>>stream--Gb!#]>Bedl&q801W4+auJfq59o<K2p@jZBY!&N:ga"NG%!l^=+dqY;4P93"r[4^*bR!?Ya:F:-J(8C-g<Rk0)9.g'_mAh$:S^-Km)jf><bl`!ubq@6ol$WKiY8;*PA?V&`K=9Ms`YWU/g$7V4!U[VejU3'jf&q6j*olTF\]9)@gZ=W[7ZmUBDfhAGj;#p(dJR?&m0!@T8F-il[D[5;C$0nG,1Jh0KXs!V()F:cWB(BMV,<(:+%LEo1m>eD8<V=tgq9Ab\CGHjE7O1`)P,i+J6N)DreFh^X)0YTVS)fa"qJA4I[DrT'u(6BfDHe?X_^(&L1Z](m"b%.RJ[XLUs9HP4r?K:f?IXhm1s&M/?S"i'ppl&V"8+7-;s+B$M#T[A4CgQ1uG*Lk34QW,SHa+.:4ttAIbPG'?e>P.eN6PRZ78.$L]6O##:*8c3%,>##DY$]uQ"*@E%\:=/5#PLEuR)oKm#Zf(e_n^*ruQrq[hD&'*0?1,rGOd;7\p]j[s*jp)Xi[3;4J?FKo@F!gsn$imD2MACISq&'2KBdA\6<%C3-9P3+..qP03=im%QSg884Kh:r.W0.fd,@LYM@g$Ie4kU%@L0_70N/[5G%q!)h+$-GIfr--Pir^n&-dL&GCsl:gJqgGY>3bWMR$Us8#nih1=[iFE!N16!b>`It/`)gs\4i\o+eJGiSW$MTbFr^RqC`P]4Foh"T1h]J4JW%YP/SS18@5eQ[sU9T=UElL,gnJ.?_m1U4f4OI&kS5&8\^A'ZPt?d>ij"N6Y`/o^PcXoP-l(Q`e7[,okC+]e9>k4PK#)l>pC+]&7=Nd&/bs%DO;1<51q[F_=9]'pLP6lla,Th4ABflo5P?9qSuB#h]lk,G&hjg4!_$8nG`$\l.&r.D&9.6JQ48mj86jDdA9C"\QI"UnEdii3kACt*;WCbM<aq`@ocjkB-/`HqGlLo`O/("\T$bAIKe+USfRAiVlj/%fS!1&=./i1%&dt.q<(^%FW?jAcfPudN,@&5FiYE'YV\diae8V^WqOsJfS0;;_lAc<0iJWm%Wmn@]8,#$Z0G""Z,`YUQ'nJ7f(E)`qhCFKAaSXDj66'r'lL'_WQn6ZRYS/l4ESuWdfXmu_p>+N)m'aZ58[<J4Fj>#p-sf586U$k6!C%^9$IN*,b?T06-(;Q2N8Ho3W)[&KLS@ci:u[8k1/MSFH;LWk(h.-H+H`%FYO)<WZ&Xm^mRK78/*d_0G0YdEqCQK88PFtjNtN>$-+;+OU3%cUq`ul":gDi"i#=%LYe)4ZYBSrmjDc.]%kgf"f_9:%`_7Um9Ukcl8AQi4+jonH\^0mYu9kQ(sW@h6att+Mq7pU9s_FKYt;H[RBbQ--U`#:+2`aKkpA0NVl[B<"2j>ncEFBZe8,Jt9HPo7W%8aO1L-Q3Aetp\6(CR*AcDT!*H$019ba#=4gt'L-W4j<)+:Q-@0UC&]ehm.Ra,nQS=d\>P6YrRNuK^h,ld3BpL1]L,f4chN!kV7>n,&T=O7nP)+Q1NK?/Y$MqoQi?R20t7]-)=l]fWSMq"ccUN<a(mr_7jN<`'W\(uPBShcc$1"Rfg2=_/s^p7@[UVs7@8jgqaKfR4fd]d8uKM2@QP9P\^`gfVp=EsCF8<GH#,[taI[&rcf2>ZqE?Ct"@kO6FRLP37bdHis8h5>":>\VKi9u2nfqZdg>?k];4R5t"V$Mq8DSO'k;*'ZJ:etfuH6`ZASW\ftq$6Nll;8/iLX5+"Wd!'&EO(!N.Mfr`/^:(!sX?q\>]<rYQ+%,CS3uD(6&G9O^Frq&02ERb5M]qks,3>,MY/3$7207HW]`]?tgh4O8F)Ia<$gEKb)3\#o6/Yc-n;H6$<jpF;cds"`.J"73!c)EZ3]Ii/#j!e&hStIM5VB3/j$p"Qfe/./"=[cbi&Q?g6UamH\[C<cL$"efffsFB,25#P9]j'(CtX1YGs#Gs#ONPC$fr:qj>Pfr'h)ksM_&5ne]TftF><*M&8-b)*2$\9,W6O$7?*B62K$3K47*_f-5$\7A*5bo7QN>m=+\d,;(A4d_)M9`!q@\UZ/gc(^b!hRFS??pT*.m=Lr`'9UELJj'#q0qGRQ)@a9b>GMCLI$1'(TIJOMQj&p-d"&Qt@NGuFG$P>"8[NcqAEf%W8#"rIB!+\udDmR/*rX,M2GOZ^<KNT+E!5QK(=Psh+1m&X8:j5d6\"hrr0JAp0'GRLLN@u:P!!rt%RE]9qR'AK^2#*bF4+o_>G<`TaN)cKB0bYBXX,E"75/A^+q4JuTKWEOV9#Jp_,@0%kJ5X`e3bB4piGmHp2IGD.<Ho4"c(ED6I["G,CX4_OjSK99MRZ?5shF(3@P1#0F#<5W)[H:=1'7o4b`.dN1g>1>pBuudb%U9^s(8n29riBmobY!3J3eJ3>%a$MVng$'Ba**_FH*:e%?pNU2kh\5ASi4i'Ach'$JgGC`3sC?N<j$A.;8&7eDMtJH:<fZp@rtl[:lRH91dn->^bqu!oltL*P&Ba1/(+(i-9'rgi5pUsHI$8.bX^4-\K1=`*L*=u;bs8Z5B+c5A,iW-Rp+,Xhf-cZ4l?eTc0$;nDore/>.sW1J=4G.h&3D>.QZS=X/H,X*VZ/:YPp-T6+]hY+L,VsXph$_!:6agKU<mr5)kc9h;M/#rPMsnk1p,c;Y1`h4e?Jtr,r6W>JFT5@db8DPXo%bliM%q&Y<k2-TbPuU?XX595S*cR/;*$2S"V^2%s)ek"B68*=HkCdMN^D-gC>[%3?VX%'`X$q;+Gj9L/H[+@nJ_(QC0$Rgnnk!&ObD1">H3S5u]0eO"/c$r#]pU&Eu4$PqFtPHRr>QE3?8_Ca;MZ#nMJf?A!E\_%J:No5EiV8R5Yp.X1)$+W$tWQ!/W\l]Pc/W];>95VdZNg:fN%>WaABFkI.HY=VBKA4HqD-JGbBm.P%?'p8`,/$68Cm3JV;4itjVThup]p1s7WdLE0<r-Z8QM6c56)%16j1t8V$]p3,=`?ZEg"J*'&.dhZ0QfuE"$Ds%66#J>ONo1IJG][P\(LK9;iBR[K4*B3(.f:pYM.k?/5[,t?#>q&C4T!C14Xok9&3PK@rFi3M/B5k.S(4$XGj7/$a`Ek<jY"0Jt1;Z15QKXYhbpq"IemH@GoI9`2rH%q6S3M9rapdVAH)m@[s/]RE8CBEd(Y`R$H=,cRTL*<ZEFGbH/l8;1Onld:*J@5%+WHVMNSl";a&(nKD:c\RLGacq6\l_&f<^^_`jfeNShA?:L6#d\f4i.0\F:dLL%C^s9sQ@:!`/j`,,fS)rQgO=OH:ec(6<[s0ZRpcFRI+7m\66NiidEF%-r&?j/m8'C;-rP[@GKqKROgGcIs6XTBXME@J$n3iT0Jr<t5%Gh)Vc2~>endstream++Gb!#]>Bedl&q801W4-bi"lYL3]I_(JR#.@n^eApsnOk)aTNG*-\m$NBjN#SJXUBk,+l;bBP;ie8,B_hVWqr`0;?MDCpZfdek;.GW\k1-^bnegqe2oM!VT[YN5@67*41dX,p05f<.3?9N^!Xa454-,NjU5nUXS-S]/B6NuC7b"QXX<La15t9AHEBQ0P*\$&8@*fN[[email protected]&YU($Z4=bSm0^eV<TI&Q<#:QI2LDga]&U_,=t3pEVGX1@&_W?ii:i#f@kjC+%l[(reFhr:>:(=D6^[YJ;s#/&12O,`NR/>'n8e^9&!+,Tj;5NpZ9"d-GP=WWQc$uqh$9n]&'R%h;E(/V6bQL(3U-CkqZCrM3Rjq(0M@%N"u=Tbr2PkqDq;%M'Sb'.Zj=a`hQLL@[U>'K`U$t]5c^uiI`CciNsHi4CUags&:LP#HVV%<r@,^1S"A_9O\f(cR&9uNA#eCMu<V9QPYLj3Mt)P_9np3VMDVE%N<kUhl1k0"UPq53]Z]pHNB3s!,0&D1sa#e0EbLROgL9LXb+d+`jtnOb1)MYad@19,]GVp8U3t-Ou#]T@2DPV#gi'a]F@sH40pYB`fK/8`uje:RjsT/.[&G5T`mVhs%LTs9dD6&kuOp_*j(+oa]+WMiG3!5/JnoKeX+:SI+q8@+AK@>A3_=+&*/A%<!pgBCSgmRZqsm,Kq(=r7?9R,(/uW=7tQh9CSgKFfjLudDG(W,>O4"@Gfjl%a]=7o87AEgal;0:'Mtt)A%Wtm:7U31ZMB?b(=C-V^=i?>=%MT]33,e!'k>dO3>BE,]Eoe"6,\@\iUb`ofcIR4TQhU.83*=(4(`2aNU#C*EOU/g<:kS`D;L5TYG]DDFogHLSi,=RC]</ob%+lpMu<@]EHH4QP%>u+dc@!JPZ9)l.[ET>M?d!bheqe<bPUr1[7@t[/6q"WFI``!Y%BU(9r$r-:UI0[ooDg,7s1(gE57"(`a4*d2,_JialRX,&Am).[6TM+nIeJ.1`$8ecV_)ghSUu<QP`bOORoH'&::4BFB`%`5*&\[_MSFBh'up$=ut9mCtot96BnmiP7PRs]9cW#a\lE7HSc+?Bmb$MMt80>"2iH[okUZBHT2iU.=?Xn:\L5CI3^DTRNS_0<2J`/+;3QH\ja[c!]H#PauTAq^P>iXLu@LVp?q%Oc0:ai*mBZl8*B+ph,_K3\1)4k!<]58koipB>erg5rli`IJ0M8/'p2")DoNc\<(&Y:.$DEPlk%f+:)3]hD`i>)bj;>5'YYMnN2go"[1oFrLD_'fRC9[iYc(Xur+6:Mdruk8ja<oS4Y`IfZA),XI1WO\URS,\LLZNe%5VL>^e]dKA2]#G1"&c5Q)1Rl%MtGY4.4p[_Pl]%A=5VdNDWi]Y,AeD(f%7s=tJZ4!\^n;-?$0Q.l:+60)+#@=2%59FW6-=Y<i>)ebq<fMOO6Q=e),%*TN\KJ%uNF@?Q'0M#/m_EY8t/FMWZ#UTT@F>0L[`b`!a2"cLHQM2U1P&t^J@1I`_h12RiOjKm@9(8,`Sk9"h=mYs_/=/XSq[[o5o+#):r("G'l3FJ8]h-jbo>,@q]nA6/U33G9I?pc7@\OhoM!FsD#;(R+*)c@qS'T#p3%;hm3I#\-r^UKPnn`ANQjY<IRk@jSVe':lL5:nbUfd>n&]u'r0/$Ol\W6CcY'a=QEAaOrI/0*P//lnd]9`q:kZVY?[@h_,NG/J,fX[]>rTV1aGo8$h)7>k4D5ea\*4X`[Q;7j(R9YZ;6]4ShHUd<N)q74$dBM`U`T$E,LMis;d2S'7E'\CQ?0+JV:d.)VqkK^Vt!mRPp@Ur/12?eY5V8LW2lW_b/X#sa!r$CAR('W:7*qZZc\.QmD6M_Wc634X.)3/HcE^dU]Rh2BKadhMs<Xfd81$-tP/JX^e;J,sE#mmqT8k*EDWbpGe6LoB8,Tk`eoFT/&1s'"602rXb2(hQ\a/bhH:?[)V[3>5R'0&7nTL`l-O%$I<#<$J5E]`[L>p^2*.-'GJbXU;gbU\Uu%oFgL-c%b>9`ji5_Qi0Yk/]+#l?<^LdN8TdjbUuI<ML]S_%Obm)gDe7)ormd\<8>k`%h?t7"IcdoFc7=KFp5/\9UsTk`\\+mS<JSbLYEp'F#BTM]lHkJ0%)oPt)_XMBhqCP?PrE"G$QCCFY0!("l`n:rXq\)%(c9f)U_O,OlOIA]GJs*WlBrrGjiqL_JOH1'Wu/N$3ZJ<\('Qj,L#a!9PUCcB3Ah7?1dD6_75\oMd-Ma9*$)a05Q/p`Q;"[Ujb.I!H,jm6f[8"ankTrtcY<(:8jl>,0qfp=`eOi&.(<OaId1$]pTV$pVOi>-9`D&k4DtQQn+fB@Q3'r_6&29Qo>VT=-^b-1L)&A#1X<ERX54E;-(D""6f/>CPt"1.q!mS.5tk7iOTP%<K-UZC%%FE<O+@30V#q_[%dE2pA6"9)A;X<#;HU;[Y9?blt%8*0qKedV?TUV@*!0Hn:H*mZW]">DJ^'PRdc?G38#kUM2n6Pr%THd%b3f(eq\Y1<o]I=3MY>B8t'`C?G:1\,<Z>RY-(fq8gVBiWomn?Mc7gbi^5,.3IrAFMt5?U5gXFg3r73oiDG*g1BgTM04%#arosN^k%A3L^E(adl9q*1\bCbJ!ZA[%;"_8O6oD^1^FP7<q$X+@^=)27JO$HTC!XlH`kg6`A`m9:Cu,+h9t^2;/VH);-\ldM?3^4@\N7e"aTS<>]<LN,F%GX9%.g:r2Aa#3<F0YNTV5X!<?<cS1)02I"(q[J^639lR;C_WD4YHm0%%k!MR,Rd)ZZ,QBeI(f-cGr=-Q42KmRorf!-A6'Z'bnV4uXV*13OO&FsdH;2;i;kkk^RCN]!X?><"016d0KCcL]D_?I-$^djU0Dqp(5C"Fh[$?KhsgB2FICXl@<F(^5Zbq],`A[@?ARGWZd_<):A&;3N2AHNA%UlKf*%S@`9B_[MpD97jS($d]r<B9/*7N,[!(sl,rP8d]p8c`C:q00*B4R[CKaAiHh0o"QJP36LZ:i"g=>Y?nm$ePhD"b5-n@e6^(&`#6`=NV5Wo\'Oqk)W=^QlgDgNROC>9R%\aE76rojN_hhT1.%K%iU>LiG>5'*1+OUH2WO!!`SmNY!\0:+KJ0q>R0HBaK[c%R)Q&*%`'b^5[&eaE,dA_cKk\mA7iUR4,OErURp]u6N0en\?jCJj:2tH`<2Od+&j@'5R*_.+em!ca4m/^fM8I5j@AeV&.BCgb^QYX`EuX-=f_~>endstreamendobj11 0 obj<<--/Filter [ /ASCII85Decode /FlateDecode ] /Length 2981++/Filter [ /ASCII85Decode /FlateDecode ] /Length 3197>>stream--Gb!#]flGh,(4FM1gnu%aN229Zih`8Xfh%]S@RX2SI`Mmb66b,/_#U->FnNf$\KE3!e*\oh;5tV6CbF@bQZLFU!p\bmn@t`Wk^6,Y?Nh-s1ga/-n+:=C9pbGf?X<kXbJ=`#O+Yp,&0:8Q'+XR$R(iQ8<\H./YT"[:@F,G#pZU+f*af84IPc*i\iZ\]3gQ>oD2[PG6I$dM$J2#qLVcT?LU.NCb";GWF?@)5r(Dr')(T-<=gVioNEW(DEg[Y_L&49k6CLYKi8qLOCf6i$J_u91IFk3_;<a7*?N*:_heE'33kDl5(q40>$O9%FHTQ.C^/FboMsSGERDg`rVn.hRWA"qeU*i[Q(/9b5Ue>64gX^4>[email protected]>lZL,!G2:ka?iBrWG%'R010mGKHjShe[IGl&'/[j#MRBnVCA_MiU/<9:d.t0&0Kea^pCDPr:\g4W-_nkHrhPZJ<PEK7DpdqXpL-#IPLK/!(qq%L/8/,jeD?]="bTQH9o>V1<aX-nrj1_Mk]:]jm,u5Rhe1p+Y7mIMHF8b2>Xpa=>fHnJe*Q5+G,2Gg<?dJL>tluL[+=AWRHjG_+m?"^/(+kMBVdC[Jpp"dg[5!,<.6KAVp,Ec@O!**N1csmOiOgW<U0Jb1#0<tb:<Lk-Kq+^K72-@33pCM]2TVr-Hng;d^F'8;RmrJ`lb"JQVn]h@7K!cY^8Uu4Bp"$Hc%!#]aZS9,+7k%@]@VD=[a$i7RS3Q1mUcP3P&9m/QAb*k#XZ;e\*dn=Y+Bpd)*`:"=)=;n7\d80cZRZ@cr8VWlb?oEp;6.mBqftI45=1bPak\Z(noX486;k9",]l@?jl1P*\#Q5XG6C8f6P6I6%T?9K"N^>TDiX0tL0nN@%^l=09qpBdJTN7gC(@^nuCTo/jKsEJ2eNKK"8kr7!qJP)V4b0eE/NeaP*?UYs]TR*ekd1aD=1U0G*bd19aTmECfP163'RbX3H-HAla#Eo13Ii-;ahe+:beg<MRiI:[4uH=+U%Pp"WOCIAQW8*BT)A<%XgcrnlD6Z38Q77\aH;_P4.A`R':(@<mC:)8is*EU?tOI5DJ$fMED!4Se@aJQf3AEVkQKV#To3fuLC<K=^GaJ#"mJ^.39q?)S+0>7\gItH6Z$f(kin\0S<#Q<[XGb?`YS9=.BlSZm)L0NCp^Nc4Ti!dYap/K&3#pH#epMYtn/!r[9;Ak!%;1tma>?Du+.Y2]gI-?9e0#<`)V02oK'cCj?'hK-d74N?4g'&Bs!H-=Tq0,:il(cYHh,<?._YL2Tf_VKncSpDXL>o7CNfCfmnZT0jn1$hfP9M6b,d5<bQptM(0LNBC-tqqZ*Pb!A_Y[)EC:9;=;ebMsN_OW#Dd&GQ,%j0^IElWO7c%Wc1lsU.Ba#;I<^%BB%'s`,*+RPTX`>5VP4J2+CkbH_LUaNP();@A6D]#/LR4i[OSK+Ci]'n3`7#g"Fq,nf?g0>d3l*]jnm83+0O2q==ZD9p"b)4foo(JCd.d5+\7'r@iubDY^&^gAJ:hQ66"ImO^#%<qcS(,)SLM(-o"52=E=>4U&4jr*:5,q,Xb8g;86UiY&L@kh-"mkY_1%9l<[IWIS/?H6W#ipTc\GIga;4TmKS;*4LL24MCklbM>Uj5(!N'1=]g?GT9%P6iN(>B2^Z3TgLN%-'WU@n"AV-=DQgI4Yp_Y0El:<Uj"X!\qnDi*8Ycf^=?oa!HQL\(Y\0gfj!Ph7`j5NDO\FP70QX$,!!K(T'S`k/CB9/-$^cEV$efU/uS9U,h6aUtC8H-6*X*8kLUArefaQ1V,;:n7IXn9Rm>,]Z_XQ5j"8.rVm^V5$o)t6,Sj[6r>O&)Ar!-br["f"5.qGrtg$3TT5^hf7r$B(X.d<TF@\Co:^8>O4,VUKm:mn\9.:<,/VT=C3M@ahR0iM$#Ia;%`b.Mt"dg$_)uni-`j.3R1GB!60Q,)@!b-0`o$0X]'Xrfr/6db/g$+]^,Ti$.BZ(b4@)eS2Z0"]`p_dP4\I^3JO\XXPcPe)q,7'E?<2c,thdnWfq&$a04QepJijV[(]^+A&9,!9TQo1*gJ.%sD/ABY>'HH&>^:6I**6nWr#dj,q[9-ED8"a3Z]0>aM2)NcuGWD(nPgdk'ZYnEZ6%nWNW/)s[CkA?]:kGDhs,<nmg`^;f/Ye^?(R0?<\-$^sb-hVr;$1j?-pGt;_`HHR,Ts68hc\Smp&WH6"#.Ab^]K+%rK-(1Bc\o"BGaOt>qc5Xjg:MM%7f+8dJjLqc\3[9+B`CCjN'1=C0P-%J>UZq[sgjAq\C>qVN<\C9@E@jjf'h#E=(+FMD\tDVZ$;0$AM`joZV5doXT*TQ1;C<*rY't"DPhV'/4")p]#uKS_<Wd&,qA>Bm+i)!%n5E`RY[2Q]mIi^%LcOOLMRaXE<K1K%^Y*$'c?rSnX>fFh_D="k5$rP;T/lsemhGri>.LFmF)_!$=&A,TGU@uaN4"8jf-3p8S<7TbQ=/4R1-sr:.pF]7]nTeI08(L7MOS@Yb"+-.RKQ=:*W?bLGS$KtL]j(;YnF-pG:n1N7^GlMkhH0$@H)]E[&(<7pY\)5S:2E.q%2tF=0thIN>P#F<?ef5Sq"iiGe@m=n$b"+XO@"F9SnX;@m,N"2:ff6r+oBqNt_@qjIE2o;(iKL2\c^;WlZtD8@?92_+FE#p*("+."jS'$XMKOBOn-NCQAYf2P4dZKW"N)q!I;1E22.(JV+Nd;#c[l#("!-feo:R\G(@"W6'5ng-;$GH^bT$PF24%!95D64Ni$8lTM:"#Tko\jIg(0'K>,G0^Sf6[eE#6i8qqunS!Aoo=eX.PjKju561u#6\t293!,fRW1a!pK'HDGT'HM_dO+TUH+B;USatH@#K87=32LH!ANprE<2LtE+>Y.;:`k`a5!J7MiQl@abR0KmD23LUkQFk`gT_+DD!sdO#k<MCS3;a8PqS,q[[ToRW.!0<JAugCGc]m0&]X>(;%mWU87`"4Q@F*?^%`Zj-qWn~>endstream++Gb!#]flkh:(4G?rc;Q[XD&Z+h6GepB!+@0!fEUb2^QbS#<CBlEW_shoF[*V7WKIK/(Vq<f$=Uo6U`+?0^%XN%;&;HZs.(]tNi2O9AOKBhdlBkq:7nC"F>eR<q+4OM3>gc86$Lt<0`]f[@WO&spn6*2kq^K1olJ&66`3#a^OpGgc%;Pd2``qn(JR-a14T>Zr]8Gn$Q\e>?E)u:H?rhqglZWC7d";^.Z[+:P!kJsWc7#SiQ+QPAC?XRQ"E``nOX[KHDsi2dn700Ecin31b+Wr7CJF9,uLI;Ptipm$PEhM?j/dJas\Y9.not;:D:t2+.]H!fo2H*2jRL4at]O<,sGAH-+K)Z-*=PbnS>i-@miVW/AniO/de"SOgV>#kuE9bbHc0:OOIa?Jp4<@G%$jH,OsW]bnV)f*Ib`nh=,\CGch_37fM]E94N0+%,t[\*Z]Q"8"H?_oYcUIk(qmRNB<b?VWk[VPJjEJ[HQt[1t(CC7l_Ma:Zr[EI!pJ"U5Oq&)I8uq`[fl>CMhnEaN;&P(+j*tK[j)UU6RQMN_/C)ALSEI[N8[]3_<J_[dSPoB'W\<Ic]2@<o::JC/h_p``cI,V^F&7:ZB3PhL(j%W*$"X%ZXdu-^SP*:3'X:o,JN]d4p\!a4QC!9*r(,[Vah=Nl$Md"h(?BgL/Oi!5F.hIjg&`'R-,RX2]tRkB-n4]:K?WBN0d-]5>skah(E.7SE9L/fJmfk[C?\Eird?52T\-c=6X.7OD3U_W_,^*9$@r)tuAj/qr9Q_hJW>LE!RIJJ6G('E)9W@Xk)TET1_5+K==;RU#g=k1n+E-k],7j3t8/b^$?m7n?fn24Tf4!?5&H"6<!%C3@/Es,\^J!<a;`Ot)q<=^hR=@,YXfGp))M;E/cbV`k=&,8d)5K7u\8>N(g;.ni/>AgRk!gK/U0>a)*a`MiI?;FW8VHCD.P4*[iM&,;*JpD,a#9)uLa43W8o4/2ka.jL4bIl*F3i$$o+X(Eh_DZ'X'(cr08Q3s,+ZnNrU^dsD>4BjF,$MS,3gmUGY(!J>0OH)K[?@aKfF!Z'7*\U.0S_Q&(H#VEjVZ!\F>RdPO$A23I!?QfFoWDYdH:B!:JHOM>QZ4pD$C;W9WeAb6d&V<GY,n^]#o<`;dp21t7]or8iO"O4L6jq<Cf09FZ#$d8'Z6e$Et-H)573G,^_r.)9Ja9Z(qpH6rJg1=ATMcjVHd((f[ten"2=FFh\bMp2UabCR-F/&=Dd4>hnCj(c+PdY.\oU[IuS+BqWPd;OXuTJ#qMV$Go4d]-p]oaS9ee<W=o4fkKu2sDIi"1e3PR\#-$:YYRt2\"`TsSVL49]Xb.]<oW2'D$#%%G;'7M#EbHY;T^u9k3'j:sNGkKj5!X%jKg#QDEPI(k#>l9f4A6S9cFS/2otJ1Us7uV^qbb;d=9)tn?F6Uc<_`o4Q+2<1,O:LQ'Hsje'Xq2rZ<q!f0WG9(62+e%L:Rdp5$&Yc)9?a'[8^`]oZCDQG,P;S$ZM:fb25#/8KWp2h9@3M//j,B5E$Y%!j`T[>GW;Yho,$mfMHf-,03?\,X!NYb+:DOE`HRj[E'b2l_5E966Y=d+>u)]akisYpF=3q]%f4rb7`;J!//5P]XDY;4\j!!dO$.KE7&4X62/2L];EX_XBO^/GC_5(Df<d1fWdRBIf6RN!i-JZhZGjnXK7'(2_Z&gTkYdCIP9Pir3,//9@TZf-eRPqok2Ph_tQ_S$V0GZJ`!ZrH;>5j/t,NR2Aepp#"[-l6g6W3jS,#.*=b#OH$h%TFJdtOb-N-3`%_N@59MCn3"b.f2op5Nm4ZBjnK\PH,tJUA_0q3K<Y53]:5^&5;EM/JZQWBVE^fD@YS>(ln1#6c*NHqqY)IK+OF!br!lZH9?-<Z_Ok1TZV]:<!+ea2en`/_^M9P/M=`*pJ!M&ID0T8HhrIt%F`k\g^08j3uLHeqa>IECHbhE<j'"TKhVg?4&(BhM6ibS]m9JWYBkI\_AOp";\gt_ZL36-k;aWs7nVh!cV#e>9!LSO\6F\8fD?ghMgK\Jhc*odR7oH5[[O"i$qUY`^GJ,9Jt5S_gT_qt:(DaIum8K/f+_kul+adFie]`H%u=eW&Gq?J$B<e6ShI0>,.(rp`I$fCnOY:arY@HiX;nlVt4p=Y?FXFL@m`Bd*bK8*C<#EL`n!ba/OD[L`sL=lYY"`e:]8s2sJ#udn!m;GS[.D=O/*)a1@%PE>[8h4d#>+MQq5nHBNV,!G-p4`CpCCN995E?m>i*ZA*L1qDmPaS^)D,kVa:T<Kk,^4N!qgaeKM@*0$N5f_lTFJ>H+$@4O6:Ho:B/3e61#jk!ji+,]8"6T'n5/IVj2aY8C>?=(qhDq0VO_<BLJhJ\r.8S:nSG/rj8S#`MOM@Ne=[!apoX5+`m-3^:8V[%F?R?aK5ZsNQ&",,+4:KThsd!%J,JS'i?)B(s6pTFm8?]CH`)]1ImYpH+*!c($`M`o6Hq%%k7;;S3u<toIce>*I<n;/hoh$<$71L0Q6R?&E^\sP-(N.!F!$-Z%m<IH<e,sKb4;>6@1.\ZZ_3Pr3o(J@8ZkZ$nX70H06.\&DX2H]6A5kbfKo%U8:V#eEgdM4UlQX4)M1%3m/IhlGZZW3%=Ps;*&3//:aoHH0%;fY*!IE1B0@^p<Z6+Mn;%Tgph\nlIF8+_]i>K<rlcd\2`Q6G.jp;1qLSB\U(tnd&pZ+gN']T`#Fj9Z#p0@g":Ne]pJ?\#R5":_Q1%Neae_@gFGUL=^I9A2Leg9&K$3sh$!+rJ(VKm>fm=]\C]ML0nNJDUb1s"$n/Q4<h`bF#KR;VlD,ad[VN=M<IKn3q7:*diD*Atn&,EK'o_gc_Q.al;qI!L.O+R/\U+1<of#Mp+iE<i[W81_&ZjDY#;@mT,U\]W#dXucU7j5fR>3O+`,E]7^Y'hM(bC$DI4eC@Hi7lW;:a<>bi#i02i?MFL[R:=Ook10\oVUa,.I-npN8&,3CeeC''*HIJJaY/QWNYrqZ64MDc4GSnV,>s6.rk%@gYI?LK4h+N:I`h)X1(f=7baf]0@8V5l,+&"4Q9knXaKEcnu3]Z][.OLUs8,2nldcs3p1"f%dI/bE),*5X$72A;WSY-6"N;QTenq6qtRDq#`!<G@o<Xt!q24($_;eNF^&#MT'[Oe4@R%n.n;[tX,=G"U!I!6.IBm[!?9K&T6:#26AR?[HIr??cZ6Q!>g%'a:/Cio0%J<N~>endstreamendobjxref0 12@@@ -83,11 +83,11 @@ xref0000000902 00000 n0000001263 00000 n0000001328 00000 n--0000004769 00000 n++0000004660 00000 ntrailer<</ID--[<858ee61722a5f5c2c69b17e80403fd90><858ee61722a5f5c2c69b17e80403fd90>]++[<7629e1a2f6a75fb70111c845e6802214><7629e1a2f6a75fb70111c845e6802214>]% ReportLab generated PDF document -- digest (opensource)/Info 8 0 R@@@ -95,5 +95,5 @@ trailer/Size 12>>startxref--7842++7949%%EOF@@@ -47,7 +47,7 @@ endobjendobj8 0 obj<<--/Author (Alex Frison) /CreationDate (D:20261021063644-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261021063644-07'00') /Producer (ReportLab PDF Library - \(opensource\))++/Author (Alex Frison) /CreationDate (D:20261106171201-08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261106171201-08'00') /Producer (ReportLab PDF Library - \(opensource\))/Subject (IT and Technical Support: Linux and servers, hardware troubleshooting, customer support and escalations) /Title (Alex Frison - Resume) /Trapped /False>>endobj@@@ -58,10 +58,10 @@ endobjendobj10 0 obj<<--/Filter [ /ASCII85Decode /FlateDecode ] /Length 3089++/Filter [ /ASCII85Decode /FlateDecode ] /Length 3000>>stream--Gb!#]?$?rB&q/qEeD#WsgXtns3;^!.#tnk:"P^`Y3I-bAZ7XM\lB0S9bi-V2/ZIRO\&jdh#N.S=5GV1Wh-7?</Sa9`bC@M\dH_+PHIJTh7$BX=3fOVDhU1lS`Et9%jceLA0(u&@@imA^HDB02T0D*1BbiA+=K>W?9p69,8(?8U[A+M@]JiOF'tl?ElKffk^=)'a]\>sS]sV?gd'%VOb+3GK]Y,Q6h[c3bB[@#4MScMC;;&hNX@?QOFM9]"_RW't0N+FUV!khCM7WK5me,o5_4Zi^!g`hD5N^hV7ODDdou7.dHm*,PCW&8^V6X0MPJ1t\[^T(N=\Se=&%TnJX/Rq!a2r\aVu"!TDfdLR2u,N?di\O!66_oH7)mDD`?M!qOltH."+$lNil^/cdTjYj)D-Z2Xl'n67MjNAg83@1SuY^n=Jo)3aG/=B^$:^-@U\5[c?:51dsgT0U3fYdp*Uf/3^"LDrjusd(,@'"fV91!rkVsY^X9f'AH(PP3WmZp-G_q@/^s)Mg$i<lRu<i!MZI+1DrEc^f,;+K-juG7,8+Q.WJk_jCBLibBJ"qCA;VqU*D4qZ<uE0^EfmJRZ^V4Ai(Gi/:CEH_#iUV.a25r8XBM7oNTa:UlrqJ`)J';AKnMEHdUP&\W^Or[`Y3_3&Ou[%c&3iuQ#e1O1I^X;j@cKg`[:bgORVm:)GN#TkYs$MUe8-AS=i8SgRt78@4K"M`K?`9f4%B#=Su'#V\X).b_QX:pscjGeS&REV5tK$$3sgMF(&A,H7%f1G1L"R;\JQ2V+drWSYjg!nNTV7;fm'TE>XWHR7PnJrWrbc3NWrf)Xl\(f'6@G/PCf:JeFY]j0^`gZSYRGYn<![9;D81?^-ZQ%i2*7DD,A^9EJ[K,-kUNLgrQBNUiEq::3#^e'M8DK#eq&_QF&9fYj=$P<"WiYFUeaf7;s=*>^/BdqT1n:9'lJlKS@f`bOXS)Wfnl*.)/FWR_m%RLQF)MJYJ9WG^n@`S_=Bs6&J!]CCmjgOj,>EN=dh^W]FGlnU9D$D;3HM:m[1#KsSMGag>sr->GRIr@u^5&prBe`_;d!YBn`mP(f[Q[13EEb0DDKPV=A._(t@q_Y6W:PmebOSWfQ!IrnZSc'VbqL!/^Y%2;9ECi_`J\/?#3o>:?`!GGs$Ij4tZ6Us5lrOEF*9m5bRMm1n\sU_UcYG7b-PS08'NHbIhg6s7MeOBL8U;Cc_%D0UgGD#SZ+Mo7<4ubEMV<6aXl%eWl!5>%7%_/ZNeo>AS=JHr]=5ZiA`9W"1Er,m^M0rT0M@r)iU2@:N)+MMbJ2-_R%<?#,*PftpGdQ%_;[NZ=f4'#<qO="jdbRd$O`m@n)\oAHF@ui:@:?bV$O9@jN0HLiBK1<Isb=mZaXR,O%=>+:,Ol]Rb?Csrs2AGHkjg-n"&^.1fZ/U/==UfdHB-!*N+rZcO#IbWUiO7F4Nrr)<h-:/o(IhR4T%@q5#>E&W.7@>/X)&5R7[YP+GU-bK#'k1o.#Aq/9hpIT8CC>LcSrJSP<&g>RTp[.1rXZi9KeB?-d2j7e>L]/FO*4R]cRUJ9nM\E3T,b6O%*;SD`i_:!DfH0UbG80V$rH\XXl&3@h#:U!3Ni5\XEmPgclhfoO]W&>*t8ZgF:O_!j0An5!p-u)47:4k?1r`Z.C^l%>.AOV8m>D^s4F5'2JQI4ltIc'UJNIK*pXd^7=)XYu!Tk?FgAM#[!^/l[TQ01HWd1HL`JdaS3fW;"+>apsgk/A!_*,K+M;],rr60Z:kE6F'*AdQ`T/P*lXHaZ1InS2RY>;>3s5N"t;5_(3hic6%e+OITq_o$e7*8#O>Bdi>B:gj`ZKkVr1)?q]JX67>ZBXU%DF"rQ@h9&&7Mj^_d:17ih\XQh8KE:e\<,r.8MMs!#Y*28WHsrX&\fm!JkWoS;Ks_X,:)X@0`#=eX,jQo`c*0CAecC^M]U;p-q`4ZZXKg/lV`$9C+S4,LQ_grZc`KRPD]d-QjJm:PN!@J5H3L_qA9%;66I`SL5i-X5NZB[]jDDHJ`OSdfGYXI%SEOY@IG:9++O'NQ[tAGu8#TeF:GIJA`sNV;7]^Zuip_I("0BF_VP8ul/mgupNQnmpfNKlHjm5\:e[gbJU%Ff-&(pJE**k^p>9iKQMKmmQL5d;*(FVQN8-'-#gd]a^=N\3_J6.dL.[8L,FA!\\"-o$F@6X#Htus5of\WP7A-;ZkrcpI-2,XNo(3b&-4.GX+V`i7:c;f<-u.F3oE[/P'lg=O4jBK-oRee2,M5>'XMmP2I+_V_V'?\ocJVKN-XsDUUK5h?b1+"%Z:qIui%S7;-tb,j4*Y$QK@#"akmXF]QEdkGESAV&Lga\R\crF=?^Jn"Q4P6KA15qZ[8KHB<$Ye#&)%!\EJlD:cZU/0U3tK`!c%M&+<cGS<g$@[X<CLp@`:]PP"jZ>26(TW]P5'>T_MnZPC(biqH4&*,@^AJf[Acq$fZ==tcO]m1\^Q\&ng/AQNGL.faV2[:Qbs4Cpq^k/poIP3E@;tOjejh]C9N`UKS$#@Q(SbdG@\3dZZ.Z\4DCObjGmeoG?52ok'@<tiC"-m%Md+MhrJ%oa_J!Q;EL<#F['A&#PSr13&4r))dnd^;`eV*AqkTKA!IgbJCDfcq?+')O4^#KWQep6VK.%`@EUSEsLff>;5!C7E&NF2_e>^ll+-[3g/Btn!o*mGDQ,(M&!<S8FX;_Mt&BiO1ukcW+fJ`L6kcZBAtKn-IML#p@l9EjXcro#=mf-Q:l+CjJ>"f_YtO.?Rph:Gd.,+]mC_@s#k4_gim?.^+&R0?C:]M&09YD*t5jc8#P7l;U"rRfBkM(P`.#b:ABP!nAs]t2^I\P[B*&`fmVZd#04XFrL&m<!.0s-V4tM">&4#btG78[LC/#$W77C:@ib5D]8Mo@^?T9oTf`AFPj;.3AA'`]eIZj2U`'^FnkG2j_n+4XZm!:s=g&Rebub>82fl#7r<I-t:KX13VQl"<'F^i&10aPUV(X`f/ctQ<XY(F)BdZ*!>!BGNkI^I:Li8`2+inI^S[lD\[$;HlXm&_Du>9425P"^Kp=F[t1L5$F`A&F!o-AL<Uj3pm2!E^ol`=5gtYk!ICk4q>~>endstream++Gb!#\?#poE(4FN4\8U^"!hgQlNV@"?m;+lu`t"2AVTLQd&YN7^lB/Z;8`e"]\PgoO.jhF/VNRa*FA'4&8*A`bg@uW_cQjf_4f2;!,)ThJcRA(e\hnk+a5[tc^PJnT]0/:3Mkeie2W/k]h8>jJ])-@-05t#mTAQ>^MR-fMpA+&7ifeQj>$fYsX.7:<deF30s38tUi9q\C^&D=i0s2eXq7\?klL+tO&bTAEU,Y]O>%R<BA.AAtTSoA''Le]A#qO!69DXB5h09aN3k`4=Vr-CL,6:Mgj,]V[[["t/H@"lX%_e0+Q*h6g^/EW7IS&GJ[dD:=Yp_"!j]O4B:MM)UgL>GHpSklep0,)9]A*7QKBZ)p)3`.=1mZ6-;i/jX.eDHJidfmbXM"6[S[;HpX$I,%Vb9"'$>[e@Q>U,)!REVO.:$@[Buu(r]WX4k3ZK[XA[60MFZWAV/UkL@NjiisnapoWr+he?#al5Lp1T;L^[mNUDtq'`R9uI^\'Gr@-MZbt@s32p<kPoRai//=`DBi%DrEe01`7$N;!'Ns<bUS%;An:_f+qh^d7Oc3aHft`2jCJd/2KUnjW[q-bH3"6J00*gS<QYC#[rEFM(%F3<maG;,5t[L]+Hfl6.oLS+X)l+b_W?B8h6;U=MYL[@DlO"XOJ.lcE(u=/X)ns^8,L]I0.b.#u=p)2)L#EKhCI/<!dJ2+\3R8=u7X@OG^6o3&D<0>2n`KLL3VSW&Z@<23QBk[Q6@r##252P0Ga\_8)nPQ`^UgVfF,J_YN@p8n*:TOD-;\0JkmTr\"Ra743j4#!j,h$,(r^:FQ"@0Le,ZfF*V.1PrtON_5'/,s8lX[M:!mYYnN,&I!TG<j=*GQ'Ea=*)M:C:;/EM7#C#/A3iYH,ZnQXnrKnENE=`Y^c<Zla9jt^??<'LN]T<L.h'ARY`[,3"jNql.9!mVjT<#`e<4J0q>`Sj2>&W).cA&]13)TtR*2/I\up%1CHZ!&]A4iA#*2aR+"-O6NOB,ZoUht9UBmLkR+pi8bCuA8"j1"L2>_h!T_Scun)EG[\*$6JmqeZI7nt:+X_FX4!"fe#*o^B$BI3d0=(S9raOXe$K=_W):P6[3P\AhZW>E/VpuC6!me>YjkAq=%8uD"WQW11&Y\W9lMk0<f(]h9U!P0mi<a^X+rcI)8O\%1%D:"t7j`I@_XsO"8E,f#[;=1ZIS_#'rS7qFmdd%_T%f'VaTu$P]j.dKeRPfEAd'h29Heih-hWI1#o\"Ro0X(_6PEQ6!pNA6d/?ES%<[8=A2_!p27Z!$D]H&e[Yr29[r3MoPfNAAUAGgHB*l]Q3.)(CsFh@TbXe*J2S23<9@0q,9^&3D_kGr(.ao/i]&n)_Y*j9T%rmROfLNa1gIsVZP7%-bqC;@qlN7QSU-*[%:[email protected],e*Fgclf7DS(<*g@\X!cY>4X9q$^<MUCS:kd=)+o/.nL3r'G_ua,Ra'+&.+J^R8K<SO8T8#:eg-EhoS^kp!(n:Y`@EFHmdjF/KSTGCCg>*l6$%OIQT_QIXcUT9kaFeEPJh%Y;>pn2;_bVhJ_d_m&_'V/2Je=:)u+n8VHA<kKmaEKE]ts:U!2k_2hgOfkWg[^[W5H;B>%LQ(gmITk*SAAn4``.;m0h:4mW;r/I3*4'KSs+Y+mE[l&Gjg7(:kZ&HDQp@c-M#l68/8%/Zp>Fip_Tk?FgABco\^1Sf$Q03_Bd1HYO7YY+OD!"[8bh/.jk/e:N%Q6&7M+iT#TQE(?Mabi\ZN01b)CT+*HT$SnjOGQ27<-GcJ#F0)#m.7EaQ4o!!783QK>V;t*7/t.F!sRV\7&&.KPJ#e$ku`cg<>7&^tJ8ulOmH;DF4f&/>oAU[_gEcE]6!+&-L"f;K<(<b)@K[B!aHhJ$DeZ\j;7*k^a*W$>1kg3#NR/`<qiK.%;[ibV28kd/f15FM4Xh'?;qs4ZZLWgt0b^$9VCrT#BFkhII0.U7Y&lBXZ:)::pC^AbLl7L_qA9/RT']`SL7/kY:"nB\cQNY#sJ?T<6T[=g&sQV&>-Co=ODiJ759@J_#<t>4ol0I&R&(]iO;<WP=pS*j*27N3+N6h_f4/ZJR*KN!c^F[pW<+S&;?;kNi4p00,YD@>r"fpqSE,=G+>NQ9oA4H^p1U'rS.n[Z^nCPaX&(mSm;-().*s(n`HG!0scBH+kU;?d&WV/W_T4nAM&%O?iD6s&0nIAW+j:HkVu!XVh,cBZj+-_Q3mWr:5:u(s%Mr)\r!2kNcE)5#g[uX=Esp=OUeL/4d\X/VOg-r<KjNY7^J?]@Fot]8s%#iaQ=a/)[3r=9_A!E'U0Z7FQa*LF!1LY`!/qrfVnQLSW9d9E?t87<I'Q"el@NR0hd\K.T:k=Rk"01<k6glU5E5*=s_d)J<;g]K+r\_AJa09HcA0kJe6X.mXKZ-mEJ:.bLC#HD<$R<VPmk'_5slKLgbb+$TAUfslGNgm_m%SJfG5@(50/_o*dc3=)C;L7_d/Wp.Xc3^ipiNQaTpJEMRFfRrb>M5nTZ:HhR.obb2-U#&04%k\n$,Pcgfcs>9c>@nVr(nLWYj9_;V5&!cH7mfLYRc+lC+RfnS&.6,1k/sG/2lM]o_o?:`1KEX(:_)^D.jeR3QlpoXW6VftaB!`#jM%0n/`8+gMOSU3NeEr/!*8^X>,/nGjV66Zjklo?rg)H-N);N[&:&^2c]9Q9#L).M0Jf[Wh5rEQS-N0Q-%:a&!4MKPcCr=).T09TT5ZeT*6$/8!pA;aX[V[1X+24;$hW$_jJZ*h`'C2i":^l=F_go&]P!<M^*&>PZn[lnaXZ@Kj6i$$#O=R2T<7PInZ3L;##BL]p3#9O]'&p>>abQh?T%@'-Wal/G8rd;JXDaP"C2nkh+*h=*Io2]\0mfU<TLlK5qcCF_.T3.\=e*>/Xg`0o7CW/5&"qo[2E=Jo<W9jU=]3`C\_Mq"TNhdqaN`g`l;6tKs]OHM7t(kqhLY+e8Bupd5Q$^a:!VSO;=FqUX?W<pPPAFr#_GB$+g~>endstreamendobj11 0 obj<<@@@ -83,11 +83,11 @@ xref0000000902 00000 n0000001275 00000 n0000001340 00000 n--0000004521 00000 n++0000004432 00000 ntrailer<</ID--[<a8f118002d6fd8b1daaf8b897f8fb0a6><a8f118002d6fd8b1daaf8b897f8fb0a6>]++[<50c9a8ff198432236f139c99b051fcc0><50c9a8ff198432236f139c99b051fcc0>]% ReportLab generated PDF document -- digest (opensource)/Info 8 0 R@@@ -95,5 +95,5 @@ trailer/Size 12>>startxref--6718++6629%%EOFnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Nov_2026_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf and /dev/null differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_amber_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_amber_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_cyan_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_cyan_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_green_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_green_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_indigo_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_indigo_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_lime_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_lime_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_orange_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_orange_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_pink_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_pink_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_red_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_red_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_teal_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_teal_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_violet_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_violet_e28027d7.pdf differddeleted file mode 100644BBinary files a/public/Alex_Frison_Resume_Themed_yellow_38b37ff8.pdf and /dev/null differnnew file mode 100644BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_yellow_e28027d7.pdf differ@@@ -52,7 +52,7 @@ VERSIONS = {"zero-downtime deploys"]),("AI", ["tool-use agents", "Anthropic and OpenAI-compatible APIs", "local inference (whisper.cpp, Ollama)"]),],-- "bullets": {"PowerChat": 3, "OpenVibe": 3, "Amazon/analytics": 2, "Amazon/operations": 1, "Verizon Wireless": 2,++ "bullets": {"PowerChat": 3, "OpenVibe": 4, "Amazon/analytics": 2, "Amazon/operations": 1, "Verizon Wireless": 2,"founder": 2, "earlier": 1},"projects": ["openvibe-live", "openvibe-network", "openvibe-games", "irdr-autonomous-bot"],},@@@ -14,8 +14,12 @@ const countWord = WORDS[count] ?? String(count);<script is:inline>(function () {try {-- if (/(?:^|[?&])pae2(?:[=&]|$)/.test(location.search)) {-- document.documentElement.classList.add("pae2");++ var q = location.search, d = document.documentElement;++ if (/(?:^|[?&])PAE2(?:[=&]|$)/.test(q)) {++ d.classList.add("pae2"); d.classList.add("pae2-crew");++ document.title = "Welcome, coworker · Alex Frison";++ } else if (/(?:^|[?&])pae2(?:[=&]|$)/.test(q)) {++ d.classList.add("pae2");document.title = "The Amazon Robotics FC Album · Alex Frison";}} catch (e) {}@@@ -25,7 +29,8 @@ const countWord = WORDS[count] ?? String(count);<section class="section album" id="album" aria-labelledby="album-title"><div class="container"><div class="album__head">-- <div class="eyebrow"><i class="fa-solid fa-hat-cowboy" aria-hidden="true"></i> You found the hat link</div>++ <div class="eyebrow album__eyebrow-hat"><i class="fa-solid fa-hat-cowboy" aria-hidden="true"></i> You found the hat link</div>++ <div class="eyebrow album__eyebrow-crew"><i class="fa-solid fa-people-group" aria-hidden="true"></i> Made for the PAE2 crew</div><h2 class="sec-title album__title" id="album-title">{album.title.replace(/FC Album$/, "")}<em>FC Album</em></h2><p class="album__edition">({album.edition})</p><p class="sec-lead album__lead">{countWord} parody music videos about life on the floor: rates, andons, scanners, AR and everything in between. Turn it up, then keep scrolling for the grown-up part of the site.</p>@@@ -140,6 +145,10 @@ const countWord = WORDS[count] ?? String(count);.album { display: none; }/* Tight below: the metrics strip that follows has its own top padding. */:global(html.pae2) .album { display: block; padding-bottom: clamp(4px, 1vw, 16px); }++ /* The hat line on the hat visit, the crew line on the coworker visit (?PAE2). */++ .album__eyebrow-crew { display: none; }++ :global(html.pae2-crew) .album__eyebrow-hat { display: none; }++ :global(html.pae2-crew) .album__eyebrow-crew { display: inline-flex; }.album__head { max-width: 760px; margin-bottom: 1.75rem; }.album__head .eyebrow i { margin-right: .35rem; }.album__title em { font-style: normal; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }@@@ -4,12 +4,29 @@ const name = "Alex Frison";const words = name.split(" ");const offsets = words.map((_, i) => words.slice(0, i).join(" ").length + (i ? 1 : 0));import fcAlbum from "../data/fc-album.json";++// The coworker welcome (?PAE2): each letter is its own span so the line can ripple like a wave.++const crewHi = "Hey, fellow PAE2 coworker!".split(" ");++let crewI = 0;++const crewWords = crewHi.map((w) => Array.from(w).map((c) => ({ c, i: crewI++ })));---<section class="hero" id="top" aria-labelledby="hero-title"><canvas class="hero__aurora" id="aurora" aria-hidden="true"></canvas><div class="hero__veil" aria-hidden="true"></div><div class="container hero__grid">++ <!-- Only on the coworker link (?PAE2 in capitals): a welcome, then the same album and game as the hat. -->++ <div class="hero__crew" role="note" aria-label="Hey, fellow PAE2 coworker! Glad you're here: the album and the break room game are just below.">++ <span class="hero__crew-hand" aria-hidden="true">++ <span class="hero__crew-ripple"></span><span class="hero__crew-ripple"></span>++ <span class="hero__crew-emoji">👋</span>++ </span>++ <span class="hero__crew-copy" aria-hidden="true">++ <span class="hero__crew-hi">{crewWords.map((w) => (++ <span class="hero__crew-word">{w.map((x) => <span class="hero__crew-ch" style={`--i:${x.i}`}>{x.c}</span>)}</span>++ ))}</span>++ <span class="hero__crew-sub">Glad you're here. The album and the break room game are just below.</span>++ </span>++ </div><div class="hero__copy"><p class="hero__status hero__in" style="--d:0ms"><span class="hero__status-seg hero__status-seg--now"><span class="live-dot" aria-hidden="true"></span>Now</span>@@@ -226,6 +243,62 @@ import fcAlbum from "../data/fc-album.json";:global(html.pae2) .hero__album, .hero__eq i, .hero__album .hero__album-arrow { animation: none; }.hero__eq i { height: 70%; }}++ /* The coworker welcome (html.pae2-crew): a hand that waves, two ripples, the line rising letter by letter like a++ wave, and one light sweep across the card. Every animation is finite and fills backwards only, so nothing++ keeps a GPU layer once it has played (phones painted those as blank boxes, 2026-09-26). */++ .hero__crew { display: none; }++ /* Wide screens: the welcome sits across the top, close to the copy it introduces. */++ @media (min-width: 921px) { :global(html.pae2-crew) .hero__grid { row-gap: 22px; } }++ :global(html.pae2-crew) .hero__crew {++ position: relative; overflow: hidden; display: flex; align-items: center; gap: 14px;++ grid-column: 1 / -1; justify-self: start;++ width: fit-content; max-width: 100%; margin: 0; padding: 12px 20px 12px 12px; border-radius: 20px;++ border: 1px solid rgba(var(--accent-rgb), .34);++ background:++ linear-gradient(115deg, rgba(var(--accent-rgb), .16), rgba(var(--accent-2-rgb), .10) 55%, rgba(var(--accent-3-rgb), .14)),++ var(--surface);++ box-shadow: 0 14px 34px -22px rgba(var(--accent-2-rgb), .9);++ animation: crewIn .7s var(--ease) .1s backwards;++ }++ :global(html.pae2-crew) .hero__crew::after {++ content: ""; position: absolute; inset: 0; pointer-events: none; transform: translateX(-130%);++ background: linear-gradient(100deg, transparent 30%, rgba(255, 255, 255, .16) 50%, transparent 70%);++ animation: crewSweep 1.4s var(--ease) 1.6s backwards;++ }++ .hero__crew-hand { position: relative; flex: none; display: grid; place-items: center; width: 54px; height: 54px; border-radius: 50%;++ background: radial-gradient(circle at 35% 30%, rgba(var(--accent-2-rgb), .30), rgba(var(--accent-rgb), .14)); }++ .hero__crew-emoji { display: inline-block; font-size: 29px; line-height: 1; transform-origin: 70% 80%;++ animation: crewWave 1.8s ease-in-out .55s 3 backwards; }++ .hero__crew-ripple { position: absolute; inset: 0; border-radius: 50%; border: 2px solid rgba(var(--accent-rgb), .55); opacity: 0;++ animation: crewRipple 1.8s ease-out .55s 3 backwards; }++ .hero__crew-ripple + .hero__crew-ripple { border-color: rgba(var(--accent-2-rgb), .5); animation-delay: 1.45s; }++ .hero__crew-copy { display: flex; flex-direction: column; gap: 3px; min-width: 0; }++ .hero__crew-hi { color: var(--fg); font: 700 clamp(1.02rem, 2.3vw, 1.22rem)/1.25 var(--font-display, var(--font-body)); letter-spacing: -.01em; }++ .hero__crew-word { display: inline-block; white-space: nowrap; margin-right: .28em; }++ .hero__crew-word:last-child { margin-right: 0; }++ .hero__crew-ch { display: inline-block; animation: crewBob 1s var(--ease) backwards; animation-delay: calc(.35s + var(--i) * 38ms); }++ .hero__crew-sub { color: var(--dim); font: 500 .86rem/1.35 var(--font-body); }++ @keyframes crewIn { from { opacity: 0; transform: translateY(-8px) scale(.97); } to { opacity: 1; transform: none; } }++ @keyframes crewSweep { from { transform: translateX(-130%); } to { transform: translateX(130%); } }++ @keyframes crewWave {++ 0%, 62%, 100% { transform: rotate(0); }++ 10% { transform: rotate(18deg); } 20% { transform: rotate(-9deg); } 30% { transform: rotate(16deg); }++ 40% { transform: rotate(-5deg); } 50% { transform: rotate(10deg); }++ }++ @keyframes crewRipple { from { opacity: .85; transform: scale(.85); } to { opacity: 0; transform: scale(1.75); } }++ @keyframes crewBob {++ 0% { opacity: 0; transform: translateY(6px); } 35% { opacity: 1; transform: translateY(-7px); }++ 65% { transform: translateY(1.5px); } 100% { opacity: 1; transform: none; }++ }++ @media (max-width: 520px) {++ :global(html.pae2-crew) .hero__crew { width: 100%; gap: 12px; padding: 11px 14px 11px 11px; border-radius: 18px; }++ .hero__crew-hand { width: 48px; height: 48px; }++ .hero__crew-emoji { font-size: 26px; }++ }++ @media (prefers-reduced-motion: reduce) {++ :global(html.pae2-crew) .hero__crew, :global(html.pae2-crew) .hero__crew::after,++ .hero__crew-emoji, .hero__crew-ripple, .hero__crew-ch { animation: none; }++ }.hero__tags { max-width: 620px; }@media (max-width: 920px) { .hero__tags { max-width: none; } }.hero__tags-label { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; font: 500 .72rem var(--font-mono); letter-spacing: .16em; text-transform: uppercase; color: var(--dim); }@@@ -338,6 +411,7 @@ import fcAlbum from "../data/fc-album.json";.hero { min-height: auto; padding-top: calc(var(--nav-h) + 30px); padding-bottom: 16px; }.hero__grid { grid-template-columns: 1fr; }.hero__visual { order: -1; }++ :global(html.pae2-crew) .hero__crew { order: -2; justify-self: stretch; width: auto; }.portrait { width: min(290px, 72vw); margin-top: 10px; }/* On narrow screens the tags hang off the plinth's edges instead of sitting over the face. */.portrait__tag--tl { top: 25%; left: -6%; font-size: .66rem; padding: 6px 10px; }@@@ -3,23 +3,27 @@"role": "Founder · Architect · Sole Engineer","start": "2026","end": "Present",-- "location": "openvibe.live and 20+ domains",++ "location": "openvibe.live and 50+ domains","kind": "founder","link": "https://openvibe.live","featured": true,"current": true,"order": 2,-- "summary": "An open, community-run live-streaming network I own end to end. Launched in 2026 as a single streaming site and grown, in the same year, into seven connected apps sharing one login, with me as the only engineer on it.",++ "summary": "An open, community-run network of websites I own end to end. Launched in 2026 as a single live-streaming site and grown, in the same year, into more than fifty connected sites that share one login, with me as the only engineer on it.","bullets": [-- "Designed and built an entire network of seven apps that work together under one account: live streaming, sign-in and a virtual-currency wallet, media storage, a 169-tool toolbox, a browser game and a community hub. About 363,000 lines of code and 900+ web endpoints — all built, deployed and kept running by me alone.",-- "Built the live-streaming engine from the ground up: anyone can broadcast from a browser or an app, and it automatically re-broadcasts to Twitch, YouTube, Kick and more at the same time, saves the recording and auto-generates short clips. It also produces live captions and translates them into about 21 languages in real time, and uses AI to spot and label the best moments in every stream.",-- "Ran it like a real product: I built a deploy pipeline that updates the live site with zero downtime viewers ever notice, cut the homepage's load time roughly in half and eliminated the jarring layout jumps it used to have, and — when it came time to move everything to new infrastructure — moved every user, every account balance and every active player over with zero downtime and zero data loss."++ "Designed and built a network of 50+ websites that share one account: live streaming, chat and video, a wallet and payments, an AI model marketplace, travel, shopping and job search, a browser game and more. Over a million lines of code and 900+ web endpoints, all built, deployed and run by me alone.",++ "Built the live-streaming engine from the ground up: anyone can broadcast from a browser or an app, and it re-broadcasts to Twitch, YouTube, Kick and more at once, saves the recording and cuts short clips. It captions and translates streams into about 21 languages live, and AI picks the best moments and writes up what every stream talked about.",++ "Ran it like a real product: zero-downtime deploys, a homepage that loads about twice as fast without layout jumps, and a move of every site to new infrastructure and PostgreSQL with every user, balance and active player carried over, with zero downtime and zero data loss.",++ "Built its AI side: one account that reaches every major AI model with live prices, speed and uptime; agents that write code and finish tasks while people watch them work live; and an app that connects your own computer to run AI or share it."],"stack": ["Node.js","TypeScript","Express",-- "SQLite (WAL)",++ "WebRTC / WHIP",++ "LLM APIs",++ "Go",++ "PostgreSQL","mediasoup","werift","ffmpeg",@@@ -20,7 +20,7 @@{ "icon": "fa-solid fa-layer-group", "title": "Ships the whole product", "text": "Design, code, infrastructure, deployment and support, with no hand-off in between." },{ "icon": "fa-solid fa-credit-card", "title": "Moves money safely", "text": "Rebuilt PowerChat's payments across five processors, with ledgers that make double-charging impossible." },{ "icon": "fa-solid fa-robot", "title": "Builds AI that does real work", "text": "Autonomous agents that researched and wrote compliance reports Amazon associates used every day." },-- { "icon": "fa-solid fa-server", "title": "Runs it in production", "text": "25+ sites and services with zero-downtime deploys, operated by one person." },++ { "icon": "fa-solid fa-server", "title": "Runs it in production", "text": "50+ sites and services with zero-downtime deploys, operated by one person." },{ "icon": "fa-solid fa-handshake", "title": "Understands the business side", "text": "Ten years running my own company, three leading a retail sales team, then a year each in Amazon Robotics operations and floor leadership and as an Amazon ICQA data analyst." }],"roles": ["Software Engineer", "Full-Stack Developer", "AI Agent Builder", "Data Analyst", "Business Owner", "Automation Engineer", "Platform Architect", "Product Builder", "Team Leader", "Problem Solver"],@@@ -36,13 +36,13 @@"githubDisplay": "github.com/OpenVibers","linkedin": "https://www.linkedin.com/in/fris/","linkedinDisplay": "linkedin.com/in/fris",-- "resumePdf": "/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf",++ "resumePdf": "/Alex_Frison_Resume_Nov_2026_e28027d7.pdf","availability": "Open to pretty much anything — engineering, platform, analytics, ops, sales, whatever fits · remote or Pacific Northwest","status": {"now": "Contract software engineer at PowerChat, building its developer platform and payments program.",-- "also": "Founder and sole engineer of OpenVibe: 39 live sites behind one login, one operator."++ "also": "Founder and sole engineer of OpenVibe: 53 live sites behind one login, one operator."},-- "pitch": "I'm a software engineer and business owner who builds complete products and keeps them running: websites, platforms, payment systems, AI agents and the automation behind them. Over the last decade I've shipped 25+ sites and services, rebuilt a live payments program across five processors, led a sales team, and turned an Amazon data-analysis job into tooling other Amazon associates used every day. Give me a problem or a rough idea and I'll deliver the whole thing: design, code, deployment and support.",++ "pitch": "I'm a software engineer and business owner who builds complete products and keeps them running: websites, platforms, payment systems, AI agents and the automation behind them. Over the last decade I've shipped 50+ sites and services, rebuilt a live payments program across five processors, led a sales team, and turned an Amazon data-analysis job into tooling other Amazon associates used every day. Give me a problem or a rough idea and I'll deliver the whole thing: design, code, deployment and support.","seeking": [{ "label": "Honestly, open to anything", "detail": "Title and level are negotiable. The team, the problem and the chance to own something matter more than the label." },{ "label": "Software engineering", "detail": "Full-stack web apps, platforms, APIs, payments, streaming and realtime systems, designed, shipped and kept running in production." },@@@ -52,8 +52,8 @@"foundedOrg": "Own company, LLC","lastRole": "PowerChat — Software Engineer (Contract)","metrics": [-- { "num": 25, "suffix": "+", "label": "Websites, apps and services designed, built and shipped end to end", "short": "Sites and services shipped", "icon": "fa-solid fa-cubes-stacked" },-- { "num": 500, "suffix": "k+", "label": "Lines of production code written and maintained", "short": "Lines of production code", "icon": "fa-solid fa-code" },++ { "num": 50, "suffix": "+", "label": "Websites, apps and services designed, built and shipped end to end", "short": "Sites and services shipped", "icon": "fa-solid fa-cubes-stacked" },++ { "num": 1, "suffix": "M+", "label": "Lines of production code written and maintained", "short": "Lines of production code", "icon": "fa-solid fa-code" },{ "num": 900, "suffix": "+", "label": "API endpoints and pages running in production, all built solo", "short": "Endpoints live in production", "icon": "fa-solid fa-route" },{ "num": 169, "suffix": "", "label": "Free web tools built and published for anyone to use", "short": "Free web tools published", "icon": "fa-solid fa-toolbox" },{ "num": 5, "suffix": "", "label": "Payment processors merged into one billing system that can't double-charge", "short": "Payment processors unified", "icon": "fa-solid fa-credit-card" },@@@ -94,6 +94,15 @@{ "name": "OpenVibe.Homes", "url": "https://openvibe.homes", "role": "Home buying", "group": "people" },{ "name": "OpenVibe.Food", "url": "https://openvibe.food", "role": "Food and meals", "group": "people" },{ "name": "OpenVibe.Host", "url": "https://openvibe.host", "role": "Hosting compared", "group": "people" },++ { "name": "OpenVibe.Design", "url": "https://openvibe.design", "role": "Themes and AI design", "group": "people" },++ { "name": "OpenVibe.Report", "url": "https://openvibe.report", "role": "Open numbers", "group": "people" },++ { "name": "OpenVibe.Today", "url": "https://openvibe.today", "role": "Calendar", "group": "people" },++ { "name": "OpenVibe.Tours", "url": "https://openvibe.tours", "role": "Travel", "group": "people" },++ { "name": "OpenVibe.Fun", "url": "https://openvibe.fun", "role": "Things to do", "group": "people" },++ { "name": "OpenVibe.Meme", "url": "https://openvibe.meme", "role": "Meme database", "group": "people" },++ { "name": "OpenVibe.Surf", "url": "https://openvibe.surf", "role": "Surf maps", "group": "people" },++ { "name": "OpenVibe.Cam", "url": "https://openvibe.cam", "role": "Camera app", "group": "people" },++ { "name": "Open.Shoes", "url": "https://open.shoes", "role": "Shoe prices", "group": "people" },{ "name": "OpenVibe.Services", "url": "https://openvibe.services", "role": "Developer platform", "group": "builders" },{ "name": "OpenVibe.AI", "url": "https://ai.openvibe.services", "role": "AI layer", "group": "builders" },{ "name": "OpenVibe.Codes", "url": "https://openvibe.codes", "role": "Coding agents", "group": "builders" },@@@ -103,7 +112,12 @@{ "name": "OpenVibe.Events", "url": "https://openvibe.events", "role": "Event delivery", "group": "builders" },{ "name": "OpenVibe.Watch", "url": "https://openvibe.watch", "role": "Watches", "group": "builders" },{ "name": "OpenVibe.Space", "url": "https://openvibe.space", "role": "Static hosting", "group": "builders" },-- { "name": "OpenVibe.Zone", "url": "https://openvibe.zone", "role": "S3 storage", "group": "builders" }++ { "name": "OpenVibe.Zone", "url": "https://openvibe.zone", "role": "S3 storage", "group": "builders" },++ { "name": "OpenVibe.Exchange", "url": "https://openvibe.exchange", "role": "AI marketplace", "group": "builders" },++ { "name": "OpenVibe.Vision", "url": "https://openvibe.vision", "role": "Image AI", "group": "builders" },++ { "name": "OpenVibe.Website", "url": "https://openvibe.website", "role": "Website builder", "group": "builders" },++ { "name": "OpenVibe.Domains", "url": "https://openvibe.domains", "role": "Domain prices", "group": "builders" },++ { "name": "OpenVibe Node", "url": "https://node.openvibe.network", "role": "Your own computer", "group": "builders" }],"education": "Snohomish High School, WA. AP Statistics, Calculus, English, Creative Writing and Spanish. Self-taught engineer since age 12: systems, infrastructure, graphics, hardware and whatever the problem needs.","capabilities": ["websites", "platforms", "APIs", "dashboards", "AI features", "automations", "identity systems", "payment systems", "real-time chat", "streaming infra", "whatever you need"]@@@ -1,15 +1,15 @@{-- "amber": "/Alex_Frison_Resume_Themed_amber_38b37ff8.pdf",-- "blue": "/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf",-- "cyan": "/Alex_Frison_Resume_Themed_cyan_38b37ff8.pdf",-- "default": "/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf",-- "green": "/Alex_Frison_Resume_Themed_green_38b37ff8.pdf",-- "indigo": "/Alex_Frison_Resume_Themed_indigo_38b37ff8.pdf",-- "lime": "/Alex_Frison_Resume_Themed_lime_38b37ff8.pdf",-- "orange": "/Alex_Frison_Resume_Themed_orange_38b37ff8.pdf",-- "pink": "/Alex_Frison_Resume_Themed_pink_38b37ff8.pdf",-- "red": "/Alex_Frison_Resume_Themed_red_38b37ff8.pdf",-- "teal": "/Alex_Frison_Resume_Themed_teal_38b37ff8.pdf",-- "violet": "/Alex_Frison_Resume_Themed_violet_38b37ff8.pdf",-- "yellow": "/Alex_Frison_Resume_Themed_yellow_38b37ff8.pdf"++ "amber": "/Alex_Frison_Resume_Themed_amber_e28027d7.pdf",++ "blue": "/Alex_Frison_Resume_Nov_2026_e28027d7.pdf",++ "cyan": "/Alex_Frison_Resume_Themed_cyan_e28027d7.pdf",++ "default": "/Alex_Frison_Resume_Nov_2026_e28027d7.pdf",++ "green": "/Alex_Frison_Resume_Themed_green_e28027d7.pdf",++ "indigo": "/Alex_Frison_Resume_Themed_indigo_e28027d7.pdf",++ "lime": "/Alex_Frison_Resume_Themed_lime_e28027d7.pdf",++ "orange": "/Alex_Frison_Resume_Themed_orange_e28027d7.pdf",++ "pink": "/Alex_Frison_Resume_Themed_pink_e28027d7.pdf",++ "red": "/Alex_Frison_Resume_Themed_red_e28027d7.pdf",++ "teal": "/Alex_Frison_Resume_Themed_teal_e28027d7.pdf",++ "violet": "/Alex_Frison_Resume_Themed_violet_e28027d7.pdf",++ "yellow": "/Alex_Frison_Resume_Themed_yellow_e28027d7.pdf"}@@@ -84,6 +84,13 @@ const imageUrl = new URL(image, site).toString();(function () {var d = document.documentElement;d.classList.remove('no-js');++ // The FC album visits: ?pae2 from the hat (fc.tools), ?PAE2 in capitals from a link handed to coworkers++ // (the same album and game, with a welcome instead of the hat line). Marked here, before paint.++ try {++ var q = location.search;++ if (/(?:^|[?&])PAE2(?:[=&]|$)/.test(q)) { d.classList.add('pae2'); d.classList.add('pae2-crew'); }++ else if (/(?:^|[?&])pae2(?:[=&]|$)/.test(q)) d.classList.add('pae2');++ } catch (e) {}try {var t = localStorage.getItem('afnet-theme');if (t === 'light' || t === 'dark') d.dataset.theme = t;
@@ -47,7 +47,7 @@ endobj
@@ -47,7 +47,7 @@ endobj
endobj
endobj
8 0 obj
8 0 obj
<<
<<
-/Author (Alex Frison) /CreationDate (D:20261021063644-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261021063644-07'00') /Producer (ReportLab PDF Library - \(opensource\))
+/Author (Alex Frison) /CreationDate (D:20261106171201-08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261106171201-08'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (Data Analyst: SQL, Excel and Power Query, compliance reporting and automation) /Title (Alex Frison - Resume) /Trapped /False
/Subject (Data Analyst: SQL, Excel and Power Query, compliance reporting and automation) /Title (Alex Frison - Resume) /Trapped /False
>>
>>
endobj
endobj
@@ -58,10 +58,10 @@ endobj
@@ -58,10 +58,10 @@ endobj
endobj
endobj
10 0 obj
10 0 obj
<<
<<
-/Filter [ /ASCII85Decode /FlateDecode ] /Length 3015
+/Filter [ /ASCII85Decode /FlateDecode ] /Length 2985
>>
>>
stream
stream
-Gb!#]>>s9I(4OT53,_0-D9%fXR!i+YaUYY=&7B-`X7F])g3+!i>3Tp54>f?P^XFdXL&_\uC+:B<**rEr^[n"[Lq<A<r+D0+*F@4,pCThK?-aqaGPZE07OQf+^:]<f-O3"D*5tcf+"uPuV`Vhh&O$&/k&53@e=>EklPsQX'^bMFEPs6n9epuamu=WaGY?Z'e+MU#g*ce\O>n5@)MrGcl+uhD&u#;R&/rs+'.f#n<0O:jmW?jNs%_eLhN\f#AWh_/iq$CN':8Rc!8i+?;7eb.O)RZUdspr/b\Pr^UoU]U]7>NPA?(M^U@WT/GfMc-ca@V:F6+1feDL1+b2QJ[Q,`6rHo-;WY<.BVgKjg(Z1O>($R]UcLhpYY!F:+7CXL70+u9j#8f)e&%=P7P=g\MbQC/@S,0@o()[DH"VaTWg/tCW5Z,,Y#HH2*1h=Gr"rTF*+Er!IU&dJ\`O>s$^DZ7L[_V`Od]d`ls3VCF_%UI6@lEOh'j)/q^2_%"I+e_K8IRpllQHM^[email protected]=+un$-VI5#lpeMq9cQlJnV8a\o]XbW:.[)HR?CcF]))2+HRg5:QcGH"eE1A/l"(7mYu6s"+k%daU/nbXrB%"<<YeH"'rB&"La-5-d^EgmWQ^'k5FqVSL,<R1h4dm$`Dd5/>(8c#,"8Xe<*;FrBdso+G8_WaFHIi6&IGb!hfP,dgTf<Dml9\dkH*+AAOoq('.'0U<*;=:D^F^$E/H-.X@bh]qYVjcXt*.7CY);a*oDdF6^J9'b*b.#150M+P6J'2(GA`V_8kUeG-9/2;655P+[/XIQHDl\]UN,U5ht`25A'1]dTkjrX>J93;1j9FFC55FCo"[sOg::L$F50e3*TLg\$a@>;)l]AD%;I;/Wtgs$7^qGo6b]lLANVub@g,)hkt+"=1\SFOO`5q:;$i:m_eXH$RBWtKse!tk@sgDh<RTPGjVsiDJop/>5,l"f>G^3$#LrNe?JhZP(&TlFic,O&(QG;(!c$eh@$eX;[email protected]_hZ*!WTb=Ueh-E]@HLX-R)f5jrEe;sCi@c\B\!.PTii[Q[_FS(Tr=/??*B[O6/952[/qUp`VdTCu$L2u+YfgV*'o(@`QP6/:u99n:R&GN]VWJ<+i0h%"k>b(5&6+=I$]<;OZ$U);Xqj?d)]"*qe?-ZON(I"(IYZg/:-E,\Z6ep/0>TY%OYA\nIGg6.MdWo.6.X<L]?fNg?L-Rr4+1.@aQ1UmcR;sh'E)@hZOrMEVAAP0UZo"fIjhSd5ei1%FKgja8##s:haA3PZarGL**dVq_iL=6dT<ApO8S7W?rg6\gecr9(2mefJ=F2PS?094#!;Heib0KH0mo#%]I=BqF1K@CuhY%l0>?$Ip59<X0W\WIq/@r75GF@'Df&hBF,bP!XEH6>No&8eCLX=n,_lLKRQM[?E05`07CYbDA#*LbNrC"ue'(hSeC17;.+#.<WDYIglKPnH?[dLY>3T%pK)s5\GYu`BS<P"F*FqU$e;U$ZY`^AZ">qc@0G%f8BFs!^IR!Re8n1Z#.2tOt/=o12tNP%*(qDLQ.pB?O<^"UqDFubjhc'_B'*(Eqo27GUVR1ImO@iH<gVO=aKpiWft!iT>?C^.9-,J(f;Alc=d7fD:SVll!`#<Ze0M.TTn!Uq4UJK+*Y9VK)#Opo_5oD.IG>q:\.>VNC8M4m1QSE^GgTj!@*W8Bq0Zs="@QkEtekI<r=jgJ5o=f&^C+_*;W4TS5=UUsNH#u)o,H=f2?%E92g9c;("eR_T:?`-L8aJO\XR98,PYb8*`V'QrV(1k4#R/ZYM9J$o9p?50f:j,!k.IbcEod'<emh?<t1[lN>mLJ+)MrGg9QS.B3%VS\C1jTY\fEo-N2%Uh%a5Frhg5B['H%?0W<f^XU3ESH>:[email protected]#hqI1](.:P(3Z=3)FDNCU>LBPdq@+$^'tH5Te9I.02H(>Cd:EKD.Yb0@j;QAlUn::kCADRG5<o<p39BS0]aA5Y+Li"cC^IS<J[C[p`KfesS#(,U,"VL@Au_nS.,)IOR%MfR@+G3c0-#L!a3;c8M'7l/a?*=%M-pOE;!GSdTN)W=;]5<?T^0;ZR#7N+&+86EO7"-5*j6MrJaVjfRZ:\:2cC#XncSR)VC='&Ho!l"gI[/QseUFssd@^N;4%,\.!bMH`X<pj%dg(1[,36"3i&U#:i*4RN_AO&]LKlLb(=b1d^(T^pgm:3Sf#K3:A<oMCTt6/[uiCL.5W![_Ei#[kbaXe5XPN4JT0F,21[/;=Z>`e,tP>*!DmVRDV:4rMtdlZsRhQ#Rq+m05Y=W"TK1bu%(7LM-dacU9Q-Nn_eXr=C[5GC47B!5FUZ%kRs_o46)s(?j'0/t)e=*VsN3a(aCmD2@3n9M7Y"r/5&+[[G./_Fq!n]L.n@(//\Qbk.oYeW%MgZ6&5-.q70L*3cK*ir+U@I"*;Vn'bHhDpt_Q3'4L'7^#cI(R('8fCAQ,e!E\!9BBCq?T-62'92$BB!.M6R-63&Q#/et]@=l>>([hLnlf=DJDY1]kkRs*<me1&']IiSN%b=_bC]BoeCU8qFPE5#nQ3S$"k's[nLh_L*&[jfI]6/W^2r[4a(Vg0q=-RskT095L(M#@m+?U=.Pt;IZfjVmM=CkRH#!qsh/##[AeT^fShWLQNY-K%TDQ;l3W0KIkGt&k5IK;U>F(@sTYq!R2\uo"Q6[+Q/d?J3O7pY/?R!pP!qEUFQAO%qQP[4gpRo"Ka>.\5_rgd#AX8MI9](*iMGrR]7jT=Ymk]sY3nJ$fg8k=?0(i38ipYV52N%@72bMYa.2,\^?WlIq9AjQG0p]*<H"Ao6U[[:i?gZto@NYB6Aj-oC'l#RmcU4SmY4_jT)DI7lmaeY\gV!-t6n%h(4UoW)T>%d=o'O'=TpMY]f[+6I^]Kk<f@d;j5(%24p4KmI'W?fg#rO3ApWTkM'hf(e$8f(A$j!'mi3uZ5<>\CaOZ8:s_/88"P5[Qhgu\?g^UOS<j4:@*+<Cs.0TIF,,*qLhIT=bek5X/a8)j~>endstream
+Gb!#]gN"3(&q0LUjP.bfJ>'L[mE;5^G;LgQZI$nB7eihD/tb\i?1"Y,0GF'JHa9YcO=U\gXI-6R5e&J4pQHuR*GXW4j$2R_kkLJ#^$ecFU>$Q.HEA7E?I7BmS'Q"6eW]q4/e4XOlOY`-HE03ET-6AqD<>bU=Jn?t9=GeaNi7$?B1Et+q-]`80D+*LX7NfBq`EX5NMV'AcNB#VdBJoR<K\F$IOGfn*sSDZ)RY/c;35NjQ-Z#H)t`#BI6*`diERj((b%Y^V*At!(\R=#3uBlfUX9X>">p')J'>R6X^&I&lFdQbpeE.cDoFbaVt,%ZPQ'@iFtd!8;,7)7X$Ys`Wi7guO6+:,MgaFHfA:E:GE/N/r)>XAj'8Bql],ZLnY/<^?XfFda:l/9.r"3W.F#Fi:pEQVaC@e2(>:`mbWdCGV_d;]hMCi[0@`.17.7;1Hh*fPbONjWp.=TqbX(6=<k.r5IgLUCrq.W4%qjB2EB:HUV9*5foLJ<FQu>s:+$i5aC;#^DXW<adi,W!ErqH`?I'.K=btjXqf'/`G/K-\hBAsGme+q,+0qFM7jYA!gO>ONEXgo+,o:+2J>%r%:9D,<9pfJt=]T>^UB:VN(h>TL8Hms-7c'f8VA&Jt_.qoqZ/QM)Qd2t#h=@4"VTl*[NlscuK8Z]\!8s(5t(TODTZ8@gSKfc](>.TOMdYJ`C`,E68D!]efMKbTaQ?-)@gbL.VeZf`^=t2+qQV5GH$_3s^3%^>UJ3O!RSa"RcdFpHfJ]G6okKp%oa)\&:KM:>CjCD#$aMeNuT(=\iR[rbc>ib4CCl"-NZ)&WZ%e"!F+:ts8_2kR!8t(Z3P*H5t+_n4lKas&lM7%H70N(rW<)+4u!+u]*osRn(-ZV]pUs3=fX@9ek<^B0:[@Y_4ro!:BC&(FcrVQNP@^8d;+'JR@jj^DPi''9t\NmI3:fto@G+Q,QfY*-kOk5&[iXU/$XDo?+IQ\a%Q-_uE8I`:]-gA)X<L'XPr(qft<UPf@mCdHH,c0O#:oS<u'\au7]pqL9AF/UAp@oWtGs,6Z8H"@JY1IR-%Ib1='U.1J_U1HV>o,9oUHu@5/#9`*k\"\687VT-(s7!UA/C6Oak%K7NH=0p/l[5E6/:M?k8q4-`tU+KI!r`T"mu"1mCjnY0D#6SmpieAlfL\5FLbZR?hdGm_J5?-)l%:HO)[tYF+&B4]Y;'fs#'EF6t]YjX8&[(I>u,E(]sNkIaD?!7+16rUrof"_aT.SMshJbiru'Dd`SN"QNIbr>2S#Q%MnHK),P$;+?u.G13LqQGj*OlO)G5.I(i?,a/RUMpg[@%BbRuphpG%k@I6si]#]tu!:UL[OfdMLhMi5Sqt.<_(Fh)QGhX_oDbqV.r-1J\WChS7ZKTjpgLjirZSCqG+o1K6la*)PZO\ErH\?PQCL6ZSYhT>7IrRP1h!!%J1m"4nkU1]=<hRc\<Y691s+DQ%Ek=j%'6N7t[^AVJbP=Vn?Sel<NP%lS8u3JpBdZ3ga5rhcFu02:d5<_AI#f'!62Qe%Ni5%n":l/DHTP"cQaNGH_kED$;;^O!c@&!R<k%XAQsEI`<HI;$5)3"#7E)B(6fu;Z^t>*qJ8$?H3.;lbUB'Qp1ReCs\O)Wb7*MYHg8I4ulr:Aij+(dE2V'F:+TNSE/oV&%Pq$mbFdrLoJ%[email protected]^;G"nc(JP;EYU!)oU?n/SpY]%dc&/'C=>[q';%V'geuB66cm=4!c8X_4M0csV7+jckl9?!ZSmo6%(;JS]'<P_ukc!=P>'<*F=imni/'_t9:l@VV=8Yt&HLJ?nLo9S&P-X=(hCHma^ER=PS\FSG:5DC>9XF6Q/3kC=HS$_ul=NLc_`=TRInH44[Bd9]LFb]>U;[!Dkmbe`S\J&5_Pj1ZWK;)m^ZT@g'AO9?iM_1<M/?_^%-Us-5K?]1/h"T!(_:,0g-/Hn1o&)IQ)]&%*8Rs![H6OCV[A8^Zp?)'>)F-a2M!$Nf=,q)4rF&!?Ogm2dt=D,bnPDDd")T&\o`i#eSpk;80@f(;il*TQ+f1(*M387h!VjF;H>Tm+>5ghedGV6dkVm\uJ<.RRq9Ec!#0ns,&$aj$(R>Bsr/;cp1Qa`D2iVG\R,8:;@@N#@=M0X;"dHMF^)miaElr!+'HKeo$8]V+Oj@`$[q0@mhf#R9FJAeJC6GXJ3Ggm\>*ilqef]rG^Q+&:-=VMB8=Hb]eNjfrVAJL9D4N.Be\\3#P@_,t.3snocos!OVOg2/`fL0JOKe&t2FS@cNVTsV;J\Yok81@#+F!i!d2F^92CG0sdZ3sqP)li\FSl-E^q;A4QiZ`s9To10U`lJp$/U<GUN/L&EF3(g!nGm1?&EY&V[=a%cQO9jH5%tp?JPf,WWErZo!D0-PRTNAnqtCgtFBDItmk9p]I9FJVAK'*^Ard^ui@EHsp%U*/Fh52joVKpp;RdF\Qc8R]F@OY&1KD@L9'7k,Kj?tTCZ4QJem(_(XB+L*^pb79H@F>N;dV'u5rc>*+]/)O)6d7`L116AgR5qK'4Ia>=kp[dP%"n2'>K[%94^5:Y^=g'[email protected](9#[V*9lnk"89iUYaq%$_>3'urefsC$'e*RuT#@Ol.o\FNE#eSF/^$_YcrJ0n6Un[*LD(idB-);S93/?PVJsW3t,\&hN"$;?0GN?+a&a;W5pt7f)7:Flm$XK3JLg+e&R?pl]o6f1G$VC&hD_u^X.<1lOOq?1<WCCc2l<GL?2LnCYHE)7qpMC2jl1A;#<3.?D.`raFijKd[[`]N2=So`dg]'#'nWL(rEs8fZHqcC=MPLY<)U.@fdW8?6K`2AsLcK[[f\p](Bk--9I&<J>B$F-/iu*'H5VhZP_@m#fBU2JJ"g3BZZ[I7LnCUe/#BAug:_<d@C/jWhO^W)OQl;t>BP(Nmq4[B;[m\8J(d'Nm3/gGFD<.%Dr]DI]c/kA.\.(jnet)IU*Xon>DT'sIQKjD+WhAV$rrL1b4q@~>endstream
endobj
endobj
11 0 obj
11 0 obj
<<
<<
@@ -83,11 +83,11 @@ xref
@@ -83,11 +83,11 @@ xref
0000000902 00000 n
0000000902 00000 n
0000001249 00000 n
0000001249 00000 n
0000001314 00000 n
0000001314 00000 n
-0000004421 00000 n
+0000004391 00000 n
trailer
trailer
<<
<<
/ID
/ID
-[<0708869bd847a2f084ce65d9fc9de7c3><0708869bd847a2f084ce65d9fc9de7c3>]
+[<5d29013ba6b75c536fae594dd3cf204e><5d29013ba6b75c536fae594dd3cf204e>]
% ReportLab generated PDF document -- digest (opensource)
% ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R
/Info 8 0 R
@@ -95,5 +95,5 @@ trailer
@@ -95,5 +95,5 @@ trailer
/Size 12
/Size 12
>>
>>
startxref
startxref
-6392
+6362
%%EOF
%%EOF
@@ -47,7 +47,7 @@ endobj
@@ -47,7 +47,7 @@ endobj
endobj
endobj
8 0 obj
8 0 obj
<<
<<
-/Author (Alex Frison) /CreationDate (D:20261021063644-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261021063644-07'00') /Producer (ReportLab PDF Library - \(opensource\))
+/Author (Alex Frison) /CreationDate (D:20261106171201-08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261106171201-08'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (Software Engineer: full-stack TypeScript and Node.js, payments, identity and live streaming) /Title (Alex Frison - Resume) /Trapped /False
/Subject (Software Engineer: full-stack TypeScript and Node.js, payments, identity and live streaming) /Title (Alex Frison - Resume) /Trapped /False
>>
>>
endobj
endobj
@@ -58,17 +58,17 @@ endobj
@@ -58,17 +58,17 @@ endobj
endobj
endobj
10 0 obj
10 0 obj
<<
<<
-/Filter [ /ASCII85Decode /FlateDecode ] /Length 3349
+/Filter [ /ASCII85Decode /FlateDecode ] /Length 3240
>>
>>
stream
stream
-Gb!#]>Bedl&q801W4+auJfq59o<K2p@jZBY!&N:ga"NG%!l^=+dqY;4P93"r[4^*bR!?Ya:F:-J(8C-g<Rk0)9.g'_mAh$:S^-Km)jf><bl`!ubq@6ol$WKiY8;*PA?V&`K=9Ms`YWU/g$7V4!U[VejU3'jf&q6j*olTF\]9)@gZ=W[7ZmUBDfhAGj;#p(dJR?&m0!@T8F-il[D[5;C$0nG,1Jh0KXs!V()F:cWB(BMV,<(:+%LEo1m>eD8<V=tgq9Ab\CGHjE7O1`)P,i+J6N)DreFh^X)0YTVS)fa"qJA4I[DrT'u(6BfDHe?X_^(&L1Z](m"b%.RJ[XLUs9HP4r?K:f?IXhm1s&M/?S"i'ppl&V"8+7-;s+B$M#T[A4CgQ1uG*Lk34QW,SHa+.:4ttAIbPG'?e>P.eN6PRZ78.$L]6O##:*8c3%,>##DY$]uQ"*@E%\:=/5#PLEuR)oKm#Zf(e_n^*ruQrq[hD&'*0?1,rGOd;7\p]j[s*jp)Xi[3;4J?FKo@F!gsn$imD2MACISq&'2KBdA\6<%C3-9P3+..qP03=im%QSg884Kh:r.W0.fd,@LYM@g$Ie4kU%@L0_70N/[5G%q!)h+$-GIfr--Pir^n&-dL&GCsl:gJqgGY>3bWMR$Us8#nih1=[iFE!N16!b>`It/`)gs\4i\o+eJGiSW$MTbFr^RqC`P]4Foh"T1h]J4JW%YP/SS18@5eQ[sU9T=UElL,gnJ.?_m1U4f4OI&kS5&8\^A'ZPt?d>ij"N6Y`/o^PcXoP-l(Q`e7[,okC+]e9>k4PK#)l>pC+]&7=Nd&/bs%DO;1<51q[F_=9]'pLP6lla,Th4ABflo5P?9qSuB#h]lk,G&hjg4!_$8nG`$\l.&r.D&9.6JQ48mj86jDdA9C"\QI"UnEdii3kACt*;WCbM<aq`@ocjkB-/`HqGlLo`O/("\T$bAIKe+USfRAiVlj/%fS!1&=./i1%&dt.q<(^%FW?jAcfPudN,@&5FiYE'YV\diae8V^WqOsJfS0;;_lAc<0iJWm%Wmn@]8,#$Z0G""Z,`YUQ'nJ7f(E)`qhCFKAaSXDj66'r'lL'_WQn6ZRYS/l4ESuWdfXmu_p>+N)m'aZ58[<J4Fj>#p-sf586U$k6!C%^9$IN*,b?T06-(;Q2N8Ho3W)[&KLS@ci:u[8k1/MSFH;LWk(h.-H+H`%FYO)<WZ&Xm^mRK78/*d_0G0YdEqCQK88PFtjNtN>$-+;+OU3%cUq`ul":gDi"i#=%LYe)4ZYBSrmjDc.]%kgf"f_9:%`_7Um9Ukcl8AQi4+jonH\^0mYu9kQ(sW@h6att+Mq7pU9s_FKYt;H[RBbQ--U`#:+2`aKkpA0NVl[B<"2j>ncEFBZe8,Jt9HPo7W%8aO1L-Q3Aetp\6(CR*AcDT!*H$019ba#=4gt'L-W4j<)+:Q-@0UC&]ehm.Ra,nQS=d\>P6YrRNuK^h,ld3BpL1]L,f4chN!kV7>n,&T=O7nP)+Q1NK?/Y$MqoQi?R20t7]-)=l]fWSMq"ccUN<a(mr_7jN<`'W\(uPBShcc$1"Rfg2=_/s^p7@[UVs7@8jgqaKfR4fd]d8uKM2@QP9P\^`gfVp=EsCF8<GH#,[taI[&rcf2>ZqE?Ct"@kO6FRLP37bdHis8h5>":>\VKi9u2nfqZdg>?k];4R5t"V$Mq8DSO'k;*'ZJ:etfuH6`ZASW\ftq$6Nll;8/iLX5+"Wd!'&EO(!N.Mfr`/^:(!sX?q\>]<rYQ+%,CS3uD(6&G9O^Frq&02ERb5M]qks,3>,MY/3$7207HW]`]?tgh4O8F)Ia<$gEKb)3\#o6/Yc-n;H6$<jpF;cds"`.J"73!c)EZ3]Ii/#j!e&hStIM5VB3/j$p"Qfe/./"=[cbi&Q?g6UamH\[C<cL$"efffsFB,25#P9]j'(CtX1YGs#Gs#ONPC$fr:qj>Pfr'h)ksM_&5ne]TftF><*M&8-b)*2$\9,W6O$7?*B62K$3K47*_f-5$\7A*5bo7QN>m=+\d,;(A4d_)M9`!q@\UZ/gc(^b!hRFS??pT*.m=Lr`'9UELJj'#q0qGRQ)@a9b>GMCLI$1'(TIJOMQj&p-d"&Qt@NGuFG$P>"8[NcqAEf%W8#"rIB!+\udDmR/*rX,M2GOZ^<KNT+E!5QK(=Psh+1m&X8:j5d6\"hrr0JAp0'GRLLN@u:P!!rt%RE]9qR'AK^2#*bF4+o_>G<`TaN)cKB0bYBXX,E"75/A^+q4JuTKWEOV9#Jp_,@0%kJ5X`e3bB4piGmHp2IGD.<Ho4"c(ED6I["G,CX4_OjSK99MRZ?5shF(3@P1#0F#<5W)[H:=1'7o4b`.dN1g>1>pBuudb%U9^s(8n29riBmobY!3J3eJ3>%a$MVng$'Ba**_FH*:e%?pNU2kh\5ASi4i'Ach'$JgGC`3sC?N<j$A.;8&7eDMtJH:<fZp@rtl[:lRH91dn->^bqu!oltL*P&Ba1/(+(i-9'rgi5pUsHI$8.bX^4-\K1=`*L*=u;bs8Z5B+c5A,iW-Rp+,Xhf-cZ4l?eTc0$;nDore/>.sW1J=4G.h&3D>.QZS=X/H,X*VZ/:YPp-T6+]hY+L,VsXph$_!:6agKU<mr5)kc9h;M/#rPMsnk1p,c;Y1`h4e?Jtr,r6W>JFT5@db8DPXo%bliM%q&Y<k2-TbPuU?XX595S*cR/;*$2S"V^2%s)ek"B68*=HkCdMN^D-gC>[%3?VX%'`X$q;+Gj9L/H[+@nJ_(QC0$Rgnnk!&ObD1">H3S5u]0eO"/c$r#]pU&Eu4$PqFtPHRr>QE3?8_Ca;MZ#nMJf?A!E\_%J:No5EiV8R5Yp.X1)$+W$tWQ!/W\l]Pc/W];>95VdZNg:fN%>WaABFkI.HY=VBKA4HqD-JGbBm.P%?'p8`,/$68Cm3JV;4itjVThup]p1s7WdLE0<r-Z8QM6c56)%16j1t8V$]p3,=`?ZEg"J*'&.dhZ0QfuE"$Ds%66#J>ONo1IJG][P\(LK9;iBR[K4*B3(.f:pYM.k?/5[,t?#>q&C4T!C14Xok9&3PK@rFi3M/B5k.S(4$XGj7/$a`Ek<jY"0Jt1;Z15QKXYhbpq"IemH@GoI9`2rH%q6S3M9rapdVAH)m@[s/]RE8CBEd(Y`R$H=,cRTL*<ZEFGbH/l8;1Onld:*J@5%+WHVMNSl";a&(nKD:c\RLGacq6\l_&f<^^_`jfeNShA?:L6#d\f4i.0\F:dLL%C^s9sQ@:!`/j`,,fS)rQgO=OH:ec(6<[s0ZRpcFRI+7m\66NiidEF%-r&?j/m8'C;-rP[@GKqKROgGcIs6XTBXME@J$n3iT0Jr<t5%Gh)Vc2~>endstream
+Gb!#]>Bedl&q801W4-bi"lYL3]I_(JR#.@n^eApsnOk)aTNG*-\m$NBjN#SJXUBk,+l;bBP;ie8,B_hVWqr`0;?MDCpZfdek;.GW\k1-^bnegqe2oM!VT[YN5@67*41dX,p05f<.3?9N^!Xa454-,NjU5nUXS-S]/B6NuC7b"QXX<La15t9AHEBQ0P*\$&8@*fN[[email protected]&YU($Z4=bSm0^eV<TI&Q<#:QI2LDga]&U_,=t3pEVGX1@&_W?ii:i#f@kjC+%l[(reFhr:>:(=D6^[YJ;s#/&12O,`NR/>'n8e^9&!+,Tj;5NpZ9"d-GP=WWQc$uqh$9n]&'R%h;E(/V6bQL(3U-CkqZCrM3Rjq(0M@%N"u=Tbr2PkqDq;%M'Sb'.Zj=a`hQLL@[U>'K`U$t]5c^uiI`CciNsHi4CUags&:LP#HVV%<r@,^1S"A_9O\f(cR&9uNA#eCMu<V9QPYLj3Mt)P_9np3VMDVE%N<kUhl1k0"UPq53]Z]pHNB3s!,0&D1sa#e0EbLROgL9LXb+d+`jtnOb1)MYad@19,]GVp8U3t-Ou#]T@2DPV#gi'a]F@sH40pYB`fK/8`uje:RjsT/.[&G5T`mVhs%LTs9dD6&kuOp_*j(+oa]+WMiG3!5/JnoKeX+:SI+q8@+AK@>A3_=+&*/A%<!pgBCSgmRZqsm,Kq(=r7?9R,(/uW=7tQh9CSgKFfjLudDG(W,>O4"@Gfjl%a]=7o87AEgal;0:'Mtt)A%Wtm:7U31ZMB?b(=C-V^=i?>=%MT]33,e!'k>dO3>BE,]Eoe"6,\@\iUb`ofcIR4TQhU.83*=(4(`2aNU#C*EOU/g<:kS`D;L5TYG]DDFogHLSi,=RC]</ob%+lpMu<@]EHH4QP%>u+dc@!JPZ9)l.[ET>M?d!bheqe<bPUr1[7@t[/6q"WFI``!Y%BU(9r$r-:UI0[ooDg,7s1(gE57"(`a4*d2,_JialRX,&Am).[6TM+nIeJ.1`$8ecV_)ghSUu<QP`bOORoH'&::4BFB`%`5*&\[_MSFBh'up$=ut9mCtot96BnmiP7PRs]9cW#a\lE7HSc+?Bmb$MMt80>"2iH[okUZBHT2iU.=?Xn:\L5CI3^DTRNS_0<2J`/+;3QH\ja[c!]H#PauTAq^P>iXLu@LVp?q%Oc0:ai*mBZl8*B+ph,_K3\1)4k!<]58koipB>erg5rli`IJ0M8/'p2")DoNc\<(&Y:.$DEPlk%f+:)3]hD`i>)bj;>5'YYMnN2go"[1oFrLD_'fRC9[iYc(Xur+6:Mdruk8ja<oS4Y`IfZA),XI1WO\URS,\LLZNe%5VL>^e]dKA2]#G1"&c5Q)1Rl%MtGY4.4p[_Pl]%A=5VdNDWi]Y,AeD(f%7s=tJZ4!\^n;-?$0Q.l:+60)+#@=2%59FW6-=Y<i>)ebq<fMOO6Q=e),%*TN\KJ%uNF@?Q'0M#/m_EY8t/FMWZ#UTT@F>0L[`b`!a2"cLHQM2U1P&t^J@1I`_h12RiOjKm@9(8,`Sk9"h=mYs_/=/XSq[[o5o+#):r("G'l3FJ8]h-jbo>,@q]nA6/U33G9I?pc7@\OhoM!FsD#;(R+*)c@qS'T#p3%;hm3I#\-r^UKPnn`ANQjY<IRk@jSVe':lL5:nbUfd>n&]u'r0/$Ol\W6CcY'a=QEAaOrI/0*P//lnd]9`q:kZVY?[@h_,NG/J,fX[]>rTV1aGo8$h)7>k4D5ea\*4X`[Q;7j(R9YZ;6]4ShHUd<N)q74$dBM`U`T$E,LMis;d2S'7E'\CQ?0+JV:d.)VqkK^Vt!mRPp@Ur/12?eY5V8LW2lW_b/X#sa!r$CAR('W:7*qZZc\.QmD6M_Wc634X.)3/HcE^dU]Rh2BKadhMs<Xfd81$-tP/JX^e;J,sE#mmqT8k*EDWbpGe6LoB8,Tk`eoFT/&1s'"602rXb2(hQ\a/bhH:?[)V[3>5R'0&7nTL`l-O%$I<#<$J5E]`[L>p^2*.-'GJbXU;gbU\Uu%oFgL-c%b>9`ji5_Qi0Yk/]+#l?<^LdN8TdjbUuI<ML]S_%Obm)gDe7)ormd\<8>k`%h?t7"IcdoFc7=KFp5/\9UsTk`\\+mS<JSbLYEp'F#BTM]lHkJ0%)oPt)_XMBhqCP?PrE"G$QCCFY0!("l`n:rXq\)%(c9f)U_O,OlOIA]GJs*WlBrrGjiqL_JOH1'Wu/N$3ZJ<\('Qj,L#a!9PUCcB3Ah7?1dD6_75\oMd-Ma9*$)a05Q/p`Q;"[Ujb.I!H,jm6f[8"ankTrtcY<(:8jl>,0qfp=`eOi&.(<OaId1$]pTV$pVOi>-9`D&k4DtQQn+fB@Q3'r_6&29Qo>VT=-^b-1L)&A#1X<ERX54E;-(D""6f/>CPt"1.q!mS.5tk7iOTP%<K-UZC%%FE<O+@30V#q_[%dE2pA6"9)A;X<#;HU;[Y9?blt%8*0qKedV?TUV@*!0Hn:H*mZW]">DJ^'PRdc?G38#kUM2n6Pr%THd%b3f(eq\Y1<o]I=3MY>B8t'`C?G:1\,<Z>RY-(fq8gVBiWomn?Mc7gbi^5,.3IrAFMt5?U5gXFg3r73oiDG*g1BgTM04%#arosN^k%A3L^E(adl9q*1\bCbJ!ZA[%;"_8O6oD^1^FP7<q$X+@^=)27JO$HTC!XlH`kg6`A`m9:Cu,+h9t^2;/VH);-\ldM?3^4@\N7e"aTS<>]<LN,F%GX9%.g:r2Aa#3<F0YNTV5X!<?<cS1)02I"(q[J^639lR;C_WD4YHm0%%k!MR,Rd)ZZ,QBeI(f-cGr=-Q42KmRorf!-A6'Z'bnV4uXV*13OO&FsdH;2;i;kkk^RCN]!X?><"016d0KCcL]D_?I-$^djU0Dqp(5C"Fh[$?KhsgB2FICXl@<F(^5Zbq],`A[@?ARGWZd_<):A&;3N2AHNA%UlKf*%S@`9B_[MpD97jS($d]r<B9/*7N,[!(sl,rP8d]p8c`C:q00*B4R[CKaAiHh0o"QJP36LZ:i"g=>Y?nm$ePhD"b5-n@e6^(&`#6`=NV5Wo\'Oqk)W=^QlgDgNROC>9R%\aE76rojN_hhT1.%K%iU>LiG>5'*1+OUH2WO!!`SmNY!\0:+KJ0q>R0HBaK[c%R)Q&*%`'b^5[&eaE,dA_cKk\mA7iUR4,OErURp]u6N0en\?jCJj:2tH`<2Od+&j@'5R*_.+em!ca4m/^fM8I5j@AeV&.BCgb^QYX`EuX-=f_~>endstream
endobj
endobj
11 0 obj
11 0 obj
<<
<<
-/Filter [ /ASCII85Decode /FlateDecode ] /Length 2981
+/Filter [ /ASCII85Decode /FlateDecode ] /Length 3197
>>
>>
stream
stream
-Gb!#]flGh,(4FM1gnu%aN229Zih`8Xfh%]S@RX2SI`Mmb66b,/_#U->FnNf$\KE3!e*\oh;5tV6CbF@bQZLFU!p\bmn@t`Wk^6,Y?Nh-s1ga/-n+:=C9pbGf?X<kXbJ=`#O+Yp,&0:8Q'+XR$R(iQ8<\H./YT"[:@F,G#pZU+f*af84IPc*i\iZ\]3gQ>oD2[PG6I$dM$J2#qLVcT?LU.NCb";GWF?@)5r(Dr')(T-<=gVioNEW(DEg[Y_L&49k6CLYKi8qLOCf6i$J_u91IFk3_;<a7*?N*:_heE'33kDl5(q40>$O9%FHTQ.C^/FboMsSGERDg`rVn.hRWA"qeU*i[Q(/9b5Ue>64gX^4>[email protected]>lZL,!G2:ka?iBrWG%'R010mGKHjShe[IGl&'/[j#MRBnVCA_MiU/<9:d.t0&0Kea^pCDPr:\g4W-_nkHrhPZJ<PEK7DpdqXpL-#IPLK/!(qq%L/8/,jeD?]="bTQH9o>V1<aX-nrj1_Mk]:]jm,u5Rhe1p+Y7mIMHF8b2>Xpa=>fHnJe*Q5+G,2Gg<?dJL>tluL[+=AWRHjG_+m?"^/(+kMBVdC[Jpp"dg[5!,<.6KAVp,Ec@O!**N1csmOiOgW<U0Jb1#0<tb:<Lk-Kq+^K72-@33pCM]2TVr-Hng;d^F'8;RmrJ`lb"JQVn]h@7K!cY^8Uu4Bp"$Hc%!#]aZS9,+7k%@]@VD=[a$i7RS3Q1mUcP3P&9m/QAb*k#XZ;e\*dn=Y+Bpd)*`:"=)=;n7\d80cZRZ@cr8VWlb?oEp;6.mBqftI45=1bPak\Z(noX486;k9",]l@?jl1P*\#Q5XG6C8f6P6I6%T?9K"N^>TDiX0tL0nN@%^l=09qpBdJTN7gC(@^nuCTo/jKsEJ2eNKK"8kr7!qJP)V4b0eE/NeaP*?UYs]TR*ekd1aD=1U0G*bd19aTmECfP163'RbX3H-HAla#Eo13Ii-;ahe+:beg<MRiI:[4uH=+U%Pp"WOCIAQW8*BT)A<%XgcrnlD6Z38Q77\aH;_P4.A`R':(@<mC:)8is*EU?tOI5DJ$fMED!4Se@aJQf3AEVkQKV#To3fuLC<K=^GaJ#"mJ^.39q?)S+0>7\gItH6Z$f(kin\0S<#Q<[XGb?`YS9=.BlSZm)L0NCp^Nc4Ti!dYap/K&3#pH#epMYtn/!r[9;Ak!%;1tma>?Du+.Y2]gI-?9e0#<`)V02oK'cCj?'hK-d74N?4g'&Bs!H-=Tq0,:il(cYHh,<?._YL2Tf_VKncSpDXL>o7CNfCfmnZT0jn1$hfP9M6b,d5<bQptM(0LNBC-tqqZ*Pb!A_Y[)EC:9;=;ebMsN_OW#Dd&GQ,%j0^IElWO7c%Wc1lsU.Ba#;I<^%BB%'s`,*+RPTX`>5VP4J2+CkbH_LUaNP();@A6D]#/LR4i[OSK+Ci]'n3`7#g"Fq,nf?g0>d3l*]jnm83+0O2q==ZD9p"b)4foo(JCd.d5+\7'r@iubDY^&^gAJ:hQ66"ImO^#%<qcS(,)SLM(-o"52=E=>4U&4jr*:5,q,Xb8g;86UiY&L@kh-"mkY_1%9l<[IWIS/?H6W#ipTc\GIga;4TmKS;*4LL24MCklbM>Uj5(!N'1=]g?GT9%P6iN(>B2^Z3TgLN%-'WU@n"AV-=DQgI4Yp_Y0El:<Uj"X!\qnDi*8Ycf^=?oa!HQL\(Y\0gfj!Ph7`j5NDO\FP70QX$,!!K(T'S`k/CB9/-$^cEV$efU/uS9U,h6aUtC8H-6*X*8kLUArefaQ1V,;:n7IXn9Rm>,]Z_XQ5j"8.rVm^V5$o)t6,Sj[6r>O&)Ar!-br["f"5.qGrtg$3TT5^hf7r$B(X.d<TF@\Co:^8>O4,VUKm:mn\9.:<,/VT=C3M@ahR0iM$#Ia;%`b.Mt"dg$_)uni-`j.3R1GB!60Q,)@!b-0`o$0X]'Xrfr/6db/g$+]^,Ti$.BZ(b4@)eS2Z0"]`p_dP4\I^3JO\XXPcPe)q,7'E?<2c,thdnWfq&$a04QepJijV[(]^+A&9,!9TQo1*gJ.%sD/ABY>'HH&>^:6I**6nWr#dj,q[9-ED8"a3Z]0>aM2)NcuGWD(nPgdk'ZYnEZ6%nWNW/)s[CkA?]:kGDhs,<nmg`^;f/Ye^?(R0?<\-$^sb-hVr;$1j?-pGt;_`HHR,Ts68hc\Smp&WH6"#.Ab^]K+%rK-(1Bc\o"BGaOt>qc5Xjg:MM%7f+8dJjLqc\3[9+B`CCjN'1=C0P-%J>UZq[sgjAq\C>qVN<\C9@E@jjf'h#E=(+FMD\tDVZ$;0$AM`joZV5doXT*TQ1;C<*rY't"DPhV'/4")p]#uKS_<Wd&,qA>Bm+i)!%n5E`RY[2Q]mIi^%LcOOLMRaXE<K1K%^Y*$'c?rSnX>fFh_D="k5$rP;T/lsemhGri>.LFmF)_!$=&A,TGU@uaN4"8jf-3p8S<7TbQ=/4R1-sr:.pF]7]nTeI08(L7MOS@Yb"+-.RKQ=:*W?bLGS$KtL]j(;YnF-pG:n1N7^GlMkhH0$@H)]E[&(<7pY\)5S:2E.q%2tF=0thIN>P#F<?ef5Sq"iiGe@m=n$b"+XO@"F9SnX;@m,N"2:ff6r+oBqNt_@qjIE2o;(iKL2\c^;WlZtD8@?92_+FE#p*("+."jS'$XMKOBOn-NCQAYf2P4dZKW"N)q!I;1E22.(JV+Nd;#c[l#("!-feo:R\G(@"W6'5ng-;$GH^bT$PF24%!95D64Ni$8lTM:"#Tko\jIg(0'K>,G0^Sf6[eE#6i8qqunS!Aoo=eX.PjKju561u#6\t293!,fRW1a!pK'HDGT'HM_dO+TUH+B;USatH@#K87=32LH!ANprE<2LtE+>Y.;:`k`a5!J7MiQl@abR0KmD23LUkQFk`gT_+DD!sdO#k<MCS3;a8PqS,q[[ToRW.!0<JAugCGc]m0&]X>(;%mWU87`"4Q@F*?^%`Zj-qWn~>endstream
+Gb!#]flkh:(4G?rc;Q[XD&Z+h6GepB!+@0!fEUb2^QbS#<CBlEW_shoF[*V7WKIK/(Vq<f$=Uo6U`+?0^%XN%;&;HZs.(]tNi2O9AOKBhdlBkq:7nC"F>eR<q+4OM3>gc86$Lt<0`]f[@WO&spn6*2kq^K1olJ&66`3#a^OpGgc%;Pd2``qn(JR-a14T>Zr]8Gn$Q\e>?E)u:H?rhqglZWC7d";^.Z[+:P!kJsWc7#SiQ+QPAC?XRQ"E``nOX[KHDsi2dn700Ecin31b+Wr7CJF9,uLI;Ptipm$PEhM?j/dJas\Y9.not;:D:t2+.]H!fo2H*2jRL4at]O<,sGAH-+K)Z-*=PbnS>i-@miVW/AniO/de"SOgV>#kuE9bbHc0:OOIa?Jp4<@G%$jH,OsW]bnV)f*Ib`nh=,\CGch_37fM]E94N0+%,t[\*Z]Q"8"H?_oYcUIk(qmRNB<b?VWk[VPJjEJ[HQt[1t(CC7l_Ma:Zr[EI!pJ"U5Oq&)I8uq`[fl>CMhnEaN;&P(+j*tK[j)UU6RQMN_/C)ALSEI[N8[]3_<J_[dSPoB'W\<Ic]2@<o::JC/h_p``cI,V^F&7:ZB3PhL(j%W*$"X%ZXdu-^SP*:3'X:o,JN]d4p\!a4QC!9*r(,[Vah=Nl$Md"h(?BgL/Oi!5F.hIjg&`'R-,RX2]tRkB-n4]:K?WBN0d-]5>skah(E.7SE9L/fJmfk[C?\Eird?52T\-c=6X.7OD3U_W_,^*9$@r)tuAj/qr9Q_hJW>LE!RIJJ6G('E)9W@Xk)TET1_5+K==;RU#g=k1n+E-k],7j3t8/b^$?m7n?fn24Tf4!?5&H"6<!%C3@/Es,\^J!<a;`Ot)q<=^hR=@,YXfGp))M;E/cbV`k=&,8d)5K7u\8>N(g;.ni/>AgRk!gK/U0>a)*a`MiI?;FW8VHCD.P4*[iM&,;*JpD,a#9)uLa43W8o4/2ka.jL4bIl*F3i$$o+X(Eh_DZ'X'(cr08Q3s,+ZnNrU^dsD>4BjF,$MS,3gmUGY(!J>0OH)K[?@aKfF!Z'7*\U.0S_Q&(H#VEjVZ!\F>RdPO$A23I!?QfFoWDYdH:B!:JHOM>QZ4pD$C;W9WeAb6d&V<GY,n^]#o<`;dp21t7]or8iO"O4L6jq<Cf09FZ#$d8'Z6e$Et-H)573G,^_r.)9Ja9Z(qpH6rJg1=ATMcjVHd((f[ten"2=FFh\bMp2UabCR-F/&=Dd4>hnCj(c+PdY.\oU[IuS+BqWPd;OXuTJ#qMV$Go4d]-p]oaS9ee<W=o4fkKu2sDIi"1e3PR\#-$:YYRt2\"`TsSVL49]Xb.]<oW2'D$#%%G;'7M#EbHY;T^u9k3'j:sNGkKj5!X%jKg#QDEPI(k#>l9f4A6S9cFS/2otJ1Us7uV^qbb;d=9)tn?F6Uc<_`o4Q+2<1,O:LQ'Hsje'Xq2rZ<q!f0WG9(62+e%L:Rdp5$&Yc)9?a'[8^`]oZCDQG,P;S$ZM:fb25#/8KWp2h9@3M//j,B5E$Y%!j`T[>GW;Yho,$mfMHf-,03?\,X!NYb+:DOE`HRj[E'b2l_5E966Y=d+>u)]akisYpF=3q]%f4rb7`;J!//5P]XDY;4\j!!dO$.KE7&4X62/2L];EX_XBO^/GC_5(Df<d1fWdRBIf6RN!i-JZhZGjnXK7'(2_Z&gTkYdCIP9Pir3,//9@TZf-eRPqok2Ph_tQ_S$V0GZJ`!ZrH;>5j/t,NR2Aepp#"[-l6g6W3jS,#.*=b#OH$h%TFJdtOb-N-3`%_N@59MCn3"b.f2op5Nm4ZBjnK\PH,tJUA_0q3K<Y53]:5^&5;EM/JZQWBVE^fD@YS>(ln1#6c*NHqqY)IK+OF!br!lZH9?-<Z_Ok1TZV]:<!+ea2en`/_^M9P/M=`*pJ!M&ID0T8HhrIt%F`k\g^08j3uLHeqa>IECHbhE<j'"TKhVg?4&(BhM6ibS]m9JWYBkI\_AOp";\gt_ZL36-k;aWs7nVh!cV#e>9!LSO\6F\8fD?ghMgK\Jhc*odR7oH5[[O"i$qUY`^GJ,9Jt5S_gT_qt:(DaIum8K/f+_kul+adFie]`H%u=eW&Gq?J$B<e6ShI0>,.(rp`I$fCnOY:arY@HiX;nlVt4p=Y?FXFL@m`Bd*bK8*C<#EL`n!ba/OD[L`sL=lYY"`e:]8s2sJ#udn!m;GS[.D=O/*)a1@%PE>[8h4d#>+MQq5nHBNV,!G-p4`CpCCN995E?m>i*ZA*L1qDmPaS^)D,kVa:T<Kk,^4N!qgaeKM@*0$N5f_lTFJ>H+$@4O6:Ho:B/3e61#jk!ji+,]8"6T'n5/IVj2aY8C>?=(qhDq0VO_<BLJhJ\r.8S:nSG/rj8S#`MOM@Ne=[!apoX5+`m-3^:8V[%F?R?aK5ZsNQ&",,+4:KThsd!%J,JS'i?)B(s6pTFm8?]CH`)]1ImYpH+*!c($`M`o6Hq%%k7;;S3u<toIce>*I<n;/hoh$<$71L0Q6R?&E^\sP-(N.!F!$-Z%m<IH<e,sKb4;>6@1.\ZZ_3Pr3o(J@8ZkZ$nX70H06.\&DX2H]6A5kbfKo%U8:V#eEgdM4UlQX4)M1%3m/IhlGZZW3%=Ps;*&3//:aoHH0%;fY*!IE1B0@^p<Z6+Mn;%Tgph\nlIF8+_]i>K<rlcd\2`Q6G.jp;1qLSB\U(tnd&pZ+gN']T`#Fj9Z#p0@g":Ne]pJ?\#R5":_Q1%Neae_@gFGUL=^I9A2Leg9&K$3sh$!+rJ(VKm>fm=]\C]ML0nNJDUb1s"$n/Q4<h`bF#KR;VlD,ad[VN=M<IKn3q7:*diD*Atn&,EK'o_gc_Q.al;qI!L.O+R/\U+1<of#Mp+iE<i[W81_&ZjDY#;@mT,U\]W#dXucU7j5fR>3O+`,E]7^Y'hM(bC$DI4eC@Hi7lW;:a<>bi#i02i?MFL[R:=Ook10\oVUa,.I-npN8&,3CeeC''*HIJJaY/QWNYrqZ64MDc4GSnV,>s6.rk%@gYI?LK4h+N:I`h)X1(f=7baf]0@8V5l,+&"4Q9knXaKEcnu3]Z][.OLUs8,2nldcs3p1"f%dI/bE),*5X$72A;WSY-6"N;QTenq6qtRDq#`!<G@o<Xt!q24($_;eNF^&#MT'[Oe4@R%n.n;[tX,=G"U!I!6.IBm[!?9K&T6:#26AR?[HIr??cZ6Q!>g%'a:/Cio0%J<N~>endstream
endobj
endobj
xref
xref
0 12
0 12
@@ -83,11 +83,11 @@ xref
@@ -83,11 +83,11 @@ xref
0000000902 00000 n
0000000902 00000 n
0000001263 00000 n
0000001263 00000 n
0000001328 00000 n
0000001328 00000 n
-0000004769 00000 n
+0000004660 00000 n
trailer
trailer
<<
<<
/ID
/ID
-[<858ee61722a5f5c2c69b17e80403fd90><858ee61722a5f5c2c69b17e80403fd90>]
+[<7629e1a2f6a75fb70111c845e6802214><7629e1a2f6a75fb70111c845e6802214>]
% ReportLab generated PDF document -- digest (opensource)
% ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R
/Info 8 0 R
@@ -95,5 +95,5 @@ trailer
@@ -95,5 +95,5 @@ trailer
/Size 12
/Size 12
>>
>>
startxref
startxref
-7842
+7949
%%EOF
%%EOF
@@ -47,7 +47,7 @@ endobj
@@ -47,7 +47,7 @@ endobj
endobj
endobj
8 0 obj
8 0 obj
<<
<<
-/Author (Alex Frison) /CreationDate (D:20261021063644-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261021063644-07'00') /Producer (ReportLab PDF Library - \(opensource\))
+/Author (Alex Frison) /CreationDate (D:20261106171201-08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261106171201-08'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (IT and Technical Support: Linux and servers, hardware troubleshooting, customer support and escalations) /Title (Alex Frison - Resume) /Trapped /False
/Subject (IT and Technical Support: Linux and servers, hardware troubleshooting, customer support and escalations) /Title (Alex Frison - Resume) /Trapped /False
>>
>>
endobj
endobj
@@ -58,10 +58,10 @@ endobj
@@ -58,10 +58,10 @@ endobj
endobj
endobj
10 0 obj
10 0 obj
<<
<<
-/Filter [ /ASCII85Decode /FlateDecode ] /Length 3089
+/Filter [ /ASCII85Decode /FlateDecode ] /Length 3000
>>
>>
stream
stream
-Gb!#]?$?rB&q/qEeD#WsgXtns3;^!.#tnk:"P^`Y3I-bAZ7XM\lB0S9bi-V2/ZIRO\&jdh#N.S=5GV1Wh-7?</Sa9`bC@M\dH_+PHIJTh7$BX=3fOVDhU1lS`Et9%jceLA0(u&@@imA^HDB02T0D*1BbiA+=K>W?9p69,8(?8U[A+M@]JiOF'tl?ElKffk^=)'a]\>sS]sV?gd'%VOb+3GK]Y,Q6h[c3bB[@#4MScMC;;&hNX@?QOFM9]"_RW't0N+FUV!khCM7WK5me,o5_4Zi^!g`hD5N^hV7ODDdou7.dHm*,PCW&8^V6X0MPJ1t\[^T(N=\Se=&%TnJX/Rq!a2r\aVu"!TDfdLR2u,N?di\O!66_oH7)mDD`?M!qOltH."+$lNil^/cdTjYj)D-Z2Xl'n67MjNAg83@1SuY^n=Jo)3aG/=B^$:^-@U\5[c?:51dsgT0U3fYdp*Uf/3^"LDrjusd(,@'"fV91!rkVsY^X9f'AH(PP3WmZp-G_q@/^s)Mg$i<lRu<i!MZI+1DrEc^f,;+K-juG7,8+Q.WJk_jCBLibBJ"qCA;VqU*D4qZ<uE0^EfmJRZ^V4Ai(Gi/:CEH_#iUV.a25r8XBM7oNTa:UlrqJ`)J';AKnMEHdUP&\W^Or[`Y3_3&Ou[%c&3iuQ#e1O1I^X;j@cKg`[:bgORVm:)GN#TkYs$MUe8-AS=i8SgRt78@4K"M`K?`9f4%B#=Su'#V\X).b_QX:pscjGeS&REV5tK$$3sgMF(&A,H7%f1G1L"R;\JQ2V+drWSYjg!nNTV7;fm'TE>XWHR7PnJrWrbc3NWrf)Xl\(f'6@G/PCf:JeFY]j0^`gZSYRGYn<![9;D81?^-ZQ%i2*7DD,A^9EJ[K,-kUNLgrQBNUiEq::3#^e'M8DK#eq&_QF&9fYj=$P<"WiYFUeaf7;s=*>^/BdqT1n:9'lJlKS@f`bOXS)Wfnl*.)/FWR_m%RLQF)MJYJ9WG^n@`S_=Bs6&J!]CCmjgOj,>EN=dh^W]FGlnU9D$D;3HM:m[1#KsSMGag>sr->GRIr@u^5&prBe`_;d!YBn`mP(f[Q[13EEb0DDKPV=A._(t@q_Y6W:PmebOSWfQ!IrnZSc'VbqL!/^Y%2;9ECi_`J\/?#3o>:?`!GGs$Ij4tZ6Us5lrOEF*9m5bRMm1n\sU_UcYG7b-PS08'NHbIhg6s7MeOBL8U;Cc_%D0UgGD#SZ+Mo7<4ubEMV<6aXl%eWl!5>%7%_/ZNeo>AS=JHr]=5ZiA`9W"1Er,m^M0rT0M@r)iU2@:N)+MMbJ2-_R%<?#,*PftpGdQ%_;[NZ=f4'#<qO="jdbRd$O`m@n)\oAHF@ui:@:?bV$O9@jN0HLiBK1<Isb=mZaXR,O%=>+:,Ol]Rb?Csrs2AGHkjg-n"&^.1fZ/U/==UfdHB-!*N+rZcO#IbWUiO7F4Nrr)<h-:/o(IhR4T%@q5#>E&W.7@>/X)&5R7[YP+GU-bK#'k1o.#Aq/9hpIT8CC>LcSrJSP<&g>RTp[.1rXZi9KeB?-d2j7e>L]/FO*4R]cRUJ9nM\E3T,b6O%*;SD`i_:!DfH0UbG80V$rH\XXl&3@h#:U!3Ni5\XEmPgclhfoO]W&>*t8ZgF:O_!j0An5!p-u)47:4k?1r`Z.C^l%>.AOV8m>D^s4F5'2JQI4ltIc'UJNIK*pXd^7=)XYu!Tk?FgAM#[!^/l[TQ01HWd1HL`JdaS3fW;"+>apsgk/A!_*,K+M;],rr60Z:kE6F'*AdQ`T/P*lXHaZ1InS2RY>;>3s5N"t;5_(3hic6%e+OITq_o$e7*8#O>Bdi>B:gj`ZKkVr1)?q]JX67>ZBXU%DF"rQ@h9&&7Mj^_d:17ih\XQh8KE:e\<,r.8MMs!#Y*28WHsrX&\fm!JkWoS;Ks_X,:)X@0`#=eX,jQo`c*0CAecC^M]U;p-q`4ZZXKg/lV`$9C+S4,LQ_grZc`KRPD]d-QjJm:PN!@J5H3L_qA9%;66I`SL5i-X5NZB[]jDDHJ`OSdfGYXI%SEOY@IG:9++O'NQ[tAGu8#TeF:GIJA`sNV;7]^Zuip_I("0BF_VP8ul/mgupNQnmpfNKlHjm5\:e[gbJU%Ff-&(pJE**k^p>9iKQMKmmQL5d;*(FVQN8-'-#gd]a^=N\3_J6.dL.[8L,FA!\\"-o$F@6X#Htus5of\WP7A-;ZkrcpI-2,XNo(3b&-4.GX+V`i7:c;f<-u.F3oE[/P'lg=O4jBK-oRee2,M5>'XMmP2I+_V_V'?\ocJVKN-XsDUUK5h?b1+"%Z:qIui%S7;-tb,j4*Y$QK@#"akmXF]QEdkGESAV&Lga\R\crF=?^Jn"Q4P6KA15qZ[8KHB<$Ye#&)%!\EJlD:cZU/0U3tK`!c%M&+<cGS<g$@[X<CLp@`:]PP"jZ>26(TW]P5'>T_MnZPC(biqH4&*,@^AJf[Acq$fZ==tcO]m1\^Q\&ng/AQNGL.faV2[:Qbs4Cpq^k/poIP3E@;tOjejh]C9N`UKS$#@Q(SbdG@\3dZZ.Z\4DCObjGmeoG?52ok'@<tiC"-m%Md+MhrJ%oa_J!Q;EL<#F['A&#PSr13&4r))dnd^;`eV*AqkTKA!IgbJCDfcq?+')O4^#KWQep6VK.%`@EUSEsLff>;5!C7E&NF2_e>^ll+-[3g/Btn!o*mGDQ,(M&!<S8FX;_Mt&BiO1ukcW+fJ`L6kcZBAtKn-IML#p@l9EjXcro#=mf-Q:l+CjJ>"f_YtO.?Rph:Gd.,+]mC_@s#k4_gim?.^+&R0?C:]M&09YD*t5jc8#P7l;U"rRfBkM(P`.#b:ABP!nAs]t2^I\P[B*&`fmVZd#04XFrL&m<!.0s-V4tM">&4#btG78[LC/#$W77C:@ib5D]8Mo@^?T9oTf`AFPj;.3AA'`]eIZj2U`'^FnkG2j_n+4XZm!:s=g&Rebub>82fl#7r<I-t:KX13VQl"<'F^i&10aPUV(X`f/ctQ<XY(F)BdZ*!>!BGNkI^I:Li8`2+inI^S[lD\[$;HlXm&_Du>9425P"^Kp=F[t1L5$F`A&F!o-AL<Uj3pm2!E^ol`=5gtYk!ICk4q>~>endstream
+Gb!#\?#poE(4FN4\8U^"!hgQlNV@"?m;+lu`t"2AVTLQd&YN7^lB/Z;8`e"]\PgoO.jhF/VNRa*FA'4&8*A`bg@uW_cQjf_4f2;!,)ThJcRA(e\hnk+a5[tc^PJnT]0/:3Mkeie2W/k]h8>jJ])-@-05t#mTAQ>^MR-fMpA+&7ifeQj>$fYsX.7:<deF30s38tUi9q\C^&D=i0s2eXq7\?klL+tO&bTAEU,Y]O>%R<BA.AAtTSoA''Le]A#qO!69DXB5h09aN3k`4=Vr-CL,6:Mgj,]V[[["t/H@"lX%_e0+Q*h6g^/EW7IS&GJ[dD:=Yp_"!j]O4B:MM)UgL>GHpSklep0,)9]A*7QKBZ)p)3`.=1mZ6-;i/jX.eDHJidfmbXM"6[S[;HpX$I,%Vb9"'$>[e@Q>U,)!REVO.:$@[Buu(r]WX4k3ZK[XA[60MFZWAV/UkL@NjiisnapoWr+he?#al5Lp1T;L^[mNUDtq'`R9uI^\'Gr@-MZbt@s32p<kPoRai//=`DBi%DrEe01`7$N;!'Ns<bUS%;An:_f+qh^d7Oc3aHft`2jCJd/2KUnjW[q-bH3"6J00*gS<QYC#[rEFM(%F3<maG;,5t[L]+Hfl6.oLS+X)l+b_W?B8h6;U=MYL[@DlO"XOJ.lcE(u=/X)ns^8,L]I0.b.#u=p)2)L#EKhCI/<!dJ2+\3R8=u7X@OG^6o3&D<0>2n`KLL3VSW&Z@<23QBk[Q6@r##252P0Ga\_8)nPQ`^UgVfF,J_YN@p8n*:TOD-;\0JkmTr\"Ra743j4#!j,h$,(r^:FQ"@0Le,ZfF*V.1PrtON_5'/,s8lX[M:!mYYnN,&I!TG<j=*GQ'Ea=*)M:C:;/EM7#C#/A3iYH,ZnQXnrKnENE=`Y^c<Zla9jt^??<'LN]T<L.h'ARY`[,3"jNql.9!mVjT<#`e<4J0q>`Sj2>&W).cA&]13)TtR*2/I\up%1CHZ!&]A4iA#*2aR+"-O6NOB,ZoUht9UBmLkR+pi8bCuA8"j1"L2>_h!T_Scun)EG[\*$6JmqeZI7nt:+X_FX4!"fe#*o^B$BI3d0=(S9raOXe$K=_W):P6[3P\AhZW>E/VpuC6!me>YjkAq=%8uD"WQW11&Y\W9lMk0<f(]h9U!P0mi<a^X+rcI)8O\%1%D:"t7j`I@_XsO"8E,f#[;=1ZIS_#'rS7qFmdd%_T%f'VaTu$P]j.dKeRPfEAd'h29Heih-hWI1#o\"Ro0X(_6PEQ6!pNA6d/?ES%<[8=A2_!p27Z!$D]H&e[Yr29[r3MoPfNAAUAGgHB*l]Q3.)(CsFh@TbXe*J2S23<9@0q,9^&3D_kGr(.ao/i]&n)_Y*j9T%rmROfLNa1gIsVZP7%-bqC;@qlN7QSU-*[%:[email protected],e*Fgclf7DS(<*g@\X!cY>4X9q$^<MUCS:kd=)+o/.nL3r'G_ua,Ra'+&.+J^R8K<SO8T8#:eg-EhoS^kp!(n:Y`@EFHmdjF/KSTGCCg>*l6$%OIQT_QIXcUT9kaFeEPJh%Y;>pn2;_bVhJ_d_m&_'V/2Je=:)u+n8VHA<kKmaEKE]ts:U!2k_2hgOfkWg[^[W5H;B>%LQ(gmITk*SAAn4``.;m0h:4mW;r/I3*4'KSs+Y+mE[l&Gjg7(:kZ&HDQp@c-M#l68/8%/Zp>Fip_Tk?FgABco\^1Sf$Q03_Bd1HYO7YY+OD!"[8bh/.jk/e:N%Q6&7M+iT#TQE(?Mabi\ZN01b)CT+*HT$SnjOGQ27<-GcJ#F0)#m.7EaQ4o!!783QK>V;t*7/t.F!sRV\7&&.KPJ#e$ku`cg<>7&^tJ8ulOmH;DF4f&/>oAU[_gEcE]6!+&-L"f;K<(<b)@K[B!aHhJ$DeZ\j;7*k^a*W$>1kg3#NR/`<qiK.%;[ibV28kd/f15FM4Xh'?;qs4ZZLWgt0b^$9VCrT#BFkhII0.U7Y&lBXZ:)::pC^AbLl7L_qA9/RT']`SL7/kY:"nB\cQNY#sJ?T<6T[=g&sQV&>-Co=ODiJ759@J_#<t>4ol0I&R&(]iO;<WP=pS*j*27N3+N6h_f4/ZJR*KN!c^F[pW<+S&;?;kNi4p00,YD@>r"fpqSE,=G+>NQ9oA4H^p1U'rS.n[Z^nCPaX&(mSm;-().*s(n`HG!0scBH+kU;?d&WV/W_T4nAM&%O?iD6s&0nIAW+j:HkVu!XVh,cBZj+-_Q3mWr:5:u(s%Mr)\r!2kNcE)5#g[uX=Esp=OUeL/4d\X/VOg-r<KjNY7^J?]@Fot]8s%#iaQ=a/)[3r=9_A!E'U0Z7FQa*LF!1LY`!/qrfVnQLSW9d9E?t87<I'Q"el@NR0hd\K.T:k=Rk"01<k6glU5E5*=s_d)J<;g]K+r\_AJa09HcA0kJe6X.mXKZ-mEJ:.bLC#HD<$R<VPmk'_5slKLgbb+$TAUfslGNgm_m%SJfG5@(50/_o*dc3=)C;L7_d/Wp.Xc3^ipiNQaTpJEMRFfRrb>M5nTZ:HhR.obb2-U#&04%k\n$,Pcgfcs>9c>@nVr(nLWYj9_;V5&!cH7mfLYRc+lC+RfnS&.6,1k/sG/2lM]o_o?:`1KEX(:_)^D.jeR3QlpoXW6VftaB!`#jM%0n/`8+gMOSU3NeEr/!*8^X>,/nGjV66Zjklo?rg)H-N);N[&:&^2c]9Q9#L).M0Jf[Wh5rEQS-N0Q-%:a&!4MKPcCr=).T09TT5ZeT*6$/8!pA;aX[V[1X+24;$hW$_jJZ*h`'C2i":^l=F_go&]P!<M^*&>PZn[lnaXZ@Kj6i$$#O=R2T<7PInZ3L;##BL]p3#9O]'&p>>abQh?T%@'-Wal/G8rd;JXDaP"C2nkh+*h=*Io2]\0mfU<TLlK5qcCF_.T3.\=e*>/Xg`0o7CW/5&"qo[2E=Jo<W9jU=]3`C\_Mq"TNhdqaN`g`l;6tKs]OHM7t(kqhLY+e8Bupd5Q$^a:!VSO;=FqUX?W<pPPAFr#_GB$+g~>endstream
endobj
endobj
11 0 obj
11 0 obj
<<
<<
@@ -83,11 +83,11 @@ xref
@@ -83,11 +83,11 @@ xref
0000000902 00000 n
0000000902 00000 n
0000001275 00000 n
0000001275 00000 n
0000001340 00000 n
0000001340 00000 n
-0000004521 00000 n
+0000004432 00000 n
trailer
trailer
<<
<<
/ID
/ID
-[<a8f118002d6fd8b1daaf8b897f8fb0a6><a8f118002d6fd8b1daaf8b897f8fb0a6>]
+[<50c9a8ff198432236f139c99b051fcc0><50c9a8ff198432236f139c99b051fcc0>]
% ReportLab generated PDF document -- digest (opensource)
% ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R
/Info 8 0 R
@@ -95,5 +95,5 @@ trailer
@@ -95,5 +95,5 @@ trailer
/Size 12
/Size 12
>>
>>
startxref
startxref
-6718
+6629
%%EOF
%%EOF
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Nov_2026_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Nov_2026_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf and /dev/null differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_amber_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_amber_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_amber_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_amber_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_cyan_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_cyan_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_cyan_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_cyan_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_green_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_green_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_green_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_green_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_indigo_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_indigo_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_indigo_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_indigo_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_lime_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_lime_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_lime_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_lime_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_orange_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_orange_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_orange_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_orange_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_pink_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_pink_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_pink_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_pink_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_red_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_red_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_red_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_red_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_teal_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_teal_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_teal_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_teal_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_violet_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_violet_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_violet_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_violet_e28027d7.pdf differ
deleted file mode 100644
deleted file mode 100644
Binary files a/public/Alex_Frison_Resume_Themed_yellow_38b37ff8.pdf and /dev/null differ
Binary files a/public/Alex_Frison_Resume_Themed_yellow_38b37ff8.pdf and /dev/null differ
new file mode 100644
new file mode 100644
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_yellow_e28027d7.pdf differ
Binary files /dev/null and b/public/Alex_Frison_Resume_Themed_yellow_e28027d7.pdf differ
@@ -52,7 +52,7 @@ VERSIONS = {
@@ -52,7 +52,7 @@ VERSIONS = {
"zero-downtime deploys"]),
"zero-downtime deploys"]),
("AI", ["tool-use agents", "Anthropic and OpenAI-compatible APIs", "local inference (whisper.cpp, Ollama)"]),
("AI", ["tool-use agents", "Anthropic and OpenAI-compatible APIs", "local inference (whisper.cpp, Ollama)"]),
],
],
- "bullets": {"PowerChat": 3, "OpenVibe": 3, "Amazon/analytics": 2, "Amazon/operations": 1, "Verizon Wireless": 2,
+ "bullets": {"PowerChat": 3, "OpenVibe": 4, "Amazon/analytics": 2, "Amazon/operations": 1, "Verizon Wireless": 2,
"founder": 2, "earlier": 1},
"founder": 2, "earlier": 1},
"projects": ["openvibe-live", "openvibe-network", "openvibe-games", "irdr-autonomous-bot"],
"projects": ["openvibe-live", "openvibe-network", "openvibe-games", "irdr-autonomous-bot"],
},
},
@@ -14,8 +14,12 @@ const countWord = WORDS[count] ?? String(count);
@@ -14,8 +14,12 @@ const countWord = WORDS[count] ?? String(count);
<script is:inline>
<script is:inline>
(function () {
(function () {
try {
try {
- if (/(?:^|[?&])pae2(?:[=&]|$)/.test(location.search)) {
- document.documentElement.classList.add("pae2");
+ var q = location.search, d = document.documentElement;
+ if (/(?:^|[?&])PAE2(?:[=&]|$)/.test(q)) {
+ d.classList.add("pae2"); d.classList.add("pae2-crew");
+ document.title = "Welcome, coworker · Alex Frison";
+ } else if (/(?:^|[?&])pae2(?:[=&]|$)/.test(q)) {
+ d.classList.add("pae2");
document.title = "The Amazon Robotics FC Album · Alex Frison";
document.title = "The Amazon Robotics FC Album · Alex Frison";
}
}
} catch (e) {}
} catch (e) {}
@@ -25,7 +29,8 @@ const countWord = WORDS[count] ?? String(count);
@@ -25,7 +29,8 @@ const countWord = WORDS[count] ?? String(count);
<section class="section album" id="album" aria-labelledby="album-title">
<section class="section album" id="album" aria-labelledby="album-title">
<div class="container">
<div class="container">
<div class="album__head">
<div class="album__head">
- <div class="eyebrow"><i class="fa-solid fa-hat-cowboy" aria-hidden="true"></i> You found the hat link</div>
+ <div class="eyebrow album__eyebrow-hat"><i class="fa-solid fa-hat-cowboy" aria-hidden="true"></i> You found the hat link</div>
+ <div class="eyebrow album__eyebrow-crew"><i class="fa-solid fa-people-group" aria-hidden="true"></i> Made for the PAE2 crew</div>
<h2 class="sec-title album__title" id="album-title">{album.title.replace(/FC Album$/, "")}<em>FC Album</em></h2>
<h2 class="sec-title album__title" id="album-title">{album.title.replace(/FC Album$/, "")}<em>FC Album</em></h2>
<p class="album__edition">({album.edition})</p>
<p class="album__edition">({album.edition})</p>
<p class="sec-lead album__lead">{countWord} parody music videos about life on the floor: rates, andons, scanners, AR and everything in between. Turn it up, then keep scrolling for the grown-up part of the site.</p>
<p class="sec-lead album__lead">{countWord} parody music videos about life on the floor: rates, andons, scanners, AR and everything in between. Turn it up, then keep scrolling for the grown-up part of the site.</p>
@@ -140,6 +145,10 @@ const countWord = WORDS[count] ?? String(count);
@@ -140,6 +145,10 @@ const countWord = WORDS[count] ?? String(count);
.album { display: none; }
.album { display: none; }
/* Tight below: the metrics strip that follows has its own top padding. */
/* Tight below: the metrics strip that follows has its own top padding. */
:global(html.pae2) .album { display: block; padding-bottom: clamp(4px, 1vw, 16px); }
:global(html.pae2) .album { display: block; padding-bottom: clamp(4px, 1vw, 16px); }
+ /* The hat line on the hat visit, the crew line on the coworker visit (?PAE2). */
+ .album__eyebrow-crew { display: none; }
+ :global(html.pae2-crew) .album__eyebrow-hat { display: none; }
+ :global(html.pae2-crew) .album__eyebrow-crew { display: inline-flex; }
.album__head { max-width: 760px; margin-bottom: 1.75rem; }
.album__head { max-width: 760px; margin-bottom: 1.75rem; }
.album__head .eyebrow i { margin-right: .35rem; }
.album__head .eyebrow i { margin-right: .35rem; }
.album__title em { font-style: normal; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
.album__title em { font-style: normal; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
@@ -4,12 +4,29 @@ const name = "Alex Frison";
@@ -4,12 +4,29 @@ const name = "Alex Frison";
const words = name.split(" ");
const words = name.split(" ");
const offsets = words.map((_, i) => words.slice(0, i).join(" ").length + (i ? 1 : 0));
const offsets = words.map((_, i) => words.slice(0, i).join(" ").length + (i ? 1 : 0));
import fcAlbum from "../data/fc-album.json";
import fcAlbum from "../data/fc-album.json";
+// The coworker welcome (?PAE2): each letter is its own span so the line can ripple like a wave.
+const crewHi = "Hey, fellow PAE2 coworker!".split(" ");
+let crewI = 0;
+const crewWords = crewHi.map((w) => Array.from(w).map((c) => ({ c, i: crewI++ })));
---
---
<section class="hero" id="top" aria-labelledby="hero-title">
<section class="hero" id="top" aria-labelledby="hero-title">
<canvas class="hero__aurora" id="aurora" aria-hidden="true"></canvas>
<canvas class="hero__aurora" id="aurora" aria-hidden="true"></canvas>
<div class="hero__veil" aria-hidden="true"></div>
<div class="hero__veil" aria-hidden="true"></div>
<div class="container hero__grid">
<div class="container hero__grid">
+ <!-- Only on the coworker link (?PAE2 in capitals): a welcome, then the same album and game as the hat. -->
+ <div class="hero__crew" role="note" aria-label="Hey, fellow PAE2 coworker! Glad you're here: the album and the break room game are just below.">
+ <span class="hero__crew-hand" aria-hidden="true">
+ <span class="hero__crew-ripple"></span><span class="hero__crew-ripple"></span>
+ <span class="hero__crew-emoji">👋</span>
+ </span>
+ <span class="hero__crew-copy" aria-hidden="true">
+ <span class="hero__crew-hi">{crewWords.map((w) => (
+ <span class="hero__crew-word">{w.map((x) => <span class="hero__crew-ch" style={`--i:${x.i}`}>{x.c}</span>)}</span>
+ ))}</span>
+ <span class="hero__crew-sub">Glad you're here. The album and the break room game are just below.</span>
+ </span>
+ </div>
<div class="hero__copy">
<div class="hero__copy">
<p class="hero__status hero__in" style="--d:0ms">
<p class="hero__status hero__in" style="--d:0ms">
<span class="hero__status-seg hero__status-seg--now"><span class="live-dot" aria-hidden="true"></span>Now</span>
<span class="hero__status-seg hero__status-seg--now"><span class="live-dot" aria-hidden="true"></span>Now</span>
@@ -226,6 +243,62 @@ import fcAlbum from "../data/fc-album.json";
@@ -226,6 +243,62 @@ import fcAlbum from "../data/fc-album.json";
:global(html.pae2) .hero__album, .hero__eq i, .hero__album .hero__album-arrow { animation: none; }
:global(html.pae2) .hero__album, .hero__eq i, .hero__album .hero__album-arrow { animation: none; }
.hero__eq i { height: 70%; }
.hero__eq i { height: 70%; }
}
}
+ /* The coworker welcome (html.pae2-crew): a hand that waves, two ripples, the line rising letter by letter like a
+ wave, and one light sweep across the card. Every animation is finite and fills backwards only, so nothing
+ keeps a GPU layer once it has played (phones painted those as blank boxes, 2026-09-26). */
+ .hero__crew { display: none; }
+ /* Wide screens: the welcome sits across the top, close to the copy it introduces. */
+ @media (min-width: 921px) { :global(html.pae2-crew) .hero__grid { row-gap: 22px; } }
+ :global(html.pae2-crew) .hero__crew {
+ position: relative; overflow: hidden; display: flex; align-items: center; gap: 14px;
+ grid-column: 1 / -1; justify-self: start;
+ width: fit-content; max-width: 100%; margin: 0; padding: 12px 20px 12px 12px; border-radius: 20px;
+ border: 1px solid rgba(var(--accent-rgb), .34);
+ background:
+ linear-gradient(115deg, rgba(var(--accent-rgb), .16), rgba(var(--accent-2-rgb), .10) 55%, rgba(var(--accent-3-rgb), .14)),
+ var(--surface);
+ box-shadow: 0 14px 34px -22px rgba(var(--accent-2-rgb), .9);
+ animation: crewIn .7s var(--ease) .1s backwards;
+ }
+ :global(html.pae2-crew) .hero__crew::after {
+ content: ""; position: absolute; inset: 0; pointer-events: none; transform: translateX(-130%);
+ background: linear-gradient(100deg, transparent 30%, rgba(255, 255, 255, .16) 50%, transparent 70%);
+ animation: crewSweep 1.4s var(--ease) 1.6s backwards;
+ }
+ .hero__crew-hand { position: relative; flex: none; display: grid; place-items: center; width: 54px; height: 54px; border-radius: 50%;
+ background: radial-gradient(circle at 35% 30%, rgba(var(--accent-2-rgb), .30), rgba(var(--accent-rgb), .14)); }
+ .hero__crew-emoji { display: inline-block; font-size: 29px; line-height: 1; transform-origin: 70% 80%;
+ animation: crewWave 1.8s ease-in-out .55s 3 backwards; }
+ .hero__crew-ripple { position: absolute; inset: 0; border-radius: 50%; border: 2px solid rgba(var(--accent-rgb), .55); opacity: 0;
+ animation: crewRipple 1.8s ease-out .55s 3 backwards; }
+ .hero__crew-ripple + .hero__crew-ripple { border-color: rgba(var(--accent-2-rgb), .5); animation-delay: 1.45s; }
+ .hero__crew-copy { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
+ .hero__crew-hi { color: var(--fg); font: 700 clamp(1.02rem, 2.3vw, 1.22rem)/1.25 var(--font-display, var(--font-body)); letter-spacing: -.01em; }
+ .hero__crew-word { display: inline-block; white-space: nowrap; margin-right: .28em; }
+ .hero__crew-word:last-child { margin-right: 0; }
+ .hero__crew-ch { display: inline-block; animation: crewBob 1s var(--ease) backwards; animation-delay: calc(.35s + var(--i) * 38ms); }
+ .hero__crew-sub { color: var(--dim); font: 500 .86rem/1.35 var(--font-body); }
+ @keyframes crewIn { from { opacity: 0; transform: translateY(-8px) scale(.97); } to { opacity: 1; transform: none; } }
+ @keyframes crewSweep { from { transform: translateX(-130%); } to { transform: translateX(130%); } }
+ @keyframes crewWave {
+ 0%, 62%, 100% { transform: rotate(0); }
+ 10% { transform: rotate(18deg); } 20% { transform: rotate(-9deg); } 30% { transform: rotate(16deg); }
+ 40% { transform: rotate(-5deg); } 50% { transform: rotate(10deg); }
+ }
+ @keyframes crewRipple { from { opacity: .85; transform: scale(.85); } to { opacity: 0; transform: scale(1.75); } }
+ @keyframes crewBob {
+ 0% { opacity: 0; transform: translateY(6px); } 35% { opacity: 1; transform: translateY(-7px); }
+ 65% { transform: translateY(1.5px); } 100% { opacity: 1; transform: none; }
+ }
+ @media (max-width: 520px) {
+ :global(html.pae2-crew) .hero__crew { width: 100%; gap: 12px; padding: 11px 14px 11px 11px; border-radius: 18px; }
+ .hero__crew-hand { width: 48px; height: 48px; }
+ .hero__crew-emoji { font-size: 26px; }
+ }
+ @media (prefers-reduced-motion: reduce) {
+ :global(html.pae2-crew) .hero__crew, :global(html.pae2-crew) .hero__crew::after,
+ .hero__crew-emoji, .hero__crew-ripple, .hero__crew-ch { animation: none; }
+ }
.hero__tags { max-width: 620px; }
.hero__tags { max-width: 620px; }
@media (max-width: 920px) { .hero__tags { max-width: none; } }
@media (max-width: 920px) { .hero__tags { max-width: none; } }
.hero__tags-label { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; font: 500 .72rem var(--font-mono); letter-spacing: .16em; text-transform: uppercase; color: var(--dim); }
.hero__tags-label { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; font: 500 .72rem var(--font-mono); letter-spacing: .16em; text-transform: uppercase; color: var(--dim); }
@@ -338,6 +411,7 @@ import fcAlbum from "../data/fc-album.json";
@@ -338,6 +411,7 @@ import fcAlbum from "../data/fc-album.json";
.hero { min-height: auto; padding-top: calc(var(--nav-h) + 30px); padding-bottom: 16px; }
.hero { min-height: auto; padding-top: calc(var(--nav-h) + 30px); padding-bottom: 16px; }
.hero__grid { grid-template-columns: 1fr; }
.hero__grid { grid-template-columns: 1fr; }
.hero__visual { order: -1; }
.hero__visual { order: -1; }
+ :global(html.pae2-crew) .hero__crew { order: -2; justify-self: stretch; width: auto; }
.portrait { width: min(290px, 72vw); margin-top: 10px; }
.portrait { width: min(290px, 72vw); margin-top: 10px; }
/* On narrow screens the tags hang off the plinth's edges instead of sitting over the face. */
/* On narrow screens the tags hang off the plinth's edges instead of sitting over the face. */
.portrait__tag--tl { top: 25%; left: -6%; font-size: .66rem; padding: 6px 10px; }
.portrait__tag--tl { top: 25%; left: -6%; font-size: .66rem; padding: 6px 10px; }
@@ -3,23 +3,27 @@
@@ -3,23 +3,27 @@
"role": "Founder · Architect · Sole Engineer",
"role": "Founder · Architect · Sole Engineer",
"start": "2026",
"start": "2026",
"end": "Present",
"end": "Present",
- "location": "openvibe.live and 20+ domains",
+ "location": "openvibe.live and 50+ domains",
"kind": "founder",
"kind": "founder",
"link": "https://openvibe.live",
"link": "https://openvibe.live",
"featured": true,
"featured": true,
"current": true,
"current": true,
"order": 2,
"order": 2,
- "summary": "An open, community-run live-streaming network I own end to end. Launched in 2026 as a single streaming site and grown, in the same year, into seven connected apps sharing one login, with me as the only engineer on it.",
+ "summary": "An open, community-run network of websites I own end to end. Launched in 2026 as a single live-streaming site and grown, in the same year, into more than fifty connected sites that share one login, with me as the only engineer on it.",
"bullets": [
"bullets": [
- "Designed and built an entire network of seven apps that work together under one account: live streaming, sign-in and a virtual-currency wallet, media storage, a 169-tool toolbox, a browser game and a community hub. About 363,000 lines of code and 900+ web endpoints — all built, deployed and kept running by me alone.",
- "Built the live-streaming engine from the ground up: anyone can broadcast from a browser or an app, and it automatically re-broadcasts to Twitch, YouTube, Kick and more at the same time, saves the recording and auto-generates short clips. It also produces live captions and translates them into about 21 languages in real time, and uses AI to spot and label the best moments in every stream.",
- "Ran it like a real product: I built a deploy pipeline that updates the live site with zero downtime viewers ever notice, cut the homepage's load time roughly in half and eliminated the jarring layout jumps it used to have, and — when it came time to move everything to new infrastructure — moved every user, every account balance and every active player over with zero downtime and zero data loss."
+ "Designed and built a network of 50+ websites that share one account: live streaming, chat and video, a wallet and payments, an AI model marketplace, travel, shopping and job search, a browser game and more. Over a million lines of code and 900+ web endpoints, all built, deployed and run by me alone.",
+ "Built the live-streaming engine from the ground up: anyone can broadcast from a browser or an app, and it re-broadcasts to Twitch, YouTube, Kick and more at once, saves the recording and cuts short clips. It captions and translates streams into about 21 languages live, and AI picks the best moments and writes up what every stream talked about.",
+ "Ran it like a real product: zero-downtime deploys, a homepage that loads about twice as fast without layout jumps, and a move of every site to new infrastructure and PostgreSQL with every user, balance and active player carried over, with zero downtime and zero data loss.",
+ "Built its AI side: one account that reaches every major AI model with live prices, speed and uptime; agents that write code and finish tasks while people watch them work live; and an app that connects your own computer to run AI or share it."
],
],
"stack": [
"stack": [
"Node.js",
"Node.js",
"TypeScript",
"TypeScript",
"Express",
"Express",
- "SQLite (WAL)",
+ "WebRTC / WHIP",
+ "LLM APIs",
+ "Go",
+ "PostgreSQL",
"mediasoup",
"mediasoup",
"werift",
"werift",
"ffmpeg",
"ffmpeg",
@@ -20,7 +20,7 @@
@@ -20,7 +20,7 @@
{ "icon": "fa-solid fa-layer-group", "title": "Ships the whole product", "text": "Design, code, infrastructure, deployment and support, with no hand-off in between." },
{ "icon": "fa-solid fa-layer-group", "title": "Ships the whole product", "text": "Design, code, infrastructure, deployment and support, with no hand-off in between." },
{ "icon": "fa-solid fa-credit-card", "title": "Moves money safely", "text": "Rebuilt PowerChat's payments across five processors, with ledgers that make double-charging impossible." },
{ "icon": "fa-solid fa-credit-card", "title": "Moves money safely", "text": "Rebuilt PowerChat's payments across five processors, with ledgers that make double-charging impossible." },
{ "icon": "fa-solid fa-robot", "title": "Builds AI that does real work", "text": "Autonomous agents that researched and wrote compliance reports Amazon associates used every day." },
{ "icon": "fa-solid fa-robot", "title": "Builds AI that does real work", "text": "Autonomous agents that researched and wrote compliance reports Amazon associates used every day." },
- { "icon": "fa-solid fa-server", "title": "Runs it in production", "text": "25+ sites and services with zero-downtime deploys, operated by one person." },
+ { "icon": "fa-solid fa-server", "title": "Runs it in production", "text": "50+ sites and services with zero-downtime deploys, operated by one person." },
{ "icon": "fa-solid fa-handshake", "title": "Understands the business side", "text": "Ten years running my own company, three leading a retail sales team, then a year each in Amazon Robotics operations and floor leadership and as an Amazon ICQA data analyst." }
{ "icon": "fa-solid fa-handshake", "title": "Understands the business side", "text": "Ten years running my own company, three leading a retail sales team, then a year each in Amazon Robotics operations and floor leadership and as an Amazon ICQA data analyst." }
],
],
"roles": ["Software Engineer", "Full-Stack Developer", "AI Agent Builder", "Data Analyst", "Business Owner", "Automation Engineer", "Platform Architect", "Product Builder", "Team Leader", "Problem Solver"],
"roles": ["Software Engineer", "Full-Stack Developer", "AI Agent Builder", "Data Analyst", "Business Owner", "Automation Engineer", "Platform Architect", "Product Builder", "Team Leader", "Problem Solver"],
@@ -36,13 +36,13 @@
@@ -36,13 +36,13 @@
"githubDisplay": "github.com/OpenVibers",
"githubDisplay": "github.com/OpenVibers",
"linkedin": "https://www.linkedin.com/in/fris/",
"linkedin": "https://www.linkedin.com/in/fris/",
"linkedinDisplay": "linkedin.com/in/fris",
"linkedinDisplay": "linkedin.com/in/fris",
- "resumePdf": "/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf",
+ "resumePdf": "/Alex_Frison_Resume_Nov_2026_e28027d7.pdf",
"availability": "Open to pretty much anything — engineering, platform, analytics, ops, sales, whatever fits · remote or Pacific Northwest",
"availability": "Open to pretty much anything — engineering, platform, analytics, ops, sales, whatever fits · remote or Pacific Northwest",
"status": {
"status": {
"now": "Contract software engineer at PowerChat, building its developer platform and payments program.",
"now": "Contract software engineer at PowerChat, building its developer platform and payments program.",
- "also": "Founder and sole engineer of OpenVibe: 39 live sites behind one login, one operator."
+ "also": "Founder and sole engineer of OpenVibe: 53 live sites behind one login, one operator."
},
},
- "pitch": "I'm a software engineer and business owner who builds complete products and keeps them running: websites, platforms, payment systems, AI agents and the automation behind them. Over the last decade I've shipped 25+ sites and services, rebuilt a live payments program across five processors, led a sales team, and turned an Amazon data-analysis job into tooling other Amazon associates used every day. Give me a problem or a rough idea and I'll deliver the whole thing: design, code, deployment and support.",
+ "pitch": "I'm a software engineer and business owner who builds complete products and keeps them running: websites, platforms, payment systems, AI agents and the automation behind them. Over the last decade I've shipped 50+ sites and services, rebuilt a live payments program across five processors, led a sales team, and turned an Amazon data-analysis job into tooling other Amazon associates used every day. Give me a problem or a rough idea and I'll deliver the whole thing: design, code, deployment and support.",
"seeking": [
"seeking": [
{ "label": "Honestly, open to anything", "detail": "Title and level are negotiable. The team, the problem and the chance to own something matter more than the label." },
{ "label": "Honestly, open to anything", "detail": "Title and level are negotiable. The team, the problem and the chance to own something matter more than the label." },
{ "label": "Software engineering", "detail": "Full-stack web apps, platforms, APIs, payments, streaming and realtime systems, designed, shipped and kept running in production." },
{ "label": "Software engineering", "detail": "Full-stack web apps, platforms, APIs, payments, streaming and realtime systems, designed, shipped and kept running in production." },
@@ -52,8 +52,8 @@
@@ -52,8 +52,8 @@
"foundedOrg": "Own company, LLC",
"foundedOrg": "Own company, LLC",
"lastRole": "PowerChat — Software Engineer (Contract)",
"lastRole": "PowerChat — Software Engineer (Contract)",
"metrics": [
"metrics": [
- { "num": 25, "suffix": "+", "label": "Websites, apps and services designed, built and shipped end to end", "short": "Sites and services shipped", "icon": "fa-solid fa-cubes-stacked" },
- { "num": 500, "suffix": "k+", "label": "Lines of production code written and maintained", "short": "Lines of production code", "icon": "fa-solid fa-code" },
+ { "num": 50, "suffix": "+", "label": "Websites, apps and services designed, built and shipped end to end", "short": "Sites and services shipped", "icon": "fa-solid fa-cubes-stacked" },
+ { "num": 1, "suffix": "M+", "label": "Lines of production code written and maintained", "short": "Lines of production code", "icon": "fa-solid fa-code" },
{ "num": 900, "suffix": "+", "label": "API endpoints and pages running in production, all built solo", "short": "Endpoints live in production", "icon": "fa-solid fa-route" },
{ "num": 900, "suffix": "+", "label": "API endpoints and pages running in production, all built solo", "short": "Endpoints live in production", "icon": "fa-solid fa-route" },
{ "num": 169, "suffix": "", "label": "Free web tools built and published for anyone to use", "short": "Free web tools published", "icon": "fa-solid fa-toolbox" },
{ "num": 169, "suffix": "", "label": "Free web tools built and published for anyone to use", "short": "Free web tools published", "icon": "fa-solid fa-toolbox" },
{ "num": 5, "suffix": "", "label": "Payment processors merged into one billing system that can't double-charge", "short": "Payment processors unified", "icon": "fa-solid fa-credit-card" },
{ "num": 5, "suffix": "", "label": "Payment processors merged into one billing system that can't double-charge", "short": "Payment processors unified", "icon": "fa-solid fa-credit-card" },
@@ -94,6 +94,15 @@
@@ -94,6 +94,15 @@
{ "name": "OpenVibe.Homes", "url": "https://openvibe.homes", "role": "Home buying", "group": "people" },
{ "name": "OpenVibe.Homes", "url": "https://openvibe.homes", "role": "Home buying", "group": "people" },
{ "name": "OpenVibe.Food", "url": "https://openvibe.food", "role": "Food and meals", "group": "people" },
{ "name": "OpenVibe.Food", "url": "https://openvibe.food", "role": "Food and meals", "group": "people" },
{ "name": "OpenVibe.Host", "url": "https://openvibe.host", "role": "Hosting compared", "group": "people" },
{ "name": "OpenVibe.Host", "url": "https://openvibe.host", "role": "Hosting compared", "group": "people" },
+ { "name": "OpenVibe.Design", "url": "https://openvibe.design", "role": "Themes and AI design", "group": "people" },
+ { "name": "OpenVibe.Report", "url": "https://openvibe.report", "role": "Open numbers", "group": "people" },
+ { "name": "OpenVibe.Today", "url": "https://openvibe.today", "role": "Calendar", "group": "people" },
+ { "name": "OpenVibe.Tours", "url": "https://openvibe.tours", "role": "Travel", "group": "people" },
+ { "name": "OpenVibe.Fun", "url": "https://openvibe.fun", "role": "Things to do", "group": "people" },
+ { "name": "OpenVibe.Meme", "url": "https://openvibe.meme", "role": "Meme database", "group": "people" },
+ { "name": "OpenVibe.Surf", "url": "https://openvibe.surf", "role": "Surf maps", "group": "people" },
+ { "name": "OpenVibe.Cam", "url": "https://openvibe.cam", "role": "Camera app", "group": "people" },
+ { "name": "Open.Shoes", "url": "https://open.shoes", "role": "Shoe prices", "group": "people" },
{ "name": "OpenVibe.Services", "url": "https://openvibe.services", "role": "Developer platform", "group": "builders" },
{ "name": "OpenVibe.Services", "url": "https://openvibe.services", "role": "Developer platform", "group": "builders" },
{ "name": "OpenVibe.AI", "url": "https://ai.openvibe.services", "role": "AI layer", "group": "builders" },
{ "name": "OpenVibe.AI", "url": "https://ai.openvibe.services", "role": "AI layer", "group": "builders" },
{ "name": "OpenVibe.Codes", "url": "https://openvibe.codes", "role": "Coding agents", "group": "builders" },
{ "name": "OpenVibe.Codes", "url": "https://openvibe.codes", "role": "Coding agents", "group": "builders" },
@@ -103,7 +112,12 @@
@@ -103,7 +112,12 @@
{ "name": "OpenVibe.Events", "url": "https://openvibe.events", "role": "Event delivery", "group": "builders" },
{ "name": "OpenVibe.Events", "url": "https://openvibe.events", "role": "Event delivery", "group": "builders" },
{ "name": "OpenVibe.Watch", "url": "https://openvibe.watch", "role": "Watches", "group": "builders" },
{ "name": "OpenVibe.Watch", "url": "https://openvibe.watch", "role": "Watches", "group": "builders" },
{ "name": "OpenVibe.Space", "url": "https://openvibe.space", "role": "Static hosting", "group": "builders" },
{ "name": "OpenVibe.Space", "url": "https://openvibe.space", "role": "Static hosting", "group": "builders" },
- { "name": "OpenVibe.Zone", "url": "https://openvibe.zone", "role": "S3 storage", "group": "builders" }
+ { "name": "OpenVibe.Zone", "url": "https://openvibe.zone", "role": "S3 storage", "group": "builders" },
+ { "name": "OpenVibe.Exchange", "url": "https://openvibe.exchange", "role": "AI marketplace", "group": "builders" },
+ { "name": "OpenVibe.Vision", "url": "https://openvibe.vision", "role": "Image AI", "group": "builders" },
+ { "name": "OpenVibe.Website", "url": "https://openvibe.website", "role": "Website builder", "group": "builders" },
+ { "name": "OpenVibe.Domains", "url": "https://openvibe.domains", "role": "Domain prices", "group": "builders" },
+ { "name": "OpenVibe Node", "url": "https://node.openvibe.network", "role": "Your own computer", "group": "builders" }
],
],
"education": "Snohomish High School, WA. AP Statistics, Calculus, English, Creative Writing and Spanish. Self-taught engineer since age 12: systems, infrastructure, graphics, hardware and whatever the problem needs.",
"education": "Snohomish High School, WA. AP Statistics, Calculus, English, Creative Writing and Spanish. Self-taught engineer since age 12: systems, infrastructure, graphics, hardware and whatever the problem needs.",
"capabilities": ["websites", "platforms", "APIs", "dashboards", "AI features", "automations", "identity systems", "payment systems", "real-time chat", "streaming infra", "whatever you need"]
"capabilities": ["websites", "platforms", "APIs", "dashboards", "AI features", "automations", "identity systems", "payment systems", "real-time chat", "streaming infra", "whatever you need"]
@@ -1,15 +1,15 @@
@@ -1,15 +1,15 @@
{
{
- "amber": "/Alex_Frison_Resume_Themed_amber_38b37ff8.pdf",
- "blue": "/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf",
- "cyan": "/Alex_Frison_Resume_Themed_cyan_38b37ff8.pdf",
- "default": "/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf",
- "green": "/Alex_Frison_Resume_Themed_green_38b37ff8.pdf",
- "indigo": "/Alex_Frison_Resume_Themed_indigo_38b37ff8.pdf",
- "lime": "/Alex_Frison_Resume_Themed_lime_38b37ff8.pdf",
- "orange": "/Alex_Frison_Resume_Themed_orange_38b37ff8.pdf",
- "pink": "/Alex_Frison_Resume_Themed_pink_38b37ff8.pdf",
- "red": "/Alex_Frison_Resume_Themed_red_38b37ff8.pdf",
- "teal": "/Alex_Frison_Resume_Themed_teal_38b37ff8.pdf",
- "violet": "/Alex_Frison_Resume_Themed_violet_38b37ff8.pdf",
- "yellow": "/Alex_Frison_Resume_Themed_yellow_38b37ff8.pdf"
+ "amber": "/Alex_Frison_Resume_Themed_amber_e28027d7.pdf",
+ "blue": "/Alex_Frison_Resume_Nov_2026_e28027d7.pdf",
+ "cyan": "/Alex_Frison_Resume_Themed_cyan_e28027d7.pdf",
+ "default": "/Alex_Frison_Resume_Nov_2026_e28027d7.pdf",
+ "green": "/Alex_Frison_Resume_Themed_green_e28027d7.pdf",
+ "indigo": "/Alex_Frison_Resume_Themed_indigo_e28027d7.pdf",
+ "lime": "/Alex_Frison_Resume_Themed_lime_e28027d7.pdf",
+ "orange": "/Alex_Frison_Resume_Themed_orange_e28027d7.pdf",
+ "pink": "/Alex_Frison_Resume_Themed_pink_e28027d7.pdf",
+ "red": "/Alex_Frison_Resume_Themed_red_e28027d7.pdf",
+ "teal": "/Alex_Frison_Resume_Themed_teal_e28027d7.pdf",
+ "violet": "/Alex_Frison_Resume_Themed_violet_e28027d7.pdf",
+ "yellow": "/Alex_Frison_Resume_Themed_yellow_e28027d7.pdf"
}
}
@@ -84,6 +84,13 @@ const imageUrl = new URL(image, site).toString();
@@ -84,6 +84,13 @@ const imageUrl = new URL(image, site).toString();
(function () {
(function () {
var d = document.documentElement;
var d = document.documentElement;
d.classList.remove('no-js');
d.classList.remove('no-js');
+ // The FC album visits: ?pae2 from the hat (fc.tools), ?PAE2 in capitals from a link handed to coworkers
+ // (the same album and game, with a welcome instead of the hat line). Marked here, before paint.
+ try {
+ var q = location.search;
+ if (/(?:^|[?&])PAE2(?:[=&]|$)/.test(q)) { d.classList.add('pae2'); d.classList.add('pae2-crew'); }
+ else if (/(?:^|[?&])pae2(?:[=&]|$)/.test(q)) d.classList.add('pae2');
+ } catch (e) {}
try {
try {
var t = localStorage.getItem('afnet-theme');
var t = localStorage.getItem('afnet-theme');
if (t === 'light' || t === 'dark') d.dataset.theme = t;
if (t === 'light' || t === 'dark') d.dataset.theme = t;