{"id":1173,"date":"2025-04-06T07:18:12","date_gmt":"2025-04-06T07:18:12","guid":{"rendered":"https:\/\/www.ezcalculatoronline.com\/?page_id=1173"},"modified":"2026-05-09T01:58:27","modified_gmt":"2026-05-09T06:58:27","slug":"wheel-of-names","status":"publish","type":"page","link":"https:\/\/www.ezcalculatoronline.com\/online-tools\/wheel-of-names\/","title":{"rendered":"Wheel of Names"},"content":{"rendered":"<div id=\"tdi_1\" class=\"tdc-zone\"><div class=\"tdc_zone tdi_2  wpb_row td-pb-row\"  >\n<style scoped>\n\n\/* custom css *\/\n.tdi_2{\r\n                    min-height: 0;\r\n                }\n<\/style><div id=\"tdi_3\" class=\"tdc-row\"><div class=\"vc_row tdi_4  wpb_row td-pb-row\" >\n<style scoped>\n\n\/* custom css *\/\n.tdi_4,\r\n                .tdi_4 .tdc-columns{\r\n                    min-height: 0;\r\n                }.tdi_4,\r\n\t\t\t\t.tdi_4 .tdc-columns{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_4 .tdc-columns{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column tdi_6  wpb_column vc_column_container tdc-column td-pb-span12\">\n<style scoped>\n\n\/* custom css *\/\n.tdi_6{\r\n                    vertical-align: baseline;\r\n                }.tdi_6 > .wpb_wrapper,\r\n\t\t\t\t.tdi_6 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper > .vc_row_inner{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t    height: auto;\r\n\t\t\t\t}\n<\/style><div class=\"wpb_wrapper\" ><div class=\"wpb_wrapper wpb_text_column td_block_wrap td_block_wrap vc_column_text tdi_7  tagdiv-type td-pb-border-top td_block_template_1\"  data-td-block-uid=\"tdi_7\" ><div class=\"td-block-title-wrap\"><\/div><div class=\"td-fix-index\"><style type=\"text\/css\">\/* To\u00e0n b\u1ed9 CSS \u0111\u01b0\u1ee3c g\u00f3i trong .lw \u0111\u1ec3 kh\u00f4ng \u0111\u1ee5ng theme WordPress *\/\r\n.lw{--lw-p:#4f46e5;--lw-p2:#7c3aed;--lw-bg:#f5f6fb;--lw-sf:#fff;--lw-tx:#0f172a;--lw-mu:#64748b;--lw-bd:#e6e8f0;--lw-soft:#eef0ff;--lw-red:#ef4444;--lw-size:520px;\r\n  position:relative;background:var(--lw-bg);color:var(--lw-tx);font-family:\"Inter\",system-ui,-apple-system,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;font-size:15px;line-height:1.45;\r\n  border:1px solid var(--lw-bd);border-radius:20px;overflow:hidden;max-width:1400px;margin:0 auto;text-align:left}\r\n.lw *,.lw *::before,.lw *::after{box-sizing:border-box}\r\n.lw button,.lw input,.lw select,.lw textarea{font:inherit;color:inherit;margin:0;letter-spacing:normal;text-transform:none;line-height:1.2;box-shadow:none;min-height:0;width:auto}\r\n.lw button{cursor:pointer;background:none;border:0;padding:0;border-radius:10px}\r\n.lw svg{display:block;max-width:none}\r\n.lw p,.lw h3,.lw ul,.lw li{margin:0;padding:0}\r\n.lw ul{list-style:none}\r\n.lw [hidden]{display:none!important}\r\n.lw kbd{display:inline-block;padding:1px 6px;border:1px solid var(--lw-bd);border-bottom-width:2px;border-radius:6px;background:#fff;font-size:.75rem;font-family:inherit;color:var(--lw-tx)}\r\n\r\n\/* Header *\/\r\n.lw .lw-top{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 22px;background:var(--lw-sf);border-bottom:1px solid var(--lw-bd)}\r\n.lw .lw-brand{display:flex;align-items:center;gap:10px;min-width:0;flex:1}\r\n.lw .lw-logo{width:38px;height:38px;border-radius:12px;display:grid;place-items:center;background:linear-gradient(135deg,var(--lw-p),var(--lw-p2));color:#fff;font-size:20px;flex-shrink:0}\r\n.lw .lw-title{border:1px solid transparent;background:transparent;font-size:1.3rem;font-weight:800;padding:5px 8px;border-radius:8px;width:100%;max-width:420px;outline:none;color:var(--lw-tx)}\r\n.lw .lw-title:hover{border-color:var(--lw-bd)}\r\n.lw .lw-title:focus{border-color:var(--lw-p);background:#fff}\r\n.lw .lw-actions{display:flex;gap:8px;flex-shrink:0}\r\n.lw .lw-hbtn{display:inline-flex;align-items:center;gap:6px;height:38px;padding:0 12px;border:1px solid var(--lw-bd);background:var(--lw-sf);font-weight:600;color:var(--lw-tx);transition:.15s}\r\n.lw .lw-hbtn:hover{border-color:var(--lw-p);color:var(--lw-p);background:var(--lw-soft)}\r\n.lw .lw-hbtn i{font-size:18px}\r\n\r\n\/* Layout *\/\r\n.lw .lw-main{display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:24px;padding:24px;align-items:center}\r\n.lw .lw-stage{display:flex;flex-direction:column;align-items:center;gap:16px;min-width:0;padding-top:10px}\r\n\r\n\/* Wheel *\/\r\n.lw .lw-wheel-wrap{position:relative;width:min(var(--lw-size),100%,78vh);aspect-ratio:1\/1;outline:none;cursor:pointer;-webkit-tap-highlight-color:transparent}\r\n.lw .lw-wheel-wrap::before{content:\"\";position:absolute;inset:2%;border-radius:50%;background:radial-gradient(circle,rgba(79,70,229,.25),transparent 70%);filter:blur(24px);z-index:0}\r\n.lw .lw-wheel-wrap:focus-visible .lw-wheel{outline:3px solid var(--lw-p);outline-offset:6px;border-radius:50%}\r\n.lw .lw-wheel{position:relative;z-index:1;width:100%;height:100%;will-change:transform;filter:drop-shadow(0 18px 30px rgba(15,23,42,.2))}\r\n.lw .lw-wheel svg{width:100%;height:100%}\r\n.lw .lw-wheel text{letter-spacing:0!important;text-transform:none!important;font-style:normal!important;font-weight:800!important;text-anchor:start!important;dominant-baseline:auto!important;word-spacing:0!important}\r\n.lw .lw-wheel .lw-lbl:not([transform]){opacity:0}\r\n.lw .lw-pointer{position:absolute;top:-4%;left:50%;width:9%;min-width:32px;transform:translateX(-50%);z-index:3;filter:drop-shadow(0 3px 4px rgba(0,0,0,.3))}\r\n.lw .lw-pointer svg{width:100%;height:auto;transform-origin:50% 30%}\r\n.lw .lw-pointer.tick svg{animation:lwTick .14s ease-out}\r\n@keyframes lwTick{30%{transform:rotate(-18deg)}100%{transform:rotate(0)}}\r\n.lw .lw-hub{position:absolute;top:50%;left:50%;width:19%;aspect-ratio:1\/1;transform:translate(-50%,-50%);z-index:2;border-radius:50%;\r\n  background:radial-gradient(circle at 35% 30%,#fff,#e9ebff);border:4px solid #fff;box-shadow:0 6px 18px rgba(15,23,42,.28),inset 0 0 0 3px var(--lw-soft);\r\n  font-weight:900;font-size:clamp(11px,1.6vw,19px);letter-spacing:.06em;color:var(--lw-p);transition:transform .15s}\r\n.lw .lw-hub:hover{transform:translate(-50%,-50%) scale(1.07)}\r\n.lw.is-spinning .lw-hub{pointer-events:none;color:#94a3b8}\r\n.lw.is-spinning .lw-wheel-wrap{cursor:default}\r\n.lw .lw-hint{font-size:.85rem;color:var(--lw-mu);text-align:center}\r\n\r\n\/* Panel *\/\r\n.lw .lw-panel{background:var(--lw-sf);border:1px solid var(--lw-bd);border-radius:20px;padding:18px;box-shadow:0 10px 30px rgba(15,23,42,.06);display:flex;flex-direction:column;gap:14px;min-width:0}\r\n.lw .lw-spin{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;padding:16px;border-radius:14px;background:linear-gradient(135deg,var(--lw-p),var(--lw-p2));\r\n  color:#fff;font-weight:800;font-size:1.1rem;letter-spacing:.04em;box-shadow:0 10px 22px rgba(79,70,229,.3);transition:transform .1s,filter .2s}\r\n.lw .lw-spin:hover{filter:brightness(1.08)}\r\n.lw .lw-spin:active{transform:scale(.98)}\r\n.lw .lw-spin:disabled{background:#cbd5e1;box-shadow:none;cursor:not-allowed;transform:none;filter:none}\r\n.lw .lw-spin i{font-size:1.3rem}\r\n.lw .lw-tabs{display:grid;grid-template-columns:repeat(4,1fr);gap:4px;background:#f1f3f9;padding:4px;border-radius:12px}\r\n.lw .lw-tab{padding:9px 4px;font-weight:600;font-size:.84rem;color:var(--lw-mu);border-radius:9px;display:flex;align-items:center;justify-content:center;gap:5px;transition:.15s}\r\n.lw .lw-tab:hover{color:var(--lw-tx)}\r\n.lw .lw-tab.active{background:#fff;color:var(--lw-p);box-shadow:0 1px 4px rgba(0,0,0,.08)}\r\n.lw .lw-badge{background:var(--lw-p);color:#fff;font-size:.68rem;border-radius:99px;padding:1px 6px;font-weight:700}\r\n.lw .lw-pane{display:none;flex-direction:column;gap:12px}\r\n.lw .lw-pane.active{display:flex}\r\n.lw .lw-row{display:flex;gap:8px}\r\n.lw .lw-input{width:100%;padding:11px 12px;border:1px solid var(--lw-bd);border-radius:10px;background:#fff;outline:none;transition:.15s;color:var(--lw-tx)}\r\n.lw .lw-input:focus{border-color:var(--lw-p);box-shadow:0 0 0 3px rgba(79,70,229,.15)}\r\n.lw textarea.lw-input{min-height:240px;resize:vertical;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.9rem;line-height:1.55}\r\n.lw .lw-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 11px;border-radius:10px;font-weight:600;font-size:.83rem;background:#f1f3f9;color:var(--lw-tx);transition:.15s;white-space:nowrap}\r\n.lw .lw-btn:hover{background:var(--lw-soft);color:var(--lw-p)}\r\n.lw .lw-btn i{font-size:1rem}\r\n.lw .lw-btn.pri{background:var(--lw-p);color:#fff}\r\n.lw .lw-btn.pri:hover{filter:brightness(1.1);color:#fff;background:var(--lw-p)}\r\n.lw .lw-btn.danger:hover{background:#fee2e2;color:var(--lw-red)}\r\n.lw .lw-btn.sq{width:46px;padding:0;font-size:22px;flex-shrink:0}\r\n.lw .lw-btn.grow{flex:1}\r\n.lw .lw-tools{display:flex;flex-wrap:wrap;gap:6px}\r\n.lw .lw-list{max-height:300px;overflow:auto;border:1px solid var(--lw-bd);border-radius:12px;background:#fff}\r\n.lw .lw-item{display:flex;align-items:center;gap:10px;padding:7px 10px;border-bottom:1px solid #f1f3f9}\r\n.lw .lw-item:last-child{border-bottom:0}\r\n.lw .lw-item:hover{background:#fafbff}\r\n.lw .lw-num{width:22px;text-align:right;font-size:.75rem;color:#94a3b8;font-variant-numeric:tabular-nums;flex-shrink:0}\r\n.lw .lw-dot{width:12px;height:12px;border-radius:4px;flex-shrink:0}\r\n.lw .lw-item .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}\r\n.lw .lw-item.off .nm{color:#94a3b8;text-decoration:line-through}\r\n.lw .lw-time{font-size:.75rem;color:#94a3b8;font-variant-numeric:tabular-nums}\r\n.lw .lw-ibtn{width:30px;height:30px;display:grid;place-items:center;border-radius:8px;color:var(--lw-mu);font-size:16px;flex-shrink:0}\r\n.lw .lw-ibtn:hover{background:#f1f3f9;color:var(--lw-p)}\r\n.lw .lw-ibtn.del:hover{background:#fee2e2;color:var(--lw-red)}\r\n.lw .lw-meta{display:flex;justify-content:space-between;align-items:center;font-size:.8rem;color:var(--lw-mu);gap:8px;flex-wrap:wrap}\r\n.lw .lw-meta b{color:var(--lw-tx)}\r\n.lw .lw-empty{padding:26px 16px;text-align:center;color:#94a3b8;font-size:.9rem}\r\n.lw .lw-empty i{font-size:1.8rem}\r\n.lw .lw-note{font-size:.8rem;color:var(--lw-mu)}\r\n\r\n\/* Teams *\/\r\n.lw .lw-teams{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}\r\n.lw .lw-team{border:1px solid var(--lw-bd);border-radius:12px;overflow:hidden;background:#fff}\r\n.lw .lw-team-h{display:flex;justify-content:space-between;align-items:center;padding:7px 10px;font-weight:700;font-size:.85rem;background:var(--tc);color:var(--tt)}\r\n.lw .lw-team-h span{font-size:.72rem;opacity:.85}\r\n.lw .lw-team li{padding:5px 10px;font-size:.85rem;border-top:1px solid #f1f3f9;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n\r\n\/* Settings *\/\r\n.lw .lw-label{font-size:.75rem;font-weight:700;color:var(--lw-mu);text-transform:uppercase;letter-spacing:.06em;display:flex;justify-content:space-between;margin-bottom:8px}\r\n.lw .lw-label span{color:var(--lw-p)}\r\n.lw .lw-themes{display:grid;grid-template-columns:1fr 1fr;gap:8px}\r\n.lw .lw-theme{border:2px solid var(--lw-bd);border-radius:12px;padding:8px 9px;text-align:left;background:#fff;display:flex;flex-direction:column;gap:6px;font-size:.8rem;font-weight:600;transition:.15s}\r\n.lw .lw-theme:hover{border-color:#c7cbf5}\r\n.lw .lw-theme.active{border-color:var(--lw-p);background:var(--lw-soft);color:var(--lw-p)}\r\n.lw .lw-strip{display:flex;height:10px;border-radius:6px;overflow:hidden}\r\n.lw .lw-strip span{flex:1}\r\n.lw input[type=range]{width:100%;accent-color:var(--lw-p);padding:0;border:0;background:transparent}\r\n.lw .lw-switch{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border:1px solid var(--lw-bd);border-radius:12px;cursor:pointer;font-weight:600;font-size:.9rem;margin:0}\r\n.lw .lw-switch small{display:block;font-weight:400;color:var(--lw-mu);font-size:.77rem;margin-top:2px}\r\n.lw .lw-switch input{appearance:none;-webkit-appearance:none;width:40px;height:22px;border-radius:99px;background:#cbd5e1;position:relative;cursor:pointer;transition:.2s;flex-shrink:0;border:0;padding:0;margin:0}\r\n.lw .lw-switch input::after{content:\"\";position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;background:#fff;transition:.2s;box-shadow:0 1px 3px rgba(0,0,0,.25)}\r\n.lw .lw-switch input:checked{background:var(--lw-p)}\r\n.lw .lw-switch input:checked::after{left:21px}\r\n\r\n\/* Modal *\/\r\n.lw .lw-modal{position:fixed;inset:0;z-index:100000;display:grid;place-items:center;background:rgba(15,23,42,.55);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);opacity:0;visibility:hidden;transition:.25s;padding:16px}\r\n.lw .lw-modal.open{opacity:1;visibility:visible}\r\n.lw .lw-card{background:#fff;border-radius:24px;padding:34px 24px 22px;width:100%;max-width:440px;text-align:center;transform:scale(.85);transition:transform .35s cubic-bezier(.34,1.56,.64,1);box-shadow:0 30px 60px rgba(0,0,0,.3);position:relative;overflow:hidden}\r\n.lw .lw-modal.open .lw-card{transform:scale(1)}\r\n.lw .lw-card::before{content:\"\";position:absolute;inset:0 0 auto 0;height:8px;background:var(--lw-wc,var(--lw-p))}\r\n.lw .lw-crown{width:66px;height:66px;margin:0 auto 12px;border-radius:50%;display:grid;place-items:center;font-size:32px;color:var(--lw-wt,#fff);background:var(--lw-wc,var(--lw-p));box-shadow:0 8px 20px rgba(0,0,0,.18)}\r\n.lw .lw-card h3{font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;color:var(--lw-mu);font-weight:700}\r\n.lw .lw-winner{font-size:clamp(1.8rem,6vw,2.7rem);font-weight:900;line-height:1.15;margin:10px 0 24px;word-break:break-word;color:var(--lw-tx)}\r\n.lw .lw-mact{display:grid;grid-template-columns:1fr 1fr 1.3fr;gap:8px}\r\n.lw .lw-mact .lw-btn{padding:12px 8px;font-size:.9rem}\r\n\r\n\/* Confetti & toast *\/\r\n.lw .lw-confetti{position:fixed;inset:0;width:100%;height:100%;pointer-events:none;z-index:100001}\r\n.lw .lw-toast{position:fixed;left:50%;bottom:24px;transform:translate(-50%,20px);background:#0f172a;color:#fff;padding:10px 16px;border-radius:12px;font-size:.88rem;font-weight:500;opacity:0;pointer-events:none;transition:.25s;z-index:100002;max-width:90vw;text-align:center}\r\n.lw .lw-toast.show{opacity:1;transform:translate(-50%,0)}\r\n.lw .lw-exit-float{display:none;position:fixed;top:10px;left:10px;z-index:30;width:40px;height:40px;place-items:center;border-radius:12px;background:rgba(255,255,255,.92);border:1px solid var(--lw-bd);font-size:20px;color:var(--lw-tx);box-shadow:0 4px 12px rgba(0,0,0,.12)}\r\n\r\n\/* Fullscreen \u2014 app \u0111\u01b0\u1ee3c t\u00e1ch ra <body> n\u00ean kh\u00f4ng b\u1ecb theme\/page builder (transform, overflow, z-index, header d\u00ednh) l\u00e0m h\u1ecfng *\/\r\n.lw.is-fs{position:fixed!important;top:0!important;left:0!important;right:0!important;bottom:0!important;z-index:2147483000!important;\r\n  width:100%!important;height:100vh!important;height:100dvh!important;max-width:none!important;max-height:none!important;margin:0!important;\r\n  border:0!important;border-radius:0!important;overflow:auto!important;transform:none!important;filter:none!important;display:flex!important;flex-direction:column}\r\n.lw.is-fs .lw-top{padding:10px 18px;padding-top:max(10px,env(safe-area-inset-top));flex-shrink:0}\r\n.lw.is-fs .lw-main{flex:1;min-height:0;width:100%;grid-template-columns:minmax(0,1fr) 360px;max-width:1800px;margin:0 auto;padding:16px 24px;\r\n  padding-bottom:max(16px,env(safe-area-inset-bottom))}\r\n.lw.is-fs .lw-stage{padding-top:4%}\r\n.lw.is-fs .lw-wheel-wrap{width:min(100%,calc(100vh - 130px));width:min(100%,calc(100dvh - 130px))}\r\n.lw.is-fs .lw-panel{max-height:calc(100dvh - 100px);overflow:auto}\r\n.lw.is-fs .lw-hint{display:none}\r\n.lw.is-fs .lw-panel>*{flex-shrink:0}\r\n.lw.is-fs .lw-hub{font-size:clamp(12px,2.4vmin,24px)}\r\n.lw:fullscreen{width:100%;height:100%}\r\n.lw::backdrop{background:#f5f6fb}\r\n\r\n\/* Responsive *\/\r\n@media (max-width:960px){\r\n  .lw .lw-main,.lw.is-fs .lw-main{grid-template-columns:1fr;padding:16px;gap:18px}\r\n  .lw .lw-wheel-wrap{width:min(var(--lw-size),100%,90vw)}\r\n  .lw.is-fs .lw-main{display:flex;flex-direction:column;align-items:stretch;flex:1 0 auto}\r\n  .lw.is-fs .lw-stage{flex-shrink:0}\r\n  .lw.is-fs .lw-wheel-wrap{width:min(100%,94vw,calc(100dvh - 190px))}\r\n  .lw.is-fs .lw-panel{max-height:none}\r\n  .lw .lw-panel{max-width:560px;width:100%;margin:0 auto}\r\n}\r\n\/* \u0110i\u1ec7n tho\u1ea1i xoay ngang khi full m\u00e0n h\u00ecnh: v\u00f2ng quay b\u00ean tr\u00e1i, b\u1ea3ng b\u00ean ph\u1ea3i *\/\r\n@media (max-width:960px) and (orientation:landscape) and (max-height:600px){\r\n  .lw.is-fs .lw-top{display:none}\r\n  .lw.is-fs .lw-main{display:grid;grid-template-columns:minmax(0,1fr) minmax(250px,320px);padding:10px 14px;align-items:center;flex:1;min-height:0}\r\n  .lw.is-fs .lw-wheel-wrap{width:min(100%,calc(100dvh - 40px))}\r\n  .lw.is-fs .lw-panel{max-height:calc(100dvh - 20px);padding:12px;gap:10px}\r\n  .lw.is-fs .lw-spin{padding:11px}\r\n  .lw.is-fs .lw-exit-float{display:grid}\r\n}\r\n@media (max-width:560px){\r\n  .lw{border-radius:14px}\r\n  .lw .lw-top{padding:10px 12px}\r\n  .lw .lw-hbtn span{display:none}\r\n  .lw .lw-hbtn{padding:0 10px}\r\n  .lw .lw-title{font-size:1.05rem}\r\n  .lw .lw-main{padding:12px}\r\n  .lw .lw-panel{padding:14px;border-radius:16px}\r\n  .lw .lw-tab i{display:none}\r\n  .lw .lw-hint{display:none}\r\n  .lw .lw-mact{grid-template-columns:1fr 1fr}\r\n  .lw .lw-mact .lw-btn.pri{grid-column:1\/-1;order:-1}\r\n  .lw .lw-hub{font-size:11px;border-width:3px}\r\n}<\/style><div class=\"ez-tool-wrapper ez-wheel-of-names\"><!-- ============ WHEEL OF NAMES PRO \u2014 d\u00e1n to\u00e0n b\u1ed9 t\u1eeb \u0111\u00e2y xu\u1ed1ng v\u00e0o block Custom HTML ============ -->\r\n<link href=\"https:\/\/cdn.jsdelivr.net\/npm\/remixicon@3.5.0\/fonts\/remixicon.css\" rel=\"stylesheet\">\r\n\r\n\r\n<div class=\"lw\" id=\"lwApp\">\r\n  <canvas class=\"lw-confetti\" id=\"lwConfetti\"><\/canvas>\r\n\r\n  <header class=\"lw-top\">\r\n    <div class=\"lw-brand\">\r\n      <span class=\"lw-logo\"><i class=\"ri-pie-chart-2-fill\"><\/i><\/span>\r\n      <input class=\"lw-title\" id=\"lwTitle\" value=\"Wheel of Names\" maxlength=\"40\" aria-label=\"Wheel title\" title=\"Click to rename\">\r\n    <\/div>\r\n    <div class=\"lw-actions\">\r\n      <button class=\"lw-hbtn\" id=\"lwSoundBtn\" data-cmd=\"sound\" title=\"Sound\"><i class=\"ri-volume-up-line\"><\/i><\/button>\r\n      <button class=\"lw-hbtn\" id=\"lwFsBtn\" data-cmd=\"fs\" title=\"Full Screen\"><i class=\"ri-fullscreen-line\"><\/i><span>Full Screen<\/span><\/button>\r\n    <\/div>\r\n  <\/header>\r\n\r\n  <main class=\"lw-main\">\r\n    <section class=\"lw-stage\">\r\n      <div class=\"lw-wheel-wrap\" id=\"lwWrap\" tabindex=\"0\" role=\"button\" aria-label=\"Spin the wheel\">\r\n        <div class=\"lw-pointer\" id=\"lwPointer\">\r\n          <svg viewBox=\"0 0 40 52\"><path d=\"M20 50 L4 15 A17 17 0 1 1 36 15 Z\" fill=\"#ef4444\" stroke=\"#fff\" stroke-width=\"3\" stroke-linejoin=\"round\"\/><circle cx=\"20\" cy=\"17\" r=\"6\" fill=\"#fff\"\/><\/svg>\r\n        <\/div>\r\n        <div class=\"lw-wheel\" id=\"lwWheel\"><\/div>\r\n        <button class=\"lw-hub\" id=\"lwHub\" type=\"button\">SPIN<\/button>\r\n      <\/div>\r\n      <p class=\"lw-hint\">Click the wheel or press <kbd>Ctrl<\/kbd> + <kbd>Enter<\/kbd> to spin<\/p>\r\n    <\/section>\r\n\r\n    <aside class=\"lw-panel\">\r\n      <button class=\"lw-spin\" id=\"lwSpin\" type=\"button\"><i class=\"ri-refresh-line\"><\/i> SPIN THE WHEEL<\/button>\r\n\r\n      <div class=\"lw-tabs\" role=\"tablist\">\r\n        <button class=\"lw-tab active\" data-tab=\"names\" type=\"button\"><i class=\"ri-list-check\"><\/i> Names<\/button>\r\n        <button class=\"lw-tab\" data-tab=\"results\" type=\"button\"><i class=\"ri-trophy-line\"><\/i> Results <span class=\"lw-badge\" id=\"lwResBadge\" hidden>0<\/span><\/button>\r\n        <button class=\"lw-tab\" data-tab=\"teams\" type=\"button\"><i class=\"ri-group-line\"><\/i> Teams<\/button>\r\n        <button class=\"lw-tab\" data-tab=\"settings\" type=\"button\"><i class=\"ri-settings-3-line\"><\/i> Customize<\/button>\r\n      <\/div>\r\n\r\n      <!-- NAMES -->\r\n      <div class=\"lw-pane active\" data-pane=\"names\">\r\n        <div id=\"lwListView\" style=\"display:flex;flex-direction:column;gap:10px\">\r\n          <div class=\"lw-row\">\r\n            <input class=\"lw-input\" type=\"text\" id=\"lwInput\" placeholder=\"Enter a name\u2026 (paste a list to add many)\" maxlength=\"40\">\r\n            <button class=\"lw-btn pri sq\" id=\"lwAdd\" type=\"button\" title=\"Add\"><i class=\"ri-add-line\"><\/i><\/button>\r\n          <\/div>\r\n          <div class=\"lw-tools\">\r\n            <button class=\"lw-btn\" data-cmd=\"shuffle\" type=\"button\"><i class=\"ri-shuffle-line\"><\/i> Shuffle<\/button>\r\n            <button class=\"lw-btn\" data-cmd=\"sort\" type=\"button\"><i class=\"ri-sort-asc\"><\/i> A\u2013Z<\/button>\r\n            <button class=\"lw-btn\" data-cmd=\"dedupe\" type=\"button\" title=\"Remove duplicates\"><i class=\"ri-filter-off-line\"><\/i> Unique<\/button>\r\n            <button class=\"lw-btn\" data-cmd=\"bulk\" type=\"button\"><i class=\"ri-edit-box-line\"><\/i> Bulk edit<\/button>\r\n            <button class=\"lw-btn\" data-cmd=\"restore\" id=\"lwRestore\" type=\"button\" hidden><i class=\"ri-eye-line\"><\/i> Show all<\/button>\r\n            <button class=\"lw-btn danger\" data-cmd=\"clear\" type=\"button\"><i class=\"ri-delete-bin-line\"><\/i> Clear<\/button>\r\n          <\/div>\r\n          <div class=\"lw-list\" id=\"lwList\"><\/div>\r\n          <div class=\"lw-meta\">\r\n            <span id=\"lwMeta\"><\/span>\r\n            <span style=\"display:flex;gap:6px\">\r\n              <button class=\"lw-btn\" data-cmd=\"import\" type=\"button\" title=\"Import .txt\"><i class=\"ri-upload-2-line\"><\/i> Import<\/button>\r\n              <button class=\"lw-btn\" data-cmd=\"export\" type=\"button\" title=\"Export .txt\"><i class=\"ri-download-2-line\"><\/i> Export<\/button>\r\n            <\/span>\r\n          <\/div>\r\n          <input type=\"file\" id=\"lwFile\" accept=\".txt,.csv,text\/plain\" hidden>\r\n        <\/div>\r\n        <div id=\"lwBulk\" hidden style=\"display:flex;flex-direction:column;gap:10px\">\r\n          <p class=\"lw-note\">One name per line. Changes replace the current list.<\/p>\r\n          <textarea class=\"lw-input\" id=\"lwBulkText\" spellcheck=\"false\"><\/textarea>\r\n          <div class=\"lw-row\">\r\n            <button class=\"lw-btn grow\" data-cmd=\"bulkCancel\" type=\"button\">Cancel<\/button>\r\n            <button class=\"lw-btn pri grow\" data-cmd=\"bulkApply\" type=\"button\"><i class=\"ri-check-line\"><\/i> Apply<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- RESULTS -->\r\n      <div class=\"lw-pane\" data-pane=\"results\">\r\n        <div class=\"lw-list\" id=\"lwResults\"><\/div>\r\n        <div class=\"lw-row\">\r\n          <button class=\"lw-btn grow\" data-cmd=\"copyResults\" type=\"button\"><i class=\"ri-file-copy-line\"><\/i> Copy<\/button>\r\n          <button class=\"lw-btn danger grow\" data-cmd=\"clearResults\" type=\"button\"><i class=\"ri-delete-bin-line\"><\/i> Clear history<\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- TEAMS -->\r\n      <div class=\"lw-pane\" data-pane=\"teams\">\r\n        <p class=\"lw-note\">Randomly split the names currently on the wheel into teams.<\/p>\r\n        <div class=\"lw-row\">\r\n          <input class=\"lw-input\" type=\"number\" id=\"lwTeamsN\" min=\"2\" max=\"20\" value=\"2\" style=\"max-width:90px\" aria-label=\"Number of teams\">\r\n          <button class=\"lw-btn pri grow\" data-cmd=\"teams\" type=\"button\"><i class=\"ri-group-line\"><\/i> Generate teams<\/button>\r\n        <\/div>\r\n        <div class=\"lw-teams\" id=\"lwTeamsOut\"><\/div>\r\n        <button class=\"lw-btn\" data-cmd=\"copyTeams\" id=\"lwCopyTeams\" type=\"button\" hidden><i class=\"ri-file-copy-line\"><\/i> Copy teams<\/button>\r\n      <\/div>\r\n\r\n      <!-- SETTINGS -->\r\n      <div class=\"lw-pane\" data-pane=\"settings\">\r\n        <div>\r\n          <div class=\"lw-label\">Color theme<\/div>\r\n          <div class=\"lw-themes\" id=\"lwThemes\"><\/div>\r\n        <\/div>\r\n        <div>\r\n          <div class=\"lw-label\">Max wheel size <span id=\"lwSizeVal\">520px<\/span><\/div>\r\n          <input type=\"range\" id=\"lwSize\" min=\"300\" max=\"900\" step=\"10\" value=\"520\">\r\n        <\/div>\r\n        <div>\r\n          <div class=\"lw-label\">Spin time <span id=\"lwTimeVal\">5s<\/span><\/div>\r\n          <input type=\"range\" id=\"lwTime\" min=\"2\" max=\"15\" value=\"5\">\r\n        <\/div>\r\n        <label class=\"lw-switch\"><span>Sound effects<\/span><input type=\"checkbox\" id=\"lwSoundChk\"><\/label>\r\n        <label class=\"lw-switch\"><span>Confetti<\/span><input type=\"checkbox\" id=\"lwConfettiChk\"><\/label>\r\n        <label class=\"lw-switch\"><span>Auto-hide winner<small>Winner is hidden from the wheel after each spin<\/small><\/span><input type=\"checkbox\" id=\"lwAutoChk\"><\/label>\r\n        <button class=\"lw-btn danger\" data-cmd=\"reset\" type=\"button\"><i class=\"ri-restart-line\"><\/i> Reset settings<\/button>\r\n      <\/div>\r\n    <\/aside>\r\n  <\/main>\r\n\r\n  <div class=\"lw-modal\" id=\"lwModal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"lwWinner\">\r\n    <div class=\"lw-card\">\r\n      <div class=\"lw-crown\"><i class=\"ri-trophy-fill\"><\/i><\/div>\r\n      <h3>We have a winner!<\/h3>\r\n      <div class=\"lw-winner\" id=\"lwWinner\">Name<\/div>\r\n      <div class=\"lw-mact\">\r\n        <button class=\"lw-btn\" data-cmd=\"mClose\" type=\"button\">Close<\/button>\r\n        <button class=\"lw-btn danger\" data-cmd=\"mRemove\" type=\"button\"><i class=\"ri-eye-off-line\"><\/i> Remove<\/button>\r\n        <button class=\"lw-btn pri\" data-cmd=\"mAgain\" type=\"button\"><i class=\"ri-refresh-line\"><\/i> Spin again<\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"lw-toast\" id=\"lwToast\"><\/div>\r\n  <button class=\"lw-exit-float\" data-cmd=\"fs\" type=\"button\" title=\"Exit full screen\"><i class=\"ri-fullscreen-exit-line\"><\/i><\/button>\r\n<\/div>\r\n\r\n\r\n<!-- ============ H\u1ebeT ============ --><\/div><script type=\"text\/javascript\">(() => {\r\n  const root = document.getElementById('lwApp');\r\n  if (!root) return;\r\n  const $ = s => root.querySelector(s);\r\n\r\n  const THEMES = {\r\n    rainbow: { label: 'Rainbow', colors: ['#FF6B6B', '#FFA502', '#FFD93D', '#6BCB77', '#4D96FF', '#9B5DE5', '#F15BB5'] },\r\n    casino:  { label: 'Casino',  colors: ['#b91c1c', '#1e293b', '#15803d', '#d4a017'] },\r\n    pastel:  { label: 'Pastel',  colors: ['#ffadad', '#ffd6a5', '#fdffb6', '#caffbf', '#9bf6ff', '#a0c4ff', '#bdb2ff'] },\r\n    joker:   { label: 'Joker',   colors: ['#7e22ce', '#22c55e', '#1e1e2e'] },\r\n    neon:    { label: 'Neon',    colors: ['#f72585', '#7209b7', '#4361ee', '#4cc9f0'] },\r\n    ocean:   { label: 'Ocean',   colors: ['#03045e', '#0077b6', '#00b4d8', '#48cae4', '#90e0ef'] },\r\n    sunset:  { label: 'Sunset',  colors: ['#ff7b00', '#ff5400', '#e2264d', '#9d0191', '#5a189a'] },\r\n    forest:  { label: 'Forest',  colors: ['#1b4332', '#2d6a4f', '#40916c', '#74c69d', '#b7e4c7'] },\r\n    candy:   { label: 'Candy',   colors: ['#ff70a6', '#ff9770', '#ffd670', '#e9ff70', '#70d6ff'] },\r\n    midnight:{ label: 'Midnight',colors: ['#0f172a', '#334155', '#64748b', '#94a3b8'] }\r\n  };\r\n  const DEFAULTS = { title: 'Wheel of Names', theme: 'rainbow', size: 520, duration: 5, sound: true, confetti: true, autoRemove: false, teams: 2 };\r\n  const KEY = 'luckyWheelPro_v2', OLD_KEY = 'luckyWheelPro_v1', MAX = 500;\r\n\r\n  const store = {\r\n    get(k) { try { return JSON.parse(localStorage.getItem(k)); } catch (e) { return null; } },\r\n    set(k, v) { try { localStorage.setItem(k, JSON.stringify(v)); } catch (e) {} }\r\n  };\r\n  const rand = () => { try { const a = new Uint32Array(1); crypto.getRandomValues(a); return a[0] \/ 4294967296; } catch (e) { return Math.random(); } };\r\n  const esc = s => String(s).replace(\/[&<>\"']\/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\r\n  const uid = () => Math.random().toString(36).slice(2, 10);\r\n  const textOn = hex => {\r\n    const h = hex.replace('#', ''); const r = parseInt(h.substr(0, 2), 16), g = parseInt(h.substr(2, 2), 16), b = parseInt(h.substr(4, 2), 16);\r\n    return (r * 299 + g * 587 + b * 114) \/ 1000 > 160 ? '#1e293b' : '#ffffff';\r\n  };\r\n  const shuffle = a => { for (let i = a.length - 1; i > 0; i--) { const j = Math.floor(rand() * (i + 1)); [a[i], a[j]] = [a[j], a[i]]; } return a; };\r\n  const splitNames = (t, allowComma) => {\r\n    let parts = t.split(\/\\r?\\n\/);\r\n    if (allowComma && parts.filter(s => s.trim()).length <= 1) parts = t.split(\/[,;\\t]\/);\r\n    return parts.map(s => s.trim()).filter(Boolean).map(s => s.slice(0, 40));\r\n  };\r\n\r\n  class WheelApp {\r\n    constructor() {\r\n      this.entries = []; this.results = []; this.teams = null;\r\n      this.settings = { ...DEFAULTS };\r\n      this.rotation = 0; this.spinning = false; this.audio = null; this.colors = []; this.pending = null;\r\n      this.el = {\r\n        wrap: $('#lwWrap'), wheel: $('#lwWheel'), pointer: $('#lwPointer'), hub: $('#lwHub'), spin: $('#lwSpin'),\r\n        title: $('#lwTitle'), input: $('#lwInput'), add: $('#lwAdd'), list: $('#lwList'), meta: $('#lwMeta'),\r\n        listView: $('#lwListView'), bulk: $('#lwBulk'), bulkText: $('#lwBulkText'), restore: $('#lwRestore'), file: $('#lwFile'),\r\n        results: $('#lwResults'), resBadge: $('#lwResBadge'), teamsN: $('#lwTeamsN'), teamsOut: $('#lwTeamsOut'), copyTeams: $('#lwCopyTeams'),\r\n        themes: $('#lwThemes'), size: $('#lwSize'), sizeVal: $('#lwSizeVal'), time: $('#lwTime'), timeVal: $('#lwTimeVal'),\r\n        sound: $('#lwSoundChk'), confetti: $('#lwConfettiChk'), auto: $('#lwAutoChk'), soundBtn: $('#lwSoundBtn'), fsBtn: $('#lwFsBtn'),\r\n        modal: $('#lwModal'), winner: $('#lwWinner'), canvas: $('#lwConfetti'), toast: $('#lwToast')\r\n      };\r\n      this.load(); this.renderThemes(); this.bind(); this.applySettings(); this.render();\r\n      if (document.fonts && document.fonts.ready) document.fonts.ready.then(() => this.fitLabels());\r\n      window.addEventListener('load', () => this.fitLabels());\r\n      if (window.ResizeObserver) {\r\n        let lastW = 0;\r\n        new ResizeObserver(en => { const w = en[0].contentRect.width; if (w && !lastW) this.fitLabels(); lastW = w; }).observe(this.el.wrap);\r\n      }\r\n    }\r\n\r\n    \/* ---------- Data ---------- *\/\r\n    load() {\r\n      const d = store.get(KEY);\r\n      if (d) {\r\n        this.entries = (d.entries || []).filter(e => e && e.name).map(e => ({ id: uid(), name: String(e.name), on: e.on !== false }));\r\n        this.results = Array.isArray(d.results) ? d.results : [];\r\n        this.settings = { ...DEFAULTS, ...(d.settings || {}) };\r\n      } else {\r\n        const o = store.get(OLD_KEY); \/\/ chuy\u1ec3n d\u1eef li\u1ec7u t\u1eeb b\u1ea3n c\u0169\r\n        const names = (o && Array.isArray(o.names)) ? o.names : ['Alice', 'Bob', 'Charlie', 'David', 'Emma', 'Frank'];\r\n        this.entries = names.map(n => ({ id: uid(), name: String(n), on: true }));\r\n        if (o && o.settings) {\r\n          const s = o.settings;\r\n          Object.assign(this.settings, { theme: s.theme, duration: s.duration || 5, sound: s.sound !== false, autoRemove: !!s.removeWinner });\r\n        }\r\n      }\r\n      if (!THEMES[this.settings.theme]) this.settings.theme = 'rainbow';\r\n    }\r\n    save() {\r\n      store.set(KEY, { entries: this.entries.map(({ name, on }) => ({ name, on })), results: this.results.slice(0, 200), settings: this.settings });\r\n    }\r\n    active() { return this.entries.filter(e => e.on); }\r\n\r\n    \/* ---------- Events ---------- *\/\r\n    bind() {\r\n      const E = this.el;\r\n      E.spin.addEventListener('click', () => this.spin());\r\n      E.hub.addEventListener('click', e => { e.stopPropagation(); this.spin(); });\r\n      E.wrap.addEventListener('click', () => this.spin());\r\n      E.wrap.addEventListener('keydown', e => { if (e.target === E.wrap && (e.key === ' ' || e.key === 'Enter')) { e.preventDefault(); this.spin(); } });\r\n      E.add.addEventListener('click', () => this.addFromInput());\r\n      E.input.addEventListener('keydown', e => { if (e.key === 'Enter' && !e.ctrlKey && !e.metaKey) { e.preventDefault(); this.addFromInput(); } });\r\n      E.input.addEventListener('paste', e => {\r\n        const t = (e.clipboardData || window.clipboardData).getData('text');\r\n        if (\/\\r?\\n\/.test(t.trim())) { e.preventDefault(); this.addNames(splitNames(t)); }\r\n      });\r\n      E.title.addEventListener('input', () => { this.settings.title = E.title.value; this.save(); });\r\n      E.list.addEventListener('click', e => {\r\n        const b = e.target.closest('[data-act]'); if (!b) return;\r\n        const id = b.closest('[data-id]').dataset.id;\r\n        b.dataset.act === 'toggle' ? this.toggle(id) : this.remove(id);\r\n      });\r\n      root.querySelectorAll('.lw-tab').forEach(t => t.addEventListener('click', () => this.tab(t.dataset.tab)));\r\n      root.addEventListener('click', e => { const b = e.target.closest('[data-cmd]'); if (b) this.cmd(b.dataset.cmd); });\r\n      E.themes.addEventListener('click', e => { const b = e.target.closest('[data-theme]'); if (b) this.set('theme', b.dataset.theme); });\r\n      E.size.addEventListener('input', () => this.set('size', +E.size.value));\r\n      E.time.addEventListener('input', () => this.set('duration', +E.time.value));\r\n      E.sound.addEventListener('change', () => this.set('sound', E.sound.checked));\r\n      E.confetti.addEventListener('change', () => this.set('confetti', E.confetti.checked));\r\n      E.auto.addEventListener('change', () => this.set('autoRemove', E.auto.checked));\r\n      E.teamsN.addEventListener('change', () => {\r\n        const n = Math.max(2, Math.min(20, parseInt(E.teamsN.value, 10) || 2));\r\n        E.teamsN.value = n; this.settings.teams = n; this.save();\r\n      });\r\n      E.file.addEventListener('change', () => this.importFile());\r\n      E.modal.addEventListener('click', e => { if (e.target === E.modal) this.closeModal(false); });\r\n      document.addEventListener('keydown', e => this.onKey(e));\r\n      ['fullscreenchange', 'webkitfullscreenchange'].forEach(ev => document.addEventListener(ev, () => {\r\n        const f = document.fullscreenElement || document.webkitFullscreenElement;\r\n        if (f === root) this.nativeFs = true;\r\n        else if (this.nativeFs) { this.nativeFs = false; this.restoreFs(); }   \/\/ ng\u01b0\u1eddi d\u00f9ng b\u1ea5m Esc\r\n      }));\r\n      window.addEventListener('resize', () => { if (this.cfOn) this.sizeCanvas(); });\r\n    }\r\n\r\n    onKey(e) {\r\n      if (this.el.modal.classList.contains('open')) {\r\n        if (e.key === 'Escape') { e.preventDefault(); this.closeModal(false); }\r\n        else if (e.key === 'Enter' && !(e.target.closest && e.target.closest('.lw-card button'))) { e.preventDefault(); this.closeModal(false); }\r\n        return;\r\n      }\r\n      const inApp = root.contains(e.target) || e.target === document.body;\r\n      if ((e.ctrlKey || e.metaKey) && e.key === 'Enter' && inApp) { e.preventDefault(); this.spin(); return; }\r\n      if (e.key === 'Escape' && root.classList.contains('is-fs') && !(document.fullscreenElement || document.webkitFullscreenElement)) this.restoreFs();\r\n    }\r\n\r\n    cmd(c) {\r\n      const E = this.el;\r\n      switch (c) {\r\n        case 'shuffle': if (this.busy()) return; shuffle(this.entries); this.changed(); break;\r\n        case 'sort': if (this.busy()) return; this.entries.sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' })); this.changed(); break;\r\n        case 'dedupe': {\r\n          if (this.busy()) return;\r\n          const seen = new Set(), before = this.entries.length;\r\n          this.entries = this.entries.filter(e => { const k = e.name.toLowerCase(); if (seen.has(k)) return false; seen.add(k); return true; });\r\n          const n = before - this.entries.length;\r\n          this.toast(n ? `Removed ${n} duplicate${n > 1 ? 's' : ''}` : 'No duplicates found'); this.changed(); break;\r\n        }\r\n        case 'restore': if (this.busy()) return; this.entries.forEach(e => e.on = true); this.changed(); break;\r\n        case 'clear':\r\n          if (this.busy() || !this.entries.length) return;\r\n          if (confirm('Clear all names?')) { this.entries = []; this.changed(); }\r\n          break;\r\n        case 'bulk':\r\n          if (this.busy()) return;\r\n          E.bulkText.value = this.entries.map(e => e.name).join('\\n');\r\n          E.listView.hidden = true; E.bulk.hidden = false; E.bulkText.focus(); break;\r\n        case 'bulkApply': {\r\n          if (this.busy()) return;\r\n          const prev = new Map(this.entries.map(e => [e.name, e.on]));\r\n          const names = splitNames(E.bulkText.value).slice(0, MAX);\r\n          this.entries = names.map(n => ({ id: uid(), name: n, on: prev.has(n) ? prev.get(n) : true }));\r\n          E.bulk.hidden = true; E.listView.hidden = false; this.changed(); this.toast(`${names.length} names saved`); break;\r\n        }\r\n        case 'bulkCancel': E.bulk.hidden = true; E.listView.hidden = false; break;\r\n        case 'import': E.file.click(); break;\r\n        case 'export': {\r\n          if (!this.entries.length) return this.toast('Nothing to export');\r\n          const blob = new Blob([this.entries.map(e => e.name).join('\\n')], { type: 'text\/plain' });\r\n          const a = document.createElement('a');\r\n          a.href = URL.createObjectURL(blob);\r\n          a.download = ((this.settings.title || 'names').replace(\/[^\\w\\- ]+\/g, '').trim() || 'names') + '.txt';\r\n          document.body.appendChild(a); a.click(); a.remove();\r\n          setTimeout(() => URL.revokeObjectURL(a.href), 1000); break;\r\n        }\r\n        case 'copyResults':\r\n          if (!this.results.length) return this.toast('No results yet');\r\n          this.copy(this.results.map((r, i) => `${this.results.length - i}. ${r.name} (${r.time})`).join('\\n'), 'Results copied'); break;\r\n        case 'clearResults':\r\n          if (this.results.length && confirm('Clear spin history?')) { this.results = []; this.save(); this.renderResults(); }\r\n          break;\r\n        case 'teams': this.makeTeams(); break;\r\n        case 'copyTeams':\r\n          if (this.teams) this.copy(this.teams.map((t, i) => `Team ${i + 1}: ${t.join(', ')}`).join('\\n'), 'Teams copied');\r\n          break;\r\n        case 'sound': this.set('sound', !this.settings.sound); break;\r\n        case 'fs': this.toggleFs(); break;\r\n        case 'reset':\r\n          if (confirm('Reset all settings to default?')) { this.settings = { ...DEFAULTS }; this.save(); this.applySettings(); this.render(); }\r\n          break;\r\n        case 'mClose': this.closeModal(false); break;\r\n        case 'mRemove': this.closeModal(true); break;\r\n        case 'mAgain': this.closeModal(false); setTimeout(() => this.spin(), 280); break;\r\n      }\r\n    }\r\n\r\n    tab(name) {\r\n      root.querySelectorAll('.lw-tab').forEach(t => t.classList.toggle('active', t.dataset.tab === name));\r\n      root.querySelectorAll('.lw-pane').forEach(p => p.classList.toggle('active', p.dataset.pane === name));\r\n    }\r\n\r\n    set(k, v) {\r\n      this.settings[k] = v; this.save(); this.applySettings();\r\n      if (k === 'theme') { this.renderWheel(); this.renderList(); if (this.teams) this.renderTeams(); }\r\n    }\r\n\r\n    applySettings() {\r\n      const S = this.settings, E = this.el;\r\n      E.title.value = S.title;\r\n      E.size.value = S.size; E.sizeVal.textContent = S.size + 'px';\r\n      E.time.value = S.duration; E.timeVal.textContent = S.duration + 's';\r\n      E.sound.checked = S.sound; E.confetti.checked = S.confetti; E.auto.checked = S.autoRemove;\r\n      E.teamsN.value = S.teams;\r\n      root.style.setProperty('--lw-size', S.size + 'px');\r\n      E.soundBtn.innerHTML = `<i class=\"ri-volume-${S.sound ? 'up' : 'mute'}-line\"><\/i>`;\r\n      E.soundBtn.title = S.sound ? 'Mute' : 'Unmute';\r\n      E.themes.querySelectorAll('[data-theme]').forEach(b => b.classList.toggle('active', b.dataset.theme === S.theme));\r\n    }\r\n\r\n    \/* ---------- Entries ---------- *\/\r\n    busy() { if (this.spinning) { this.toast('Wait for the wheel to stop'); return true; } return false; }\r\n    changed() { this.save(); this.renderWheel(); this.renderList(); }\r\n    addNames(arr) {\r\n      if (this.busy() || !arr.length) return;\r\n      const room = MAX - this.entries.length;\r\n      if (room <= 0) return this.toast(`Limit is ${MAX} names`);\r\n      const add = arr.slice(0, room);\r\n      add.forEach(n => this.entries.push({ id: uid(), name: n, on: true }));\r\n      if (arr.length > room) this.toast(`Only ${room} added (limit ${MAX})`);\r\n      else if (add.length > 1) this.toast(`Added ${add.length} names`);\r\n      this.changed();\r\n      this.el.list.scrollTop = this.el.list.scrollHeight;\r\n    }\r\n    addFromInput() {\r\n      const v = this.el.input.value.trim(); if (!v) return;\r\n      this.addNames(splitNames(v)); this.el.input.value = ''; this.el.input.focus();\r\n    }\r\n    toggle(id) { if (this.busy()) return; const e = this.entries.find(x => x.id === id); if (e) { e.on = !e.on; this.changed(); } }\r\n    remove(id) { if (this.busy()) return; this.entries = this.entries.filter(x => x.id !== id); this.changed(); }\r\n    importFile() {\r\n      const f = this.el.file.files[0]; if (!f) return;\r\n      const r = new FileReader();\r\n      r.onload = () => { this.addNames(splitNames(String(r.result), true)); this.el.file.value = ''; };\r\n      r.readAsText(f);\r\n    }\r\n\r\n    \/* ---------- Render ---------- *\/\r\n    render() { this.renderWheel(); this.renderList(); this.renderResults(); }\r\n\r\n    renderThemes() {\r\n      this.el.themes.innerHTML = Object.entries(THEMES).map(([k, t]) =>\r\n        `<button class=\"lw-theme\" data-theme=\"${k}\" type=\"button\">${t.label}<span class=\"lw-strip\">${t.colors.map(c => `<span style=\"background:${c}\"><\/span>`).join('')}<\/span><\/button>`\r\n      ).join('');\r\n    }\r\n\r\n    renderWheel() {\r\n      const list = this.active(), n = list.length, C = 200, R = 186;\r\n      const pal = THEMES[this.settings.theme].colors;\r\n      this.colors = [];\r\n      let s = '<svg viewBox=\"0 0 400 400\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\">';\r\n      if (!n) {\r\n        s += `<circle cx=\"${C}\" cy=\"${C}\" r=\"${R}\" fill=\"#eef0f6\"\/><text x=\"${C}\" y=\"110\" text-anchor=\"middle\" font-size=\"18\" font-weight=\"700\" fill=\"#94a3b8\">Add names to start<\/text>`;\r\n      } else {\r\n        for (let i = 0; i < n; i++) {\r\n          let c = pal[i % pal.length];\r\n          if (i === n - 1 && n > 2 && c === this.colors[0]) c = pal.find(x => x !== this.colors[0] && x !== this.colors[i - 1]) || c;\r\n          this.colors.push(c);\r\n        }\r\n        const step = 360 \/ n;\r\n        \/\/ c\u1ee1 ch\u1eef mong mu\u1ed1n (\u0111\u01a1n v\u1ecb SVG); v\u1ecb tr\u00ed & t\u1ec9 l\u1ec7 th\u1eadt \u0111\u01b0\u1ee3c t\u00ednh trong fitLabels()\r\n        const fs = Math.max(8, Math.min(22, (2 * Math.PI * R * 0.6 \/ n) * 0.5));\r\n        let labels = '';\r\n        list.forEach((e, i) => {\r\n          const a0 = i * step * Math.PI \/ 180, a1 = (i + 1) * step * Math.PI \/ 180, c = this.colors[i];\r\n          const d = n === 1\r\n            ? `M${C - R} ${C}a${R} ${R} 0 1 0 ${2 * R} 0a${R} ${R} 0 1 0 ${-2 * R} 0Z`\r\n            : `M${C} ${C}L${(C + R * Math.cos(a0)).toFixed(2)} ${(C + R * Math.sin(a0)).toFixed(2)}A${R} ${R} 0 0 1 ${(C + R * Math.cos(a1)).toFixed(2)} ${(C + R * Math.sin(a1)).toFixed(2)}Z`;\r\n          s += `<path d=\"${d}\" fill=\"${c}\" stroke=\"rgba(255,255,255,.85)\" stroke-width=\"${n > 60 ? 0.6 : 1.5}\"\/>`;\r\n          const mid = n === 1 ? 0 : i * step + step \/ 2;\r\n          const tc = textOn(c), stroke = tc === '#ffffff' ? ' stroke=\"rgba(0,0,0,.28)\" stroke-width=\"3\" paint-order=\"stroke\"' : '';\r\n          labels += `<g class=\"lw-lbl\" data-full=\"${esc(e.name)}\" data-mid=\"${mid.toFixed(3)}\" data-fs=\"${fs.toFixed(2)}\"><text x=\"0\" y=\"0\" font-size=\"${fs.toFixed(2)}\" font-weight=\"800\" style=\"font-size:${fs.toFixed(2)}px !important\" fill=\"${tc}\"${stroke}>${esc(e.name)}<\/text><\/g>`;\r\n        });\r\n        s += `<defs><clipPath id=\"lwClip\"><circle cx=\"${C}\" cy=\"${C}\" r=\"${R - 2}\"\/><\/clipPath><\/defs><g clip-path=\"url(#lwClip)\">${labels}<\/g>`;\r\n      }\r\n      s += `<circle cx=\"${C}\" cy=\"${C}\" r=\"${R + 6}\" fill=\"none\" stroke=\"#fff\" stroke-width=\"12\"\/>`;\r\n      s += `<circle cx=\"${C}\" cy=\"${C}\" r=\"${R + 12}\" fill=\"none\" stroke=\"rgba(15,23,42,.08)\" stroke-width=\"1\"\/>`;\r\n      for (let k = 0; k < 24; k++) {\r\n        const a = k * 15 * Math.PI \/ 180;\r\n        s += `<circle cx=\"${(C + (R + 6) * Math.cos(a)).toFixed(2)}\" cy=\"${(C + (R + 6) * Math.sin(a)).toFixed(2)}\" r=\"2.6\" fill=\"${k % 2 ? '#fcd34d' : '#f59e0b'}\"\/>`;\r\n      }\r\n      s += '<\/svg>';\r\n      this.el.wheel.innerHTML = s;\r\n      this.el.wheel.style.transform = `rotate(${this.rotation}deg)`;\r\n      this.fitLabels();\r\n    }\r\n\r\n    \/* \u0110\u1eb7t ch\u1eef b\u1eb1ng c\u00e1ch \u0111o k\u00edch th\u01b0\u1edbc TH\u1eacT (getBBox) r\u1ed3i scale + d\u1ecbch b\u1eb1ng transform.\r\n       V\u00ec v\u1eady d\u00f9 theme WordPress \u0111\u1ed5i font, c\u1ee1 ch\u1eef hay c\u0103n l\u1ec1, ch\u1eef v\u1eabn n\u1eb1m g\u1ecdn trong l\u00e1t. *\/\r\n    fitLabels() {\r\n      const gs = this.el.wheel.querySelectorAll('g.lw-lbl');\r\n      if (!gs.length) return;\r\n      const C = 200, R = 186, n = gs.length;\r\n      const hubR = 46;                 \/\/ b\u00e1n k\u00ednh n\u00fat SPIN + kho\u1ea3ng h\u1edf\r\n      const outer = R - 14;            \/\/ \u0111\u1ea7u ngo\u00e0i c\u1ee7a ch\u1eef\r\n      const L = outer - hubR;          \/\/ chi\u1ec1u d\u00e0i t\u1ed1i \u0111a\r\n      const half = Math.min(Math.PI \/ n, Math.PI \/ 2);\r\n      let missed = false;\r\n      gs.forEach(g => {\r\n        const t = g.firstChild, full = g.dataset.full, fs = +g.dataset.fs;\r\n        t.textContent = full;\r\n        let bb; try { bb = t.getBBox(); } catch (e) { bb = null; }\r\n        if (!bb || !bb.width || !bb.height) { missed = true; return; }\r\n        const k = (fs * 1.2) \/ bb.height;            \/\/ \u0111\u01b0a ch\u1eef v\u1ec1 \u0111\u00fang c\u1ee1 mong mu\u1ed1n d\u00f9 CSS c\u00f3 ghi \u0111\u00e8\r\n        const sFor = w => {\r\n          let sc = Math.min(k, L \/ w);\r\n          if (n > 1) {                                  \/\/ kh\u00f4ng cho ch\u1eef cao h\u01a1n b\u1ec1 r\u1ed9ng l\u00e1t\r\n            const rIn = Math.max(hubR, outer - w * sc);\r\n            sc = Math.min(sc, (2 * rIn * Math.sin(half) * 0.92) \/ (bb.height * 0.8));\r\n          }\r\n          return sc;\r\n        };\r\n        let sc = sFor(bb.width);\r\n        const minSc = Math.min(k, (9 * 1.2) \/ bb.height);  \/\/ c\u1ee1 nh\u1ecf nh\u1ea5t ~9\r\n        if (sc < minSc) {                                   \/\/ qu\u00e1 d\u00e0i \u2192 c\u1eaft b\u1edbt\r\n          let str = full;\r\n          while (str.length > 1) {\r\n            str = str.slice(0, -1);\r\n            t.textContent = str.trimEnd() + '\u2026';\r\n            bb = t.getBBox();\r\n            sc = sFor(bb.width);\r\n            if (sc >= minSc) break;\r\n          }\r\n        }\r\n        g.setAttribute('transform',\r\n          `rotate(${g.dataset.mid} ${C} ${C}) translate(${C + outer} ${C}) scale(${sc.toFixed(4)}) translate(${(-(bb.x + bb.width)).toFixed(2)} ${(-(bb.y + bb.height \/ 2)).toFixed(2)})`);\r\n      });\r\n      if (missed && !this._fitRetry) {                 \/\/ ch\u01b0a hi\u1ec3n th\u1ecb (tab \u1ea9n, \u0111ang t\u1ea3i) \u2192 th\u1eed l\u1ea1i\r\n        this._fitRetry = true;\r\n        requestAnimationFrame(() => { this._fitRetry = false; this.fitLabels(); });\r\n      }\r\n    }\r\n\r\n    renderList() {\r\n      const E = this.el, act = this.active();\r\n      const idx = new Map(act.map((e, i) => [e.id, i]));\r\n      E.list.innerHTML = !this.entries.length\r\n        ? '<div class=\"lw-empty\"><i class=\"ri-user-add-line\"><\/i><br>No names yet \u2014 add some above!<\/div>'\r\n        : this.entries.map((e, i) => {\r\n            const ci = idx.get(e.id), col = ci !== undefined ? this.colors[ci] : '#e2e8f0';\r\n            return `<div class=\"lw-item${e.on ? '' : ' off'}\" data-id=\"${e.id}\">\r\n              <span class=\"lw-num\">${i + 1}<\/span><span class=\"lw-dot\" style=\"background:${col}\"><\/span>\r\n              <span class=\"nm\" title=\"${esc(e.name)}\">${esc(e.name)}<\/span>\r\n              <button class=\"lw-ibtn\" data-act=\"toggle\" type=\"button\" title=\"${e.on ? 'Hide from wheel' : 'Show on wheel'}\"><i class=\"ri-eye${e.on ? '' : '-off'}-line\"><\/i><\/button>\r\n              <button class=\"lw-ibtn del\" data-act=\"del\" type=\"button\" title=\"Delete\"><i class=\"ri-close-line\"><\/i><\/button>\r\n            <\/div>`;\r\n          }).join('');\r\n      E.meta.innerHTML = `<b>${this.entries.length}<\/b> entries \u00b7 <b>${act.length}<\/b> on wheel`;\r\n      E.restore.hidden = act.length === this.entries.length;\r\n      E.spin.disabled = this.spinning || !act.length;\r\n    }\r\n\r\n    renderResults() {\r\n      const E = this.el, r = this.results;\r\n      E.resBadge.textContent = r.length; E.resBadge.hidden = !r.length;\r\n      E.results.innerHTML = r.length\r\n        ? r.map((x, i) => `<div class=\"lw-item\"><span class=\"lw-num\">${r.length - i}<\/span><span class=\"lw-dot\" style=\"background:${esc(x.color)}\"><\/span><span class=\"nm\">${esc(x.name)}<\/span><span class=\"lw-time\">${esc(x.time)}<\/span><\/div>`).join('')\r\n        : '<div class=\"lw-empty\"><i class=\"ri-trophy-line\"><\/i><br>Winners will appear here<\/div>';\r\n    }\r\n\r\n    makeTeams() {\r\n      const n = this.settings.teams, names = shuffle(this.active().map(e => e.name));\r\n      if (names.length < n) return this.toast(`Need at least ${n} names on the wheel`);\r\n      this.teams = Array.from({ length: n }, () => []);\r\n      names.forEach((nm, i) => this.teams[i % n].push(nm));\r\n      this.renderTeams();\r\n    }\r\n    renderTeams() {\r\n      const pal = THEMES[this.settings.theme].colors;\r\n      this.el.teamsOut.innerHTML = this.teams.map((t, i) => {\r\n        const c = pal[i % pal.length];\r\n        return `<div class=\"lw-team\" style=\"--tc:${c};--tt:${textOn(c)}\"><div class=\"lw-team-h\">Team ${i + 1}<span>${t.length}<\/span><\/div><ul>${t.map(x => `<li title=\"${esc(x)}\">${esc(x)}<\/li>`).join('')}<\/ul><\/div>`;\r\n      }).join('');\r\n      this.el.copyTeams.hidden = false;\r\n    }\r\n\r\n    \/* ---------- Spin ---------- *\/\r\n    spin() {\r\n      if (this.spinning || this.el.modal.classList.contains('open')) return;\r\n      const list = this.active();\r\n      if (!list.length) return this.toast('Add some names first');\r\n      this.spinning = true; root.classList.add('is-spinning'); this.el.spin.disabled = true;\r\n      this.initAudio();\r\n\r\n      const n = list.length, step = 360 \/ n;\r\n      const k = Math.floor(rand() * n);                       \/\/ ch\u1ecdn ng\u01b0\u1eddi th\u1eafng c\u00f4ng b\u1eb1ng\r\n      const offset = (0.12 + rand() * 0.76) * step;           \/\/ d\u1eebng trong l\u00e1t, tr\u00e1nh s\u00e1t m\u00e9p\r\n      const target = ((270 - (k * step + offset)) % 360 + 360) % 360;\r\n      const cur = ((this.rotation % 360) + 360) % 360;\r\n      this.rotation = cur;\r\n      const turns = Math.max(4, Math.round(this.settings.duration * 1.3) + 2);\r\n      const total = turns * 360 + ((target - cur + 360) % 360);\r\n      const dur = this.settings.duration * 1000, start = cur, t0 = performance.now();\r\n      let last = -1;\r\n\r\n      const frame = t => {\r\n        const p = Math.min((t - t0) \/ dur, 1);\r\n        const ease = 1 - Math.pow(1 - p, 4);\r\n        this.rotation = start + total * ease;\r\n        this.el.wheel.style.transform = `rotate(${this.rotation}deg)`;\r\n        const seg = Math.floor(((((270 - this.rotation) % 360) + 360) % 360) \/ step);\r\n        if (seg !== last) { if (last !== -1) { this.tick(1 - p); this.flick(); } last = seg; }\r\n        if (p < 1) requestAnimationFrame(frame);\r\n        else this.finish(list[k], this.colors[k]);\r\n      };\r\n      requestAnimationFrame(frame);\r\n    }\r\n\r\n    flick() {\r\n      const p = this.el.pointer; p.classList.remove('tick'); void p.offsetWidth; p.classList.add('tick');\r\n    }\r\n\r\n    finish(entry, color) {\r\n      this.spinning = false; root.classList.remove('is-spinning'); this.el.spin.disabled = false;\r\n      const time = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });\r\n      this.results.unshift({ name: entry.name, color, time });\r\n      this.results = this.results.slice(0, 200);\r\n      this.save(); this.renderResults();\r\n\r\n      this.pending = entry.id;\r\n      this.el.winner.textContent = entry.name;\r\n      this.el.modal.style.setProperty('--lw-wc', color);\r\n      this.el.modal.style.setProperty('--lw-wt', textOn(color));\r\n      this.el.modal.classList.add('open');\r\n      setTimeout(() => { const b = this.el.modal.querySelector('[data-cmd=\"mAgain\"]'); if (b) b.focus({ preventScroll: true }); }, 60);\r\n      this.playWin();\r\n      if (this.settings.confetti) this.confetti(THEMES[this.settings.theme].colors.concat(['#fbbf24', '#ffffff']));\r\n    }\r\n\r\n    closeModal(remove) {\r\n      if (!this.el.modal.classList.contains('open')) return;\r\n      this.el.modal.classList.remove('open');\r\n      const id = this.pending; this.pending = null;\r\n      if (id && (remove || this.settings.autoRemove)) {\r\n        const e = this.entries.find(x => x.id === id);\r\n        if (e && e.on) { e.on = false; this.changed(); this.toast(`\"${e.name}\" hidden \u2014 use Show all to bring back`); }\r\n      }\r\n    }\r\n\r\n    \/* ---------- Sound ---------- *\/\r\n    initAudio() {\r\n      if (!this.settings.sound) return;\r\n      try {\r\n        if (!this.audio) this.audio = new (window.AudioContext || window.webkitAudioContext)();\r\n        if (this.audio.state === 'suspended') this.audio.resume();\r\n      } catch (e) { this.audio = null; }\r\n    }\r\n    tick(speed) {\r\n      const a = this.audio; if (!this.settings.sound || !a) return;\r\n      const now = a.currentTime;\r\n      if (this.lastTick && now - this.lastTick < 0.03) return;\r\n      this.lastTick = now;\r\n      const o = a.createOscillator(), g = a.createGain();\r\n      o.type = 'triangle'; o.frequency.value = 600 + 500 * speed;\r\n      g.gain.setValueAtTime(0.0001, now);\r\n      g.gain.exponentialRampToValueAtTime(0.09, now + 0.003);\r\n      g.gain.exponentialRampToValueAtTime(0.0001, now + 0.05);\r\n      o.connect(g); g.connect(a.destination); o.start(now); o.stop(now + 0.06);\r\n    }\r\n    playWin() {\r\n      const a = this.audio; if (!this.settings.sound || !a) return;\r\n      const now = a.currentTime;\r\n      [523, 659, 784, 1047].forEach((f, i) => {\r\n        const o = a.createOscillator(), g = a.createGain(), t = now + i * 0.1;\r\n        o.type = 'sine'; o.frequency.value = f;\r\n        g.gain.setValueAtTime(0.0001, t);\r\n        g.gain.exponentialRampToValueAtTime(0.12, t + 0.04);\r\n        g.gain.exponentialRampToValueAtTime(0.0001, t + 0.9);\r\n        o.connect(g); g.connect(a.destination); o.start(t); o.stop(t + 1);\r\n      });\r\n    }\r\n\r\n    \/* ---------- Confetti ---------- *\/\r\n    sizeCanvas() {\r\n      const cv = this.el.canvas, dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n      cv.width = innerWidth * dpr; cv.height = innerHeight * dpr;\r\n      cv.getContext('2d').setTransform(dpr, 0, 0, dpr, 0, 0);\r\n    }\r\n    confetti(colors) {\r\n      const ctx = this.el.canvas.getContext('2d');\r\n      this.sizeCanvas();\r\n      const W = innerWidth, H = innerHeight, parts = [];\r\n      for (let i = 0; i < 200; i++) {\r\n        const side = i % 2;\r\n        parts.push({\r\n          x: side ? W * 0.1 : W * 0.9, y: H * 0.8,\r\n          vx: (side ? 1 : -1) * (3 + rand() * 10), vy: -(11 + rand() * 11),\r\n          w: 6 + rand() * 6, h: 8 + rand() * 8, r: rand() * 6.28, vr: (rand() - 0.5) * 0.35,\r\n          c: colors[Math.floor(rand() * colors.length)], life: 160 + rand() * 80\r\n        });\r\n      }\r\n      cancelAnimationFrame(this.cfRaf); this.cfOn = true;\r\n      const loop = () => {\r\n        ctx.clearRect(0, 0, innerWidth, innerHeight);\r\n        let alive = 0;\r\n        for (const p of parts) {\r\n          if (p.life <= 0) continue;\r\n          alive++;\r\n          p.vy += 0.32; p.vx *= 0.99; p.x += p.vx; p.y += p.vy; p.r += p.vr; p.life--;\r\n          ctx.save(); ctx.globalAlpha = Math.min(1, p.life \/ 40);\r\n          ctx.translate(p.x, p.y); ctx.rotate(p.r); ctx.fillStyle = p.c;\r\n          ctx.fillRect(-p.w \/ 2, -p.h \/ 2, p.w, p.h * Math.abs(Math.cos(p.r * 2)) + 1);\r\n          ctx.restore();\r\n        }\r\n        if (alive) this.cfRaf = requestAnimationFrame(loop);\r\n        else { ctx.clearRect(0, 0, innerWidth, innerHeight); this.cfOn = false; }\r\n      };\r\n      loop();\r\n    }\r\n\r\n    \/* ---------- Fullscreen ---------- *\/\r\n    toggleFs() {\r\n      if (root.classList.contains('is-fs')) this.exitFs(); else this.enterFs();\r\n    }\r\n    enterFs() {\r\n      \/\/ 1) T\u00e1ch app ra th\u1eb3ng <body>: tho\u00e1t kh\u1ecfi m\u1ecdi container c\u1ee7a theme \/ Elementor\r\n      this.savedScroll = window.scrollY;\r\n      if (!this.ph) this.ph = document.createComment('lw-wheel');\r\n      if (root.parentNode !== document.body) {\r\n        root.parentNode.insertBefore(this.ph, root);\r\n        document.body.appendChild(root);\r\n      }\r\n      this.setFs(true);\r\n      \/\/ 2) Xin full m\u00e0n h\u00ecnh th\u1eadt c\u1ee7a tr\u00ecnh duy\u1ec7t (iPhone kh\u00f4ng h\u1ed7 tr\u1ee3 \u2192 v\u1eabn ph\u1ee7 k\u00edn trang)\r\n      const req = root.requestFullscreen || root.webkitRequestFullscreen;\r\n      if (req) { try { const pr = req.call(root); if (pr && pr.catch) pr.catch(() => {}); } catch (e) {} }\r\n      setTimeout(() => this.fitLabels(), 120);\r\n    }\r\n    exitFs() {\r\n      const native = document.fullscreenElement || document.webkitFullscreenElement;\r\n      if (native) { try { (document.exitFullscreen || document.webkitExitFullscreen).call(document); } catch (e) {} }\r\n      this.restoreFs();\r\n    }\r\n    restoreFs() {\r\n      if (!root.classList.contains('is-fs')) return;\r\n      this.setFs(false);\r\n      if (this.ph && this.ph.parentNode) { this.ph.parentNode.insertBefore(root, this.ph); this.ph.remove(); }\r\n      window.scrollTo(0, this.savedScroll || 0);\r\n      setTimeout(() => this.fitLabels(), 120);\r\n    }\r\n    setFs(on) {\r\n      root.classList.toggle('is-fs', on);\r\n      const h = document.documentElement, b = document.body;\r\n      if (on) { this.prevOv = [h.style.overflow, b.style.overflow]; h.style.overflow = 'hidden'; b.style.overflow = 'hidden'; }\r\n      else if (this.prevOv) { h.style.overflow = this.prevOv[0]; b.style.overflow = this.prevOv[1]; }\r\n      this.el.fsBtn.innerHTML = on ? '<i class=\"ri-fullscreen-exit-line\"><\/i><span>Exit<\/span>' : '<i class=\"ri-fullscreen-line\"><\/i><span>Full Screen<\/span>';\r\n      this.el.fsBtn.title = on ? 'Exit full screen' : 'Full Screen';\r\n    }\r\n\r\n    \/* ---------- Utils ---------- *\/\r\n    copy(text, msg) {\r\n      const done = () => this.toast(msg || 'Copied!');\r\n      const fallback = () => {\r\n        const t = document.createElement('textarea'); t.value = text; t.style.cssText = 'position:fixed;opacity:0';\r\n        document.body.appendChild(t); t.select();\r\n        try { document.execCommand('copy'); done(); } catch (e) { this.toast('Copy failed'); }\r\n        t.remove();\r\n      };\r\n      if (navigator.clipboard && window.isSecureContext) navigator.clipboard.writeText(text).then(done, fallback);\r\n      else fallback();\r\n    }\r\n    toast(m) {\r\n      const t = this.el.toast; t.textContent = m; t.classList.add('show');\r\n      clearTimeout(this.tt); this.tt = setTimeout(() => t.classList.remove('show'), 2200);\r\n    }\r\n  }\r\n\r\n  window.lwApp = new WheelApp();\r\n})();<\/script>\n                <style>\n                    .ez-recommend-wrapper { margin-top: 50px; padding: 25px; background: #ffffff; border: 1px solid #e2e8f0; border-radius: 12px; box-shadow: 0 4px 15px rgba(0,0,0,0.03); font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; }\n                    .ez-recommend-title { margin: 0 0 20px 0 !important; font-size: 1.25rem !important; font-weight: 600 !important; color: #1e293b !important; display: flex; align-items: center; gap: 8px; }\n                    .ez-recommend-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 15px; margin-bottom: 20px; }\n                    \n                    .ez-recommend-item { display: none; align-items: center; padding: 14px 18px; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; text-decoration: none !important; color: #475569 !important; font-weight: 500; font-size: 15px; transition: all 0.3s ease; box-shadow: 0 2px 4px rgba(0,0,0,0.02); }\n                    .ez-recommend-item:hover { border-color: #3b82f6; background: #eff6ff; color: #1d4ed8 !important; transform: translateY(-3px); box-shadow: 0 6px 12px rgba(59, 130, 246, 0.15); }\n                    .ez-recommend-icon { width: 18px; height: 18px; margin-right: 12px; fill: currentColor; flex-shrink: 0; }\n                    \n                    \/* M\u1eb6C \u0110\u1ecaNH: Hi\u1ec7n 2 th\u1ebb *\/\n                    .ez-recommend-item:nth-child(1), .ez-recommend-item:nth-child(2) { display: flex; }\n                    \n                    \/* DESKTOP: Hi\u1ec7n 4 th\u1ebb *\/\n                    @media (min-width: 768px) {\n                        .ez-recommend-item:nth-child(3), .ez-recommend-item:nth-child(4) { display: flex; }\n                    }\n\n                    \/* SAU KHI M\u1ede R\u1ed8NG (TOGGLE) *\/\n                    .ez-recommend-grid.ez-expanded .ez-recommend-item:nth-child(3),\n                    .ez-recommend-grid.ez-expanded .ez-recommend-item:nth-child(4) { display: flex; }\n                    \n                    @media (min-width: 768px) {\n                        .ez-recommend-grid.ez-expanded .ez-recommend-item:nth-child(5),\n                        .ez-recommend-grid.ez-expanded .ez-recommend-item:nth-child(6) { display: flex; }\n                    }\n                    @media (max-width: 767px) {\n                        .ez-recommend-item:nth-child(5), .ez-recommend-item:nth-child(6) { display: none !important; }\n                    }\n\n                    .ez-btn-wrapper { text-align: center; }\n                    .ez-show-more-btn { display: inline-flex; align-items: center; gap: 6px; background: transparent; border: 1px solid #cbd5e1; padding: 8px 20px; border-radius: 20px; color: #64748b; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.2s; }\n                    .ez-show-more-btn:hover { background: #f1f5f9; color: #0f172a; border-color: #94a3b8; }\n                <\/style>\n                <div class=\"ez-recommend-wrapper\"><h4 class=\"ez-recommend-title\"><span style=\"font-size: 1.4rem;\">\u2728<\/span> You Might Also Like<\/h4><div id=\"ez-grid-6ae58e49d405d\" class=\"ez-recommend-grid\"><a href=\"https:\/\/www.ezcalculatoronline.com\/online-tools\/fake-imessage-screenshot-generator\/\" class=\"ez-recommend-item\"><svg class=\"ez-recommend-icon\" viewBox=\"0 0 24 24\"><path d=\"M19 19H5V5h7V3H5a2 2 0 00-2 2v14a2 2 0 002 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"\/><\/svg>Fake iMessage Screenshot Generator<\/a><a href=\"https:\/\/www.ezcalculatoronline.com\/image-to-sketch\/\" class=\"ez-recommend-item\"><svg class=\"ez-recommend-icon\" viewBox=\"0 0 24 24\"><path d=\"M19 19H5V5h7V3H5a2 2 0 00-2 2v14a2 2 0 002 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"\/><\/svg>Image to Sketch<\/a><a href=\"https:\/\/www.ezcalculatoronline.com\/online-tools\/seo-title-meta-checker\/\" class=\"ez-recommend-item\"><svg class=\"ez-recommend-icon\" viewBox=\"0 0 24 24\"><path d=\"M19 19H5V5h7V3H5a2 2 0 00-2 2v14a2 2 0 002 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"\/><\/svg>SEO Title &amp; Meta Checker<\/a><a href=\"https:\/\/www.ezcalculatoronline.com\/magic-8-ball\/\" class=\"ez-recommend-item\"><svg class=\"ez-recommend-icon\" viewBox=\"0 0 24 24\"><path d=\"M19 19H5V5h7V3H5a2 2 0 00-2 2v14a2 2 0 002 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"\/><\/svg>Magic 8 Ball<\/a><a href=\"https:\/\/www.ezcalculatoronline.com\/dice-roller\/\" class=\"ez-recommend-item\"><svg class=\"ez-recommend-icon\" viewBox=\"0 0 24 24\"><path d=\"M19 19H5V5h7V3H5a2 2 0 00-2 2v14a2 2 0 002 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"\/><\/svg>Dice Roller<\/a><a href=\"https:\/\/www.ezcalculatoronline.com\/youtube-thumbnail-downloader\/\" class=\"ez-recommend-item\"><svg class=\"ez-recommend-icon\" viewBox=\"0 0 24 24\"><path d=\"M19 19H5V5h7V3H5a2 2 0 00-2 2v14a2 2 0 002 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"\/><\/svg>YouTube Thumbnail Downloader<\/a><\/div><div class=\"ez-btn-wrapper\"><button id=\"ez-btn-6ae58e49d405e\" class=\"ez-show-more-btn\">View More <svg style=\"width:16px; height:16px; fill:currentColor\" viewBox=\"0 0 24 24\"><path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\"\/><\/svg><\/button><\/div>\n                <script>\n                document.addEventListener(\"DOMContentLoaded\", function() {\n                    var totalItems = 6;\n                    var btn = document.getElementById(\"ez-btn-6ae58e49d405e\");\n                    var grid = document.getElementById(\"ez-grid-6ae58e49d405d\");\n                    var isExpanded = false;\n                    \n                    var downArrow = '<svg style=\"width:16px; height:16px; fill:currentColor\" viewBox=\"0 0 24 24\"><path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\"\/><\/svg>';\n                    var upArrow = '<svg style=\"width:16px; height:16px; fill:currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\/><\/svg>';\n\n                    if(btn && grid) {\n                        function updateButtonVisibility() {\n                            var isDesktop = window.innerWidth >= 768;\n                            if ((isDesktop && totalItems <= 4) || (!isDesktop && totalItems <= 2)) {\n                                btn.style.display = \"none\";\n                            } else {\n                                btn.style.display = \"inline-flex\";\n                            }\n                        }\n                        \n                        updateButtonVisibility();\n                        window.addEventListener(\"resize\", updateButtonVisibility);\n\n                        btn.addEventListener(\"click\", function() {\n                            isExpanded = !isExpanded;\n                            if(isExpanded) {\n                                grid.classList.add(\"ez-expanded\");\n                                btn.innerHTML = \"Show Less \" + upArrow;\n                            } else {\n                                grid.classList.remove(\"ez-expanded\");\n                                btn.innerHTML = \"View More \" + downArrow;\n                            }\n                        });\n                    }\n                });\n                <\/script>\n                <\/div>\n<\/div><\/div><div class=\"td_block_wrap td_block_text_with_title tdi_8 tagdiv-type td-pb-border-top td_block_template_1\"  data-td-block-uid=\"tdi_8\" >\n<style>\n\/* custom css *\/\n.td_block_text_with_title{\r\n                  margin-bottom: 44px;\r\n                  -webkit-transform: translateZ(0);\r\n                  transform: translateZ(0);\r\n                }.td_block_text_with_title p:last-child{\r\n                  margin-bottom: 0;\r\n                }\n<\/style><div class=\"td-block-title-wrap\"><\/div><div class=\"td_mod_wrap td-fix-index\"><h1 style=\"text-align: center;\" data-start=\"100\" data-end=\"157\"><strong>\ud83c\udfa1 Wheel of Names \u2013 The Free &amp; Fun Random Name Picker<\/strong><\/h1>\n<p class=\"\" data-start=\"159\" data-end=\"450\"><strong data-start=\"159\" data-end=\"177\">Wheel of Names<\/strong> is a simple yet exciting random spinning wheel tool designed to add surprise and fun to any activity. Whether you&#8217;re hosting a giveaway, choosing a student to answer a question, dividing teams fairly, or just looking to spice up your game night, this tool has you covered!<\/p>\n<ul data-start=\"474\" data-end=\"727\">\n<li class=\"\" data-start=\"474\" data-end=\"529\">\n<p class=\"\" data-start=\"476\" data-end=\"529\">\u2705 Easy name input \u2013 no limit on the number of entries<\/p>\n<\/li>\n<li class=\"\" data-start=\"530\" data-end=\"580\">\n<p class=\"\" data-start=\"532\" data-end=\"580\">\ud83c\udfa8 Customizable colors, sounds, and spin effects<\/p>\n<\/li>\n<li class=\"\" data-start=\"581\" data-end=\"627\">\n<p class=\"\" data-start=\"583\" data-end=\"627\">\ud83d\udcf1 Works smoothly on both desktop and mobile<\/p>\n<\/li>\n<li class=\"\" data-start=\"674\" data-end=\"727\">\n<p class=\"\" data-start=\"676\" data-end=\"727\">\ud83d\udd04 100% random spins \u2013 fair and transparent results<\/p>\n<\/li>\n<\/ul>\n<h2 data-start=\"729\" data-end=\"754\"><strong>\ud83e\uddd1\u200d\ud83c\udfeb Who is it for?<\/strong><\/h2>\n<ul data-start=\"755\" data-end=\"984\">\n<li class=\"\" data-start=\"755\" data-end=\"814\">\n<p class=\"\" data-start=\"757\" data-end=\"814\">Teachers looking to engage students with fun activities<\/p>\n<\/li>\n<li class=\"\" data-start=\"815\" data-end=\"866\">\n<p class=\"\" data-start=\"817\" data-end=\"866\">Businesses organizing lucky draws and giveaways<\/p>\n<\/li>\n<li class=\"\" data-start=\"867\" data-end=\"923\">\n<p class=\"\" data-start=\"869\" data-end=\"923\">Friends and families hosting parties or celebrations<\/p>\n<\/li>\n<li class=\"\" data-start=\"924\" data-end=\"984\">\n<p class=\"\" data-start=\"926\" data-end=\"984\">Anyone who wants to add a little excitement to the moment!<\/p>\n<\/li>\n<\/ul>\n<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":7379,"parent":4298,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1173","page","type-page","status-publish","has-post-thumbnail"],"rankMath":{"parentDomain":"ezcalculatoronline.com","noFollowDomains":[],"noFollowExcludeDomains":[],"noFollowExternalLinks":false,"featuredImageNotice":"The featured image should be at least 200 by 200 pixels to be picked up by Facebook and other social media sites.","pluginReviewed":false,"postSettings":{"linkSuggestions":true,"useFocusKeyword":false},"frontEndScore":false,"postName":"wheel-of-names","permalinkFormat":"https:\/\/www.ezcalculatoronline.com\/%pagename%\/","showLockModifiedDate":true,"assessor":{"focusKeywordLink":"https:\/\/www.ezcalculatoronline.com\/wp-admin\/edit.php?focus_keyword=%focus_keyword%&post_type=%post_type%","hasTOCPlugin":false,"primaryTaxonomy":false,"serpData":{"title":"Wheel of Names \u2013 Spin to Randomly Pick a Name or Winner","description":"Spin the Wheel of Names to randomly pick winners, names, or teams. Free, fun, and customizable \u2013 perfect for classrooms, events, raffles, and games","focusKeywords":"Wheel of Names","pillarContent":false,"canonicalUrl":"","breadcrumbTitle":"","advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":"","facebookHasOverlay":false,"facebookImageOverlay":"","facebookAuthor":"","twitterCardType":"","twitterUseFacebook":true,"twitterTitle":"","twitterDescription":"","twitterImage":"","twitterImageID":"","twitterHasOverlay":false,"twitterImageOverlay":"","twitterPlayerUrl":"","twitterPlayerSize":"","twitterPlayerStream":"","twitterPlayerStreamCtype":"","twitterAppDescription":"","twitterAppIphoneName":"","twitterAppIphoneID":"","twitterAppIphoneUrl":"","twitterAppIpadName":"","twitterAppIpadID":"","twitterAppIpadUrl":"","twitterAppGoogleplayName":"","twitterAppGoogleplayID":"","twitterAppGoogleplayUrl":"","twitterAppCountry":"","robots":{"index":true},"twitterAuthor":"username","primaryTerm":0,"authorName":"Thien Nguyen","titleTemplate":"%title% %sep% %sitename%","descriptionTemplate":"%excerpt%","showScoreFrontend":true,"lockModifiedDate":false},"powerWords":["a cut above","absolute","absolutely","absolutely lowest","absurd","abuse","accurate","accuse","achieve","actionable","adaptable","adequate","admit","adorable","advantage","advice","affordable","aggravate","aggressive","agitated","agonizing","agony","alarmed","alarming","alienated","aligned","alive","all-inclusive","alluring","always","amazing","amp","animated","annihilate","announcing","anonymous","antagonistic","anxious","apocalypse","appalled","approved","approving","argumentative","armageddon","arrogant","ass kicking","assault","assured","astonishing","astounded","astounding","at ease","atrocious","attack","attractive","audacity","authentic","authoritative","authority","avoid","aware","awe-inspiring","awesome","awkward","backbone","backdoor","backed","backlash","backstabbing","badass","balanced","banned","bargain","barrage","basic","battle","beaming","beat down","beating","beautiful","beauty","begging","behind the scenes","belief","belong","best","best-selling","better","beware","big","billion","black market","blacklisted","blast","blessed","blinded","blissful","blood","bloodbath","bloodcurdling","bloody","blunder","blushing","bold","bomb","bona","bona fide","bonanza","bonus","bootleg","bottom line","bountiful","brave","bravery","brazen","break","breaking","breakthrough","breathtaking","bright","brilliant","broke","brutal","budget","buffoon","bullshit","bully","bumbling","buy","cadaver","calm","cancel anytime","capable","captivate","captivating","carefree","case study","cash","cataclysmic","catapult","catastrophe","caution","censored","centered","certain","certainly","certified","challenge","charming","cheap","cheat","cheat-sheet","cheer","cheerful","child-like","clarity","classified","clear","clueless","collapse","colorful","colossal","comfortable","compare","competitive","complete","completely","completeness","comprehensive","compromise","compulsive","concealed","conclusive","condemning","condescending","confess","confession","confessions","confident","confidential","conquer","conscientious","constructive","content","contrary","controlling","controversial","convenient","convert","cool","cooperative","copy","corpse","corrupt","corrupting","courage","courageous","cover-up","covert","coward","cowardly","crammed","crave","crazy","create","creative","cringeworthy","cripple","crisis","critical","crooked","crush","crushing","damaging","danger","dangerous","daring","dazzling","dead","deadline","deadly","death","decadent","deceived","deceptive","deep","defiance","definitely","definitive","defying","dejected","delicious","delight","delighted","delightful","delirious","delivered","demoralizing","deplorable","depraved","desire","desperate","despicable","destiny","destroy","detailed","devastating","devoted","diagnosed","direct","dirty","disadvantages","disastrous","discount","discover","disdainful","disempowered","disgusted","disgusting","dishonest","disillusioned","disoriented","distracted","distraught","distressed","distrustful","divulge","document","dollar","dominate","doomed","double","doubtful","download","dreadful","dreamy","drive","drowning","dumb","dynamic","eager","earnest","easily","easy","economical","ecstatic","edge","effective","efficient","effortless","elated","eliminate","elite","embarrass","embarrassed","embarrassing","emergency","emerging","emphasize","empowered","enchant","encouraged","endorsed","energetic","energy","enormous","enraged","enthusiastic","envy","epic","epidemic","essential","ethical","euphoric","evil","exactly","exasperated","excellent","excited","excitement","exciting","exclusive","exclusivity","excruciating","exhilarated","expensive","expert","explode","exploit","explosive","exposed","exquisite","extra","extraordinary","extremely","exuberant","eye-opening","fail","fail-proof","failure","faith","famous","fantasy","fascinating","fatigued","faux","faux pas","fearless","feast","feeble","festive","fide","fierce","fight","final","fine","fired","first","first ever","flirt","fluid","focus","focused","fool","fooled","foolish","forbidden","force-fed","forever","forgiving","forgotten","formula","fortune","foul","frantic","free","freebie","freedom","frenzied","frenzy","frightening","frisky","frugal","frustrated","fulfill","fulfilled","full","fully","fun","fun-loving","fundamentals","funniest","funny","furious","gambling","gargantuan","genius","genuine","gift","gigantic","giveaway","glamorous","gleeful","glorious","glowing","goddamn","gorgeous","graceful","grateful","gratified","gravity","great","greatest","greatness","greed","greedy","gripping","grit","grounded","growth","guaranteed","guilt","guilt-free","gullible","guts","hack","happiness","happy","harmful","harsh","hate","have you heard","havoc","hazardous","healthy","heart","heartbreaking","heartwarming","heavenly","hell","helpful","helplessness","hero","hesitant","hidden","high tech","highest","highly effective","hilarious","hoak","hoax","honest","honored","hope","hopeful","horribly","horrific","horrifying","horror","hostile","how to","huge","humility","humor","hurricane","hurry","hypnotic","idiot","ignite","illegal","illusive","imagination","immediately","imminently","impatience","impatient","impenetrable","important","impressive","improved","in the zone","incapable","incapacitated","incompetent","inconsiderate","increase","incredible","indecisive","indulgence","indulgent","inexpensive","inferior","informative","infuriated","ingredients","innocent","innovative","insane","insecure","insider","insidious","inspired","inspiring","instant savings","instantly","instructive","insult","intel","intelligent","intense","interesting","intriguing","introducing","invasion","investment","iron-clad","ironclad","irresistible","irs","is here","jackpot","jail","jaw-dropping","jealous","jeopardy","jittery","jovial","joyous","jubilant","judgmental","jumpstart","just arrived","keen","kickass","kickstart","kill","killed","killing","kills","know it all","lame","largest","lascivious","last","last chance","last minute","latest","laugh","laughing","launch","launching","lavishly","lawsuit","lazy","left behind","legendary","legitimate","liberal","liberated","lick","lies","life-changing","lifetime","light","lighthearted","likely","limited","literally","little-known","loathsome","lonely","looming","loser","lost","love","lucrative","lunatic","lurking","lust","luxurious","luxury","lying","magic","magical","magnificent","mainstream","malicious","mammoth","manipulative","marked down","massive","master","masterclass","maul","mediocre","meditative","meltdown","memorability","memorable","menacing","mesmerizing","meticulous","mind-blowing","minimalist","miracle","mired","mischievous","misgiving","missing out","mistake","monetize","money","moneyback","moneygrubbing","monumental","most important","motivated","mouth-watering","murder","mystery","nail","naked","natural","naughty","nazi","nest egg","never","new","nightmare","no good","no obligation","no one talks about","no questions asked","no risk","no strings attached","non-controlling","noted","novelty","now","obnoxious","obsessed","obsession","obvious","odd","off-kilter","off-limits","off-the record","offensive","official","okay","on-demand","open-minded","opportunities","optimistic","ordeal","outlawed","outrageousness","outstanding","overcome","overjoyed","overnight","overwhelmed","packed","painful","painless","painstaking","pale","panic","panicked","paralyzed","pas","passionate","pathetic","pay zero","payback","perfect","peril","perplexed","perspective","pessimistic","pioneering","piranha","pitfall","pitiful","placid","plague","played","playful","pleased","pluck","plummet","plunge","poison","poisonous","polarizing","poor","popular","portfolio","pound","powerful","powerless","practical","preposterous","prestige","price","priceless","pride","prison","privacy","private","privileged","prize","problem","productive","professional","profit","profitable","profound","promiscuous","promising","promote","protect","protected","proven","provocative","provoke","psychological","pummel","punch","punish","pus","quadruple","quality","quarrelsome","quick","quick-start","quickly","quiet","radiant","rare","ravenous","rebellious","recession-proof","reckoning","recognized","recommend","recreate","reduced","reflective","refugee","refund","refundable","reject","relaxed","release","relentless","reliable","remarkable","replicate","report","reprimanding","repulsed","repulsive","research","resentful","resourceful","responsible","responsive","rested","restricted","results","retaliating","reveal","revealing","revenge","revengeful","revisited","revolting","revolutionary","reward","rich","ridiculous","risky","riveting","rookie","rowdy","ruin","rules","ruthless","sabotaging","sacred","sadistic","sadly","sadness","safe","safety","sale","sampler","sarcastic","satisfied","savage","savagery","save","savings","savvy","scam","scandal","scandalous","scarce","scared","scary","scornful","scream","searing","secret","secret agenda","secret plot","secrets","secure","security","seductive","seething","seize","selected","self-hating","self-sufficient","sensational","senseless","sensual","serene","seriously","severe","sex","sexy","shaking","shameful","shameless","shaming","shatter","shellacking","shocking","should","shrewd","sick and tired","signs","silly","simple","simplicity","simplified","simplistic","sincere","sinful","sins","six-figure","sizable","sizzle","sizzled","sizzles","sizzling","sizzlingly","skill","skyrocket","slaughter","slave","sleazy","sleeping","sly","smash","smiling","smug","smuggle","smuggled","sneak-peek","sneaky","sniveling","snob","snooty","snotty","soar","soaring","solid","solution","spank","special","spectacular","speedy","spell-binding","spine","spirit","spirited","spiteful","spoiler","spontaneous","spotlight","spunky","squirming","stable","staggering","startling","steady","steal","stealthy","steamy","step-by-step","still","stoic","stop","strange","strangle","strategy","stressed","strong","strongly suggest","struggle","stuck up","studies","stunning","stupid","stupid-simple","sturdy","sublime","succeed","success","successful","suck","suddenly","suffer","sunny","super","super-human","superb","supercharge","superior","supported","supportive","sure","sure fire","surefire","surge","surging","surprise","surprised","surprising","survival","survive","suspicious","sweaty","swoon","swoon-worthy","tailspin","tank","tantalizing","targeted","tawdry","tease","technology","teetering","tempting","tenacious","tense","terrible","terrific","terrified","terrifying","terror","terrorist","tested","thankful","the truth","threaten","threatened","thrilled","thrilling","thug","ticked off","tickled","timely","today","torture","toxic","track record","trade secret","tragedy","tragic","transform","transparency","trap","trapped","trauma","traumatized","treacherous","treasure","tremendous","trend","tricks","triggers","triple","triumph","truly","trusting","trustworthy","truth","truthful","turbo-charge","turbocharges","tweaks","twitching","ultimate","unadulterated","unassuming","unauthorized","unbelievable","unburdened","uncaring","uncensored","uncertain","uncomfortable","unconditional","uncontrollable","unconventional","uncovered","undeniable","under priced","undercover","underground","underhanded","underused","unexpected","unforgettable","unheard of","unhurried","uninterested","unique","unjustified","unknowingly","unleashed","unlimited","unlock","unparalleled","unpopular","unreliable","unresponsive","unseen","unstable","unstoppable","unsure","unsurpassed","untapped","unusual","up-sell","upbeat","uplifted","uplifting","urge","urgent","useful","useless","validate","valor","valuable","value","vanquish","vaporize","venomous","verify","vibrant","vicious","victim","victory","vigorous","vilified","vindictive","violated","violent","volatile","vulnerable","waiting","wanted","wanton","warning","waste","weak","wealth","weird","what no one tells you","whip","whopping","wicked","wild","willpower","withheld","wonderful","wondrous","woozy","world","worry","worst","worthwhile","wounded","wreaking","youthful","zen","zinger"],"diacritics":{"A":"[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]","AA":"[\\uA732]","AE":"[\\u00C6\\u01FC\\u01E2]","AO":"[\\uA734]","AU":"[\\uA736]","AV":"[\\uA738\\uA73A]","AY":"[\\uA73C]","B":"[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]","C":"[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]","D":"[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]","DZ":"[\\u01F1\\u01C4]","Dz":"[\\u01F2\\u01C5]","E":"[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]","F":"[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]","G":"[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]","H":"[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]","I":"[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]","J":"[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]","K":"[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]","L":"[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]","LJ":"[\\u01C7]","Lj":"[\\u01C8]","M":"[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]","N":"[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]","NJ":"[\\u01CA]","Nj":"[\\u01CB]","O":"[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]","OI":"[\\u01A2]","OO":"[\\uA74E]","OU":"[\\u0222]","P":"[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]","Q":"[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]","R":"[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]","S":"[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]","T":"[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]","TZ":"[\\uA728]","U":"[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]","V":"[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]","VY":"[\\uA760]","W":"[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]","X":"[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]","Y":"[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]","Z":"[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]","a":"[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]","aa":"[\\uA733]","ae":"[\\u00E6\\u01FD\\u01E3]","ao":"[\\uA735]","au":"[\\uA737]","av":"[\\uA739\\uA73B]","ay":"[\\uA73D]","b":"[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]","c":"[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]","d":"[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]","dz":"[\\u01F3\\u01C6]","e":"[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]","f":"[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]","g":"[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]","h":"[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]","hv":"[\\u0195]","i":"[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]","j":"[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]","k":"[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]","l":"[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]","lj":"[\\u01C9]","m":"[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]","n":"[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]","nj":"[\\u01CC]","o":"[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]","oi":"[\\u01A3]","ou":"[\\u0223]","oo":"[\\uA74F]","p":"[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]","q":"[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]","r":"[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]","s":"[\\u0073\\u24E2\\uFF53\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]","ss":"[\\u00DF]","t":"[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]","tz":"[\\uA729]","u":"[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]","v":"[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]","vy":"[\\uA761]","w":"[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]","x":"[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]","y":"[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]","z":"[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]"},"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasRedirection":true,"hasBreadcrumb":true},"homeUrl":"https:\/\/www.ezcalculatoronline.com","objectID":1173,"objectType":"post","locale":"en","localeFull":"en_US","overlayImages":{"play":{"name":"Play icon","url":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","path":"\/home\/dh_7btfqe\/ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","position":"middle_center"},"gif":{"name":"GIF icon","url":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","path":"\/home\/dh_7btfqe\/ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","position":"middle_center"}},"defautOgImage":"https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2025\/11\/EZCALCULATORONLINE-LOGO-2.png","customPermalinks":true,"isUserRegistered":false,"autoSuggestKeywords":false,"connectSiteUrl":"https:\/\/rankmath.com\/auth?site=https%3A%2F%2Fwww.ezcalculatoronline.com&r=https%3A%2F%2Fwww.ezcalculatoronline.com%2Fte%2Fwp-json%2Fwp%2Fv2%2Fpages%2F1173%3Fnonce%3Dcca8d497b6","maxTags":5,"trendsIcon":"<svg viewBox=\"0 0 610 610\"><path d=\"M18.85,446,174.32,290.48l58.08,58.08L76.93,504a14.54,14.54,0,0,1-20.55,0L18.83,466.48a14.54,14.54,0,0,1,0-20.55Z\" style=\"fill:#4285f4\"\/><path d=\"M242.65,242.66,377.59,377.6l-47.75,47.75a14.54,14.54,0,0,1-20.55,0L174.37,290.43l47.75-47.75A14.52,14.52,0,0,1,242.65,242.66Z\" style=\"fill:#ea4335\"\/><polygon points=\"319.53 319.53 479.26 159.8 537.34 217.88 377.61 377.62 319.53 319.53\" style=\"fill:#fabb05\"\/><path d=\"M594.26,262.73V118.61h0a16.94,16.94,0,0,0-16.94-16.94H433.2a16.94,16.94,0,0,0-12,28.92L565.34,274.71h0a16.94,16.94,0,0,0,28.92-12Z\" style=\"fill:#34a853\"\/><rect width=\"610\" height=\"610\" style=\"fill:none\"\/><\/svg>","showScore":true,"siteFavIcon":"https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2025\/05\/cropped-ezcaculator-32x32.webp","canUser":{"general":false,"advanced":false,"snippet":false,"social":false,"analysis":false,"analytics":false,"content_ai":false},"showKeywordIntent":true,"isPro":false,"is_front_page":false,"trendsUpgradeLink":"https:\/\/rankmath.com\/pricing\/?utm_source=Plugin&utm_medium=CE%20General%20Tab%20Trends&utm_campaign=WP","trendsUpgradeLabel":"Upgrade","trendsPreviewImage":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/trends-preview.jpg","currentEditor":false,"homepageData":{"assessor":{"powerWords":["a cut above","absolute","absolutely","absolutely lowest","absurd","abuse","accurate","accuse","achieve","actionable","adaptable","adequate","admit","adorable","advantage","advice","affordable","aggravate","aggressive","agitated","agonizing","agony","alarmed","alarming","alienated","aligned","alive","all-inclusive","alluring","always","amazing","amp","animated","annihilate","announcing","anonymous","antagonistic","anxious","apocalypse","appalled","approved","approving","argumentative","armageddon","arrogant","ass kicking","assault","assured","astonishing","astounded","astounding","at ease","atrocious","attack","attractive","audacity","authentic","authoritative","authority","avoid","aware","awe-inspiring","awesome","awkward","backbone","backdoor","backed","backlash","backstabbing","badass","balanced","banned","bargain","barrage","basic","battle","beaming","beat down","beating","beautiful","beauty","begging","behind the scenes","belief","belong","best","best-selling","better","beware","big","billion","black market","blacklisted","blast","blessed","blinded","blissful","blood","bloodbath","bloodcurdling","bloody","blunder","blushing","bold","bomb","bona","bona fide","bonanza","bonus","bootleg","bottom line","bountiful","brave","bravery","brazen","break","breaking","breakthrough","breathtaking","bright","brilliant","broke","brutal","budget","buffoon","bullshit","bully","bumbling","buy","cadaver","calm","cancel anytime","capable","captivate","captivating","carefree","case study","cash","cataclysmic","catapult","catastrophe","caution","censored","centered","certain","certainly","certified","challenge","charming","cheap","cheat","cheat-sheet","cheer","cheerful","child-like","clarity","classified","clear","clueless","collapse","colorful","colossal","comfortable","compare","competitive","complete","completely","completeness","comprehensive","compromise","compulsive","concealed","conclusive","condemning","condescending","confess","confession","confessions","confident","confidential","conquer","conscientious","constructive","content","contrary","controlling","controversial","convenient","convert","cool","cooperative","copy","corpse","corrupt","corrupting","courage","courageous","cover-up","covert","coward","cowardly","crammed","crave","crazy","create","creative","cringeworthy","cripple","crisis","critical","crooked","crush","crushing","damaging","danger","dangerous","daring","dazzling","dead","deadline","deadly","death","decadent","deceived","deceptive","deep","defiance","definitely","definitive","defying","dejected","delicious","delight","delighted","delightful","delirious","delivered","demoralizing","deplorable","depraved","desire","desperate","despicable","destiny","destroy","detailed","devastating","devoted","diagnosed","direct","dirty","disadvantages","disastrous","discount","discover","disdainful","disempowered","disgusted","disgusting","dishonest","disillusioned","disoriented","distracted","distraught","distressed","distrustful","divulge","document","dollar","dominate","doomed","double","doubtful","download","dreadful","dreamy","drive","drowning","dumb","dynamic","eager","earnest","easily","easy","economical","ecstatic","edge","effective","efficient","effortless","elated","eliminate","elite","embarrass","embarrassed","embarrassing","emergency","emerging","emphasize","empowered","enchant","encouraged","endorsed","energetic","energy","enormous","enraged","enthusiastic","envy","epic","epidemic","essential","ethical","euphoric","evil","exactly","exasperated","excellent","excited","excitement","exciting","exclusive","exclusivity","excruciating","exhilarated","expensive","expert","explode","exploit","explosive","exposed","exquisite","extra","extraordinary","extremely","exuberant","eye-opening","fail","fail-proof","failure","faith","famous","fantasy","fascinating","fatigued","faux","faux pas","fearless","feast","feeble","festive","fide","fierce","fight","final","fine","fired","first","first ever","flirt","fluid","focus","focused","fool","fooled","foolish","forbidden","force-fed","forever","forgiving","forgotten","formula","fortune","foul","frantic","free","freebie","freedom","frenzied","frenzy","frightening","frisky","frugal","frustrated","fulfill","fulfilled","full","fully","fun","fun-loving","fundamentals","funniest","funny","furious","gambling","gargantuan","genius","genuine","gift","gigantic","giveaway","glamorous","gleeful","glorious","glowing","goddamn","gorgeous","graceful","grateful","gratified","gravity","great","greatest","greatness","greed","greedy","gripping","grit","grounded","growth","guaranteed","guilt","guilt-free","gullible","guts","hack","happiness","happy","harmful","harsh","hate","have you heard","havoc","hazardous","healthy","heart","heartbreaking","heartwarming","heavenly","hell","helpful","helplessness","hero","hesitant","hidden","high tech","highest","highly effective","hilarious","hoak","hoax","honest","honored","hope","hopeful","horribly","horrific","horrifying","horror","hostile","how to","huge","humility","humor","hurricane","hurry","hypnotic","idiot","ignite","illegal","illusive","imagination","immediately","imminently","impatience","impatient","impenetrable","important","impressive","improved","in the zone","incapable","incapacitated","incompetent","inconsiderate","increase","incredible","indecisive","indulgence","indulgent","inexpensive","inferior","informative","infuriated","ingredients","innocent","innovative","insane","insecure","insider","insidious","inspired","inspiring","instant savings","instantly","instructive","insult","intel","intelligent","intense","interesting","intriguing","introducing","invasion","investment","iron-clad","ironclad","irresistible","irs","is here","jackpot","jail","jaw-dropping","jealous","jeopardy","jittery","jovial","joyous","jubilant","judgmental","jumpstart","just arrived","keen","kickass","kickstart","kill","killed","killing","kills","know it all","lame","largest","lascivious","last","last chance","last minute","latest","laugh","laughing","launch","launching","lavishly","lawsuit","lazy","left behind","legendary","legitimate","liberal","liberated","lick","lies","life-changing","lifetime","light","lighthearted","likely","limited","literally","little-known","loathsome","lonely","looming","loser","lost","love","lucrative","lunatic","lurking","lust","luxurious","luxury","lying","magic","magical","magnificent","mainstream","malicious","mammoth","manipulative","marked down","massive","master","masterclass","maul","mediocre","meditative","meltdown","memorability","memorable","menacing","mesmerizing","meticulous","mind-blowing","minimalist","miracle","mired","mischievous","misgiving","missing out","mistake","monetize","money","moneyback","moneygrubbing","monumental","most important","motivated","mouth-watering","murder","mystery","nail","naked","natural","naughty","nazi","nest egg","never","new","nightmare","no good","no obligation","no one talks about","no questions asked","no risk","no strings attached","non-controlling","noted","novelty","now","obnoxious","obsessed","obsession","obvious","odd","off-kilter","off-limits","off-the record","offensive","official","okay","on-demand","open-minded","opportunities","optimistic","ordeal","outlawed","outrageousness","outstanding","overcome","overjoyed","overnight","overwhelmed","packed","painful","painless","painstaking","pale","panic","panicked","paralyzed","pas","passionate","pathetic","pay zero","payback","perfect","peril","perplexed","perspective","pessimistic","pioneering","piranha","pitfall","pitiful","placid","plague","played","playful","pleased","pluck","plummet","plunge","poison","poisonous","polarizing","poor","popular","portfolio","pound","powerful","powerless","practical","preposterous","prestige","price","priceless","pride","prison","privacy","private","privileged","prize","problem","productive","professional","profit","profitable","profound","promiscuous","promising","promote","protect","protected","proven","provocative","provoke","psychological","pummel","punch","punish","pus","quadruple","quality","quarrelsome","quick","quick-start","quickly","quiet","radiant","rare","ravenous","rebellious","recession-proof","reckoning","recognized","recommend","recreate","reduced","reflective","refugee","refund","refundable","reject","relaxed","release","relentless","reliable","remarkable","replicate","report","reprimanding","repulsed","repulsive","research","resentful","resourceful","responsible","responsive","rested","restricted","results","retaliating","reveal","revealing","revenge","revengeful","revisited","revolting","revolutionary","reward","rich","ridiculous","risky","riveting","rookie","rowdy","ruin","rules","ruthless","sabotaging","sacred","sadistic","sadly","sadness","safe","safety","sale","sampler","sarcastic","satisfied","savage","savagery","save","savings","savvy","scam","scandal","scandalous","scarce","scared","scary","scornful","scream","searing","secret","secret agenda","secret plot","secrets","secure","security","seductive","seething","seize","selected","self-hating","self-sufficient","sensational","senseless","sensual","serene","seriously","severe","sex","sexy","shaking","shameful","shameless","shaming","shatter","shellacking","shocking","should","shrewd","sick and tired","signs","silly","simple","simplicity","simplified","simplistic","sincere","sinful","sins","six-figure","sizable","sizzle","sizzled","sizzles","sizzling","sizzlingly","skill","skyrocket","slaughter","slave","sleazy","sleeping","sly","smash","smiling","smug","smuggle","smuggled","sneak-peek","sneaky","sniveling","snob","snooty","snotty","soar","soaring","solid","solution","spank","special","spectacular","speedy","spell-binding","spine","spirit","spirited","spiteful","spoiler","spontaneous","spotlight","spunky","squirming","stable","staggering","startling","steady","steal","stealthy","steamy","step-by-step","still","stoic","stop","strange","strangle","strategy","stressed","strong","strongly suggest","struggle","stuck up","studies","stunning","stupid","stupid-simple","sturdy","sublime","succeed","success","successful","suck","suddenly","suffer","sunny","super","super-human","superb","supercharge","superior","supported","supportive","sure","sure fire","surefire","surge","surging","surprise","surprised","surprising","survival","survive","suspicious","sweaty","swoon","swoon-worthy","tailspin","tank","tantalizing","targeted","tawdry","tease","technology","teetering","tempting","tenacious","tense","terrible","terrific","terrified","terrifying","terror","terrorist","tested","thankful","the truth","threaten","threatened","thrilled","thrilling","thug","ticked off","tickled","timely","today","torture","toxic","track record","trade secret","tragedy","tragic","transform","transparency","trap","trapped","trauma","traumatized","treacherous","treasure","tremendous","trend","tricks","triggers","triple","triumph","truly","trusting","trustworthy","truth","truthful","turbo-charge","turbocharges","tweaks","twitching","ultimate","unadulterated","unassuming","unauthorized","unbelievable","unburdened","uncaring","uncensored","uncertain","uncomfortable","unconditional","uncontrollable","unconventional","uncovered","undeniable","under priced","undercover","underground","underhanded","underused","unexpected","unforgettable","unheard of","unhurried","uninterested","unique","unjustified","unknowingly","unleashed","unlimited","unlock","unparalleled","unpopular","unreliable","unresponsive","unseen","unstable","unstoppable","unsure","unsurpassed","untapped","unusual","up-sell","upbeat","uplifted","uplifting","urge","urgent","useful","useless","validate","valor","valuable","value","vanquish","vaporize","venomous","verify","vibrant","vicious","victim","victory","vigorous","vilified","vindictive","violated","violent","volatile","vulnerable","waiting","wanted","wanton","warning","waste","weak","wealth","weird","what no one tells you","whip","whopping","wicked","wild","willpower","withheld","wonderful","wondrous","woozy","world","worry","worst","worthwhile","wounded","wreaking","youthful","zen","zinger"],"diacritics":true,"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasBreadcrumb":true,"serpData":{"title":"%sitename% %sep% %sitedesc%","description":"%sitedesc%","titleTemplate":"%sitename% %page% %sep% %sitedesc%","descriptionTemplate":"","focusKeywords":"","breadcrumbTitle":"Home","robots":{"index":true},"advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":""}}},"tocTitle":"Table of Contents","tocExcludeHeadings":[],"listStyle":"ul"},"_links":{"self":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/1173","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/comments?post=1173"}],"version-history":[{"count":10,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/1173\/revisions"}],"predecessor-version":[{"id":9795,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/1173\/revisions\/9795"}],"up":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/4298"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/media\/7379"}],"wp:attachment":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/media?parent=1173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}