aem1k - JS Hacks & Creativity __ _ / \ \ /' \ \ \ __ __ ___ ___ / \_, \ \ \/'\ /'__`\ /'__`\/' __` __`\/_/ \ \ \ , < ___ / \ \L\.\.\ __// \ \/ \ \/ \ \ \ \ \ \ \\`\____ / \___\ \ \__/.\_\\____\ \_\ \_\ \_\ \ \_\ \_\ \____\ \/___/ \/__/\/_//____/\/_/\/_/\/_/ \/_/\/_/\/____/ aem1k JavaScript Hacks and Creative Coding Created by Martin Kleppe aka @aemkei .
Projects Hello World 1K - spinning globe embedded in JavaScript code JSFuck.com - write any JavaScript with 6 characters: []()!+ aurebesh.js - translate JavaScript to other writing systems Qlock - JavaScript quine clock tixy.land - minimalist code golfing environment Alien Art - simple formulas to create bit fields Meta - meta balls quine JS // VOID - invisible variables and code INCEPT10N - JPEG = CSS = JS = HTML Polyglot Theseus - create and solve a maze Mona - blind drawing the Mona Lisa in < 512 bytes M4TR1X 雨 - raining code using Asian characters only שלום-עולם - valid JavaScript in the Hebrew alphabet Mandelcode - a quine zooming into the limits of JS א The Aleph - creating life out of a single character ffconf - animated logo in space ЗВЕЗДА СМЕРТИ - Death Star 666 bytes ASCII art attack Life - Game of Life in 176 bytes of HTML+JS Invisible Code - hidden source (Chrome only) Four - hidden Tetris in an octal layout Pac-Man - old-school game in < 512 bytes Binary Tetris - Tetris in 140 bytes of JavaScript Katakana.js - JavaScript with Japanese characters FÌRE - fire animation in 128 bytes of JavaScript wãter - wave in 128 bytes using combining characters Tic-Tac-Tweet - Tic-Tac-Toe in 140 chars / 159 bytes Ping - Pong meets Breakout in < 256 bytes More Examples Spin the globe - Hello World 1K eval(z='p="<"+"pre>"/* ,.oq#+ ,._, */;for(y in n="zw24l6k\ 4e3t4jnt4qj24xh2 x/* =<,m#F^ A W###q. */42kty24wrt413n243n\ 9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nm\ r24".split(4)){/* dP cpq#q##########b, */for(a in t=pars\ eInt(n[y],36)+/* p##@###YG=[#######y */(e=x=r=[]))for\ (r=!r,i=0;t[a/* d#qg `*PWo##q#######D */]>i;i+=.05)wi\ th(Math)x-= /* aem1k.com Q###KWR#### W[ */.05,0>cos(o=\ new Date/1e3/* .Q#########Md#.###OP A@ , */+x/PI)&&(e[~\ ~(32*sin(o)*/* , (W#####Xx######.P^ T % */sin(.5+y/7))\ +60] =-~ r);/* #y `^TqW####P###BP */for(x=0;122>\ x;)p+=" *#"/* b. OQ####x#K */[e[x++]+e[x++\ ]]||(S=("eval"/* l `X#####D , */+"(z=\'"+z.spl\ it(B = "\\\\")./* G####B" # */join(B+B).split\ (Q="\'").join(B+Q/* VQBP` */)+Q+")//m1k")[x/2\ +61*y-1]).fontcolor/* TP */(/\\w/.test(S)&&"#\ 03B");document.body.innerHTML=p+=B+"\\n"}setTimeout(z)')// JSFuck - Write JS with 6 Chars (![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[]) [!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+ []]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[ ]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+( !![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[! +[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[] ]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+! +[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]] +(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]] // ()+[]! Qlock - Quine Clock (r=() = >se t I n terval(t=>{fo r ( j = o ="\ n " , y = 5;y--;docum e n t . b ody [ "in n " +"e r H T ML"]="< p re>&l t "+(S= " script> \ n")+o+"\n \ n</"+S) f or( x =-0 1 ; 6 3 -!y > x++;o + =`(r=${r})()` [ j + +].fo n t c o l or(c?'#FF0' : " # 4 4 4") ) c = x / 2 %4<3& & par s eInt("odR F acb67o2vi 5 gmO Z mwF N teohb O h3sw".sli c e(i="9" < ( D=Dat e ()[ 1 6 + ( x /8|0)])?30: D * 3 ,i+3) , 3 6 ) & 1<<(x/2|0)% 4 + 3 * y },100)) ( ) ЗВЕЗДА СМЕРТИ - Death Star Зв езда <bOdY oNLOAd= "Я=[];Л= {};Ж=!Я;З= !Ж;Ч=!+Я;Д= Ч+Ч;П=З+Я;Б=Д+Ч;Ю=Ж+Я;Ф=[Ж]+Я[Я];И=П[+Ч] Ы=Я[Ю[+Я]+Ф[+Ч+[+Я]]+Ю[Д]+П[+Я]+П[ Б]+И];C=Я[Я]+Я;P=Я+Л;Ь=Д+Б;Ш =+Ч;X=+Я;Й='★ ';К='Й' H=П[X];T=Д+[X];Ы[P [Ь]+P[Ш]+C[Ш]+Ю[Б]+H +И+C[X]+P[Ь]+H+P[Ш]+И ](Ю[Ш]+Ю[ Д]+П[Б]+И +H+(Ж+Ы )[T]+К+ (З+Ы) [T])( )"> смЕ р Ти שלום-עולם - Hebrew JavaScript
// שלום עולם א="",ב=!א+א,ג=!ב+א,ד=א+{},ה=ב[א++] ו=ב[ח=א],ט=++ח+א,כ=ד[ח+ט],ב[כ+=ד[ א]+(ד.ד+ד)[א]+ג[ט]+ה+ו+ב[ח]+כ+ה+ד[א ]+ו][כ](ג[א]+ג[ח]+ב[ט]+ו+ה+"(א)")() Katakana - Translate JS into Japanese
ウ="" ,ア= !ウ+ ウ,ネ =!ア +ウ, ホ=ウ +{}, ヌ=ア [ウ++ ],セ= ア[ミ =ウ] ,ハ= ++ミ +ウ, ヘ=ホ [ミ+ハ ],ア[ ヘ+= ホ[ウ ]+(ホ .ホ+ホ )[ウ] +ネ[ハ ]+ヌ+ セ+ア [ミ]+ ヘ+ヌ +ホ[ ウ]+セ ][ヘ] (ネ[ ウ]+ ネ[ミ ]+ア [ハ]+ セ+ヌ+ "(ウ)" )() Hieroglyphs.js - JavaScript from 2000 BC
𓅂='',𓂀=!𓅂+𓅂,𓁄=!𓂀+𓅂,𓊎=𓅂+{},𓆣=𓂀[𓅂++] 𓊝=𓂀[𓇎=𓅂],𓏢=++𓇎+𓅂,𓆗=𓊎[𓇎+𓏢],𓂀[𓆗+=𓊎[𓅂]+( 𓂀.𓁄+𓊎)[𓅂]+𓁄[𓏢]+𓆣+𓊝+𓂀[𓇎]+𓆗+𓆣+𓊎[𓅂]+𓊝] [𓆗](𓁄[𓅂]+𓁄[𓇎]+𓂀[𓏢]+𓊝+𓆣+'`𓅂 𓂀 𓁄 𓆣 𓊝`')`` Confusables - All Vars are X
var ⵝ = '' var Ⲭ = !ⵝ+ⵝ var ᚷ = !Ⲭ+ⵝ var ꓫ = ⵝ+{} var 𐊐 = Ⲭ[ⵝ++] var 𐊴 = Ⲭ[Х=ⵝ] var Χ = ++Х+ⵝ var X = ꓫ[Х+Χ] Ⲭ[X+=ꓫ[ⵝ]+(Ⲭ.ᚷ+ꓫ) [ⵝ]+ᚷ[Χ]+𐊐+𐊴+Ⲭ[Х]+ X+𐊐+ꓫ[ⵝ]+𐊴][X](ᚷ[ ⵝ]+ᚷ[Х]+Ⲭ[Χ]+𐊴+𐊐+ "`XXX`")() Mandelcode - Fractal Quine, Zooming into JavaScript
E = 1 , z=1.07 ; function s( a) { for(a&&(E=!E),H="",z *= .9,T*=.8,Y=0;2>Y;Y+=.1) { for (X=0;2>X;X+=.04){for(x=y=i =0;99>i &&99>=x*x+y*y;i++)t=2*x*y,x = x*x-y*y+z*X -z-Z/(1-T),y=t+z*Y-z-U;(/* MANDELCODE=A-QUINE-BY-AEMKEI=CLICK-TO-ZOOM */ H )+=" .+#"[ i%5]}H+=n}!E&&setTimeout(s ,99),P[ I]=H}Z=1.74909351846789013, U = 3.40220976e-7,onclick=s;n ="\n";P.textContent="<" + "pre id=P>\n"+P[I= "i"+ "nnerHTML" ] T /*aem1k*/ = - 2 // VOID - Invisible Variables and Code
< script> / /[ = ""],='"',= = =,=== , =+,=+ , =+,=+, = {}, = +,=+,=+,=+,= . +,=[] , =[],=[] , =[],=[ ] ,=[ ] ,=[],=[],=[] , ="\\" + ")(",=[], = [],=[],=++ + +++" " ,=++++ + +++++ , =[][],((++( + (++++++++ ( =++(+)+)++++ + +++++ " ''"++"."+++ + +++(+)++ + ++"/"++".{"+ ( (+))+ " }/"+++(+)+( + )+",'"+ " '"+++)())( ) +)()) ( )</script> const - The only Constant is Change
const cοnst = 'const '; ([ cоnst , conѕt ]= cοnst , [ соnst , сonѕt , cоnѕt , соnѕt , сοnѕt , сοnѕt , cοnѕt ]=[!! cоnst ]+ ! cоnst + cоnst . cоnst )[ cоnst = cοnst + сonѕt + cоnѕt + cоnst + соnst + conѕt + сonѕt ] [ cоnst ] ( сοnѕt + cοnѕt + соnѕt + сonѕt + соnst +'`'+ cοnst +'`') `` $five - Write JS with Only 5 Different Characters
[$$ =[+[]]]+[$$ [++[[]][+[]]]=+[]]+[$$ =[$$ 1[]][+[]][++[[]] [+[]]]]+[$$$ =[$ [[[]+[][+[]]][+[]][++[++[++[++[[]][+[]]][ +[]]][+[]]][+[]]]+[[]+[][+[]]][+[]][++[++[++[++[++[[]][+ []]][+[]]][+[]]][+[]]][+[]]]+[[]+[][+[]]][+[]][++[[]][+[ ]]]+[[]+[][+[]]][+[]][++[++[[]][+[]]][+[]]]]+[]][+[]]]+[ $$$$ =[$ [[[]+[][+[]]][+[]][++[++[[]][+[]]][+[]]]+$$$ [+[[+ +[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]]+[++[++[+ ... Fire - A Flame Shaped Quine
nt inner 7+578] (x=a[i] ]+a[i+ color(5<x&&" HTML=hfor(h= =89;i + +<63 ~((a [ i ] + a[i ]+ )/4 ) ) & & e [i%142] &" # F F " ):"\n")p r( h = " " , a [I++*I% i++ < 6 3 ; h+=i%3 ? i] + a [ i + 1] + a[i 29]+ )& & e [ i % 1 4 2 ] . nt c o F "):" \\ n " )p nn e r H I+ + *I +578 ] sic - Encode JS with 2 Different Characters
[C=B=[]].__proto__[C.B]=T=new Proxy(B,{get: (_,N)=>(B+=+!N,B[6]&&(+B||eval(C),C+=String. fromCharCode(parseInt(B,2)),B=[]),T)}); [][[][[]] ][[]][[]][[ ][[]] ][[][[]]][[ ][[]]][[] [[]]][[]] [[]][[]][[] [[]]] [[]][[]][[] [[]]][[][ []]][ []][[]][[][ []]][ [][[] ]][[] ][[][ []]][ []][[ ]][[] ][[]] [[][[ ]]][[ ][[]]][[]][ [][[] ]][[] ][[]] [[]][ [][[] ]][[]][[][[ ]]][[ ][[]] ][[][ []]][ []][[ ][[]] ][[]] [[][[ ]]][[ ][[]] ][[][ []]][ [][[] ]][[] ][[]] [[][[ ]]][[ ][[]] ][[][ []]][ []][[ ][[]] ][[]] [[][[]]][ []][[][[]]] [[][[ ]]][[[]]][[ ][[]]][[] [[]]][[][ []]][[][[]] ][[][ []]][[][[]] ][[][[]]] ꝏ - Encode JavaScript with Only One Symbol
with (ꝏ ()) ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ... l33t - Write Code Like a Hacker
with (l33t ()) { c0ns0l3.w4rn ('l33t '); al3rt ('w00t' ); } function l33t(p=this){return new Proxy(p ,{has:()=>!0,get:(t,n)=>(p=Reflect.get(t ,String(n).replace(/\d/g,a=>'oizeasGtBg' [a])))?p.apply?p.bind(t):l33t(p):p})} Filler - Hidden and almost Invisible Variables
/ㅤ/-[ㅤ=''],ᅠ=!ㅤ+ㅤ,ㅤㅤ=!ᅠ+ㅤ,ㅤᅠ=ㅤ+{} ᅠㅤ=ᅠ[ㅤ++],ᅠᅠ=ᅠ[ᅠㅤㅤ=ㅤ],ᅠㅤᅠ=++ᅠㅤㅤ+ㅤ ㅤㅤㅤ=ㅤᅠ[ᅠㅤㅤ+ᅠㅤᅠ],ᅠ[ㅤㅤㅤ+=ㅤᅠ[ㅤ]+(ᅠ.ㅤㅤ+ㅤᅠ) [ㅤ]+ㅤㅤ[ᅠㅤᅠ]+ᅠㅤ+ᅠᅠ+ᅠ[ᅠㅤㅤ]+ㅤㅤㅤ+ᅠㅤ+ㅤᅠ[ㅤ]+ᅠᅠ] [ㅤㅤㅤ](ㅤㅤ[ㅤ]+ㅤㅤ[ᅠㅤㅤ]+ᅠ[ᅠㅤᅠ]+ᅠᅠ+ᅠㅤ+"(ㅤ)")() א The Aleph - Life out of a Single Symbol
א <script> א ='אֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲ֤֤֧֥֤֦֣֤֥֦֤֥֦֦֤֤֥֦֦֦֤֥֤֥֤֧֤֦֥֧֦֥֤֧֥֤֥֤֤֧֥֥֧֥֣֣֣֥֥֤֥֧֥֦֣֦֧֦֦֦֧֣֥֥֥֥֥֧֣֥֥֣֧֥֤֣֤֦֥֦֦֥֧֦֣֤֦֥֦֦֥֧֧֥֥֤֣֣֥֤֥֧֦֧֧֤֣֣֥֣֥֧֥֤֧֧֦֣֧֥֧֥֤֤֧֤֤֣֣֥֣֥֤֦֦֧֥֧֥֤֤֧֦֦֤֥֥֤֥֦֧֤֥֦֧֦֣֥֥֤֦֥֧֦֥֤֤֧֥֦֥֤֥֧֥֦֥֧֣֤֥֧֥֥֦֧֤֥֥֥֥֥֥֥֧֧֥֣֥֧֣֥֤֤֥֣֧֥֤֣֣֥֥֣֤֥֣֥֥֣֤֣֣֥֥֥֤֥֣֥֧֣֤֤֥֧֤֣֦֥֥֥֤֥֥֦֦֤֥֦֤֥֧֤֤֧֥֦֥֥֦֥֦֤֥֦֤֥֤֧֥֥֤֧֥֤֧֧֥֠֡֠֠֡֡֡֡֡֡֡֡֡֡֡֡֡֡֡֠֠֠֡֡֡֠֠֡֡֠֡֠֡֠֡֠֠֡֡֠֡֡֠֠֠֠֠֠֠֡֡֠֠֠֡֠֠֠֠֡֡֠֠֠֠֠֡֡֡֠֠֠֠֠֡֠֠֡֡֡֠֠֡֠֠֡֡֡֡֡֠֡֡֠֠֠֠֡֡֡֡֡֡֡֡֠֠֠֠֡֠֠֠֠֡֡֠֠֠֠֠֠֡֠֡֡֡֡֠֠֡֠֠֠֠֡֠֠֠֡֠֠֠֠֠֡֠֠֠֡֠֠֠֠֡֠֡֠֠֡֡֠֠֡֡֡֡֡֠֡֡֠֡֡֡֡֡֠֡֡֠֡֡֡֡֡֡֡֡֠֡֡֡֡֡֠֡֡֡֡֡֡֡֡֠֡֡֡֡֡֠֡֠֠֠֠֡֠֡֠֡' ב = "" , ח = ! ב + ב , ד = ! ח + ב , ו = ב + { } , ה = ' " ' , ע = ח [ 0 ] , נ = ח [ 1 ] , ך = ו [ 5 ] , ם = ( ח . ד + ו ) [ 1 ] , ף = ח [ 2 ] , מ = ו [ 1 ] , ס = ד [ 3 ] , כ = ח [ 3 ] , י = ד [ 1 ] ג = נ + כ + ע + ף + נ + ם + " " , ט = ( ז = ך + מ + ם + ס + ע + נ + ף + ך + ע + מ + נ ) [ ז ] [ ז ] , ט ( ט (ג+ה+ט(ג+ט(ג+ה+כ+ס+ך+י+(ן="\\160")+כ+"(א)."+נ+כ+ן+"\\154"+י+ך+כ+ "(/"+(ל=".{5}(.)")+ל+ל+"/\\147,'\\\\\\\\$1$2$3')"+ה)())()+ה)())() Theseus - A Maze Generator and Solver
S="\40\n";M="map";i=991;for(z = [ ] ; i ; )z[--i]=i%30? 8 : S [ 1 ] ; F=d=> [30,1,-30 , - 1 ] [ M ] ( ( f,g,h )=>S[0]<z [ f = d + 2 * h[3&g+i]]&&(z[f]=z[(d + f ) / 2 ] = S [ 0],i--,F( f ) ) ) , F(32);z+=S[1]//aem1k.com/maze Polyglot - CSS = JS = HTML
/** CSS **/ html * { color: red } /** JS **/ var html, red; document.write('<'+'link href="#" rel="stylesheet">'); /** HTML **/ // <script src="#"> Tweetris - Play Binary Tetris
function(a,b,c,d){d+ =c;return[d<0|a&b<<d // .##.. ?a=parseInt((a|b<<c) // ..... .toString(d=32,b=new // ..... Date&2|1).replace('v // .##.. ',''),d):a|b<<d,a,b, // ###.# d]} // tweetris // .#### 0|a&b< ffconf - 2015 Animated Starfield
<body text=#EE3 bgcolor=000 id=p style="perspective:4.0em;display: inline-block;padding:15%"><script> I=1/7;e =' I+=I<\ 30?I/30: 1, p.inn\ erHTML="< pr e>"+B\ .replace( /\\S/g, function(a\ ,b){retur n\40z=I *(1+b*b/50\ 0%2)%130, "<tt\\4 0style=dis\ play:i nline-\ block; transf\ orm:trans late3d( 0,0,"+(z+b\ /17-50)+" px)>.</ tt>"})';$$= /\s\s+/g; N=0;S=" ";!!+[];e=e .replace( $$,""); setInterval (e,30);B= (S)+(p) .outerHTML .replace(/y.*"/,12);B=S[0]+B.substr (0,36)+"\n"+B;'a-quine-by-@aemkei\ aem1k.com/ffconf'</script>-ffconf Symmetry - Symmetric JavaScript
{(.0-{}-0.)} xXXx =wYYw= ([]+!!+[]) [0.**.0] +[([])]+ (''+!!+'') [0-~+!!+~-0] +([]+[]+[])+ (8+{}+8) [0|8.**.8|0] +([]||[])+ (""+(0==0)+"") [0.**.0] +[]+''+[]+ (0+{}+0) [8-!!-8] +(''||'')+ ("("+[]+")") [0+~~+0] +""+''+""+ (["xXXx"]) [0+~~+0] +([""])+ (')YY(') [""+~~+""] //-!!-\\ Pac-Man - Play in < 512 Bytes
############# // <pre id=p><script>l="";for(i in L=[a=8191,b= # # .# // 4161,c=5981,d=5125,5493,5397,5589,d,c,b,a])l # ### # ###.# // +=L[i].toString(2).replace(/1/g,4).replace(/ # # X .#.# // 0/g,2)+3;l=l.split(""),w=14,x=76,X=48,e=d=k= # # # ###.#.# // D=!setInterval(onkeydown=function(a){if(a)k= # # # o #.#.# // a.which;else if(!e){for(l[x]=0,l[x+=d=k-37>> # # ### #.#.# // 2||4&l[x+(o=k%2?k-38:(k-39)*w)]?4&l[x+d]?0:d # # ......#.# // :o],e|=8&l[x],l[x]=1,l[X]&=7,h=D%4,h=h%2?h-2 # ### #.###.# // :(h-1)*w,4&l[X+h]?D++:e|=1&l[X+=h],l[X]|=8,h #.....#.....# // =i=0;153>i;)h+=" o.\n# x"[8&l[++i]||l[i]]; ############# // p.innerHTML=h}},250) try { to } catch ( me ){ if (` you `) can :'\ ! '} Selected Talks Photo MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNdyssoooyNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy/..` ``` ``..--/+/+yydNMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMNy- ` `....+mMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMNs.` `` `...`/hNMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMN+` `-dMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMN: ` ``-dMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMN- ` ``.:/dMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMdo` `.-/-hMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMNo` .:/:/.:hMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMN/ `.../sms.:o NMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMo` ``..-//:yNMMm::s hMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMy. ``..---.``.::///++oyNMMMMM+:so MMMMMMMMMMMMMM MMMMMMMMMMMMMMMN- ``..---::::/+ooosydmNMMMMMMN+//+ NMMMMMMMMMMMMM MMMMMMMMMMMMMMMMy- `....---:://+oyhdmNNNNMMMMMMmy/-+ NMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMmo `....----::/++ohmmNNNNMMMMMMMMN/./ mMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMN/ `.....``````..-::/osyhddhhddddmNd.. +NMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMy` `.--...```````` ``-:/+++/:.``./hs` oNMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMNo+:.` .---..``` `.`````.:+o:.` `:+mN NMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMm:` ```----...``````:-``.``-+mN+..``:NNMM MMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMmh-..`..`-::--........---....-oNMNdyyhmMMM MMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMho:. `-..``-:----..--::::::-...-+NMMMMMMMMMM MMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMNo. ` `.-------:://///:-....-/hMMMMMMMMMh `oMMMMMMMMMMMMMMMM MMMMMMMMMMMMN- .-:------:::::--.`..--/sMMMh+yNMMh sMMMMMMMMMMMMMMM MMMMMMMMMMMMo `.-----..........`````.-+dNm+-/dN- +MMMMMMMMMMMMMMM MMMMMMMMMMMM. `.--...````````````````.oNMMo:.o/ +MMMMMMMMMMMMMMM MMMMMMMMMMMM/ `....````` ````.-:/+hmmy-:/y oMMMMMMMMMMMMMMM MMMMMMMMMMMMs ``..````````` ```.-+shyydh. dMMMMMMMMMMMMMMM MMMMMMMMMMMMy ``````````..``````--:/yMMNmh. /mMMMMMMMMMMMMMM MMMMMMMMMMMMs `````` ``````````.-oNNh+. .+oyhhmMMMMMMMM MMMMMMMMMMMM. ` ````````....-:ohmNd/` `-:+sh MMMMMMMMMMMs `...--/ydy: MMMMMMMMmdy- `.-. MMMNy+-. ms: ``` Contact # # ## # # ## # # ## # # # # # # # # ## # # # # # # # # # # # # 20XX - Martin Kleppe Ubilabs