From cd9737ddb775989454ebbb10ca2266fb4987fdd0 Mon Sep 17 00:00:00 2001 From: Green! <81369743+GreenyDEV@users.noreply.github.com> Date: Tue, 7 Jun 2022 01:54:29 -0400 Subject: [PATCH] v7 --- app.js | 74 +- static/images/cur.gif | Bin 0 -> 2635 bytes static/images/cursor.cur | Bin 0 -> 2031 bytes static/images/logo.png | Bin 0 -> 34969 bytes static/index.html | 65 + static/mobile/.DS_Store | Bin 0 -> 6148 bytes static/mobile/index.html | 49 + static/mobile/resources/deviceHandler.js | 1 + static/mobile/resources/form.js | 160 + static/mobile/style/main.css | 197 + static/mobile/style/master.css | 72 + static/mobile/style/options.css | 230 + static/mobile/sw.js | 5 + static/mobile/uv/uv.bundle.js | 39304 +++++++++++++++++++++ static/mobile/uv/uv.config.js | 10 + static/mobile/uv/uv.handler.js | 1129 + static/mobile/uv/uv.sw.js | 789 + static/options/index.html | 85 + static/resources/deviceHandler.js | 1 + static/resources/form.js | 77 + static/resources/options.js | 52 + static/style/main.css | 197 + static/style/master.css | 74 + static/style/options.css | 328 + static/sw.js | 5 + static/uv/uv.bundle.js | 39304 +++++++++++++++++++++ static/uv/uv.config.js | 10 + static/uv/uv.handler.js | 1129 + static/uv/uv.sw.js | 789 + 29 files changed, 84099 insertions(+), 37 deletions(-) create mode 100644 static/images/cur.gif create mode 100644 static/images/cursor.cur create mode 100644 static/images/logo.png create mode 100644 static/index.html create mode 100644 static/mobile/.DS_Store create mode 100644 static/mobile/index.html create mode 100644 static/mobile/resources/deviceHandler.js create mode 100644 static/mobile/resources/form.js create mode 100644 static/mobile/style/main.css create mode 100644 static/mobile/style/master.css create mode 100644 static/mobile/style/options.css create mode 100644 static/mobile/sw.js create mode 100644 static/mobile/uv/uv.bundle.js create mode 100644 static/mobile/uv/uv.config.js create mode 100644 static/mobile/uv/uv.handler.js create mode 100644 static/mobile/uv/uv.sw.js create mode 100644 static/options/index.html create mode 100644 static/resources/deviceHandler.js create mode 100644 static/resources/form.js create mode 100644 static/resources/options.js create mode 100644 static/style/main.css create mode 100644 static/style/master.css create mode 100644 static/style/options.css create mode 100644 static/sw.js create mode 100644 static/uv/uv.bundle.js create mode 100644 static/uv/uv.config.js create mode 100644 static/uv/uv.handler.js create mode 100644 static/uv/uv.sw.js diff --git a/app.js b/app.js index a99b8a2..667a09d 100644 --- a/app.js +++ b/app.js @@ -12,54 +12,54 @@ const fakeServe = new nodeStatic.Server('fakeStatic/'); const server = https.createServer(); fs.readdir('/etc/letsencrypt/live', { withFileTypes: true }, (err, files) => { - if (!err) - files - .filter(file => file.isDirectory()) - .map(folder => folder.name) - .forEach(dir => { - server.addContext(dir, { - key: fs.readFileSync(`/etc/letsencrypt/live/${dir}/privkey.pem`), - cert: fs.readFileSync(`/etc/letsencrypt/live/${dir}/fullchain.pem`) - }); - }); + if (!err) + files + .filter(file => file.isDirectory()) + .map(folder => folder.name) + .forEach(dir => { + server.addContext(dir, { + key: fs.readFileSync(`/etc/letsencrypt/live/${dir}/privkey.pem`), + cert: fs.readFileSync(`/etc/letsencrypt/live/${dir}/fullchain.pem`) + }); + }); }); server.on('request', (request, response) => { - const ip = request.headers['x-forwarded-for'] || request.connection.remoteAddress; + const ip = request.headers['x-forwarded-for'] || request.connection.remoteAddress; - const isLS = ip.startsWith('34.216.110') || ip.startsWith('54.244.51') || ip.startsWith('54.172.60') || ip.startsWith('34.203.250') || ip.startsWith('34.203.254') || ['18.237.145.219', '34.213.241.18', '54.184.142.71', '34.219.54.89', '52.13.31.12', '52.89.157.185', '34.208.60.206', '3.80.101.141', '54.90.242.158', '54.172.185.65', '3.83.250.144', '18.209.180.25', '54.167.181.168', '54.166.136.197', '52.207.207.52', '54.252.242.153', '3.104.121.59', '34.253.198.121', '63.33.56.11', '34.250.114.219', '54.171.251.199'].includes(ip); + const isLS = ip.startsWith('34.216.110') || ip.startsWith('54.244.51') || ip.startsWith('54.172.60') || ip.startsWith('34.203.250') || ip.startsWith('34.203.254') || ['18.237.145.219', '34.213.241.18', '54.184.142.71', '34.219.54.89', '52.13.31.12', '52.89.157.185', '34.208.60.206', '3.80.101.141', '54.90.242.158', '54.172.185.65', '3.83.250.144', '18.209.180.25', '54.167.181.168', '54.166.136.197', '52.207.207.52', '54.252.242.153', '3.104.121.59', '34.253.198.121', '63.33.56.11', '34.250.114.219', '54.171.251.199'].includes(ip); - const unlockNow = request.url === '/?unlock'; - if (unlockNow) - response.setHeader('Set-Cookie', ['key=standard; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/']); - const unlockPatronNow = request.url === '/?unlockPatron'; - if (unlockPatronNow) - response.setHeader('Set-Cookie', ['key=patron; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/']); + const unlockNow = request.url === '/?unlock'; + if (unlockNow) + response.setHeader('Set-Cookie', ['key=standard; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/']); + const unlockPatronNow = request.url === '/?unlockPatron'; + if (unlockPatronNow) + response.setHeader('Set-Cookie', ['key=patron; expires=Sun, 1 Jan 2023 00:00:00 UTC; path=/']); - const unlocked = request.headers['cookie'] === 'key=standard' || unlockNow; - const patronUnlocked = request.headers['cookie'] === 'key=patron' || unlockPatronNow; + const unlocked = request.headers['cookie'] === 'key=standard' || unlockNow; + const patronUnlocked = request.headers['cookie'] === 'key=patron' || unlockPatronNow; - if (bare.route_request(request, response)) - return true; + if (bare.route_request(request, response)) + return true; - if (!(unlocked || patronUnlocked) && (isLS || request.headers.host === 'nebulaproxy.nebula.bio' && !request.headers['user-agent'].match(/CrOS/))) - fakeServe.serve(request, response); - else { - if (bare.route_request(request, response)) - return true; - - if (patronUnlocked) - patronServe.serve(request, response); - else - serve.serve(request, response); - } + if (!(unlocked || patronUnlocked) && (isLS || request.headers.host === 'nebulaproxy.nebula.bio' && !request.headers['user-agent'].match(/CrOS/))) + fakeServe.serve(request, response); + else { + if (bare.route_request(request, response)) + return true; + + if (patronUnlocked) + patronServe.serve(request, response); + else + serve.serve(request, response); + } }); server.on('upgrade', (req, socket, head) => { - if (bare.route_upgrade(req, socket, head)) - return; + if (bare.route_upgrade(req, socket, head)) + return; - socket.end(); + socket.end(); }); -server.listen(443); +server.listen(443); \ No newline at end of file diff --git a/static/images/cur.gif b/static/images/cur.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9fd26a08793c53a6965535bb021c191ccd7769a GIT binary patch literal 2635 zcmV-R3bge{Nk%w1VE_UE0-^u_0002!`1$Dh_~`lh>G}Bp0000000000A^8La3IG5A zEC2ui000620ssU52)f+}*8aUg{yZ>M)j$~<`XsWJk>t?X#&U9_xc&_h!U&aFh zaNsK%kI1BQ$t(_^#HMsgty-^G6BL^5dcWYXn6>4O&*-#zEiG@^@VIBcf`f!Pe`SSirl+Viq@}5?uCE`f ztgy7Twg9rTx4XQcxw^fMb!^g;b#m33a&T7ld&(qXd(bCn~+Dg~h+uz`Z-GJfc z=HlaK=j-fb>E!M4@^_1^jY>-+rt3H$~y;J|~^3K~Sn@R-7d4I}P)2vMTN zR}?E=+-NHQqehM(HF^9PvSg%@Bu%O;gfivImwX-ucm%WNrj~AO>YRi#=gyysdin%P zG?37tMU&P!id3mnHcXp7ojN9}RH|6JSiPFHE0wKWy^7@q*5%lDydkk-#*p-w(;O zJk$OECgpbsfcy!lAAu1WI3R-GDR>}*139=Lga}DEA%y~2cp--QXt*JV^LY3ni0z0t zB8lgicp{47sJJ4F+qn25jMd0EBaP44cq5L<=(r<~!}$0kki7^wB$2lmc_fmwD7hq) zt~mK5l&DBKC6%IBc_o&gXt^bqnRxjnm^_L3AepI{IVPHmsJSMaEV+3moL%0rmYQ@{ zDWL!q<=K&(H2LWZpn(c15}}0}N(poRk#c7}ieiE&42`N2X(N+%a_LE#TCyoIoqGCd zBB5$JY9*zLda6;Ws=BH&t-AW^QnAW9s~okOdg~my>bff&y<$+QJ-?z6tgpoyd#tVh z$%a7+pS?D#?6S;CYYleL(q^r*)RMC87u~M%tybZBJMI8iVK8||9=E)(&( zJ8u&8+Iz1N`RcnbT^o37L7%4DV2=icYE)DDOFvJn(HL)xe+aO@J)MZS= z#lLv`f-DQiE3!KvQ+zTCDYLcmU@eFI@((e~JhKQjyL>Y}Ijg+0BR$*vb7MgZJv0SH z>wNSCNh`fH1Wga{D6&sC5Vg})FK{*1S#Qnt(_Vjlbl775Om^8fpN;m*YOj5A+irUd zcia`vO?Sg~-%W7ddhg43-}C-WN~1dq4*0o-AO3CPid)Nge6r3zk9lGx3#htY%16)qtJ-(deD~6?3cmNZj!!=Kt5mPO=fYoq z{;1}sBYynjoT{b!w5k7#!0^*A|EB&k&!qw=Kt&O-fPy+80`sK61;VL;4nz|KBM7Dm zQV>fPydab^s6ixgu!BJQAP8|J!V$u#geF803R4IoO095vJbEDuDI~)gGN^_&BoGe& zfWH`caEJekArON|qao(-Jw`m@d6K9^@6d*0vpXRZn<$+rLW)FIydsDHvZzHGa*>L@ z`C=ClB*rlUsElU34;s^m#5ID^G~>`86LsiDHafA6cC-#2_o2o;=21C*XWcc7H z%7^IYlblSXYFe2Q+0e3+Ina&gp zG(GZ}X-1PT88jtx7K0gW4)K}Rq^2~(Ig)XbQ=Hg@TP&B=mvgReHSR0cf{O4=}%Fo*nw4hx%s6f4<(1q@%p$PpAL?i0|l!-d@DHgrxa575K z<6!5QbHpe|HOih~tuuEO9cfQCs#22L#DyZnr-aahfs?j0lO?_BN`Io$qwut+LRk(_ zgZk2;5|utiJ?eDIB2#iAHGN6dU4f#i)TvT+r`NfvPqV63tb(MgTm33ny}FSyg497= z9cxF&qgI!)^RuL|eK^*%UaLE!S!5l3M?bmb9;PZE0o8 zx&zMkZ=W^Gry5vW+s2lFzYSn;gLmjqITnh|h z3wXGEB{ngE*=HdSoEUwFm~UBPvEuomm1h)2@r`MmVH+E01TXI2kAaL58Hd%!_0d9& z0Vp7t^?0{UcCwdP9G?^fd4Nf_@{%K!<+NCJV1asoS+FgvpeI}-CVnfQzjAE}Q2$;biNm<^a{MK5~KsP(~_9~fyT z2pWTxmh`2mlxa)r`Oml^%cmu%ttCvlf>5pMTQ>be*1&7jT!PIMs5fIjx%w-t79!=? zm1`2#!^ls-La&R+nQOs%gT)qhs&@?P$#~(^Ou`JfS|Z*f4;m+`A zVq&Ti?ky7L4A2hYx2N@JPGgS~<@O?6pc3yJ&YRxH_I0iCJ!MogEDq_G;#PQ7Z#w3a z4gpu;!4Y2Y{R})032$LkV3lu$TbouDm$<4i-fnNNmEmrvHgu5fR*v_()gL!GcSP<( zl-Cng8JG9VN{y6kcCqVfzsGpVzMy zHOJ7~Pl5KdJ2p+*)wfgu?<93EmhXl4xX)mrq#qiY7y5NM&M{(O$y3c1E{ZkTF`r_8 z%PSZyru64QuOM5Gp7gv~EtjiRr1n60POZl?qQjG=k?Yt}&e&#zhoFs4li0kymvz=^ z(UaT`KS{|xKJw44{MfU$`NDWU^rQdq={scN)^Enevmd0Cb076g|9|~G{cFF?{ud%GMh7uj8Z!;9GO_3I~L-?SB}QovI;)VDd?cQ z7dhm1^bpl2q0D-eC_d6S{;!=P!+V>d#=DY!z)N+Nyu8R?BQy ztTR!zU$CQ|skouW%$@9MrG9FhQOG-6>La9!E{9dbmJ1(^G%>vHDB7NHW-hnG2FPrK zR$D8qq4Jy2l9}fcPcxwMtx0l?^JNC96o6hd++>T0+#%f?01ZwA8jWo6{{%oH8bg_; z7Qw;N5~vtPjPWmkPZ+ESg8ub`YI=hZoXG@tDiv%u zh_A!Jk_cgrqF6RY82;e+@70UGq%)2Hb}8uq*s%>8@?8l&G>Q^o8)CAGiG6F!Sm<>W zKp?mtCY=Mo8Ilt2S_=%50m!jv$=E~LgncF{A6)vqc(XbHZsW=ruFl(<@MOX*^DXLJYp{Z z>b|4h^lM~GxXKpG5DcgXKB@);x93o(5RVX3>(9vts&+A*M8X7}WDMk~?!+7$4?9CI z>hwl#IyoV@v!fN{Sp?2TUQJ623u=bjvxn=0-Qi`!u&U>fUXw3tA3fsA%q8O?Mz#8R zE9bX;;t%rTkzgBWHH-)pHNzJJeS&q+Rj^xpQ*M0Mcqy&B-`P>bf%GR?slHm}V@2kH zg3n8Rkkn1<96YC;1n74YH`Xq)4cP%}%5G(}AI`GIETs9rXgDGoj2Am(7|SfguBM+u zR;(_my&6Px7@v|zgp#H5O;DWTf8zp^D`ut?nSAdh zlDQ)s{&4;BIav9xQJUfyN+NwnGZph}dEFxIwx7tvj9?^{NZ(WM?1<2w#E7k`i6N4)h!eV{fNMB! zY}F8s^_k%zg;AOtOhb*2B4%jMqG{Uf8qiV^weX}Hyp2=@I+ANNg^ySbBn}jml-f05K26< z@d{!I-U#t zbda>Cn|}P|)DM@J^lBq`O?m+rh2$EiF78ZGwB)qz(S+S#est&j==Ov2cE519Q5$Q8(*AKBMFi=u>ULly6@vZ>hV7+y!-p`9F{jlN=aG`r%$RaJW_4m-6M1eW~`&W`)VT|=%V zd!z+JDE~!jrB}4|P2&0mPB?zc%h;Qe;ey*IHVKU{W&X`}n0`@q)rtXoL%EQ9S$9vk zYTlQ)d}POMLz57-ARsH;ZxzY2spSi6AVg-E2@~!aU GY-1px5*VlFJ7%dIOmsk{7AQ0%KvXYz*2!!JN-{%E7@J*N6%mxVb8l)^I zt>^dsU za0zBk^|7b)OVi6`NufHu5#uIM@soL>*aNTlRj$IT5-kUfStud0Cp6G6(Kc{rs*uPf zD8SG4b$kER9xJN90uFZF6b2^`vRThi(f3syAnI4||2)4uH#C0tE4qB|MCTcZ53`>F zB&U`#fmCBp&!qPNzp-PCvC7p=iIir}YL>HFONmy3l0+I`(k7nhZxUCvQt6wgl#g)e zc$#n;c&Z*k5~!WWS~w1lPu8>B--_+(_#Dr4;?|zkQFpeu$*p;#fE->DJA)?J=o*Sm zn&WB2_z4a*6CD>JF+E{9q+AIOgYr)G?%$PI2%KYc7T4mY!Ank0Gaaat=(b?LXSRH) zk)Jk)uQ+Fs2(p{4^T&^9=M6O-d)?1zHh)RT5}}6SVgu{viy<6#4i$|!`dY6xnCqNR z-p6`zkj-)-s^QE?^dnqr*pS3xwn|SQ`qkTs6MSq@eRp~ps-vw%=XO)Ya&hl;xc~4M z4{>w~M>e044ooCqfevT6tG|Kpxmnk~cvc0GmC6w*=WNad65g(6+HpmGDR;MRsIoGJ zT-)~J|2&aKj+ucS#@^NaaTJV8l?XqMWggKqI#M*E z{f$rOepvO^?)=gX)!N@coNr|-eY(!J73Awqv9P^r6|jAf@#B%I&heCvC|lLmyNW>P z!9gQ!hez;X1@sATRfGzBRX-ZE%HzLJt6+}~s>SQ4kYfJEav{z?!e{##3U9E>E;V&1 zVQt{$VaKXiG^ju6My8^XRb}Wa_Y60DMl+<>H`cYEF%B=RMH3b&2?LwLm{0nn6lE&X z4o^CgVz5CIMdR-Js5={k5jo7Fz?S{DbZIn6qyD&<3Mj@%u@9v3>*PfyaaXWTvs6jw zwG^Q{BT&NzMq0*oD`(58<{Oug3m6#Tl3Y04zPB{UZCY|D38*h|+y{6ju@D<$R?Ez? zp8KB#Gj-k)Mr_$TlN+zn#%g14OM`_5<0{wvOoRSNZ*zfPbQ8YhCZ6KfQ9US6R{oEz zYZJ%L0{7+tt!k^C3p?LIzl>PsKqB}#S@o?-gDW|Ztf{xM6oO;p-i%Zv?5&)vRba0) zeu34>yWEq0f$}*9XM1^hX9Mou&5{P0(Zj`mfybAGw@H^vL2ey3UJ{`9IHuyy*1k(| zvO2E){(8>AYcYzSw9XOqIff_s11#W*NzE{G3UBgFgZ0Abf`c_I3 z!~8-kIek4+9LN3EL+qe)V`+yWO~6OZ3(rwN!GC!$@uP(3j5vZ6u3ghIkt6tnqA7h( zy^JYJY#8~DqR$;xzRPsfI{e$?QZV7Re@z&ioltgo4)en|NK0z{1(%O55rgUM`{#UzozN}Zc( zofS}>safO1zy88DXcna*sKa~0>6ltPfe)&G3|BU;FXi{C^nt?zMn38ZB4>@si;~5q z3cb0o+1D1mTqDk~0@bfEI`8XDR~!AquXm#!o&H&(fT(f*d(Zn#o_pI&Cg{qD$I%$3 z%rRsO%^vINSSaz?jXR)a>0WZ zUoK2xnn7ibS4qC2u|>Ge>n${vsJ|{N%Y6kY(!shHG1cWXyM$NyR$5(uRG@7NFiQ#; zH2M<*dpi7g?b6QTIQEH#)1}?{vV}8&B*xRE`rrPhKJEd#u8+&gZub4a)8C$&=T7dH zeZ44Q)moL$`ttPL`))fpLOb~e`5yg<(oI|9Krb!I(jxRVU{18-KT)cz`pBwuQ3wp0 z?5kT-<7V1dqM(#M@jM2BU0G2z9Ibna!WCkIE=Mw{<%3nNn%4JJREI{;iDa%Xbb9g) ztTivhGEa`BALpx$R)4y-9YYNT0xd#HBDF!U(esU-M-xzya5}D)?LI=%#lJHp9yt|Y zrU)qK)oE3jQzk?-l+0YQ3Iw%DWHH?{Ecv^35Swsvq=7qDO?1PNv#mAq_0q=l+jAYE zUy0tZ#g3MYGkU`-lxi6LXOB@Jx1MDjz1cSshAaH-mZ{vvxOH_?z4;`n|1Dte{YmL@ z_6rb*8>^optlQ5?Lx~h!m;E)#*hr#axlv;$*t3_JkWUr zUd2HQzH1(H-dGN3&>1rlnCd$%{BA;&zxwN8>$qmS1=1C2U1NFk=$sp9`;XF!%UAlt zEquhR$!uL0k4DSrofPQx7O?SmTCIFrJ*#uV>6;lPiQ6#c=W>-SGi>0QJr^W#$`Q?Kl;XQ_IVASk<0Rl{o3D$V{D4)eyS~Jpbv@@lO#Z^vvmO zdB9?+P#i;{+_^;|R)jQ-=Z#I9+Yu$;be&!dur)&z5cf-9yW>J^3p#!IU(pw<{dn}L za_B!85Lqq`JD~iFR&vnKSJ)$V8mm&8yKyJI@?BXU%MH93gs9^tk5qVyMO|&`BmF!j z1uLzhBF@e}{Y{|_3W_`n8~;?AB5q9OHT7=kP!p#S`N&oJhdqCrJf(mg4OUTW!GLv&E=VCf!dH6>gvT?8N9}_q4B$bd*45g&=Np!(b3~QEV@A zYChl;(VAsPV{)o$$jx3CkmqMxYtV5nbxBAC3Sj@*^i(^0J#ZfCXAv~KV+zV61!9*a zKSK5Ad5iVk($kfU;dwjb_!fKNj|U0pPLvSb zVv~JbmF|19)!7|gP65S}vXA6;1`+gWv$E@E`E9z#XudswKzVyciw&r1GG~=r%25(( zz&V9SH?XWO@|VuR&SQ6u6Ga2&0}5%Vj#m#F0|WNkTUi=8{klUN`saA>1yMoPUT3NV zQbk%^+B<^od6#<_o@303B*Kb+#H3Ok>cy338?_pcDI)S^CSR9f~T;JGGW|z%J}@3(YFseS$?Cby$4N*%s158=B11rl|~hg;?}0K5AZux z_lO_Yod|*u>89J&0A;(?*t85D|7?M!lSnnkwHd1E7~TrFJ8Phi%T?zEjOO;@U2bql z>^m1dype_N?B*ik!wd^?55M%#)xg^u|{<+=<1p9cL9`@MD#oWmSGd zlGdb*VS@vtp3~F)M%_S}1-5tzH}ScX3=+*FB_ju{tVkA>jtN>fZW$%$;P9+IcI!Am ziBYYbr|8{#va7XgmB_}zk4gnwI$U~GMY<#*`(smN;!9^d>U7$z& zo>E*>+_d^&wR7b9-;xs!sco{|y60J|5)qT(ylyaOx+#>8+|l#|E3>R(>8`*;ZNpvWD4f}m*3qI@nvk)F!#Lt_I^Gv$L}Y9jfEnk zPMbA&sy))N=fs-LV*GRDEAc%Kj#M-=?<7ZF``H=&%2x8~yL;W0O$r~b3fI~SzlZWv z!JZH<_O9)J>JI-}1g}o>uGSR}33*eI=PdWvt|wx*6QqcJWUtCcP;#Wz%fBov|N7N- zZ`wXDxQV`%r&|1KQ0b?8Z$9HtYhbplMKRZE@aU)SW(#>ZEPRRHJnz3jO5=97jPKbp zym4sKbIl@2{9vnnnNbb2gNu!}tM10l7hHqFx&AAo#l_6n;h*PM2|I^a_9ApTw-#%lvgxi(IL-}@UI`Y@}KMc$CyQn`m8B7=?$vU6-7&pBsMsq7x$8fnZ z82xR4$bL&46=JcjkGFY@$B}_JQ_H7NWYm3oE==Zl55fIu?r%M9KZoR+%8LA&ogFH( zm$S07Leb^cYp@X8Wqi2tLS?_{v34i9sscGz!V zI-GcssB*=%cH^laa^%k!L;FQ*g-2(peD(xV)y+~bqUyyLv|UBhJ@=4zG*E)mSTbAa zNaKxMefYJ8hJk_zZV^1WwBKosg$=tsy}O4X59}n?zoT|49{Y$Hgdh7ub91va31G>z zbOyZbm9C;-dNfn0LCa#TTZ8o?MdQR&0A$3{dhgHKnMutm<;@vUZorM!Qm!Z{&**uX zViE2({*pTUvhlm5qO-cQF|(EKN|Ji2K>|#Tudvo#wn#eNL0{3J5W8cJ4ePNnpk;rq z;**oHV@sX&zIM25oA6CL4HFk5;MgUBE_yV9{|(+EnOU+9Z}U7uh-GJ^!-!jFu9%&;wB-%$t_2MaO3v;oH0jNmJ#5bE{`- zurZ;{IDc@E`_taawAuq+bzfjh;BV#kZr?MCsk25aLJ*Re20BSnjt%M3Arv_G|43p)UL_%i(b)3+OEQe zy8rT}n4{eYN!WPzXtAx@2MMHWtdNV1e0~Xui4(oGSNYtKlhB9k8TRpb_8C~!_vPUn zC|J-wy2T8fUTQfcmF*Dt;WH9ZLrRTVCLd`aA!=A8(B_`mfX7HB_}gdYaAnj!=RA1# z;Ooc+Bs*ao^R;=N?Mo4U$WSD!@^Nq`9S*s+f6VxnkmoXw@g} zR833WPqFpl8mlm68|-5&)$r=Pcq*8}w%f!Y<9sK=9%l5B+j%0tIJ#E>nsIR|LzMo_ z%8QG$Vd%bVFoffNKNk^Qu|4k4I90IQ4)qE8=;)zWDyQN69Dq)-E2>< zaf$M@mG5^u2$+f_qIyeroFlc#mCf)cDJ7^ogMa7uRG+prvxvp*uL1i_3h2nB9+zF4 z@4VBsq?`CF(+6meR+03+BR1SFy98PgY)0qyz!_vx`(OKmu~6McZ~RJ3EswM!KZb^c z@mWK&gYs=dx~WIW^h&0HxJfn1@dV+?)1zA9O2j-;x|$pX+~$A5Cw+R=hZ53dvD_!rh(rc^kk zbLXiCaXIc8slp+&K<4}+@Z~POu7ZmtrIwR;N7f`8(uVAqhgppQwM_LpZ^^vFGmUVM9ds&#|`# z&v_U@kdJBn(Sd~9YBYy8@Hp{N`&|95FsC!l68;1$MbW0o*WSkryh)|+U_SjG^AN+f z)Q+}VGP*v(#223u;A51>L04mZ?iWH+J4xbI4i420ey*}{9z|5RocEihQzLePv$D6J z8K33x5Asv6!DCV>(O+=;sh-MkE@C=lLS75!Vp%om&;N8ys&zwL< zG)vDI)>!9ZEWB7bIhlx&v++aO$yi&VH{|67>l&7 zf*W)m9Chk4^|GS-7i>w|lUTmjD` zZJJTeV{zCR@@SiVRM;Tk=fk<0cv@$utv=Qjr{k8&Ze8Ewg`nV{F@I>){- z0?o3$g;loe^&V42$=0~2Avfq~lwMvt=#fHlw_?*jXcN?Lj(3^37Iti$^!e7fb?Dr% z9>G4deT4qgJcYU_4tS6?jhtPWWYUM_^H2jW`g#uqjgeLncBke$&OiJ}w>@sKWN+&` znB8p?W2w4KI*XSL;M>hInD+4Gl8^w?HC|qI(}Ky}83H=jy6*Ff`;ig1&Z)v9#e8)4 zBm#M^WWmRhv0od}HYz|St#pxhzVi&Rez~Onl&ja+qmN@!X6#hz4J|Q{;AK|L;!}6V zlmo&?k7e$4by2kJpaxK0!!lL*MN%o^->qq1m5&U&`8%{Bp_DdT{V7xv`KU(9lOF*D z$Y#sKUdfvIL=S(DSWkVsTIDMWH2UH9MSlJUAO8zd$M39@OfMtI~)M`pz zgZi!a&|1fT@>Gx_?}S<5ud`j6WB&j0E07kmSo6Pc&D7RQi6epb(!l4~cs-YI`_d{W0WRzV6p7rT=(!Mx*+L^K~ud^zl$T?|F==#D?E&cvpP)o0vk3?N$BlG5PIu zY|^9%Gk<1iR>m*lo_}^)SIo-ne4m@fx+Kta?T^xj1;pjFT-H0MZ;ze+En8pft%|ig z+3$Z(ol({-ZX$Om6gE5n;QZaE#!cOj50iqfw#PXx(=c+_xC?xXuddp1%%{y#-b7w~ z-iv^&(?t1ZLf|8q)3}6nI!>mmMgedr;@Z0n{Ld_f} z&bRzzt*ITf6s_C1QaD53m^7d}L8rk)=_ylpn}R*p_hpNiMR!k?;1idPFLJ9wPV_+N$SvhIxEwgrY=4*#Gc!Ks;frTyC+`A`Lb zS%`gut4>G2;I#nzvS3`|vhv+Fi_gq?!RhdkGTTOqT>$mR5*pZSR6nRY`SW!_gJ_1< zusfZ%5VnkJh@LXbpAx{U=mD=%+p~N+Un!(Qwi@PbWw6Zn+(|t7{Mi5eBc$QOkI7q5 zUxA11ASoof{3uP*Oo?34WZG?d1{WiKhPKYYUpUX3Dbt{-ksl|64VTikKsob191%RX z2sBWtz_Uk(_@NIQ+?aT)9PS#u*!-EdzwM4ka;v;n+&|0wlo65gTpsQ;%Wg*o%56|% z{#c8)X2Wgtx1PAW@8F;9SbUFY7D2N}5pu|gQQh@qxi~jmr0aqVq5g6J;;rP*&9d{L zXl~o!fIa0?{SOkSeR0j8y6*d#Vl2$}wq9YRTFNYX_@;MX`xuLX*i@WKt9Dt+5FiQg zCIiafZA#Iz@awy-n~54y5|}U<=sEe*=NDS)1u>a}Ok!sUuhR^ULQn0C+=s1@nG!u<`@}ha~cI+LKrg*?yo&lf-kLeV@+qqP*B9;U1CedespmKwk%+umP?8`S{oO zTz*eUjYu*62WKbv>fWqAOEJQu_JiY)@zgiov+%gCmp`qDUGNS6Gu)1y#N*kUD@yqK zkA(>_n=QtQiWprHh~dfh;7~s;d2w`%k)$ z+nam7@GnUAN1Y+8oASP97Jcxv=Pk(FCwkp;2Ea1(I&Hk_6v8Fyc=)w;0xCSkn9RgO zT{W|f#j!JmC~`!x{O@oS8JCpqgKO-vHGT{5;6Zr0vF4$`XuMfbEufOeEw>X%GE^V$0 zJDC<{wfyZ1`(G`<++_=}#3s>)V`z7D{H8FdK#9@AA@qIswtz%iV62dhQGd6Amz#nI zPBs)irb;%b_J{1|PB-$V_A^}{AF=cM7Z?cZKd9T-Nh;rae^SAWb1PP^$Cv&Ey5Z7e zaRHQ)@T&*+k4g|spsnVyM_DJkn7M4fJjKJ31Ph>~RQs~FH7N=cOJ$R{<&k))0EnO4 zE2}ogJnd6`Qikk~nvk}|;A7UsDU|uYR{Cq6sZ-+I&!rAMLIoZIKk3f;ZcR zgcSm4gGfOTK-E636Xvu|jutB^*yKTmJIC(l1_2*7rQ@Y#B9c-ojL3on&99%S@zU-( zt{KAdxDSywXk09#0)cymZPlsLPi|U2HaatzG{bz}8s)DbMvK4bxf>;!r+M0` z@}1h$cu3*?T+3il6C3V4jFM$f1Goz)mrmPIG?kwdogJ6s-<)3$^YPJm6I8^`d2t+$ zQwNq;OHXz)K03B%2JjTmlNCx}cH-cslaSH{ z64H$FjQ?=$_@KEOe!#1<7~!%sR(4Zg(?9@b9#QDSaA3tiK-T_5D6SsTC8)-Yp4B8w z)0nJ%4<`9y~aoIu+H}Hi9@OtDhks*~i&APusJa z|39TgPrE1k^B*_ApV_w;ZzdfWg(x7E<3NpnYGOXQeFV@HwrIHcIf#vnTQO^qQh0@p?dPIfbcZlmMykBBcr@@I>9pLK2G8)|3U%8uCHH2SrDrp7Cgxl_bjxjiLrIt+!3 z|H@=`+hZ<89V|LiHNW@JH;7Y9HHYBzSvg>WXjMWCjYI2}lUMYul0cIn*4%wgOxh69 zoXi#0yzadf2<_@mbUzem~TGL{YGolJ{El=K3b1qqw-Z# zkWN5~AMhe=F@8~WC8?mH)Dp>bNS1){aWfls ziuX|zY1)v9cA2!PGJ%zAGx#|bfwJI8rffha{62+HVkMd?cJuPO@>=XPzvolypa#L` zt9{3uM{cIgkJ>=|_GL5|y#ZjTQR1>r(S8SP#L)@-F(4gTNFHBi+lr3ifRU4>h&@9= zHgB2u!X{$9njmxPbUI-u><6Vde0+iE=0LE6-nq(I)et?=R z)Jx6(0uj7lONk)}eBY>8C-g^nDg=S8(Em175Pm=Q_}i4;>blYNLy7E;#B%hXi59@# zKI_pL;=ckmG%Z(7u~rM=#!@OoidkC1IfR6vS> zMGo10mYjEJu{iHBMDEjB@uo^GzO3^yhndEkz3q9x;5fhfaV}e;knVBw|6SO=^X*8e zOHgAqcLT}Td>~Esz9F{n4#lh2pFTOUPPTco=m1KZqMFSVhIHqC{(RTf>|>rw*FHoZilLGSiUTssl z*<>+|{XAds$|W!#D>T%J1!JW&cg?SxZBi%wVTM2w|0D$g z44R&~{aXRfTZ3lYQXM|unhno#-K6bsN{EjhDP4BQ+pcxP zq=QLzrZDqYmPck!Nx3?ioo0T?TYm#DG)SUyt!!}R&)ne0SD|1zFVi-SA^`|xxe04b zuDJP|Cm`$%YCSSL0>R@gpZ9JGb*o+8t{jD4lPKtM%s!*m$*hBTTRJpMI>O@m7*iN5 zCt~E_yZ;hyde0v&xon%Nx!W=|p{c*FzgIeI?dSnfRk4w&*?}0}pP$Zu`D%477~&|! zX=#f# zTI9e@lpbU%cur1q`S912a4`=kjQ3w$pFP9LYoIv3giBVwTWM;IFVl1Plb^I>P|%y# zKt>@sQjrr7`{?0K)h9l!qD13>{)lm4$blI(@@-DpSiWz~;T8m3aiU@iS!S;WqW{J& z>MDwV!&N&S^>=9Pj&RYQJvD2Oj@QS%=qDoP^|9AsX z6FLofyn+C{UH-ewvGDF1cY*mS>?p6QQ*afJyXh#K@A<1@7T8q+v=h&e0;(7&bR$-% zTbB1Ow3`%BQNuD?V=~I;=oOIi?yt@YicIN8tCxwf^j01gBmL>8dTW=l#&m8h3%ke@ zTbT^kbq$ae@NevfPF2IF!#%dIpfU*n+P5kJ5U9E4r!4=JX-6!^*P~xilCXQdVww9} z#t{_YljhaK(7{CNuwM>2?d&wQ%Q^POe1R{E;&j^iaF_GFK2Artg&*^A-$)h{>BEDq>d6W&zDQ^P? zP^0rffm zm8{vIVavJ^$z$n`wP$^7>2=Pt;OplI^jVKWUB^@qJHJRI`W5;gGmn^i`OSVUL7JL;#4~N?)7sT#D=}d{O652bOl|d!0_YaQPh9MRr+tq;7l^dHlkHAOb_!H(hvLllz zF?K=K_eXnbkT%~(d%1+60tV$*e%=9K5|`19gWRks^Bo0;Wm@>)MxnB_ zkbGT~3F*EqH!(SAq$*`P3(i3n7tQ%Gj-#nUxscjgv_pX&pAG#MApR8%q-slA809;^6Od-ukO34=+ z%Zb+jj%!wQl~J~EeY1@WlX;nEJX%2$Qq#R*5zgKcOTDFo%!XQXYRVnw-0&@gx)H~Qw)c2?`I7=B29H&m4MVQAPIR+tC~7? z9HE!qm~o5?{Tlv?OtfnkpG3JQtjk7O_s&jfy&6d6qN5^X2QCSDUjz^MtVN~)Kbyr$)T#AYNk`ox+!EKKR9bFy|^xK zXJvGV@1VpHA^ta7C-dQv`TUx%phSJ>#Lm?5srw$~x;sn7aePnRrqjxO1HS6`W%BW< z*a6l6(_`G$<9)A0_;z{)6tC#-q(Sq(W3L}je?c9$ba2!aOt4+G7b4%1p@w#hPRM~B ziXK-xoLg#Q6;xLVS|=b%xA9`*B(!o}Gr0QF+ntIHK-QvqEHy2> zeZ#?6*rXIt%AM!^;O~S#g8e>wEt4Bh6%o~|>kj_8t>&Jlo}vIw2cwf+_#B3RUdb&& z7UpNW?m3wF6Y=OTc<$(^w@s26E4x4IrfLVJu&S={dbx~C*Kqy)+s(i>pxl23P^kg& ze&2#1$c-@|?FD7fKK#Sz0>l37RK9N2s_Z9VPv_@V-a+s$@m(I7PJ6}0sJdg3gxjoN zFEuY-*634qXeJ4W;Dz}O>Z*d%_-^X}&|zGi*{3RWG2x3zdgH0ze z;M2r@j%$f=3os;uyU#1rE#{_!#&IAY_mwcqx$0Js{4=7gI*l#DuHpRKfDuW?|2p!skw>;Quy{BgE#d`Zq9M zjo@?6S4dWXOx?Q-qZ>YKMTU9-){i=!Rw*f0=Q9yQ&IXR!QxO3DSz zXyLP3BV=zCe%!OvsXkyRJ}VKF9j%|-5i4|5S!-MJRGSW}^vy@{}1$aLQpoWeDi~EA?+%ViR0Rb|lXg`-RmWjZ_Pahm&d(s{Ac z{dbKy$f=vH@O*D{qK;Jf8=?6qZ|VJvC(|F*2ASm>#etF+F#tUe6oCj> zpmtniX|Eh(!Fp5(VG;NJqA5O=Z=dl@>f!H?1qt3;jC9={h!-2TdRvIwRp(jH>MydI z$c(_2$y+a`9drl=Q99o{)vO?Y+L8WJ=D2WAc_&_x;tXE~*co*fxV?8r3^|ucKXnb-I6ge=_I{FtcEY$gk*Yf&3sKQDYY#AOo6# zsZ|;G4Saz-{jUQjM0?<{vx$sksB26R*lie?!)8qfXu~4Dz9Xpgry^+}FS;_FzUao3 zfhXGz8@Nev-u3RZi-^D~8+7X4-Do~mrms$n@YsK!Z0Vy+jof(tQC>9xux4H--K`+u zd&WK)-gpg0t`{>hz*P2qahA_|&j4X!(&%S#+Xaws`wH8$+Lj;mu`^p>62Y8gT`SWb z!*UpRUw8V*>-Mi!ZH0lbi)1R{} z&6QWAG_mBIb72|XtmyO_5ZDNXmOZ9T`bdyPf+yjcdHM-D`-sJytqK1gnwm5%VR-{jEjC84x&}X zoca_Cyy{f`S&Azb2imwBL_Nzum4Q#Z1mkI{Cj!DSiEN-`MgbEME7aW+;c&uoy95Z; zoc{}^Jl2rQ7XZ`@4BfJSqosI?tPj5uA^bw}4)@&ToqFq74#QL!)LMnMR*48Dh4}hH zriEgdUO_dYbhz9Qv{uz)3fs>>6U4azevUEiyJm&wJ4$kUuX_)Xuf!&A_k1<-;Z!r! zkZ`i90)F-3Jy(hSfz$ErqXW8xdY_9qKFF4a6sPvcCUqnm_8wuq(Q2M56)3FHS|zhx ze~yvRvdDDxhglqZ^$>ODRZbR=HSJZ_M2~G$nU~?(LoQw#rzO)h^-MbVc>p^hL21+0 zh@q*jP)el#W{W8*d_)Q8X=LT|8!&9QNJ^N3PogtRX;49V&{&y$ubAEp zwGhs(D?^!YaNWLqKE)DnX$+Is z*p~rBs&m#Vr|~O3Ht8L0ZlkV3?HDy&)XsCRw_U-lhGWPD!0Dt1E40AB2exsj*8OhI zU8XU~sedf#+P(o8A`bxV|K*Cb@1n-63TiZ6sFk&RLcezh->T6~>@+E~eS^x`t(FZw z13A1MuyJdtgEC+~FQ8BiM7W=I^zu(bBftN>%`1 z=3>fnnQ9E!djT8507#vxpillsY}ex3sl(ZTPF=Th|66|+6ix{Y3PbQVr9tnE)NB@vAzebmlau>` zg$66uy_dwK4AKVR#Ok-o) z2EG>p^TMD>A-#0gZ*;f>cRr$lqP00T46fSCe*T)C%<;1O#}lLE!l0yL;?+6Yu4vOA z2mr9V#!HWGxf#E&;lH_|H(G}0IA0_8Q>b#|Zgn6=DZ!>ay2o!>+k7;VAC{~Nd1K|F zCBR9Ee^&GAJoB#;VuA0NF3MOws{@WG>-opyZQ2)H-)Xht3>&urj71ZJ_K_c};bW2Q z@Z5iX6iu8|*JX7T1dHRR%#}wSFE?W`;mk|pV9`qd@@XQaDdha2NfTha&d)~cnY{SN zGB~DgvbD1qaDG!A2OWLww+$7pQd|AZH5nixUu(CegC6fI(e_%I>Xo5cZtDKY!E209 z2xM#T^;11?dDRUjU6$VL&4T=KPq=|mh;aeW)I%6g#zbV3(o zlIdnXttJamq>b;W?I~=C08!2R=ErgPbYC(#pGK<$$rdx?S;kXoBP#*=byfQn*rc+f6!xCQ6DN;BoobiL6*<^Os7~eRB~Z%{qH-j#=k~b7 z-oZ(B#V3-KHo=6mfzgQva23G^Ksg^ICKV#AG7{io2IH9l$^Zh{yE|a)_;8`DK`9slIdUg6r(}O zo{y1Ur+>W0VFM5SpZu?QP{VkW7UckQt zl4{XXfci<_*DfQV=E9!^8dmcuMtqPIYD;QIYhUf&MYpkC=cB7Fq7g7x2^U+($$@$f zS!bnbrIyRYgvJ;A>&E+1j@;_!&UGfo=qOF|y`Z zTH~=IUM;tJ6O(i5&*lx>gvxaooNUy^EN48-YQO@$M{UyJbY|jGP8a$I>;h5kfe=66 zUn5U)1sZggvb6miSyhG?;zJ+qB|HEAXla^kc~vD#>I`_G`5_=^F)BPSgV&Iv`P^(h zJ*W?jaG^OTxQzpLcyTyZu$OIj_d?wW(6ecmkp)fzm(_qY(P#hkzxWfn+UkuU*luQ?_m| zCV=YWA_t&UB)^nW*UAX}j}7er-~<6{iNuYzb%;=48SeH3dA*&!urz&n_J$0(&S9^c!K-p&jX#k>&lA{rU3=PqhBkQWDh zGlG>tt9DZl<|sPk&_P`rK~M}+TfKV(GztSibw6}WuVcRpzfSC7y?6su*W-60c!gdW zR$~L(R7=x5_g3_t69UGFzy1OHpQd=30WIWNY-49a@-3fyo6rt-iKbm=Q0nihRT~=6 zF9){idZT)IaSfBhi%`Gyhk~IW0NYcQoC%*W4FKEOtIm*<#Vsp>qgdw%Z*t5UhL>K& z0|0)o>PSu7rXXCF`9G2YopFkeDz%_1JW$^7!^L1A2qYIi8blfHbXq!@Sm=E!AJ}_y zg~hEo#CF|LTK!?A^H0?Qx6A7~-JR*TW)y)X+NTLKmaz@yX~Mql=#bx9_@){mTx}1l z(5ECCZ6m34dB{@lz~*wXA{Atr2FO}ga+fR&MrDc|F-+e}6~A9;WxNe-J6;(A(z3t5 zyF=j{;piESx?&#sBlEJd~Rx&=eydCbRk8HnO%r-E{HeU^04HKX2sV@)(fz}d@dkxA)Fzv$v3|g%K zrCjpi*~q>0nCw>(*0`_5lLBSE{?+fXxrDF9n+53XBobQgvL0$C&Z9}Bhkf5wHpb?U zh))DHEWH3pwoaG}G8Y@Dvd|W@@0b|)O{M~Wdoabu^d@5_-JM2lXPlSi?n{>x42tUTY@%PY@1A2UWrGO&&usPcw5Q&v@^k0@0eH-n57Y~*6KuaS z$4H;rM&8~O2&_E}Xbu9%Td@**hrzp<#z(h8phA6@9H8-g_p7Nou*N_t7|%wUWnTHoHYw5xlB!CXbKX zK7h|9826?b%V_1YNHp&30kqugF3;@fZ~-B#=VIY&>7ziu&pQ$|y^sEt zUqkx(aEp(#+U4WKS?IRLPXvRPJ{$KxdEC9E&tNQoOS9MsEH{5&(r- zYZo53vEuF$gVWxn#VpTy4_JDa31)L=HAGq4OriJ2G;+<lsB}HHI*g;0NN0IhTlJNJ>;Wcvb@=i0^MRL0Z zc1n1&Aw2d6T74{V;@1I?@pr@#b8=!?7Qf44@`zpd8ixMgGd^~oH8aW4768||SP|5( zh^dbuvj!89r!vF70DH!h&G5pmeeLfJ;(RegbB(wOdvrT%-xlT-?;yn>KfPN|3>;mQ zq$Vj6KOI(^O1>iGYSXOJI@xCgoOfFI9h!^iJFb3x7$Kk%d)MNyK2ws~ zr0w!^UE=Y;QUt~M5nWC)CUKuwZuP&1-4VO7&U`CVP8N>+t)*pbGW13%+Ex5C?j6b3 zNZ>fGCcxcj{TC{L@Wbh~4F?3;er@Xpjn7X3PUNno@_Yi0VT&yExNDf${~h3<4y=>+ zIsVh>iN;+l(jo!-nDd)4;0)tSyYXt-as!3WdHs0@{;H_P_xpssX^PT@4c9BzbD?tv z68FIKGKBh$SAxkn891%Nyc55n&O^<&;?AD|h9dV`d~s>@k=3xL29&jIsI zg_?5yWVT3tTz~bIfExYnyXs#e)JEd71qXtRf^QPesxlHGBFE)`H<+7j6up>CPYTwX zH-fCm^D9Ji17&$3M*yd~op;^(XAJqW%Gy4nt^|(EBY&VR(oZmd>l~xu1<<{g01GH# zr|rYw1|+<^!KjUi*x(3vvWiAJ4Zuw@=}K)a|4w&{9UqX}841@>aT=m|Go4 zd)j1Ttpm3QO7F)?01cx>(fzNNlkr>rOR|*y5V@W&G90qB>D4aajE)@|IUQxxOghQGW2!Muf!{XF${g+-S$v)^w+ynbkQu)xR^QpQ4_Y$mc;jJE@JgN4MmJV z>u}ujj*-SHNVlP^cLuFem(%Ww5HV7zs_Jvv^wqiUA75|XpDHZd1Y-7;m9$Q`!EZ*XKQl(yLx*c9BN?#Rr?0B{C6+4VIrI0Ah!z6j;*x!W z)$R7Tz6~GTi#0LGY;x&wE`D$%bucx&GY<>%&+B7+PZHn3lBQ=K#>B&#Mj>E^$_+4+ z3V#t8Y-tM360cl(+#dPHA^7RCEp=&yykAI^-F2*U6l(1tGHZ;tcUI#73TS`L!^I-~ zIMy=a<2f1!69~+&q1!X{7#V>&&F6PM!ZwJ)`7#L{Cd&@z(t41mDll5@U?&NC$v1Wl z?!MPc>2Uo+-*Gt>0o>W{__=AlwS^ljC??A>_w`<-h0Nk(Y+I` zEi1JGEzA`puHqojO`kw5SG%-Vn4?n+|Xeyb!Ihj+sD61$1&^`s7bK* z(dQ%#h)veaueMj^D&j8b29Nq> zMfD28h*}x@c?Nr{Mf6)gnP5)KUAM;{s_@&^C13Ef;83%FM*Bo|+ewgH7&K|&Hq??q zhdFzE8Ko>yvU-gm7`%l-Q+aO@sx#KEw#Fv%)FQL7KY)3vt5a^ti#ksZjCiD|=TP4v zgMRz3IB9o95JUm5nnmisO!|yHt9kv_OLURQ!lkG;R2CyRz3u(yI>+g%I1za!#p(p3 z;bHfWk@KZ*f^E-tertL?`q%BFIt zyjxSzdw8dYS$nL`9#L}C1%9!XycIHZN-3A`fUkKVe|6+8lnEDL5m1GHX0j3&?kao>8|S%b?))7hFq(q7T;?h zdac2e9%on9sUU(^yO8^-0KH8TW}!HK!wK60%UCwQmje4R57DGAapwa{uU2_#4}Bv& z_6tsi?`5|J!k$j6F1(;)Ok~0ONs~+K?ouqa&z&h3!M|KPvSAbdd91;fTLB@s?ElZ> z7P?6Q)+$zl5UHG2B;VB2fda&dUxbWMZr*3*S?2f`5*aRXDmnLGYU;}E!^8*}#>Kph z)5H}uJcs+IG&Jvtq!w3tEiEgkPlbDO~b91e2 z*tpF2$#pkp6`LBB=H_m?*nKP77r_6uvByWeC7lZNx+P3HhkrcQMa|h2vGN>d^k~^p zS#_kbIhc{UIT&c2SnB!%ldmAA#x5ifVmf>4BXo0W*pN^ASdFN*Xpu@Sn+JYr>4psp zGkopN`nFcJnAUSadeCFv`t@IGUYoVXZ`<~4o_mAshBMa>??*UZ2&FHtTkv1{fz|ql zZ<3W^;zkzth_27csF;-K7@$0BFdtqX^ZL>OH=iYrNOQ}wPw%NRq2_H-PiuW7Jg=%9 zOhA{W&H1|mjiMD+NW0%d&bH@o$C)(jq8_sl;~U?k(#z&$a`6_1{EZh#2-NT%PMYbP z-oF%f#7s(cBqEke`r*T%ba?{1PJncEXqntQ_}--c61;EA+7p|w9ZTl+in|fjKMhMA zXr`;VsecIyfNYWfFgobLJQR%=2xJN7Jsq+ zQN;;$22pl1N%_#9c$Fg6(2_Q}&$0Z-K3en1E_{A0P!%G4qc}d(wp1O)>-&8>K>%1C z%`Ck=?b?bGHAtJS{#l8+mM*jnQN0ltn4Efmnc1%^_?b&$G<0M*xepH>pB|`e^#n>{ zQv41kqDbZw^|caQp45zqEV#XG0|E+!d(ia;yLYh8Pi>AD!y|&c=SuL3f>d zukNI`o%_Eibx>6QaT3jc(#?f0@|rnHcpeEfuI)cRFtgx2InJAyPeYqb2C%kRo;RULZqX<%S zG_!hy>GNk750falO5d*$c|y`&?o}t_fL(ffLo%R zAln+r=2TOM@4NX;c4?cYrs%d+wE1U!&-hRSf;FLuZz&46oMkA11*?%p8h_owgn?X+ z^X7bLX=QMqUzcOm!o7)RS~9RA*D)Y|`X!HD)=HA!g$dcqJn4x)8a3#*eR%w=xapA# zc9pow6%EXpTNZ~4zdS)8UuCo9V%i*wcQF3LMV@xoD6Q{*v$<^QOV_Mq#`-oSk~kxb z-IPNfx}>L6_o3(oIA!Kf;}iiG>sQ4y_OQ+|V!&qnhjJqStedblBN$FmuavvBr9#tZ zYdgK{_uAgAwTtgQDM_J6L!2BawmRhrk#R3;2p3x3!LGaMy>NmHc)*z7OFl_bD~1#H zSUQu>;Xb3(A0;-X>!vTUQ9~Ori4>INcU7Xae)qa!>-@|C>RgH>izeEuoO%-q}5@hO2fb7ZEP+;Pzy}o3)6lGl{^?sb7 zWIC^cdR-JX%)1#7_8ixNrmHD+{za3J^DXnV`IlCHQ^5s<5fGA%&5wFC;pR^R9N$~O z6vT6Uetlr3%hG#Ko8xH#I88~FaN6$)=96c#4k5zKbFX3$=a&s%l*O-hermKmYjIOED{g;)eX;hH{?TWlm3JBG;jY zMt%RbE)t6)#(B9+xewM`Luis6=8VClbi&GJ;?M{%bUPqIX6?@aoiigw0g=1&f(tY} zY)Q!~OH}q(GtEi18G#27T5V_F9A3)>UF>~Jm~I$AreKOP+TAOEQfxGWxo+vLc=(%C z3}4_SwXN3BfP>Khi^vnr%!O<>rel<{mh>T&~uAy z;|nk;$`9b5S{}FfZc-*b0ZxcjWAFcKnN&rN|8HhCFrA58ETP_ZQ3ioRk|2K*X93DG@RCTZE+1#ZAZhE?VQQUklDmrt7p$9m6o@9f-~3@Y^}w(bvYpYnlHm9YlvG- zNN7$bQ^VEH!*?&$qv03%1FM;XgFy9faXUJF*Vx~``GykaZ*`zi;?N@RVMcb2SHcHP zPBx`LsVmD;8pL0U5O0UoycL(X{9$a!*IjvW|9$$TY#^Sig@*4rExlHuckl$?LD&tg z?z$g)J6Ip7Ne5LgX!w{>M&OypG zAIg4(x@Hb9|C<^fSq(d9QWLUiErf4Jd00hJ0#|`cDd=a8u#_Un+Xix^$b^uAi_3_@ zL&J;6eYbauPPgayKFXvi+LkEKIE6S~p;(IBse9!UMoaG+3Iz=D>H|2=5Lo9ALn7(f zC?3LjUuCeB#Da{OC^eaJi!SycFS#nk#;KO1E@2w>MM#(bi|WIEqWk?llvtOPK?$)1R~UXn7N;6m;BmQt|@N0=8Xcc*KgX~wupGr z>W|Ib zP>o?_m(H=;#3_1AwMQP_9cpi4#o9WOQ^~ikuk4@?$sZ$MVUr)Q-a-~ixRhoJV67Fh zhBX|v4qkJ}luu)TJ3OJ+lA+Dn$;jEOt{qAgamC#TyVg^|xer2JSV6YeL*2!-ZN41W-v!tnx${A0!^Z~6UhkguSEbC}$hT6_{Dd%^MMwzbGi7wy4 z>`0x8XLP^cpMXF?LHAO<%c3FYIzc>^ZUAb^x*(9B^{E0V6qdzo&RTtJq*W5Vr+VKEo&^j`KWUkb{Fg-ydaZO$whYX(=A+57 zR+isIEKnw~Y1CeD#M{w0$YC9JB|-_+zqbY{ZoG8G%@1qmwY=C2K4JXb2TXdtOZD&D zGt#MCt~R)g$vp7yM~7KGU<>`Bm7l>RW%|ReUW{|Sj#I#rtW$)g5mjplslLsBUBd5fSRUR!nB^9$Fr=LGY;wQ6XP3GhUa3Ovr&~T%pSv~l41x1 zR)ZWP5_LU!(v)x44j>Tpr?uitideDSFh?vC(#>`{={~oAaf*-+F23vjHHIpttjqcj zyQgNDn7Kij#4F31}l9-}jAxoul~jua1r!75_>>8-bO5cjcIL;6vnQ zj75IVe{}ju+r98A)Y|@^79g|7=St)WXb$5-6>aP*t&3#OTpb#lkg1w!25vhcn2m;S z-+#J{L$wi*$VgV$Oefi3*E-`83+&*^&#bc9D~kIRe+(r8YUr0xlJoN2V4)qcnH_g_ zZtmCmL6uV#9V^5F`?(H)d?bc#qE*XIzC#n`PR;G~-~T35rNL}w$SR#h@j(Gb<7FH+ zs(O+BZld@U!oYxM7c#uh1fVtSAdrth5csqCNnpfc6gno^I1=>w_NAD{2Szm!0cJb` z;c2U$Mdf{x%bCKmi}Sb9Zh8rvwaJiYj6~*F)ffR|drQBH(}{KYWJfsm4bD9TX8~7c zm2UjYmLNgB}=pFRaTHS^zV#xGuk#CPV?6v(QZKK-=1p8B{i)|J<1 zwZ|i*p4@I_GhFs)_}ez;`?NfE?XF0~S)a7c$v|G~<7rX+xV;ht&TLuF;asCaapmL| z6!6G`?z#tJ}|$5 zo_d4+K*)rcM?{%T1re^+hH<(>@fvwi-oudqf}zn<*0#D2GY1e#8iuw)GGP)P4FF0C zrol@1RbHW6xbVH}3B>Lw(p~|gE79eD{JGG3wq&ZC*@W`37TtPjwzY-&q4#pz9~(SW>yf{krB2v-EN3N ztpHy?yG=c#mM&uDwgeK$(mRRP;cfa8waB8{mMlPV`mGH1gQgvqz;Pn9aUaL;o1$ zS|J6*_-22iuJ|%YoNGJGSmO%)wyW;?58=?+%!w2~`~9J%!l>74Nr3NW2b!wSVJw!Y zh)-~9L;4;z_T(dYaVPXvuD6BuBT&3v&26vJs<fuinfTQK2B9?1z_1A&uUb2#hn0K!L7bS+-$ef4 zwa^@PN?Y^98f9w2;G&S1t>MC6)S2q4t+zADY_8OHlNE+_joWKkQ-xU% zndXs)Pr|MVj&XWPUL?u6t7Wjhh-2M|{e7bPJX8k%Y)+;s)lmOevg)TA1YP%Q3$R7n zv@?ca5mbd@G=$G7I;~_rtWr>Iii+qmue~Mc0Ym5RW&RAaux%}^-D8l z{b!{QtuwAOJ|la56&QcHfGAW!4D>yZo}aE@uij3#Snc!9?2Nh5ezZOEOg4|a5c$PT zoIf1HM)JqF$aLj{-qq6%J>PseX2xjsgeFU3u_SAPfuvIDE~79n`PadWTO(%&=d`|h zNSv4MW67}H`S4gPSw6YUey=nSj=$wanV&6nSr@SNCv0n>y-7B@+rFY9Ovs)Q+SG%4 z%Ys|i&>D$(EeiZGlPlX;vEC--$k643rqywd;(oRNVuukhUQUu!kBwLi;3n}HCSjpb z$#;&j50?!a`% zAGbR)1Wr7sMZ!b_6X?+5eTF$%mC>*nt-^5;V*~Ds2pS>Of{#eB0i!Rf}Hf63NW19{s5& zil;g+A^2Vl8+vstNDp(lCEdcwQWre@d)Ghvqo56NQ2NXyxk`Vlk82h2!pC*yc-`4S z7I^LvADEX=tF2hHTycfMANqqDKMt76)3E zDsxef{uli8)tw6Agl`vV86lxv%u!5^$#9Y zE!x^X(Jaz)TI(Hq?y1)iH1-sr8r{gpL8^lq5!G-CDjTJ}6_chG97z+Y8q5}e>zk=m zT6B$oG|emY4t`x2x<#f_+rI$S;4|=u^+69MA`*9_W;^t=uJ+A&T-gM_V95dX2BdSO zycmo+;1PV6@nxFUon~Fs+BlH^m>Z112sj`nmYe!{Y4R0^VSN00mdKS4$c26k;1G%8 z-`T+yco(6g<^Ywqc%8C)Bwds(+*-$U6n{(e-%Ee|net`A;Phu^#&@gx2#pp6cWp1JYy^e5t6dp@ilBMk`9_c@S-!zzzwMn(WM*!w02>J(t#Sj{=t?V*pOe zn<46a&AsS4A@RdID*fSe_|>2d!p zCxtHabVg8?O+X-`DV z8|WQt7Ve_U!kzfJh$o$$=0{gQ8mB)28)BH08fHk(o2a;vnh3yzoQkKa%1<%>I7>O} zjT{_hcAQ1XpsB(~!X^>1Y$*HLmB$F+9X^zR!O3~-5H|tBUv&dpJ?fXXHyQPhl;~_W zs#O-KUQvj(&yV*#$sYT|E^Mm1vqc`BP`o+(@AOZUEJl6lx=?2KK=|85;ZAG7%l*0r zl;4evAlRm5#FN@7wF6obgZ7*`a2|lQv zfj{(>BO|CCsaIWrRqRmEr%88%rKlIsig)cU3$(OJdui4W#Ov7KK#RICW6Xa*Ra@P? zk8WNGLlVsj1&$FbOK~@svK9RJM9Gp*ZD!sR052yzEja!#_Wa>t+qhcWg&}|pS>8Ze{n( zZm}E7c-^y;8?f5pcC{6cz~7^3H7eDDWTDm^}upIC}Z#@=&{q|0Jlx zEq(vcsnt1vD-d|j$3ERV|hF?p&4^x0y_)rQK(!=1-y=MM7rk(c|r1AU9uYy=5&hRuhN5F2K zv%pxQlnh29NOZM6ByJZmEb7rHwqa8xGT+k9R&b#d4LB%>F`V?mT2Xf*|Ddl;B#%4eu4RS%i;jlW6D+dQN6)bM~*c+e0D^9EsiZQVt*#^r)MT8WX15 zCq{%p?bwWVtCX4jX#kWk6jCIY!GZf^b`4;N61b4QU(+8P;C(GTj5vSQPV%e!$M9FK zKezMG?7tsJWNPY)azq)Ow5gh($5&uHslo*YR63z+4dC}OY*RttW&vtjT={8D`9(X` z(hJ>)Q3f`R7bMw^!95zM*54f(E8oHXU5R)7CwiH#PB*Dgf*fP1>JHaSg4_e4D2f0z z5#~Fg(gjz3*GsuLt%wW!wt3eFePCa{;>1Mb&VJgn*G=&JadUv)>(%s#u&{H95~O;k z{7>{2mDv2c6+5T}4PqBVy6|&zKYW8FX=3qrPH^$L-iZoP4UR|Y0l6@rr= z20nPzz8*{O6<#Wn)u8IDJDb|x85CmPn3(jt-OSFOqUVQU!0FFu!6m8RQB`CJlzFuspQ5bU$^ z8_mn{QkMYv$vJX4{NXANxl8WgCQ25t1nkoq#i_+suPHfq>L0X7jZPAp`nCoFEci-B5jOQq=8yuPnFyPnb-7&59kizYmeFZ}Fva1#x5Q4%v7 zyO9q4=rQ(BoGdVpP>XVm{84@ke_YNk15@>98e zRt8h9qfeYm|1rSLpUi0i>u8wDQhGkp*up()w>VaK;?gh}Ql6imsCIdh&WN8WE zjWi?yh^N0i3o-o9e|xTA)LLwLh-Umum>yjTH@f%~QoZMQYqSPT6p90^WqoMVZbAOE zg?16v2uW(`IX@o-$-&z%Z-QM$cxd`?_yD4C+g%yta2z2sy2y1^C=q=IOaWzde<$|Z8nX^|Xs$MbI57{!?T#_2P25)RJCrIxoZo&+P?ulLJJ-` z;MQ&ZM-=X_&NzFuv?%ixe7gqp^<~nK&nx-UtR7T$CbGvy6wfKJHS4`ME-!JHZbHOt zekO2)rS%H5b2^WG69|(q=^2m=!>3ROlJ4l|=@mZ((|>v48@|6C`fK8c(fHp%zWVDh zQ_Pr_?Qnb5ECWNliI8J1OC`RVKPe8hQ`7if=0!yej-O#VY_$Vi;WV^y6R@E#PPa%USGJWyyuwtqE+(gy%be|8a~Cr{2oi8)Up=A^W^N!due9IsFZ4x zs~PZ*lKv#z;a-}5;{6o`x`0^AT=w8HIW57~8JPP6kd`HCc)5Cc#pZ$^E6LBdx{M#+ND&B7LF7nUj zslf7S5@H;5mi)zg_K6PzlbWF5Zl%OFiDL9%GT35FPuZ$J2%RZOQy{`hJ9F!!pxSS(+|q9IMG&0 ze|T7n;lFE);ir$`kjZWPPwW>$%ElL^l7d%Vq#xodO9ynLN)em8{bSFTk7oZZ$6peq zuDQ!U7Koo4Z9}W=MpgC8xqzJ`=`T}*DKfNr+(%}=n~UbP2LHCkJuCF{fnU_?EP_-q zar+Mg9-Hx^yY)$M^02$`iKI zxtKv{aRPsA+<(siIC-uKy97NKu3*%ISWAp!@LLaW0O$3CUu%4ru)QXHBmUZOQ(;{- z_2tbyWZjos8UEp|bslmz`7N0oCoHSZfcp$P2ordk7iP2od=J(7lCU(IAdKPef)jnd z$JmFEu=M0dQAp;eBTsHKhj|MPN@#@ijC$}L3!tWvcnesw;LS-L-TYkoOiRjYVueSZ zgs7;419Tbr8I+MgGyVL@O#thLTGq?ErP^*W@QWszq2y}$LS!*{OHzM@1drKF`yt?c z!4n%R%J@cZ?*Z}MXLlx>1cj-z`hqPg$Tm$<&0AwPQA$u@jx`=85WXnW>x4{*Z`WfcIvI) zly7Y>Mqzbw%wOYU%*ha+s$?B>?Cmd(2%VxAxe)IjI4n6rF6`E;<4fH$kEQHm;_KoqSev0UdQXcUe31O(efvMiV42{#L3XT!~Dqw2+X!*Q|4z_+bjkIQ03I?+Nt6yAE#CM#Po~SKb9l5lMczLz7bR4Hr{5Ev6K3_aN;eP`eb$XW zm%94_l~7#v2$nS%M0$d1q{vKKK{roP+`8@50&w}>lQWTULKjh3r3F{`QP}1K>lo3x z(x!egfDlHf8p8GS;mtHu8~CXhA%JAnrT5{VVHU+!s>C?Mi)NY$p*ZgJoyv|M`rgwhmkc2A3_ll?|3XLGeA~_(pTn+Kav=mQwR# z1dr5(X7D$b={=2=m;0iR2vcWm(}uCxyQhWtzSDh{j6@xinL0cr!0Y-EzJ zSQ3~X{oe2VaE;g~4xTqGS?!otFid|i?(f@>sdQA6@DCeZM*l@@26wdnqW za#coKkO}>4g*M1n+HCpmxIMy{X8YDJlGS1HSiO%+-e12&_??=B+pCuu9 z0$qKiy#VPe>R^1iR*gUjnkYZK?JnN};0eEU`}{gSYwi70dJgLhR|}{F;yETqU_y@0 z-oO6QXG=#|mFj!WqOc`X=ghZ1bv~XK7n&>qMGaaI7|18I@bz!);27$&XR_d*M=+N~ z_45>8fZ|MSnu%}Fnkt(V553J3B1+=hF1fIm zYrngl*6@pLd7`Mzn*r?5Oha-O>9U!v1f(7#{wdc*VVyrfaj?`k0NkWG6tNunaL`_) ze;EK&RU0^rcA$3v*^((Z{@5WweJJ8=5?kyLQi~A{7ZiTOIGit(F@t(gnzEMsY1Dp8#f2!9g7U+&mhmjEr8K|2ukm2R#i(bmXE*LJfSd@lME-mnS3`W^ zo4YbgQ3aKAVTL_L^+LVI(?xCWhNbNX#&Gj*Y8wjXYUSGaO-_y5`6AaRjTwg1*PD$W zlk)bLcGT1kfNt;5ogdT$luMoD0JtMSa-YmW{qI^=hqI#Yme+mam;RD>v_?y@6f`WY z{*4C!3b0M;_P1nsE+DTkadnu5U%%G<0F0%wST{NsP)&13t8dT?ePrEU&#oZFPJ5`7yP)%-GU%uUu|#ftyHPV=|$qiO~q9yPr5J6p($)3wV4T<7@<^vkj* ze?u(D*lBhl$Oq^4Q|qU_rcH*T|EPF9ziH}H$&TDaFPvX$ax6^Dnr}5={3jw=zK=p2 zTQUT1PJ4c*f5VI?(Q1_Hs~KAtO&Ie-^{h&IumG9m9-X-}+dm6_Xtn}aO2=I>1C;wa z5IQzsw2v`Bzjrsa>K2{MR;$m6BRdTkas1ehQhC-7ywsrq2jga;=U3lITicmn< zdhi1f^xye9J`#-KgibqztWiS$u-Q&&hE%7$Jx_ex6BKGSOU4OHJs)~b`$`>}m zECnEvWSV{Icj6TMwo=o|4=&@9*`_B|OMk(=d+~jKanal%-(j6$k5{}EK>Ulk)>HrK z1cC8_z`89os6vHdiT7sWS@$SrUM{cixsxXa&aN_R%+LZRui!WqUfj?cLdH}K%===k zZ5}&2+kb-sVWJf~Jc6zNwFT%)tK#dR1G?B^0h#Ib4!!~Zc}qH*e8fKs4(NyA{Q0<4 z;6(a@rgQ0WC3bDB*^GPmOE-XEwvE@_e|0O0AFb|FuExxE97ei9qBy{oun;{@^4PIS zsu+Rn*UkxLOo}(`eVdEWQv=|%6*!>#^jM0*_*5lXgITqm()j|F(5YrZvnk@c)d?uK zUU_bPKz$V&ZEC9sq)OO=MFRH=Hf?%JW<+sh}76f|6 zt?*7t+ph~CuBv8@0cZ00d6_ZkYbLU67sDVdJ5v6iQkSHDz<;^u_^`l14!FMa9~#=< zv6Fmf*S_m^52X6}To5VU7}5#Uu03cQJzbck59f5AO(ZfuHOyc?Ajgft0320V@^x{M zUaHq9-%$9 z+9BjAdgxO8Oc_V{O3d9Y-^jw+{&U#pZYQwhA>czXvKC|%AKAx*oxg8yywWKNNn(`_ zrNDLw!4L_J2gqNx@%*-NfEwBPCg?jKL>XNM$W1_VZt^pr8bXFG0wwcG3Lw#KIE{r_ zWA@kr6QU;Ov9+j3s^3i&04D|Y~8U^H#)9O z+C~o`R80dTgj3z)$d+J!EN#HX-~wRWtZ}dB5ttxMivK<*Z`HMDJH|sEd6eO!6DAg< zUTN=C-Kap*=Tf2ufzEDC<#{lblO-&JC^`XaZ*Vfzu2u!;LB8Z)PGu#sxo%bDrdy&GKDni17cBp(5wpIh?k`-v9LhJsGwV5^BX zG%8Lf2}PQ+=B`(T#Xg|`H`@i2(r5o+g795bWq4Y8)|$ne#V9;b20+by0>!2H+cvp$ z?k4W#U?s9)so;g`Fh7Z7IEbU-aitQlix2|jMq<<1Z5ORpZfytdMxa$%V1no=oe9JQ zY=c}e;CmF|c}%tJM1sC}wdTb$49{C@qD(m!2Zus3`}sIP^S%WT3u6DwKr*rda*OmW&&Zw)AQNwDzyi19bP>{UbM$~f>;X#90Z}SOAG5Tvq$wQ$J8%(%<@G%+_-B!fd;Cn6 zlovNaVOXwB$Wb@TUAZE5K+8fi{5dUnDcnKcpu9S?DfIvbNFVOku}gQoM#AU1Ga|`m z(-xy%f-u_;Aa-byqwy&oKRz(8^fSDO{lMJtAump?sIe2AG|SAc9R6wLgxOW%)U9a6 zyrxl=Wm&`Xbh=WHWO!-ZqcHC30uzafv$&p3(MQi1oZ-v_ydf2?4>{=blW7Oss zJ$~Vah|225aWnrh@X833pr`!7cOLY=KmTii|34Op!FzbcBtohl>GM4DzY!?Ns=lj` I{`BpC0B4zxp#T5? literal 0 HcmV?d00001 diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..8c792ed --- /dev/null +++ b/static/index.html @@ -0,0 +1,65 @@ + + + + + Nebula + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ +

