From 7cd9a7a230ab9601491f3e88ce4e0e9b8ef83b4b Mon Sep 17 00:00:00 2001 From: alice Date: Tue, 1 Jun 2021 17:33:24 +0200 Subject: [PATCH] new homepage --- ccvpn/views.py | 22 +- static/css/style.css | 140 ++++-- static/fonts/arvo-0.woff2 | Bin 0 -> 10632 bytes static/fonts/arvo-1.woff2 | Bin 0 -> 10624 bytes static/img/world.svg | 979 +++++++++++++++++++++++++++++++++++++ static/js/map.js | 104 ++++ templates/ccvpn/index.html | 115 ++--- 7 files changed, 1235 insertions(+), 125 deletions(-) create mode 100644 static/fonts/arvo-0.woff2 create mode 100644 static/fonts/arvo-1.woff2 create mode 100644 static/img/world.svg create mode 100644 static/js/map.js diff --git a/ccvpn/views.py b/ccvpn/views.py index 7310c07..2f1e5c7 100644 --- a/ccvpn/views.py +++ b/ccvpn/views.py @@ -15,6 +15,7 @@ from django.utils.translation import ( ) from django.template.loader import TemplateDoesNotExist, get_template from django.template import Template +import django_lcore from constance import config import frontmatter @@ -22,11 +23,28 @@ from downloads.models import Version from .common import get_price_float +@django_lcore.APICache(initial=[]) +def get_gateway_locations(): + gateways = django_lcore.api.get("gateways/", enabled=True) + locations = set() + + for gw in gateways.list_iter(): + if not gw["tags"]: + continue + loc = gw["tags"].get("location") + if not loc: + continue + locations.add((loc["lat"], loc["lon"])) + + return list(locations) def index(request): - eur = '%.2f' % get_price_float() - return render(request, 'ccvpn/index.html', dict(eur_price=eur, motd=config.MOTD)) + return render(request, 'ccvpn/index.html', { + "eur_price": '%.2f' % get_price_float(), + "motd": config.MOTD, + "gateway_locations": get_gateway_locations(), + }) def chat(request): diff --git a/static/css/style.css b/static/css/style.css index 770c7c4..9f45d55 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -496,83 +496,107 @@ ul.errorlist { /***************************************************/ /********************* Home Page */ -.home-content { - width: 75%; - margin: 3em auto; +.home-signup { + text-align: center; } -.home-item{ - float: left; +a.home-signup-button { + padding: 0.75em 2em; +} + +@media screen and (max-width: 48em) { + .home-signup-button { + min-width: 50%; + } +} + + +.homepage h2 { + font-weight: 400; text-align: center; + font-family: 'Arvo', serif; + font-size: 1.6em; + margin: 3em; } -.home-item img{ - width: 60%; - margin: auto; + +.homepage .title { + color: #1c619a } -.home-item h2{ - color: #1c619a; - text-transform: uppercase; - font-weight: normal; - font-size: 1.5em; - margin: 0.80em 0 0.60em 0; +.homepage .title h3 { + width: 50%; + margin: auto; + border-bottom: 3px solid #1c619a; + border-radius: 5px; } -.home-item p{ - margin: 0px; - padding: 0.2em; + +.homepage .inner { + width: 50%; + margin: auto; } -.home-item b{ color: #1c619a; } -.home-item ul{ - margin: 0; - padding: 0 1.5em; + +.homepage .features { + margin: 2em 0; } -.home-item ul li{ - margin: 0px; - padding: 0px; - list-style: none; + +.homepage .right h3 { + text-align: right; } -.home-signup { - text-align: center; +.homepage h3 { + font-family: 'Arvo', serif; + font-weight: normal; + font-size: 1.2em; } -a.home-signup-button { - padding: 0.75em 2em; +.homepage ul { + list-style-type: circle; + margin: 1em; + padding-left: 1em; +} +.homepage p { + margin: 0.75em; } -.home-secondary > div { - padding: 0.5em 2em; +.homepage .home-signup { + margin: 3em 1em; } -.home-secondary b:first-child { + +.homepage .locations { + width: 70%; + margin: 4em auto; +} +.homepage .more { + text-align: right; +} +.homepage .map { display: block; } +#worldmap svg { + stroke-width: 0.5; +} -@media screen and (max-width: 80em) { - .home-content { - width: 100%; - } +#map { + display: block; + width: 100%; + margin: auto; } @media screen and (max-width: 48em) { - .home-content { - width: 100%; - margin-top: 0; + .homepage .features { + margin: 0; } - .home-item-content { - margin-left: 20%; + .homepage .title h3 { + margin-top: 2em; } - .home-item h2 { - margin: 1em 0 0.20em 0; - } - .home-item img { - width: 20%; - float: left; - margin-top: 3em; + .homepage .title h3, .homepage .inner { + width: 90%; } - .home-signup-button { - min-width: 50%; + .homepage .locations { + width: 100%; } } + /***************************************************/ /********************* Account */ @@ -1023,6 +1047,22 @@ div.ticket-message-private { unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; } +@font-face { + font-family: 'Arvo'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url('../fonts/arvo-0.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: 'Arvo'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url('../fonts/arvo-1.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} /***************************************************/ diff --git a/static/fonts/arvo-0.woff2 b/static/fonts/arvo-0.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cc286d4b3e4543235f0944c45d1b861d60129fa3 GIT binary patch literal 10632 zcmV;3DRb)I!0MxGbyeQteK(Tr6gyPoM;c;Ut8q0-&sd;@0xd=r>T zARXSjSlxnjgKYf=yM=%9JAl z#ZjAYf&73ykF@=N-q+Eu8y>SCvjF&F^T+tdevkQ&Rgc7v4loe{b_DQAJZIp?@jGSk zcVqkaHy;CsRwgDEHZC5%7-7N@2^1=#lTI&#kVq`CPOd7n%a^CwC0(vEiqk})ML4-q z<=$( zTW8Q2r=4}q1{*C{@4R^zZ1Rg**Ca}EnF*8pE(Gv4KzSJO8!+o70Os!qK>Z3R&!k?i zX=gBqBhgb}7@rA(i8FDT$RSAGOSYCxduh!zBx5UPA*7xxQo6e>W4LYuq$BKKoj*~08(Mc(Pa8tJn_IQLMBL6!v+W@ zf&-O%OGMntICQ@~?Su19PNLk2>l|VjZ2Bh#+pjK#hA&I$5vY|4tc!#Vxd3&VMDg41 ztYxwsg?%HVfR&-^`v)V?dk6MVyCo3r2VDjaS^VOh>%bpd?hvlm@YxPZ5B_Zcut$Tb z`-XPUm_A5BiZUza@UQlE_H*$yk zHUlIuiXHbN6*xY4Zm8Hf7VG)n7((FE2uUkc-V@Fl(5RZy+7TyUaSuaRe4us_f8$6| zhX0$Lql%(QAl%hb@XNZiKX5ZfUuIb`5<$}W_V$xIJy>1O9oF;9!w8ZnTcG*^UMQ#8 zmHg8RZ(fecXFlssg<5Uy50 zuhRBq*Dm)(d8DWy$}4<|LSjVET?ISAUqb8J73JZswT++h)3cir4kX!#LNq)GL7FKP z6+VVG!a&SZ5(OFD4X(vUOPvBi)r8zE|JGL6MfFg#ci+&b5&*1q`FYvM4t$@gVh?X~ zD~i%Y+ZI=Ry}B=|)N(<|(J0WlO2?!9w!~E2z=yOF4aPXKN~jQPi*gu(Mv7?*K5w=U8XxBWXG&$(2)Z~49Y{50afoqiuw9%@8tanC z66%H}TstJ=kyzE^g>K%`Glvlqs((I0#%QrSBsKT zjpcl$_~Pshhk@AU%=F;%4vVW4k1`wGWz*pQrw+;Js0G>y{ZV^*h?#l; zo{J@KqWuAPw~zat_PN)k-7gll66-gxdQB??r9iWa&ewIKtN-)+9*1KM0fXqF>F;e~ zV%;OZ0bM6%6H|hLFt-Sc`&EL)F+Z?!L_7^V3t3hZU-QNS`P*O^gb=9U7DRFoJ-C1~%U|YM89oNDA3w_CkDXJ6dQu%VBR$ zxP`%d(*q~sK?g)9I5juHtfO-eF09ho@aQ4NwB7X;4jUSs6ozk@3|Wst*X)zTxW*7mQIn^^n?nh0A~zwOBKL%0g%D>vN#M36 zcTsr|^)er+cuT5tQY>&NOetZ-d2kJe<)|6EU(v9Sj%XOPMK`-Knbri_$NgqK;ge5Ms4l%}30;cQ;)*js~aR-6nNHe^6(! z_;A;#OOdgAp(>fUnu<;li-H46c(h_`jn(fb(cbk6Cv}n-sJ3V4Wy1PG+UlqWFbQGfNmYyTlee(oPV4L;SE*Sgzs0~!};g`tmp46xO@58%V+#W zWcX;^;lWLh9$uV2eDd1B+itq9JK|v0(YnX`ibv{)ulGLsU!B#R>7^v|J=M5Cuh`3C z1S)0tjRGx3T=tR#VZ4&a9B~i|@bRkXf(NzD#mCjnRPv^9wF%QPvEK1sWkJC~o78AjJLuq>}I!-&|fX+Ez>T(oT%xuZWnd-HJ-li|#GQ<@&M{Ka1WgZ;!p#*nL<{)&tS% zcH=8`^bHybt=E_XMP;s9E9ugt53RzJ+~_19B`LqDay>X?-?sL}PtW#>a>W3$ug#EZ z<&GH+yGLf(meQo^pdaLMw86T9S&A{X8Ienurp)u8PvG=& z+i?8iLbr4s=w4Xt9v+5X0)N}ZmlK;#)`acX)P z&rOA~{7T%$U5bw*vuz+swzxP^=QbT>?Z${|oY1`W4$>Yco1QMPZrkE`0cYDNtm8D& z{#}i7-WJ=p-Nz0G0x`hx4AEZGF$hT7EPdr~2-~Aff)=4ew3CdJKV4=@+Z#U^YRtND zug?f_WD77Qq?xJPmbx;CtzKFNq@nJjevu;(ciKHTgXQGE|*zPvnUzNvdU zR-ZaaqtY`V5Ljx%0_OT5NGw}h7beY^V%N8GFV>f{PS>>_;urFa@aB#V3+Y2i9{Mre zu@*s(E<(!_F-?jTRF5pR3JQtEn|U}m$9F*u7$nOl1Dym z=$)2TlngUdi?QpM#V}woh_l1g6mJ^cFKx49xQm*^O7sQJ<160|zMUV1zCgqCdj|K6 znkZ2XaY|zVpCDOAwe$)PtADGr50fP6G=T790-}*5r}JA-Q0cjwaQNxxKmPk%P_m}b zGn;TLZQw3HAkHn(3Kf&@&K7yKWd0o)%(Hs%+$=P(-j~Tof0y{!uniVR*l3}b%o-(W z2ue)E_G;dmNZ!u7W#xtfN?pX}l!3=ZhmUpw^V2KEDbc0$PYo10ISD*JIy*h{6gW8x zy`OERee@OrbNWh=N*UBC*HndyOxCt4SW;)nraps{1M>T*qr>QTq=RF?+fh6_qi+L% z`B|GB2xc+$>1zel0@V@eak*8{{T-KDyyVakX!p^5iBtqhkM28ce5tYwEts_q)_tx)dYDMVB z5wk*E18gN12Ux*~!42zI6d=rjfj{5UeJrN1Xf~#)lQ(ay;9Y3ynH3e491}Km^X5-g zD6w4%O>syxqm&S*!F0tZVS421G7KZS7^6^Qdw}WGO0L}CSGv&Hdnh(fXnbW9?@dydn57Fb^Gu7UR^il28QCq1ub4 zWt221?vD!oI%byQL3h|6C|Lh-9|VKCz|Y+fugm?cKHAO~ueu6S$KaVac$VIN(N^z% zbi*%l9M3Xp{7d@M86kxlQAc20#b8XA9=aUBKf|~3^JT5oeDJ_h7%|RgIOYDu^_pmO zo=VgZB+pw)mCiIm$Nd5iWf99hgHl(!0 z5$`?l!V?*ev{xx;f;nmlpj`l{xJ#wp4`Oxa0Nvp?5lU8H-N-({LwDA4>cO0aE zq{Libdd9`UclOiVC#;>)JC>m4|3Uzhk1JasZ^epW*)~c3O?zE&JhW zsN?7aFR*6%WXF_mJ}jC~JV=mu{5*6MZrxh{@2OQwpFmHRHy{56^e!&}*4L{` zN__bFM}&<{+$pV&Gt<;ED=JZL2sTRNOPm;EvG2)pNu<^@oNd6zC*TZB7Op%&VZgFP zjbWF2?HuLXe*)M~i;|G})Fr;EJ@ooYA*8R7o#|&OF68L|wYJN% z9a9%h7^;Sj0N>K3@*#3jR&=*GHDMc{5F`+jkR%%-|%nDY4eDm;%zlpM-k9`8Y6(J zNWjCDz4ZQLal+ec^7UWdUiThOdV5bixPt`?W~!ad$vfg-;xbI2gbZ}Cs$5Z;1p;V5 zq1nOf&qc`SHSj_Y?t-p$7B8Rnsb#s5m7YxXPFiIN>&Ha0cOfNBE=&lfMh&j=X4%E~ zh{!FO+Ag9vuAiKhPHy2v*vAL3F3>S7KQYF|o$b@P>!@WSW1f&={hc)G>zYz+%SI3b zQw6L{KQcbSQ5YOeIb+Oy9=*wn?dR_ub6@Nkj1|E*xbuVj{ZwLwcvm_Jtg83=+2Y9> zux83@m!J8wNb_B*%wK@LCzW|!pEVW)o6b&AHRgmeXG@MC&G1n2GT?Jn73(C6h6e}& zyyS#FxO-rEX?W;s&N*4&TgX^)K}OlEv6~-6Ynh^1s;6 z4Pfa9`|+`vvF!)8Z=cyd4t#HUOd=X1CqbIz=pZ@he*{-83NNrLkJp9I>UZ|FPiwA* z78YCypUUX((@%w8&MyeRqMueM!9J{lqMH$_(8S?veR;7F-oKCskAy%v2eL!B01bCuB^rYigLgQq`Q@>uM&s zT26y+y=2Lkq$ars{VR+|^B36%QL=&rF#&oa38~}rvjf5E7rXlg?*qS&_lNobY#?Yf z(1JM%*3MYpAM685z50gkgTS$sc%K9sJ;8^77nMfSDgvQFv|)I{BLP=5D)UX0d_B2S zs$*=ZO`pLP$VWxM;>a}d^N;Bi@IG}~@P6xYgB#W>jzW%i4@C<-b6jP({3__seP&2U zdch!5lei_SI6rzw8f?XPrHFBGaa?!`+(6d~W}53}Sn0mnqj;$eH6JaJp$bB&m_i9R z4;?827HLtX5%+SBZQ67!_g+L<>HUb=+~G}m$E;df2FRdLf(3#PHK?;(uh3L!r~dQI z%qM+E$4C9a8MW(7(xVUVffDRb`ZIg}d|$r}(Nz5-E9Tu?$r}p`h}_ zk~|b8Odt59VOzcVjhax40Id5x%%wZYalP zx#G%7K$B76#v26Rzgk-yWAnpfc75#Nz3*KkSoQbYmFk1`en300dl+@)jaK`(-XFBh zBCUxO76le(UOPT6pP7}-zL39|iMt3azAYM$tC%!C`F|w&IGLRMQ}8#Rv%iT(-guvU z%dJ1bt53caIK!`h=Xdf=?8w*bkz~=hAXxSV|I>~`+lVba^jT;dkR5y7@%q<&J*aq} z_{SUB>kbfG1OG1hztgYoMwWAwTlsS8BM&w{$V(DI5&NQIvqGr?=Q#JhE6gO!^=0{E z(P^5E)QlWLw@{b9N5^_xo{k+_qT>V8L(!>g3Y9C%p#N4_#^y8zO@LKiQ)s(UvSZ4qK(jz=awJq% zjZPbq_S_hJR#m!Xd`mxdo$giIZlYS z6jAONYo_=kd%>2K%1B z?%D8b8kQo#D7Q>I zqoJ)TBfrmt4q!}RCMN!znpacQ`Aty_anbr+t$B7luyU;Uc();Cn{;qXVexGFiGk9@ zvD97La)E_un-6LBdVWsNal*g-$|I7_N0YjwsPp5ns(iS(!9z~TSWN%z3bTbzhGpT5^h-Bu^ zw>g6X9Pk_69Id__@CR$xpLuKL@3;}bN<>Zq&u31KH`YcvIY-&taCCa+Exh0qGUT-9 zQ18>Zf&2JTTeFK4TU*gZGg!ekwXc?eKV&AAeKYU-ItIOrTr0n@WgdJw zTradS1ql}JqH*zCj}0u^$wYC7og176 z%ugK@A8Y5e-6SddkM;Yzdz}dXxmV$Rq%@Mk9gA1GQo|5JtPeu6 z;jh2KEB*i>XQY|hi8R`e*zYo69Phga!Nx;Y-|HQIT>Fk6yZvTIMaP56MQpdtgwEdn;Um4~5H`V_bs*`L07AGT>P>*^}%S6&mkO4fW#s6A5A& zF4G>5VlTOgp-Uqe)O05=O!5z%{v1lW3!CJV6df+Ed%9O0lH|L)c^F<*p>@PCv7qvW z5ZiIScVD-mfB$WrV_2xx@mBNLmcs6d^XN7~465Z|@7{sZ&fQ=1PT}D?$KSgrx8;r< zyNhbx6-x@x@_5<+B2gERL471*59>JXx&f=`_t2S|?t>ueN9gHzIoThNP6OYkr=N^3 z>~#uoH`usDsRORrCoc+Eg?n%Mo665^KdisY3^=BJOIY;IE&b|^$Z~F4H#F``W;xts zZcf$m`katQq=&T3$Ba;HVfxn?Q^m z@|^Ij?i|>J;3c5dX4{|dw>*1bylFf?H~&=ADN)qud1?PT*65vbW_oNbE#1SSyq&SK zc0*F(UgBVEb3jj+uYyiagcEQHE_A&YF~Q%5LUGVp8Cx*>ke zquuMA*Mz^oIt;8vh^Y|?UZG*ho^+CrAOPbpX!3L0@S8K*PsXCCy~9J2-Pt66X~Lix6r74V#J>J4f%c0W9t+Gg7Qaa?tb2z3V!+YLA6x6`hNchPCZKci%BJ zE8Bf%`0Fycu4}7qHZ-&HCOa-VxAWYu$IFhVG>x(K=C62*wqY9;AI^&xo9kVNE&><4r;K_j9jFLe07_{@v@C4=i%|@p{ z!(UEsd~+B&{N?30oGm2ew$F;KyF&0|ErBPJu`22wWug3VPyJDjE_;sI(=0nvlP;X7 zH|}AmeAP?t<{j!s;l{E(8y?;HiCgclk&r6I+>naII3tR|sSHez;*5eAyip-92m&Zg z*VzcOi|0V_(>D9e^!NW*<`OUp-gYkl^|=0y{(Up_S)i8n=3s|&zq81nKY6!(Ufr>} zAFcaC-juwzncNU=-Te^&OYjA@*XmYWnr$gH?<&$3oh&=a1007}4xwIg(UD0WM165~ z3c;IK$AUXOR60L=pGo4&{flGLQ+B9uRFrr_wjkt(tfb9^baA6+dL%;zqi+8r3;-_w z8tpH#^$!<2s31hJXLJf3?#y>;K4;p@+T0{u0F#cExVKU)sA@MV0nUm;0Jf4FU|>9AjRUV_q{LE_U8(^e?yExgy^?8}OWqv&(ACzZFaULPc4lQP~I~GWVy^a%c%u z>^S-f&)HCyK#1ciP6DVxOirlcO0X76cX1s!LGe7Cpk)65TV?L_upEA&hT3QH)Nl4i z8~iOu>GmnL8jW(*C#bk{J=CzkbBXHJ0HP(aRjO<$=~|V^7P3}YPy*~_dMTWw;_JC% z8_rU&4DODC4dJjxtl?56q!jUxP}Q_s(Pt@llVQ7MkAV z9IuMV*Rg)x%Ypvi=qK!a(m%VI(-q|6u)Gv@rQ1fP9j5d`!`S1lzI|A(3y4=E$x!wa zl56$iiU6!8zH)U0i+*?rfRZq_Sa$j`U?SMIwgQZvaOyzlq|dWCH6)if zba*>T==3oRmiPU1_2=0AX@=6iEAHzW`phGoxxr?tyXgjZA6X8b(7_baPR5Qe6?5PJ zFyk;$-v~LZR?rvn|0Dn=^-t{XT)3EpLzx3Y{?jnyx$sD$ijRT@XQ+RY#Xj0~E=}!m zs4C=cK{vu~0*t21-Q3{{(>X}=NIf8jb)MDW=RdNvUa7en0JFn$eZQ-70G z&P(Z7iWW~CeDaV(##8Z8gd4SIBnXi4zqa@+z3z5>IEmMf>MBx*+6Gy#>OkLwMn~%I zx|#@LqJ`XuPjG3bTlk1cbx#htHI>_VvX7`qpC>?00`;nFgO<0 z2M5=?*t9<_Z?}_&(Reg}MI1IzuWBgg43V*8(T+CG!?Wad`?|VPiu5BFo66nx2Ssz` z+aNRP>az-HY6EH2@Qr;XHM2=R`=pUEzYSmD;=a%xKwm!cs7DcM8C=^=*O+vn7aFrL zF=>QDF3Up-3rpiw!xeyAdwJd*#sMm}JzAWC?~7{Uv!oQ0bP*!yAr>PxAr)c|;wL4y z{WuE|+cg+Daab?AaRuv%GTsTX8Ht&k2&Easc2xslQjA!8tkNi0Ow{YGxa~A6JPDzL zlV7mCV$+a{!Z&b*yKUQY9Fx4}m}>=No9vyp%R1gZH}VcSEIZ{m-0UGaWeFIV8vr~! zdpJ)nkPl0MiNPr>L(x@iQwJi)t-`Bp2$md~r3M#Rfv;o5roe}d3!=oaj;+VD*)kk> zcrKScW}GJL`G_V@z6ymhq|++~=O+y^&y0nJ zfgbWxA(jN;QU_L?7*QD}%Fr);i0sTHJVN3< zET{c!TFHo!DllG(!BbQ#n^sv-&q#(9znCt`B|6Ec*GlfG$fZIoOk!9_`k-h&B2?na zg2A%lm4!2CSlXB6)PmVEG^~{y14>1GT8$_$!$VCeto45zP#$Ja~}fy`7iI>yK4m7GSU;A8UVT0%-jE{=jyyaXzV*05y7nhjfa>^X4c z#F>j3=2&Jqb1ytTk=54n5-AErlV&Yiwb^C2Js*+F)1Qz3E1Gp&pEoSHgY)2Ni6qHV zs5PkfmMb@R+;z_*b!a+tdgy`My8Y<2SKfK=gAtn@Gj7l+V@6T^;iykO`mD!RfBH+d zDwS%bO1GEZgn8#oN~7@$t@AFp?4kviT&HuzRkz%5(@U8$WXX{$Pl0@eij*i;s*FLo i3Pv@mt+QBQ4jOQ#m}+!*>aQ%OWUGtxEC1%;{XYoY`*vUe literal 0 HcmV?d00001 diff --git a/static/fonts/arvo-1.woff2 b/static/fonts/arvo-1.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5d0f88250fd410d9af733d9af3f7409737ce51cd GIT binary patch literal 10624 zcmV-`DSy^?Pew8T0RR9104aa~3;+NC08W$u04Xd00RR9100000000000000000000 z00006U;u+q5eN!_fMn@%3xg&A0X7081BOTwgcbxK1%pNhgI^n_K(nH5vtBktQ7hJ{ zQ%L@c1fGcWdmu1Kb0QqjGE|GLH4cnYwY~CT|J@7>0T?WXqP&TbJdHR@cvQksjz%LS znH`?rW>1_ho%(SG7)Xey&=wd(S}3JrA{G`#_1tvM$kpvueVeXymEqRs&^zZ}QeZ3s zTbNpzNf9qTvj}2A+D@h1q!Sa=idhA(AeJ;U`Fqbl?f&Pi|7QYyA6nMO(j~l{wu_W> zOmfGGa0loZ6oFeZX8rNdw+8#OJ9CF=7EPLHgy<=VhDansCW&=Q;ZZ43{AN)%B-H2W zG*~xOKJnv%|9{P1`;zROKS^m)#%zI)2UI9rjl25>C@}M~4D<7sV6w|IA4^DTmy`Vz zC}mG2N+5C|Tv@qVxw2(lRpCre;rU!kyE|`k1x(Qb%Tw+PUt@AP%=}G(vjtLB6&6s| z$rI*;TBSQR#?_Xo4ag~7&IXe;BBVU;ch{KKtjT+=I)*5RE2W7Q)O_?uv4N< zHoYdN+;-=NAe{HZ)j&5gE+H8xhYA9{9-3~kLvRjq?_Sow``%E}s(m}lrIjmEcZas!PbylxF z7FIgvB#Lzj0_j-|003|q0KniS03HL-RREB?05Cia7<~1<3iG^#irt3`wW+26Ul2p~Sd~>7!-+b}VuccLqQ$utN2@OpY^jIK?ULE#qF!ph=R)eAdqY0XOVIV1g8>M; zndhynhw+|FSR@4!T6sdJzo82(SsxZ&7R`&O(QXovLLYN=9^5ZhQ4tjnB7_=XGwbm^ zS(P?%OE3~r{Hkqz%^5Jqfq`ElK(wmINK$t@j*tSlO6Gwf;1KklKQHidtF56a;sjRj z^?VFeW%m{9GAg95&xdx6s*z>9^f}*}N5+s+MdVhszvT?p($F+HYH25N?o=n~DMvyb zCF#trd_hMsZVOzlL{S7ffzF}Niq#iER{h-)Qq-C3*u(|5xgK?CbSMl~3JlPR3|>jz zwY;z)RyrU#-bd*tUWp72)WGI(@m&X$w$K(EK?NpWxfd*8gHrlm@lUZ?r>K*)m z&i1|3F2wNxDWrFf%ZVz1Cg2EcSkwSvvFBqQM@D`*XrQQ8?Xp~ZLm{0ibw5WUFiU;E z{Q(XNhj1QX>8hmS4T4Cj#<l&?7>2iDd1}%mfKrPdpScYgz zuY8vCk>s7bL~vaWwnr3f1jim{9%2?I3vC-T5c6E6$*sdoY(`VL4OY$MNT{_on!O_l zv8g=b;Ccf>u_b-qDb7Hz7z&0R%1SDeKw|1ACP`9GKhqJqne0A&!Y&J_R7bpYKGf{z zfl1qp=-O&pfQsH^y>MlaWbLjO1XNbtf6y0aeh7DI5u$4aGFiEGM32-6?$2*E%n{FN zj^O|GLyn+BrFZbEtX0m4LXx2swM$$#gce}XDoy4cY3-YO1n8_}5|?y# ztDSwA5-u`T)Mp0Ywi;?cUTd_a3`HjUk^B*{c{(j?peyI@OkW{q9KXWSB}|SqpA-a| z$$SG=a8*iGsiCswKt(-rNpEVyu+8G~-4*>1GZT0x^nBsq@I&v0T=>c{LI9O9u~N6f z6P@`pdj1m)IfkAQi@1F;h@8}@0jV%5#S4wRa|(?AkPF5U5y;hJgm2hAtf3n;dB#603ip;>iGrse@%$P)7cw{_y!-k#3}Y^Dk;Ne=k*X+$rNUW+ zA3H6rb(%od0=>gXtlv+JnfdxNN3e*`%3%HbfhObd0gDlvHGWY)Jjk_}17wr=L}A+9G{$wPBNt*9YvBE*?KbcvTQD^60fk)JsxNtUuXS{daOn?oDlQ}JpOQmU^3lH zh7Kb|d3l>BYoFyIEQUAY0-@Ya@LQJyKv&jk`+wo{sc4kmSuE|<5`qR!MqVUG8+s~p z0pz)r2CqhAZQgQFURAF*TDYWe4vF0FvO9b_ZkrI_S*i;@5LHlb_H8oh^IN}seV>o4 zWNC@CWZ|nuRxQ@H_KM!1L9li#Ky|q@a>Jp>vpDY8?96~8P099H-o2O!e7qdqPU+h@ z5WnqyC8Yv)58v9kB*1QoU&IU&Z6f|aa%9iKcsx}8M80esa9pOoRsVxq9C8_ICOv~z zrL!=3IVmUC*wRj($ZJ@r#s|W4;GLGvx0ZRUh%vB?Es**I(2Y03chb1Dcx=M-)-%P4 z#Eg{eDEC1@6{15TS-K#hY{O?U(3vV@YgxOwdi-o|F;qf6dOM3qZqQV|hP?i+Hg}5z zxr`a-`t?QS&2URk&x|ciQx`?`dZ!dd(%@Tj{mSRl>K2VG2a{Io_}b6TymoImIa!|7 z7n8-{V9gYpBzL$k4ao>fDk|Q*S-HP*>~`VHmp~l$pUB%v!!ml})e8N9)UrLu{p$SJ298iGaxz{ZK9lS6zdG3Wzv<-!v3q($tIWYU1>%po@?fqQ)6+WI)z;Lo8no# zFS%qh!pgV`=et%egX26Hrv5-?A8vx@B8!s_Z+j5Ea?4uwZiYI#BJ*5HB>&IzT>gJMB717+VtH)R ziaEar^dEC(hr}(I9}_lj4v0EC-%}bJuAbwsc(6sI3oK9J1IpDGA8cWR)Sk3bDVq}( zJC8q8T&f+5%2c=e=4V`ekf>K!4;37n(<@-3>#!s!J@(rk;C${lT4VAqU#u z+o$MEF1>!cFxBL(iKes`ZLj6x?gv}4{YVZCmxM=@E>fmw^ zed)K`9=VoW>Nb^qweo5^m6j}zTf923GB8^PxQ27B*N8Psy|jbZrA?X|y7&4n3rwb1 zZn>Bl$<61rL(&f&^`ZDM{(HI(XN1rBvHi)bGQxMlix;!a@-!2j2r%iyA22z?Cr(t1 zmTlf~q640d{3^7$YbEd}Pk0;T38kjmCZ^ihJ`D)SftY|h^Og-SyA_1byLz+=@`ox; zl)+Eq>5tCW0P07iHyoYDiOfv;Ny}RyoH9{`Vwsbf8Ln91NhN!ScLk(Wdu@oEfmlnZ3CjxIy{zVp zs62eYsY();j9{k_)BK3Gfh)u9S?U;BfD?@N{nb+m8(u7mPWR}F$&jvJnscBn5=m(w-+cJezG>k(6$P9VPhYw;2DJb~_qXxzwgQz?ksvS*?ahj}EmQ8O27FFIPcx(Shp-mM~0|3BTPu$4zo4AW*OZ91c1O-JWR7+Qcp32XYO)p!1 zGOWN*E*mBai6@A_Rb_Du7{N|M|2s!zJ1~omD>}QS$8&Q-rrVcI%L_R<)*f@08Gc2> zkTfNRip^qPq^NOx0bb+hi%;P5)ff;xP1?lZiHPBrL}KWIKuTmCoO!l3mJ;WXzF2(Y zQbgyRM_&auw(g|A%{D< zj>+?Y5ELRkEy<7SA`kYKpYX|QelCghE5FBg9j9qM)K*+CT%6>_Jz=(RzQON#1rk00 zF<3qiAMNdf*YJ4JSYX&|aV2$ayN~j~v5Tkj`k)K`;Yux^sH4U;_Ce{;*vBzoG-uJJ zUtN#}8hSa@7KcNyXW2+6?C;s?iNhh;v%ecBHgXp61cr=7C+v%u|7K^drKcM{7QqAu zqa1r`nE<+}?FmFObs}5(dn~ThY!xL#*3kaL_ov@&BHBm~3~fk*eA~x$Isqft7?dZ? za}B%bw)*oZOIf&HMpn#`1;w}}TYDTlbLn(mH*`xDq1J|ZB`_%L1y+k9o!X^0l;j~Y16N1*6z7eC849E=|s6X*1{*pp*7HkL)nG4{+XO8?B`5>!H#j_2^nvH zCz>DCD`xt}Ye|N^cYsFqNKfSIL#Eo_kwKwPX0lWM~7mP0%>~=bs{&R`b$SIe@c+8ZJ5pvS0Ix@TvwSL;KYpwkJdx@4t~MiSe*4#0XA*+G@-Css{l zLv~Or<1dx*H?Lx>g3RozwYcl6>z3))Giw2^2ZVv|h%?F#!S=FTtr99{*lmdRg zdsDiIMJ`UuOY?+YK)LVV{`r+6I8@DlsL-CezPd21fwQn4+`4Pv#nQ+`6Ak`J}O(Y>S0OSB|q!YaWXSxjTjzKM;(r}?0k0Yt$+ZCT>BM4Nn zy^)P*F0n9pUvuSNj!wIS)to2&S05?v_2qB9>`uQ2i1{r0jbx#nD~@YTxX$%30P&)& z)eXCYv(xs9o63U5BQ??yK85bfAt@0_UJ25z?e&L(^}1c0rhM7RVx23~DD_}Myla4M zHj3lqY|9S~MpD|%JKgwJKU={3VaJ^zA&&G=HqOhCaOM9i?MI+isH?pfAbBI7vaH$3 zd;D5U!*&){MIP?1nc!#>w$R#=;`_{#81h)0q%HvIN|9nJ?d4R0L+}APhR%t#HeO7{ zPtjHZ?v44eCXA(lo(+kKtxUNbV8MUG1O|B2CnUD9l&V&y zHqpJI^okuu&ULWmDsgspIKIrzLB_+pf4zV`ZO(#qr46_m3YBe4^?SgU90xm&8!JFz z^Ck#5Og(unEckqMb@FymT}9wVZB@Zks>Hw?Sdck zi{u5U7kBb>j|cIxEHMi^IWxd=mX`j-J)SYVBPD9g0wau0)4`0*S5Kj|KDX0WgmJ z`U3+%QtDgGo{rDJY_00SHw>5;qaQIA@-Tr{QDj6hozE|#+fnF60zSPsGO~!lv|@&2 z#wZ3m;XxKnVM)cT5v@+Xr@!e|aN{O;2QcQzp;p2?=(75Xn0@dK%u*Vykz?17SaJx7 zIM^-dLc7qnqabIaP@leuU99KyC}?J3c3iDI)j$72eRbGmXT?$9TnmV10{@(CMhr%^ zphC!QsG#N`lp7zIijzM@U9pfBP(woSaYP0>JW%kNxME_lbjMZk;v*rhMO1E%^y;?w z={;P5)QRR6NMXCj|1R{ooi#Z)IGJ_Zr>O9b&%vyrLH#7x3X2pJJTTy(5JLuXa#obc z^+L7V8d+yvey41;n_9ibtwZL40aw%~)B!535ftg{L><>AFxD#hB=V#%!gV~fEho1v zbj&p(V%)Vg)I$TVL{y_R9wR4{A)RxHQ{AJS36lo} zk_nYQWmj-xWAM(@)Zkr>4L-e;?1M_a1bEzkHoG2RnEmzgijLmrXY|bnd?~oR;=w+) z%;r36?|odrz7uzW$U`{c1PI?*T>Zbl0Eu(rA<5@=qpxo7#76{wIKg`}@_rJ*MfQ5!jrs^HgIngE4c_ZT z)qzFV6DYcQS5(46@;YFwZ5V(9cm!U034j3CQ5GcXcl-GU`uYm*C@AKbAEJ-1neeyT z>24k3Va+`tnKbe&!xaL}ZPeK_P+uM z7lAM4z-{DZW8XviIR9HBgoZjoHiO-?YxA{(b|#$VET)9!5L{r%Vffk`WNunjnZAjU z9Jki9G*dX5nyKBL94ZiS2*GAaf#B=`Zd^3oeH&4QExpaPa$`iI&6qRQ?*DmZCom+z zE@>j6YnC)Di@{mM-=-WEVAkv+s^%!3?Z#7iC`hfMo!su#K&a|1VLN9AMy9j55C<4* z=i(lTy3d=2D3@t)4S`{LOdweVt2q)zf7JP@-)+FLv0@L|Z+~8?LmqwPQ%8Q^vLiJj z19G4q^9K!ApKvF$Z$=7^gSmT-`~h<>`~f~mqDLK{M(BACrFr}P$a^Xp9S7X{KXpE$ zhaIUA!YF5B)xh|9C@ggUD5RyLd zN)3-I43SuBz*xVw_TC9;W@x4XXHwsTXL(F@gX6RE zV>ouYYZgn;jUTP3IsI$?C)VJ&#S}uF>EK>;Le`HrKG@wUipPs`a%TXnfsb-`$1}wBFx(-Y8;DC>WZ_`B=6@jh1XVzLBBY)47~09J zLBQyVbQSv{Q}`qV#H{Cmlf^^)>VbJXZ`Js)ImbD`dR%jW)zmayzW&y{bM#IRuZ-gU z%7$m@Y;0<7ibfb(j`ha3KTrS6>^>96i2#DHCmVy=r(vqrWZ)+6r`1h(%jh-#f@h={ zUHX#I8_d(CWE}NTc*c|&zhK|ceRzSG=AXvpgBm;8b)kLral=*3Y6N|McMv!-;3wwq zPv2)*1Gms7JZA+svxvVr=up;f%W6dx$P!+pF#{&rvLD~X#Gm_rWpVRRWxW{2d5M1a z@Zh6bp;mRtbb8dEAKq|P>R|}@_DnXScJfMHS&Vvml^3d zoLSzjP?#o88Dr<%X814ca7^45>y>hmYCdH^QQAGj29l}xAT}cu>B3YvWg^5FnqyFR zs10DOecJ-hneiHfrBU7)u#6qIS&fiXSZWZAe_wbt!bkqUyy7J78m$Z1ilU=1a1e-O z1P1X~_Ivls`mXY7GB}C^dc87{+iLR8i$kwdCIt@Er|e;5#0`@QgIK|LGf-8IoHSjp8;C)D>k4HCP7J&U`adIl#|oTm+M-T)#$2{Y}S?*+t}M&@n|Y5UC~S)a*bJhnYDC;ZOn)>W=NwYE7y$WcVZTy6%B%u*gt8V0zhVlpFC-$ zJY~0p)-9jw$J!$rmo*0c-3At+ntNj>@8<=|zQZ+}@L3yZs_B@gQHUmG( zK0Oz%61F)-Hz_z`+`fAf;>YR8CgXcZ9gRv0el69CN^!v6xTs$EGqfhJhA~i|uQoyhuZT8>flvs7oTfcl(Mr8obmBnt&#A2r~cAz3!Vqjj&}NarhJ_UZbx#1_&wTo8F?pcwL9_#XBjh$-S01QK{?A8~W{H;3{@`7lsn7R$CiB4i4ky25 z_raLAu7T}M{vXUgvA&k<6QKYAW-#}|W(<6Hb|&b*FJ@PooCU(I z39?F*Q^s4A=(8rsnJ#U{77Lc52yykDgjik$Sy7RTts?>b8Z+-%UcD?98+2A=vD4jW zM&P&rK&}NKI0k?@05Af?Wy3CqbnIf{T!lW#g3455r}3VaLPsWgZNQp~;Ikt`XzkMT zUdD*vTkfK#s+wE~&xx|2YWd_V%hxo7yb>F?C^Fw>8x|}kEZUr~%*ZA=liYx!^kyUdS#^BmR0qwcuFFhxuL+!dY=2nUe;qqf4jXnj#P|%EQ(UJ)Pdu?#p^y(+41d=@ADgm&F<5~b$_-7 zTt(O+2H2=(>?)Y4Jp^WYp?+4Unai)S^#N@RCiB{^=FBt|EN7RncVbcPg(GONxIwaB z+e?^Q!Kjrex-z4Weg+uKhi0w7u(zm=#}PDGb)mowlG0ArtAmu8*~<3vT(QCmE3B{r zp$H8@fB@kXH%NF{W;@u*HugL~fB*pkM8Fj7I+%3cGV!Mz9eg62#>1&r`h!YcSvD)Z zZ?um{AAR)GPd@_;Fu)*#3^K$JLuznXwW@}ZBy*q^3Dg0Ante+cQk3(kN(VXL&kKQo zL?$|*Vs@;{cu}o8p|l=4lb{9bE~qg6%WgJ>H6FceC35McNRw?{|Ou?28e@Catm3lme@8yks!rt8bPW_sTD-oMNGuKpLzW!b^5oLXSD;XlVx>xysZg#`wHj|d*XX*7_S+XQ a14GceJO7DZmzA89tJCK$O1@K&djSB<+g`2! literal 0 HcmV?d00001 diff --git a/static/img/world.svg b/static/img/world.svg new file mode 100644 index 0000000..b22a1eb --- /dev/null +++ b/static/img/world.svg @@ -0,0 +1,979 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/js/map.js b/static/js/map.js new file mode 100644 index 0000000..b74c4d0 --- /dev/null +++ b/static/js/map.js @@ -0,0 +1,104 @@ +(function() { + function createSvgEl(tag) { + return document.createElementNS("http://www.w3.org/2000/svg", tag); + } + + function lerp(datax, datay, x) { + for (let i=0; i x || hi < x) + continue; + const loy = datay[i]; + const hiy = datay[i + 1]; + return loy + (hiy-loy) * ((x - lo) / (hi - lo)); + } + } + + function robinson(lat, lon, radius, centerMeridian, adjX, adjY) { + const table = [ + // lat a b + [0, 1.0000, 0.0000], + [5, 0.9986, 0.0314], + [10, 0.9954, 0.0629], + [15, 0.9900, 0.0943], + [20, 0.9822, 0.1258], + [25, 0.9730, 0.1572], + [30, 0.9600, 0.1887], + [35, 0.9427, 0.2201], + [40, 0.9216, 0.2515], + [45, 0.8962, 0.2826], + [50, 0.8679, 0.3132], + [55, 0.8350, 0.3433], + [60, 0.7986, 0.3726], + [65, 0.7597, 0.4008], + [70, 0.7186, 0.4278], + [75, 0.6732, 0.4532], + [80, 0.6213, 0.4765], + [85, 0.5722, 0.4951], + [90, 0.5322, 0.5072], + ]; + const a = lerp(table.map(r => r[0]), table.map(r => r[1]), Math.abs(lat)); + const b = lerp(table.map(r => r[0]), table.map(r => r[2]), Math.abs(lat)); + const x = 0.8487 * radius * a * ((lon * Math.PI/180) - centerMeridian) * adjX; + const y = (1.3523 * radius * b * adjY) * (lat < 0 ? -1 : 1); + return [x, y]; + } + + function hexbyte(n) { + return Math.round(n).toString(16).padStart(2, '0') + } + + function ring(x, y, radius, strokeWid, trans) { + const circle = createSvgEl("circle"); + circle.setAttribute("cx", x); + circle.setAttribute("cy", y); + circle.setAttribute("r", radius); + circle.setAttribute("stroke", "#1c619a" + hexbyte(80 + trans * 5)); + circle.setAttribute("stroke-width", strokeWid); + circle.setAttribute("fill", "#1c619a" + hexbyte(trans)); + return circle; + } + + function drawServerLocation(e, data) { + if (!e || !data) return; + + const svg = e.contentDocument.querySelector("svg"); + + const height = svg.height.baseVal.value; + const width = svg.width.baseVal.value; + const earthRadius = width / 2.666269758 / 2; + const center = 0; + const adjX = 1.02; + const adjY = 2; + const offX = -12; + const offY = 75; + + for (point of data) { + const xy = robinson(point[0], point[1], earthRadius, center, adjX, adjY); + const realX = (width / 2) + xy[0] + offX; + const realY = (height / 2) - (xy[1]) + offY; + + const dot = createSvgEl("circle"); + dot.setAttribute("cx", realX); + dot.setAttribute("cy", realY); + dot.setAttribute("r", 5); + dot.setAttribute("fill", "#1c619a"); + svg.appendChild(dot); + + const rf = 5; + const rs = 15; + + svg.appendChild(ring(realX, realY, rf + rs * 1, 2, 20)); + svg.appendChild(ring(realX, realY, rf + rs * 2, 1, 15)); + svg.appendChild(ring(realX, realY, rf + rs * 3, 0.5, 10)); + } + } + + window.addEventListener("load", function() { + drawServerLocation( + document.getElementById("map"), + JSON.parse(document.getElementById('locations-data').textContent) + ); + }); +})(); \ No newline at end of file diff --git a/templates/ccvpn/index.html b/templates/ccvpn/index.html index 0b81bb0..83f7be4 100644 --- a/templates/ccvpn/index.html +++ b/templates/ccvpn/index.html @@ -3,95 +3,64 @@ {% load static %} {% block headers %} - + {% endblock %} {% block content %} -
-
-
- -
-

{% trans 'Unlimited' %}

-

{% trans 'Unlimited bandwidth' %}.
- {% trans 'Uncensored' %}.
- {% trans 'The data must flow.' %}

-
+
+

Secure your browsing with a VPN

+ +
+
+

Hide your IP Address

+
+
+

From corporations and attackers tracking you for advertising, marketing, geo-blocking, extorsion, ... + and irresponsibly storing personal data that can leak to malicious parties and be used against you.

-
- -
-

{% trans 'Affordable' %}

-

{{eur_price}}€ {% trans 'per month!' %}
- {% trans 'Pay by card, PayPal, or 40+ cryptocurrencies.' %}

-
+
+
+
+

through a Secure Tunnel to the Internet

-
- -
-

{% trans 'Secure' %}

-

{% trans 'Encrypted tunnel' %} - {% trans 'with an anonymous address.' %}
- {% trans 'Supports DNSSEC and PFS.' %}

-
+
+

+ ‣ Defend against eavesdropping & tampering, from compromised WiFi access points to intrusive corporate monitoring and Deep Packet Inspection.

+

+ ‣ Avoid network limitations (IPv6 unavailable, bad peering, misconfigured firewalls, ...) + and circumvent interception attempts (lying DNS, DNS blocking, ...) +

-
- -
-

{% trans 'OpenVPN' %}

-

-

    -
  • Windows, OSX
  • -
  • GNU/Linux, BSD
  • -
  • Android, iOS
  • -
-

-
+
+
+
+

CCrypto VPN is a simple solution for only 3€/month

-
- -
-

{% trans 'Fast' %}

-

{% trans 'Up to 1Gbps.' %}
- {% trans 'With WireGuard compatibility' %} - {% trans 'for the best performances.' %} -

-
+
+
    +
  • Access to fast & secure servers around the world with no data cap.
  • +
  • Powered by OpenVPN or WireGuard, freely available on Windows, Linux, macOS, Android, iOS, and many more.
  • +
  • With the best encryption available, IPv4 & IPv6, private DNS resolvers, and DDoS protection.
  • +
  • Subscribe with PayPal, credit card, or any of 40+ cryptocurrencies
  • +
-
-
-
-

{% trans 'Hide your IP address to disrupt tracking and geolocation.' %}

-
-
-

{% trans 'Protect your privacy on insecure networks with AES GCM 256 bits, RSA 4096 bits.' %}

-
- -
-

{% trans 'Get a clean and neutral access without censorship, interception, or manipulation.' %}

-
-
-

{% trans 'Bypass firewalls in restricted network environments.' %}

-
- -
-

{% trans 'Transparently compress your traffic to save data and gain speed on slow connections.' %}

-
- -
-

{% trans 'Get IPv6 connectivity on IPv4-only networks or where IPv6 is not equally supported.' %}

-
+
+ + {{gateway_locations|json_script:"locations-data"}} + +

+ more on our infrastructure +

+
{% endblock %} - -