{"id":1218,"date":"2026-03-17T20:52:58","date_gmt":"2026-03-17T20:52:58","guid":{"rendered":"https:\/\/cortexorigin.com\/?p=1218"},"modified":"2026-03-18T08:14:41","modified_gmt":"2026-03-18T08:14:41","slug":"1218","status":"publish","type":"post","link":"https:\/\/cortexorigin.com\/index.php\/2026\/03\/17\/1218\/","title":{"rendered":"x"},"content":{"rendered":"\n\n<style>\n  html, body {\n    width: 100%;\n    max-width: 100%;\n    overflow-x: hidden;\n  }\n<\/style><!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n<title>CMS CORTEX MORPHIC SHIELD\u2122<\/title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{background:#030d14;color:#00e5ff;font-family:'Courier New',monospace;font-size:12px}\n.header{background:#000;border-bottom:1px solid #0a3040;padding:6px 14px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n.hbadge{border:1px solid #00e5ff;color:#00e5ff;padding:2px 7px;font-size:9px;letter-spacing:1px}\n.ctrl{padding:7px 14px;background:#040f1a;border-bottom:1px solid #0a2030;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.cl{color:#00e5ff;font-size:9px;letter-spacing:1px;opacity:.6;margin-right:2px}\n.bm{background:transparent;border:1px solid #00e5ff;color:#00e5ff;padding:4px 10px;font-family:inherit;font-size:9px;letter-spacing:1px;cursor:pointer;transition:all .2s}\n.bm:hover,.bm.on{background:#00e5ff;color:#000}\n.ba{background:transparent;border:1px solid #ff3d00;color:#ff6d00;padding:4px 10px;font-family:inherit;font-size:9px;letter-spacing:1px;cursor:pointer;transition:all .2s}\n.ba:hover,.ba.on{background:#ff3d00;color:#000}\n.bc{background:transparent;border:1px solid #26a69a;color:#26a69a;padding:4px 12px;font-family:inherit;font-size:9px;cursor:pointer;transition:all .2s}\n.bc:hover{background:#26a69a;color:#000}\n.bc.stop{border-color:#f44336;color:#f44336}.bc.stop:hover{background:#f44336}\n.div{width:1px;height:18px;background:#0a2030;margin:0 6px}\n.pgrp{display:flex;align-items:center;gap:6px}\n.pl{color:#00e5ff;font-size:9px;opacity:.5}\n.pv{color:#00e5ff;font-size:10px;font-weight:bold;min-width:28px}\ninput[type=range]{-webkit-appearance:none;height:3px;background:#0a3040;width:70px}\ninput[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:11px;height:11px;background:#00e5ff;border-radius:50%;cursor:pointer}\n.tp{padding:2px 8px;font-size:9px;letter-spacing:2px;border-radius:2px;font-weight:bold}\n.tl{background:#1a3020;color:#4caf50;border:1px solid #4caf50}\n.tm{background:#2a2010;color:#ff9800;border:1px solid #ff9800}\n.th{background:#2a1010;color:#f44336;border:1px solid #f44336}\n.tc{background:#f44336;color:#000;animation:blink .5s infinite}\n@keyframes blink{0%,100%{opacity:1}50%{opacity:.4}}\n\/* Layer bar *\/\n.lbar{background:#040f1a;border-bottom:1px solid #0a2030;padding:6px 14px;display:flex;gap:5px;flex-wrap:wrap;align-items:flex-start}\n.lcard{background:#040f1a;border:1px solid #0a3040;padding:5px 7px;cursor:pointer;display:flex;gap:5px;min-width:150px;transition:border-color .2s}\n.lcard:hover{border-color:#00e5ff}\n.lbadge{min-width:26px;height:26px;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:bold;color:#fff;border-radius:2px}\n.lname{color:#00e5ff;font-size:9px;letter-spacing:1px;font-weight:bold}\n.ldesc{color:#888;font-size:8px;margin-top:1px;line-height:1.3}\n.lstat{color:#4caf50;font-size:8px;margin-top:2px;font-weight:bold}\n\/* Net area *\/\n.netarea{position:relative;width:100%;height:480px;background:#030d14;overflow:hidden}\n#netSvg{width:100%;height:100%}\n\/* Info overlays *\/\n.ov-tl{position:absolute;top:8px;left:8px;background:rgba(0,0,0,.85);border:1px solid #0a3040;padding:5px 9px}\n.ov-tr{position:absolute;top:8px;right:8px;background:rgba(0,0,0,.85);border:1px solid #26a69a;padding:5px 10px;text-align:center}\n.ov-bl{position:absolute;bottom:8px;left:8px;background:rgba(0,0,0,.85);border:1px solid #0a3040;padding:5px 9px;font-size:9px}\n.ov-br{position:absolute;bottom:8px;right:8px;background:rgba(0,0,0,.85);border:1px solid #0a3040;padding:5px 9px;font-size:9px;cursor:pointer}\n.ovr{display:flex;justify-content:space-between;gap:18px;margin:2px 0;font-size:9px}\n.ovl{opacity:.5}.ovc{color:#00e5ff;font-weight:bold}\n.cembar-wrap{width:160px}\n.cembar-track{height:3px;background:#0a2030;margin-top:3px}\n.cembar-fill{height:100%;background:linear-gradient(90deg,#00e5ff,#ffc107);transition:width .8s}\n\/* Panels row *\/\n.row2{display:grid;grid-template-columns:1fr 1fr 1fr;border-top:1px solid #0a2030;height:150px}\n.rpanel{border-right:1px solid #0a2030;overflow:hidden;display:flex;flex-direction:column}\n.rpanel:last-child{border-right:none}\n.ph{background:#04111c;border-bottom:1px solid #0a2030;padding:4px 10px;display:flex;justify-content:space-between}\n.pt{font-size:9px;letter-spacing:2px;color:#00e5ff;opacity:.6}\n\/* Traffic SVG *\/\n#trafficSvg{width:100%;flex:1}\n\/* Agent boxes *\/\n.agrid{display:grid;grid-template-columns:repeat(3,1fr);gap:3px;padding:5px}\n.abox{background:#030d14;border:1px solid #0a2030;padding:3px;text-align:center;transition:all .3s}\n.abox.v{border-color:#ffc107}.abox.d{border-color:#4caf50}\n.al{color:#00e5ff;font-size:8px;opacity:.7}.at{color:#555;font-size:7px}\n.aa{color:#ffc107;font-size:9px;font-weight:bold;margin:2px 0}.ac{color:#4caf50;font-size:7px}\n.l10dec{font-size:9px;border-top:1px solid #0a2030;margin-top:2px;padding:3px 5px}\n\/* Rotation history *\/\n#rotHistory{font-size:9px;overflow-y:auto;height:115px;padding:4px 8px}\n.rentry{border-bottom:1px solid #04111c;padding:2px 0;display:grid;grid-template-columns:50px 1fr 55px;gap:3px}\n\/* CBMC + Log *\/\n.row3{display:grid;grid-template-columns:1fr 1fr;border-top:1px solid #0a2030;height:200px}\n.cbmc-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:2px;padding:6px}\n.cc{background:#0a2030;border:1px solid #0a3040;padding:2px;text-align:center;font-size:7px;cursor:pointer;transition:all .3s;color:#4caf50}\n.cc.pass{border-color:#4caf50}.cc.act{background:#4caf50;color:#000}\n.cc.run{background:#ff9800;color:#000;animation:pulse .4s infinite}\n@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}\n.logc{flex:1;overflow-y:auto;padding:5px;font-size:9px}\n.le{border-bottom:1px solid #04111c;padding:2px 0;display:grid;grid-template-columns:52px 52px 1fr;gap:3px}\n.lt{color:#00e5ff;opacity:.5}.lk{padding:1px 3px;text-align:center;font-size:8px;font-weight:bold}\n.lmorph{background:#003040;color:#00e5ff}.ldet{background:#2a1000;color:#ff6d00}\n.liso{background:#300a0a;color:#f44336}.lok{background:#0a2010;color:#4caf50}\n.lm{color:#aaa}\n\/* Stats bottom *\/\n.row4{display:grid;grid-template-columns:220px 240px 1fr 1fr;border-top:1px solid #0a2030;height:190px}\n.bsec{border-right:1px solid #0a2030;padding:6px 10px;overflow:hidden}\n.bsec:last-child{border-right:none}\n.sr{display:flex;justify-content:space-between;padding:3px 0;border-bottom:1px solid #04111c;font-size:9px}\n.slb{color:#00e5ff;opacity:.5;letter-spacing:1px}.sv{font-weight:bold}\n.vok{color:#4caf50}.vw{color:#ff9800}.vc{color:#f44336}.vb{color:#00e5ff}.vg{color:#ffc107}\n.sbar{margin:3px 0}.sbl{display:flex;justify-content:space-between;font-size:9px;margin-bottom:1px}\n.sbt{height:3px;background:#0a2030}.sbf{height:100%;transition:width .5s}\n<\/style>\n<\/head>\n<body>\n \n<!-- Header -->\n<div class=\"header\">\n  <span style=\"color:#00e5ff;font-size:10px;letter-spacing:2px;opacity:.7\">\/\/ CMS CORTEX MORPHIC SHIELD\u2122<\/span>\n  <span class=\"hbadge\">EVAL-016 V5.2<\/span><span class=\"hbadge\">MTD<\/span>\n  <span class=\"hbadge\">FISHER-YATES<\/span><span class=\"hbadge\">CBMC 60\/60<\/span><span class=\"hbadge\">~125 Mds+<\/span>\n<\/div>\n \n<!-- Morph controls -->\n<div class=\"ctrl\">\n  <span class=\"cl\">\/\/ MORPHING<\/span>\n  <button class=\"bm on\" onclick=\"setMorph('auto',this)\">AUTO-MORPHING<\/button>\n  <button class=\"bm\" onclick=\"setMorph('rfc',this)\">ROTATION IP (RFC 6598)<\/button>\n  <button class=\"bm\" onclick=\"setMorph('remap',this)\">REMAP PORTS<\/button>\n  <button class=\"bm\" onclick=\"setMorph('topo',this)\">TOPO SHUFFLE<\/button>\n  <button class=\"bm\" onclick=\"setMorph('full',this)\">FULL SURFACE MORPH<\/button>\n  <div class=\"div\"><\/div>\n  <span class=\"cl\">\/\/ ATTAQUES<\/span>\n  <button class=\"ba\" id=\"ba-scan\" onclick=\"atk('scan',this)\">\u2197 PORT SCAN<\/button>\n  <button class=\"ba\" id=\"ba-brute\" onclick=\"atk('brute',this)\">\u2197 BRUTEFORCE<\/button>\n  <button class=\"ba\" id=\"ba-recon\" onclick=\"atk('recon',this)\">\u2197 RECONNAISSANCE<\/button>\n  <button class=\"ba\" id=\"ba-ddos\" onclick=\"atk('ddos',this)\">\u2197 DDoS FLOOD<\/button>\n  <button class=\"ba\" id=\"ba-apt\" onclick=\"atk('apt',this)\">\u2197 APT INFILTRATION<\/button>\n  <button class=\"ba\" id=\"ba-zero\" onclick=\"atk('zero',this)\">\u2197 ZERO-DAY<\/button>\n  <div class=\"div\"><\/div>\n  <button class=\"ba\" id=\"ba-full\" onclick=\"fullSim()\" style=\"border-color:#ffc107;color:#ffc107;font-weight:bold\">\u26a1 SIMULATION AI+HUMAIN<\/button>\n<\/div>\n \n<!-- Params -->\n<div class=\"ctrl\" style=\"padding-top:5px;padding-bottom:5px\">\n  <span class=\"cl\">\/\/ PARAMS<\/span>\n  <div class=\"pgrp\"><span class=\"pl\">Morph rate<\/span><input type=\"range\" min=\"5\" max=\"60\" value=\"20\" id=\"mr\" oninput=\"S.morphRate=+this.value;document.getElementById('mrv').textContent=this.value+'s'\"><span class=\"pv\" id=\"mrv\">20s<\/span><\/div>\n  <div class=\"pgrp\" style=\"margin-left:10px\"><span class=\"pl\">Nodes<\/span><input type=\"range\" min=\"8\" max=\"60\" value=\"40\" id=\"nc\" oninput=\"S.nodeCount=+this.value;document.getElementById('ncv').textContent=this.value;initNodes()\"><span class=\"pv\" id=\"ncv\">40<\/span><\/div>\n  <div class=\"pgrp\" style=\"margin-left:10px\"><span class=\"pl\">Threat<\/span><span class=\"tp tc\" id=\"thr\">CRIT<\/span><\/div>\n  <div class=\"div\"><\/div>\n  <button class=\"bc\" onclick=\"startSim()\">\u25b6 START<\/button>\n  <button class=\"bc stop\" onclick=\"S.running=false\">\u23f8 PAUSE<\/button>\n  <button class=\"bc\" style=\"border-color:#555;color:#555\" onclick=\"resetSim()\">\u21ba RESET<\/button>\n<\/div>\n \n<!-- Layer bar -->\n<div class=\"lbar\">\n  <span class=\"cl\" style=\"padding-top:5px\">\/\/ COUCHES<\/span>\n  <div class=\"lcard\" onclick=\"clickLayer('l4',this)\"><div class=\"lbadge\" style=\"background:#1565c0\">L4<\/div><div><div class=\"lname\">Byzantine Consensus<\/div><div class=\"ldesc\">PBFT N=4 \u00b7 anti-replay \u00b7 HKDF<\/div><div class=\"lstat\">EAL6 \u00b7 99%<\/div><\/div><\/div>\n  <div class=\"lcard\" onclick=\"clickLayer('l5',this)\"><div class=\"lbadge\" style=\"background:#1b5e20\">L5<\/div><div><div class=\"lname\">HON Adaptatif<\/div><div class=\"ldesc\">DomainDRBG \u00b7 HKDF poison<\/div><div class=\"lstat\">EAL6 \u00b7 99%<\/div><\/div><\/div>\n  <div class=\"lcard\" onclick=\"clickLayer('l6',this)\"><div class=\"lbadge\" style=\"background:#6a1b9a\">L6<\/div><div><div class=\"lname\">Memory Guard<\/div><div class=\"ldesc\">Canaris head\/mid\/tail \u00b7 fail-closed<\/div><div class=\"lstat\">EAL5+ \u00b7 97%<\/div><\/div><\/div>\n  <div class=\"lcard\" onclick=\"clickLayer('l7',this)\"><div class=\"lbadge\" style=\"background:#0d47a1\">L7<\/div><div><div class=\"lname\">ZK Topology v8<\/div><div class=\"ldesc\">HKDF 96B \u00b7 chain_state 16B<\/div><div class=\"lstat\" id=\"l7stat\">morph 1.000<\/div><\/div><\/div>\n  <div class=\"lcard\" onclick=\"clickLayer('l8',this)\"><div class=\"lbadge\" style=\"background:#e65100\">L8<\/div><div><div class=\"lname\">Adversarial ML<\/div><div class=\"ldesc\">noise 0.55 \u00b7 degradation 0.967<\/div><div class=\"lstat\">EAL5+ \u00b7 95%<\/div><\/div><\/div>\n  <div class=\"lcard\" onclick=\"clickLayer('l9',this)\"><div class=\"lbadge\" style=\"background:#006064\">L9<\/div><div><div class=\"lname\">Temporal Morphism<\/div><div class=\"ldesc\">HMAC-DRBG \u00d7 3 \u00b7 jitter [500\u00b5s,8ms]<\/div><div class=\"lstat\" id=\"l9stat\">pred 0.194<\/div><\/div><\/div>\n  <div class=\"lcard\" style=\"border-color:#ffc10766\" onclick=\"clickLayer('l10',this)\"><div class=\"lbadge\" style=\"background:#f57f17\">L10<\/div><div><div class=\"lname\">Orchestrateur Cognitif<\/div><div class=\"ldesc\">argmax DRBG \u00b7 4 mod\u00e8les \u00b7 bypass 0<\/div><div class=\"lstat\" style=\"color:#ffc107\">EAL7 cand \u00b7 100%<\/div><\/div><\/div>\n<\/div>\n \n<!-- SVG Network -->\n<div class=\"netarea\">\n  <svg id=\"netSvg\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n    <defs>\n      <pattern id=\"grid\" width=\"40\" height=\"40\" patternUnits=\"userSpaceOnUse\">\n        <path d=\"M 40 0 L 0 0 0 40\" fill=\"none\" stroke=\"#0a2030\" stroke-width=\"0.4\" opacity=\"0.5\"\/>\n      <\/pattern>\n    <\/defs>\n    <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\"\/>\n    <g id=\"edges\"><\/g>\n    <g id=\"packets\"><\/g>\n    <g id=\"effects\"><\/g>\n    <g id=\"nodes-g\"><\/g>\n    <g id=\"labels\"><\/g>\n    <g id=\"tooltips\"><\/g>\n  <\/svg>\n  <!-- Overlays -->\n  <div class=\"ov-tl\">\n    <div style=\"color:#00e5ff;font-size:9px;opacity:.5;letter-spacing:1px;margin-bottom:3px\">SCORE CEM BRUT<\/div>\n    <div class=\"cembar-wrap\">\n      <div style=\"display:flex;justify-content:space-between;font-size:9px\"><span id=\"cem-v\" style=\"color:#ffc107;font-weight:bold\">66\/57<\/span><span style=\"color:#4caf50;font-size:8px\">marge +35<\/span><\/div>\n      <div class=\"cembar-track\"><div class=\"cembar-fill\" id=\"cem-bar\" style=\"width:66%\"><\/div><\/div>\n      <div style=\"display:flex;justify-content:space-between;font-size:7px;color:#333;margin-top:1px\"><span>0<\/span><span style=\"color:#4caf50\">31\u2713<\/span><span>57<\/span><span>79<\/span><\/div>\n    <\/div>\n  <\/div>\n  <div class=\"ov-tr\" id=\"eal-badge\">\n    <div style=\"color:#26a69a;font-size:8px;letter-spacing:2px\">NIVEAU<\/div>\n    <div id=\"eal-lv\" style=\"color:#ffc107;font-size:15px;font-weight:bold;letter-spacing:2px\">EAL6+<\/div>\n    <div id=\"eal-sc\" style=\"color:#4caf50;font-size:9px\">57\/57 CEM<\/div>\n  <\/div>\n  <div class=\"ov-bl\">\n    <div class=\"ovr\"><span class=\"ovl\">HOT PATH<\/span><span class=\"ovc\">2.97 ns<\/span><\/div>\n    <div class=\"ovr\"><span class=\"ovl\">MTTD LIVE<\/span><span class=\"ovc\" id=\"ov-mttd\">\u2014 ns<\/span><\/div>\n    <div class=\"ovr\"><span class=\"ovl\">ROTATIONS<\/span><span class=\"ovc\" id=\"ov-rots\">0<\/span><\/div>\n    <div class=\"ovr\"><span class=\"ovl\">MORPH DANS<\/span><span class=\"ovc\" id=\"ov-cd\">\u2014s<\/span><\/div>\n    <div class=\"ovr\"><span class=\"ovl\">COMMIT L7<\/span><span class=\"ovc\" id=\"ov-hash\" style=\"font-size:8px\">\u2014<\/span><\/div>\n  <\/div>\n  <div class=\"ov-br\" onclick=\"cycleLegend()\">\n    <div style=\"color:#00e5ff;opacity:.5;font-size:8px;letter-spacing:1px;margin-bottom:3px\">\/\/ L\u00c9GENDE (cliquer)<\/div>\n    <div style=\"color:#ff9800;font-size:9px\">\u2b24 CORE \u2014 Noyau TCB (PRISM)<\/div>\n    <div style=\"color:#26a69a;font-size:9px\">\u2b24 GW \u2014 Gateway consensus<\/div>\n    <div style=\"color:#00e5ff;font-size:9px\">\u2b24 EP \u2014 Endpoint morphique<\/div>\n    <div style=\"color:#ff6d00;font-size:9px\">\u2b24 oHON \u2014 Honeypot leurre<\/div>\n  <\/div>\n<\/div>\n \n<!-- Traffic + Agent vote + Rotation history -->\n<div class=\"row2\">\n  <div class=\"rpanel\">\n    <div class=\"ph\"><span class=\"pt\">\/\/ TRAFIC PAQUETS\/S<\/span><span class=\"vb\" id=\"pps-v\">0 p\/s<\/span><\/div>\n    <svg id=\"trafficSvg\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><polyline id=\"traf-line\" fill=\"none\" stroke=\"#00e5ff\" stroke-width=\"1.5\"\/><polygon id=\"traf-fill\" fill=\"#00e5ff\" fill-opacity=\"0.06\" stroke=\"none\"\/><\/svg>\n  <\/div>\n  <div class=\"rpanel\">\n    <div class=\"ph\"><span class=\"pt\">\/\/ L10 MULTI-AGENT VOTE<\/span><span class=\"vg\">DIV 1.000<\/span><\/div>\n    <div class=\"agrid\">\n      <div class=\"abox\" id=\"ag-a\"><div class=\"al\">ENGINE A<\/div><div class=\"at\">seuil:20<\/div><div class=\"aa\" id=\"aa-act\">\u2014<\/div><div class=\"ac\" id=\"aa-conf\">\u2014<\/div><\/div>\n      <div class=\"abox\" id=\"ag-b\"><div class=\"al\">ENGINE B<\/div><div class=\"at\">seuil:30<\/div><div class=\"aa\" id=\"ab-act\">\u2014<\/div><div class=\"ac\" id=\"ab-conf\">\u2014<\/div><\/div>\n      <div class=\"abox\" id=\"ag-c\"><div class=\"al\">ENGINE C<\/div><div class=\"at\">seuil:45<\/div><div class=\"aa\" id=\"ac-act\">\u2014<\/div><div class=\"ac\" id=\"ac-conf\">\u2014<\/div><\/div>\n    <\/div>\n    <div class=\"l10dec\"><span style=\"color:#00e5ff;opacity:.5\">DECISION<\/span><span id=\"l10-dec\" style=\"color:#ffc107;font-weight:bold;margin-left:8px\">NONE<\/span><span id=\"l10-ent\" style=\"color:#4caf50;margin-left:10px\">H=\u2014<\/span><\/div>\n  <\/div>\n  <div class=\"rpanel\">\n    <div class=\"ph\"><span class=\"pt\">\/\/ HISTORIQUE ROTATIONS<\/span><span class=\"vg\" id=\"rot-cnt\">0<\/span><\/div>\n    <div id=\"rotHistory\"><\/div>\n  <\/div>\n<\/div>\n \n<!-- CBMC + Log -->\n<div class=\"row3\">\n  <div class=\"rpanel\">\n    <div class=\"ph\"><span class=\"pt\">\/\/ CBMC P01-P60 \u2014 60\/60 PASS<\/span><span class=\"vok\">60\/60<\/span><\/div>\n    <div class=\"cbmc-grid\" id=\"cbmc\"><\/div>\n  <\/div>\n  <div class=\"rpanel\" style=\"border-right:none\">\n    <div class=\"ph\"><span class=\"pt\">\/\/ LOG HMAC CHAIN<\/span><span class=\"vok\">CHAIN OK<\/span><\/div>\n    <div class=\"logc\" id=\"logc\"><\/div>\n  <\/div>\n<\/div>\n \n<!-- Stats -->\n<div class=\"row4\">\n  <div class=\"bsec\">\n    <div class=\"ph\" style=\"margin:-6px -10px 5px\"><span class=\"pt\">\/\/ STATS EXPOSITION<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">TAUX SUCC\u00c8S ATT.<\/span><span class=\"sv vok\">0%<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">THREAT LEVEL<\/span><span class=\"sv vc\" id=\"s-thr\">CRITICAL<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">STRAT\u00c9GIE MTD<\/span><span class=\"sv vw\" id=\"s-str\">LOCKDOWN<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">UPTIME<\/span><span class=\"sv vb\" id=\"s-up\">00:00:00<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">ROTATIONS<\/span><span class=\"sv vg\" id=\"s-rot\">0<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">HOT PATH<\/span><span class=\"sv vb\">2.97 ns<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">FUZZING<\/span><span class=\"sv vb\">~125 Mds+<\/span><\/div>\n  <\/div>\n  <div class=\"bsec\">\n    <div class=\"ph\" style=\"margin:-6px -10px 5px\"><span class=\"pt\">\/\/ SCORE EXPOSITION<\/span><\/div>\n    <div class=\"sbar\"><div class=\"sbl\"><span>PORT SCAN<\/span><span class=\"vb\" id=\"sc-scan\">2%<\/span><\/div><div class=\"sbt\"><div class=\"sbf\" id=\"sb-scan\" style=\"width:2%;background:#00e5ff\"><\/div><\/div><\/div>\n    <div class=\"sbar\"><div class=\"sbl\"><span>BRUTEFORCE<\/span><span class=\"vw\" id=\"sc-brute\">11%<\/span><\/div><div class=\"sbt\"><div class=\"sbf\" id=\"sb-brute\" style=\"width:11%;background:#ff9800\"><\/div><\/div><\/div>\n    <div class=\"sbar\"><div class=\"sbl\"><span>RECON<\/span><span class=\"vok\" id=\"sc-recon\">1%<\/span><\/div><div class=\"sbt\"><div class=\"sbf\" id=\"sb-recon\" style=\"width:1%;background:#4caf50\"><\/div><\/div><\/div>\n    <div class=\"sbar\"><div class=\"sbl\"><span>DDoS<\/span><span class=\"vc\" id=\"sc-ddos\">2%<\/span><\/div><div class=\"sbt\"><div class=\"sbf\" id=\"sb-ddos\" style=\"width:2%;background:#f44336\"><\/div><\/div><\/div>\n    <div class=\"sbar\"><div class=\"sbl\"><span>APT<\/span><span class=\"vb\" id=\"sc-apt\">0%<\/span><\/div><div class=\"sbt\"><div class=\"sbf\" id=\"sb-apt\" style=\"width:0%;background:#9c27b0\"><\/div><\/div><\/div>\n    <div class=\"sbar\"><div class=\"sbl\"><span>ZERO-DAY<\/span><span class=\"vc\" id=\"sc-zero\">0%<\/span><\/div><div class=\"sbt\"><div class=\"sbf\" id=\"sb-zero\" style=\"width:0%;background:#f44336\"><\/div><\/div><\/div>\n    <div style=\"border-top:1px solid #0a2030;margin-top:4px;padding-top:4px\">\n      <div class=\"sr\"><span class=\"slb\">CEM BRUT<\/span><span class=\"sv vg\">66\/57 (+9)<\/span><\/div>\n      <div class=\"sr\"><span class=\"slb\">VUL-009-012<\/span><span class=\"sv vok\">NON EXPLOIT<\/span><\/div>\n    <\/div>\n  <\/div>\n  <div class=\"bsec\">\n    <div class=\"ph\" style=\"margin:-6px -10px 5px\"><span class=\"pt\">\/\/ CBMC ACTIVES<\/span><\/div>\n    <div style=\"display:grid;grid-template-columns:repeat(2,1fr);gap:2px;font-size:8px\">\n      <div style=\"background:#04111c;border:1px solid #0a2030;padding:2px 4px;display:flex;justify-content:space-between\"><span style=\"color:#00e5ff;opacity:.6\">SHA256<\/span><span class=\"vok\">PASS<\/span><\/div>\n      <div style=\"background:#04111c;border:1px solid #0a2030;padding:2px 4px;display:flex;justify-content:space-between\"><span style=\"color:#00e5ff;opacity:.6\">HMAC<\/span><span class=\"vok\">PASS<\/span><\/div>\n      <div style=\"background:#04111c;border:1px solid #0a2030;padding:2px 4px;display:flex;justify-content:space-between\"><span style=\"color:#00e5ff;opacity:.6\">FSM<\/span><span class=\"vok\">PASS<\/span><\/div>\n      <div style=\"background:#04111c;border:1px solid #0a2030;padding:2px 4px;display:flex;justify-content:space-between\"><span style=\"color:#00e5ff;opacity:.6\">CHAIN<\/span><span class=\"vok\">PASS<\/span><\/div>\n      <div style=\"background:#04111c;border:1px solid #0a2030;padding:2px 4px;display:flex;justify-content:space-between\"><span style=\"color:#00e5ff;opacity:.6\">FISHER<\/span><span class=\"vok\">PASS<\/span><\/div>\n      <div style=\"background:#04111c;border:1px solid #0a2030;padding:2px 4px;display:flex;justify-content:space-between\"><span style=\"color:#00e5ff;opacity:.6\">MORPH<\/span><span class=\"vok\">PASS<\/span><\/div>\n    <\/div>\n  <\/div>\n  <div class=\"bsec\">\n    <div class=\"ph\" style=\"margin:-6px -10px 5px\"><span class=\"pt\">\/\/ MORPHIC STATUS<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">MORPH RATE<\/span><span class=\"sv vb\">1.000<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">RECON H1<\/span><span class=\"sv vok\">0.000 BLOQU\u00c9<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">BYPASS RATE<\/span><span class=\"sv vok\">0\/300<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">ENTROPY<\/span><span class=\"sv vb\" id=\"st-ent\">1.92 bits<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">MODEL RESIST.<\/span><span class=\"sv vb\">0.3769<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">DOMINANT<\/span><span class=\"sv vw\">0.479<\/span><\/div>\n    <div class=\"sr\"><span class=\"slb\">AGENT DIV.<\/span><span class=\"sv vg\">1.000<\/span><\/div>\n  <\/div>\n<\/div>\n \n<script>\n\/\/ \u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst S={running:false,rotations:0,start:Date.now(),morphMode:'auto',\n  attacks:new Set(),scores:{scan:2,brute:11,recon:1,ddos:2,apt:0,zero:0},\n  threat:4,nodeCount:40,morphRate:20,cemScore:66,pps:0,lastMorph:Date.now()};\nlet nodes=[],pkts=[],lbels=[],effects=[];\nlet packetId=0,labelId=0,effectId=0;\n \n\/\/ \u2500\u2500 SVG helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst SVG_NS='http:\/\/www.w3.org\/2000\/svg';\nfunction svgEl(tag,attrs){\n  const e=document.createElementNS(SVG_NS,tag);\n  Object.entries(attrs||{}).forEach(([k,v])=>e.setAttribute(k,v));\n  return e;\n}\nconst gEdges=()=>document.getElementById('edges');\nconst gPkts=()=>document.getElementById('packets');\nconst gEffects=()=>document.getElementById('effects');\nconst gNodes=()=>document.getElementById('nodes-g');\nconst gLabels=()=>document.getElementById('labels');\nconst gTips=()=>document.getElementById('tooltips');\nfunction svgW(){const s=document.getElementById('netSvg');return s?s.clientWidth:800;}\nfunction svgH(){const s=document.getElementById('netSvg');return s?s.clientHeight:480;}\n \n\/\/ \u2500\u2500 Rand helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst ri=(a,b)=>Math.floor(Math.random()*(b-a+1))+a;\nconst rf=(a,b)=>Math.random()*(b-a)+a;\nfunction randIP(){return ri(100,172)+'.'+ri(0,255)+'.'+ri(0,255)+'.'+ri(1,254);}\nfunction now(){return new Date().toTimeString().slice(0,8);}\n \n\/\/ \u2500\u2500 SVG Edge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction drawEdge(id,x1,y1,x2,y2,color,opacity,dash){\n  let e=document.getElementById('edge-'+id);\n  if(!e){e=svgEl('line',{id:'edge-'+id});gEdges().appendChild(e);}\n  Object.assign(e,{}); \n  e.setAttribute('x1',x1);e.setAttribute('y1',y1);\n  e.setAttribute('x2',x2);e.setAttribute('y2',y2);\n  e.setAttribute('stroke',color||'#00e5ff');\n  e.setAttribute('stroke-width',0.6);\n  e.setAttribute('stroke-opacity',opacity||0.2);\n  if(dash)e.setAttribute('stroke-dasharray','5,5');\n  else e.removeAttribute('stroke-dasharray');\n}\n \n\/\/ \u2500\u2500 SVG Node \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst NTYPE={\n  CORE:{fill:'#ff6d00',r:22,ring:'#ff9800',label:'CORE'},\n  GW:  {fill:'#26a69a',r:13,ring:'#4db6ac',label:'GW'},\n  EP:  {fill:'#00e5ff',r:6, ring:'#00acc1',label:'EP'},\n  HON: {fill:'#ff6d00',r:10,ring:'#ff8f00',label:'oHON'},\n};\nfunction renderNode(n){\n  const T=NTYPE[n.type];\n  let g=document.getElementById('nd-'+n.id);\n  if(!g){\n    g=svgEl('g',{id:'nd-'+n.id,cursor:'pointer'});\n    \/\/ outer ring\n    if(n.type!=='EP'){\n      const ring=svgEl('circle',{class:'nring',fill:'none',stroke:T.ring,'stroke-width':1.2,'stroke-opacity':0.4});\n      g.appendChild(ring);\n      const ring2=svgEl('circle',{class:'nring2',fill:'none',stroke:T.ring,'stroke-width':0.7,'stroke-opacity':0.2});\n      g.appendChild(ring2);\n    }\n    const c=svgEl('circle',{class:'ncircle',fill:T.fill});\n    g.appendChild(c);\n    if(n.type!=='EP'){\n      const lbl=svgEl('text',{class:'nlbl','text-anchor':'middle','dominant-baseline':'middle',\n        fill:'#fff','font-size':n.type==='CORE'?9:8,'font-family':'Courier New','font-weight':'bold'});\n      lbl.textContent=T.label; g.appendChild(lbl);\n    }\n    \/\/ IP tag for EP\n    if(n.type==='EP'){\n      const ip=svgEl('text',{'text-anchor':'middle',fill:'#00e5ff66','font-size':7,'font-family':'Courier New'});\n      ip.setAttribute('class','nip'); g.appendChild(ip);\n    }\n    gNodes().appendChild(g);\n  }\n  \/\/ Update positions\n  g.setAttribute('transform',`translate(${n.x},${n.y})`);\n  const ring=g.querySelector('.nring');\n  const ring2=g.querySelector('.nring2');\n  if(ring){ring.setAttribute('r',T.r+5);ring2.setAttribute('r',T.r+9);}\n  const c=g.querySelector('.ncircle');\n  c.setAttribute('r',T.r); c.setAttribute('cx',0); c.setAttribute('cy',0);\n  const lbl=g.querySelector('.nlbl');\n  if(lbl){lbl.setAttribute('x',0);lbl.setAttribute('y',0);}\n  const ip=g.querySelector('.nip');\n  if(ip){ip.setAttribute('x',0);ip.setAttribute('y',T.r+8);ip.textContent=n.ip.split('.').slice(0,3).join('.')+'.'+n.ip.split('.')[3];}\n}\n \n\/\/ \u2500\u2500 Init nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction initNodes(){\n  const W=svgW(),H=svgH(),cx=W\/2,cy=H\/2;\n  \/\/ Remove old SVG nodes\n  gNodes().innerHTML=''; gEdges().innerHTML='';\n  nodes=[];\n  nodes.push({type:'CORE',x:cx,y:cy,ip:'100.64.0.1',port:9000,vx:0,vy:0,id:'CORE'});\n  for(let i=0;i<3;i++){\n    const a=(i\/3)*Math.PI*2-Math.PI\/2, r=Math.min(W,H)*0.22;\n    nodes.push({type:'GW',x:cx+Math.cos(a)*r,y:cy+Math.sin(a)*r,ip:randIP(),port:ri(9000,9999),vx:rf(-.15,.15),vy:rf(-.15,.15),id:'GW'+i});\n  }\n  const ep=Math.min(S.nodeCount,40);\n  for(let i=0;i<ep;i++){\n    const a=rf(0,Math.PI*2),r=rf(W*.28,Math.min(W,H)*.44);\n    nodes.push({type:'EP',x:cx+Math.cos(a)*r,y:cy+Math.sin(a)*r,ip:randIP(),port:ri(9000,65000),vx:rf(-.25,.25),vy:rf(-.25,.25),id:'EP'+i});\n  }\n  for(let i=0;i<6;i++){\n    const a=rf(0,Math.PI*2),r=rf(60,160);\n    nodes.push({type:'HON',x:cx+Math.cos(a)*r,y:cy+Math.sin(a)*r,ip:randIP(),port:ri(80,443),vx:rf(-.12,.12),vy:rf(-.12,.12),id:'HON'+i});\n  }\n}\n \n\/\/ \u2500\u2500 CBMC grid \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst CBMC_N=['SHA256','HMAC','FSM','FAIL-CL','RING+','RING-','RFC6598','PORT','LRU','SEG',\n 'CHAIN','LEDGER','ROUTES','FW','NAT','SESSION','ENCRYPT','SCORE','ISO','SCHED',\n 'PRIO','SQO','RISK','CONSIST','MORPH','FISHER','MICROFLX','ZERO','DECOY','QUARANT',\n 'BLOCKED','RECORDS','EXMA','GOV','FORENSIC','LOGSEQ','ROTATE','COLLECT','HEALTH','PACKET',\n 'AUTH','CERT','NONCE','EPOCH','DRIFT','SEAL','AUDIT','VAULT','PROXY','FUZZ',\n 'C51','C52','C53','C54','C55','C56','C57','C58','C59','C60'];\nfunction buildCBMC(){\n  const g=document.getElementById('cbmc'); g.innerHTML='';\n  CBMC_N.forEach((n,i)=>{\n    const d=document.createElement('div');\n    d.className='cc pass'; d.id='cc-'+i;\n    d.textContent='P'+(i+1<10?'0':'')+(i+1); d.title=n;\n    d.onclick=()=>flashCBMC(i,n); g.appendChild(d);\n  });\n}\nfunction flashCBMC(i,n){\n  const e=document.getElementById('cc-'+i);\n  if(!e)return;\n  e.className='cc run'; setTimeout(()=>{e.className='cc act';setTimeout(()=>{e.className='cc pass';},700);},350);\n  addLog(now(),'ok','CBMC P'+(i+1)+' ('+n+') \u2014 invariant v\u00e9rifi\u00e9');\n}\nfunction cbmcAutoFlash(){\n  if(!S.running){setTimeout(cbmcAutoFlash,2000);return;}\n  flashCBMC(ri(0,59),CBMC_N[ri(0,59)]);\n  setTimeout(cbmcAutoFlash,800+Math.random()*2000);\n}\n \n\/\/ \u2500\u2500 Log \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction addLog(t,type,msg){\n  const c=document.getElementById('logc');\n  const types={morph:'lmorph',detect:'ldet',isolate:'liso',ok:'lok'};\n  const lbls={morph:'MORPH',detect:'DETECT',isolate:'ISOLATE',ok:'OK'};\n  const d=document.createElement('div'); d.className='le';\n  d.innerHTML=`<span class=\"lt\">${t}<\/span><span class=\"lk ${types[type]||'lok'}\">${lbls[type]||type.toUpperCase()}<\/span><span class=\"lm\">${msg}<\/span>`;\n  c.insertBefore(d,c.firstChild);\n  while(c.children.length>60)c.removeChild(c.lastChild);\n  \/\/ Audit chain flash: briefly highlight\n  d.style.borderLeft='2px solid #00e5ff';\n  setTimeout(()=>{d.style.borderLeft='';},400);\n}\n \n\/\/ \u2500\u2500 SVG Packet animation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction spawnPkt(sx,sy,tx,ty,color,cb){\n  const id='pkt-'+(packetId++);\n  const c=svgEl('circle',{id,r:3,fill:color,opacity:1});\n  c.setAttribute('cx',sx); c.setAttribute('cy',sy);\n  gPkts().appendChild(c);\n  S.pps++;\n  let prog=0; const speed=0.025+Math.random()*0.02;\n  const tick=()=>{\n    if(!S.running){c.remove();return;}\n    prog=Math.min(1,prog+speed);\n    c.setAttribute('cx',sx+(tx-sx)*prog);\n    c.setAttribute('cy',sy+(ty-sy)*prog);\n    c.setAttribute('opacity',1-prog);\n    if(prog>=1){c.remove();if(cb)cb();}\n    else requestAnimationFrame(tick);\n  };\n  requestAnimationFrame(tick);\n}\nfunction edgePt(){\n  const W=svgW(),H=svgH(),s=ri(0,3);\n  if(s===0)return{x:rf(0,W),y:0};\n  if(s===1)return{x:W,y:rf(0,H)};\n  if(s===2)return{x:rf(0,W),y:H};\n  return{x:0,y:rf(0,H)};\n}\n \n\/\/ \u2500\u2500 SVG Arc flash \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction arcFlash(x,y,color,maxR){\n  const c=svgEl('circle',{cx:x,cy:y,r:10,fill:'none',stroke:color,'stroke-width':1.5,opacity:.7});\n  gEffects().appendChild(c);\n  let r=10; const mR=maxR||100;\n  const t=()=>{\n    r+=3; const op=Math.max(0,(mR-r)\/mR*0.7);\n    c.setAttribute('r',r); c.setAttribute('opacity',op);\n    if(r<mR)requestAnimationFrame(t);else c.remove();\n  };\n  requestAnimationFrame(t);\n}\n \n\/\/ \u2500\u2500 Floating SVG label \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction floatLabel(x,y,text,color){\n  const t=svgEl('text',{x,y,'text-anchor':'middle',fill:color,'font-size':10,\n    'font-family':'Courier New','font-weight':'bold',opacity:.9});\n  t.textContent=text; gLabels().appendChild(t);\n  let vy=-0.8,op=1;\n  const tick=()=>{\n    y+=vy; op=Math.max(0,op-0.018);\n    t.setAttribute('y',y); t.setAttribute('opacity',op);\n    if(op>0)requestAnimationFrame(tick);else t.remove();\n  };\n  requestAnimationFrame(tick);\n}\n \n\/\/ \u2500\u2500 Node tooltip \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst NDESCS={CORE:'Noyau TCB \u2014 PRISM\/OMEGA\/M00',GW:'Gateway \u2014 consensus PBFT L4',\n  EP:'Endpoint morphique \u2014 IP+port rotatifs L7',HON:'Honeypot actif \u2014 leurre+poison L5'};\nfunction showTips(types){\n  gTips().innerHTML='';\n  nodes.filter(n=>types.includes(n.type)).forEach(n=>{\n    const T=NTYPE[n.type];\n    const g=svgEl('g');\n    const bg=svgEl('rect',{x:n.x+14,y:n.y-38,width:145,height:30,fill:'#000',\n      stroke:T.fill,'stroke-width':1,rx:2,opacity:.92});\n    const t1=svgEl('text',{x:n.x+20,y:n.y-24,fill:T.fill,'font-size':10,'font-family':'Courier New','font-weight':'bold'});\n    t1.textContent=n.type+' \u2014 '+NDESCS[n.type].split('\u2014')[0].trim();\n    const t2=svgEl('text',{x:n.x+20,y:n.y-14,fill:'#888','font-size':8,'font-family':'Courier New'});\n    t2.textContent=NDESCS[n.type].split('\u2014').slice(1).join('\u2014').trim();\n    const line=svgEl('line',{x1:n.x,y1:n.y,x2:n.x+14,y2:n.y-23,stroke:T.fill+'88','stroke-width':.5});\n    g.appendChild(bg);g.appendChild(line);g.appendChild(t1);g.appendChild(t2);\n    gTips().appendChild(g);\n  });\n  setTimeout(()=>gTips().innerHTML='',3500);\n}\nlet legendIdx=0;\nconst LEGEND_TYPES=[['CORE'],['GW'],['EP'],['HON'],['CORE','GW','EP','HON']];\nfunction cycleLegend(){showTips(LEGEND_TYPES[legendIdx%LEGEND_TYPES.length]);legendIdx++;}\n \n\/\/ \u2500\u2500 Main animation loop \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nlet lastMorphT=Date.now(),lastLogT=Date.now(),lastPpsT=Date.now();\nlet raf;\nfunction frame(){\n  if(!S.running){return;}\n  const W=svgW(),H=svgH();\n  \/\/ Move nodes\n  nodes.forEach(n=>{\n    if(n.type==='CORE')return;\n    n.x+=n.vx; n.y+=n.vy;\n    if(n.x<10||n.x>W-10)n.vx*=-1;\n    if(n.y<10||n.y>H-10)n.vy*=-1;\n    renderNode(n);\n  });\n  \/\/ Render CORE (static)\n  renderNode(nodes[0]);\n  \/\/ Draw edges\n  const core=nodes[0],gws=nodes.filter(n=>n.type==='GW');\n  gws.forEach((gw,i)=>drawEdge('cg'+i,core.x,core.y,gw.x,gw.y,'#00e5ff',0.25));\n  nodes.filter(n=>n.type==='EP').forEach((ep,i)=>{\n    const near=gws.reduce((a,g)=>Math.hypot(ep.x-g.x,ep.y-g.y)<Math.hypot(ep.x-a.x,ep.y-a.y)?g:a,gws[0]);\n    drawEdge('ep'+i,ep.x,ep.y,near.x,near.y,'#00e5ff',0.1);\n  });\n  nodes.filter(n=>n.type==='HON').forEach((h,i)=>drawEdge('hon'+i,core.x,core.y,h.x,h.y,'#ff6d00',0.2,true));\n  \/\/ Auto packets\n  if(Math.random()<0.04){\n    const eps=nodes.filter(n=>n.type==='EP');\n    if(eps.length&&gws.length){\n      const e=eps[ri(0,eps.length-1)],g=gws[ri(0,gws.length-1)];\n      spawnPkt(e.x,e.y,g.x,g.y,'#00e5ff44');\n    }\n  }\n  \/\/ Attack traffic \u2192 HON\n  const hons=nodes.filter(n=>n.type==='HON');\n  if(S.attacks.has('scan')&&Math.random()<0.2){\n    arcFlash(core.x+rf(-60,60),core.y+rf(-60,60),'#ff6d0033',80);\n    if(hons.length&#038;&#038;Math.random()<0.4){\n      const p=edgePt(),h=hons[ri(0,hons.length-1)];\n      spawnPkt(p.x,p.y,h.x,h.y,'#f44336',()=>{\n        floatLabel(h.x,h.y-20,'TRAPPED','#ff9800');\n        spawnPkt(h.x,h.y,p.x,p.y,'#4caf50');\n      });\n    }\n  }\n  if(S.attacks.has('ddos')&&Math.random()<0.35&#038;&#038;hons.length){\n    const p=edgePt(),h=hons[ri(0,hons.length-1)];\n    spawnPkt(p.x,p.y,h.x,h.y,'#f44336',()=>{\n      floatLabel(h.x,h.y-20,'CAPTURED','#ff9800');\n      spawnPkt(h.x,h.y,p.x,p.y,'#4caf50');\n    });\n  }\n  if(S.attacks.has('brute')&&Math.random()<0.15&#038;&#038;hons.length){\n    const p=edgePt(),h=hons[ri(0,hons.length-1)];\n    spawnPkt(p.x,p.y,h.x,h.y,'#ff9800',()=>{\n      floatLabel(h.x,h.y-20,'TRAPPED','#ff6d00');\n      spawnPkt(h.x,h.y,p.x,p.y,'#4caf50');\n    });\n  }\n  \/\/ Uptime\n  const up=Math.floor((Date.now()-S.start)\/1000);\n  document.getElementById('s-up').textContent=[Math.floor(up\/3600),Math.floor((up%3600)\/60),up%60].map(v=>String(v).padStart(2,'0')).join(':');\n  \/\/ Countdown\n  const cd=Math.max(0,S.morphRate-(Date.now()-lastMorphT)\/1000);\n  document.getElementById('ov-cd').textContent=cd.toFixed(0)+'s';\n  \/\/ PPS\n  const now2=Date.now();\n  if(now2-lastPpsT>=1000){\n    document.getElementById('pps-v').textContent=S.pps+' p\/s';\n    updateTrafficGraph(S.pps); S.pps=0; lastPpsT=now2;\n  }\n  \/\/ Auto morph\n  if(S.morphMode==='auto'&&Date.now()-lastMorphT>S.morphRate*1000){\n    doMorph(); lastMorphT=Date.now();\n  }\n  \/\/ Random log\n  if(Date.now()-lastLogT>3500+Math.random()*4000){\n    lastLogT=Date.now();\n    const msgs=[['ok','HMAC chain \u2014 int\u00e9grit\u00e9 OK'],['morph','n\u0153ud EP IP rotated \u2014 nouveau masque HKDF'],\n      ['ok','CBMC P'+ri(1,60)+' \u2014 invariant v\u00e9rifi\u00e9'],['morph','chain_state mis \u00e0 jour \u2014 epoch '+ri(1000,9999)]];\n    const [t,m]=msgs[ri(0,msgs.length-1)]; addLog(now(),t,m);\n  }\n  \/\/ Entropy flicker\n  document.getElementById('st-ent').textContent=(1.7+Math.random()*0.45).toFixed(2)+' bits';\n  \/\/ L7 stat\n  document.getElementById('l7stat').textContent='morph '+(0.995+Math.random()*0.005).toFixed(3);\n  \/\/ L9 stat\n  document.getElementById('l9stat').textContent='pred '+(0.17+Math.random()*0.06).toFixed(3);\n  raf=requestAnimationFrame(frame);\n}\n \n\/\/ \u2500\u2500 Traffic graph \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nlet trafData=new Array(50).fill(0);\nfunction updateTrafficGraph(v){\n  trafData.push(v); if(trafData.length>50)trafData.shift();\n  const svg=document.getElementById('trafficSvg');\n  if(!svg)return;\n  const W=svg.clientWidth,H=svg.clientHeight||120;\n  const max=Math.max(...trafData,1);\n  const pts=trafData.map((d,i)=>`${(i\/49)*W},${H-(d\/max)*H*0.85}`).join(' ');\n  const fill=trafData.map((d,i)=>`${(i\/49)*W},${H-(d\/max)*H*0.85}`).join(' ')+` ${W},${H} 0,${H}`;\n  document.getElementById('traf-line').setAttribute('points',pts);\n  document.getElementById('traf-fill').setAttribute('points',fill);\n}\n \n\/\/ \u2500\u2500 Agent vote \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst ACTS=['ROTATE_TOPO','VARY_L9_JIT','ACTIVATE_L5','VARY_L8_NOI','INC_DECEP','NONE'];\nfunction updateAgents(){\n  if(!S.running)return;\n  const ha=S.attacks.size>0;\n  const ids=['a','b','c'];\n  const picks=ids.map(id=>{\n    const act=ha?ACTS[ri(0,ACTS.length-2)]:ACTS[ACTS.length-1];\n    const conf=ha?ri(55,94):ri(10,30);\n    document.getElementById('ag-'+id).className='abox '+(ha?'v':'');\n    document.getElementById('a'+id+'-act').textContent=act.replace('_',' ');\n    document.getElementById('a'+id+'-conf').textContent='conf:'+conf+'%';\n    return{act,conf,id};\n  });\n  const best=picks.reduce((a,b)=>a.conf>b.conf?a:b);\n  document.getElementById('l10-dec').textContent=best.act.replace('_',' ');\n  document.getElementById('l10-ent').textContent='H='+(1.2+Math.random()*0.8).toFixed(2)+'b';\n  const w=document.getElementById('ag-'+best.id);\n  if(w){w.className='abox d';setTimeout(()=>w.className='abox',700);}\n  setTimeout(updateAgents,1500+Math.random()*1500);\n}\n \n\/\/ \u2500\u2500 Rotation history \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction addRotEntry(ip,port){\n  const h=document.getElementById('rotHistory');\n  const d=document.createElement('div'); d.className='rentry';\n  d.innerHTML=`<span style=\"color:#00e5ff;opacity:.5\">${now()}<\/span><span style=\"color:#00e5ff\">${ip}<\/span><span style=\"color:#ffc107\">:${port}<\/span>`;\n  h.insertBefore(d,h.firstChild);\n  while(h.children.length>20)h.removeChild(h.lastChild);\n  document.getElementById('rot-cnt').textContent=S.rotations;\n}\n \n\/\/ \u2500\u2500 Morph \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction doMorph(){\n  nodes.filter(n=>n.type==='EP').forEach(n=>{n.ip=randIP();n.port=ri(9000,65000);});\n  const eps=nodes.filter(n=>n.type==='EP');\n  eps.slice(0,3).forEach(n=>addRotEntry(n.ip,n.port));\n  S.rotations++;\n  document.getElementById('ov-rots').textContent=S.rotations;\n  document.getElementById('s-rot').textContent=S.rotations;\n  \/\/ L7 hash\n  const h='0123456789abcdef';\n  const hash=Array.from({length:16},()=>h[ri(0,15)]).join('');\n  document.getElementById('ov-hash').textContent=hash.slice(0,8)+'\u2026';\n  \/\/ CEM + EAL\n  S.cemScore=Math.min(89,S.cemScore+1);\n  updateCEM();\n  addLog(now(),'morph','Fisher-Yates IP rotate \u2192 '+eps[0].ip+':'+eps[0].port);\n  \/\/ Flash all GW\n  nodes.filter(n=>n.type==='GW').forEach(n=>arcFlash(n.x,n.y,'#00e5ff',50));\n}\n \nfunction updateCEM(){\n  document.getElementById('cem-v').textContent=S.cemScore+'\/57';\n  document.getElementById('cem-bar').style.width=Math.min(100,(S.cemScore\/89)*100)+'%';\n  const eal=document.getElementById('eal-lv'),sc=document.getElementById('eal-sc');\n  if(S.cemScore>=79){eal.textContent='EAL7';eal.style.color='#4caf50';}\n  else if(S.cemScore>=66){eal.textContent='EAL6+';eal.style.color='#ffc107';}\n  else{eal.textContent='EAL6';eal.style.color='#26a69a';}\n  sc.textContent=S.cemScore+'\/57 CEM';\n}\n \n\/\/ \u2500\u2500 Threat \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction setThreat(v){\n  S.threat=Math.max(1,Math.min(4,v));\n  const el=document.getElementById('thr');\n  const L=['','LOW','MED','HIGH','CRIT'],C=['','tl','tm','th','tc'];\n  el.textContent=L[S.threat]; el.className='tp '+C[S.threat];\n  document.getElementById('s-thr').textContent=S.threat===4?'CRITICAL':S.threat===3?'HIGH':S.threat===2?'MEDIUM':'LOW';\n  document.getElementById('s-str').textContent=S.threat>=3?'LOCKDOWN':S.threat>=2?'ADAPT':'NOMINAL';\n  \/\/ Degraded mode: colorize netarea\n  const na=document.querySelector('.netarea');\n  if(S.threat===4&&na)na.style.boxShadow='inset 0 0 30px #f4433611';\n  else if(na)na.style.boxShadow='';\n}\n \n\/\/ \u2500\u2500 Attacks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction atk(type,btn){\n  if(S.attacks.has(type)){S.attacks.delete(type);btn.classList.remove('on');setThreat(S.threat-1);return;}\n  S.attacks.add(type);btn.classList.add('on');setThreat(S.threat+1);\n  const info={scan:'port scan 65535',brute:'10K\/s',recon:'cartographie',ddos:'1.3M req\/s',apt:'mouvement lat\u00e9ral',zero:'CVE-0day'};\n  addLog(now(),'detect','\u2197 '+type.toUpperCase()+' \u2014 '+(info[type]||'actif'));\n  S.cemScore=Math.min(89,S.cemScore+2); updateCEM();\n  \/\/ Activate all defenses visually\n  allDefenses(type);\n  setTimeout(()=>{\n    if(!S.attacks.has(type))return;\n    addLog(now(),'isolate','Surface morph\u00e9e \u2014 '+type.toUpperCase()+' isol\u00e9');\n    addLog(now(),'ok','NON EXPLOIT confirm\u00e9 \u00b7 bypass=0');\n    S.attacks.delete(type);btn.classList.remove('on');\n    setThreat(S.threat-1);\n    updateScore(type);\n  },3500+Math.random()*2000);\n}\n \nfunction allDefenses(type){\n  \/\/ Flash all layer cards\n  document.querySelectorAll('.lcard').forEach((c,i)=>{\n    setTimeout(()=>{c.style.borderColor='#00e5ff';setTimeout(()=>c.style.borderColor='',1200);},i*120);\n  });\n  \/\/ Run each layer anim\n  const core=nodes[0];\n  const gws=nodes.filter(n=>n.type==='GW');\n  const hons=nodes.filter(n=>n.type==='HON');\n  const anims=[animL4,animL5,animL6,animL7,animL8,animL9,animL10];\n  anims.forEach((fn,i)=>setTimeout(fn,i*350));\n  \/\/ MTTD\n  const t0=performance.now();\n  setTimeout(()=>{\n    const ms=performance.now()-t0;\n    const display=ms<0.1?(ms*1000000).toFixed(0)+'ns':ms<1?(ms*1000).toFixed(1)+'\u00b5s':ms.toFixed(2)+'ms';\n    document.getElementById('ov-mttd').textContent=display;\n  },100+Math.random()*200);\n}\n \n\/\/ \u2500\u2500 Layer click \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst LNODES={l4:['CORE','GW'],l5:['HON','EP'],l6:['CORE','GW','EP'],\n  l7:['GW','EP'],l8:['EP','CORE'],l9:['EP','GW'],l10:['CORE','GW','HON']};\nconst LCOLS={l4:'#1565c0',l5:'#1b5e20',l6:'#6a1b9a',l7:'#0d47a1',l8:'#e65100',l9:'#006064',l10:'#f57f17'};\nconst LANIMS={l4:animL4,l5:animL5,l6:animL6,l7:animL7,l8:animL8,l9:animL9,l10:animL10};\nfunction clickLayer(id,el){\n  el.style.borderColor=LCOLS[id]||'#00e5ff';\n  setTimeout(()=>el.style.borderColor='',2000);\n  showTips(LNODES[id]||['CORE']);\n  if(LANIMS[id])LANIMS[id]();\n}\n \n\/\/ \u2500\u2500 Layer animations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction animL4(){\n  const core=nodes[0],gws=nodes.filter(n=>n.type==='GW');\n  const p=edgePt();\n  spawnPkt(p.x,p.y,core.x,core.y,'#f44336',()=>{\n    floatLabel(core.x,core.y-30,'INJECT ATTEMPT','#f44336');\n    let done=0;\n    gws.forEach((gw,i)=>setTimeout(()=>{\n      spawnPkt(core.x,core.y,gw.x,gw.y,'#00e5ff',()=>{\n        floatLabel(gw.x,gw.y-20,'PREPARE','#00e5ff');\n        arcFlash(gw.x,gw.y,'#00e5ff',40);\n        spawnPkt(gw.x,gw.y,core.x,core.y,'#4caf50',()=>{\n          done++;\n          if(done>=gws.length){floatLabel(core.x,core.y-45,'\u2713 COMMIT N=4','#4caf50');arcFlash(core.x,core.y,'#4caf50',60);}\n        });\n      });\n    },i*220));\n  });\n  addLog(now(),'ok','L4 PBFT \u2014 preprepare\u2192prepare\u2192commit OK (3\/4)');\n}\nfunction animL5(){\n  const hons=nodes.filter(n=>n.type==='HON'),core=nodes[0];\n  hons.forEach((h,i)=>setTimeout(()=>{\n    arcFlash(h.x,h.y,'#ff6d00',35);\n    floatLabel(h.x,h.y-22,'oHON ACTIVE','#ff6d00');\n    const p=edgePt();\n    spawnPkt(p.x,p.y,core.x,core.y,'#f44336',()=>{\n      floatLabel(core.x,core.y-22,'REDIRECT \u2192 HON','#ff9800');\n      spawnPkt(core.x,core.y,h.x,h.y,'#ff9800',()=>{\n        floatLabel(h.x,h.y-34,'PROBE CAPTURED','#ff9800');\n        arcFlash(h.x,h.y,'#4caf50',30);\n        setTimeout(()=>{spawnPkt(h.x,h.y,p.x,p.y,'#4caf50');floatLabel(h.x,h.y-46,'POISON INJECT','#4caf50');},350);\n      });\n    });\n  },i*250));\n  addLog(now(),'detect','L5 HON \u2014 attaquant d\u00e9tect\u00e9 \u00b7 redirection honeypot');\n}\nfunction animL6(){\n  const W=svgW(),cx=W\/2,H=svgH(),cy=H\/2;\n  [[-55,'HEAD CANARY','#ce93d8'],[-15,'ZONE LIBRE','#4caf50'],[+15,'MID CANARY','#ce93d8'],[+45,'ZONE LIBRE','#4caf50'],[+75,'TAIL CANARY','#ce93d8']].forEach(([dy,lbl,col],i)=>{\n    setTimeout(()=>{floatLabel(cx+130,cy+dy,lbl,col);arcFlash(cx+130,cy+dy,col,20);},i*180);\n  });\n  setTimeout(()=>{floatLabel(cx+130,cy-85,'\u2713 check_all OK','#4caf50');arcFlash(cx+130,cy,'#4caf50',60);addLog(now(),'ok','L6 MemGuard \u2014 head+mid+tail intacts');},1100);\n}\nfunction animL7(){\n  nodes.filter(n=>n.type==='EP').forEach((n,i)=>setTimeout(()=>{\n    n.ip=randIP();n.port=ri(9000,65000);\n    if(i%7===0)floatLabel(n.x,n.y-18,'\u21ba ROTATED','#00e5ff');\n  },i*25));\n  nodes.filter(n=>n.type==='GW').forEach((gw,i)=>setTimeout(()=>{\n    gw.ip=randIP();arcFlash(gw.x,gw.y,'#00bcd4',40);floatLabel(gw.x,gw.y-28,'chain_state \u21ba','#00bcd4');\n  },i*280+150));\n  const core=nodes[0];\n  setTimeout(()=>{floatLabel(core.x,core.y-55,'COMMITMENT OK','#4caf50');arcFlash(core.x,core.y,'#00e5ff',70);\n    addLog(now(),'morph','L7 v8 \u2014 HKDF 96B \u00b7 morph_rate=1.000');doMorph();},1400);\n}\nfunction animL8(){\n  const core=nodes[0],gws=nodes.filter(n=>n.type==='GW');\n  for(let i=0;i<8;i++){\n    const p=edgePt(),t=i%3===0?core:(gws[i%gws.length]||core);\n    setTimeout(()=>spawnPkt(p.x,p.y,t.x,t.y,'#f44336',()=>{\n      floatLabel(t.x+rf(-25,25),t.y-22,'PERTURBED','#ff9800');\n      arcFlash(t.x,t.y,'#ff9800',25);\n    }),i*160);\n  }\n  setTimeout(()=>{floatLabel(nodes[0].x,nodes[0].y-52,'noise_ratio=0.55','#ff9800');floatLabel(nodes[0].x,nodes[0].y-66,'degradation=0.967','#4caf50');addLog(now(),'ok','L8 ML \u2014 fingerprint bloqu\u00e9 \u00b7 delta=0.967');},1600);\n}\nfunction animL9(){\n  const core=nodes[0],gws=nodes.filter(n=>n.type==='GW');\n  const p=edgePt();\n  spawnPkt(p.x,p.y,core.x,core.y,'#ff9800');\n  floatLabel((p.x+core.x)\/2,(p.y+core.y)\/2,'TIMING PROBE','#ff9800');\n  [{t:300,type:'BURST',col:'#00e5ff',dst:gws[0]||core},{t:550,type:'JITTER',col:'#26c6da',dst:gws[1]||core},\n   {t:750,type:'SILENCE',col:'#546e7a',dst:null},{t:1000,type:'BURST',col:'#00e5ff',dst:gws[2%gws.length]||core},\n   {t:1200,type:'DECOY',col:'#ab47bc',dst:{x:p.x,y:p.y}}].forEach(({t,type,col,dst})=>{\n    setTimeout(()=>{\n      if(dst)spawnPkt(core.x,core.y,dst.x,dst.y,col);\n      floatLabel(core.x+rf(-50,50),core.y-42+Math.random()*12,type,col);\n    },t);\n  });\n  setTimeout(()=>{addLog(now(),'morph','L9 HMAC-DRBG \u2014 jitter='+ri(500,8000)+'\u00b5s \u2014 3 flux');addLog(now(),'ok','L9 pred_rate=0.194 \u2014 corr\u00e9lation impossible');},1600);\n}\nfunction animL10(){\n  const core=nodes[0],gws=nodes.filter(n=>n.type==='GW');\n  const cols=['#42a5f5','#66bb6a','#ffa726'];\n  gws.forEach((gw,i)=>{\n    arcFlash(gw.x,gw.y,cols[i]||'#42a5f5',30);\n    floatLabel(gw.x,gw.y-28,'AGENT '+'ABC'[i],cols[i]||'#42a5f5');\n    setTimeout(()=>{\n      const act=['ROTATE_TOPO','VARY_L9_JIT','ACTIVATE_L5','VARY_L8_NOI'][ri(0,3)];\n      floatLabel(gw.x,gw.y-44,act,cols[i]||'#42a5f5');\n      spawnPkt(gw.x,gw.y,core.x,core.y,cols[i]||'#42a5f5');\n    },i*380+280);\n  });\n  setTimeout(()=>{\n    const act=['ROTATE_TOPO','VARY_L9_JIT','ACTIVATE_L5','VARY_L8_NOI'][ri(0,3)];\n    arcFlash(core.x,core.y,'#ffc107',80);\n    floatLabel(core.x,core.y-60,'DECISION: '+act,'#ffc107');\n    addLog(now(),'ok','L10 argmax bruit\u00e9 \u2014 HMAC-DRBG \u00b7 INV1\/2\/3\/4 PASS');\n    addLog(now(),'ok','bypass=0\/300 \u00b7 entropy='+( 1.7+Math.random()*.4).toFixed(2)+'b');\n  },1500);\n}\n \n\/\/ \u2500\u2500 Morph mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction setMorph(mode,btn){\n  document.querySelectorAll('.bm').forEach(b=>b.classList.remove('on'));\n  btn.classList.add('on'); S.morphMode=mode;\n  const msgs={auto:'Auto-morphing toutes les '+S.morphRate+'s',rfc:'Rotation IP RFC 6598',remap:'Remap ports 65535 positions',topo:'Topo shuffle Fisher-Yates',full:'Full surface morph actif'};\n  addLog(now(),'morph',msgs[mode]||'Mode chang\u00e9');\n  doMorph();\n}\n \n\/\/ \u2500\u2500 Score \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction updateScore(type){\n  const k={scan:'scan',brute:'brute',recon:'recon',ddos:'ddos',apt:'apt',zero:'zero'}[type];\n  if(!k)return;\n  S.scores[k]=Math.min(S.scores[k]+ri(1,5),15);\n  setTimeout(()=>{S.scores[k]=Math.max(0,S.scores[k]-ri(1,3));renderScores();},3000);\n  renderScores();\n}\nfunction renderScores(){\n  Object.keys(S.scores).forEach(k=>{\n    const v=S.scores[k];\n    const el=document.getElementById('sc-'+k),b=document.getElementById('sb-'+k);\n    if(el)el.textContent=v+'%'; if(b)b.style.width=v+'%';\n  });\n}\n \n\/\/ \u2500\u2500 Full simulation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nlet fullRunning=false;\nfunction fullSim(){\n  if(fullRunning)return;\n  fullRunning=true;\n  const btn=document.getElementById('ba-full');\n  btn.style.background='#ffc107';btn.style.color='#000';btn.textContent='\u26a1 EN COURS...';\n  addLog(now(),'detect','\u2550\u2550\u2550 SIMULATION AI+HUMAIN D\u00c9MARR\u00c9E \u2550\u2550\u2550');\n  setThreat(4);\n  const seq=[{t:'scan',d:0},{t:'recon',d:2000},{t:'brute',d:3500},{t:'apt',d:5500},{t:'ddos',d:7000},{t:'zero',d:9000},{t:'scan',d:11000},{t:'brute',d:12500}];\n  let cbIdx=0;\n  const cbInt=setInterval(()=>{\n    for(let i=0;i<3;i++)flashCBMC((cbIdx+i)%60,CBMC_N[(cbIdx+i)%60]);\n    cbIdx=(cbIdx+3)%60;\n  },180);\n  seq.forEach((a,i)=>{\n    setTimeout(()=>{\n      addLog(now(),'detect','\u25b6 Phase '+(i+1)+': '+a.t.toUpperCase());\n      const hons=nodes.filter(n=>n.type==='HON');\n      for(let j=0;j<4;j++)setTimeout(()=>{\n        const p=edgePt(),h=hons.length?hons[ri(0,hons.length-1)]:nodes[0];\n        spawnPkt(p.x,p.y,h.x,h.y,'#f44336',()=>{\n          floatLabel(h.x,h.y-20,'TRAPPED','#ff9800');\n          spawnPkt(h.x,h.y,p.x,p.y,'#4caf50');\n        });\n      },j*200);\n      allDefenses(a.t);\n    },a.d);\n  });\n  setTimeout(()=>{\n    clearInterval(cbInt);\n    fullRunning=false;\n    btn.style.background='';btn.style.color='#ffc107';btn.textContent='\u26a1 SIMULATION AI+HUMAIN';\n    addLog(now(),'ok','\u2550\u2550\u2550 SIMULATION TERMIN\u00c9E \u2550\u2550\u2550');\n    addLog(now(),'ok','8\/8 attaques neutralis\u00e9es \u00b7 bypass=0\/300');\n    addLog(now(),'ok','CEM BRUT 66\/57 (+9) \u00b7 VUL-009-012 NON EXPLOIT');\n    arcFlash(nodes[0].x,nodes[0].y,'#4caf50',120);\n    floatLabel(nodes[0].x,nodes[0].y-90,'SYST\u00c8ME INVAINCU','#4caf50');\n    setThreat(1); S.cemScore=79; updateCEM();\n  },14500);\n}\n \n\/\/ \u2500\u2500 Start \/ Stop \/ Reset \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction startSim(){\n  if(S.running)return;\n  S.running=true; S.start=Date.now();\n  frame(); cbmcAutoFlash(); updateAgents();\n  addLog(now(),'ok','CMS CORTEX MORPHIC SHIELD\u2122 v8.0 \u2014 D\u00c9MARR\u00c9');\n}\nfunction resetSim(){\n  S.running=false; cancelAnimationFrame(raf);\n  S.rotations=0; S.attacks.clear(); S.cemScore=66; S.threat=4;\n  S.scores={scan:2,brute:11,recon:1,ddos:2,apt:0,zero:0};\n  document.querySelectorAll('.ba').forEach(b=>b.classList.remove('on'));\n  document.getElementById('logc').innerHTML='';\n  document.getElementById('rotHistory').innerHTML='';\n  gEdges().innerHTML=''; gPkts().innerHTML=''; gEffects().innerHTML='';\n  gNodes().innerHTML=''; gLabels().innerHTML=''; gTips().innerHTML='';\n  initNodes(); renderScores(); updateCEM(); setThreat(4);\n  setTimeout(startSim,100);\n}\n \n\/\/ \u2500\u2500 Boot \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ninitNodes(); buildCBMC();\naddLog(now(),'ok','CMS CORTEX MORPHIC SHIELD\u2122 v8.0 \u2014 pr\u00eat');\naddLog(now(),'morph','Fisher-Yates IP rotate \u2192 100.13.21.84:54033');\naddLog(now(),'detect','DDoS FLOOD \u2192 1 309 790 req\/s \u2014 [CRIT]');\naddLog(now(),'ok','Surface morph\u00e9e \u00b7 flux bloqu\u00e9 \u2014 [OK]');\nstartSim();\n<\/script>\n<\/body>\n<\/html>\n<div style=\"width:100vw;margin-left:calc(-50vw + 50%);position:relative;\">\n  <!-- tout le simulateur ici -->\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>CMS CORTEX MORPHIC SHIELD\u2122 \/\/ CMS CORTEX MORPHIC SHIELD\u2122 EVAL-016 V5.2MTD FISHER-YATESCBMC 60\/60~125 Mds+ \/\/ MORPHING AUTO-MORPHING ROTATION IP (RFC 6598) REMAP PORTS TOPO SHUFFLE FULL SURFACE MORPH \/\/ ATTAQUES \u2197 PORT SCAN \u2197 BRUTEFORCE \u2197 RECONNAISSANCE \u2197 DDoS FLOOD \u2197 APT INFILTRATION \u2197 ZERO-DAY \u26a1 SIMULATION AI+HUMAIN \/\/ PARAMS Morph rate20s Nodes40 ThreatCRIT \u25b6 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1218","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/posts\/1218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/comments?post=1218"}],"version-history":[{"count":6,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/posts\/1218\/revisions"}],"predecessor-version":[{"id":1277,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/posts\/1218\/revisions\/1277"}],"wp:attachment":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/media?parent=1218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/categories?post=1218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/tags?post=1218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}