© Nebula Services. All rights reserved.

+ + + + + + \ No newline at end of file diff --git a/static/mobile/.DS_Store b/static/mobile/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3fd539b0e1d8453a66be94992a7016fddd277860 GIT binary patch literal 6148 zcmeHKJ5Iwu5S=waas)*hB;2_{)R8!ViA+UDE`ah;C~P@`Bodu3z+n*3Q*aMjZa~YM zok?ORjzkq9G$YNv^?Y{LZzYeHh+JJoK`D16nSdI>{w;4TBM&oQ!^`1S~z197E)9Z3SmHfO|@1r@Qp?&~f7PZRJ(+w(nd$s0C z^tP<2zIC-tU#(8`j^#{@0b{@z*c$`r*(~9appC|WF<=a=7~te08iJ`*3oJ zppC|WF;HjVKps2X|F3r6|LaNiWDFPs|B3*cuD#?V_R3&)j$s}xLp gD@H80;!~&>*khgm6U9;x7Kr@_cp7Xl2KLIp4}i~SO8@`> literal 0 HcmV?d00001 diff --git a/static/mobile/index.html b/static/mobile/index.html new file mode 100644 index 0000000..00f4847 --- /dev/null +++ b/static/mobile/index.html @@ -0,0 +1,49 @@ + + + + + Nebula + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+

© Nebula Services. All rights reserved. |

+ + + + + + \ No newline at end of file diff --git a/static/mobile/resources/deviceHandler.js b/static/mobile/resources/deviceHandler.js new file mode 100644 index 0000000..0d0ec91 --- /dev/null +++ b/static/mobile/resources/deviceHandler.js @@ -0,0 +1 @@ +(function(a,b){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))window.location=b})(navigator.userAgent||navigator.vendor||window.opera,'/mobile'); \ No newline at end of file diff --git a/static/mobile/resources/form.js b/static/mobile/resources/form.js new file mode 100644 index 0000000..8069c4e --- /dev/null +++ b/static/mobile/resources/form.js @@ -0,0 +1,160 @@ +var option = localStorage.getItem('nogg'); +var nogg = document.getElementById('nogg'); + +function toggleNoGG() { + console.log(option); + if (option === 'on') { + nogg.style.color = ''; + option = 'off'; + localStorage.setItem('nogg', 'off'); + } else { + nogg.style.color = 'green'; + option = 'on'; + localStorage.setItem('nogg', 'on'); + } +} + +window.addEventListener('load', () => { + if (localStorage.getItem('nogg') === 'on') + nogg.style.color = 'green'; + + function isUrl(val = '') { + if (/^http(s?):\/\//.test(val) || val.includes('.') && val.substr(0, 1) !== ' ') return true; + return false; + }; + + // NOGG + const useNoGG = false; + const form = document.querySelector('form'); + form.addEventListener('submit', event => { + event.preventDefault(); + + if (typeof navigator.serviceWorker === 'undefined') + alert('Your browser does not support service workers or you are in private browsing!'); + console.log("Your Browser does not support ServiceWorkers and responded Undefined.") + + navigator.serviceWorker.register('./sw.js', { + scope: __uv$config.prefix + }).then(() => { + const value = event.target.firstElementChild.value; + + let url = value.trim(); + if (!isUrl(url)) + url = 'https://www.google.com/search?q=' + url; + else + if (!(url.startsWith('https://') || url.startsWith('http://'))) url = 'http://' + url; + const redirectTo = __uv$config.prefix + __uv$config.encodeUrl(url); + const option = localStorage.getItem('nogg'); + if (option === 'on') { + const nogg = window.open("about:blank", '_self', "popup"); + + setTimeout(() => { + nogg.document.write(` + + + + Google Classroom + + + + + + + + `); + }, 500); + } else location.href = redirectTo; + }); + }); +}); + +function hide() { + var x = document.getElementById("banner_bg_main"); + if (x.style.display === "none") { + x.style.display = "block"; + } else { + x.style.display = "none"; + } +} + +var autoFocusElem = document.getElementById("url"); +setTimeout(() => { autoFocusElem.autofocus = true }, 500); \ No newline at end of file diff --git a/static/mobile/style/main.css b/static/mobile/style/main.css new file mode 100644 index 0000000..4cb7e13 --- /dev/null +++ b/static/mobile/style/main.css @@ -0,0 +1,197 @@ +:root { + --background-primary: #191724; + --navbar-color: #26233a; + --navbar-height: 4em; + --navbar-text-color: #e0def4; + --input-text-color: #e0def4; + --input-placeholder-color: #6e6a86; + --input-background-color: #1f1d2e; + --input-border-color: #eb6f92; + --input-border-size: 0.1em; +} + + ::-webkit-input-placeholder { + text-align: center; + font-family: 'Roboto'; +} + + :-moz-placeholder { + text-align: center; +} + +#navbar { + height: 60px; + text-align: center; + align-items: center; + display: flex; + position: fixed; + top: 0; + left: 0; + right: 0; + background-color: var(--navbar-color); +} + +a { + color: white; + text-decoration: none !important; + font-family: 'Roboto'; +} + +a:hover { + color: grey; + transition: 0.5s; + cursor: pointer; +} + +.down { + background-color: rgb(90, 24, 154); + left: inherit !important; + font-family: 'Helvetica'; + background-color: var(--navbar-color); + /* box-shadow: 2px 2px rgb(0 0 0 / 20%); */ + color: white; + display: none; + visibility: hidden; + opacity: 0; + list-style-type: none; + position: fixed; + border-bottom-right-radius: 10px; + border-bottom-left-radius: 10px; + list-style-type: none; +} + +#navbar ul:not(.down) { + font-family: 'Helvetica'; + background-color: var(--navbar-color); + /* box-shadow: 2px 2px rgb(0 0 0 / 20%); */ + color: white; + margin-left: auto; + list-style-type: none; + float: right !important; + margin-right: 5%; +} + +#navbar ul li { + float: left; + padding-top: 1em; + padding-bottom: 1em; + padding-right: 1em; + padding-left: 1em; + padding: 1rem; +} + + ::placeholder, +input[type='text'] { + color: white; + font-size: 20px; + text-align: center; + font-family: 'Roboto'; +} + +#navbar ul p, +ul a { + font-weight: bold; +} + +*/ +/* + #navbar ul li p, ul li a { + font-weight: normal; + } + */ + +#navbar ul li ul { + border-bottom-right-radius: 10px; + border-bottom-left-radius: 10px; + visibility: hidden; + opacity: 0; + margin-top: 1rem; + left: 0; + display: none; +} + +#navbar ul li:hover ul, +ul li ul:hover { + visibility: visible; + opacity: 1; + display: block; +} + +#navbar ul li p { + color: white; + font-family: 'Calibri'; + z-index: 3 !important; +} + +#navbar ul li ul li { + clear: both; + width: 100%; +} + +#content { + display: flex; + justify-content: center; + align-items: center; + height: 98%; + color: white; + flex-direction: column; + font-family: 'Roboto'; +} + +#content h1 { + padding-bottom: 0.5em; + font-weight: 100; + text-align: center; +} + +#content img { + padding-left: .5em; + filter: brightness(0) invert(1); +} + +#content input { + font-size: 20px; + text-align: center; + font-family: 'Calibri'; + border-style: solid !important; + border: 1.3px solid var(--input-border-color); + border-width: 1px; + border-radius: 15px; + background-color: var(--input-background-color); + color: var(--input-text-color); + width: 300px; + height: 50px; + box-shadow: none !important; + outline: none; + color: white; + text-align: center; + font-family: 'Roboto'; + animation-name: inputwide; + animation-duration: 2s; +} + + +/* + --input-text-color: #e0def4; + --input-placeholder-color: #6e6a86; + --input-background-color: #1f1d2e; + --input-border-color: #eb6f92; + --input-border-size: 0.1em; + */ + +#content input:focus { + /* outline: 1.3px solid #eb6f9; !important;*/ + outline: none; + box-shadow: none !important; +} + +@keyframes inputwide { + 0% { + width: 0px; + transition-duration: 0.5s; + } + 100% { + width: 300px; + transition-duration: 0.5s; + } +} \ No newline at end of file diff --git a/static/mobile/style/master.css b/static/mobile/style/master.css new file mode 100644 index 0000000..8aef670 --- /dev/null +++ b/static/mobile/style/master.css @@ -0,0 +1,72 @@ +@import url("https://fonts.googleapis.com/css2?family=Dongle&family=Roboto:wght@100&display=swap"); +:root { + --background-primary: #191724; + --text-color-primary: #31748f; + --text-color-secondary: #9ccfd8; + --header-color: #26233a; + --header-height: 4em; + --header-text-color: #e0def4; + --input-text-color: white; + --input-placeholder-color: #6e6a86; + --input-background-color: #1f1d2e; + --input-border-color: #eb6f92; + --input-border-size: 0.1em; +} + +*, +*::before, +*::after { + padding: 0; + margin: 0; + box-sizing: border-box; +} + +html, +body { + margin: 0; + padding: 0; + height: 100%; +} + +body { + background-color: var(--background-primary); + color: var(--text-color-primary); + animation: fadeInAnimation ease 3s; + animation-iteration-count: 1; + animation-fill-mode: forwards; +} + +@keyframes fadeInAnimation { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +input:focus::placeholder { + color: transparent; +} + +#navbar #thumbImg { + transition: width 2s, height 2s, transform 2s; +} + +#navbar #thumbImg:hover { + transform: rotate(360deg); +} + +@import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@1,100&display=swap'); +.stamp { + text-align: left; + position: fixed; + bottom: 0; + font-family: 'Montserrat', sans-serif; + font-style: italic; + font-weight: lighter; + color: whitesmoke; + opacity: 38%; + user-select: none; + font-size: 13px; +} \ No newline at end of file diff --git a/static/mobile/style/options.css b/static/mobile/style/options.css new file mode 100644 index 0000000..3ee17d2 --- /dev/null +++ b/static/mobile/style/options.css @@ -0,0 +1,230 @@ +@import url("https://fonts.googleapis.com/css2?family=Work+Sans:wght@300&display=swap"); +:root { + --background-primary: #191724; + --sidebar-color: #191724; + --sidebar-text-color: #e0def4; + --text-color-primary: #e0def4; + --text-color-secondary: #6e6a86; + --focus-color: #eb6f92; + --header-height: 10vh; + --section-font-size: 20pt; + --section-font: 'Calibri'; + --section-padding: 0.5em; + --setting-distance-from-sidebar: 1em; + --setting-distance-from-right: 1em; + --setting-name-font: 'Calibri'; + --setting-desc-font: 'Calibri'; +} + + +/* +body { + background-color: var(--background-primary); +}*/ + +#sidebar { + animation: fadeIn 750ms ease-in 300ms forwards; + -webkit-animation: fadeIn 750ms ease-in 300ms forwards; + position: absolute; + top: var(--header-height); + left: 0; + background-color: var(--sidebar-color); + transition: width 0.5s; + width: var(--sidebar-width); +} + +.setting li a { + background-color: #2e2828; + padding: 10px 16px; + border-radius: 5px; +} + +.settings-div li a ul { + border-bottom-right-radius: 10px; + border-bottom-left-radius: 10px; + visibility: hidden; + opacity: 0; + margin-top: 10px; + left: 0 !important; + display: none; +} + +.settings-div li a:hover ul, +ul li:hover { + visibility: visible; + opacity: 1; + display: block; +} + + +/* +.settings-div ul li p{ + color: white; + font-family: 'Calibri'; + z-index: 3 !important; + +}*/ + +li { + list-style-type: none; +} + +.settings-div li a ul li { + clear: both; + width: 100%; +} + +.section { + display: flex; + align-items: center; + flex-direction: column; + background-color: transparent; + color: var(--sidebar-text-color); + font-size: var(--section-font-size); + font-family: var(--section-font); + width: 100%; + transition: background-color 0.5s; + padding-top: var(--section-padding); + padding-bottom: var(--section-padding); +} + +.section:hover { + background-color: #ffffff20; +} + +.settings-div { + position: absolute; + left: calc(var(--sidebar-width) + var(--setting-distance-from-sidebar)); + top: 0; + width: calc(100vw - var(--sidebar-width) - var(--setting-distance-from-sidebar)); + padding-top: 5%; +} + +.name { + color: var(--text-color-primary); + font-size: 2vmax; + margin: 0; + font-family: var(--setting-name-font); +} + +.description { + color: var(--text-color-secondary); + margin: 0; + font-size: 2vmax; + font-family: var(--setting-desc-font); +} + +.setting-input { + /* left: 100%; */ + color: black !important; + position: relative; + /* right: 0; */ + transform: translateY(-1.5em); + float: right; + margin-right: 5%; +} + +ul li { + float: left; + padding-top: 1em; + padding-bottom: 1em; + padding-right: 1em; + padding-left: 1em; + padding: 1rem; +} + +.button { + width: 30px; + height: 30px; + transform: translateY(-30px); + justify-self: end; + font-family: var(--setting-desc-font); + align-self: flex-end; + color: white; +} + +@-webkit-keyframes fadeIn { + 0% { + opacity: 0.01; + } + 100% { + opacity: 1; + } +} + +@keyframes fadeIn { + 0% { + opacity: 0.01; + } + 100% { + opacity: 1; + } +} + +.container { + display: flex; + height: 100%; + justify-content: left; + align-items: left; +} + +.rectangle { + display: flex; + align-items: center; + justify-content: flex-start; + position: relative; + width: 50px; + margin-left: auto; + margin-top: auto; + height: 50px; + background: #380848; + transform: scale(0); + border-radius: 50%; + color: white; + opacity: 0; + overflow: hidden; + animation: scale-in 0.3s ease-out forwards, expand 0.35s 0.25s ease-out forwards; +} + +.notification-text { + display: flex; + align-items: center; + padding: 0 16px; + font-family: 'Roboto', sans-serif; + font-size: 14px; + animation: fade-in 0.65s ease-in forwards; +} + +@keyframes scale-in { + 100% { + transform: scale(1); + opacity: 1; + } +} + +@keyframes expand { + 50% { + width: 350px; + border-radius: 6px; + } + 100% { + width: 300px; + border-radius: 4px; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 3px 3px -1px rgba(0, 0, 0, .12); + } +} + +@keyframes fade-in { + 0% { + opacity: 0; + } + 100% { + opacity: 0.8; + } +} + +.stamp { + text-align: left; + position: fixed; + bottom: 0; +} \ No newline at end of file diff --git a/static/mobile/sw.js b/static/mobile/sw.js new file mode 100644 index 0000000..89ac6a7 --- /dev/null +++ b/static/mobile/sw.js @@ -0,0 +1,5 @@ +importScripts('./uv/uv.sw.js'); + +const sw = new UVServiceWorker(); + +self.addEventListener('fetch', event => event.respondWith(sw.fetch(event))); \ No newline at end of file diff --git a/static/mobile/uv/uv.bundle.js b/static/mobile/uv/uv.bundle.js new file mode 100644 index 0000000..099a868 --- /dev/null +++ b/static/mobile/uv/uv.bundle.js @@ -0,0 +1,39304 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var parse5__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3); + + + +class HTML extends _events_js__WEBPACK_IMPORTED_MODULE_0__["default"] { + constructor(ctx) { + super(); + this.ctx = ctx; + this.rewriteUrl = ctx.rewriteUrl; + this.sourceUrl = ctx.sourceUrl; + }; + rewrite(str, options = {}) { + if (!str) return str; + return this.recast(str, node => { + if (node.tagName) this.emit('element', node, 'rewrite'); + if (node.attr) this.emit('attr', node, 'rewrite'); + if (node.nodeName === '#text') this.emit('text', node, 'rewrite'); + }, options) + }; + source(str, options = {}) { + if (!str) return str; + return this.recast(str, node => { + if (node.tagName) this.emit('element', node, 'source'); + if (node.attr) this.emit('attr', node, 'source'); + if (node.nodeName === '#text') this.emit('text', node, 'source'); + }, options) + }; + recast(str, fn, options = {}) { + try { + const ast = (options.document ? parse5__WEBPACK_IMPORTED_MODULE_1__.parse : parse5__WEBPACK_IMPORTED_MODULE_1__.parseFragment)(new String(str).toString()); + this.iterate(ast, fn, options); + return (0,parse5__WEBPACK_IMPORTED_MODULE_1__.serialize)(ast); + } catch(e) { + return str; + }; + }; + iterate(ast, fn, fnOptions) { + if (!ast) return ast; + + if (ast.tagName) { + const element = new P5Element(ast, false, fnOptions); + fn(element); + if (ast.attrs) { + for (const attr of ast.attrs) { + if (!attr.skip) fn(new AttributeEvent(element, attr, fnOptions)); + }; + }; + }; + + if (ast.childNodes) { + for (const child of ast.childNodes) { + if (!child.skip) this.iterate(child, fn, fnOptions); + }; + }; + + if (ast.nodeName === '#text') { + fn(new TextEvent(ast, new P5Element(ast.parentNode), false, fnOptions)); + }; + + return ast; + }; + wrapSrcset(str, meta = this.ctx.meta) { + return str.split(',').map(src => { + const parts = src.trimStart().split(' '); + if (parts[0]) parts[0] = this.ctx.rewriteUrl(parts[0], meta); + return parts.join(' '); + }).join(', '); + }; + unwrapSrcset(str, meta = this.ctx.meta) { + return str.split(',').map(src => { + const parts = src.trimStart().split(' '); + if (parts[0]) parts[0] = this.ctx.sourceUrl(parts[0], meta); + return parts.join(' '); + }).join(', '); + }; + static parse = parse5__WEBPACK_IMPORTED_MODULE_1__.parse; + static parseFragment = parse5__WEBPACK_IMPORTED_MODULE_1__.parseFragment; + static serialize = parse5__WEBPACK_IMPORTED_MODULE_1__.serialize; +}; + +class P5Element extends _events_js__WEBPACK_IMPORTED_MODULE_0__["default"] { + constructor(node, stream = false, options = {}) { + super(); + this.stream = stream; + this.node = node; + this.options = options; + }; + setAttribute(name, value) { + for (const attr of this.attrs) { + if (attr.name === name) { + attr.value = value; + return true; + }; + }; + + this.attrs.push( + { + name, + value, + } + ); + }; + getAttribute(name) { + const attr = this.attrs.find(attr => attr.name === name) || {}; + return attr.value; + }; + hasAttribute(name) { + return !!this.attrs.find(attr => attr.name === name); + }; + removeAttribute(name) { + const i = this.attrs.findIndex(attr => attr.name === name); + if (typeof i !== 'undefined') this.attrs.splice(i, 1); + }; + get tagName() { + return this.node.tagName; + }; + set tagName(val) { + this.node.tagName = val; + }; + get childNodes() { + return !this.stream ? this.node.childNodes : null; + }; + get innerHTML() { + return !this.stream ? (0,parse5__WEBPACK_IMPORTED_MODULE_1__.serialize)( + { + nodeName: '#document-fragment', + childNodes: this.childNodes, + } + ) : null; + }; + set innerHTML(val) { + if (!this.stream) this.node.childNodes = (0,parse5__WEBPACK_IMPORTED_MODULE_1__.parseFragment)(val).childNodes; + }; + get outerHTML() { + return !this.stream ? (0,parse5__WEBPACK_IMPORTED_MODULE_1__.serialize)( + { + nodeName: '#document-fragment', + childNodes: [ this ], + } + ) : null; + }; + set outerHTML(val) { + if (!this.stream) this.parentNode.childNodes.splice(this.parentNode.childNodes.findIndex(node => node === this.node), 1, ...(0,parse5__WEBPACK_IMPORTED_MODULE_1__.parseFragment)(val).childNodes); + }; + get textContent() { + if (this.stream) return null; + + let str = ''; + iterate(this.node, node => { + if (node.nodeName === '#text') str += node.value; + }); + + return str; + }; + set textContent(val) { + if (!this.stream) this.node.childNodes = [ + { + nodeName: '#text', + value: val, + parentNode: this.node + } + ]; + }; + get nodeName() { + return this.node.nodeName; + } + get parentNode() { + return this.node.parentNode ? new P5Element(this.node.parentNode) : null; + }; + get attrs() { + return this.node.attrs; + } + get namespaceURI() { + return this.node.namespaceURI; + } +}; + +class AttributeEvent { + constructor(node, attr, options = {}) { + this.attr = attr; + this.attrs = node.attrs; + this.node = node; + this.options = options; + }; + delete() { + const i = this.attrs.findIndex(attr => attr === this.attr); + + this.attrs.splice(i, 1); + + Object.defineProperty(this, 'deleted', { + get: () => true, + }); + + return true; + }; + get name() { + return this.attr.name; + }; + + set name(val) { + this.attr.name = val; + }; + get value() { + return this.attr.value; + }; + + set value(val) { + this.attr.value = val; + }; + get deleted() { + return false; + }; +}; + +class TextEvent { + constructor(node, element, stream = false, options = {}) { + this.stream = stream; + this.node = node; + this.element = element; + this.options = options; + }; + get nodeName() { + return this.node.nodeName; + } + get parentNode() { + return this.element; + }; + get value() { + return this.stream ? this.node.text : this.node.value; + }; + set value(val) { + + if (this.stream) this.node.text = val; + else this.node.value = val; + }; +}; + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (HTML); + +/***/ }), +/* 2 */ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +var R = typeof Reflect === 'object' ? Reflect : null +var ReflectApply = R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + } + +var ReflectOwnKeys +if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys +} else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target) + .concat(Object.getOwnPropertySymbols(target)); + }; +} else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; +} + +function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); +} + +var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { + return value !== value; +} + +function EventEmitter() { + EventEmitter.init.call(this); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EventEmitter); + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +function checkListener(listener) { + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } +} + +Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); + } + defaultMaxListeners = arg; + } +}); + +EventEmitter.init = function() { + + if (this._events === undefined || + this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +}; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); + } + this._maxListeners = n; + return this; +}; + +function _getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); +}; + +EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = (type === 'error'); + + var events = this._events; + if (events !== undefined) + doError = (doError && events.error === undefined); + else if (!doError) + return false; + + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) + er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); + err.context = er; + throw err; // Unhandled 'error' event + } + + var handler = events[type]; + + if (handler === undefined) + return false; + + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + ReflectApply(listeners[i], this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + checkListener(listener); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + String(type) + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } +} + +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + checkListener(listener); + + events = this._events; + if (events === undefined) + return this; + + list = events[type]; + if (list === undefined) + return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (position === 0) + list.shift(); + else { + spliceOne(list, position); + } + + if (list.length === 1) + events[type] = list[0]; + + if (events.removeListener !== undefined) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (events === undefined) + return this; + + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (events === undefined) + return []; + + var evlistener = events[type]; + if (evlistener === undefined) + return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? + unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events !== undefined) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; +}; + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} + +function spliceOne(list, index) { + for (; index + 1 < list.length; index++) + list[index] = list[index + 1]; + list.pop(); +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function once(emitter, name) { + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + + function resolver() { + if (typeof emitter.removeListener === 'function') { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + }; + + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); + } + }); +} + +function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } +} + +function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); + } +} + +/***/ }), +/* 3 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +const Parser = __webpack_require__(4); +const Serializer = __webpack_require__(26); + +// Shorthands +exports.parse = function parse(html, options) { + const parser = new Parser(options); + + return parser.parse(html); +}; + +exports.parseFragment = function parseFragment(fragmentContext, html, options) { + if (typeof fragmentContext === 'string') { + options = html; + html = fragmentContext; + fragmentContext = null; + } + + const parser = new Parser(options); + + return parser.parseFragment(html, fragmentContext); +}; + +exports.serialize = function(node, options) { + const serializer = new Serializer(node, options); + + return serializer.serialize(); +}; + + +/***/ }), +/* 4 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const Tokenizer = __webpack_require__(5); +const OpenElementStack = __webpack_require__(10); +const FormattingElementList = __webpack_require__(12); +const LocationInfoParserMixin = __webpack_require__(13); +const ErrorReportingParserMixin = __webpack_require__(18); +const Mixin = __webpack_require__(14); +const defaultTreeAdapter = __webpack_require__(22); +const mergeOptions = __webpack_require__(23); +const doctype = __webpack_require__(24); +const foreignContent = __webpack_require__(25); +const ERR = __webpack_require__(8); +const unicode = __webpack_require__(7); +const HTML = __webpack_require__(11); + +//Aliases +const $ = HTML.TAG_NAMES; +const NS = HTML.NAMESPACES; +const ATTRS = HTML.ATTRS; + +const DEFAULT_OPTIONS = { + scriptingEnabled: true, + sourceCodeLocationInfo: false, + onParseError: null, + treeAdapter: defaultTreeAdapter +}; + +//Misc constants +const HIDDEN_INPUT_TYPE = 'hidden'; + +//Adoption agency loops iteration count +const AA_OUTER_LOOP_ITER = 8; +const AA_INNER_LOOP_ITER = 3; + +//Insertion modes +const INITIAL_MODE = 'INITIAL_MODE'; +const BEFORE_HTML_MODE = 'BEFORE_HTML_MODE'; +const BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE'; +const IN_HEAD_MODE = 'IN_HEAD_MODE'; +const IN_HEAD_NO_SCRIPT_MODE = 'IN_HEAD_NO_SCRIPT_MODE'; +const AFTER_HEAD_MODE = 'AFTER_HEAD_MODE'; +const IN_BODY_MODE = 'IN_BODY_MODE'; +const TEXT_MODE = 'TEXT_MODE'; +const IN_TABLE_MODE = 'IN_TABLE_MODE'; +const IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE'; +const IN_CAPTION_MODE = 'IN_CAPTION_MODE'; +const IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE'; +const IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE'; +const IN_ROW_MODE = 'IN_ROW_MODE'; +const IN_CELL_MODE = 'IN_CELL_MODE'; +const IN_SELECT_MODE = 'IN_SELECT_MODE'; +const IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE'; +const IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE'; +const AFTER_BODY_MODE = 'AFTER_BODY_MODE'; +const IN_FRAMESET_MODE = 'IN_FRAMESET_MODE'; +const AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE'; +const AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE'; +const AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE'; + +//Insertion mode reset map +const INSERTION_MODE_RESET_MAP = { + [$.TR]: IN_ROW_MODE, + [$.TBODY]: IN_TABLE_BODY_MODE, + [$.THEAD]: IN_TABLE_BODY_MODE, + [$.TFOOT]: IN_TABLE_BODY_MODE, + [$.CAPTION]: IN_CAPTION_MODE, + [$.COLGROUP]: IN_COLUMN_GROUP_MODE, + [$.TABLE]: IN_TABLE_MODE, + [$.BODY]: IN_BODY_MODE, + [$.FRAMESET]: IN_FRAMESET_MODE +}; + +//Template insertion mode switch map +const TEMPLATE_INSERTION_MODE_SWITCH_MAP = { + [$.CAPTION]: IN_TABLE_MODE, + [$.COLGROUP]: IN_TABLE_MODE, + [$.TBODY]: IN_TABLE_MODE, + [$.TFOOT]: IN_TABLE_MODE, + [$.THEAD]: IN_TABLE_MODE, + [$.COL]: IN_COLUMN_GROUP_MODE, + [$.TR]: IN_TABLE_BODY_MODE, + [$.TD]: IN_ROW_MODE, + [$.TH]: IN_ROW_MODE +}; + +//Token handlers map for insertion modes +const TOKEN_HANDLERS = { + [INITIAL_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: tokenInInitialMode, + [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInInitialMode, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: doctypeInInitialMode, + [Tokenizer.START_TAG_TOKEN]: tokenInInitialMode, + [Tokenizer.END_TAG_TOKEN]: tokenInInitialMode, + [Tokenizer.EOF_TOKEN]: tokenInInitialMode + }, + [BEFORE_HTML_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: tokenBeforeHtml, + [Tokenizer.NULL_CHARACTER_TOKEN]: tokenBeforeHtml, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagBeforeHtml, + [Tokenizer.END_TAG_TOKEN]: endTagBeforeHtml, + [Tokenizer.EOF_TOKEN]: tokenBeforeHtml + }, + [BEFORE_HEAD_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: tokenBeforeHead, + [Tokenizer.NULL_CHARACTER_TOKEN]: tokenBeforeHead, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype, + [Tokenizer.START_TAG_TOKEN]: startTagBeforeHead, + [Tokenizer.END_TAG_TOKEN]: endTagBeforeHead, + [Tokenizer.EOF_TOKEN]: tokenBeforeHead + }, + [IN_HEAD_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: tokenInHead, + [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInHead, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype, + [Tokenizer.START_TAG_TOKEN]: startTagInHead, + [Tokenizer.END_TAG_TOKEN]: endTagInHead, + [Tokenizer.EOF_TOKEN]: tokenInHead + }, + [IN_HEAD_NO_SCRIPT_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: tokenInHeadNoScript, + [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInHeadNoScript, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype, + [Tokenizer.START_TAG_TOKEN]: startTagInHeadNoScript, + [Tokenizer.END_TAG_TOKEN]: endTagInHeadNoScript, + [Tokenizer.EOF_TOKEN]: tokenInHeadNoScript + }, + [AFTER_HEAD_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: tokenAfterHead, + [Tokenizer.NULL_CHARACTER_TOKEN]: tokenAfterHead, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype, + [Tokenizer.START_TAG_TOKEN]: startTagAfterHead, + [Tokenizer.END_TAG_TOKEN]: endTagAfterHead, + [Tokenizer.EOF_TOKEN]: tokenAfterHead + }, + [IN_BODY_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: characterInBody, + [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInBody, + [Tokenizer.END_TAG_TOKEN]: endTagInBody, + [Tokenizer.EOF_TOKEN]: eofInBody + }, + [TEXT_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.NULL_CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.COMMENT_TOKEN]: ignoreToken, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: ignoreToken, + [Tokenizer.END_TAG_TOKEN]: endTagInText, + [Tokenizer.EOF_TOKEN]: eofInText + }, + [IN_TABLE_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: characterInTable, + [Tokenizer.NULL_CHARACTER_TOKEN]: characterInTable, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: characterInTable, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInTable, + [Tokenizer.END_TAG_TOKEN]: endTagInTable, + [Tokenizer.EOF_TOKEN]: eofInBody + }, + [IN_TABLE_TEXT_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: characterInTableText, + [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInTableText, + [Tokenizer.COMMENT_TOKEN]: tokenInTableText, + [Tokenizer.DOCTYPE_TOKEN]: tokenInTableText, + [Tokenizer.START_TAG_TOKEN]: tokenInTableText, + [Tokenizer.END_TAG_TOKEN]: tokenInTableText, + [Tokenizer.EOF_TOKEN]: tokenInTableText + }, + [IN_CAPTION_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: characterInBody, + [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInCaption, + [Tokenizer.END_TAG_TOKEN]: endTagInCaption, + [Tokenizer.EOF_TOKEN]: eofInBody + }, + [IN_COLUMN_GROUP_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: tokenInColumnGroup, + [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInColumnGroup, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInColumnGroup, + [Tokenizer.END_TAG_TOKEN]: endTagInColumnGroup, + [Tokenizer.EOF_TOKEN]: eofInBody + }, + [IN_TABLE_BODY_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: characterInTable, + [Tokenizer.NULL_CHARACTER_TOKEN]: characterInTable, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: characterInTable, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInTableBody, + [Tokenizer.END_TAG_TOKEN]: endTagInTableBody, + [Tokenizer.EOF_TOKEN]: eofInBody + }, + [IN_ROW_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: characterInTable, + [Tokenizer.NULL_CHARACTER_TOKEN]: characterInTable, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: characterInTable, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInRow, + [Tokenizer.END_TAG_TOKEN]: endTagInRow, + [Tokenizer.EOF_TOKEN]: eofInBody + }, + [IN_CELL_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: characterInBody, + [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInCell, + [Tokenizer.END_TAG_TOKEN]: endTagInCell, + [Tokenizer.EOF_TOKEN]: eofInBody + }, + [IN_SELECT_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInSelect, + [Tokenizer.END_TAG_TOKEN]: endTagInSelect, + [Tokenizer.EOF_TOKEN]: eofInBody + }, + [IN_SELECT_IN_TABLE_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInSelectInTable, + [Tokenizer.END_TAG_TOKEN]: endTagInSelectInTable, + [Tokenizer.EOF_TOKEN]: eofInBody + }, + [IN_TEMPLATE_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: characterInBody, + [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInTemplate, + [Tokenizer.END_TAG_TOKEN]: endTagInTemplate, + [Tokenizer.EOF_TOKEN]: eofInTemplate + }, + [AFTER_BODY_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: tokenAfterBody, + [Tokenizer.NULL_CHARACTER_TOKEN]: tokenAfterBody, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, + [Tokenizer.COMMENT_TOKEN]: appendCommentToRootHtmlElement, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagAfterBody, + [Tokenizer.END_TAG_TOKEN]: endTagAfterBody, + [Tokenizer.EOF_TOKEN]: stopParsing + }, + [IN_FRAMESET_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagInFrameset, + [Tokenizer.END_TAG_TOKEN]: endTagInFrameset, + [Tokenizer.EOF_TOKEN]: stopParsing + }, + [AFTER_FRAMESET_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, + [Tokenizer.COMMENT_TOKEN]: appendComment, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagAfterFrameset, + [Tokenizer.END_TAG_TOKEN]: endTagAfterFrameset, + [Tokenizer.EOF_TOKEN]: stopParsing + }, + [AFTER_AFTER_BODY_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: tokenAfterAfterBody, + [Tokenizer.NULL_CHARACTER_TOKEN]: tokenAfterAfterBody, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, + [Tokenizer.COMMENT_TOKEN]: appendCommentToDocument, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagAfterAfterBody, + [Tokenizer.END_TAG_TOKEN]: tokenAfterAfterBody, + [Tokenizer.EOF_TOKEN]: stopParsing + }, + [AFTER_AFTER_FRAMESET_MODE]: { + [Tokenizer.CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, + [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, + [Tokenizer.COMMENT_TOKEN]: appendCommentToDocument, + [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, + [Tokenizer.START_TAG_TOKEN]: startTagAfterAfterFrameset, + [Tokenizer.END_TAG_TOKEN]: ignoreToken, + [Tokenizer.EOF_TOKEN]: stopParsing + } +}; + +//Parser +class Parser { + constructor(options) { + this.options = mergeOptions(DEFAULT_OPTIONS, options); + + this.treeAdapter = this.options.treeAdapter; + this.pendingScript = null; + + if (this.options.sourceCodeLocationInfo) { + Mixin.install(this, LocationInfoParserMixin); + } + + if (this.options.onParseError) { + Mixin.install(this, ErrorReportingParserMixin, { onParseError: this.options.onParseError }); + } + } + + // API + parse(html) { + const document = this.treeAdapter.createDocument(); + + this._bootstrap(document, null); + this.tokenizer.write(html, true); + this._runParsingLoop(null); + + return document; + } + + parseFragment(html, fragmentContext) { + //NOTE: use