<!doctype html>
<html>
<head>
<script nonce="00h6CgE_f_355H9MZYhUiA">window['ppConfig'] = {productName: '26981ed0d57bbad37e728ff58134270c', deleteIsEnforced:  false , sealIsEnforced:  false , heartbeatRate:  0.5 , periodicReportingRateMillis:  60000.0 , disableAllReporting:  false };(function(){'use strict';function k(a){var b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}}function l(a){var b=typeof Symbol!="undefined"&&Symbol.iterator&&a[Symbol.iterator];if(b)return b.call(a);if(typeof a.length=="number")return{next:k(a)};throw Error(String(a)+" is not an iterable or ArrayLike");}function m(a,b){var c;b&&!b.done&&(c=a["return"])&&c.call(a)}
var n=typeof Object.defineProperties=="function"?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function p(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var q=p(this);
function r(a,b){if(b)a:{var c=q;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&b!=null&&n(c,a,{configurable:!0,writable:!0,value:b})}}r("Object.is",function(a){return a?a:function(b,c){return b===c?b!==0||1/b===1/c:b!==b&&c!==c}});
r("Array.prototype.includes",function(a){return a?a:function(b,c){var d=this;d instanceof String&&(d=String(d));var e=d.length;c=c||0;for(c<0&&(c=Math.max(c+e,0));c<e;c++){var f=d[c];if(f===b||Object.is(f,b))return!0}return!1}});
r("String.prototype.includes",function(a){return a?a:function(b,c){if(this==null)throw new TypeError("The 'this' value for String.prototype.includes must not be null or undefined");if(b instanceof RegExp)throw new TypeError("First argument to String.prototype.includes must not be a regular expression");return this.indexOf(b,c||0)!==-1}});function t(a,b,c){a("https://csp.withgoogle.com/csp/proto/"+encodeURIComponent(b),JSON.stringify(c))}function u(){var a;if((a=window.ppConfig)==null?0:a.disableAllReporting)return function(){};var b,c,d,e;return(e=(b=window)==null?void 0:(c=b.navigator)==null?void 0:(d=c.sendBeacon)==null?void 0:d.bind(navigator))!=null?e:v}function v(a,b){var c=new XMLHttpRequest;c.open("POST",a);c.send(b)}
function w(){var a=(x=Object.prototype)==null?void 0:x.__lookupGetter__("__proto__"),b=y,c=z;return function(){var d=a.call(this),e,f,g,h;t(c,b,{type:"ACCESS_GET",origin:(f=window.location.origin)!=null?f:"unknown",report:{className:(g=d==null?void 0:(e=d.constructor)==null?void 0:e.name)!=null?g:"unknown",stackTrace:(h=Error().stack)!=null?h:"unknown"}});return d}}
function A(){var a=(B=Object.prototype)==null?void 0:B.__lookupSetter__("__proto__"),b=y,c=z;return function(d){d=a.call(this,d);var e,f,g,h;t(c,b,{type:"ACCESS_SET",origin:(f=window.location.origin)!=null?f:"unknown",report:{className:(g=d==null?void 0:(e=d.constructor)==null?void 0:e.name)!=null?g:"unknown",stackTrace:(h=Error().stack)!=null?h:"unknown"}});return d}}function C(a,b){D(a.productName,b);setInterval(function(){D(a.productName,b)},a.periodicReportingRateMillis)}
var E="constructor __defineGetter__ __defineSetter__ hasOwnProperty __lookupGetter__ __lookupSetter__ isPrototypeOf propertyIsEnumerable toString valueOf __proto__ toLocaleString x_ngfn_x".split(" "),F=E.concat,G=navigator.userAgent.match(/Firefox\/([0-9]+)\./),H=(!G||G.length<2?0:Number(G[1])<75)?["toSource"]:[],I;if(H instanceof Array)I=H;else{for(var J=l(H),K,L=[];!(K=J.next()).done;)L.push(K.value);I=L}var M=F.call(E,I),N=[];
function D(a,b){var c=[],d=l(Object.getOwnPropertyNames(Object.prototype)),e=d.next();try{for(;!e.done;e=d.next()){var f=e.value;M.includes(f)||N.includes(f)||c.push(f)}}finally{m(d,e)}e=Object.prototype;d=[];for(f=0;f<c.length;f++){var g=c[f];d[f]={name:g,descriptor:Object.getOwnPropertyDescriptor(Object.prototype,g),type:typeof e[g]}}if(d.length!==0){c=l(d);e=c.next();try{for(;!e.done;e=c.next())N.push(e.value.name)}finally{m(c,e)}var h;t(b,a,{type:"SEAL",origin:(h=window.location.origin)!=null?
h:"unknown",report:{blockers:d}})}};var O=Math.random(),P=u(),Q=window.ppConfig;Q&&(Q.disableAllReporting||Q.deleteIsEnforced&&Q.sealIsEnforced||O<Q.heartbeatRate&&t(P,Q.productName,{origin:window.location.origin,type:"HEARTBEAT"}));var z=u(),R=window.ppConfig;if(R)if(R.deleteIsEnforced)delete Object.prototype.__proto__;else if(!R.disableAllReporting){var y=R.productName;try{var x,B;Object.defineProperty(Object.prototype,"__proto__",{enumerable:!1,get:w(),set:A()})}catch(a){}}
(function(){var a=u(),b=window.ppConfig;b&&(b.sealIsEnforced?Object.seal(Object.prototype):b.disableAllReporting||(document.readyState!=="loading"?C(b,a):document.addEventListener("DOMContentLoaded",function(){C(b,a)})))})();}).call(this);
</script><meta name="chromevox" content-script="no">
<title>Laporan Banjir · FELCRA Kelantan</title>
<meta name="viewport"content="width=device-width, initial-scale=1, viewport-fit=cover" />
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" nonce="F4cZ50dIK6O0C7CpbxpaIA"><link rel="stylesheet" href="/static/macros/client/css/2208734863-mae_html_css_ltr.css">
<script type="text/javascript" src="/static/macros/client/js/2663127035-warden_bin_i18n_warden.js"></script>
</head>
<body>
<table id="warning-bar-table" class="full_size" cellspacing="0" cellpadding="0"><tr><td><div id="warning" class="warning-bar"></div></td></tr><tr><td style="height: 100%"><iframe id="sandboxFrame" title="Laporan Banjir · FELCRA Kelantan" allow="accelerometer *; autoplay *; clipboard-read *; clipboard-write *; encrypted-media *; fullscreen *; geolocation *; gyroscope *; local-network-access *; magnetometer *; midi *; payment *; picture-in-picture *; screen-wake-lock *; sync-xhr *; web-share *" sandbox="allow-downloads allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-top-navigation-by-user-activation allow-storage-access-by-user-activation">
</iframe>
</td></tr></table><script nonce="00h6CgE_f_355H9MZYhUiA">
(function() {
var el = document.getElementById('sandboxFrame');
el.onload = function() {
goog.script.init("\x7b\x22functionNames\x22:\x5b\x22doGet\x22,\x22include\x22,\x22onOpen\x22,\x22showSidebar\x22,\x22showDashboard\x22,\x22getOptions\x22,\x22submitEntry\x22,\x22getDashboard\x22,\x22getProjekOptions\x22,\x22getHiSebelum\x22,\x22kiraSemulaHHI\x22,\x22submitProjek\x22,\x22getDashProjek\x22,\x22uploadImage\x22,\x22reverseGeocode\x22,\x22onEdit\x22\x5d,\x22sandboxMode\x22:\x22IFRAME_SANDBOX\x22,\x22callbackTimeout\x22:390000,\x22deploymentId\x22:\x22AKfycbxRt6Gcgrmz1ZQioIZ13bQvGoRqDD1u5NMA2h2Qd8eE6onFBnI906H_P53emQp91fw1\x22,\x22eei\x22:\x22\x22,\x22sandboxHost\x22:\x22https:\/\/n-aklnyfggcqfegeq22pueryxmzn5yre4bvqgdlgi-0lu-script.googleusercontent.com\x22,\x22clientSideProperties\x22:\x7b\x22google.script.sandbox.mode\x22:\x22IFRAME_SANDBOX\x22,\x22google.script.use_fetch_for_post_form\x22:true,\x22google.script.host.origin\x22:\x22https:\/\/docs.google.com\x22\x7d,\x22actionPrefix\x22:\x22\/macros\/s\/AKfycbxRt6Gcgrmz1ZQioIZ13bQvGoRqDD1u5NMA2h2Qd8eE6onFBnI906H_P53emQp91fw1\x22,\x22userHtml\x22:\x22\x3c!DOCTYPE html\x3e\\n\x3chtml lang\x3d\\\x22ms\\\x22\x3e\\n\x3chead\x3e\\n\x3cbase target\x3d\\\x22_top\\\x22\x3e\\n\x3cmeta charset\x3d\\\x22utf-8\\\x22\x3e\\n\x3cmeta name\x3d\\\x22viewport\\\x22 content\x3d\\\x22width\x3ddevice-width, initial-scale\x3d1, viewport-fit\x3dcover\\\x22\x3e\\n\x3cmeta name\x3d\\\x22apple-mobile-web-app-capable\\\x22 content\x3d\\\x22yes\\\x22\x3e\\n\x3cmeta name\x3d\\\x22theme-color\\\x22 content\x3d\\\x22#f7f7f7\\\x22\x3e\\n\x3clink rel\x3d\\\x22stylesheet\\\x22 href\x3d\\\x22https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.css\\\x22\x3e\\n\x3clink rel\x3d\\\x22preconnect\\\x22 href\x3d\\\x22https:\/\/fonts.googleapis.com\\\x22\x3e\\n\x3clink rel\x3d\\\x22stylesheet\\\x22 href\x3d\\\x22https:\/\/fonts.googleapis.com\/css2?family\x3dInter:wght@400;500;600;700\x26amp;display\x3dswap\\\x22\x3e\\n\x3cscript\x3e(function()\x7bvar t;try\x7bt\x3dlocalStorage.getItem(\x27mb-theme\x27)\x7dcatch(e)\x7b\x7dif(t!\x3d\x3d\x27light\x27\x26\x26t!\x3d\x3d\x27dark\x27)t\x3d(window.matchMedia\x26\x26matchMedia(\x27(prefers-color-scheme: dark)\x27).matches)?\x27dark\x27:\x27light\x27;document.documentElement.setAttribute(\x27data-theme\x27,t);\x7d)();\x3c\\\/script\x3e\\n\x3cstyle\x3e\\n   \\n  :root\x7b\\n    --font:\\\x22Inter\\\x22,ui-sans-serif,system-ui,-apple-system,\\\x22Segoe UI\\\x22,Roboto,sans-serif;\\n    --acc4:#3a7dd5; --acc5:#1462c0; --acc6:#0d4f9f; --acc7:#0a3e7e;\\n    --red4:#ef4a50; --red5:#e1262d; --red6:#c11d23;\\n    --page:#f7f7f7; --card:#ffffff; --field:#ffffff; --sunk:#f7f7f7; --hover:#f0f0f0;\\n    --seg:#ebebeb; --seg-on:#ffffff;\\n    --line:#ebebeb; --line2:#d4d4d4;\\n    --ink:#0a0a0a; --muted:#737373; --faint:#a3a3a3;\\n    --soft:#ebf2fc; --soft-ink:#0d4f9f; --red-soft:#fdecec;\\n    --a:#e1262d; --b:#e08600; --c:#1462c0;\\n    --sh-xs:0 1px 2px 0 rgb(0 0 0 \/ .06);\\n    --sh-card:0 1px 1px 0 rgb(0 0 0 \/ .05);\\n    --sh-pill:0 1px 2px rgb(0 0 0 \/ .08),0 0 0 .5px rgb(0 0 0 \/ .05);\\n    --ring:0 0 0 3px rgb(20 98 192 \/ .22);\\n    --brand:var(--acc5); --brand-ink:#fff; --danger:var(--red5);\\n    color-scheme:light;\\n  \x7d\\n  \x5bdata-theme\x3ddark\x5d\x7b\\n    --acc4:#5a97e6; --acc5:#2a72cf; --acc6:#1a5cb2; --acc7:#144a91;\\n    --page:#121212; --card:#1a1a1a; --field:#232323; --sunk:#141414; --hover:#262626;\\n    --seg:#0c0c0c; --seg-on:#2b2b2b;\\n    --line:#2a2a2a; --line2:#404040;\\n    --ink:#fafafa; --muted:#a3a3a3; --faint:#6b6b6b;\\n    --soft:rgb(58 125 213 \/ .16); --soft-ink:#8ab6ee; --red-soft:rgb(225 38 45 \/ .18);\\n    --a:#f0555b; --b:#f2a33a; --c:#4b8fe2;\\n    --sh-xs:0 1px 2px 0 rgb(0 0 0 \/ .4); --sh-card:0 1px 1px 0 rgb(0 0 0 \/ .3);\\n    --sh-pill:0 1px 2px rgb(0 0 0 \/ .5),inset 0 1px 0 rgb(255 255 255 \/ .04);\\n    --ring:0 0 0 3px rgb(58 125 213 \/ .3);\\n    color-scheme:dark;\\n  \x7d\\n  *\x7bbox-sizing:border-box;-webkit-tap-highlight-color:transparent\x7d\\n  html,body\x7bmargin:0;background:var(--page);color:var(--ink);font:14px\/1.45 var(--font);-webkit-text-size-adjust:100%;\\n    -webkit-font-smoothing:antialiased;transition:background-color .2s,color .2s\x7d\\n\\n   \\n  header\x7bposition:sticky;top:0;z-index:20;background:var(--page);background:color-mix(in srgb,var(--page) 86%,transparent);\\n    -webkit-backdrop-filter:saturate(1.4) blur(12px);backdrop-filter:saturate(1.4) blur(12px);\\n    border-bottom:1px solid var(--line);padding:calc(8px + env(safe-area-inset-top)) 12px 10px\x7d\\n  .ab\x7bdisplay:flex;align-items:center;gap:10px;max-width:640px;margin:0 auto\x7d\\n  .mark\x7bposition:relative;flex:none;width:32px;height:32px;border-radius:9px;display:grid;place-items:center;\\n    background:linear-gradient(180deg,var(--acc5),var(--acc6));box-shadow:inset 0 1px 0 rgb(255 255 255 \/ .25),var(--sh-xs)\x7d\\n  .mark svg\x7bwidth:17px;height:17px\x7d\\n  .mark::after\x7bcontent:\\\x22\\\x22;position:absolute;right:-3px;bottom:-3px;width:11px;height:11px;border-radius:50%;\\n    background:var(--red5);border:2px solid var(--page)\x7d\\n  .ab-t\x7bflex:1;min-width:0\x7d\\n  .ab-t h1\x7bmargin:0;font-size:15px;font-weight:600;letter-spacing:-.01em;line-height:1.25\x7d\\n  .ab-t p\x7bmargin:0;font-size:12px;color:var(--muted)\x7d\\n  .ibtn\x7bflex:none;width:36px;height:36px;border-radius:10px;border:1px solid var(--line);background:var(--card);color:var(--ink);\\n    display:grid;place-items:center;box-shadow:var(--sh-xs);cursor:pointer\x7d\\n  .ibtn:hover\x7bbackground:var(--hover)\x7d\\n  .ibtn svg\x7bwidth:17px;height:17px\x7d\\n  .ico-sun\x7bdisplay:none\x7d \x5bdata-theme\x3ddark\x5d .ico-sun\x7bdisplay:block\x7d \x5bdata-theme\x3ddark\x5d .ico-moon\x7bdisplay:none\x7d\\n\\n   \\n  .tabs\x7bposition:relative;display:grid;grid-template-columns:repeat(3,1fr);gap:2px;padding:3px;border-radius:10px;background:var(--seg);\\n    max-width:640px;margin:10px auto 0\x7d\\n  .tabs .ind\x7bposition:absolute;top:3px;bottom:3px;left:3px;width:calc((100% - 10px) \/ 3);border-radius:7px;background:var(--seg-on);\\n    box-shadow:var(--sh-pill);transition:transform .2s ease\x7d\\n  .tabs:has(#tabProj.on) .ind\x7btransform:translateX(calc(100% + 2px))\x7d\\n  .tabs:has(#tabDash.on) .ind\x7btransform:translateX(calc(200% + 4px))\x7d\\n  .tabs button\x7bposition:relative;z-index:1;border:0;background:transparent;font:inherit;font-size:13px;font-weight:600;color:var(--muted);\\n    min-height:32px;border-radius:7px;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:6px\x7d\\n  .tabs button svg\x7bwidth:15px;height:15px\x7d\\n  .tabs button.on\x7bcolor:var(--ink)\x7d\\n\\n   \\n  main\x7bmax-width:640px;margin:0 auto;padding:12px 12px calc(88px + env(safe-area-inset-bottom))\x7d\\n  .card\x7bbackground:var(--card);border:1px solid var(--line);border-radius:16px;padding:14px;margin-bottom:10px;box-shadow:var(--sh-card)\x7d\\n  .card h2\x7bdisplay:flex;align-items:center;gap:8px;margin:0 0 2px;font-size:13px;font-weight:600;color:var(--ink)\x7d\\n  .card h2::before\x7bcontent:\\\x22\\\x22;flex:none;width:6px;height:6px;border-radius:2px;background:var(--acc5)\x7d\\n  .fl\x7bdisplay:block;font-size:13px;font-weight:500;color:var(--ink);margin:12px 0 6px\x7d\\n  .req::after\x7bcontent:\\\x22 *\\\x22;color:var(--red5)\x7d\\n  input\x5btype\x3dtext\x5d,input\x5btype\x3dtel\x5d,input\x5btype\x3dnumber\x5d,input\x5btype\x3ddate\x5d,input\x5btype\x3dsearch\x5d,textarea,select\x7b\\n    width:100%;font:inherit;font-size:16px;padding:8px 12px;min-height:40px;border:1px solid var(--line);border-radius:10px;\\n    background:var(--field);color:var(--ink);box-shadow:var(--sh-xs);-webkit-appearance:none;appearance:none;\\n    transition:border-color .15s,box-shadow .15s\x7d\\n  input\x5btype\x3ddate\x5d\x7bdisplay:block;text-align:left\x7d\\n  input::-webkit-date-and-time-value\x7btext-align:left\x7d\\n  select\x7bpadding-right:32px;background-repeat:no-repeat;background-position:right 10px center;background-size:14px;\\n    background-image:url(\\\x22data:image\/svg+xml,%3Csvg xmlns\x3d\x27http:\/\/www.w3.org\/2000\/svg\x27 viewBox\x3d\x270 0 24 24\x27 fill\x3d\x27none\x27 stroke\x3d\x27%23888\x27 stroke-width\x3d\x272.2\x27 stroke-linecap\x3d\x27round\x27 stroke-linejoin\x3d\x27round\x27%3E%3Cpath d\x3d\x27m6 9 6 6 6-6\x27\/%3E%3C\/svg%3E\\\x22)\x7d\\n  input:hover,textarea:hover,select:hover\x7bborder-color:var(--line2)\x7d\\n  input:focus,textarea:focus,select:focus\x7boutline:none;border-color:var(--acc5);box-shadow:var(--ring)\x7d\\n  textarea\x7bmin-height:72px;resize:vertical;line-height:1.4\x7d\\n  input.up,textarea.up\x7btext-transform:uppercase\x7d\\n  input::placeholder,textarea::placeholder\x7btext-transform:none;color:var(--faint)\x7d\\n  select:disabled\x7bopacity:.55;cursor:not-allowed\x7d\\n  @media (max-width:480px)\x7b.grid2.loc\x7bgrid-template-columns:1fr\x7d\x7d\\n  .bad\x7bborder-color:var(--red5)!important;box-shadow:0 0 0 3px var(--red-soft)!important\x7d\\n  .grid2\x7bdisplay:grid;grid-template-columns:1fr 1fr;gap:0 10px\x7d\\n  @media (max-width:360px)\x7b.grid2\x7bgrid-template-columns:1fr\x7d\x7d\\n  .hint\x7bfont-size:12px;color:var(--muted);margin-top:6px\x7d\\n  .hidden\x7bdisplay:none!important\x7d\\n\\n   \\n  .seg\x7bdisplay:grid;grid-template-columns:repeat(4,1fr);gap:2px;padding:3px;border-radius:10px;background:var(--seg)\x7d\\n  @media (max-width:360px)\x7b.seg\x7bgrid-template-columns:repeat(2,1fr)\x7d\x7d\\n  .seg input,.opts input\x7bposition:absolute;opacity:0;pointer-events:none\x7d\\n  .seg label\x7bdisplay:flex;align-items:center;justify-content:center;min-height:34px;padding:4px;border-radius:7px;text-align:center;\\n    font-size:12.5px;font-weight:600;color:var(--muted);cursor:pointer;user-select:none;transition:background .15s,color .15s\x7d\\n  .seg input:checked+label\x7bbackground:var(--seg-on);color:var(--ink);box-shadow:var(--sh-pill)\x7d\\n  .seg input:focus-visible+label,.opts input:focus-visible+label\x7boutline:2px solid var(--acc5);outline-offset:2px\x7d\\n\\n   \\n  .opts\x7bdisplay:grid;gap:8px;margin-top:10px\x7d\\n  .opts label\x7bdisplay:flex;gap:10px;align-items:center;padding:10px 12px;min-height:52px;border:1px solid var(--line);border-radius:12px;\\n    background:var(--card);box-shadow:var(--sh-xs);cursor:pointer;transition:border-color .15s,background .15s\x7d\\n  .opts label::after\x7bcontent:\\\x22\\\x22;flex:none;margin-left:auto;width:18px;height:18px;border-radius:50%;border:1px solid var(--line2);\\n    background:var(--field);box-shadow:var(--sh-xs)\x7d\\n  .opts input:checked+label\x7bborder-color:var(--acc5);background:var(--soft)\x7d\\n  .opts input:checked+label::after\x7bborder-color:var(--acc6);\\n    background:radial-gradient(circle,#fff 0 3px,transparent 3.5px),linear-gradient(180deg,var(--acc4),var(--acc6));\\n    box-shadow:inset 0 1px 0 rgb(255 255 255 \/ .25)\x7d\\n  .opts .k\x7bflex:0 0 28px;height:28px;border-radius:8px;display:grid;place-items:center;font-weight:700;font-size:13px;color:#fff\x7d\\n  .opts .t\x7bfont-size:13px;font-weight:500;line-height:1.3\x7d\\n  #kA+label .k\x7bbackground:var(--a)\x7d #kB+label .k\x7bbackground:var(--b)\x7d #kC+label .k\x7bbackground:var(--c)\x7d\\n\\n   \\n  .btn\x7bdisplay:inline-flex;align-items:center;justify-content:center;gap:6px;font:inherit;font-size:14px;font-weight:600;\\n    min-height:40px;padding:0 14px;border-radius:10px;border:1px solid var(--line);background:var(--card);color:var(--ink);\\n    box-shadow:var(--sh-xs);cursor:pointer;transition:background .15s\x7d\\n  .btn:hover\x7bbackground:var(--hover)\x7d\\n  .btn svg\x7bwidth:16px;height:16px;flex:none\x7d\\n  .btn.primary\x7bborder:0;color:#fff;background:linear-gradient(180deg,var(--acc5),var(--acc6));\\n    box-shadow:0 1px 2px rgb(10 62 126 \/ .35),inset 0 1px 0 rgb(255 255 255 \/ .22),inset 0 0 0 1px rgb(0 0 0 \/ .08)\x7d\\n  .btn.primary:hover\x7bbackground:linear-gradient(180deg,var(--acc4),var(--acc5))\x7d\\n  .btn.primary:active\x7bbackground:linear-gradient(180deg,var(--acc6),var(--acc7))\x7d\\n  .btn.soft\x7bbackground:var(--soft);color:var(--soft-ink);border-color:transparent;box-shadow:none\x7d\\n  .btn:disabled\x7bopacity:.55;cursor:default\x7d\\n  .btn.block\x7bwidth:100%\x7d\\n  .locbox\x7bdisplay:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:12px\x7d\\n  .chip\x7bfont-size:12px;background:var(--soft);color:var(--soft-ink);padding:4px 10px;border-radius:999px;font-weight:600;font-variant-numeric:tabular-nums\x7d\\n\\n  .bar\x7bposition:fixed;left:0;right:0;bottom:0;z-index:20;background:var(--page);background:color-mix(in srgb,var(--page) 86%,transparent);\\n    -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-top:1px solid var(--line);\\n    padding:10px 12px calc(10px + env(safe-area-inset-bottom))\x7d\\n  .bar .btn\x7bdisplay:flex;width:100%;max-width:640px;margin:0 auto;min-height:44px\x7d\\n\\n   \\n  #mapSheet\x7bposition:fixed;inset:0;z-index:50;background:var(--page);display:none;flex-direction:column\x7d\\n  #mapSheet.open\x7bdisplay:flex\x7d\\n  .mhead\x7bdisplay:flex;align-items:center;gap:10px;padding:calc(8px + env(safe-area-inset-top)) 12px 8px;background:var(--card);\\n    color:var(--ink);border-bottom:1px solid var(--line)\x7d\\n  .mhead b\x7bflex:1;font-size:15px;font-weight:600;text-align:center;margin-right:64px\x7d\\n  .mhead button\x7bbackground:transparent;border:0;color:var(--acc5);font:inherit;font-weight:600;min-height:36px;padding:0 4px;cursor:pointer\x7d\\n  #map\x7bflex:1;min-height:0\x7d\\n  .mfoot\x7bpadding:10px 12px calc(10px + env(safe-area-inset-bottom));background:var(--card);border-top:1px solid var(--line);display:grid;gap:8px\x7d\\n  .mfoot .row\x7bdisplay:grid;grid-template-columns:auto 1fr;gap:8px\x7d\\n  #mapMsg\x7bfont-size:12.5px;color:var(--muted);min-height:18px;font-variant-numeric:tabular-nums\x7d\\n  \x5bdata-theme\x3ddark\x5d .leaflet-tile-pane\x7bfilter:invert(1) hue-rotate(180deg) brightness(.9) contrast(.9)\x7d\\n  \x5bdata-theme\x3ddark\x5d .leaflet-container\x7bbackground:#1a1a1a\x7d\\n  .leaflet-container\x7bfont-family:var(--font)\x7d\\n\\n  .toast\x7bposition:fixed;left:50%;transform:translateX(-50%);bottom:calc(76px + env(safe-area-inset-bottom));z-index:60;\\n    background:var(--ink);color:var(--page);padding:10px 14px;border-radius:12px;font-size:13px;font-weight:500;max-width:calc(100% - 24px);\\n    box-shadow:0 4px 6px -2px rgb(0 0 0 \/ .05),0 10px 15px -3px rgb(0 0 0 \/ .15);opacity:0;pointer-events:none;transition:opacity .2s\x7d\\n  .toast.show\x7bopacity:1\x7d\\n  .toast.err\x7bbackground:var(--red5);color:#fff\x7d\\n\x3c\\\/style\x3e\\n\x3c\\\/head\x3e\\n\x3cbody\x3e\\n\x3cheader\x3e\\n  \x3cdiv class\x3d\\\x22ab\\\x22\x3e\\n    \x3cdiv class\x3d\\\x22mark\\\x22 aria-hidden\x3d\\\x22true\\\x22\x3e\x3csvg viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22#fff\\\x22 stroke-width\x3d\\\x222.2\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22M12 3s-5.5 6-5.5 10a5.5 5.5 0 0 0 11 0C17.5 9 12 3 12 3z\\\x22\/\x3e\x3c\\\/svg\x3e\x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22ab-t\\\x22\x3e\x3ch1\x3eLaporan Banjir 2026\x3c\\\/h1\x3e\x3cp\x3eFELCRA Berhad · Negeri Kelantan\x3c\\\/p\x3e\x3c\\\/div\x3e\\n    \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22ibtn\\\x22 id\x3d\\\x22themeBtn\\\x22 aria-label\x3d\\\x22Tukar mod gelap \/ cerah\\\x22 title\x3d\\\x22Mod gelap \/ cerah\\\x22\x3e\\n      \x3csvg class\x3d\\\x22ico-moon\\\x22 viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\\\x22\/\x3e\x3c\\\/svg\x3e\\n      \x3csvg class\x3d\\\x22ico-sun\\\x22 viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222\\\x22 stroke-linecap\x3d\\\x22round\\\x22\x3e\x3ccircle cx\x3d\\\x2212\\\x22 cy\x3d\\\x2212\\\x22 r\x3d\\\x224\\\x22\/\x3e\x3cpath d\x3d\\\x22M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\\\x22\/\x3e\x3c\\\/svg\x3e\\n    \x3c\\\/button\x3e\\n  \x3c\\\/div\x3e\\n  \x3cnav class\x3d\\\x22tabs\\\x22 aria-label\x3d\\\x22Paparan\\\x22\x3e\x3cspan class\x3d\\\x22ind\\\x22 aria-hidden\x3d\\\x22true\\\x22\x3e\x3c\\\/span\x3e\\n    \x3cbutton type\x3d\\\x22button\\\x22 id\x3d\\\x22tabForm\\\x22 class\x3d\\\x22on\\\x22\x3e\x3csvg viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\\\x22\/\x3e\x3cpath d\x3d\\\x22M14 3v6h6M8 13h8M8 17h5\\\x22\/\x3e\x3c\\\/svg\x3eMangsa\x3c\\\/button\x3e\\n    \x3cbutton type\x3d\\\x22button\\\x22 id\x3d\\\x22tabProj\\\x22\x3e\x3csvg viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22M3 21h18M5 21V8l7-5 7 5v13\\\x22\/\x3e\x3cpath d\x3d\\\x22M9 21v-6h6v6\\\x22\/\x3e\x3c\\\/svg\x3eProjek\x3c\\\/button\x3e\\n    \x3cbutton type\x3d\\\x22button\\\x22 id\x3d\\\x22tabDash\\\x22\x3e\x3csvg viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22M3 3v18h18\\\x22\/\x3e\x3cpath d\x3d\\\x22M7 15v2M12 10v7M17 6v11\\\x22\/\x3e\x3c\\\/svg\x3eDashboard\x3c\\\/button\x3e\\n  \x3c\\\/nav\x3e\\n\x3c\\\/header\x3e\\n\\n\x3cmain id\x3d\\\x22viewForm\\\x22\x3e\\n\x3cform id\x3d\\\x22f\\\x22 novalidate autocomplete\x3d\\\x22off\\\x22\x3e\\n\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2\x3eMaklumat Projek\x3c\\\/h2\x3e\\n    \x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22tarikh\\\x22\x3eTarikh\x3c\\\/label\x3e\\n    \x3cinput type\x3d\\\x22date\\\x22 id\x3d\\\x22tarikh\\\x22 required\x3e\\n    \x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22kawasan\\\x22\x3eKawasan\x3c\\\/label\x3e\\n    \x3cinput type\x3d\\\x22text\\\x22 id\x3d\\\x22kawasan\\\x22 class\x3d\\\x22up\\\x22 list\x3d\\\x22dl-kawasan\\\x22 placeholder\x3d\\\x22cth. Berangan Mek Nab\\\x22\x3e\\n    \x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22projek\\\x22\x3eNama Projek\x3c\\\/label\x3e\\n    \x3cinput type\x3d\\\x22text\\\x22 id\x3d\\\x22projek\\\x22 class\x3d\\\x22up\\\x22 list\x3d\\\x22dl-projek\\\x22 placeholder\x3d\\\x22cth. Bukit Raja\\\x22\x3e\\n  \x3c\\\/section\x3e\\n\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2\x3eMaklumat Individu\x3c\\\/h2\x3e\\n    \x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22nama\\\x22\x3eNama Staf \/ Peserta \/ Pekerja\x3c\\\/label\x3e\\n    \x3cinput type\x3d\\\x22text\\\x22 id\x3d\\\x22nama\\\x22 class\x3d\\\x22up\\\x22 autocapitalize\x3d\\\x22characters\\\x22 required\x3e\\n\\n    \x3cspan class\x3d\\\x22fl req\\\x22\x3eKategori\x3c\\\/span\x3e\\n    \x3cdiv class\x3d\\\x22seg\\\x22 role\x3d\\\x22radiogroup\\\x22 aria-label\x3d\\\x22Kategori\\\x22\x3e\\n      \x3cinput type\x3d\\\x22radio\\\x22 name\x3d\\\x22kategori\\\x22 id\x3d\\\x22c1\\\x22 value\x3d\\\x22STAF\\\x22\x3e\x3clabel for\x3d\\\x22c1\\\x22\x3eStaf\x3c\\\/label\x3e\\n      \x3cinput type\x3d\\\x22radio\\\x22 name\x3d\\\x22kategori\\\x22 id\x3d\\\x22c2\\\x22 value\x3d\\\x22GPS\\\x22\x3e\x3clabel for\x3d\\\x22c2\\\x22\x3eGPS\x3c\\\/label\x3e\\n      \x3cinput type\x3d\\\x22radio\\\x22 name\x3d\\\x22kategori\\\x22 id\x3d\\\x22c3\\\x22 value\x3d\\\x22PESERTA\\\x22\x3e\x3clabel for\x3d\\\x22c3\\\x22\x3ePeserta\x3c\\\/label\x3e\\n      \x3cinput type\x3d\\\x22radio\\\x22 name\x3d\\\x22kategori\\\x22 id\x3d\\\x22c4\\\x22 value\x3d\\\x22PEKERJA\\\x22\x3e\x3clabel for\x3d\\\x22c4\\\x22\x3ePekerja \/ TKA\x3c\\\/label\x3e\\n    \x3c\\\/div\x3e\\n\\n    \x3cdiv id\x3d\\\x22wrapStaf\\\x22 class\x3d\\\x22hidden\\\x22\x3e\\n      \x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22noStaf\\\x22\x3eNo. Staf\x3c\\\/label\x3e\\n      \x3cinput type\x3d\\\x22text\\\x22 id\x3d\\\x22noStaf\\\x22 inputmode\x3d\\\x22numeric\\\x22\x3e\\n    \x3c\\\/div\x3e\\n\\n    \x3cdiv class\x3d\\\x22grid2\\\x22\x3e\\n      \x3cdiv\x3e\\n        \x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22kp\\\x22\x3eNo. K\/P\x3c\\\/label\x3e\\n        \x3cinput type\x3d\\\x22text\\\x22 id\x3d\\\x22kp\\\x22 inputmode\x3d\\\x22numeric\\\x22 placeholder\x3d\\\x22000000-00-0000\\\x22 maxlength\x3d\\\x2214\\\x22\x3e\\n      \x3c\\\/div\x3e\\n      \x3cdiv\x3e\\n        \x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22tel\\\x22\x3eNo. Telefon\x3c\\\/label\x3e\\n        \x3cinput type\x3d\\\x22tel\\\x22 id\x3d\\\x22tel\\\x22 inputmode\x3d\\\x22tel\\\x22 placeholder\x3d\\\x2201X-XXXXXXX\\\x22 maxlength\x3d\\\x2213\\\x22\x3e\\n      \x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n  \x3c\\\/section\x3e\\n\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2\x3eAlamat \x26amp; Lokasi\x3c\\\/h2\x3e\\n    \x3cdiv class\x3d\\\x22locbox\\\x22\x3e\\n      \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn soft\\\x22 id\x3d\\\x22btnMap\\\x22\x3e\x3csvg viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22M12 21s-7-6.2-7-11.5a7 7 0 0 1 14 0C19 14.8 12 21 12 21z\\\x22\/\x3e\x3ccircle cx\x3d\\\x2212\\\x22 cy\x3d\\\x229.5\\\x22 r\x3d\\\x222.5\\\x22\/\x3e\x3c\\\/svg\x3ePilih Lokasi di Peta\x3c\\\/button\x3e\\n      \x3cspan id\x3d\\\x22coordChip\\\x22 class\x3d\\\x22chip hidden\\\x22\x3e\x3c\\\/span\x3e\\n    \x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22hint\\\x22\x3ePilihan: alamat, jajahan \x26amp; mukim diisi automatik dari lokasi. Koordinat disimpan dalam sheet DATA untuk peta dashboard.\x3c\\\/div\x3e\\n\\n    \x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22alamat\\\x22\x3eAlamat Penuh\x3c\\\/label\x3e\\n    \x3ctextarea id\x3d\\\x22alamat\\\x22 class\x3d\\\x22up\\\x22 rows\x3d\\\x223\\\x22 required\x3e\x3c\\\/textarea\x3e\\n\\n    \x3cdiv class\x3d\\\x22grid2 loc\\\x22\x3e\\n      \x3cdiv\x3e\\n        \x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22daerah\\\x22\x3eDaerah \/ Jajahan\x3c\\\/label\x3e\\n        \x3cselect id\x3d\\\x22daerah\\\x22 required\x3e\x3coption value\x3d\\\x22\\\x22\x3ePilih jajahan\\u2026\x3c\\\/option\x3e\x3c\\\/select\x3e\\n      \x3c\\\/div\x3e\\n      \x3cdiv\x3e\\n        \x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22mukim\\\x22\x3eMukim\x3c\\\/label\x3e\\n        \x3cselect id\x3d\\\x22mukim\\\x22 disabled\x3e\x3coption value\x3d\\\x22\\\x22\x3ePilih jajahan dahulu\x3c\\\/option\x3e\x3c\\\/select\x3e\\n      \x3c\\\/div\x3e\\n      \x3cdiv\x3e\\n        \x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22parlimen\\\x22\x3eParlimen\x3c\\\/label\x3e\\n        \x3cselect id\x3d\\\x22parlimen\\\x22\x3e\x3coption value\x3d\\\x22\\\x22\x3ePilih parlimen\\u2026\x3c\\\/option\x3e\x3c\\\/select\x3e\\n      \x3c\\\/div\x3e\\n      \x3cdiv\x3e\\n        \x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22dun\\\x22\x3eDUN\x3c\\\/label\x3e\\n        \x3cselect id\x3d\\\x22dun\\\x22\x3e\x3coption value\x3d\\\x22\\\x22\x3ePilih DUN\\u2026\x3c\\\/option\x3e\x3c\\\/select\x3e\\n      \x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n  \x3c\\\/section\x3e\\n\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2 class\x3d\\\x22req\\\x22\x3eStatus Kesan Banjir\x3c\\\/h2\x3e\\n    \x3cdiv class\x3d\\\x22opts\\\x22 role\x3d\\\x22radiogroup\\\x22 aria-label\x3d\\\x22Status kesan banjir\\\x22\x3e\\n      \x3cinput type\x3d\\\x22radio\\\x22 name\x3d\\\x22kesan\\\x22 id\x3d\\\x22kA\\\x22 value\x3d\\\x22A\\\x22\x3e\\n      \x3clabel for\x3d\\\x22kA\\\x22\x3e\x3cspan class\x3d\\\x22k\\\x22\x3eA\x3c\\\/span\x3e\x3cspan class\x3d\\\x22t\\\x22\x3eRumah ditenggelami air dan berpindah\x3c\\\/span\x3e\x3c\\\/label\x3e\\n      \x3cinput type\x3d\\\x22radio\\\x22 name\x3d\\\x22kesan\\\x22 id\x3d\\\x22kB\\\x22 value\x3d\\\x22B\\\x22\x3e\\n      \x3clabel for\x3d\\\x22kB\\\x22\x3e\x3cspan class\x3d\\\x22k\\\x22\x3eB\x3c\\\/span\x3e\x3cspan class\x3d\\\x22t\\\x22\x3eRumah dinaiki air \x26amp; tidak berpindah\x3c\\\/span\x3e\x3c\\\/label\x3e\\n      \x3cinput type\x3d\\\x22radio\\\x22 name\x3d\\\x22kesan\\\x22 id\x3d\\\x22kC\\\x22 value\x3d\\\x22C\\\x22\x3e\\n      \x3clabel for\x3d\\\x22kC\\\x22\x3e\x3cspan class\x3d\\\x22k\\\x22\x3eC\x3c\\\/span\x3e\x3cspan class\x3d\\\x22t\\\x22\x3eTerperangkap jalan utama \x26amp; pejabat\x3c\\\/span\x3e\x3c\\\/label\x3e\\n    \x3c\\\/div\x3e\\n    \x3cdiv id\x3d\\\x22wrapPps\\\x22 class\x3d\\\x22hidden\\\x22\x3e\\n      \x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22pps\\\x22\x3eLokasi Pemindahan (PPS)\x3c\\\/label\x3e\\n      \x3cinput type\x3d\\\x22text\\\x22 id\x3d\\\x22pps\\\x22 class\x3d\\\x22up\\\x22 list\x3d\\\x22dl-pps\\\x22 placeholder\x3d\\\x22cth. SMK Baroh Pial\\\x22\x3e\\n    \x3c\\\/div\x3e\\n\\n  \x3c\\\/section\x3e\\n\x3c\\\/form\x3e\\n\x3c\\\/main\x3e\\n\\n\x3cdiv class\x3d\\\x22bar\\\x22 id\x3d\\\x22formBar\\\x22\x3e\x3cbutton class\x3d\\\x22btn primary\\\x22 id\x3d\\\x22btnSubmit\\\x22 form\x3d\\\x22f\\\x22 type\x3d\\\x22submit\\\x22\x3eHantar Rekod\x3c\\\/button\x3e\x3c\\\/div\x3e\\n\\n\\n\x3cdiv id\x3d\\\x22mapSheet\\\x22 role\x3d\\\x22dialog\\\x22 aria-modal\x3d\\\x22true\\\x22 aria-label\x3d\\\x22Pilih lokasi\\\x22\x3e\\n  \x3cdiv class\x3d\\\x22mhead\\\x22\x3e\x3cbutton type\x3d\\\x22button\\\x22 id\x3d\\\x22mClose\\\x22\x3e✕ Tutup\x3c\\\/button\x3e\x3cb\x3ePilih Lokasi\x3c\\\/b\x3e\x3c\\\/div\x3e\\n  \x3cdiv id\x3d\\\x22map\\\x22\x3e\x3c\\\/div\x3e\\n  \x3cdiv class\x3d\\\x22mfoot\\\x22\x3e\\n    \x3cdiv id\x3d\\\x22mapMsg\\\x22\x3eTekan pada peta atau guna GPS telefon.\x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22row\\\x22\x3e\\n      \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn\\\x22 id\x3d\\\x22mLocate\\\x22\x3e◎ GPS Saya\x3c\\\/button\x3e\\n      \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn primary\\\x22 id\x3d\\\x22mUse\\\x22 disabled\x3eGuna Lokasi Ini\x3c\\\/button\x3e\\n    \x3c\\\/div\x3e\\n  \x3c\\\/div\x3e\\n\x3c\\\/div\x3e\\n\\n\x3cdiv class\x3d\\\x22toast\\\x22 id\x3d\\\x22toast\\\x22\x3e\x3c\\\/div\x3e\\n\\n\x3cdatalist id\x3d\\\x22dl-kawasan\\\x22\x3e\x3c\\\/datalist\x3e\x3cdatalist id\x3d\\\x22dl-projek\\\x22\x3e\x3c\\\/datalist\x3e\x3cdatalist id\x3d\\\x22dl-mukim\\\x22\x3e\x3c\\\/datalist\x3e\\n\x3cdatalist id\x3d\\\x22dl-daerah\\\x22\x3e\x3c\\\/datalist\x3e\x3cdatalist id\x3d\\\x22dl-dun\\\x22\x3e\x3c\\\/datalist\x3e\x3cdatalist id\x3d\\\x22dl-parlimen\\\x22\x3e\x3c\\\/datalist\x3e\\n\x3cdatalist id\x3d\\\x22dl-pps\\\x22\x3e\x3c\\\/datalist\x3e\\n\\n\x3cscript src\x3d\\\x22https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.js\\\x22\x3e\x3c\\\/script\x3e\\n\x3cscript\x3e\\n  const $ \x3d id \x3d\x3e document.getElementById(id);\\n  const radio \x3d n \x3d\x3e (document.querySelector(\x27input\x5bname\x3d\\\x22\x27 + n + \x27\\\x22\x5d:checked\x27) || \x7b\x7d).value || \x27\x27;\\n  let coords \x3d null, temp \x3d null, map \x3d null, marker \x3d null;\\n\\n   \\n  (function init()\x7b\\n    const d \x3d new Date(), p \x3d n \x3d\x3e String(n).padStart(2, \x270\x27);\\n    $(\x27tarikh\x27).value \x3d d.getFullYear() + \x27-\x27 + p(d.getMonth() + 1) + \x27-\x27 + p(d.getDate());\\n    google.script.run.withSuccessHandler(fillLists).getOptions();\\n  \x7d)();\\n\\n  function fillLists(o)\x7b\\n    const ids \x3d \x7bkawasan:\x27dl-kawasan\x27, projek:\x27dl-projek\x27, mukim:\x27dl-mukim\x27, daerah:\x27dl-daerah\x27,\\n                 dun:\x27dl-dun\x27, parlimen:\x27dl-parlimen\x27, pps:\x27dl-pps\x27\x7d;\\n    Object.keys(ids).forEach(k \x3d\x3e \x7b\\n      $(ids\x5bk\x5d).innerHTML \x3d (o\x5bk\x5d || \x5b\x5d).map(v \x3d\x3e \x27\x3coption value\x3d\\\x22\x27 + v.replace(\/\\\x22\/g, \x27\x26quot;\x27) + \x27\\\x22\x3e\x27).join(\x27\x27);\\n    \x7d);\\n    fillRef(o);\\n  \x7d\\n\\n   \\n  var REF \x3d null;\\n  function escH(s)\x7b return String(s \x3d\x3d null ? \x27\x27 : s).replace(\/\x5b\x26\x3c\x3e\\\x22\x5d\/g, function(c)\x7b return \x7b\x27\x26\x27:\x27\x26amp;\x27,\x27\x3c\x27:\x27\x26lt;\x27,\x27\x3e\x27:\x27\x26gt;\x27,\x27\\\x22\x27:\x27\x26quot;\x27\x7d\x5bc\x5d; \x7d); \x7d\\n  function optHtml(v, t)\x7b return \x27\x3coption value\x3d\\\x22\x27 + escH(v) + \x27\\\x22\x3e\x27 + escH(t) + \x27\x3c\\\/option\x3e\x27; \x7d\\n  function hasOpt(el, v)\x7b return Array.prototype.some.call(el.options, function(o)\x7b return o.value \x3d\x3d\x3d v; \x7d); \x7d\\n\\n  function fillRef(o)\x7b\\n    REF \x3d (o.ref \x26\x26 o.ref.jajahan \x26\x26 o.ref.jajahan.length) ? o.ref : null;\\n    var curD \x3d $(\x27daerah\x27).value, curP \x3d $(\x27parlimen\x27).value;\\n    var jaj \x3d REF ? REF.jajahan : (o.daerah || \x5b\x5d);\\n    $(\x27daerah\x27).innerHTML \x3d \x27\x3coption value\x3d\\\x22\\\x22\x3ePilih jajahan\\u2026\x3c\\\/option\x3e\x27 + jaj.map(function(j)\x7b return optHtml(j, j); \x7d).join(\x27\x27);\\n    if (curD \x26\x26 hasOpt($(\x27daerah\x27), curD)) $(\x27daerah\x27).value \x3d curD;\\n    var par \x3d REF ? REF.parlimen : (o.parlimen || \x5b\x5d).map(function(p)\x7b return \x7bkod: \x27\x27, nama: p\x7d; \x7d);\\n    $(\x27parlimen\x27).innerHTML \x3d \x27\x3coption value\x3d\\\x22\\\x22\x3ePilih parlimen\\u2026\x3c\\\/option\x3e\x27 + par.map(function(p)\x7b\\n      return optHtml(p.nama, (p.kod ? p.kod + \x27 \x27 : \x27\x27) + p.nama); \x7d).join(\x27\x27);\\n    if (curP \x26\x26 hasOpt($(\x27parlimen\x27), curP)) $(\x27parlimen\x27).value \x3d curP;\\n    onDaerah();\\n  \x7d\\n\\n  function fillMukim()\x7b\\n    var j \x3d $(\x27daerah\x27).value, el \x3d $(\x27mukim\x27), cur \x3d el.value;\\n    var list \x3d (REF \x26\x26 j) ? (REF.mukim\x5bj\x5d || \x5b\x5d) : \x5b\x5d;\\n    el.innerHTML \x3d \x27\x3coption value\x3d\\\x22\\\x22\x3e\x27 + (j ? \x27Pilih mukim\\u2026\x27 : \x27Pilih jajahan dahulu\x27) + \x27\x3c\\\/option\x3e\x27 +\\n      list.map(function(m)\x7b return optHtml(m, m); \x7d).join(\x27\x27);\\n    el.disabled \x3d !j;\\n    if (cur \x26\x26 hasOpt(el, cur)) el.value \x3d cur;\\n  \x7d\\n\\n  \\nfunction dunsFor(j)\x7b\\n  var duns \x3d REF ? REF.dun : \x5b\x5d;\\n  if (!j || !duns.some(function(d)\x7b return d.jaj \x26\x26 d.jaj.length; \x7d)) return duns;\\n  return duns.filter(function(d)\x7b return !d.jaj || !d.jaj.length || d.jaj.indexOf(j) \x3e -1; \x7d);\\n\x7d\\nfunction fillParlimen()\x7b\\n  if (!REF) return;\\n  var el \x3d $(\x27parlimen\x27), cur \x3d el.value, j \x3d $(\x27daerah\x27).value, ada \x3d \x7b\x7d;\\n  dunsFor(j).forEach(function(d)\x7b ada\x5bd.parlimen\x5d \x3d 1; \x7d);\\n  var list \x3d REF.parlimen.filter(function(pr)\x7b return ada\x5bpr.nama\x5d; \x7d);\\n  el.innerHTML \x3d \x27\x3coption value\x3d\\\x22\\\x22\x3ePilih parlimen\\u2026\x3c\\\/option\x3e\x27 + list.map(function(pr)\x7b\\n    return optHtml(pr.nama, (pr.kod ? pr.kod + \x27 \x27 : \x27\x27) + pr.nama); \x7d).join(\x27\x27);\\n  if (cur \x26\x26 hasOpt(el, cur)) el.value \x3d cur;\\n  else if (j \x26\x26 list.length \x3d\x3d\x3d 1) el.value \x3d list\x5b0\x5d.nama;\\n\x7d\\nfunction fillDun()\x7b\\n  var p \x3d $(\x27parlimen\x27).value, el \x3d $(\x27dun\x27), cur \x3d el.value, duns \x3d dunsFor($(\x27daerah\x27).value);\\n  var html \x3d \x27\x3coption value\x3d\\\x22\\\x22\x3ePilih DUN\\u2026\x3c\\\/option\x3e\x27;\\n  if (p) \x7b\\n    html +\x3d duns.filter(function(d)\x7b return d.parlimen \x3d\x3d\x3d p; \x7d).map(function(d)\x7b return optHtml(d.nama, d.kod + \x27 \x27 + d.nama); \x7d).join(\x27\x27);\\n  \x7d else if (REF) \x7b\\n    REF.parlimen.forEach(function(pr)\x7b\\n      var ds \x3d duns.filter(function(d)\x7b return d.parlimen \x3d\x3d\x3d pr.nama; \x7d);\\n      if (!ds.length) return;\\n      html +\x3d \x27\x3coptgroup label\x3d\\\x22\x27 + escH(pr.kod + \x27 \x27 + pr.nama) + \x27\\\x22\x3e\x27 +\\n        ds.map(function(d)\x7b return optHtml(d.nama, d.kod + \x27 \x27 + d.nama); \x7d).join(\x27\x27) + \x27\x3c\\\/optgroup\x3e\x27;\\n    \x7d);\\n  \x7d\\n  el.innerHTML \x3d html;\\n  if (cur \x26\x26 hasOpt(el, cur)) el.value \x3d cur;\\n\x7d\\n\\nfunction onDaerah()\x7b fillMukim(); fillParlimen(); fillDun(); \x7d\\n\\n  function pickOpt(id, v)\x7b\\n    var el \x3d $(id), s \x3d String(v || \x27\x27).toUpperCase().trim();\\n    if (!s) return false;\\n    var tries \x3d \x5bs, s.replace(\/^(MUKIM|BANDAR|PEKAN|DAERAH|JAJAHAN)\\\\s+\/, \x27\x27)\x5d;\\n    for (var i \x3d 0; i \x3c tries.length; i++) if (hasOpt(el, tries\x5bi\x5d)) \x7b el.value \x3d tries\x5bi\x5d; return true; \x7d\\n    var hit \x3d Array.prototype.find.call(el.options, function(o)\x7b return o.value \x26\x26 (o.value.indexOf(tries\x5b1\x5d) \x3e -1 || tries\x5b1\x5d.indexOf(o.value) \x3e -1); \x7d);\\n    if (hit) \x7b el.value \x3d hit.value; return true; \x7d\\n    return false;\\n  \x7d\\n\\n  $(\x27daerah\x27).addEventListener(\x27change\x27, onDaerah);\\n  $(\x27parlimen\x27).addEventListener(\x27change\x27, fillDun);\\n  $(\x27dun\x27).addEventListener(\x27change\x27, function()\x7b\\n  var v \x3d this.value, d \x3d REF \x26\x26 REF.dun.filter(function(x)\x7b return x.nama \x3d\x3d\x3d v; \x7d)\x5b0\x5d;\\n  if (!d) return;\\n  \\n  if (!$(\x27daerah\x27).value \x26\x26 d.jaj \x26\x26 d.jaj.length \x3d\x3d\x3d 1 \x26\x26 hasOpt($(\x27daerah\x27), d.jaj\x5b0\x5d)) \x7b $(\x27daerah\x27).value \x3d d.jaj\x5b0\x5d; onDaerah(); \x7d\\n  if ($(\x27parlimen\x27).value !\x3d\x3d d.parlimen)\x7b $(\x27parlimen\x27).value \x3d d.parlimen; fillDun(); \x7d\\n  $(\x27dun\x27).value \x3d v;\\n\x7d);\\n\\n   \\n  document.querySelectorAll(\x27input\x5bname\x3dkategori\x5d\x27).forEach(r \x3d\x3e r.addEventListener(\x27change\x27, () \x3d\x3e \x7b\\n    $(\x27wrapStaf\x27).classList.toggle(\x27hidden\x27, radio(\x27kategori\x27) !\x3d\x3d \x27STAF\x27);\\n  \x7d));\\n  document.querySelectorAll(\x27input\x5bname\x3dkesan\x5d\x27).forEach(r \x3d\x3e r.addEventListener(\x27change\x27, () \x3d\x3e \x7b\\n    $(\x27wrapPps\x27).classList.toggle(\x27hidden\x27, radio(\x27kesan\x27) !\x3d\x3d \x27A\x27);\\n  \x7d));\\n\\n   \\n  $(\x27kp\x27).addEventListener(\x27input\x27, e \x3d\x3e \x7b\\n    const v \x3d e.target.value.replace(\/\\\\D\/g, \x27\x27).slice(0, 12);\\n    e.target.value \x3d v.length \x3e 8 ? v.slice(0,6)+\x27-\x27+v.slice(6,8)+\x27-\x27+v.slice(8) : v.length \x3e 6 ? v.slice(0,6)+\x27-\x27+v.slice(6) : v;\\n  \x7d);\\n  $(\x27tel\x27).addEventListener(\x27input\x27, e \x3d\x3e \x7b\\n    const v \x3d e.target.value.replace(\/\\\\D\/g, \x27\x27).slice(0, 11);\\n    e.target.value \x3d v.length \x3e 3 ? v.slice(0,3) + \x27-\x27 + v.slice(3) : v;\\n  \x7d);\\n\\n   \\n  $(\x27btnMap\x27).onclick \x3d openMap;\\n  $(\x27mClose\x27).onclick \x3d () \x3d\x3e $(\x27mapSheet\x27).classList.remove(\x27open\x27);\\n  $(\x27mLocate\x27).onclick \x3d locateMe;\\n  $(\x27mUse\x27).onclick \x3d useLocation;\\n\\n  function openMap()\x7b\\n    $(\x27mapSheet\x27).classList.add(\x27open\x27);\\n    if (!window.L)\x7b $(\x27mapMsg\x27).textContent \x3d \x27Peta gagal dimuat. Semak sambungan internet.\x27; return; \x7d\\n    if (!map)\x7b\\n      L.Icon.Default.imagePath \x3d \x27https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/images\/\x27;\\n      map \x3d L.map(\x27map\x27).setView(\x5b5.45, 102.05\x5d, 9);   \\n      L.tileLayer(\x27https:\/\/\x7bs\x7d.tile.openstreetmap.org\/\x7bz\x7d\/\x7bx\x7d\/\x7by\x7d.png\x27,\\n        \x7bmaxZoom: 19, attribution: \x27© OpenStreetMap\x27\x7d).addTo(map);\\n      map.on(\x27click\x27, e \x3d\x3e setMarker(e.latlng.lat, e.latlng.lng, null, \x27PETA\x27));\\n      if (coords)\x7b setMarker(coords.lat, coords.lng); map.setView(\x5bcoords.lat, coords.lng\x5d, 17); \x7d\\n      else locateMe();\\n    \x7d\\n    setTimeout(() \x3d\x3e map.invalidateSize(), 80);\\n  \x7d\\n\\n  function setMarker(lat, lng, acc, src)\x7b\\n    temp \x3d \x7blat, lng, acc: acc || null, src: src || \x27PETA\x27\x7d;\\n    if (!marker)\x7b\\n      marker \x3d L.marker(\x5blat, lng\x5d, \x7bdraggable: true\x7d).addTo(map);\\n      marker.on(\x27dragend\x27, () \x3d\x3e \x7b const ll \x3d marker.getLatLng(); setMarker(ll.lat, ll.lng, null, \x27PETA\x27); \x7d);\\n    \x7d else marker.setLatLng(\x5blat, lng\x5d);\\n    $(\x27mapMsg\x27).textContent \x3d lat.toFixed(6) + \x27, \x27 + lng.toFixed(6) + (acc ? \x27 · ±\x27 + Math.round(acc) + \x27 m\x27 : \x27\x27) + \x27 · seret pin untuk laraskan\x27;\\n    $(\x27mUse\x27).disabled \x3d false;\\n  \x7d\\n\\n  function locateMe()\x7b\\n    if (!navigator.geolocation)\x7b $(\x27mapMsg\x27).textContent \x3d \x27GPS tidak disokong. Tekan pada peta.\x27; return; \x7d\\n    $(\x27mapMsg\x27).textContent \x3d \x27Mencari lokasi GPS\\u2026\x27;\\n    navigator.geolocation.getCurrentPosition(\\n      p \x3d\x3e \x7b setMarker(p.coords.latitude, p.coords.longitude, p.coords.accuracy, \x27GPS\x27); map.setView(\x5bp.coords.latitude, p.coords.longitude\x5d, 17); \x7d,\\n      () \x3d\x3e \x7b $(\x27mapMsg\x27).textContent \x3d \x27Akses GPS ditolak\/gagal. Tekan pada peta untuk pilih lokasi.\x27; \x7d,\\n      \x7benableHighAccuracy: true, timeout: 15000, maximumAge: 0\x7d);\\n  \x7d\\n\\n  function useLocation()\x7b\\n    if (!temp) return;\\n    coords \x3d temp;\\n    $(\x27mapSheet\x27).classList.remove(\x27open\x27);\\n    $(\x27coordChip\x27).textContent \x3d coords.lat.toFixed(5) + \x27, \x27 + coords.lng.toFixed(5) + (coords.acc ? \x27 · ±\x27 + Math.round(coords.acc) + \x27 m\x27 : \x27\x27);\\n    $(\x27coordChip\x27).classList.remove(\x27hidden\x27);\\n    toast(\x27Mendapatkan alamat\\u2026\x27);\\n    google.script.run\\n      .withSuccessHandler(g \x3d\x3e \x7b\\n        if (!g)\x7b toast(\x27Alamat tidak dijumpai. Sila isi manual.\x27, true); return; \x7d\\n        if (g.alamat)\x7b $(\x27alamat\x27).value \x3d g.alamat; if (coords) coords.geo \x3d g.alamat; \x7d\\n        if (g.daerah \x26\x26 pickOpt(\x27daerah\x27, g.daerah)) onDaerah();\\n        if (g.mukim \x26\x26 !$(\x27mukim\x27).disabled) pickOpt(\x27mukim\x27, g.mukim);\\n        toast(\x27Alamat diisi. Sila semak.\x27);\\n      \x7d)\\n      .withFailureHandler(e \x3d\x3e toast(\x27Gagal dapatkan alamat: \x27 + e.message, true))\\n      .reverseGeocode(coords.lat, coords.lng);\\n  \x7d\\n\\n   \\n  $(\x27f\x27).addEventListener(\x27submit\x27, e \x3d\x3e \x7b\\n    e.preventDefault();\\n    document.querySelectorAll(\x27.bad\x27).forEach(x \x3d\x3e x.classList.remove(\x27bad\x27));\\n    const d \x3d \x7b\\n      tarikh: $(\x27tarikh\x27).value, kawasan: $(\x27kawasan\x27).value, projek: $(\x27projek\x27).value,\\n      nama: $(\x27nama\x27).value, kategori: radio(\x27kategori\x27), noStaf: $(\x27noStaf\x27).value,\\n      kp: $(\x27kp\x27).value, tel: $(\x27tel\x27).value, alamat: $(\x27alamat\x27).value, mukim: $(\x27mukim\x27).value,\\n      daerah: $(\x27daerah\x27).value, dun: $(\x27dun\x27).value, parlimen: $(\x27parlimen\x27).value,\\n      kesan: radio(\x27kesan\x27), pps: $(\x27pps\x27).value, catatan: \x27\x27,\\n      lat: coords ? coords.lat : \x27\x27, lng: coords ? coords.lng : \x27\x27,\\n      acc: coords \x26\x26 coords.acc ? coords.acc : \x27\x27, src: coords ? coords.src : \x27\x27, geo: coords \x26\x26 coords.geo ? coords.geo : \x27\x27\\n    \x7d;\\n    const errs \x3d \x5b\x5d;\\n    const need \x3d (ok, id, msg) \x3d\x3e \x7b if (!ok)\x7b errs.push(msg); if (id) $(id).classList.add(\x27bad\x27); \x7d \x7d;\\n    need(d.tarikh, \x27tarikh\x27, \x27Tarikh\x27);\\n    need(d.nama.trim(), \x27nama\x27, \x27Nama\x27);\\n    need(d.kategori, null, \x27Kategori\x27);\\n    if (d.kategori \x3d\x3d\x3d \x27STAF\x27) need(d.noStaf.trim(), \x27noStaf\x27, \x27No. Staf\x27);\\n    need(\/^\\\\d\x7b6\x7d-\\\\d\x7b2\x7d-\\\\d\x7b4\x7d$\/.test(d.kp), \x27kp\x27, \x27No. K\/P (12 digit)\x27);\\n    need(d.alamat.trim(), \x27alamat\x27, \x27Alamat\x27);\\n    need(d.daerah.trim(), \x27daerah\x27, \x27Daerah\x27);\\n    need(d.kesan, null, \x27Status kesan\x27);\\n    if (d.kesan \x3d\x3d\x3d \x27A\x27) need(d.pps.trim(), \x27pps\x27, \x27Lokasi pemindahan\x27);\\n    if (errs.length)\x7b toast(\x27Sila lengkapkan: \x27 + errs.join(\x27, \x27), true); return; \x7d\\n\\n    const btn \x3d $(\x27btnSubmit\x27);\\n    btn.disabled \x3d true; btn.textContent \x3d \x27Menghantar\\u2026\x27;\\n    google.script.run\\n      .withSuccessHandler(r \x3d\x3e \x7b\\n        btn.disabled \x3d false; btn.textContent \x3d \x27Hantar Rekod\x27;\\n        toast(\x27✓ Disimpan: BIL \x27 + r.bil + \x27 · \x27 + r.nama + (r.gps ? \x27 · GPS direkod\x27 : \x27\x27));\\n        if (window.D) D.at \x3d 1;\\n        resetPerson();\\n        google.script.run.withSuccessHandler(fillLists).getOptions();\\n      \x7d)\\n      .withFailureHandler(err \x3d\x3e \x7b\\n        btn.disabled \x3d false; btn.textContent \x3d \x27Hantar Rekod\x27;\\n        toast(err.message || \x27Gagal menyimpan.\x27, true);\\n      \x7d)\\n      .submitEntry(d);\\n  \x7d);\\n\\n  \\n  function resetPerson()\x7b\\n    \x5b\x27nama\x27,\x27noStaf\x27,\x27kp\x27,\x27tel\x27,\x27alamat\x27,\x27mukim\x27,\x27daerah\x27,\x27dun\x27,\x27parlimen\x27,\x27pps\x27\x5d.forEach(id \x3d\x3e $(id).value \x3d \x27\x27); onDaerah();\\n    document.querySelectorAll(\x27input\x5bname\x3dkategori\x5d,input\x5bname\x3dkesan\x5d\x27).forEach(r \x3d\x3e r.checked \x3d false);\\n    $(\x27wrapStaf\x27).classList.add(\x27hidden\x27); $(\x27wrapPps\x27).classList.add(\x27hidden\x27);\\n    coords \x3d null; temp \x3d null; $(\x27coordChip\x27).classList.add(\x27hidden\x27);\\n    if (marker)\x7b marker.remove(); marker \x3d null; \x7d $(\x27mUse\x27).disabled \x3d true;\\n    window.scrollTo(\x7btop: 0, behavior: \x27smooth\x27\x7d);\\n  \x7d\\n\\n  let tt;\\n  function toast(msg, err)\x7b\\n    const t \x3d $(\x27toast\x27); t.textContent \x3d msg; t.classList.toggle(\x27err\x27, !!err); t.classList.add(\x27show\x27);\\n    clearTimeout(tt); tt \x3d setTimeout(() \x3d\x3e t.classList.remove(\x27show\x27), err ? 5000 : 3200);\\n  \x7d\\n\x3c\\\/script\x3e\\n\x3cscript\x3e\\n  (function()\x7b\\n    function apply(t)\x7b\\n      document.documentElement.setAttribute(\x27data-theme\x27, t);\\n      var m \x3d document.querySelector(\x27meta\x5bname\x3dtheme-color\x5d\x27);\\n      if (m) m.setAttribute(\x27content\x27, t \x3d\x3d\x3d \x27dark\x27 ? \x27#121212\x27 : \x27#f7f7f7\x27);\\n    \x7d\\n    apply(document.documentElement.getAttribute(\x27data-theme\x27) || \x27light\x27);\\n    document.getElementById(\x27themeBtn\x27).onclick \x3d function()\x7b\\n      var t \x3d document.documentElement.getAttribute(\x27data-theme\x27) \x3d\x3d\x3d \x27dark\x27 ? \x27light\x27 : \x27dark\x27;\\n      apply(t);\\n      try \x7b localStorage.setItem(\x27mb-theme\x27, t); \x7d catch (e) \x7b\x7d\\n      if (window.D \x26\x26 D.rows \x26\x26 D.rows.length \x26\x26 !document.getElementById(\x27viewDash\x27).classList.contains(\x27hidden\x27)) renderDash();\\n    \x7d;\\n  \x7d)();\\n\x3c\\\/script\x3e\\n\x3cscript\x3evar START_VIEW \x3d \x27form\x27;\x3c\\\/script\x3e\\n\x3cscript src\x3d\\\x22https:\/\/cdn.jsdelivr.net\/npm\/compressorjs@1.4.0\/dist\/compressor.min.js\\\x22\x3e\x3c\\\/script\x3e\\n\x3cstyle\x3e\\n  .g2b\x3ediv\x7bdisplay:flex;flex-direction:column;justify-content:flex-end;min-width:0\x7d\\n  .g2b input\x5btype\x3ddate\x5d\x7bmin-width:0\x7d\\n  #pTarikh\x7bmin-width:0\x7d\\n  .ig\x7bdisplay:flex;align-items:stretch\x7d\\n  .ig input\x7bborder-top-right-radius:0;border-bottom-right-radius:0;min-width:0\x7d\\n  .ig span\x7bdisplay:flex;align-items:center;padding:0 12px;font-size:12.5px;font-weight:500;color:var(--muted);background:var(--sunk);\\n    border:1px solid var(--line);border-left:0;border-radius:0 10px 10px 0;white-space:nowrap\x7d\\n  input\x5breadonly\x5d\x7bbackground:var(--sunk);color:var(--muted);box-shadow:none\x7d\\n  input\x5btype\x3dnumber\x5d\x7b-moz-appearance:textfield\x7d\\n  input\x5btype\x3dnumber\x5d::-webkit-outer-spin-button,input\x5btype\x3dnumber\x5d::-webkit-inner-spin-button\x7b-webkit-appearance:none;margin:0\x7d\\n  .pinfo\x7bdisplay:flex;flex-wrap:wrap;gap:6px;margin-top:10px\x7d\\n  .pinfo span\x7bfont-size:11.5px;font-weight:500;color:var(--muted);background:var(--sunk);border:1px solid var(--line);border-radius:6px;padding:1px 7px\x7d\\n  .drop\x7bdisplay:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;min-height:96px;padding:14px;\\n    border:1.5px dashed var(--line2);border-radius:12px;background:var(--sunk);color:var(--muted);text-align:center;cursor:pointer;font-size:12.5px\x7d\\n  .drop b\x7bcolor:var(--acc5);font-size:13.5px;font-weight:600\x7d\\n  .drop svg\x7bwidth:22px;height:22px;color:var(--acc5)\x7d\\n  .thumbs\x7bdisplay:grid;grid-template-columns:repeat(auto-fill,minmax(88px,1fr));gap:8px;margin-top:10px\x7d\\n  .th\x7bposition:relative;aspect-ratio:1;border-radius:10px;overflow:hidden;border:1px solid var(--line);background:var(--sunk)\x7d\\n  .th img\x7bwidth:100%;height:100%;object-fit:cover;display:block\x7d\\n  .th button\x7bposition:absolute;top:4px;right:4px;width:24px;height:24px;border-radius:50%;border:0;background:rgb(0 0 0 \/ .6);color:#fff;\\n    font-size:14px;line-height:24px;padding:0;cursor:pointer\x7d\\n  .th i\x7bposition:absolute;left:0;right:0;bottom:0;padding:2px 6px;font:600 10.5px var(--font);font-style:normal;color:#fff;background:rgb(0 0 0 \/ .55)\x7d\\n  .th.ok i\x7bbackground:rgb(21 128 61 \/ .85)\x7d .th.err i\x7bbackground:rgb(193 29 35 \/ .9)\x7d\\n  .done\x7btext-align:center;padding:22px 14px\x7d\\n  .done .tick\x7bwidth:48px;height:48px;border-radius:50%;margin:0 auto 10px;display:grid;place-items:center;color:#fff;\\n    background:linear-gradient(180deg,#22a35a,#178a47);box-shadow:inset 0 1px 0 rgb(255 255 255 \/ .25)\x7d\\n  .done .tick svg\x7bwidth:24px;height:24px\x7d\\n  .done h3\x7bmargin:0;font-size:16px;font-weight:600\x7d\\n  .done p\x7bmargin:4px 0 14px;color:var(--muted);font-size:13px\x7d\\n  .done .row\x7bdisplay:grid;gap:8px\x7d\\n  .qrbox\x7bdisplay:flex;flex-direction:column;align-items:center;gap:4px;margin:18px auto 0;max-width:340px;text-align:center\x7d\\n  .qrimg\x7bbox-sizing:border-box;width:264px;max-width:100%;aspect-ratio:1;padding:12px;margin:0 auto;background:#fff;border-radius:14px;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;box-shadow:var(--sh-card)\x7d\\n  .qrimg canvas\x7bwidth:100%!important;height:100%!important;display:block;margin:0\x7d\\n  .qrload\x7bfont-size:12px;color:#737373;text-align:center;padding:0 12px\x7d\\n  .qrbox b\x7bmargin-top:8px;font-size:13.5px;font-weight:600\x7d\\n  .qrbox small\x7bfont-size:12px;color:var(--muted);line-height:1.45\x7d\\n  .qrbox small.warn\x7bcolor:#c11d23\x7d\\n  .qrtgl\x7bdisplay:block;margin:12px auto 0;border:0;background:none;font:inherit;font-size:12.5px;font-weight:600;color:var(--acc5);cursor:pointer;padding:4px 8px\x7d\\n  .btn.wa\x7bbackground:linear-gradient(180deg,#25d366,#1ebe5b);color:#fff;border:0;text-decoration:none;box-shadow:0 1px 2px rgb(0 0 0 \/ .2),inset 0 1px 0 rgb(255 255 255 \/ .2)\x7d\\n  .notes\x7bfont-size:12px;color:var(--muted);line-height:1.5\x7d\\n  .notes ol\x7bmargin:4px 0 0;padding-left:18px\x7d\\n\x3c\\\/style\x3e\\n\\n\x3cmain id\x3d\\\x22viewProj\\\x22 class\x3d\\\x22hidden\\\x22\x3e\\n\x3cform id\x3d\\\x22fp\\\x22 novalidate autocomplete\x3d\\\x22off\\\x22\x3e\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2\x3eLaporan Projek Terjejas Banjir\x3c\\\/h2\x3e\\n    \x3cp class\x3d\\\x22hint\\\x22 style\x3d\\\x22margin-top:4px\\\x22\x3eLaporan projek terjejas banjir dan hujan lebat. Hantar setiap hari sebelum 1:00 petang. Sila muat naik gambar projek terjejas jika ada.\x3c\\\/p\x3e\\n  \x3c\\\/section\x3e\\n\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2\x3eMaklumat Projek\x3c\\\/h2\x3e\\n    \x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22pKawasan\\\x22\x3eKawasan \/ Estet\x3c\\\/label\x3e\\n    \x3cselect id\x3d\\\x22pKawasan\\\x22 required\x3e\x3coption value\x3d\\\x22\\\x22\x3eMemuat\\u2026\x3c\\\/option\x3e\x3c\\\/select\x3e\\n    \x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22pTarikh\\\x22\x3eTarikh\x3c\\\/label\x3e\\n    \x3cinput type\x3d\\\x22date\\\x22 id\x3d\\\x22pTarikh\\\x22 required\x3e\\n    \x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22pProjek\\\x22\x3eProjek\x3c\\\/label\x3e\\n    \x3cselect id\x3d\\\x22pProjek\\\x22 required disabled\x3e\x3coption value\x3d\\\x22\\\x22\x3ePilih kawasan dahulu\x3c\\\/option\x3e\x3c\\\/select\x3e\\n    \x3cdiv class\x3d\\\x22grid2\\\x22\x3e\\n      \x3cdiv\x3e\x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22pKod\\\x22\x3eKod Lokasi\x3c\\\/label\x3e\x3cinput type\x3d\\\x22text\\\x22 id\x3d\\\x22pKod\\\x22 readonly\x3e\x3c\\\/div\x3e\\n      \x3cdiv\x3e\x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22pLuas\\\x22\x3eLuas Ladang\x3c\\\/label\x3e\x3cdiv class\x3d\\\x22ig\\\x22\x3e\x3cinput type\x3d\\\x22text\\\x22 id\x3d\\\x22pLuas\\\x22 readonly\x3e\x3cspan\x3eHektar\x3c\\\/span\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22pinfo\\\x22 id\x3d\\\x22pInfo\\\x22\x3e\x3c\\\/div\x3e\\n  \x3c\\\/section\x3e\\n\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2\x3eKesan Banjir\x3c\\\/h2\x3e\\n    \x3cdiv class\x3d\\\x22grid2 g2b\\\x22\x3e\\n      \x3cdiv\x3e\x3clabel class\x3d\\\x22fl req\\\x22 for\x3d\\\x22pMula\\\x22\x3eTarikh Mula Terjejas\x3c\\\/label\x3e\x3cinput type\x3d\\\x22date\\\x22 id\x3d\\\x22pMula\\\x22 required\x3e\x3c\\\/div\x3e\\n      \x3cdiv\x3e\x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22pLuasT\\\x22\x3eLuas Kawasan Terjejas\x3c\\\/label\x3e\x3cdiv class\x3d\\\x22ig\\\x22\x3e\x3cinput type\x3d\\\x22number\\\x22 id\x3d\\\x22pLuasT\\\x22 inputmode\x3d\\\x22decimal\\\x22 step\x3d\\\x22any\\\x22 min\x3d\\\x220\\\x22\x3e\x3cspan\x3eHektar\x3c\\\/span\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22grid2 g2b\\\x22\x3e\\n      \x3cdiv\x3e\x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22pDalam\\\x22\x3eKedalaman Air\x3c\\\/label\x3e\x3cdiv class\x3d\\\x22ig\\\x22\x3e\x3cinput type\x3d\\\x22number\\\x22 id\x3d\\\x22pDalam\\\x22 inputmode\x3d\\\x22decimal\\\x22 step\x3d\\\x22any\\\x22 min\x3d\\\x220\\\x22\x3e\x3cspan\x3eMeter\x3c\\\/span\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n      \x3cdiv\x3e\x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22pTempoh\\\x22\x3eTempoh Banjir\x3c\\\/label\x3e\x3cdiv class\x3d\\\x22ig\\\x22\x3e\x3cinput type\x3d\\\x22number\\\x22 id\x3d\\\x22pTempoh\\\x22 inputmode\x3d\\\x22numeric\\\x22 step\x3d\\\x221\\\x22 min\x3d\\\x220\\\x22\x3e\x3cspan\x3eHari\x3c\\\/span\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22grid2 g2b\\\x22\x3e\\n      \x3cdiv\x3e\x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22pHI\\\x22\x3eAgg Kehilangan Hasil HI\x3c\\\/label\x3e\x3cdiv class\x3d\\\x22ig\\\x22\x3e\x3cinput type\x3d\\\x22number\\\x22 id\x3d\\\x22pHI\\\x22 inputmode\x3d\\\x22decimal\\\x22 step\x3d\\\x22any\\\x22 min\x3d\\\x220\\\x22\x3e\x3cspan\x3emt\x3c\\\/span\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n      \x3cdiv\x3e\x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22pHHI\\\x22\x3eAgg Kehilangan Hasil HHI \x3cspan style\x3d\\\x22color:var(--muted);font-weight:500\\\x22\x3e(auto)\x3c\\\/span\x3e\x3c\\\/label\x3e\x3cdiv class\x3d\\\x22ig\\\x22\x3e\x3cinput type\x3d\\\x22number\\\x22 id\x3d\\\x22pHHI\\\x22 readonly tabindex\x3d\\\x22-1\\\x22 placeholder\x3d\\\x22Auto\\\x22\x3e\x3cspan\x3emt\x3c\\\/span\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22hint\\\x22\x3eAgg kehilangan hasil berdasarkan agg hasil harian dalam Laporan Hasil Harian. Masukkan data sebenar jika ada.\x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22hint\\\x22 id\x3d\\\x22pHHIHint\\\x22\x3e\x3c\\\/div\x3e\\n    \x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22pInfra\\\x22\x3eKerosakan Infra\x3c\\\/label\x3e\\n    \x3ctextarea id\x3d\\\x22pInfra\\\x22 class\x3d\\\x22up\\\x22 rows\x3d\\\x222\\\x22\x3eTIADA\x3c\\\/textarea\x3e\\n  \x3c\\\/section\x3e\\n\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2 class\x3d\\\x22req\\\x22\x3eKategori\x3c\\\/h2\x3e\\n    \x3cdiv class\x3d\\\x22opts\\\x22 role\x3d\\\x22radiogroup\\\x22 aria-label\x3d\\\x22Kategori\\\x22\x3e\\n      \x3cinput type\x3d\\\x22radio\\\x22 name\x3d\\\x22pKat\\\x22 id\x3d\\\x22pkA\\\x22 value\x3d\\\x22A\\\x22\x3e\\n      \x3clabel for\x3d\\\x22pkA\\\x22\x3e\x3cspan class\x3d\\\x22k\\\x22 style\x3d\\\x22background:var(--a)\\\x22\x3eA\x3c\\\/span\x3e\x3cspan class\x3d\\\x22t\\\x22\x3eKehilangan hasil akibat banjir\x3c\\\/span\x3e\x3c\\\/label\x3e\\n      \x3cinput type\x3d\\\x22radio\\\x22 name\x3d\\\x22pKat\\\x22 id\x3d\\\x22pkB\\\x22 value\x3d\\\x22B\\\x22\x3e\\n      \x3clabel for\x3d\\\x22pkB\\\x22\x3e\x3cspan class\x3d\\\x22k\\\x22 style\x3d\\\x22background:var(--c)\\\x22\x3eB\x3c\\\/span\x3e\x3cspan class\x3d\\\x22t\\\x22\x3eKehilangan hasil akibat hujan lebat\x3c\\\/span\x3e\x3c\\\/label\x3e\\n    \x3c\\\/div\x3e\\n    \x3clabel class\x3d\\\x22fl\\\x22 for\x3d\\\x22pCatatan\\\x22\x3eCatatan\x3c\\\/label\x3e\\n    \x3ctextarea id\x3d\\\x22pCatatan\\\x22 class\x3d\\\x22up\\\x22 rows\x3d\\\x222\\\x22\x3eTIADA\x3c\\\/textarea\x3e\\n  \x3c\\\/section\x3e\\n\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2\x3eGambar \x3cspan class\x3d\\\x22cnt\\\x22 style\x3d\\\x22color:var(--muted);font-weight:500\\\x22\x3e(pilihan)\x3c\\\/span\x3e\x3c\\\/h2\x3e\\n    \x3clabel class\x3d\\\x22drop\\\x22 for\x3d\\\x22pFiles\\\x22\x3e\\n      \x3csvg viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3z\\\x22\/\x3e\x3ccircle cx\x3d\\\x2212\\\x22 cy\x3d\\\x2213\\\x22 r\x3d\\\x223.5\\\x22\/\x3e\x3c\\\/svg\x3e\\n      \x3cb\x3eAmbil \/ pilih gambar\x3c\\\/b\x3e\\n      \x3cspan\x3eJPG, PNG, GIF · maks 10MB setiap satu · boleh pilih banyak\x3c\\\/span\x3e\\n    \x3c\\\/label\x3e\\n    \x3cinput type\x3d\\\x22file\\\x22 id\x3d\\\x22pFiles\\\x22 accept\x3d\\\x22image\/jpeg,image\/png,image\/gif,image\/*\\\x22 multiple style\x3d\\\x22position:absolute;width:1px;height:1px;opacity:0;pointer-events:none\\\x22\x3e\\n    \x3cdiv class\x3d\\\x22thumbs\\\x22 id\x3d\\\x22pThumbs\\\x22\x3e\x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22hint\\\x22 id\x3d\\\x22pAlbumHint\\\x22\x3e\x3c\\\/div\x3e\\n  \x3c\\\/section\x3e\\n\\n  \x3csection class\x3d\\\x22card notes\\\x22\x3e\\n    \x3cb\x3eNota\x3c\\\/b\x3e\\n    \x3col\x3e\\n      \x3cli\x3eSelepas tekan \\\x22Hantar Laporan\\\x22, laporan disimpan ke sheet LAP PROJEK.\x3c\\\/li\x3e\\n      \x3cli\x3eTekan \\\x22Kongsi ke WhatsApp\\\x22 dan pilih group berkaitan (TEAM Hasil Kelantan \/ Penyelia Ladang FB Kelantan).\x3c\\\/li\x3e\\n    \x3c\\\/ol\x3e\\n  \x3c\\\/section\x3e\\n\x3c\\\/form\x3e\\n\\n\x3csection class\x3d\\\x22card done hidden\\\x22 id\x3d\\\x22pDone\\\x22\x3e\\n  \x3cdiv class\x3d\\\x22tick\\\x22\x3e\x3csvg viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222.5\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22m5 12 5 5L20 7\\\x22\/\x3e\x3c\\\/svg\x3e\x3c\\\/div\x3e\\n  \x3ch3\x3eLaporan disimpan\x3c\\\/h3\x3e\\n  \x3cp id\x3d\\\x22pDoneTxt\\\x22\x3e\x3c\\\/p\x3e\\n  \x3cdiv class\x3d\\\x22row\\\x22\x3e\\n    \x3ca class\x3d\\\x22btn wa\\\x22 id\x3d\\\x22pWa\\\x22 href\x3d\\\x22#\\\x22 target\x3d\\\x22_blank\\\x22 rel\x3d\\\x22noopener\\\x22\x3eKongsi ke WhatsApp\x3c\\\/a\x3e\\n    \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn\\\x22 id\x3d\\\x22pNew\\\x22\x3eLaporan baharu\x3c\\\/button\x3e\\n  \x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22qrbox\\\x22 id\x3d\\\x22pQrBox\\\x22\x3e\\n        \x3cdiv class\x3d\\\x22qrimg\\\x22 id\x3d\\\x22pQr\\\x22\x3e\x3cspan class\x3d\\\x22qrload\\\x22\x3eMenjana kod QR\\u2026\x3c\\\/span\x3e\x3c\\\/div\x3e\\n        \x3cb\x3eHantar dari telefon\x3c\\\/b\x3e\\n        \x3csmall\x3eImbas kod QR ini dengan kamera telefon. WhatsApp akan dibuka bersama laporan ini \\u2014 pilih group berkaitan dan tekan Hantar.\x3c\\\/small\x3e\\n        \x3csmall id\x3d\\\x22pQrMsg\\\x22\x3e\x3c\\\/small\x3e\\n      \x3c\\\/div\x3e\\n      \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22qrtgl hidden\\\x22 id\x3d\\\x22pQrShow\\\x22\x3eTunjuk kod QR\x3c\\\/button\x3e\\n\x3c\\\/section\x3e\\n\x3c\\\/main\x3e\\n\\n\x3cdiv class\x3d\\\x22bar hidden\\\x22 id\x3d\\\x22projBar\\\x22\x3e\x3cbutton class\x3d\\\x22btn primary\\\x22 id\x3d\\\x22pSubmit\\\x22 form\x3d\\\x22fp\\\x22 type\x3d\\\x22submit\\\x22\x3eHantar Laporan\x3c\\\/button\x3e\x3c\\\/div\x3e\\n\\n\x3cscript\x3e\\n  var P \x3d \x7blist: \x5b\x5d, loaded: false, files: \x5b\x5d, busy: false, prevHI: null\x7d;\\n\\n  function todayIso()\x7b var d \x3d new Date(), p \x3d function(n)\x7b return String(n).padStart(2, \x270\x27); \x7d; return d.getFullYear() + \x27-\x27 + p(d.getMonth() + 1) + \x27-\x27 + p(d.getDate()); \x7d\\n  function dmy(iso)\x7b var s \x3d String(iso || \x27\x27).split(\x27-\x27); return s.length \x3d\x3d\x3d 3 ? s\x5b2\x5d + \x27\/\x27 + s\x5b1\x5d + \x27\/\x27 + s\x5b0\x5d : iso; \x7d\\n\\n  function setTarikhHariIni()\x7b var t \x3d todayIso(); $(\x27pTarikh\x27).max \x3d t; $(\x27pTarikh\x27).value \x3d t; \x7d\\nfunction loadProjek()\x7b\\n    if (P.loaded) return;\\n    setTarikhHariIni();\\n    if (!$(\x27pMula\x27).value) $(\x27pMula\x27).value \x3d todayIso();\\n    google.script.run\\n      .withSuccessHandler(function(list)\x7b\\n        P.list \x3d list || \x5b\x5d; P.loaded \x3d true;\\n        var kaw \x3d \x5b\x5d;\\n        P.list.forEach(function(x)\x7b if (kaw.indexOf(x.kawasan) \x3c 0) kaw.push(x.kawasan); \x7d);\\n        kaw.sort();\\n        $(\x27pKawasan\x27).innerHTML \x3d \x27\x3coption value\x3d\\\x22\\\x22\x3ePilih kawasan\\u2026\x3c\\\/option\x3e\x27 + kaw.map(function(k)\x7b return optHtml(k, k); \x7d).join(\x27\x27);\\n      \x7d)\\n      .withFailureHandler(function(e)\x7b $(\x27pKawasan\x27).innerHTML \x3d \x27\x3coption value\x3d\\\x22\\\x22\x3eGagal memuat\x3c\\\/option\x3e\x27; toast(e.message, true); \x7d)\\n      .getProjekOptions();\\n  \x7d\\n\\n  function selProjek()\x7b\\n    var k \x3d $(\x27pKawasan\x27).value, p \x3d $(\x27pProjek\x27).value;\\n    return P.list.filter(function(x)\x7b return x.kawasan \x3d\x3d\x3d k \x26\x26 x.projek \x3d\x3d\x3d p; \x7d)\x5b0\x5d || null;\\n  \x7d\\n\\n  $(\x27pKawasan\x27).addEventListener(\x27change\x27, function()\x7b\\n    var k \x3d this.value;\\n    var list \x3d P.list.filter(function(x)\x7b return x.kawasan \x3d\x3d\x3d k; \x7d);\\n    $(\x27pProjek\x27).innerHTML \x3d \x27\x3coption value\x3d\\\x22\\\x22\x3e\x27 + (k ? \x27Pilih projek\\u2026\x27 : \x27Pilih kawasan dahulu\x27) + \x27\x3c\\\/option\x3e\x27 +\\n      list.map(function(x)\x7b return optHtml(x.projek, x.projek); \x7d).join(\x27\x27);\\n    $(\x27pProjek\x27).disabled \x3d !k;\\n    fillProjInfo();\\n  \x7d);\\n  $(\x27pProjek\x27).addEventListener(\x27change\x27, fillProjInfo);\\n\\n  function fillProjInfo()\x7b\\n    var x \x3d selProjek();\\n    $(\x27pKod\x27).value \x3d x ? x.kod : \x27\x27;\\n    $(\x27pLuas\x27).value \x3d x ? x.luas : \x27\x27;\\n    $(\x27pInfo\x27).innerHTML \x3d x ? \x5bx.mukim \x26\x26 \x27Mukim \x27 + x.mukim, x.daerah, x.dun \x26\x26 \x27DUN \x27 + x.dun, x.parlimen \x26\x26 \x27P. \x27 + x.parlimen\x5d\\n      .filter(Boolean).map(function(s)\x7b return \x27\x3cspan\x3e\x27 + escH(s) + \x27\x3c\\\/span\x3e\x27; \x7d).join(\x27\x27) : \x27\x27;\\n    $(\x27pAlbumHint\x27).textContent \x3d x ? \x27Album imgbb: LAPORAN BANJIR 2026 \\u203a \x27 + x.kawasan + \x27 \\u203a \x27 + x.projek : \x27\x27;\\n    loadPrevHI();\\n  \x7d\\n\\n   \\n  function loadPrevHI()\x7b\\n    var x \x3d selProjek();\\n    P.prevHI \x3d null; calcHHI();\\n    if (!x) \x7b $(\x27pHHIHint\x27).textContent \x3d \x27\x27; return; \x7d\\n    $(\x27pHHIHint\x27).textContent \x3d \x27Mengira HHI\\u2026\x27;\\n    var key \x3d x.kawasan + \x27|\x27 + x.projek;\\n    google.script.run\\n      .withSuccessHandler(function(r)\x7b\\n        var y \x3d selProjek();\\n        if (!y || y.kawasan + \x27|\x27 + y.projek !\x3d\x3d key) return;\\n        P.prevHI \x3d r; calcHHI();\\n      \x7d)\\n      .withFailureHandler(function(e)\x7b $(\x27pHHIHint\x27).textContent \x3d \x27Gagal kira HHI: \x27 + e.message; \x7d)\\n      .getHiSebelum(\x7bkawasan: x.kawasan, projek: x.projek, tarikh: $(\x27pTarikh\x27).value || todayIso()\x7d);\\n  \x7d\\n\\n  function calcHHI()\x7b\\n    if (!P.prevHI)\x7b $(\x27pHHI\x27).value \x3d \x27\x27; return; \x7d\\n    var hi \x3d Number($(\x27pHI\x27).value) || 0;\\n    $(\x27pHHI\x27).value \x3d Math.round((P.prevHI.sum + hi) * 1000) \/ 1000;\\n    $(\x27pHHIHint\x27).textContent \x3d \x27HHI \x3d jumlah HI \x27 + P.prevHI.count + \x27 laporan terdahulu (\x27 + P.prevHI.sum + \x27 mt) + HI semasa \x27 + hi + \x27 mt.\x27;\\n  \x7d\\n  $(\x27pHI\x27).addEventListener(\x27input\x27, calcHHI);\\n\\n   \\n  $(\x27pFiles\x27).addEventListener(\x27change\x27, function()\x7b\\n    Array.prototype.forEach.call(this.files, function(f)\x7b\\n      if (!\/^image\\\\\/\/.test(f.type)) \x7b toast(f.name + \x27: bukan fail gambar.\x27, true); return; \x7d\\n      if (f.size \x3e 10 * 1024 * 1024) \x7b toast(f.name + \x27: melebihi 10MB.\x27, true); return; \x7d\\n      P.files.push(\x7bfile: f, url: URL.createObjectURL(f), status: \x27\x27, result: null\x7d);\\n    \x7d);\\n    this.value \x3d \x27\x27;\\n    renderThumbs();\\n  \x7d);\\n\\n  function renderThumbs()\x7b\\n    $(\x27pThumbs\x27).innerHTML \x3d P.files.map(function(x, i)\x7b\\n      return \x27\x3cdiv class\x3d\\\x22th \x27 + (x.status \x3d\x3d\x3d \x27ok\x27 ? \x27ok\x27 : x.status \x3d\x3d\x3d \x27err\x27 ? \x27err\x27 : \x27\x27) + \x27\\\x22\x3e\x3cimg src\x3d\\\x22\x27 + x.url + \x27\\\x22 alt\x3d\\\x22\\\x22\x3e\x27 +\\n        (P.busy ? \x27\x27 : \x27\x3cbutton type\x3d\\\x22button\\\x22 data-i\x3d\\\x22\x27 + i + \x27\\\x22 aria-label\x3d\\\x22Buang gambar\\\x22\x3e×\x3c\\\/button\x3e\x27) +\\n        (x.status ? \x27\x3ci\x3e\x27 + (x.status \x3d\x3d\x3d \x27ok\x27 ? \x27✓ Dimuat naik\x27 : x.status \x3d\x3d\x3d \x27err\x27 ? \x27Gagal\x27 : x.status) + \x27\x3c\\\/i\x3e\x27 : \x27\x27) + \x27\x3c\\\/div\x3e\x27;\\n    \x7d).join(\x27\x27);\\n  \x7d\\n  $(\x27pThumbs\x27).addEventListener(\x27click\x27, function(e)\x7b\\n    var b \x3d e.target.closest(\x27button\x5bdata-i\x5d\x27);\\n    if (!b || P.busy) return;\\n    var i \x3d Number(b.getAttribute(\x27data-i\x27));\\n    URL.revokeObjectURL(P.files\x5bi\x5d.url);\\n    P.files.splice(i, 1);\\n    renderThumbs();\\n  \x7d);\\n\\n  \\n   \\nvar CMP \x3d \x7bquality: 0.7, max: 1600\x7d;\\nfunction fmtSz(b)\x7b return b \x3e\x3d 1048576 ? (b \/ 1048576).toFixed(1) + \x27MB\x27 : Math.max(1, Math.round(b \/ 1024)) + \x27KB\x27; \x7d\\nfunction blobToData(b)\x7b\\n  return new Promise(function(res, rej)\x7b\\n    var fr \x3d new FileReader();\\n    fr.onload \x3d function()\x7b res(fr.result); \x7d;\\n    fr.onerror \x3d function()\x7b rej(new Error(\x27Gagal baca gambar dimampat.\x27)); \x7d;\\n    fr.readAsDataURL(b);\\n  \x7d);\\n\x7d\\nfunction readImage(f)\x7b\\n  \\n  if (f.type \x3d\x3d\x3d \x27image\/gif\x27 || !window.Compressor) return readImageCanvas(f);\\n  return new Promise(function(res, rej)\x7b\\n    new Compressor(f, \x7b\\n      quality: CMP.quality, maxWidth: CMP.max, maxHeight: CMP.max,\\n      mimeType: \x27image\/jpeg\x27, convertSize: 0, checkOrientation: true,\\n      success: function(out)\x7b blobToData(out.size \x3c f.size ? out : f).then(res, rej); \x7d,\\n      error: function()\x7b readImageCanvas(f).then(res, rej); \x7d\\n    \x7d);\\n  \x7d);\\n\x7d\\nfunction readImageCanvas(f)\x7b\\n    return new Promise(function(res, rej)\x7b\\n      if (f.type \x3d\x3d\x3d \x27image\/gif\x27) \x7b\\n        var fr \x3d new FileReader();\\n        fr.onload \x3d function()\x7b res(fr.result); \x7d;\\n        fr.onerror \x3d function()\x7b rej(new Error(\x27Gagal baca \x27 + f.name)); \x7d;\\n        fr.readAsDataURL(f);\\n        return;\\n      \x7d\\n      var img \x3d new Image(), u \x3d URL.createObjectURL(f);\\n      img.onload \x3d function()\x7b\\n        var max \x3d 1600, s \x3d Math.min(1, max \/ Math.max(img.naturalWidth, img.naturalHeight));\\n        var c \x3d document.createElement(\x27canvas\x27);\\n        c.width \x3d Math.round(img.naturalWidth * s); c.height \x3d Math.round(img.naturalHeight * s);\\n        c.getContext(\x272d\x27).drawImage(img, 0, 0, c.width, c.height);\\n        URL.revokeObjectURL(u);\\n        res(c.toDataURL(\x27image\/jpeg\x27, 0.82));\\n      \x7d;\\n      img.onerror \x3d function()\x7b URL.revokeObjectURL(u); rej(new Error(\x27Gambar tidak dapat dibaca: \x27 + f.name)); \x7d;\\n      img.src \x3d u;\\n    \x7d);\\n  \x7d\\n\\n  function runP(fn, arg)\x7b\\n    return new Promise(function(res, rej)\x7b\\n      google.script.run.withSuccessHandler(res).withFailureHandler(function(e)\x7b rej(e); \x7d)\x5bfn\x5d(arg);\\n    \x7d);\\n  \x7d\\n\\n   \\n  $(\x27fp\x27).addEventListener(\x27submit\x27, function(e)\x7b\\n    e.preventDefault();\\n    if (P.busy) return;\\n    document.querySelectorAll(\x27#fp .bad\x27).forEach(function(x)\x7b x.classList.remove(\x27bad\x27); \x7d);\\n    var x \x3d selProjek();\\n    var d \x3d \x7b\\n      kawasan: $(\x27pKawasan\x27).value, projek: $(\x27pProjek\x27).value, tarikh: $(\x27pTarikh\x27).value, mula: $(\x27pMula\x27).value,\\n      luasT: $(\x27pLuasT\x27).value, dalam: $(\x27pDalam\x27).value, tempoh: $(\x27pTempoh\x27).value,\\n      hi: $(\x27pHI\x27).value, hhi: $(\x27pHHI\x27).value, infra: $(\x27pInfra\x27).value, catatan: $(\x27pCatatan\x27).value,\\n      kategori: (document.querySelector(\x27input\x5bname\x3dpKat\x5d:checked\x27) || \x7b\x7d).value || \x27\x27, gambar: \x5b\x5d\\n    \x7d;\\n    var errs \x3d \x5b\x5d;\\n    var need \x3d function(ok, id, msg)\x7b if (!ok)\x7b errs.push(msg); if (id) $(id).classList.add(\x27bad\x27); \x7d \x7d;\\n    need(d.kawasan, \x27pKawasan\x27, \x27Kawasan\x27);\\n    need(d.projek \x26\x26 x, \x27pProjek\x27, \x27Projek\x27);\\n    need(d.tarikh, \x27pTarikh\x27, \x27Tarikh\x27);\\n  if (d.tarikh \x26\x26 d.tarikh \x3e todayIso()) need(false, \x27pTarikh\x27, \x27Tarikh tidak boleh melebihi hari ini\x27);\\n  need(d.mula, \x27pMula\x27, \x27Tarikh mula terjejas\x27);\\n  if (d.tarikh \x26\x26 d.mula \x26\x26 d.mula \x3e d.tarikh) need(false, \x27pMula\x27, \x27Tarikh mula terjejas selepas tarikh laporan\x27);\\n    need(d.kategori, null, \x27Kategori\x27);\\n    if (x \x26\x26 d.luasT \x26\x26 Number(d.luasT) \x3e Number(x.luas)) need(false, \x27pLuasT\x27, \x27Luas terjejas melebihi luas ladang\x27);\\n    if (errs.length)\x7b toast(\x27Sila semak: \x27 + errs.join(\x27, \x27), true); return; \x7d\\n\\n    P.busy \x3d true;\\n    var btn \x3d $(\x27pSubmit\x27);\\n    btn.disabled \x3d true;\\n    var pending \x3d P.files.filter(function(f)\x7b return f.status !\x3d\x3d \x27ok\x27; \x7d);\\n    var n \x3d 0;\\n    var chain \x3d Promise.resolve();\\n    P.files.forEach(function(f, i)\x7b\\n      if (f.status \x3d\x3d\x3d \x27ok\x27) return;\\n      chain \x3d chain.then(function()\x7b\\n        n++;\\n        btn.textContent \x3d \x27Memuat naik gambar \x27 + n + \x27\/\x27 + pending.length + \x27\\u2026\x27;\\n        f.status \x3d \x27Memampat\\u2026\x27; renderThumbs();\\n        return readImage(f.file)\\n          .then(function(data)\x7b\\n              f.status \x3d fmtSz(f.file.size) + \x27 → \x27 + fmtSz(Math.round((data.length - data.indexOf(\x27,\x27) - 1) * 3 \/ 4)); renderThumbs();\\n              return runP(\x27uploadImage\x27, \x7bkawasan: d.kawasan, projek: d.projek, index: i + 1, data: data\x7d); \x7d)\\n          .then(function(r)\x7b f.status \x3d \x27ok\x27; f.result \x3d r; renderThumbs(); \x7d)\\n          .catch(function(err)\x7b f.status \x3d \x27err\x27; renderThumbs(); throw err; \x7d);\\n      \x7d);\\n    \x7d);\\n    chain\\n      .then(function()\x7b\\n        btn.textContent \x3d \x27Menyimpan laporan\\u2026\x27;\\n        d.gambar \x3d P.files.map(function(f)\x7b return f.result; \x7d).filter(Boolean);\\n        return runP(\x27submitProjek\x27, d);\\n      \x7d)\\n      .then(function(r)\x7b\\n        P.busy \x3d false; btn.disabled \x3d false; btn.textContent \x3d \x27Hantar Laporan\x27;\\n        $(\x27fp\x27).classList.add(\x27hidden\x27); $(\x27projBar\x27).classList.add(\x27hidden\x27); $(\x27pDone\x27).classList.remove(\x27hidden\x27);\\n        $(\x27pDoneTxt\x27).textContent \x3d r.id + \x27 · \x27 + d.projek + (d.gambar.length ? \x27 · \x27 + d.gambar.length + \x27 gambar\x27 : \x27\x27) +\\n          (r.albumMissing ? \x27 (gambar belum masuk album \\u2014 ID album belum diisi)\x27 : \x27\x27);\\n        $(\x27pWa\x27).href \x3d \x27https:\/\/wa.me\/?text\x3d\x27 + encodeURIComponent(waText(d, x, r));\\n      showQr(d, x, r);\\n        window.scrollTo(0, 0);\\n        if (window.DP) DP.at \x3d 1;\\n      \x7d)\\n      .catch(function(err)\x7b\\n        P.busy \x3d false; btn.disabled \x3d false; btn.textContent \x3d \x27Cuba Hantar Semula\x27;\\n        renderThumbs();\\n        toast((err \x26\x26 err.message) || \x27Gagal menghantar.\x27, true);\\n      \x7d);\\n  \x7d);\\n\\n  function waText(d, x, r)\x7b\\n  var v \x3d function(a, b)\x7b var t \x3d String(a \x3d\x3d null ? \x27\x27 : a).trim(); return t || (b \x3d\x3d null ? \x27-\x27 : b); \x7d;\\n  var hhi \x3d r \x26\x26 r.hhi !\x3d null ? r.hhi : d.hhi;\\n  return \x5b\\n    \x27*LAPORAN PROJEK TERJEJAS BANJIR*\x27,\\n    \x27\x27,\\n    \x271) Tarikh : \x27 + dmy(d.tarikh),\\n    \x272) Negeri : Kelantan\x27,\\n    \x273) Kawasan\/Estet : \x27 + v(d.kawasan),\\n    \x274) Nama Projek : \x27 + v(d.projek),\\n    \x275) Mukim : \x27 + v(x \x26\x26 x.mukim),\\n    \x276) Daerah\/Jajahan : \x27 + v(x \x26\x26 x.daerah),\\n    \x277) Dun : \x27 + v(x \x26\x26 x.dun),\\n    \x278) Parlimen : \x27 + v(x \x26\x26 x.parlimen),\\n    \x27----------------------------------\x27,\\n    \x27\x27,\\n    \x2711) Projek Terjejas:\x27,\\n    \x27     i. Luas Kawasan Terjejas: \x27 + v(d.luasT, \x270\x27) + \x27 Hek\x27,\\n    \x27    ii. Agg Kehilangan Hasil HI: \x27 + v(d.hi, \x270\x27) + \x27 Mt\x27,\\n    \x27   iii. Agg Kehilangan Hasil HHI: \x27 + v(hhi, \x270\x27) + \x27 Mt\x27,\\n    \x27    iv. Kerosakan Infra: \x27 + v(d.infra, \x27TIADA\x27).toUpperCase(),\\n    \x27     v. Tempoh Banjir: \x27 + v(d.tempoh, \x270\x27) + \x27 Hari\x27,\\n    \x27    vi. Kategori: \x27 + v(d.kategori),\\n    \x27\x3e A - Kehilangan Hasil Akibat Banjir\x27,\\n    \x27\x3e B - Kehilangan Hasil Akibat Hujan Lebat\x27,\\n    \x27\x27,\\n    \x27Catatan: \x27 + v(d.catatan, \x27TIADA\x27).toUpperCase(),\\n    \x27\x3e ---------------------------\x27,\\n    \x27\x3e #BANJIR2026\x27\\n  \x5d.join(\x27\\\\n\x27);\\n\x7d\\n\\n   \\nvar QRLIB \x3d \x5b\\n  \x27https:\/\/cdn.jsdelivr.net\/npm\/vue@3.5.45\/dist\/vue.global.prod.js\x27,\\n  \x27https:\/\/cdn.jsdelivr.net\/npm\/qrcode@1.4.4\/build\/qrcode.min.js\x27,\\n  \x27https:\/\/cdn.jsdelivr.net\/npm\/@chenfengyuan\/vue-qrcode@2.0.0\/dist\/vue-qrcode.min.js\x27\\n\x5d;\\nvar qrLibP \x3d null, qrApp \x3d null;\\nfunction loadQrLib()\x7b\\n  if (window.Vue \x26\x26 window.QRCode \x26\x26 window.VueQrcode) return Promise.resolve();\\n  if (!qrLibP) \x7b\\n    qrLibP \x3d QRLIB.reduce(function(chain, src)\x7b\\n      return chain.then(function()\x7b\\n        return new Promise(function(res, rej)\x7b\\n          var s \x3d document.createElement(\x27script\x27);\\n          s.src \x3d src; s.onload \x3d res;\\n          s.onerror \x3d function()\x7b rej(new Error(\x27Gagal memuat pustaka kod QR (\x27 + src.split(\x27\/npm\/\x27)\x5b1\x5d.split(\x27\/\x27)\x5b0\x5d + \x27).\x27)); \x7d;\\n          document.head.appendChild(s);\\n        \x7d);\\n      \x7d);\\n    \x7d, Promise.resolve()).catch(function(e)\x7b qrLibP \x3d null; throw e; \x7d);\\n  \x7d\\n  return qrLibP;\\n\x7d\\nfunction fitsQr(s)\x7b try \x7b QRCode.create(s, \x7berrorCorrectionLevel: \x27L\x27\x7d); return true; \x7d catch (e) \x7b return false; \x7d \x7d\\nfunction qrValue(d, x, r)\x7b\\n  var full \x3d \x27https:\/\/wa.me\/?text\x3d\x27 + encodeURIComponent(waText(d, x, r));\\n  if (fitsQr(full)) return \x7bv: full, note: \x27\x27\x7d;\\n  var n \x3d d.gambar.length;\\n  var t \x3d waText(Object.assign(\x7b\x7d, d, \x7bgambar: \x5b\x5d\x7d), x, r) + (n ? \x27\\\\nGambar: \x27 + n + \x27 keping (lihat Dashboard Projek)\x27 : \x27\x27);\\n  var short \x3d \x27https:\/\/wa.me\/?text\x3d\x27 + encodeURIComponent(t);\\n  if (fitsQr(short)) return \x7bv: short, note: \x27Pautan gambar tidak dimasukkan dalam kod QR kerana terlalu panjang. Gambar boleh dilihat di Dashboard Projek.\x27\x7d;\\n  return \x7bv: null, note: \x27\x27\x7d;\\n\x7d\\nfunction showQr(d, x, r)\x7b\\n  var el \x3d $(\x27pQr\x27), msg \x3d $(\x27pQrMsg\x27);\\n  var touch \x3d !!(window.matchMedia \x26\x26 matchMedia(\x27(pointer: coarse)\x27).matches);\\n  $(\x27pQrBox\x27).classList.toggle(\x27hidden\x27, touch);\\n  $(\x27pQrShow\x27).classList.toggle(\x27hidden\x27, !touch);\\n  if (qrApp)\x7b qrApp.unmount(); qrApp \x3d null; \x7d\\n  el.innerHTML \x3d \x27\x3cspan class\x3d\\\x22qrload\\\x22\x3eMenjana kod QR\\u2026\x3c\\\/span\x3e\x27;\\n  msg.textContent \x3d \x27\x27; msg.classList.remove(\x27warn\x27);\\n  loadQrLib().then(function()\x7b\\n    var q \x3d qrValue(d, x, r);\\n    if (!q.v)\x7b\\n      el.innerHTML \x3d \x27\x3cspan class\x3d\\\x22qrload\\\x22\x3eLaporan terlalu panjang untuk kod QR.\x3c\\\/span\x3e\x27;\\n      msg.textContent \x3d \x27Guna butang Kongsi ke WhatsApp.\x27; msg.classList.add(\x27warn\x27);\\n      return;\\n    \x7d\\n    if (q.note)\x7b msg.textContent \x3d q.note; msg.classList.add(\x27warn\x27); \x7d\\n    el.innerHTML \x3d \x27\x27;\\n    qrApp \x3d Vue.createApp(\x7b\\n      render: function()\x7b\\n        return Vue.h(VueQrcode, \x7bvalue: q.v, tag: \x27canvas\x27, options: \x7b\\n          errorCorrectionLevel: q.v.length \x3c 1200 ? \x27M\x27 : \x27L\x27, margin: 1, width: 480,\\n          color: \x7bdark: \x27#000000\x27, light: \x27#ffffff\x27\x7d\\n        \x7d\x7d);\\n      \x7d\\n    \x7d);\\n    qrApp.mount(el);\\n  \x7d).catch(function(e)\x7b\\n    el.innerHTML \x3d \x27\x3cspan class\x3d\\\x22qrload\\\x22\x3eKod QR tidak dapat dimuat.\x3c\\\/span\x3e\x27;\\n    msg.textContent \x3d (e \x26\x26 e.message) || \x27\x27; msg.classList.add(\x27warn\x27);\\n  \x7d);\\n\x7d\\n$(\x27pQrShow\x27).onclick \x3d function()\x7b $(\x27pQrBox\x27).classList.remove(\x27hidden\x27); this.classList.add(\x27hidden\x27); \x7d;\\n\\n$(\x27pNew\x27).onclick \x3d function()\x7b\\n  if (qrApp)\x7b qrApp.unmount(); qrApp \x3d null; \x7d\\n    var keepK \x3d $(\x27pKawasan\x27).value;\\n    $(\x27fp\x27).reset();\\n    $(\x27pKawasan\x27).value \x3d keepK;\\n    $(\x27pKawasan\x27).dispatchEvent(new Event(\x27change\x27));\\n    setTarikhHariIni(); $(\x27pMula\x27).value \x3d todayIso();\\n    P.files.forEach(function(f)\x7b URL.revokeObjectURL(f.url); \x7d); P.files \x3d \x5b\x5d; renderThumbs();\\n    $(\x27pDone\x27).classList.add(\x27hidden\x27); $(\x27fp\x27).classList.remove(\x27hidden\x27); $(\x27projBar\x27).classList.remove(\x27hidden\x27);\\n    window.scrollTo(0, 0);\\n  \x7d;\\n\x3c\\\/script\x3e\\n\x3clink rel\x3d\\\x22stylesheet\\\x22 href\x3d\\\x22https:\/\/cdn.jsdelivr.net\/npm\/viewerjs@1.11.7\/dist\/viewer.min.css\\\x22\x3e\\n\x3cscript src\x3d\\\x22https:\/\/cdn.jsdelivr.net\/npm\/viewerjs@1.11.7\/dist\/viewer.min.js\\\x22\x3e\x3c\\\/script\x3e\\n\x3cscript src\x3d\\\x22https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.6.1\/dist\/chart.umd.min.js\\\x22\x3e\x3c\\\/script\x3e\\n\x3cstyle\x3e\\n  main.dash\x7bmax-width:1100px;padding-bottom:calc(24px + env(safe-area-inset-bottom))\x7d\\n  .filt\x7bdisplay:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:6px\x7d\\n  .filt .full\x7bgrid-column:1\/-1\x7d\\n  @media (min-width:720px)\x7b.filt\x7bgrid-template-columns:1fr 1fr 2fr auto\x7d.filt .full\x7bgrid-column:auto\x7d\x7d\\n  .meta\x7bfont-size:12px;color:var(--muted);margin:0 2px 10px;font-variant-numeric:tabular-nums\x7d\\n  .kpis\x7bdisplay:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:10px\x7d\\n  @media (max-width:719px)\x7b.kpi.tot\x7bgrid-column:1\/-1\x7d\x7d\\n  @media (min-width:720px)\x7b.kpis\x7bgrid-template-columns:repeat(5,1fr)\x7d\x7d\\n  .kpi\x7bdisplay:flex;flex-direction:column;align-items:flex-start;gap:2px;background:var(--card);border:1px solid var(--line);\\n    border-radius:16px;padding:12px;box-shadow:var(--sh-card)\x7d\\n  .kpi .ic\x7bwidth:28px;height:28px;border-radius:8px;display:grid;place-items:center;background:var(--sunk);border:1px solid var(--line);margin-bottom:6px\x7d\\n  .kpi .ic i\x7bwidth:10px;height:10px;border-radius:3px;background:var(--acc5)\x7d\\n  .kpi.a .ic i\x7bbackground:var(--a)\x7d .kpi.b .ic i\x7bbackground:var(--b)\x7d .kpi.c .ic i\x7bbackground:var(--c)\x7d .kpi.p .ic i\x7bbackground:var(--red5);border-radius:50%\x7d\\n  .kpi span\x7bfont-size:12.5px;font-weight:500;color:var(--muted)\x7d\\n  .kpi b\x7bfont-size:26px;font-weight:600;letter-spacing:-.02em;line-height:1.15;font-variant-numeric:tabular-nums\x7d\\n  .kpi small\x7bfont-size:11.5px;font-weight:500;color:var(--muted);background:var(--sunk);border:1px solid var(--line);border-radius:6px;padding:0 6px;margin-top:2px\x7d\\n  .kpi small:empty\x7bdisplay:none\x7d\\n  .cols\x7bdisplay:grid;gap:10px;margin-bottom:10px\x7d\\n  .cols .card\x7bmargin-bottom:0\x7d\\n  @media (min-width:720px)\x7b.cols\x7bgrid-template-columns:1fr 1fr\x7d\x7d\\n  .brow\x7bdisplay:grid;grid-template-columns:minmax(80px,34%) 1fr auto;gap:8px;align-items:center;padding:4px 0;font-size:12.5px\x7d\\n  .brow .lb\x7boverflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500\x7d\\n  .track\x7bdisplay:flex;height:10px;border-radius:5px;overflow:hidden;background:var(--sunk);box-shadow:inset 0 0 0 1px var(--line)\x7d\\n  .track i\x7bdisplay:block;height:100%\x7d\\n  .sa\x7bbackground:var(--a)\x7d .sb\x7bbackground:var(--b)\x7d .sc\x7bbackground:var(--c)\x7d .sx\x7bbackground:var(--line2)\x7d\\n  .sg\x7bbackground:linear-gradient(90deg,var(--acc4),var(--acc5))\x7d\\n  .brow .n\x7bfont-variant-numeric:tabular-nums;font-weight:600;min-width:22px;text-align:right\x7d\\n  .legend\x7bdisplay:flex;gap:12px;flex-wrap:wrap;font-size:11.5px;color:var(--muted);margin-top:8px\x7d\\n  .legend i\x7bdisplay:inline-block;width:8px;height:8px;border-radius:2px;margin-right:5px;vertical-align:0\x7d\\n  .card h2 .cnt\x7bcolor:var(--muted);font-weight:500\x7d\\n  #dmap\x7bheight:300px;border-radius:12px;overflow:hidden;margin-top:8px;z-index:0;border:1px solid var(--line)\x7d\\n  .empty\x7bfont-size:12.5px;color:var(--muted);padding:8px 0\x7d\\n  .rec\x7bdisplay:flex;gap:10px;align-items:flex-start;padding:10px 0;border-top:1px solid var(--line)\x7d\\n  .rec:first-child\x7bborder-top:0\x7d\\n  .kb\x7bflex:0 0 26px;height:26px;border-radius:7px;display:grid;place-items:center;color:#fff;font-weight:700;font-size:12px\x7d\\n  .rb\x7bflex:1;min-width:0\x7d\\n  .rb b\x7bdisplay:block;font-size:13.5px;font-weight:600\x7d\\n  .rb small\x7bdisplay:block;font-size:12px;color:var(--muted)\x7d\\n  .call\x7bflex:none;width:36px;height:36px;border-radius:10px;display:grid;place-items:center;border:1px solid var(--line);\\n    background:var(--card);color:var(--acc5);box-shadow:var(--sh-xs);text-decoration:none\x7d\\n  .call svg\x7bwidth:16px;height:16px\x7d\\n  .call.pin\x7bcursor:pointer;padding:0;font:inherit\x7d\\n  .leaflet-popup-content-wrapper,.leaflet-popup-tip\x7bbackground:var(--card);color:var(--ink);box-shadow:0 10px 15px -3px rgb(0 0 0 \/ .15)\x7d\\n  .leaflet-popup-content\x7bmargin:12px 14px\x7d\\n  .pop\x7bdisplay:flex;flex-direction:column;align-items:flex-start;gap:3px;font:12.5px\/1.4 var(--font);min-width:190px\x7d\\n  .pop b\x7bfont-size:13.5px;font-weight:600\x7d\\n  .pop span\x7bcolor:var(--ink)\x7d\\n  .pop small\x7bcolor:var(--muted);font-size:11.5px\x7d\\n  .pop .st\x7bcolor:#fff;border-radius:6px;padding:0 7px;font-size:11.5px;font-weight:600\x7d\\n  .pop a\x7bcolor:var(--acc5);font-weight:600;text-decoration:none;margin-top:4px\x7d\\n  .donut\x7bdisplay:flex;align-items:center;gap:16px;margin-top:8px\x7d\\n  .donut svg\x7bflex:none;width:120px;height:120px\x7d\\n  .dn-v\x7bfont:600 22px var(--font);fill:var(--ink);letter-spacing:-.02em\x7d\\n  .dn-l\x7bfont:500 10px var(--font);fill:var(--muted)\x7d\\n  .dn-leg\x7blist-style:none;margin:0;padding:0;flex:1;min-width:0;display:grid;gap:7px\x7d\\n  .dn-leg li\x7bdisplay:grid;grid-template-columns:10px 1fr auto 36px;gap:8px;align-items:center;font-size:12.5px\x7d\\n  .dn-leg i\x7bwidth:10px;height:10px;border-radius:3px\x7d\\n  .dn-leg span\x7boverflow:hidden;text-overflow:ellipsis;white-space:nowrap\x7d\\n  .dn-leg b\x7bfont-weight:600;font-variant-numeric:tabular-nums\x7d\\n  .dn-leg em\x7bfont-style:normal;color:var(--muted);font-size:11.5px;text-align:right;font-variant-numeric:tabular-nums\x7d\\n  .dseg\x7bdisplay:grid;grid-template-columns:1fr 1fr;gap:2px;padding:3px;border-radius:10px;background:var(--seg);margin-bottom:10px;max-width:360px\x7d\\n  .dseg button\x7bborder:0;background:transparent;font:inherit;font-size:13px;font-weight:600;color:var(--muted);min-height:32px;border-radius:7px;cursor:pointer\x7d\\n  .dseg button.on\x7bbackground:var(--seg-on);color:var(--ink);box-shadow:var(--sh-pill)\x7d\\n  .vbars\x7bdisplay:block;width:100%;height:auto;margin-top:8px\x7d\\n  .vb-v\x7bfont:600 9px var(--font);fill:var(--ink)\x7d\\n  .vb-l\x7bfont:500 8.5px var(--font);fill:var(--muted)\x7d\\n  .prc\x7bpadding:12px 0;border-top:1px solid var(--line)\x7d\\n  .prc:first-child\x7bborder-top:0\x7d\\n  .prh\x7bdisplay:flex;gap:10px;align-items:flex-start\x7d\\n  .prs\x7bdisplay:grid;grid-template-columns:1fr 1fr;gap:6px;margin-top:8px\x7d\\n  @media (min-width:720px)\x7b.prs\x7bgrid-template-columns:repeat(4,1fr)\x7d\x7d\\n  .prs div\x7bbackground:var(--sunk);border:1px solid var(--line);border-radius:8px;padding:6px 8px;min-width:0\x7d\\n  .prs span\x7bdisplay:block;font-size:11px;font-weight:500;color:var(--muted)\x7d\\n  .prs b\x7bdisplay:block;font-size:13px;font-weight:600;font-variant-numeric:tabular-nums\x7d\\n  .prn\x7bdisplay:block;margin-top:6px;font-size:12px;color:var(--muted)\x7d\\n  .pthumbs\x7bdisplay:flex;gap:6px;margin-top:8px;overflow-x:auto;padding-bottom:2px\x7d\\n  .pthumbs a\x7bflex:none;cursor:zoom-in\x7d\\n  .pthumbs .more\x7bwidth:64px;height:64px;box-sizing:border-box;border-radius:8px;border:1px dashed var(--line2);background:var(--sunk);display:grid;place-items:center;font-size:13px;font-weight:600;color:var(--acc5);text-decoration:none\x7d\\n  .kpi.gal\x7bcursor:pointer;transition:transform .15s\x7d\\n  .kpi.gal:active\x7btransform:scale(.98)\x7d\\n  .kpi.gal:focus-visible\x7boutline:2px solid var(--acc5);outline-offset:2px\x7d\\n  .viewer-title\x7bfont-size:12.5px;font-family:var(--font)\x7d\\n  .pimgs\x7bmargin-top:10px\x7d\\n  .pdh\x7bdisplay:flex;justify-content:space-between;align-items:center;gap:8px;font-size:12px;font-weight:600;color:var(--muted)\x7d\\n  .pday\x7bmargin-top:8px\x7d\\n  .pday .pthumbs\x7bmargin-top:4px\x7d\\n  .pdl\x7bfont-size:12px;font-weight:600;color:var(--ink)\x7d\\n  .pdl em,.gchips em\x7bfont-style:normal;font-weight:500;color:var(--muted)\x7d\\n  .pimgs .xday\x7bdisplay:none\x7d\\n  .pimgs.open .xday\x7bdisplay:block\x7d\\n  .glink\x7bborder:0;background:none;padding:4px 0;font:inherit;font-size:12px;font-weight:600;color:var(--acc5);cursor:pointer\x7d\\n  .xmore\x7bmargin-top:6px\x7d\\n  .gchips\x7bdisplay:flex;gap:6px;overflow-x:auto;padding:2px 0 8px\x7d\\n  .gchips button\x7bflex:none;border:1px solid var(--line);background:var(--card);color:var(--ink);font:inherit;font-size:12.5px;font-weight:600;border-radius:999px;padding:5px 11px;min-height:32px;cursor:pointer\x7d\\n  .gchips button.on\x7bbackground:var(--acc5);border-color:var(--acc5);color:#fff\x7d\\n  .gchips button.on em\x7bcolor:rgb(255 255 255 \/ .85)\x7d\\n  .ggrid\x7bdisplay:grid;grid-template-columns:repeat(auto-fill,minmax(76px,1fr));gap:6px\x7d\\n  .ggrid a\x7bdisplay:block;cursor:zoom-in\x7d\\n  .ggrid img\x7bdisplay:block;width:100%;aspect-ratio:1;object-fit:cover;border-radius:8px;border:1px solid var(--line);background:var(--sunk)\x7d\\n  .ggrid .more\x7bdisplay:grid;place-items:center;aspect-ratio:1;border-radius:8px;border:1px dashed var(--line2);background:var(--sunk);font-weight:600;color:var(--acc5);text-decoration:none\x7d\\n  .pthumbs img\x7bdisplay:block;width:64px;height:64px;object-fit:cover;border-radius:8px;border:1px solid var(--line);background:var(--sunk)\x7d\\n   \\n  .dload\x7bposition:fixed;top:0;left:0;right:0;height:3px;z-index:3500;overflow:hidden;pointer-events:none;opacity:0;transition:opacity .25s\x7d\\n  .dload.on\x7bopacity:1\x7d\\n  .dload i\x7bposition:absolute;top:0;bottom:0;left:-40%;width:40%;border-radius:3px;background:linear-gradient(90deg,transparent,var(--acc5),var(--red5,#c11d23));animation:dload 1.1s ease-in-out infinite\x7d\\n  @keyframes dload\x7b0%\x7bleft:-40%\x7d100%\x7bleft:100%\x7d\x7d\\n  .meta.busy::before\x7bcontent:\x27\x27;display:inline-block;width:10px;height:10px;margin-right:6px;vertical-align:-1px;border:2px solid var(--line2);border-top-color:var(--acc5);border-radius:50%;animation:dspin .7s linear infinite\x7d\\n  .btn.busy svg\x7banimation:dspin .8s linear infinite\x7d\\n  @keyframes dspin\x7bto\x7btransform:rotate(360deg)\x7d\x7d\\n  @media (prefers-reduced-motion:reduce)\x7b.dload i\x7banimation-duration:2.4s\x7d.meta.busy::before,.btn.busy svg\x7banimation-duration:1.6s\x7d\x7d\\n   \\n  .kmap\x7bdisplay:block;width:100%;max-width:400px;height:auto;margin:6px auto 0;overflow:visible\x7d\\n  .kbase path\x7bfill:var(--sunk);stroke:var(--card);stroke-width:1.6;stroke-linejoin:round\x7d\\n  .kfill path\x7bfill:var(--acc5);stroke:var(--card);stroke-width:1.6;stroke-linejoin:round;cursor:pointer;transition:fill-opacity .25s\x7d\\n  .kfill path:hover,.kfill path:focus-visible\x7bstroke:var(--ink);stroke-width:2.4;outline:none\x7d\\n  .kfill path.on\x7bstroke:var(--ink);stroke-width:3.4\x7d\\n  .ktxt text\x7btext-anchor:middle;pointer-events:none;font-family:var(--font);paint-order:stroke;stroke:var(--card);stroke-width:3px;stroke-linejoin:round\x7d\\n  .ktxt .kn\x7bfill:var(--muted);font-weight:500\x7d\\n  .ktxt .kv\x7bfill:var(--ink);font-weight:700;font-variant-numeric:tabular-nums\x7d\\n  .ktxt .dk\x7bfill:#fff;stroke:none\x7d\\n  .legend .kscale\x7bdisplay:inline-flex;align-items:center;gap:6px\x7d\\n  .legend .kscale i\x7bwidth:72px;height:8px;border-radius:4px;margin:0;background:linear-gradient(90deg,color-mix(in srgb,var(--acc5) 18%,var(--sunk)),var(--acc5))\x7d\\n  .legend .kscale em\x7bfont-style:normal\x7d\\n   \\n  #chDaerah\x7bposition:relative\x7d\\n  .kfill path.tip\x7bstroke:var(--ink);stroke-width:2.8\x7d\\n  .ktip\x7bposition:absolute;z-index:5;width:250px;max-width:calc(100% - 8px);box-sizing:border-box;padding:12px 12px 10px;background:var(--card);color:var(--ink);border:1px solid var(--line);border-radius:12px;box-shadow:0 10px 25px -5px rgb(0 0 0 \/ .28);font-size:12.5px;animation:ktin .15s ease-out\x7d\\n  @keyframes ktin\x7bfrom\x7bopacity:0;transform:translateY(4px)\x7dto\x7bopacity:1;transform:none\x7d\x7d\\n  .kt-x\x7bposition:absolute;top:7px;right:7px;width:26px;height:26px;border:0;border-radius:7px;background:var(--sunk);color:var(--muted);font-size:12px;cursor:pointer\x7d\\n  .kt-h\x7bdisplay:block;font-size:14.5px;font-weight:600;padding-right:30px\x7d\\n  .kt-s\x7bdisplay:block;color:var(--muted);font-size:12px;margin:1px 0 8px\x7d\\n  .kt-r\x7bdisplay:grid;grid-template-columns:116px 1fr 26px;gap:6px;align-items:center;padding:2px 0\x7d\\n  .kt-r span:first-child\x7bwhite-space:nowrap;overflow:hidden;text-overflow:ellipsis\x7d\\n  .kt-r b\x7btext-align:right;font-variant-numeric:tabular-nums\x7d\\n  .kt-t\x7bmargin:9px 0 2px;font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em\x7d\\n  .kt-l\x7blist-style:none;margin:0;padding:0\x7d\\n  .kt-l li\x7bdisplay:flex;justify-content:space-between;gap:8px;padding:1px 0\x7d\\n  .kt-l li span\x7boverflow:hidden;text-overflow:ellipsis;white-space:nowrap\x7d\\n  .kt-l li b\x7bfont-variant-numeric:tabular-nums\x7d\\n  .kt-f\x7bwidth:100%;margin-top:10px;min-height:34px;font-size:12.5px\x7d\\n   \\n  .cjw\x7bposition:relative;width:100%;min-width:0;margin-top:6px\x7d\\n  .donut .cjw\x7bflex:1 1 auto;margin-top:0\x7d\\n   \\n  details.pcol \x3e summary\x7bdisplay:flex;align-items:center;justify-content:space-between;gap:8px;list-style:none;cursor:pointer;user-select:none;margin:-4px 0;padding:4px 0\x7d\\n  details.pcol \x3e summary::-webkit-details-marker\x7bdisplay:none\x7d\\n  details.pcol \x3e summary h2\x7bmargin:0\x7d\\n  details.pcol \x3e summary .pchev\x7bflex:none;width:28px;height:28px;border-radius:8px;background:var(--sunk);border:1px solid var(--line);position:relative\x7d\\n  details.pcol \x3e summary .pchev::before\x7bcontent:\x27\x27;position:absolute;left:50%;top:50%;width:7px;height:7px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);transform:translate(-50%,-70%) rotate(45deg);transition:transform .2s\x7d\\n  details.pcol\x5bopen\x5d \x3e summary .pchev::before\x7btransform:translate(-50%,-30%) rotate(225deg)\x7d\\n  details.pcol\x5bopen\x5d \x3e summary\x7bmargin-bottom:6px\x7d\\n  details.pcol \x3e summary:focus-visible\x7boutline:2px solid var(--acc5);outline-offset:4px;border-radius:8px\x7d\\n\x3c\\\/style\x3e\\n\\n\x3cmain id\x3d\\\x22viewDash\\\x22 class\x3d\\\x22dash hidden\\\x22\x3e\\n    \x3cdiv class\x3d\\\x22dload\\\x22 id\x3d\\\x22dLoad\\\x22 role\x3d\\\x22progressbar\\\x22 aria-label\x3d\\\x22Memuat data\\\x22 aria-hidden\x3d\\\x22true\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/div\x3e\\n  \x3cdiv class\x3d\\\x22dseg\\\x22 role\x3d\\\x22tablist\\\x22 aria-label\x3d\\\x22Jenis dashboard\\\x22\x3e\\n    \x3cbutton type\x3d\\\x22button\\\x22 id\x3d\\\x22dsM\\\x22 class\x3d\\\x22on\\\x22\x3eMangsa\x3c\\\/button\x3e\\n    \x3cbutton type\x3d\\\x22button\\\x22 id\x3d\\\x22dsP\\\x22\x3eProjek\x3c\\\/button\x3e\\n  \x3c\\\/div\x3e\\n  \x3cdiv id\x3d\\\x22subMangsa\\\x22\x3e\\n  \x3cdiv class\x3d\\\x22filt\\\x22\x3e\\n    \x3cselect id\x3d\\\x22fDaerah\\\x22 aria-label\x3d\\\x22Daerah\\\x22\x3e\x3coption value\x3d\\\x22\\\x22\x3eSemua daerah\x3c\\\/option\x3e\x3c\\\/select\x3e\\n    \x3cselect id\x3d\\\x22fKesan\\\x22 aria-label\x3d\\\x22Status\\\x22\x3e\\n      \x3coption value\x3d\\\x22\\\x22\x3eSemua status\x3c\\\/option\x3e\\n      \x3coption value\x3d\\\x22A\\\x22\x3eA · Berpindah\x3c\\\/option\x3e\\n      \x3coption value\x3d\\\x22B\\\x22\x3eB · Tidak berpindah\x3c\\\/option\x3e\\n      \x3coption value\x3d\\\x22C\\\x22\x3eC · Terperangkap\x3c\\\/option\x3e\\n    \x3c\\\/select\x3e\\n    \x3cinput type\x3d\\\x22search\\\x22 id\x3d\\\x22fCari\\\x22 class\x3d\\\x22full\\\x22 placeholder\x3d\\\x22Cari nama, projek, kawasan, PPS\\u2026\\\x22\x3e\\n    \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn full\\\x22 id\x3d\\\x22dRefresh\\\x22\x3e\x3csvg viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22M21 12a9 9 0 1 1-2.6-6.4L21 8\\\x22\/\x3e\x3cpath d\x3d\\\x22M21 3v5h-5\\\x22\/\x3e\x3c\\\/svg\x3eMuat semula\x3c\\\/button\x3e\\n  \x3c\\\/div\x3e\\n  \x3cdiv class\x3d\\\x22meta\\\x22 id\x3d\\\x22dUpd\\\x22\x3e\\u2014\x3c\\\/div\x3e\\n\\n  \x3cdiv id\x3d\\\x22mHost\\\x22\x3e\x3cdiv id\x3d\\\x22mBody\\\x22\x3e\\n      \x3cdiv class\x3d\\\x22kpis\\\x22\x3e\\n    \x3cdiv class\x3d\\\x22kpi tot\\\x22\x3e\x3cspan class\x3d\\\x22ic\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan\x3eJumlah terkesan\x3c\\\/span\x3e\x3cb id\x3d\\\x22dT\\\x22\x3e0\x3c\\\/b\x3e\x3csmall\x3eorang\x3c\\\/small\x3e\x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22kpi a\\\x22\x3e\x3cspan class\x3d\\\x22ic\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan\x3eA · Berpindah\x3c\\\/span\x3e\x3cb id\x3d\\\x22dA\\\x22\x3e0\x3c\\\/b\x3e\x3csmall id\x3d\\\x22dAp\\\x22\x3e\x3c\\\/small\x3e\x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22kpi b\\\x22\x3e\x3cspan class\x3d\\\x22ic\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan\x3eB · Tidak berpindah\x3c\\\/span\x3e\x3cb id\x3d\\\x22dB\\\x22\x3e0\x3c\\\/b\x3e\x3csmall id\x3d\\\x22dBp\\\x22\x3e\x3c\\\/small\x3e\x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22kpi c\\\x22\x3e\x3cspan class\x3d\\\x22ic\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan\x3eC · Terperangkap\x3c\\\/span\x3e\x3cb id\x3d\\\x22dC\\\x22\x3e0\x3c\\\/b\x3e\x3csmall id\x3d\\\x22dCp\\\x22\x3e\x3c\\\/small\x3e\x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22kpi p\\\x22\x3e\x3cspan class\x3d\\\x22ic\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan\x3ePusat pemindahan\x3c\\\/span\x3e\x3cb id\x3d\\\x22dP\\\x22\x3e0\x3c\\\/b\x3e\x3csmall\x3elokasi PPS\x3c\\\/small\x3e\x3c\\\/div\x3e\\n  \x3c\\\/div\x3e\\n\\n  \x3cdiv class\x3d\\\x22cols\\\x22\x3e\\n    \x3csection class\x3d\\\x22card\\\x22\x3e\x3ch2\x3eTaburan Status Kesan\x3c\\\/h2\x3e\x3cdiv class\x3d\\\x22donut\\\x22 id\x3d\\\x22dnStatus\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/section\x3e\\n    \x3csection class\x3d\\\x22card\\\x22\x3e\x3ch2\x3eTaburan Kategori\x3c\\\/h2\x3e\x3cdiv class\x3d\\\x22donut\\\x22 id\x3d\\\x22dnKat\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/section\x3e\\n  \x3c\\\/div\x3e\\n\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2\x3eMengikut Daerah \/ Jajahan\x3c\\\/h2\x3e\\n    \x3cdiv id\x3d\\\x22chDaerah\\\x22\x3e\x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22legend\\\x22 id\x3d\\\x22chDaerahLeg\\\x22\x3e\x3c\\\/div\x3e\\n  \x3c\\\/section\x3e\\n\\n  \x3cdiv class\x3d\\\x22cols\\\x22\x3e\\n    \x3csection class\x3d\\\x22card\\\x22\x3e\x3ch2\x3eMengikut Kategori\x3c\\\/h2\x3e\x3cdiv id\x3d\\\x22chKat\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/section\x3e\\n    \x3csection class\x3d\\\x22card\\\x22\x3e\x3ch2\x3eMengikut Kawasan \x3cspan class\x3d\\\x22cnt\\\x22\x3e(10 teratas)\x3c\\\/span\x3e\x3c\\\/h2\x3e\x3cdiv id\x3d\\\x22chKaw\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/section\x3e\\n  \x3c\\\/div\x3e\\n\\n  \x3cdiv class\x3d\\\x22cols\\\x22\x3e\\n    \x3csection class\x3d\\\x22card\\\x22\x3e\x3ch2\x3ePusat Pemindahan (PPS)\x3c\\\/h2\x3e\x3cdiv id\x3d\\\x22chPps\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/section\x3e\\n    \x3csection class\x3d\\\x22card\\\x22\x3e\x3ch2\x3ePeta Lokasi \x3cspan class\x3d\\\x22cnt\\\x22 id\x3d\\\x22gpsN\\\x22\x3e\x3c\\\/span\x3e\x3c\\\/h2\x3e\x3cdiv id\x3d\\\x22dmap\\\x22\x3e\x3c\\\/div\x3e\x3cdiv class\x3d\\\x22legend\\\x22\x3e\x3cspan\x3e\x3ci class\x3d\\\x22sa\\\x22\x3e\x3c\\\/i\x3eA\x3c\\\/span\x3e\x3cspan\x3e\x3ci class\x3d\\\x22sb\\\x22\x3e\x3c\\\/i\x3eB\x3c\\\/span\x3e\x3cspan\x3e\x3ci class\x3d\\\x22sc\\\x22\x3e\x3c\\\/i\x3eC\x3c\\\/span\x3e\x3cspan\x3eKetik titik untuk butiran\x3c\\\/span\x3e\x3c\\\/div\x3e\x3c\\\/section\x3e\\n  \x3c\\\/div\x3e\\n\\n  \x3csection class\x3d\\\x22card\\\x22\x3e\\n    \x3ch2\x3eSenarai Rekod \x3cspan class\x3d\\\x22cnt\\\x22 id\x3d\\\x22listN\\\x22\x3e\x3c\\\/span\x3e\x3c\\\/h2\x3e\\n    \x3cdiv id\x3d\\\x22dList\\\x22\x3e\x3c\\\/div\x3e\\n    \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn block hidden\\\x22 id\x3d\\\x22dMore\\\x22 style\x3d\\\x22margin-top:10px\\\x22\x3eTunjuk lagi\x3c\\\/button\x3e\\n  \x3c\\\/section\x3e\\n  \x3c\\\/div\x3e\x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n\\n  \x3cdiv id\x3d\\\x22subProjek\\\x22 class\x3d\\\x22hidden\\\x22\x3e\\n    \x3cdiv class\x3d\\\x22filt\\\x22\x3e\\n      \x3cselect id\x3d\\\x22pfKaw\\\x22 aria-label\x3d\\\x22Kawasan\\\x22\x3e\x3coption value\x3d\\\x22\\\x22\x3eSemua kawasan\x3c\\\/option\x3e\x3c\\\/select\x3e\\n      \x3cselect id\x3d\\\x22pfKat\\\x22 aria-label\x3d\\\x22Kategori\\\x22\x3e\\n        \x3coption value\x3d\\\x22\\\x22\x3eSemua kategori\x3c\\\/option\x3e\\n        \x3coption value\x3d\\\x22A\\\x22\x3eA · Akibat banjir\x3c\\\/option\x3e\\n        \x3coption value\x3d\\\x22B\\\x22\x3eB · Akibat hujan lebat\x3c\\\/option\x3e\\n      \x3c\\\/select\x3e\\n      \x3cinput type\x3d\\\x22search\\\x22 id\x3d\\\x22pfCari\\\x22 class\x3d\\\x22full\\\x22 placeholder\x3d\\\x22Cari projek \/ kod lokasi\\u2026\\\x22\x3e\\n      \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn full\\\x22 id\x3d\\\x22pRefresh\\\x22\x3e\x3csvg viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22M21 12a9 9 0 1 1-2.6-6.4L21 8\\\x22\/\x3e\x3cpath d\x3d\\\x22M21 3v5h-5\\\x22\/\x3e\x3c\\\/svg\x3eMuat semula\x3c\\\/button\x3e\\n    \x3c\\\/div\x3e\\n    \x3cdiv class\x3d\\\x22meta\\\x22 id\x3d\\\x22pUpd\\\x22\x3e\\u2014\x3c\\\/div\x3e\\n\\n    \x3cdiv id\x3d\\\x22pHost\\\x22\x3e\x3cdiv id\x3d\\\x22pBody\\\x22\x3e\\n      \x3cdiv class\x3d\\\x22kpis\\\x22\x3e\\n      \x3cdiv class\x3d\\\x22kpi tot\\\x22\x3e\x3cspan class\x3d\\\x22ic\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan\x3eProjek terjejas\x3c\\\/span\x3e\x3cb id\x3d\\\x22pkP\\\x22\x3e0\x3c\\\/b\x3e\x3csmall id\x3d\\\x22pkPs\\\x22\x3e\x3c\\\/small\x3e\x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22kpi a\\\x22\x3e\x3cspan class\x3d\\\x22ic\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan\x3eLuas terjejas (ha)\x3c\\\/span\x3e\x3cb id\x3d\\\x22pkL\\\x22\x3e0\x3c\\\/b\x3e\x3csmall id\x3d\\\x22pkLs\\\x22\x3e\x3c\\\/small\x3e\x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22kpi b\\\x22\x3e\x3cspan class\x3d\\\x22ic\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan\x3eKehilangan hasil HHI\x3c\\\/span\x3e\x3cb id\x3d\\\x22pkH\\\x22\x3e0\x3c\\\/b\x3e\x3csmall\x3etan metrik (mt)\x3c\\\/small\x3e\x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22kpi c\\\x22\x3e\x3cspan class\x3d\\\x22ic\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan\x3eLaporan diterima\x3c\\\/span\x3e\x3cb id\x3d\\\x22pkR\\\x22\x3e0\x3c\\\/b\x3e\x3csmall id\x3d\\\x22pkRs\\\x22\x3e\x3c\\\/small\x3e\x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22kpi p gal\\\x22 id\x3d\\\x22pkGal\\\x22 role\x3d\\\x22button\\\x22 tabindex\x3d\\\x220\\\x22 title\x3d\\\x22Lihat semua gambar dalam galeri\\\x22\x3e\x3cspan class\x3d\\\x22ic\\\x22\x3e\x3ci\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan\x3eGambar\x3c\\\/span\x3e\x3cb id\x3d\\\x22pkG\\\x22\x3e0\x3c\\\/b\x3e\x3csmall\x3edimuat naik\x3c\\\/small\x3e\x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n\\n    \x3csection class\x3d\\\x22card hidden\\\x22 id\x3d\\\x22pGal\\\x22\x3e\\n      \x3ch2\x3eGaleri Gambar \x3cspan class\x3d\\\x22cnt\\\x22\x3e(ikut tarikh laporan)\x3c\\\/span\x3e\x3c\\\/h2\x3e\\n      \x3cdiv class\x3d\\\x22pdh\\\x22 style\x3d\\\x22margin-bottom:8px\\\x22\x3e\x3cspan id\x3d\\\x22pGalN\\\x22\x3e\x3c\\\/span\x3e\x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22glink\\\x22 id\x3d\\\x22pGalX\\\x22\x3eTutup ✕\x3c\\\/button\x3e\x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22gchips\\\x22 id\x3d\\\x22pGalChips\\\x22 role\x3d\\\x22tablist\\\x22 aria-label\x3d\\\x22Tarikh\\\x22\x3e\x3c\\\/div\x3e\\n      \x3cdiv class\x3d\\\x22ggrid\\\x22 id\x3d\\\x22pGalGrid\\\x22\x3e\x3c\\\/div\x3e\\n      \x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn block\\\x22 id\x3d\\\x22pGalOpen\\\x22 style\x3d\\\x22margin-top:10px\\\x22\x3eBuka tayangan galeri\x3c\\\/button\x3e\\n    \x3c\\\/section\x3e\\n    \x3cdiv class\x3d\\\x22cols\\\x22\x3e\\n      \x3csection class\x3d\\\x22card\\\x22\x3e\x3ch2\x3eKategori Projek \x3cspan class\x3d\\\x22cnt\\\x22\x3e(laporan terkini)\x3c\\\/span\x3e\x3c\\\/h2\x3e\x3cdiv class\x3d\\\x22donut\\\x22 id\x3d\\\x22pdKat\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/section\x3e\\n      \x3csection class\x3d\\\x22card\\\x22\x3e\x3ch2\x3eKehilangan Hasil HI Harian \x3cspan class\x3d\\\x22cnt\\\x22\x3e(mt)\x3c\\\/span\x3e\x3c\\\/h2\x3e\x3cdiv id\x3d\\\x22pcHarian\\\x22\x3e\x3c\\\/div\x3e\x3c\\\/section\x3e\\n    \x3c\\\/div\x3e\\n\\n    \x3cdiv class\x3d\\\x22cols\\\x22\x3e\\n      \x3csection class\x3d\\\x22card\\\x22\x3e\x3ch2\x3eKehilangan Hasil HHI mengikut Projek \x3cspan class\x3d\\\x22cnt\\\x22\x3e(mt)\x3c\\\/span\x3e\x3c\\\/h2\x3e\x3cdiv id\x3d\\\x22pcHHI\\\x22\x3e\x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22legend\\\x22\x3e\x3cspan\x3e\x3ci class\x3d\\\x22sa\\\x22\x3e\x3c\\\/i\x3eA Akibat banjir\x3c\\\/span\x3e\x3cspan\x3e\x3ci class\x3d\\\x22sc\\\x22\x3e\x3c\\\/i\x3eB Akibat hujan lebat\x3c\\\/span\x3e\x3c\\\/div\x3e\x3c\\\/section\x3e\\n      \x3csection class\x3d\\\x22card\\\x22\x3e\x3ch2\x3eLuas Terjejas berbanding Luas Ladang\x3c\\\/h2\x3e\x3cdiv id\x3d\\\x22pcLuas\\\x22\x3e\x3c\\\/div\x3e\\n        \x3cdiv class\x3d\\\x22legend\\\x22\x3e\x3cspan\x3e% luas terjejas daripada luas ladang (laporan terkini)\x3c\\\/span\x3e\x3c\\\/div\x3e\x3c\\\/section\x3e\\n    \x3c\\\/div\x3e\\n\\n    \x3cdetails class\x3d\\\x22card pcol\\\x22 id\x3d\\\x22pListBox\\\x22\x3e\\n        \x3csummary\x3e\x3ch2\x3eLaporan Terkini Setiap Projek \x3cspan class\x3d\\\x22cnt\\\x22 id\x3d\\\x22pListN\\\x22\x3e\x3c\\\/span\x3e\x3c\\\/h2\x3e\x3cspan class\x3d\\\x22pchev\\\x22 aria-hidden\x3d\\\x22true\\\x22\x3e\x3c\\\/span\x3e\x3c\\\/summary\x3e\\n        \x3cdiv id\x3d\\\x22pList\\\x22\x3e\x3c\\\/div\x3e\\n      \x3c\\\/details\x3e\\n  \x3c\\\/div\x3e\x3c\\\/div\x3e\\n    \x3c\\\/div\x3e\\n\x3c\\\/main\x3e\\n\\n\x3cscript\x3e\\n  var D \x3d \x7brows: \x5b\x5d, filtered: \x5b\x5d, at: 0, shown: 50, map: null, layer: null\x7d;\\n\\n  \\n\\nvar KMAP \x3d \x7b\\\x22w\\\x22:601,\\\x22h\\\x22:768,\\\x22j\\\x22:\x7b\\\x22TUMPAT\\\x22:\x7b\\\x22d\\\x22:\\\x22M339 4l9 12-7 3 0 1-1 21 1 12 18 0 3 3-1 2-3-2-2 2 2 4 7 1 4 5 6-1 9 3 2 6 8 3 7 0-1-6 4-7 1-14 5-9-3-6-4-3-8 0-5-2-7 2-1-3-7-2-11-5z\\\x22,\\\x22x\\\x22:387,\\\x22y\\\x22:52,\\\x22a\\\x22:662\x7d,\\\x22KOTA BHARU\\\x22:\x7b\\\x22d\\\x22:\\\x22M389 156l8 4 4 5 6 0 0 2 2-2 6 1 2 3 1 0 0-5 4-3 0-11 4-2 0-9 6 1 1-2 0-2 3-2 10-2 2-4 1-13 4 0-1-3-10-8-1-3 2-4 3-1 2 1 5-3 2-3-2 0 1-4-18-13 3-5 11 0 0-11-3-5 6-7-18-13-26-10-1 7 5 9 0 3-4 12-2 13-4 9-2 13-3 5-10 5-18 0-4 3 3 4 15 9 9 15 0 6z\\\x22,\\\x22x\\\x22:416,\\\x22y\\\x22:114,\\\x22a\\\x22:1543\x7d,\\\x22PASIR MAS\\\x22:\x7b\\\x22d\\\x22:\\\x22M271 147l1 5 6 5 13-10 4 2 6 4 3 1 1 2 12 9 23 1 6-3 3 1 3-4 6 1 0 3 3 0 5-4 2 1 1 3 8 2 1 3 5 0 6-12 4-20 0-5-9-17-15-9-3-4 3-3 18 0 9-4 6-7-1-9-7 0-8-3-2-6-9-3-6 1-4-5-7-1-2-4 2-2 3 2 1-2-3-3-18 1 2 7-10 9-6 11-17 11-21 17 1 7-15 13-1 12z\\\x22,\\\x22x\\\x22:333,\\\x22y\\\x22:125,\\\x22a\\\x22:2267\x7d,\\\x22BACHOK\\\x22:\x7b\\\x22d\\\x22:\\\x22M426 139l0 7 5-1 1 3 3-1 1-2 9 2 9-2 9 12 6 3 5 7 6 3 7-3 5-5 22-8-10-19-30-47-21-42-6 8 3 4 0 11-12 0-2 5 5 3 4 4 5 2 1 3 3 1-1 4 2 0-2 3-6 3-1-1-4 1-1 4 1 4 2 0 9 10-4 0-1 13-2 4-10 2-3 2 0 2-1 2z\\\x22,\\\x22x\\\x22:472,\\\x22y\\\x22:129,\\\x22a\\\x22:1092\x7d,\\\x22PASIR PUTEH\\\x22:\x7b\\\x22d\\\x22:\\\x22M418 164l1 3 6 3 1 4-3 9 3 10-1 7 6 6 3-3 2 1-1 11 3 0 2 12 3 0 3 3 5-2 2 2 2-1 4 2 3-2 5 4 2-2-3-9 5-3 2 1 4-1 1 0-1 6-2 0 0 5 4-3 2 1-1 5 5-3 5 2 1-1 2 2 48-47-4-3-7-2-9-6 10 2-14-15-3-8-22 8-5 5-7 3-6-3-4-7-4-1-3-2-9-12-6 2-12-2-1 2-3 1-2-3-5 1 1 2-4 1 0 9-1 1 1 2z\\\x22,\\\x22x\\\x22:493,\\\x22y\\\x22:195,\\\x22a\\\x22:1715\x7d,\\\x22TANAH MERAH\\\x22:\x7b\\\x22d\\\x22:\\\x22M278 291l2 5 6 2 5 16-2 4-2 0 3 5 1-2 3 1 3 5 6-1 6 8 7-2-1-7 4-5-2-3 5-3 0-6 6-5 8 1 5-2 0-4 5-2-2-9 5-2 0-4 3-3-3-13 2-9 4-2 10 2 2-1 0-6-2-6 3-9-1-8 3-13 8-7 0-4-4-5 7-13 2-15-5 0-1-3-8-2-1-3-2-1-5 4-3 0 0-3-7-1-1 4-4-1-6 3-23-1-12-9-1-2-3-1-6-4-4-2-6 5 0 12 4 7 3 12 4 1 2 2 1 8 12 0 1 5-7 7 1 11 2 3-4 14-7 4-4 0-5 1 1 5-6 6 2 11 4 5 3 6-4 3-1 10-4 0-2-1z\\\x22,\\\x22x\\\x22:343,\\\x22y\\\x22:197,\\\x22a\\\x22:2731\x7d,\\\x22MACHANG\\\x22:\x7b\\\x22d\\\x22:\\\x22M352 278l4 6 9-6 7-2 0-3 1 0 1 5 3 4 5-3 5 1-1-5 4-1-2-2-2-7 14 3 9-3 0 4 15 3 5-6 6 2 2-3 3 0 7 3 3-4 4 2 6-1 4-6 5 0 0-3 3-2 7-3 2-5 6-5 6-8-2-2-1 1-5-2-5 3 1-5-2-1-3 3-1-5 2 0 1-6-1 0-4 1-2-1-5 3 3 9-2 2-5-4-3 2-4-2-2 1-2-2-5 2-3-3-3 0-2-12-3-1 1-10-2-1-3 3-6-6 1-7-3-11 3-8-1-4-6-4-2 3-2-3-6-1-2 2 0-2-6 0-4-5-8-4-6 13-2 15-7 13 4 5 0 4-8 7-3 13 1 8-3 9 2 6 0 6-2 1-11-2-4 3-1 9z\\\x22,\\\x22x\\\x22:404,\\\x22y\\\x22:230,\\\x22a\\\x22:2102\x7d,\\\x22JELI\\\x22:\x7b\\\x22d\\\x22:\\\x22M150 291l5 4 5 1 1 4 4 2-4 6-2 7 0 4-4 3 0 4-4 4 2 4 3 3 4-2 9 5 4-3 6-3 0 4 4 3 6-5 3 7 1 7-5 8-1 12 3 6-3 10 48 19 25 2 20-27 2 0 9-11-6 0-1-9 14-2-1-6 3-1-3-12 3-12-3 0-3-5-3-1-1 2-3-3 0-2 4-3-1-6-3-4-1-7-6-2-2-5 3-7 2 1 4 0 1-10 4-3-2-6-5-5-2-11 6-6-1-5 5-1 4 0 7-4 4-14-2-3-1-11 7-8-1-4-12 0-1-8-6-3-3-11-4-8 0-12-7 5 5 9 0 10-12 11-10 2-6 4-3 3-2 7-7 3-2 5-11 1-6 12 1 10-2 4-6-4-10-8-6-11-4-4-4-1-8 6-9-3 1 6-1 4-6 5-2-3-1 10 2 1-3 5 2 7-1 4-11 13-3 0-1 12 2 5-3 4z\\\x22,\\\x22x\\\x22:223,\\\x22y\\\x22:293,\\\x22a\\\x22:5896\x7d,\\\x22KUALA KRAI\\\x22:\x7b\\\x22d\\\x22:\\\x22M187 386l24 17 15 31 26 10 56 35 28 5 28-1-3-34 70 0 25-18 32-2 5-10-1-8 1-2-1-3 1-2 4 0 1-6-6-1-1-3-3-2 1-4-3 1-2-4-5 0-3-5-2 0-1-3 1-5 3 1 4-8-6-13 0-11-3-9 3-1 5-6 0-4 3 0-5-15 0-13 3-4-4-2 1-3-3-2-1-20-5-3-5 0-5 6-5 1-4-2-3 4-7-3-3 0-2 3-6-2-5 6-15-3 0-4-9 3-14-3 2 7 2 2-4 1 1 5-5-1-5 3-3-4 0-5-2 0 0 3-7 2-9 5-4-5-3 3 0 4-5 2 1 10-4 1 0 4-5 2-8-1-6 5 0 6-5 3 2 3-4 5 1 7-7 2-7-9-2 2-3 11 3 13-3 1 1 6-14 2 1 9 5 0-8 11-2 0-20 27-25-2z\\\x22,\\\x22x\\\x22:391,\\\x22y\\\x22:367,\\\x22a\\\x22:9144\x7d,\\\x22GUA MUSANG\\\x22:\x7b\\\x22d\\\x22:\\\x22M55 565l3 0 5 4 18 8 35 13 76-1 13-2-1-4 1-4-2-4-6-3 2-2-1-4 2-1 0-2 7 0 2 2 1 8 2 0 5-7 2 0 0 3 3 2-2 4 0 5-1 4-4 1 0 2-2 1 3 6 6-1 4 5 4 1-2 5 3 5 0 2-2 0 2 38-9 22 2 1-2 12 10 5 2 12 7 1 11 6 2 24 4 5 5-4 5-11 10-14 3-17 1-20 2-4 4 1 7 6 3-5 2-2 9 7 11-2 4 2 4 7 7-3 10-8 9-1 4 7 2 11 20 18 0 9 14 10 8 2 4-1 0-6 14-4 2-3 21 11 9-2 8-10 4-3 3-5-3-8 0-2 10-3 27-1 4 3 0 4 19 13 6 0 7-4 0-3 6-5 2-6 4 1 6 7 5-3 7 6 4-5-2-15-3-3 4-8-2-6 6-5 12 6 8 1 3-8-3-3 0-5-4-6-2-1-1-4 3-4 0-6-12-6-3 1-4-6-7 0-9-11-15-4-4 4-10-3 4-6-1-8 4-3-4-4 5-4-7-6-3-7 0-7 4-1 4-8-4-6 1-7-2-1-1-5-2-2 2-5 4 0 2-2 1-6 3-3-6-5 1-2-13-5 0-4-5-4 0-2-4-1 0-2-10-2-3-4-11-1 5-8-1-9-2-3 1-33-32 2-25 18-71 0 4 34-13 1-15 0-28-5-56-35-26-10-15-31-24-17 1 7 6 4-7 9-6 0-2 3-6 2-2 3-7-1-7 4-9-7-4 2-8-6-5 1-5 7-10 2-2 18-2 1-2-1-3 3-3 0-2 9-4 0-2-4-3 1-1 4 1 7-6 6 2 8-3 3 0 3-7 7-1 9-4 5 2 14-3 6 3 8-8 5-3 22-6 7 2 3-3 5z\\\x22,\\\x22x\\\x22:415,\\\x22y\\\x22:579,\\\x22a\\\x22:25498\x7d,\\\x22KECIL LOJING\\\x22:\x7b\\\x22d\\\x22:\\\x22M4 699l2 4 11 10 6 11 5 2-3 5 1 2 10 1 2-2 14 8 8 9 8 3 4-1 0-8 2-3 6 0 4-5 1 2 8-2 6 5 4 8 10 2 4 6 3 0 2 5 2-2 9-1 1 3 3 3 5-5 8-1 2-1 4-6 3-8 13-6 11-2 0-5 6 4 6-1 0-3 5-1 1-13 2-3-2-16 2-27 9-1 10 2 9-22-2-38 2 0 0-2-3-5 2-5-4-1-4-5-6 1-3-6 2-1 0-2 4-1 1-4 0-5 2-4-3-2 0-3-2 0-6 7-1-1-1-7-2-2-7 0 0 2-3 1 2 4-2 2 6 3 2 4-1 4 1 4-13 2-76 1-42-16-11-5-5-4-5 1-4 4 6 12 0 14 3 5 1 8-1 7-4 1 4 9-7-1-3 3-5-1 0 5-3 1-2 3 5 6 1 5-3 8-5 7 1 5-10 2 4 11 0 9-9 3-7 1-6-2z\\\x22,\\\x22x\\\x22:126,\\\x22y\\\x22:666,\\\x22a\\\x22:7252\x7d\x7d\x7d;\\nvar KMAP_NAMA \x3d \x7b\x27TUMPAT\x27: \x27Tumpat\x27, \x27KOTA BHARU\x27: \x27Kota Bharu\x27, \x27PASIR MAS\x27: \x27Pasir Mas\x27, \x27BACHOK\x27: \x27Bachok\x27, \x27PASIR PUTEH\x27: \x27Pasir Puteh\x27,\\n  \x27TANAH MERAH\x27: \x27Tanah Merah\x27, \x27MACHANG\x27: \x27Machang\x27, \x27JELI\x27: \x27Jeli\x27, \x27KUALA KRAI\x27: \x27Kuala Krai\x27, \x27GUA MUSANG\x27: \x27Gua Musang\x27, \x27KECIL LOJING\x27: \x27Kecil Lojing\x27\x7d;\\nvar KMAP_PENDEK \x3d \x7b\x27KOTA BHARU\x27: \x27K. Bharu\x27, \x27PASIR MAS\x27: \x27P. Mas\x27, \x27PASIR PUTEH\x27: \x27P. Puteh\x27, \x27TANAH MERAH\x27: \x27T. Merah\x27, \x27KUALA KRAI\x27: \x27K. Krai\x27, \x27KECIL LOJING\x27: \x27Lojing\x27\x7d;\\n\\nvar KMAP_WARNA \x3d \x7b\x27KOTA BHARU\x27: \x27#FF6384\x27, \x27TUMPAT\x27: \x27#36A2EB\x27, \x27PASIR MAS\x27: \x27#FFCD56\x27, \x27BACHOK\x27: \x27#4BC0C0\x27, \x27PASIR PUTEH\x27: \x27#9966FF\x27,\\n  \x27MACHANG\x27: \x27#FF9F40\x27, \x27TANAH MERAH\x27: \x27#36A2EB\x27, \x27JELI\x27: \x27#4BC0C0\x27, \x27KUALA KRAI\x27: \x27#9966FF\x27, \x27GUA MUSANG\x27: \x27#FF6384\x27, \x27KECIL LOJING\x27: \x27#FFCD56\x27\x7d;\\nfunction kmapKey(s)\x7b\\n  var t \x3d String(s || \x27\x27).toUpperCase().replace(\/^(JAJAHAN|DAERAH)\\\\s+\/, \x27\x27).replace(\/\x5b^A-Z\x5d\/g, \x27\x27);\\n  if (!t) return null;\\n  if (t.indexOf(\x27LOJING\x27) \x3e -1) return \x27KECIL LOJING\x27;\\n  for (var k in KMAP_NAMA) if (k.replace(\/\x5b^A-Z\x5d\/g, \x27\x27) \x3d\x3d\x3d t) return k;\\n  return null;\\n\x7d\\nfunction kmap(id, gs, rows)\x7b\\n  KMAP.rows \x3d rows || \x5b\x5d;\\n  var el \x3d $(id), by \x3d \x7b\x7d, lain \x3d 0, lainN \x3d \x5b\x5d;\\n  gs.forEach(function(g)\x7b\\n    var k \x3d kmapKey(g.k);\\n    if (!k)\x7b lain +\x3d g.t; lainN.push(g.k + \x27 (\x27 + g.t + \x27)\x27); return; \x7d\\n    var b \x3d by\x5bk\x5d || (by\x5bk\x5d \x3d \x7bA: 0, B: 0, C: 0, t: 0\x7d);\\n    b.A +\x3d g.A; b.B +\x3d g.B; b.C +\x3d g.C; b.t +\x3d g.t;\\n  \x7d);\\n  var max \x3d 0; Object.keys(by).forEach(function(k)\x7b if (by\x5bk\x5d.t \x3e max) max \x3d by\x5bk\x5d.t; \x7d);\\n  var sel \x3d kmapKey($(\x27fDaerah\x27).value), base \x3d \x27\x27, fill \x3d \x27\x27, txt \x3d \x27\x27;\\n  Object.keys(KMAP.j).forEach(function(k)\x7b\\n    var j \x3d KMAP.j\x5bk\x5d, b \x3d by\x5bk\x5d || \x7bA: 0, B: 0, C: 0, t: 0\x7d, f \x3d max ? b.t \/ max : 0, big \x3d j.a \x3e 1400;\\n    var tip \x3d KMAP_NAMA\x5bk\x5d + \x27: \x27 + b.t + \x27 orang\x27 + (b.t ? \x27 (A \x27 + b.A + \x27 · B \x27 + b.B + \x27 · C \x27 + b.C + \x27)\x27 : \x27\x27);\\n    base +\x3d \x27\x3cpath d\x3d\\\x22\x27 + j.d + \x27\\\x22\/\x3e\x27;\\n    fill +\x3d \x27\x3cpath class\x3d\\\x22kj\x27 + (sel \x3d\x3d\x3d k ? \x27 on\x27 : \x27\x27) + \x27\\\x22 data-k\x3d\\\x22\x27 + k + \x27\\\x22 d\x3d\\\x22\x27 + j.d + \x27\\\x22 style\x3d\\\x22fill:\x27 + KMAP_WARNA\x5bk\x5d + \x27;fill-opacity:\x27 + (b.t ? (0.45 + 0.55 * f).toFixed(2) : 0) +\\n      \x27\\\x22 tabindex\x3d\\\x220\\\x22 role\x3d\\\x22button\\\x22 aria-label\x3d\\\x22\x27 + esc(tip) + \x27\\\x22\x3e\x3ctitle\x3e\x27 + esc(tip) + \x27\x3c\\\/title\x3e\x3c\\\/path\x3e\x27;\\n    var dk \x3d \x27\x27;\\n    txt +\x3d \x27\x3ctext class\x3d\\\x22kn\x27 + dk + \x27\\\x22 x\x3d\\\x22\x27 + j.x + \x27\\\x22 y\x3d\\\x22\x27 + (j.y - (big ? 12 : 8)) + \x27\\\x22 style\x3d\\\x22font-size:\x27 + (big ? 13 : 9.5) + \x27px\\\x22\x3e\x27 + esc(KMAP_PENDEK\x5bk\x5d || KMAP_NAMA\x5bk\x5d) + \x27\x3c\\\/text\x3e\x27 +\\n      \x27\x3ctext class\x3d\\\x22kv\x27 + dk + \x27\\\x22 x\x3d\\\x22\x27 + j.x + \x27\\\x22 y\x3d\\\x22\x27 + (j.y + (big ? 8 : 6)) + \x27\\\x22 style\x3d\\\x22font-size:\x27 + (big ? 18 : 14) + \x27px\\\x22\x3e\x27 + b.t + \x27\x3c\\\/text\x3e\x27;\\n  \x7d);\\n  el.innerHTML \x3d \x27\x3csvg class\x3d\\\x22kmap\\\x22 viewBox\x3d\\\x220 0 \x27 + KMAP.w + \x27 \x27 + KMAP.h + \x27\\\x22 role\x3d\\\x22img\\\x22 aria-label\x3d\\\x22Peta Kelantan: bilangan terkesan mengikut jajahan\\\x22\x3e\x27 +\\n    \x27\x3cg class\x3d\\\x22kbase\\\x22\x3e\x27 + base + \x27\x3c\\\/g\x3e\x3cg class\x3d\\\x22kfill\\\x22\x3e\x27 + fill + \x27\x3c\\\/g\x3e\x3cg class\x3d\\\x22ktxt\\\x22\x3e\x27 + txt + \x27\x3c\\\/g\x3e\x3c\\\/svg\x3e\x27;\\n  var leg \x3d $(\x27chDaerahLeg\x27);\\n  if (leg) leg.innerHTML \x3d \x27\x3cspan\x3eWarna ikut jajahan · lebih pekat \x3d lebih ramai (maks \x27 + max + \x27 orang)\x3c\\\/span\x3e\x27 +\\n    (lain ? \x27\x3cspan title\x3d\\\x22\x27 + esc(lainN.join(\x27, \x27)) + \x27\\\x22\x3eLain \/ tiada jajahan: \x27 + lain + \x27\x3c\\\/span\x3e\x27 : \x27\x27) +\\n    \x27\x3cspan\x3eKetik jajahan untuk butiran\x3c\\\/span\x3e\x27;\\n  if (KMAP.tipK)\x7b var k0 \x3d KMAP.tipK; KMAP.tipK \x3d null; kmapTip(k0, KMAP.tipX, KMAP.tipY); \x7d\\n\x7d\\n\\nfunction kmapDetail(k)\x7b\\n  var rows \x3d (KMAP.rows || \x5b\x5d).filter(function(r)\x7b return kmapKey(r.daerah) \x3d\x3d\x3d k; \x7d);\\n  var c \x3d \x7bA: 0, B: 0, C: 0\x7d, kat \x3d \x7b\x7d, pps \x3d \x7b\x7d, kaw \x3d \x7b\x7d;\\n  rows.forEach(function(r)\x7b\\n    if (c\x5br.kesan\x5d !\x3d null) c\x5br.kesan\x5d++;\\n    if (r.kategori) kat\x5br.kategori\x5d \x3d (kat\x5br.kategori\x5d || 0) + 1;\\n    if (r.kesan \x3d\x3d\x3d \x27A\x27 \x26\x26 r.pps) pps\x5br.pps\x5d \x3d (pps\x5br.pps\x5d || 0) + 1;\\n    var kw \x3d r.kawasan || r.projek; if (kw) kaw\x5bkw\x5d \x3d (kaw\x5bkw\x5d || 0) + 1;\\n  \x7d);\\n  return \x7bn: rows.length, c: c, kat: kat, pps: pps, kaw: kaw\x7d;\\n\x7d\\nfunction kmapTop(o, n)\x7b return Object.keys(o).sort(function(a, b)\x7b return o\x5bb\x5d - o\x5ba\x5d; \x7d).slice(0, n).map(function(k)\x7b return \x5bk, o\x5bk\x5d\x5d; \x7d); \x7d\\nfunction kmapTipHide()\x7b\\n  var t \x3d $(\x27kTip\x27); if (t) t.remove();\\n  KMAP.tipK \x3d null;\\n  var on \x3d document.querySelector(\x27#chDaerah .kj.tip\x27); if (on) on.classList.remove(\x27tip\x27);\\n\x7d\\nfunction kmapTip(k, x, y)\x7b\\n  var el \x3d $(\x27chDaerah\x27), d \x3d kmapDetail(k);\\n  kmapTipHide();\\n  if (!d.n) return;\\n  KMAP.tipK \x3d k; KMAP.tipX \x3d x; KMAP.tipY \x3d y;\\n  var p \x3d el.querySelector(\x27.kj\x5bdata-k\x3d\\\x22\x27 + k + \x27\\\x22\x5d\x27); if (p) p.classList.add(\x27tip\x27);\\n  var sel \x3d kmapKey($(\x27fDaerah\x27).value) \x3d\x3d\x3d k;\\n  var row \x3d function(lbl, v, cls)\x7b return \x27\x3cdiv class\x3d\\\x22kt-r\\\x22\x3e\x3cspan\x3e\x27 + lbl + \x27\x3c\\\/span\x3e\x3cspan class\x3d\\\x22track\\\x22\x3e\x3ci class\x3d\\\x22\x27 + cls + \x27\\\x22 style\x3d\\\x22width:\x27 + (v \/ d.n * 100) + \x27%\\\x22\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cb\x3e\x27 + v + \x27\x3c\\\/b\x3e\x3c\\\/div\x3e\x27; \x7d;\\n  var li \x3d function(a)\x7b return a.map(function(x)\x7b return \x27\x3cli\x3e\x3cspan\x3e\x27 + esc(x\x5b0\x5d) + \x27\x3c\\\/span\x3e\x3cb\x3e\x27 + x\x5b1\x5d + \x27\x3c\\\/b\x3e\x3c\\\/li\x3e\x27; \x7d).join(\x27\x27); \x7d;\\n  var kat \x3d kmapTop(d.kat, 4), kaw \x3d kmapTop(d.kaw, 3), pps \x3d kmapTop(d.pps, 3), nPps \x3d Object.keys(d.pps).length;\\n  var t \x3d document.createElement(\x27div\x27);\\n  t.id \x3d \x27kTip\x27; t.className \x3d \x27ktip\x27; t.setAttribute(\x27role\x27, \x27dialog\x27); t.setAttribute(\x27aria-label\x27, \x27Butiran \x27 + KMAP_NAMA\x5bk\x5d);\\n  t.innerHTML \x3d \x27\x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22kt-x\\\x22 aria-label\x3d\\\x22Tutup\\\x22\x3e✕\x3c\\\/button\x3e\x27 +\\n    \x27\x3cb class\x3d\\\x22kt-h\\\x22\x3e\x27 + esc(KMAP_NAMA\x5bk\x5d) + \x27\x3c\\\/b\x3e\x3csmall class\x3d\\\x22kt-s\\\x22\x3e\x27 + d.n + \x27 orang terkesan\x3c\\\/small\x3e\x27 +\\n    row(\x27A · Berpindah\x27, d.c.A, \x27sa\x27) + row(\x27B · Tidak berpindah\x27, d.c.B, \x27sb\x27) + row(\x27C · Terperangkap\x27, d.c.C, \x27sc\x27) +\\n    (kat.length ? \x27\x3cdiv class\x3d\\\x22kt-t\\\x22\x3eKategori\x3c\\\/div\x3e\x3cul class\x3d\\\x22kt-l\\\x22\x3e\x27 + li(kat) + \x27\x3c\\\/ul\x3e\x27 : \x27\x27) +\\n    (kaw.length ? \x27\x3cdiv class\x3d\\\x22kt-t\\\x22\x3eKawasan teratas\x3c\\\/div\x3e\x3cul class\x3d\\\x22kt-l\\\x22\x3e\x27 + li(kaw) + \x27\x3c\\\/ul\x3e\x27 : \x27\x27) +\\n    (nPps ? \x27\x3cdiv class\x3d\\\x22kt-t\\\x22\x3ePusat pemindahan (\x27 + nPps + \x27)\x3c\\\/div\x3e\x3cul class\x3d\\\x22kt-l\\\x22\x3e\x27 + li(pps) + (nPps \x3e 3 ? \x27\x3cli\x3e\x3cspan\x3e+\x27 + (nPps - 3) + \x27 lagi\x3c\\\/span\x3e\x3c\\\/li\x3e\x27 : \x27\x27) + \x27\x3c\\\/ul\x3e\x27 : \x27\x27) +\\n    \x27\x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22btn kt-f\\\x22\x3e\x27 + (sel ? \x27Buang tapisan jajahan\x27 : \x27Tapis dashboard: \x27 + esc(KMAP_NAMA\x5bk\x5d)) + \x27\x3c\\\/button\x3e\x27;\\n  el.appendChild(t);\\n  var W \x3d el.clientWidth, H \x3d el.clientHeight, tw \x3d t.offsetWidth, th \x3d t.offsetHeight;\\n  var left \x3d x + 14 + tw \x3c\x3d W - 4 ? x + 14 : (x - 14 - tw \x3e\x3d 4 ? x - 14 - tw : Math.max(4, (W - tw) \/ 2));\\n  var top \x3d Math.max(4, Math.min(y - th \/ 2, H - th - 4));\\n  t.style.left \x3d left + \x27px\x27; t.style.top \x3d top + \x27px\x27;\\n  t.addEventListener(\x27click\x27, function(e)\x7b e.stopPropagation(); \x7d);\\n  t.querySelector(\x27.kt-x\x27).onclick \x3d function()\x7b kmapTipHide(); \x7d;\\n  t.querySelector(\x27.kt-f\x27).onclick \x3d function()\x7b kmapFilter(k); \x7d;\\n\x7d\\nfunction kmapFilter(k)\x7b\\n  var sel \x3d $(\x27fDaerah\x27);\\n  if (kmapKey(sel.value) \x3d\x3d\x3d k) sel.value \x3d \x27\x27;\\n  else \x7b\\n    var opt \x3d Array.prototype.filter.call(sel.options, function(o)\x7b return o.value \x26\x26 kmapKey(o.value) \x3d\x3d\x3d k; \x7d)\x5b0\x5d;\\n    if (!opt) return;\\n    sel.value \x3d opt.value;\\n  \x7d\\n  renderDash();\\n\x7d\\nfunction kmapPick(p, e)\x7b\\n  var k \x3d p.getAttribute(\x27data-k\x27);\\n  if (KMAP.tipK \x3d\x3d\x3d k)\x7b kmapTipHide(); return; \x7d\\n  var r \x3d $(\x27chDaerah\x27).getBoundingClientRect(), b \x3d p.getBoundingClientRect();\\n  var byMouse \x3d e \x26\x26 e.type \x3d\x3d\x3d \x27click\x27 \x26\x26 e.clientX;\\n  kmapTip(k, byMouse ? e.clientX - r.left : b.left + b.width \/ 2 - r.left, byMouse ? e.clientY - r.top : b.top + b.height \/ 2 - r.top);\\n\x7d\\ndocument.addEventListener(\x27click\x27, function(e)\x7b\\n  if (KMAP.tipK \x26\x26 !e.target.closest(\x27#chDaerah .kj\x27) \x26\x26 !e.target.closest(\x27#kTip\x27)) kmapTipHide();\\n\x7d);\\ndocument.addEventListener(\x27keydown\x27, function(e)\x7b if (e.key \x3d\x3d\x3d \x27Escape\x27 \x26\x26 KMAP.tipK) kmapTipHide(); \x7d);\\n$(\x27chDaerah\x27).addEventListener(\x27click\x27, function(e)\x7b var p \x3d e.target.closest(\x27.kj\x27); if (p) kmapPick(p, e); \x7d);\\n$(\x27chDaerah\x27).addEventListener(\x27keydown\x27, function(e)\x7b\\n  var p \x3d e.target.closest(\x27.kj\x27); if (p \x26\x26 (e.key \x3d\x3d\x3d \x27Enter\x27 || e.key \x3d\x3d\x3d \x27 \x27))\x7b e.preventDefault(); kmapPick(p, e); \x7d\\n\x7d);\\n \\nvar SKULLET_URL \x3d \x27https:\/\/cdn.jsdelivr.net\/npm\/skullet@0.0.3\/dist\/index.mjs\x27;\\nvar SK \x3d \x7bm: \x7bhost: \x27mHost\x27, body: \x27mBody\x27\x7d, p: \x7bhost: \x27pHost\x27, body: \x27pBody\x27\x7d, lib: null\x7d;\\nSK.ready \x3d import(SKULLET_URL).then(function(m)\x7b SK.lib \x3d m; return m; \x7d).catch(function()\x7b return null; \x7d);\\n\\nfunction skSample(c)\x7b\\n  var rows \x3d function(n, f)\x7b var h \x3d \x27\x27; for (var i \x3d 0; i \x3c n; i++) h +\x3d f(i); return h; \x7d;\\n  var bars \x3d rows(5, function(i)\x7b return \x27\x3cdiv class\x3d\\\x22brow\\\x22\x3e\x3cspan class\x3d\\\x22lb\\\x22\x3eNama sampel \x27 + (i + 1) + \x27\x3c\\\/span\x3e\x3cspan class\x3d\\\x22track\\\x22\x3e\x3ci class\x3d\\\x22sg\\\x22 style\x3d\\\x22width:\x27 + \x5b88, 70, 55, 40, 25\x5d\x5bi\x5d + \x27%\\\x22\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan class\x3d\\\x22n\\\x22\x3e00\x3c\\\/span\x3e\x3c\\\/div\x3e\x27; \x7d);\\n  var donut \x3d \x27\x3csvg viewBox\x3d\\\x220 0 120 120\\\x22 skullet-block style\x3d\\\x22border-radius:50%\\\x22\x3e\x3c\\\/svg\x3e\x3cul class\x3d\\\x22dn-leg\\\x22\x3e\x27 +\\n    rows(3, function()\x7b return \x27\x3cli\x3e\x3ci\x3e\x3c\\\/i\x3e\x3cspan\x3eKategori sampel\x3c\\\/span\x3e\x3cb\x3e00\x3c\\\/b\x3e\x3cem\x3e00%\x3c\\\/em\x3e\x3c\\\/li\x3e\x27; \x7d) + \x27\x3c\\\/ul\x3e\x27;\\n  var fill \x3d \x7b\\n    dnStatus: donut, dnKat: donut, pdKat: donut,\\n    chKat: bars, chKaw: bars, chPps: bars, pcHHI: bars, pcLuas: bars,\\n    chDaerah: \x27\x3cdiv skullet-block style\x3d\\\x22aspect-ratio:601\/768;max-width:400px;margin:6px auto 0\\\x22\x3e\x3c\\\/div\x3e\x27,\\n    pcHarian: \x27\x3cdiv skullet-block style\x3d\\\x22height:150px;margin-top:8px\\\x22\x3e\x3c\\\/div\x3e\x27,\\n    dList: rows(5, function()\x7b return \x27\x3cdiv class\x3d\\\x22rec\\\x22\x3e\x3cspan class\x3d\\\x22kb sx\\\x22\x3eA\x3c\\\/span\x3e\x3cdiv class\x3d\\\x22rb\\\x22\x3e\x3cb\x3eNama penuh mangsa\x3c\\\/b\x3e\x3csmall\x3eKategori · projek · kawasan\x3c\\\/small\x3e\x3csmall\x3eMukim · daerah · 00\/00\/0000\x3c\\\/small\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\x27; \x7d),\\n    pList: rows(3, function()\x7b return \x27\x3cdiv class\x3d\\\x22prc\\\x22\x3e\x3cdiv class\x3d\\\x22prh\\\x22\x3e\x3cspan class\x3d\\\x22kb sx\\\x22\x3eA\x3c\\\/span\x3e\x3cdiv class\x3d\\\x22rb\\\x22\x3e\x3cb\x3eNama projek sampel\x3c\\\/b\x3e\x3csmall\x3eKawasan · kod · laporan 00\/00\/0000\x3c\\\/small\x3e\x3c\\\/div\x3e\x3c\\\/div\x3e\x3cdiv class\x3d\\\x22prs\\\x22\x3e\x27 +\\n      rows(4, function()\x7b return \x27\x3cdiv\x3e\x3cspan\x3ePerkara\x3c\\\/span\x3e\x3cb\x3e00.00\x3c\\\/b\x3e\x3c\\\/div\x3e\x27; \x7d) + \x27\x3c\\\/div\x3e\x3c\\\/div\x3e\x27; \x7d)\\n  \x7d;\\n  Object.keys(fill).forEach(function(id)\x7b\\n    var el \x3d c.querySelector(\x27#\x27 + id);\\n    if (el \x26\x26 (!el.children.length || el.querySelector(\x27.empty\x27))) el.innerHTML \x3d fill\x5bid\x5d;\\n  \x7d);\\n  var mp \x3d c.querySelector(\x27#dmap\x27);\\n  if (mp)\x7b mp.innerHTML \x3d \x27\x27; mp.className \x3d \x27\x27; mp.setAttribute(\x27skullet-block\x27, \x27\x27); \x7d\\n  c.querySelectorAll(\x27.hidden\x27).forEach(function(e)\x7b e.remove(); \x7d);\\n  c.removeAttribute(\x27id\x27);\\n  c.querySelectorAll(\x27\x5bid\x5d\x27).forEach(function(e)\x7b e.removeAttribute(\x27id\x27); \x7d);\\n  return c;\\n\x7d\\n\\nvar LOADING \x3d \x7b\x7d;\\nfunction setLoading(k, on)\x7b\\n  LOADING\x5bk\x5d \x3d !!on;\\n  var bar \x3d $(\x27dLoad\x27);\\n  if (bar)\x7b bar.classList.toggle(\x27on\x27, !!(LOADING.m || LOADING.p)); bar.setAttribute(\x27aria-hidden\x27, (LOADING.m || LOADING.p) ? \x27false\x27 : \x27true\x27); \x7d\\n  var meta \x3d $(k \x3d\x3d\x3d \x27m\x27 ? \x27dUpd\x27 : \x27pUpd\x27), btn \x3d $(k \x3d\x3d\x3d \x27m\x27 ? \x27dRefresh\x27 : \x27pRefresh\x27);\\n  if (meta) meta.classList.toggle(\x27busy\x27, !!on);\\n  if (btn) btn.classList.toggle(\x27busy\x27, !!on);\\n\x7d\\nfunction skStart(k)\x7b\\n  var s \x3d SK\x5bk\x5d; s.pending \x3d true;\\n  SK.ready.then(function(lib)\x7b\\n    if (!lib || !s.pending || s.on) return;\\n    var host \x3d $(s.host), body \x3d $(s.body);\\n    if (!host || !body) return;\\n    try \x7b\\n      if (!s.rv) s.rv \x3d new lib.Reveal(host, \x7bid: \x27lapbanjir-\x27 + k, label: \x27Memuat data\\u2026\x27\x7d);\\n      var c \x3d skSample(body.cloneNode(true));\\n      s.el \x3d body; body.remove();\\n      s.rv.load(c);\\n      s.on \x3d true;\\n    \x7d catch (e) \x7b if (s.el \x26\x26 !s.el.isConnected) host.appendChild(s.el); s.on \x3d false; \x7d\\n  \x7d);\\n\x7d\\nfunction skEnd(k)\x7b\\n  var s \x3d SK\x5bk\x5d; s.pending \x3d false;\\n  if (!s.on) return;\\n  s.on \x3d false;\\n  try \x7b s.rv.show(s.el); \x7d catch (e) \x7b $(s.host).appendChild(s.el); \x7d\\n\x7d\\nfunction esc(s)\x7b\\n    return String(s \x3d\x3d null ? \x27\x27 : s).replace(\/\x5b\x26\x3c\x3e\\\x22\x27\x5d\/g, function(c)\x7b\\n      return \x7b\x27\x26\x27:\x27\x26amp;\x27,\x27\x3c\x27:\x27\x26lt;\x27,\x27\x3e\x27:\x27\x26gt;\x27,\x27\\\x22\x27:\x27\x26quot;\x27,\\\x22\x27\\\x22:\x27\x26#39;\x27\x7d\x5bc\x5d;\\n    \x7d);\\n  \x7d\\n  function cssVar(n)\x7b return getComputedStyle(document.documentElement).getPropertyValue(n).trim(); \x7d\\n\\n  $(\x27tabForm\x27).onclick \x3d function()\x7b showView(\x27form\x27); \x7d;\\n  $(\x27tabDash\x27).onclick \x3d function()\x7b showView(\x27dash\x27); \x7d;\\n  $(\x27tabProj\x27).onclick \x3d function()\x7b showView(\x27proj\x27); \x7d;\\n  $(\x27dRefresh\x27).onclick \x3d function()\x7b loadDash(true); \x7d;\\n  $(\x27fDaerah\x27).onchange \x3d renderDash;\\n  $(\x27fKesan\x27).onchange \x3d renderDash;\\n  $(\x27fCari\x27).oninput \x3d renderDash;\\n  $(\x27dMore\x27).onclick \x3d function()\x7b D.shown +\x3d 50; renderList(D.filtered); \x7d;\\n  $(\x27dList\x27).addEventListener(\x27click\x27, function(e)\x7b\\n    var b \x3d e.target.closest(\x27.pin\x27);\\n    if (b) focusOnMap(Number(b.getAttribute(\x27data-row\x27)));\\n  \x7d);\\n\\n  function showView(v)\x7b\\n    var form \x3d v \x3d\x3d\x3d \x27form\x27, proj \x3d v \x3d\x3d\x3d \x27proj\x27, dash \x3d v \x3d\x3d\x3d \x27dash\x27;\\n    $(\x27viewForm\x27).classList.toggle(\x27hidden\x27, !form);\\n    $(\x27formBar\x27).classList.toggle(\x27hidden\x27, !form);\\n    $(\x27viewProj\x27).classList.toggle(\x27hidden\x27, !proj);\\n    $(\x27projBar\x27).classList.toggle(\x27hidden\x27, !proj || !$(\x27pDone\x27).classList.contains(\x27hidden\x27));\\n    $(\x27viewDash\x27).classList.toggle(\x27hidden\x27, !dash);\\n    $(\x27tabForm\x27).classList.toggle(\x27on\x27, form);\\n    $(\x27tabProj\x27).classList.toggle(\x27on\x27, proj);\\n    $(\x27tabDash\x27).classList.toggle(\x27on\x27, dash);\\n    window.scrollTo(0, 0);\\n    if (dash) \x7b if (D.sub \x3d\x3d\x3d \x27proj\x27) loadProj(false); else loadDash(false); \x7d\\n    if (proj \x26\x26 window.loadProjek) loadProjek();\\n  \x7d\\n\\n   \\nvar STALE_MS \x3d 60000; \\nfunction fetchData(o, fn, fresh)\x7b\\n  if (o.req) return o.req;\\n  o.req \x3d new Promise(function(res, rej)\x7b\\n    google.script.run.withSuccessHandler(res).withFailureHandler(rej)\x5bfn\x5d(!!fresh);\\n  \x7d).then(function(r)\x7b o.req \x3d null; o.res \x3d r; o.rows \x3d r.rows; o.at \x3d Date.now(); return r; \x7d,\\n          function(e)\x7b o.req \x3d null; throw e; \x7d);\\n  return o.req;\\n\x7d\\nfunction showDash()\x7b\\n  if (!D.res) return;\\n  $(\x27dUpd\x27).textContent \x3d \x27Dikemas kini \x27 + D.res.updated + \x27 · \x27 + D.rows.length + \x27 rekod dalam sheet DB\x27;\\n  fillDaerah(); renderDash();\\n\x7d\\nfunction showProj()\x7b\\n  if (!DP.res) return;\\n  $(\x27pUpd\x27).textContent \x3d \x27Dikemas kini \x27 + DP.res.updated + \x27 · \x27 + DP.rows.length + \x27 laporan dalam LAP PROJEK\x27;\\n  var cur \x3d $(\x27pfKaw\x27).value, ks \x3d \x5b\x5d;\\n  DP.rows.forEach(function(x)\x7b if (x.kawasan \x26\x26 ks.indexOf(x.kawasan) \x3c 0) ks.push(x.kawasan); \x7d);\\n  ks.sort();\\n  $(\x27pfKaw\x27).innerHTML \x3d \x27\x3coption value\x3d\\\x22\\\x22\x3eSemua kawasan\x3c\\\/option\x3e\x27 + ks.map(function(k)\x7b\\n    return \x27\x3coption\x27 + (k \x3d\x3d\x3d cur ? \x27 selected\x27 : \x27\x27) + \x27\x3e\x27 + esc(k) + \x27\x3c\\\/option\x3e\x27; \x7d).join(\x27\x27);\\n  renderProj();\\n\x7d\\n\\nfunction loadData(k, force, silent)\x7b\\n  var m \x3d k \x3d\x3d\x3d \x27m\x27, o \x3d m ? D : DP, fn \x3d m ? \x27getDashboard\x27 : \x27getDashProjek\x27,\\n      upd \x3d m ? \x27dUpd\x27 : \x27pUpd\x27, btn \x3d m ? \x27dRefresh\x27 : \x27pRefresh\x27, show \x3d m ? showDash : showProj, have \x3d !!o.res;\\n  if (have \x26\x26 !force)\x7b show(); if (Date.now() - o.at \x3c STALE_MS) return; silent \x3d true; \x7d\\n  if (!have || (force \x26\x26 !silent)) $(upd).textContent \x3d \x27Memuat data\\u2026\x27;\\n  $(btn).disabled \x3d true;\\n  setLoading(k, true);\\n  if (!silent) skStart(k);\\n  fetchData(o, fn, force \x26\x26 !silent).then(function()\x7b\\n    skEnd(k); setLoading(k, false); $(btn).disabled \x3d false; show();\\n  \x7d, function(e)\x7b\\n    skEnd(k); setLoading(k, false); $(btn).disabled \x3d false;\\n    $(upd).textContent \x3d \x27Gagal memuat data: \x27 + ((e \x26\x26 e.message) || e);\\n  \x7d);\\n\x7d\\nfunction loadDash(force, silent)\x7b loadData(\x27m\x27, force, silent); \x7d\\nfunction loadProj(force, silent)\x7b loadData(\x27p\x27, force, silent); \x7d\\n\\n\\n  function fillDaerah()\x7b\\n    var cur \x3d $(\x27fDaerah\x27).value, seen \x3d \x7b\x7d, list \x3d \x5b\x5d;\\n    D.rows.forEach(function(r)\x7b if (r.daerah \x26\x26 !seen\x5br.daerah\x5d)\x7b seen\x5br.daerah\x5d \x3d 1; list.push(r.daerah); \x7d \x7d);\\n    list.sort();\\n    $(\x27fDaerah\x27).innerHTML \x3d \x27\x3coption value\x3d\\\x22\\\x22\x3eSemua daerah\x3c\\\/option\x3e\x27 + list.map(function(d)\x7b\\n      return \x27\x3coption\x27 + (d \x3d\x3d\x3d cur ? \x27 selected\x27 : \x27\x27) + \x27\x3e\x27 + esc(d) + \x27\x3c\\\/option\x3e\x27;\\n    \x7d).join(\x27\x27);\\n  \x7d\\n\\n  function getFiltered(noD)\x7b\\n    var d \x3d noD ? \x27\x27 : $(\x27fDaerah\x27).value, k \x3d $(\x27fKesan\x27).value, q \x3d $(\x27fCari\x27).value.trim().toUpperCase();\\n    return D.rows.filter(function(r)\x7b\\n      if (d \x26\x26 r.daerah !\x3d\x3d d) return false;\\n      if (k \x26\x26 r.kesan !\x3d\x3d k) return false;\\n      if (q \x26\x26 \x5br.nama, r.projek, r.kawasan, r.mukim, r.pps\x5d.join(\x27 \x27).toUpperCase().indexOf(q) \x3c 0) return false;\\n      return true;\\n    \x7d);\\n  \x7d\\n\\n  function group(rows, key)\x7b\\n    var m \x3d \x7b\x7d;\\n    rows.forEach(function(r)\x7b\\n      var g \x3d r\x5bkey\x5d || \x27(TIADA)\x27;\\n      if (!m\x5bg\x5d) m\x5bg\x5d \x3d \x7bk: g, A: 0, B: 0, C: 0, t: 0\x7d;\\n      if (r.kesan) m\x5bg\x5d\x5br.kesan\x5d++;\\n      m\x5bg\x5d.t++;\\n    \x7d);\\n    return Object.keys(m).map(function(x)\x7b return m\x5bx\x5d; \x7d).sort(function(a, b)\x7b return b.t - a.t; \x7d);\\n  \x7d\\n\\n  function renderDash()\x7b\\n  if (!$(\x27dT\x27)) return; \\n    var rows \x3d getFiltered(), n \x3d rows.length, c \x3d \x7bA: 0, B: 0, C: 0\x7d;\\n    D.filtered \x3d rows; D.shown \x3d 50;\\n    rows.forEach(function(r)\x7b if (c\x5br.kesan\x5d !\x3d null) c\x5br.kesan\x5d++; \x7d);\\n    var pct \x3d function(x)\x7b return n ? Math.round(x * 100 \/ n) + \x27% daripada jumlah\x27 : \x27\x27; \x7d;\\n    var pps \x3d group(rows.filter(function(r)\x7b return r.kesan \x3d\x3d\x3d \x27A\x27 \x26\x26 r.pps; \x7d), \x27pps\x27);\\n    $(\x27dT\x27).textContent \x3d n;\\n    $(\x27dA\x27).textContent \x3d c.A; $(\x27dAp\x27).textContent \x3d pct(c.A);\\n    $(\x27dB\x27).textContent \x3d c.B; $(\x27dBp\x27).textContent \x3d pct(c.B);\\n    $(\x27dC\x27).textContent \x3d c.C; $(\x27dCp\x27).textContent \x3d pct(c.C);\\n    $(\x27dP\x27).textContent \x3d pps.length;\\n    var tiada \x3d n - c.A - c.B - c.C;\\n    donut(\x27dnStatus\x27, \x5b\\n      \x7bk: \x27A · Berpindah\x27, v: c.A, c: \x27var(--a)\x27\x7d,\\n      \x7bk: \x27B · Tidak berpindah\x27, v: c.B, c: \x27var(--b)\x27\x7d,\\n      \x7bk: \x27C · Terperangkap\x27, v: c.C, c: \x27var(--c)\x27\x7d\\n    \x5d.concat(tiada \x3e 0 ? \x5b\x7bk: \x27Tiada status\x27, v: tiada, c: \x27var(--line2)\x27\x7d\x5d : \x5b\x5d));\\n    var KATC \x3d \x7bSTAF: \x27var(--acc5)\x27, GPS: \x27#14b8a6\x27, PESERTA: \x27#8b5cf6\x27, PEKERJA: \x27#64748b\x27\x7d;\\n    donut(\x27dnKat\x27, group(rows, \x27kategori\x27).map(function(g)\x7b return \x7bk: g.k, v: g.t, c: KATC\x5bg.k\x5d || \x27var(--line2)\x27\x7d; \x7d));\\n    var nd \x3d getFiltered(true); kmap(\x27chDaerah\x27, group(nd, \x27daerah\x27), nd);\\n    bars(\x27chKat\x27, group(rows, \x27kategori\x27), true);\\n    bars(\x27chKaw\x27, group(rows, \x27kawasan\x27).slice(0, 10), true);\\n    bars(\x27chPps\x27, pps, false);\\n    renderMap(rows);\\n    renderList(rows);\\n  \x7d\\n\\n   \\nvar CJ \x3d \x7b\x7d;\\nfunction cjCol(c)\x7b var m \x3d \/^var\\\\((--\x5b\\\\w-\x5d+)\/.exec(c || \x27\x27); return m ? (cssVar(m\x5b1\x5d) || \x27#999\x27) : (c || \x27#999\x27); \x7d\\nfunction cjTheme()\x7b\\n  Chart.defaults.color \x3d cssVar(\x27--muted\x27) || \x27#737373\x27;\\n  Chart.defaults.borderColor \x3d cssVar(\x27--line\x27) || \x27#e5e5e5\x27;\\n  Chart.defaults.font.family \x3d getComputedStyle(document.body).fontFamily;\\n  Chart.defaults.font.size \x3d 11.5;\\n  Chart.defaults.plugins.tooltip.backgroundColor \x3d \x27rgba(23,23,23,.92)\x27;\\n  Chart.defaults.plugins.tooltip.padding \x3d 9;\\n  Chart.defaults.plugins.tooltip.cornerRadius \x3d 8;\\n  Chart.defaults.plugins.tooltip.boxPadding \x3d 4;\\n\x7d\\nfunction cjEmpty(id)\x7b\\n  if (CJ\x5bid\x5d)\x7b try \x7b CJ\x5bid\x5d.destroy(); \x7d catch (e) \x7b\x7d delete CJ\x5bid\x5d; \x7d\\n  $(id).innerHTML \x3d \x27\x3cdiv class\x3d\\\x22empty\\\x22\x3eTiada data\x3c\\\/div\x3e\x27;\\n\x7d\\n\\nfunction cjRender(id, h, cfg)\x7b\\n  cjTheme();\\n  var el \x3d $(id), c \x3d CJ\x5bid\x5d;\\n  if (c \x26\x26 el.contains(c.canvas) \x26\x26 c.config.type \x3d\x3d\x3d cfg.type)\x7b\\n    el.firstChild.style.height \x3d h + \x27px\x27;\\n    c.data \x3d cfg.data; c.options \x3d cfg.options; c.update();\\n    return c;\\n  \x7d\\n  if (c)\x7b try \x7b c.destroy(); \x7d catch (e) \x7b\x7d \x7d\\n  el.innerHTML \x3d \x27\x3cdiv class\x3d\\\x22cjw\\\x22 style\x3d\\\x22height:\x27 + h + \x27px\\\x22\x3e\x3ccanvas role\x3d\\\x22img\\\x22\x3e\x3c\\\/canvas\x3e\x3c\\\/div\x3e\x27;\\n  CJ\x5bid\x5d \x3d new Chart(el.querySelector(\x27canvas\x27), cfg);\\n  return CJ\x5bid\x5d;\\n\x7d\\n\\nvar cjCenter \x3d \x7bid: \x27cjCenter\x27, afterDraw: function(ch, a, o)\x7b\\n  var m \x3d ch.getDatasetMeta(0); if (!o || !o.text || !m.data\x5b0\x5d) return;\\n  var x \x3d m.data\x5b0\x5d.x, y \x3d m.data\x5b0\x5d.y, ctx \x3d ch.ctx, f \x3d Chart.defaults.font.family;\\n  ctx.save(); ctx.textAlign \x3d \x27center\x27; ctx.textBaseline \x3d \x27middle\x27;\\n  ctx.fillStyle \x3d cssVar(\x27--ink\x27) || \x27#171717\x27; ctx.font \x3d \x27600 22px \x27 + f; ctx.fillText(o.text, x, y - 7);\\n  ctx.fillStyle \x3d cssVar(\x27--muted\x27) || \x27#737373\x27; ctx.font \x3d \x27500 11px \x27 + f; ctx.fillText(o.sub || \x27\x27, x, y + 13);\\n  ctx.restore();\\n\x7d\x7d;\\n\\nvar cjVal \x3d \x7bid: \x27cjVal\x27, afterDatasetsDraw: function(ch, a, o)\x7b\\n  if (!o || !o.on) return;\\n  var ctx \x3d ch.ctx, horiz \x3d ch.options.indexAxis \x3d\x3d\x3d \x27y\x27, n \x3d (ch.data.labels || \x5b\x5d).length;\\n  ctx.save(); ctx.font \x3d \x27600 11px \x27 + Chart.defaults.font.family; ctx.fillStyle \x3d cssVar(\x27--ink\x27) || \x27#171717\x27;\\n  for (var i \x3d 0; i \x3c n; i++)\x7b\\n    var tot \x3d 0, el \x3d null;\\n    ch.data.datasets.forEach(function(ds, di)\x7b\\n      var m \x3d ch.getDatasetMeta(di); if (m.hidden || !ch.isDatasetVisible(di)) return;\\n      var v \x3d Number(ds.data\x5bi\x5d) || 0; tot +\x3d v; if (v) el \x3d m.data\x5bi\x5d;\\n    \x7d);\\n    if (!el || !tot) continue;\\n    var t \x3d o.fmt ? o.fmt(tot, i) : String(tot);\\n    if (horiz)\x7b ctx.textAlign \x3d \x27left\x27; ctx.textBaseline \x3d \x27middle\x27; ctx.fillText(t, el.x + 5, el.y); \x7d\\n    else \x7b ctx.textAlign \x3d \x27center\x27; ctx.textBaseline \x3d \x27bottom\x27; ctx.fillText(t, el.x, el.y - 3); \x7d\\n  \x7d\\n  ctx.restore();\\n\x7d\x7d;\\nfunction cjTrunc(n)\x7b return function(v)\x7b var s \x3d String(this.getLabelForValue(v)); return s.length \x3e n ? s.slice(0, n - 1) + \x27\\u2026\x27 : s; \x7d; \x7d\\nfunction cjDonut(id, items, unit)\x7b\\n  var total \x3d items.reduce(function(s, x)\x7b return s + x.v; \x7d, 0);\\n  if (!total) return cjEmpty(id);\\n  var wide \x3d $(id).clientWidth \x3e 460;\\n  cjRender(id, wide ? 190 : 260, \x7btype: \x27doughnut\x27,\\n    data: \x7blabels: items.map(function(x)\x7b return x.k; \x7d), datasets: \x5b\x7bdata: items.map(function(x)\x7b return x.v; \x7d),\\n      backgroundColor: items.map(function(x)\x7b return cjCol(x.c); \x7d), borderColor: cssVar(\x27--card\x27) || \x27#fff\x27, borderWidth: 2, hoverOffset: 6\x7d\x5d\x7d,\\n    options: \x7bresponsive: true, maintainAspectRatio: false, cutout: \x2768%\x27, layout: \x7bpadding: 4\x7d,\\n      plugins: \x7b\\n        legend: \x7bposition: wide ? \x27right\x27 : \x27bottom\x27, labels: \x7busePointStyle: true, pointStyle: \x27rectRounded\x27, boxWidth: 10, boxHeight: 10, padding: 10,\\n          generateLabels: function(ch)\x7b\\n            var l \x3d Chart.overrides.doughnut.plugins.legend.labels.generateLabels(ch);\\n            l.forEach(function(x, i)\x7b var v \x3d ch.data.datasets\x5b0\x5d.data\x5bi\x5d; x.text +\x3d \x27  \x27 + v + \x27 (\x27 + Math.round(v * 100 \/ total) + \x27%)\x27; \x7d);\\n            return l;\\n          \x7d\x7d\x7d,\\n        tooltip: \x7bcallbacks: \x7blabel: function(c)\x7b return \x27 \x27 + c.label + \x27: \x27 + c.parsed + \x27 (\x27 + Math.round(c.parsed * 100 \/ total) + \x27%)\x27; \x7d\x7d\x7d,\\n        cjCenter: \x7btext: String(total), sub: unit || \x27orang\x27\x7d\x7d\x7d,\\n    plugins: \x5bcjCenter\x5d\x7d);\\n\x7d\\nfunction cjBars(id, gs, stacked)\x7b\\n  if (!gs.length) return cjEmpty(id);\\n  var ds, opt \x3d \x7bborderRadius: 3, barThickness: 14, maxBarThickness: 16\x7d;\\n  if (stacked)\x7b\\n    ds \x3d \x5b\x5b\x27A\x27, \x27A · Berpindah\x27, \x27--a\x27\x5d, \x5b\x27B\x27, \x27B · Tidak berpindah\x27, \x27--b\x27\x5d, \x5b\x27C\x27, \x27C · Terperangkap\x27, \x27--c\x27\x5d\x5d.map(function(s)\x7b\\n      return Object.assign(\x7blabel: s\x5b1\x5d, data: gs.map(function(g)\x7b return g\x5bs\x5b0\x5d\x5d; \x7d), backgroundColor: cssVar(s\x5b2\x5d), stack: \x27s\x27\x7d, opt);\\n    \x7d);\\n    var none \x3d gs.map(function(g)\x7b return g.t - g.A - g.B - g.C; \x7d);\\n    if (none.some(function(v)\x7b return v \x3e 0; \x7d)) ds.push(Object.assign(\x7blabel: \x27Tiada status\x27, data: none, backgroundColor: cssVar(\x27--line2\x27) || \x27#bbb\x27, stack: \x27s\x27\x7d, opt));\\n  \x7d else ds \x3d \x5bObject.assign(\x7blabel: \x27Bilangan\x27, data: gs.map(function(g)\x7b return g.t; \x7d), backgroundColor: cssVar(\x27--acc5\x27)\x7d, opt)\x5d;\\n  cjRender(id, gs.length * 28 + 34, \x7btype: \x27bar\x27, data: \x7blabels: gs.map(function(g)\x7b return g.k; \x7d), datasets: ds\x7d,\\n    options: \x7bindexAxis: \x27y\x27, responsive: true, maintainAspectRatio: false, layout: \x7bpadding: \x7bright: 30\x7d\x7d,\\n      scales: \x7bx: \x7bstacked: true, beginAtZero: true, ticks: \x7bprecision: 0\x7d, grid: \x7bcolor: cssVar(\x27--line\x27)\x7d, border: \x7bdisplay: false\x7d\x7d,\\n               y: \x7bstacked: true, grid: \x7bdisplay: false\x7d, ticks: \x7bcallback: cjTrunc(16)\x7d\x7d\x7d,\\n      plugins: \x7blegend: \x7bdisplay: false\x7d, cjVal: \x7bon: true\x7d,\\n        tooltip: \x7bmode: \x27index\x27, intersect: false, filter: function(c)\x7b return c.parsed.x \x3e 0; \x7d,\\n          callbacks: \x7bfooter: stacked ? function(it)\x7b return \x27Jumlah: \x27 + gs\x5bit\x5b0\x5d.dataIndex\x5d.t; \x7d : undefined\x7d\x7d\x7d\x7d,\\n    plugins: \x5bcjVal\x5d\x7d);\\n\x7d\\nfunction cjHbars(id, items, unit, max)\x7b\\n  if (!items.length) return cjEmpty(id);\\n  var colOf \x3d function(cls)\x7b return cls \x3d\x3d\x3d \x27sa\x27 ? cssVar(\x27--a\x27) : cls \x3d\x3d\x3d \x27sc\x27 ? cssVar(\x27--c\x27) : cssVar(\x27--acc5\x27); \x7d;\\n  cjRender(id, items.length * 28 + 34, \x7btype: \x27bar\x27,\\n    data: \x7blabels: items.map(function(x)\x7b return x.k; \x7d), datasets: \x5b\x7blabel: unit || \x27\x27, data: items.map(function(x)\x7b return x.v; \x7d),\\n      backgroundColor: items.map(function(x)\x7b return colOf(x.cls); \x7d), borderRadius: 3, barThickness: 14, maxBarThickness: 16\x7d\x5d\x7d,\\n    options: \x7bindexAxis: \x27y\x27, responsive: true, maintainAspectRatio: false, layout: \x7bpadding: \x7bright: 44\x7d\x7d,\\n      scales: \x7bx: \x7bbeginAtZero: true, max: max, grid: \x7bcolor: cssVar(\x27--line\x27)\x7d, border: \x7bdisplay: false\x7d,\\n                   ticks: \x7bcallback: function(v)\x7b return unit \x3d\x3d\x3d \x27%\x27 ? v + \x27%\x27 : nf(v, 1); \x7d\x7d\x7d,\\n               y: \x7bgrid: \x7bdisplay: false\x7d, ticks: \x7bcallback: cjTrunc(16)\x7d\x7d\x7d,\\n      plugins: \x7blegend: \x7bdisplay: false\x7d,\\n        cjVal: \x7bon: true, fmt: function(v, i)\x7b return unit \x3d\x3d\x3d \x27%\x27 ? Math.round(v) + \x27%\x27 : nf(v); \x7d\x7d,\\n        tooltip: \x7bcallbacks: \x7blabel: function(c)\x7b var x \x3d items\x5bc.dataIndex\x5d; return \x27 \x27 + (x.tip || (nf(c.parsed.x) + \x27 \x27 + (unit || \x27\x27))); \x7d\x7d\x7d\x7d\x7d,\\n    plugins: \x5bcjVal\x5d\x7d);\\n\x7d\\nfunction cjVbars(id, items, unit)\x7b\\n  if (!items.length) return cjEmpty(id);\\n  cjRender(id, 220, \x7btype: \x27bar\x27,\\n    data: \x7blabels: items.map(function(x)\x7b return x.k; \x7d), datasets: \x5b\x7blabel: unit, data: items.map(function(x)\x7b return x.v; \x7d),\\n      backgroundColor: cssVar(\x27--acc5\x27), borderRadius: 4, maxBarThickness: 28\x7d\x5d\x7d,\\n    options: \x7bresponsive: true, maintainAspectRatio: false, layout: \x7bpadding: \x7btop: 18\x7d\x7d,\\n      scales: \x7by: \x7bbeginAtZero: true, grid: \x7bcolor: cssVar(\x27--line\x27)\x7d, border: \x7bdisplay: false\x7d\x7d, x: \x7bgrid: \x7bdisplay: false\x7d\x7d\x7d,\\n      plugins: \x7blegend: \x7bdisplay: false\x7d, cjVal: \x7bon: items.length \x3c\x3d 14, fmt: function(v)\x7b return nf(v, 1); \x7d\x7d,\\n        tooltip: \x7bcallbacks: \x7blabel: function(c)\x7b return \x27 \x27 + nf(c.parsed.y) + \x27 \x27 + unit; \x7d\x7d\x7d\x7d\x7d,\\n    plugins: \x5bcjVal\x5d\x7d);\\n\x7d\\nfunction cjLuas(id, lu)\x7b\\n  cjHbars(id, lu.map(function(x)\x7b return \x7bk: x.k, v: Math.round(x.p * 10) \/ 10, cls: x.cls, tip: x.t + \x27 (\x27 + Math.round(x.p) + \x27%)\x27\x7d; \x7d), \x27%\x27, 100);\\n\x7d\\n\\nfunction donut(id, items, unit)\x7b return window.Chart ? cjDonut(id, items, unit) : donutSvg(id, items, unit); \x7d\\nfunction bars(id, gs, stacked)\x7b return window.Chart ? cjBars(id, gs, stacked) : barsSvg(id, gs, stacked); \x7d\\nfunction vbars(id, items, unit)\x7b return window.Chart ? cjVbars(id, items, unit) : vbarsSvg(id, items, unit); \x7d\\nfunction hbars(id, items)\x7b return window.Chart ? cjHbars(id, items, \x27mt\x27) : hbarsSvg(id, items); \x7d\\n\\nfunction cjRetheme()\x7b if (!window.Chart) return; if (D.res) renderDash(); if (DP.res) renderProj(); \x7d\\ntry \x7b\\n  new MutationObserver(cjRetheme).observe(document.documentElement, \x7battributes: true, attributeFilter: \x5b\x27data-theme\x27, \x27class\x27\x5d\x7d);\\n  window.matchMedia(\x27(prefers-color-scheme: dark)\x27).addEventListener(\x27change\x27, cjRetheme);\\n\x7d catch (e) \x7b\x7d\\nfunction donutSvg(id, items, unit)\x7b\\n    var el \x3d $(id), total \x3d items.reduce(function(s, x)\x7b return s + x.v; \x7d, 0);\\n    if (!total)\x7b el.innerHTML \x3d \x27\x3cdiv class\x3d\\\x22empty\\\x22\x3eTiada data\x3c\\\/div\x3e\x27; return; \x7d\\n    var R \x3d 42, C \x3d 2 * Math.PI * R, off \x3d 0;\\n    var gap \x3d items.filter(function(x)\x7b return x.v \x3e 0; \x7d).length \x3e 1 ? 1.5 : 0;\\n    var arcs \x3d items.map(function(x)\x7b\\n      if (!x.v) return \x27\x27;\\n      var len \x3d x.v \/ total * C, vis \x3d Math.max(len - gap, 0.1);\\n      var s \x3d \x27\x3ccircle r\x3d\\\x22\x27 + R + \x27\\\x22 cx\x3d\\\x2260\\\x22 cy\x3d\\\x2260\\\x22 fill\x3d\\\x22none\\\x22 stroke-width\x3d\\\x2216\\\x22 style\x3d\\\x22stroke:\x27 + x.c + \x27\\\x22\x27 +\\n        \x27 stroke-dasharray\x3d\\\x22\x27 + vis + \x27 \x27 + (C - vis) + \x27\\\x22 stroke-dashoffset\x3d\\\x22\x27 + (-off) + \x27\\\x22\x3e\x3ctitle\x3e\x27 +\\n        esc(x.k) + \x27: \x27 + x.v + \x27\x3c\\\/title\x3e\x3c\\\/circle\x3e\x27;\\n      off +\x3d len;\\n      return s;\\n    \x7d).join(\x27\x27);\\n    el.innerHTML \x3d \x27\x3csvg viewBox\x3d\\\x220 0 120 120\\\x22 role\x3d\\\x22img\\\x22 aria-label\x3d\\\x22Graf donut\\\x22\x3e\x27 +\\n      \x27\x3ccircle r\x3d\\\x22\x27 + R + \x27\\\x22 cx\x3d\\\x2260\\\x22 cy\x3d\\\x2260\\\x22 fill\x3d\\\x22none\\\x22 stroke-width\x3d\\\x2216\\\x22 style\x3d\\\x22stroke:var(--seg)\\\x22\/\x3e\x27 +\\n      \x27\x3cg transform\x3d\\\x22rotate(-90 60 60)\\\x22\x3e\x27 + arcs + \x27\x3c\\\/g\x3e\x27 +\\n      \x27\x3ctext x\x3d\\\x2260\\\x22 y\x3d\\\x2260\\\x22 text-anchor\x3d\\\x22middle\\\x22 class\x3d\\\x22dn-v\\\x22\x3e\x27 + total + \x27\x3c\\\/text\x3e\x27 +\\n      \x27\x3ctext x\x3d\\\x2260\\\x22 y\x3d\\\x2275\\\x22 text-anchor\x3d\\\x22middle\\\x22 class\x3d\\\x22dn-l\\\x22\x3e\x27 + (unit || \x27orang\x27) + \x27\x3c\\\/text\x3e\x3c\\\/svg\x3e\x27 +\\n      \x27\x3cul class\x3d\\\x22dn-leg\\\x22\x3e\x27 + items.map(function(x)\x7b\\n        return \x27\x3cli\x3e\x3ci style\x3d\\\x22background:\x27 + x.c + \x27\\\x22\x3e\x3c\\\/i\x3e\x3cspan\x3e\x27 + esc(x.k) + \x27\x3c\\\/span\x3e\x3cb\x3e\x27 + x.v + \x27\x3c\\\/b\x3e\x3cem\x3e\x27 +\\n          Math.round(x.v * 100 \/ total) + \x27%\x3c\\\/em\x3e\x3c\\\/li\x3e\x27;\\n      \x7d).join(\x27\x27) + \x27\x3c\\\/ul\x3e\x27;\\n  \x7d\\n\\n  function barsSvg(id, gs, stacked)\x7b\\n    var el \x3d $(id);\\n    if (!gs.length)\x7b el.innerHTML \x3d \x27\x3cdiv class\x3d\\\x22empty\\\x22\x3eTiada data\x3c\\\/div\x3e\x27; return; \x7d\\n    var max \x3d Math.max.apply(null, gs.map(function(g)\x7b return g.t; \x7d));\\n    el.innerHTML \x3d gs.map(function(g)\x7b\\n      var seg;\\n      if (stacked)\x7b\\n        var none \x3d g.t - g.A - g.B - g.C;\\n        seg \x3d \x5b\x27A\x27, \x27B\x27, \x27C\x27\x5d.map(function(k)\x7b\\n          return g\x5bk\x5d ? \x27\x3ci class\x3d\\\x22s\x27 + k.toLowerCase() + \x27\\\x22 style\x3d\\\x22width:\x27 + (g\x5bk\x5d \/ max * 100) + \x27%\\\x22 title\x3d\\\x22\x27 + k + \x27: \x27 + g\x5bk\x5d + \x27\\\x22\x3e\x3c\\\/i\x3e\x27 : \x27\x27;\\n        \x7d).join(\x27\x27) + (none \x3e 0 ? \x27\x3ci class\x3d\\\x22sx\\\x22 style\x3d\\\x22width:\x27 + (none \/ max * 100) + \x27%\\\x22\x3e\x3c\\\/i\x3e\x27 : \x27\x27);\\n      \x7d else \x7b\\n        seg \x3d \x27\x3ci class\x3d\\\x22sg\\\x22 style\x3d\\\x22width:\x27 + (g.t \/ max * 100) + \x27%\\\x22\x3e\x3c\\\/i\x3e\x27;\\n      \x7d\\n      return \x27\x3cdiv class\x3d\\\x22brow\\\x22\x3e\x3cspan class\x3d\\\x22lb\\\x22 title\x3d\\\x22\x27 + esc(g.k) + \x27\\\x22\x3e\x27 + esc(g.k) + \x27\x3c\\\/span\x3e\x3cspan class\x3d\\\x22track\\\x22\x3e\x27 +\\n        seg + \x27\x3c\\\/span\x3e\x3cspan class\x3d\\\x22n\\\x22\x3e\x27 + g.t + \x27\x3c\\\/span\x3e\x3c\\\/div\x3e\x27;\\n    \x7d).join(\x27\x27);\\n  \x7d\\n\\n  var PIN_SVG \x3d \x27\x3csvg viewBox\x3d\\\x220 0 24 24\\\x22 fill\x3d\\\x22none\\\x22 stroke\x3d\\\x22currentColor\\\x22 stroke-width\x3d\\\x222\\\x22 stroke-linecap\x3d\\\x22round\\\x22 stroke-linejoin\x3d\\\x22round\\\x22\x3e\x3cpath d\x3d\\\x22M12 21s-7-6.2-7-11.5a7 7 0 0 1 14 0C19 14.8 12 21 12 21z\\\x22\/\x3e\x3ccircle cx\x3d\\\x2212\\\x22 cy\x3d\\\x229.5\\\x22 r\x3d\\\x222.5\\\x22\/\x3e\x3c\\\/svg\x3e\x27;\\n  var KESAN_TXT \x3d \x7bA: \x27A · Berpindah\x27, B: \x27B · Tidak berpindah\x27, C: \x27C · Terperangkap\x27\x7d;\\n\\n  function renderMap(rows)\x7b\\n    var pts \x3d rows.filter(function(r)\x7b return r.lat !\x3d null \x26\x26 r.lng !\x3d null; \x7d);\\n    $(\x27gpsN\x27).textContent \x3d \x27· \x27 + pts.length + \x27 \/ \x27 + rows.length + \x27 rekod ber-GPS\x27;\\n    D.markers \x3d \x7b\x7d;\\n    if (!window.L)\x7b $(\x27dmap\x27).innerHTML \x3d \x27\x3cdiv class\x3d\\\x22empty\\\x22\x3ePeta tidak dapat dimuat.\x3c\\\/div\x3e\x27; return; \x7d\\n    if (!D.map)\x7b\\n      D.map \x3d L.map(\x27dmap\x27, \x7bscrollWheelZoom: false\x7d).setView(\x5b5.45, 102.05\x5d, 8);\\n      L.tileLayer(\x27https:\/\/\x7bs\x7d.tile.openstreetmap.org\/\x7bz\x7d\/\x7bx\x7d\/\x7by\x7d.png\x27,\\n        \x7bmaxZoom: 19, attribution: \x27© OpenStreetMap\x27\x7d).addTo(D.map);\\n      D.layer \x3d L.layerGroup().addTo(D.map);\\n    \x7d\\n    D.layer.clearLayers();\\n    var col \x3d \x7bA: cssVar(\x27--a\x27), B: cssVar(\x27--b\x27), C: cssVar(\x27--c\x27)\x7d;\\n    pts.forEach(function(r)\x7b\\n      var url \x3d \x27https:\/\/www.google.com\/maps?q\x3d\x27 + r.lat + \x27,\x27 + r.lng;\\n      var html \x3d \x27\x3cdiv class\x3d\\\x22pop\\\x22\x3e\x3cb\x3e\x27 + esc(r.nama) + \x27\x3c\\\/b\x3e\x27 +\\n        \x27\x3cspan\x3e\x27 + esc(\x5br.kategori, r.projek || r.kawasan\x5d.filter(Boolean).join(\x27 · \x27)) + \x27\x3c\\\/span\x3e\x27 +\\n        \x27\x3cspan class\x3d\\\x22st s\x27 + (r.kesan ? r.kesan.toLowerCase() : \x27x\x27) + \x27\\\x22\x3e\x27 + esc(KESAN_TXT\x5br.kesan\x5d || \x27Tiada status\x27) + \x27\x3c\\\/span\x3e\x27 +\\n        (r.pps ? \x27\x3cspan\x3ePPS: \x27 + esc(r.pps) + \x27\x3c\\\/span\x3e\x27 : \x27\x27) +\\n        ((r.alamat || r.geo) ? \x27\x3cspan\x3e\x27 + esc(r.alamat || r.geo) + \x27\x3c\\\/span\x3e\x27 : \x27\x27) +\\n        \x27\x3csmall\x3e\x27 + r.lat.toFixed(5) + \x27, \x27 + r.lng.toFixed(5) + (r.acc ? \x27 · ±\x27 + Math.round(r.acc) + \x27 m\x27 : \x27\x27) +\\n        (r.src ? \x27 · \x27 + esc(r.src) : \x27\x27) + (r.gpsAt ? \x27\x3cbr\x3eDirekod \x27 + esc(r.gpsAt) : \x27\x27) + \x27\x3c\\\/small\x3e\x27 +\\n        \x27\x3ca href\x3d\\\x22\x27 + url + \x27\\\x22 target\x3d\\\x22_blank\\\x22 rel\x3d\\\x22noopener\\\x22\x3eBuka di Google Maps ↗\x3c\\\/a\x3e\x3c\\\/div\x3e\x27;\\n      D.markers\x5br.row\x5d \x3d L.circleMarker(\x5br.lat, r.lng\x5d, \x7bradius: 8, weight: 2, color: \x27#fff\x27, fillColor: col\x5br.kesan\x5d || \x27#737373\x27, fillOpacity: .92\x7d)\\n        .bindPopup(html, \x7bmaxWidth: 260\x7d).addTo(D.layer);\\n    \x7d);\\n    setTimeout(function()\x7b\\n      D.map.invalidateSize();\\n      if (pts.length) D.map.fitBounds(L.latLngBounds(pts.map(function(p)\x7b return \x5bp.lat, p.lng\x5d; \x7d)), \x7bmaxZoom: 14, padding: \x5b24, 24\x5d\x7d);\\n    \x7d, 60);\\n  \x7d\\n\\n  function focusOnMap(row)\x7b\\n    var m \x3d D.markers \x26\x26 D.markers\x5brow\x5d;\\n    if (!m) return;\\n    $(\x27dmap\x27).scrollIntoView(\x7bbehavior: \x27smooth\x27, block: \x27center\x27\x7d);\\n    setTimeout(function()\x7b D.map.setView(m.getLatLng(), 16); m.openPopup(); \x7d, 400);\\n  \x7d\\n\\n  function renderList(rows)\x7b\\n    var sorted \x3d rows.slice().sort(function(a, b)\x7b return b.row - a.row; \x7d);\\n    $(\x27listN\x27).textContent \x3d \x27· \x27 + rows.length;\\n    var show \x3d sorted.slice(0, D.shown);\\n    $(\x27dList\x27).innerHTML \x3d show.length ? show.map(function(r)\x7b\\n      return \x27\x3cdiv class\x3d\\\x22rec\\\x22\x3e\x3cspan class\x3d\\\x22kb s\x27 + (r.kesan ? r.kesan.toLowerCase() : \x27x\x27) + \x27\\\x22\x3e\x27 + esc(r.kesan || \x27-\x27) + \x27\x3c\\\/span\x3e\x27 +\\n        \x27\x3cdiv class\x3d\\\x22rb\\\x22\x3e\x3cb\x3e\x27 + esc(r.nama) + \x27\x3c\\\/b\x3e\x27 +\\n        \x27\x3csmall\x3e\x27 + esc(\x5br.kategori, r.projek, r.kawasan\x5d.filter(Boolean).join(\x27 · \x27)) + \x27\x3c\\\/small\x3e\x27 +\\n        \x27\x3csmall\x3e\x27 + esc(\x5br.mukim, r.daerah, r.tarikh\x5d.filter(Boolean).join(\x27 · \x27)) + \x27\x3c\\\/small\x3e\x27 +\\n        (r.pps ? \x27\x3csmall\x3ePPS: \x27 + esc(r.pps) + \x27\x3c\\\/small\x3e\x27 : \x27\x27) + \x27\x3c\\\/div\x3e\x27 +\\n        (r.lat !\x3d null ? \x27\x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22call pin\\\x22 data-row\x3d\\\x22\x27 + r.row + \x27\\\x22 aria-label\x3d\\\x22Lihat di peta\\\x22\x3e\x27 + PIN_SVG + \x27\x3c\\\/button\x3e\x27 : \x27\x27) +\\n        \x27\x27 + \x27\x3c\\\/div\x3e\x27;\\n    \x7d).join(\x27\x27) : \x27\x3cdiv class\x3d\\\x22empty\\\x22\x3eTiada rekod sepadan.\x3c\\\/div\x3e\x27;\\n    $(\x27dMore\x27).classList.toggle(\x27hidden\x27, sorted.length \x3c\x3d D.shown);\\n  \x7d\\n\\n   \\n  var DP \x3d \x7brows: \x5b\x5d, at: 0\x7d;\\n  D.sub \x3d \x27mangsa\x27;\\n  $(\x27dsM\x27).onclick \x3d function()\x7b setSub(\x27mangsa\x27); \x7d;\\n  $(\x27dsP\x27).onclick \x3d function()\x7b setSub(\x27proj\x27); \x7d;\\n  $(\x27pRefresh\x27).onclick \x3d function()\x7b loadProj(true); \x7d;\\n  $(\x27pfKaw\x27).onchange \x3d renderProj;\\n  $(\x27pfKat\x27).onchange \x3d renderProj;\\n  $(\x27pfCari\x27).oninput \x3d renderProj;\\n\\n  function setSub(s)\x7b\\n    D.sub \x3d s;\\n    $(\x27dsM\x27).classList.toggle(\x27on\x27, s \x3d\x3d\x3d \x27mangsa\x27);\\n    $(\x27dsP\x27).classList.toggle(\x27on\x27, s \x3d\x3d\x3d \x27proj\x27);\\n    $(\x27subMangsa\x27).classList.toggle(\x27hidden\x27, s !\x3d\x3d \x27mangsa\x27);\\n    $(\x27subProjek\x27).classList.toggle(\x27hidden\x27, s !\x3d\x3d \x27proj\x27);\\n    if (s \x3d\x3d\x3d \x27proj\x27) loadProj(false); else loadDash(false);\\n  \x7d\\n\\n   \\n\\n  function nf(v, dp)\x7b var n \x3d Number(v) || 0; return n.toLocaleString(\x27en-MY\x27, \x7bmaximumFractionDigits: dp \x3d\x3d null ? 2 : dp\x7d); \x7d\\n\\n  function renderProj()\x7b\\n  if (!$(\x27pkP\x27)) return; \\n    var k \x3d $(\x27pfKaw\x27).value, kat \x3d $(\x27pfKat\x27).value, q \x3d $(\x27pfCari\x27).value.trim().toUpperCase();\\n    var rows \x3d DP.rows.filter(function(r)\x7b\\n      return (!k || r.kawasan \x3d\x3d\x3d k) \x26\x26 (!kat || r.kategori \x3d\x3d\x3d kat) \x26\x26\\n        (!q || (r.projek + \x27 \x27 + r.kod + \x27 \x27 + r.kawasan).toUpperCase().indexOf(q) \x3e -1);\\n    \x7d);\\n    \\n    var latest \x3d \x7b\x7d, imgs \x3d \x7b\x7d, order \x3d \x5b\x5d;\\n    rows.forEach(function(r)\x7b\\n      var key \x3d r.kawasan + \x27|\x27 + r.projek;\\n      if (!latest\x5bkey\x5d) \x7b order.push(key); imgs\x5bkey\x5d \x3d \x5b\x5d; \x7d\\n      latest\x5bkey\x5d \x3d r;\\n      imgs\x5bkey\x5d \x3d imgs\x5bkey\x5d.concat(r.gambar.map(function(u)\x7b return \x7bu: u, iso: r.iso || \x27\x27, t: r.tarikh || \x27\x27\x7d; \x7d));\\n    \x7d);\\n    var L \x3d order.map(function(key)\x7b var r \x3d latest\x5bkey\x5d; r.allImg \x3d imgs\x5bkey\x5d; return r; \x7d);\\n    var luasT \x3d 0, luas \x3d 0, hhi \x3d 0, gam \x3d 0, kaws \x3d \x7b\x7d, a \x3d 0, b \x3d 0, lastT \x3d \x27\x27;\\n    L.forEach(function(r)\x7b\\n      luasT +\x3d Number(r.luasT) || 0; luas +\x3d Number(r.luas) || 0; hhi +\x3d Number(r.hhi) || 0; kaws\x5br.kawasan\x5d \x3d 1;\\n      if (r.kategori \x3d\x3d\x3d \x27A\x27) a++; else if (r.kategori \x3d\x3d\x3d \x27B\x27) b++;\\n    \x7d);\\n    rows.forEach(function(r)\x7b gam +\x3d r.gambar.length; if (r.iso \x3e lastT) lastT \x3d r.iso; \x7d);\\n    $(\x27pkP\x27).textContent \x3d L.length;\\n    $(\x27pkPs\x27).textContent \x3d L.length ? \x27dalam \x27 + Object.keys(kaws).length + \x27 kawasan\x27 : \x27\x27;\\n    $(\x27pkL\x27).textContent \x3d nf(luasT);\\n    $(\x27pkLs\x27).textContent \x3d luas ? Math.round(luasT \/ luas * 100) + \x27% daripada \x27 + nf(luas) + \x27 ha\x27 : \x27\x27;\\n    $(\x27pkH\x27).textContent \x3d nf(hhi);\\n    $(\x27pkR\x27).textContent \x3d rows.length;\\n    $(\x27pkRs\x27).textContent \x3d lastT ? \x27terkini \x27 + lastT.split(\x27-\x27).reverse().join(\x27\/\x27) : \x27\x27;\\n    $(\x27pkG\x27).textContent \x3d gam;\\n  DP.allG \x3d \x5b\x5d;\\n  rows.slice().sort(function(x, y)\x7b return y.row - x.row; \x7d).forEach(function(r)\x7b\\n    r.gambar.slice().reverse().forEach(function(u)\x7b DP.allG.push(\x7bsrc: u, iso: r.iso || \x27\x27, t: r.tarikh || \x27\x27, p: r.projek\x7d); \x7d);\\n  \x7d);\\n  renderGal();\\n\\n    donut(\x27pdKat\x27, \x5b\\n      \x7bk: \x27A · Akibat banjir\x27, v: a, c: \x27var(--a)\x27\x7d,\\n      \x7bk: \x27B · Akibat hujan lebat\x27, v: b, c: \x27var(--c)\x27\x7d\\n    \x5d, \x27projek\x27);\\n\\n    \\n    var byDay \x3d \x7b\x7d;\\n    rows.forEach(function(r)\x7b if (r.iso) byDay\x5br.iso\x5d \x3d (byDay\x5br.iso\x5d || 0) + (Number(r.hi) || 0); \x7d);\\n    var days \x3d Object.keys(byDay).sort().slice(-14);\\n    vbars(\x27pcHarian\x27, days.map(function(dk)\x7b var p \x3d dk.split(\x27-\x27); return \x7bk: p\x5b2\x5d + \x27\/\x27 + p\x5b1\x5d, v: Math.round(byDay\x5bdk\x5d * 1000) \/ 1000\x7d; \x7d), \x27mt\x27);\\n\\n    hbars(\x27pcHHI\x27, L.slice().sort(function(x, y)\x7b return (Number(y.hhi) || 0) - (Number(x.hhi) || 0); \x7d)\\n      .map(function(r)\x7b return \x7bk: r.projek, v: Number(r.hhi) || 0, cls: r.kategori \x3d\x3d\x3d \x27A\x27 ? \x27sa\x27 : \x27sc\x27\x7d; \x7d));\\n\\n    var lu \x3d L.filter(function(r)\x7b return Number(r.luas) \x3e 0; \x7d).map(function(r)\x7b\\n      return \x7bk: r.projek, p: Math.min(100, (Number(r.luasT) || 0) \/ Number(r.luas) * 100), cls: r.kategori \x3d\x3d\x3d \x27A\x27 ? \x27sa\x27 : \x27sc\x27,\\n        t: nf(r.luasT) + \x27 \/ \x27 + nf(r.luas) + \x27 ha\x27\x7d;\\n    \x7d).sort(function(x, y)\x7b return y.p - x.p; \x7d);\\n    if (window.Chart) cjLuas(\x27pcLuas\x27, lu);\\n  else $(\x27pcLuas\x27).innerHTML \x3d lu.length ? lu.map(function(x)\x7b\\n      return \x27\x3cdiv class\x3d\\\x22brow\\\x22\x3e\x3cspan class\x3d\\\x22lb\\\x22 title\x3d\\\x22\x27 + esc(x.k + \x27: \x27 + x.t) + \x27\\\x22\x3e\x27 + esc(x.k) + \x27\x3c\\\/span\x3e\x3cspan class\x3d\\\x22track\\\x22\x3e\x3ci class\x3d\\\x22\x27 + x.cls +\\n        \x27\\\x22 style\x3d\\\x22width:\x27 + x.p + \x27%\\\x22\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan class\x3d\\\x22n\\\x22\x3e\x27 + Math.round(x.p) + \x27%\x3c\\\/span\x3e\x3c\\\/div\x3e\x27;\\n    \x7d).join(\x27\x27) : \x27\x3cdiv class\x3d\\\x22empty\\\x22\x3eTiada data\x3c\\\/div\x3e\x27;\\n\\n    renderProjList(L);\\n  \x7d\\n\\n  function vbarsSvg(id, items, unit)\x7b\\n    var el \x3d $(id);\\n    if (!items.length)\x7b el.innerHTML \x3d \x27\x3cdiv class\x3d\\\x22empty\\\x22\x3eTiada data\x3c\\\/div\x3e\x27; return; \x7d\\n    var W \x3d 320, H \x3d 150, base \x3d 128, top \x3d 14, n \x3d items.length;\\n    var max \x3d Math.max.apply(null, items.map(function(x)\x7b return x.v; \x7d)) || 1;\\n    var bw \x3d (W - 8) \/ n, out \x3d \x27\x27;\\n    items.forEach(function(x, i)\x7b\\n      var h \x3d x.v ? Math.max(x.v \/ max * (base - top), 2) : 0, w \x3d bw * 0.62, xx \x3d 4 + i * bw + (bw - w) \/ 2, y \x3d base - h;\\n      out +\x3d \x27\x3crect x\x3d\\\x22\x27 + xx + \x27\\\x22 y\x3d\\\x22\x27 + y + \x27\\\x22 width\x3d\\\x22\x27 + w + \x27\\\x22 height\x3d\\\x22\x27 + h + \x27\\\x22 rx\x3d\\\x223\\\x22 style\x3d\\\x22fill:var(--acc5)\\\x22\x3e\x3ctitle\x3e\x27 +\\n        esc(x.k) + \x27: \x27 + nf(x.v) + \x27 \x27 + unit + \x27\x3c\\\/title\x3e\x3c\\\/rect\x3e\x27;\\n      if (n \x3c\x3d 14) out +\x3d \x27\x3ctext x\x3d\\\x22\x27 + (xx + w \/ 2) + \x27\\\x22 y\x3d\\\x22\x27 + (y - 4) + \x27\\\x22 text-anchor\x3d\\\x22middle\\\x22 class\x3d\\\x22vb-v\\\x22\x3e\x27 + nf(x.v, 1) + \x27\x3c\\\/text\x3e\x27;\\n      out +\x3d \x27\x3ctext x\x3d\\\x22\x27 + (xx + w \/ 2) + \x27\\\x22 y\x3d\\\x22\x27 + (H - 6) + \x27\\\x22 text-anchor\x3d\\\x22middle\\\x22 class\x3d\\\x22vb-l\\\x22\x3e\x27 + esc(x.k) + \x27\x3c\\\/text\x3e\x27;\\n    \x7d);\\n    el.innerHTML \x3d \x27\x3csvg viewBox\x3d\\\x220 0 \x27 + W + \x27 \x27 + H + \x27\\\x22 class\x3d\\\x22vbars\\\x22 role\x3d\\\x22img\\\x22 aria-label\x3d\\\x22Graf HI harian\\\x22\x3e\x27 +\\n      \x27\x3cline x1\x3d\\\x220\\\x22 x2\x3d\\\x22\x27 + W + \x27\\\x22 y1\x3d\\\x22\x27 + base + \x27\\\x22 y2\x3d\\\x22\x27 + base + \x27\\\x22 style\x3d\\\x22stroke:var(--line)\\\x22\/\x3e\x27 + out + \x27\x3c\\\/svg\x3e\x27;\\n  \x7d\\n\\n  function hbarsSvg(id, items)\x7b\\n    var el \x3d $(id);\\n    if (!items.length)\x7b el.innerHTML \x3d \x27\x3cdiv class\x3d\\\x22empty\\\x22\x3eTiada data\x3c\\\/div\x3e\x27; return; \x7d\\n    var max \x3d Math.max.apply(null, items.map(function(x)\x7b return x.v; \x7d)) || 1;\\n    el.innerHTML \x3d items.map(function(x)\x7b\\n      return \x27\x3cdiv class\x3d\\\x22brow\\\x22\x3e\x3cspan class\x3d\\\x22lb\\\x22 title\x3d\\\x22\x27 + esc(x.k) + \x27\\\x22\x3e\x27 + esc(x.k) + \x27\x3c\\\/span\x3e\x3cspan class\x3d\\\x22track\\\x22\x3e\x3ci class\x3d\\\x22\x27 + (x.cls || \x27sg\x27) +\\n        \x27\\\x22 style\x3d\\\x22width:\x27 + (x.v \/ max * 100) + \x27%\\\x22\x3e\x3c\\\/i\x3e\x3c\\\/span\x3e\x3cspan class\x3d\\\x22n\\\x22\x3e\x27 + nf(x.v) + \x27\x3c\\\/span\x3e\x3c\\\/div\x3e\x27;\\n    \x7d).join(\x27\x27);\\n  \x7d\\n\\n  function pstat(l, v)\x7b return \x27\x3cdiv\x3e\x3cspan\x3e\x27 + l + \x27\x3c\\\/span\x3e\x3cb\x3e\x27 + v + \x27\x3c\\\/b\x3e\x3c\\\/div\x3e\x27; \x7d\\n\\n  function renderProjList(L)\x7b\\n    $(\x27pListN\x27).textContent \x3d \x27· \x27 + L.length + \x27 projek\x27;\\n  DP.gal \x3d \x5b\x5d;\\n    $(\x27pList\x27).innerHTML \x3d L.length ? L.slice().sort(function(x, y)\x7b return y.row - x.row; \x7d).map(function(r)\x7b\\n      var pct \x3d Number(r.luas) ? Math.round((Number(r.luasT) || 0) \/ Number(r.luas) * 100) : 0;\\n       \\n      return \x27\x3cdiv class\x3d\\\x22prc\\\x22\x3e\x3cdiv class\x3d\\\x22prh\\\x22\x3e\x3cspan class\x3d\\\x22kb s\x27 + (r.kategori \x3d\x3d\x3d \x27A\x27 ? \x27a\x27 : r.kategori \x3d\x3d\x3d \x27B\x27 ? \x27c\x27 : \x27x\x27) + \x27\\\x22\x3e\x27 + esc(r.kategori || \x27-\x27) + \x27\x3c\\\/span\x3e\x27 +\\n        \x27\x3cdiv class\x3d\\\x22rb\\\x22\x3e\x3cb\x3e\x27 + esc(r.projek) + \x27\x3c\\\/b\x3e\x3csmall\x3e\x27 + esc(\x5br.kawasan, r.kod, \x27Laporan \x27 + r.tarikh\x5d.filter(Boolean).join(\x27 · \x27)) + \x27\x3c\\\/small\x3e\x27 +\\n        (r.mula ? \x27\x3csmall\x3eMula terjejas \x27 + esc(r.mula) + \x27\x3c\\\/small\x3e\x27 : \x27\x27) + \x27\x3c\\\/div\x3e\x3c\\\/div\x3e\x27 +\\n        \x27\x3cdiv class\x3d\\\x22prs\\\x22\x3e\x27 +\\n          pstat(\x27Luas terjejas\x27, nf(r.luasT) + \x27 \/ \x27 + nf(r.luas) + \x27 ha (\x27 + pct + \x27%)\x27) +\\n          pstat(\x27Kedalaman air\x27, nf(r.dalam) + \x27 m\x27) +\\n          pstat(\x27Tempoh banjir\x27, nf(r.tempoh, 0) + \x27 hari\x27) +\\n          pstat(\x27HI \/ HHI\x27, nf(r.hi) + \x27 \/ \x27 + nf(r.hhi) + \x27 mt\x27) +\\n        \x27\x3c\\\/div\x3e\x27 +\\n        (r.infra \x26\x26 r.infra !\x3d\x3d \x27TIADA\x27 ? \x27\x3csmall class\x3d\\\x22prn\\\x22\x3eKerosakan infra: \x27 + esc(r.infra) + \x27\x3c\\\/small\x3e\x27 : \x27\x27) +\\n        (r.catatan \x26\x26 r.catatan !\x3d\x3d \x27TIADA\x27 ? \x27\x3csmall class\x3d\\\x22prn\\\x22\x3eCatatan: \x27 + esc(r.catatan) + \x27\x3c\\\/small\x3e\x27 : \x27\x27) +\\n        projImgs(r) +\\n        \x27\x3c\\\/div\x3e\x27;\\n    \x7d).join(\x27\x27) : \x27\x3cdiv class\x3d\\\x22empty\\\x22\x3eTiada laporan sepadan.\x3c\\\/div\x3e\x27;\\n  \x7d\\n\\n   \\nvar GV \x3d null;\\nfunction openGallery(items, start)\x7b\\n  if (!items || !items.length) return;\\n  start \x3d Math.min(start || 0, items.length - 1);\\n  if (!window.Viewer)\x7b window.open(items\x5bstart\x5d.src, \x27_blank\x27); return; \x7d\\n  if (GV)\x7b GV.destroy(); GV \x3d null; \x7d\\n  var box \x3d document.createElement(\x27div\x27);\\n  box.style.display \x3d \x27none\x27;\\n  box.innerHTML \x3d items.map(function(x)\x7b return \x27\x3cimg src\x3d\\\x22\x27 + esc(x.src) + \x27\\\x22 alt\x3d\\\x22\x27 + esc(x.alt) + \x27\\\x22\x3e\x27; \x7d).join(\x27\x27);\\n  document.body.appendChild(box);\\n  var multi \x3d items.length \x3e 1;\\n  var v \x3d new Viewer(box, \x7b\\n    initialViewIndex: start, zIndex: 3000, navbar: multi, loop: multi, title: true, transition: true,\\n    toolbar: \x7bzoomIn: 1, zoomOut: 1, oneToOne: 1, reset: 1, prev: multi, play: multi ? \x7bshow: 1, size: \x27large\x27\x7d : 0,\\n      next: multi, rotateLeft: 1, rotateRight: 1, flipHorizontal: 0, flipVertical: 0\x7d,\\n    hidden: function()\x7b setTimeout(function()\x7b v.destroy(); box.remove(); if (GV \x3d\x3d\x3d v) GV \x3d null; \x7d, 0); \x7d\\n  \x7d);\\n  GV \x3d v;\\n  v.show();\\n\x7d\\n$(\x27pList\x27).addEventListener(\x27click\x27, function(e)\x7b\\n  var x \x3d e.target.closest(\x27.xmore\x27);\\n  if (x)\x7b\\n    var w \x3d x.closest(\x27.pimgs\x27), o \x3d w.classList.toggle(\x27open\x27);\\n    x.textContent \x3d o ? \x27Sembunyikan hari lama\x27 : \x27Tunjuk \x27 + w.querySelectorAll(\x27.xday\x27).length + \x27 hari lagi\x27;\\n    return;\\n  \x7d\\n  var b \x3d e.target.closest(\x27.glink\x5bdata-g\x5d\x27);\\n  if (b)\x7b openGallery(DP.gal\x5bNumber(b.getAttribute(\x27data-g\x27))\x5d, 0); return; \x7d\\n  var a \x3d e.target.closest(\x27.pthumbs a\x27);\\n  if (!a || !window.Viewer) return;\\n  e.preventDefault();\\n  var g \x3d DP.gal \x26\x26 DP.gal\x5bNumber(a.parentNode.getAttribute(\x27data-g\x27))\x5d;\\n  if (g) openGallery(g, Number(a.getAttribute(\x27data-i\x27)) || 0);\\n\x7d);\\nfunction openAllGal()\x7b\\n  var c \x3d $(\x27pGal\x27), show \x3d c.classList.contains(\x27hidden\x27);\\n  c.classList.toggle(\x27hidden\x27, !show);\\n  if (show)\x7b renderGal(); c.scrollIntoView(\x7bbehavior: \x27smooth\x27, block: \x27start\x27\x7d); \x7d\\n\x7d\\nfunction dLabel(iso, t)\x7b if (!iso) return t || \x27Tiada tarikh\x27; var p \x3d iso.split(\x27-\x27); return p\x5b2\x5d + \x27\/\x27 + p\x5b1\x5d + \x27\/\x27 + p\x5b0\x5d; \x7d\\nfunction groupDays(list)\x7b\\n  var g \x3d \x7b\x7d, ks \x3d \x5b\x5d;\\n  list.forEach(function(x)\x7b var k \x3d x.iso || \x27\x27; if (!g\x5bk\x5d)\x7b g\x5bk\x5d \x3d \x5b\x5d; ks.push(k); \x7d g\x5bk\x5d.push(x); \x7d);\\n  ks.sort(function(a, b)\x7b return a \x3c b ? 1 : a \x3e b ? -1 : 0; \x7d);\\n  return ks.map(function(k)\x7b return \x7biso: k, items: g\x5bk\x5d\x7d; \x7d);\\n\x7d\\nfunction titled(items)\x7b\\n  return items.map(function(x, i)\x7b\\n    return \x7bsrc: x.src, alt: (x.p ? x.p + \x27 · \x27 : \x27\x27) + dLabel(x.iso, x.t) + \x27 · \x27 + (i + 1) + \x27\/\x27 + items.length\x7d;\\n  \x7d);\\n\x7d\\nfunction thumbHtml(gi, items, max)\x7b\\n  return \x27\x3cdiv class\x3d\\\x22pthumbs\\\x22 data-g\x3d\\\x22\x27 + gi + \x27\\\x22\x3e\x27 + items.slice(0, max).map(function(x, i)\x7b\\n    return \x27\x3ca href\x3d\\\x22\x27 + esc(x.src) + \x27\\\x22 target\x3d\\\x22_blank\\\x22 rel\x3d\\\x22noopener\\\x22 data-i\x3d\\\x22\x27 + i + \x27\\\x22\x3e\x3cimg src\x3d\\\x22\x27 + esc(x.src) +\\n      \x27\\\x22 loading\x3d\\\x22lazy\\\x22 alt\x3d\\\x22\x27 + esc(x.alt) + \x27\\\x22\x3e\x3c\\\/a\x3e\x27;\\n  \x7d).join(\x27\x27) + (items.length \x3e max ? \x27\x3ca href\x3d\\\x22#\\\x22 class\x3d\\\x22more\\\x22 data-i\x3d\\\x22\x27 + max + \x27\\\x22 aria-label\x3d\\\x22Lihat semua gambar\\\x22\x3e+\x27 +\\n    (items.length - max) + \x27\x3c\\\/a\x3e\x27 : \x27\x27) + \x27\x3c\\\/div\x3e\x27;\\n\x7d\\nfunction projImgs(r)\x7b\\n  var all \x3d r.allImg.slice().reverse().map(function(x)\x7b return \x7bsrc: x.u, iso: x.iso, t: x.t, p: r.projek\x7d; \x7d);\\n  if (!all.length) return \x27\x27;\\n  var days \x3d groupDays(all), flat \x3d \x5b\x5d;\\n  days.forEach(function(d)\x7b flat \x3d flat.concat(d.items); \x7d);\\n  var gAll \x3d DP.gal.push(titled(flat)) - 1;\\n  var h \x3d \x27\x3cdiv class\x3d\\\x22pimgs\\\x22\x3e\x3cdiv class\x3d\\\x22pdh\\\x22\x3e\x3cspan\x3eGambar · \x27 + all.length + \x27 dalam \x27 + days.length + \x27 hari\x3c\\\/span\x3e\x27 +\\n    (days.length \x3e 1 ? \x27\x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22glink\\\x22 data-g\x3d\\\x22\x27 + gAll + \x27\\\x22\x3eGaleri semua hari \\u203a\x3c\\\/button\x3e\x27 : \x27\x27) + \x27\x3c\\\/div\x3e\x27;\\n  days.forEach(function(d, di)\x7b\\n    var gi \x3d DP.gal.push(titled(d.items)) - 1;\\n    h +\x3d \x27\x3cdiv class\x3d\\\x22pday\x27 + (di \x3e\x3d 3 ? \x27 xday\x27 : \x27\x27) + \x27\\\x22\x3e\x3cdiv class\x3d\\\x22pdl\\\x22\x3e\x27 + esc(dLabel(d.iso, d.items\x5b0\x5d.t)) +\\n      \x27 \x3cem\x3e· \x27 + d.items.length + \x27 gambar\x3c\\\/em\x3e\x3c\\\/div\x3e\x27 + thumbHtml(gi, DP.gal\x5bgi\x5d, 8) + \x27\x3c\\\/div\x3e\x27;\\n  \x7d);\\n  if (days.length \x3e 3) h +\x3d \x27\x3cbutton type\x3d\\\x22button\\\x22 class\x3d\\\x22glink xmore\\\x22\x3eTunjuk \x27 + (days.length - 3) + \x27 hari lagi\x3c\\\/button\x3e\x27;\\n  return h + \x27\x3c\\\/div\x3e\x27;\\n\x7d\\nDP.gDay \x3d \x27*\x27;\\nfunction renderGal()\x7b\\n  if ($(\x27pGal\x27).classList.contains(\x27hidden\x27)) return;\\n  var all \x3d DP.allG || \x5b\x5d, days \x3d groupDays(all);\\n  if (DP.gDay !\x3d\x3d \x27*\x27 \x26\x26 !days.some(function(d)\x7b return d.iso \x3d\x3d\x3d DP.gDay; \x7d)) DP.gDay \x3d \x27*\x27;\\n  $(\x27pGalChips\x27).innerHTML \x3d \x27\x3cbutton type\x3d\\\x22button\\\x22 data-d\x3d\\\x22*\\\x22\x27 + (DP.gDay \x3d\x3d\x3d \x27*\x27 ? \x27 class\x3d\\\x22on\\\x22\x27 : \x27\x27) + \x27\x3eSemua \x3cem\x3e\x27 +\\n    all.length + \x27\x3c\\\/em\x3e\x3c\\\/button\x3e\x27 + days.map(function(d)\x7b\\n      var p \x3d d.iso ? d.iso.split(\x27-\x27) : null;\\n      return \x27\x3cbutton type\x3d\\\x22button\\\x22 data-d\x3d\\\x22\x27 + esc(d.iso) + \x27\\\x22\x27 + (DP.gDay \x3d\x3d\x3d d.iso ? \x27 class\x3d\\\x22on\\\x22\x27 : \x27\x27) + \x27\x3e\x27 +\\n        (p ? p\x5b2\x5d + \x27\/\x27 + p\x5b1\x5d : \x27Tiada tarikh\x27) + \x27 \x3cem\x3e\x27 + d.items.length + \x27\x3c\\\/em\x3e\x3c\\\/button\x3e\x27;\\n    \x7d).join(\x27\x27);\\n  var sel \x3d \x5b\x5d;\\n  days.forEach(function(d)\x7b if (DP.gDay \x3d\x3d\x3d \x27*\x27 || DP.gDay \x3d\x3d\x3d d.iso) sel \x3d sel.concat(d.items); \x7d);\\n  DP.gcur \x3d titled(sel);\\n  $(\x27pGalN\x27).textContent \x3d sel.length + \x27 gambar\x27 + (DP.gDay \x3d\x3d\x3d \x27*\x27 ? \x27 · \x27 + days.length + \x27 hari\x27 : \x27 · \x27 + dLabel(DP.gDay, sel\x5b0\x5d \x26\x26 sel\x5b0\x5d.t));\\n  $(\x27pGalGrid\x27).innerHTML \x3d sel.length ? DP.gcur.slice(0, 120).map(function(x, i)\x7b\\n    return \x27\x3ca href\x3d\\\x22\x27 + esc(x.src) + \x27\\\x22 target\x3d\\\x22_blank\\\x22 rel\x3d\\\x22noopener\\\x22 data-i\x3d\\\x22\x27 + i + \x27\\\x22\x3e\x3cimg src\x3d\\\x22\x27 + esc(x.src) +\\n      \x27\\\x22 loading\x3d\\\x22lazy\\\x22 alt\x3d\\\x22\x27 + esc(x.alt) + \x27\\\x22\x3e\x3c\\\/a\x3e\x27;\\n  \x7d).join(\x27\x27) + (sel.length \x3e 120 ? \x27\x3ca href\x3d\\\x22#\\\x22 class\x3d\\\x22more\\\x22 data-i\x3d\\\x22120\\\x22\x3e+\x27 + (sel.length - 120) + \x27\x3c\\\/a\x3e\x27 : \x27\x27) :\\n    \x27\x3cdiv class\x3d\\\x22empty\\\x22\x3eTiada gambar.\x3c\\\/div\x3e\x27;\\n  $(\x27pGalOpen\x27).classList.toggle(\x27hidden\x27, !sel.length);\\n\x7d\\n$(\x27pGalChips\x27).addEventListener(\x27click\x27, function(e)\x7b\\n  var b \x3d e.target.closest(\x27button\x27); if (!b) return;\\n  DP.gDay \x3d b.getAttribute(\x27data-d\x27); renderGal();\\n\x7d);\\n$(\x27pGalGrid\x27).addEventListener(\x27click\x27, function(e)\x7b\\n  var a \x3d e.target.closest(\x27a\x27); if (!a || !window.Viewer) return;\\n  e.preventDefault(); openGallery(DP.gcur, Number(a.getAttribute(\x27data-i\x27)) || 0);\\n\x7d);\\n$(\x27pGalOpen\x27).onclick \x3d function()\x7b openGallery(DP.gcur, 0); \x7d;\\n$(\x27pGalX\x27).onclick \x3d function()\x7b $(\x27pGal\x27).classList.add(\x27hidden\x27); \x7d;\\n$(\x27pkGal\x27).onclick \x3d openAllGal;\\n$(\x27pkGal\x27).onkeydown \x3d function(e)\x7b if (e.key \x3d\x3d\x3d \x27Enter\x27 || e.key \x3d\x3d\x3d \x27 \x27)\x7b e.preventDefault(); openAllGal(); \x7d \x7d;\\n\\n\\n  setInterval(function()\x7b\\n    if (!$(\x27viewDash\x27).classList.contains(\x27hidden\x27) \x26\x26 document.visibilityState \x3d\x3d\x3d \x27visible\x27) \x7b if (D.sub \x3d\x3d\x3d \x27proj\x27) loadProj(true, true); else loadDash(true, true); \x7d\\n  \x7d, 120000);\\n\\n  \\nfetchData(D, \x27getDashboard\x27, false).catch(function()\x7b\x7d);\\nfetchData(DP, \x27getDashProjek\x27, false).catch(function()\x7b\x7d);\\nshowView(typeof START_VIEW !\x3d\x3d \x27undefined\x27 \x26\x26 (START_VIEW \x3d\x3d\x3d \x27dash\x27 || START_VIEW \x3d\x3d\x3d \x27proj\x27) ? START_VIEW : \x27form\x27);\\n\x3c\\\/script\x3e\\n\x3c\\\/body\x3e\\n\x3c\\\/html\x3e\\n\x22,\x22ncc\x22:\x22\x7b\\\x22awhs\\\x22:true\x7d\x22\x7d", "", undefined, true , false  , "false", "https:\/\/n-aklnyfggcqfegeq22pueryxmzn5yre4bvqgdlgi-0lu-script.googleusercontent.com", "https:\/\/drive.google.com\/abuse?id\x3dAFS7AdtbdfRVOKKgUr5WO32u7_uH4tWjrRdul22wZetZ39qrtCXTtZICfBQUP91U31pICIpqvDkbE6-EyXJ7ZMQ_jxlzx2zg0w0goO8_%3A0\x26docurl\x3dhttps%3A%2F%2Fscript.google.com%2Fa%2F%7E%2Fmacros%2Fs%2FAKfycbxRt6Gcgrmz1ZQioIZ13bQvGoRqDD1u5NMA2h2Qd8eE6onFBnI906H_P53emQp91fw1%2Fexec");}
el.src = 'https:\/\/n-aklnyfggcqfegeq22pueryxmzn5yre4bvqgdlgi-0lu-script.googleusercontent.com\/userCodeAppPanel';
}());
</script>
</body>
</html>
