Compare commits

...

4 Commits

Author SHA1 Message Date
deploy
d83dc3cf16 首页宝宝踢:小脚连蹬 2~4 下带「咚」声后缩回,脚印缩小变淡(v26110650)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 10:42:45 +00:00
deploy
8ae53482eb 测一测结果页加「返回首页」按钮,回广场测一测列表
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 10:37:17 +00:00
deploy
c858801268 首页宝宝踢:先只鼓包,0.7 秒后小脚丫才慢慢浮现(v26110649)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 10:35:12 +00:00
deploy
e74c116534 首页宝宝踢:先鼓起来、到顶才隐约浮出小脚丫(v26110648)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 10:33:20 +00:00
9 changed files with 78 additions and 17 deletions

View File

@@ -218,6 +218,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
.rec em{flex:none;font-style:normal;height:28px;padding:0 12px;border-radius:99px;font-size:12.5px;font-weight:700;line-height:28px}
.rec.g-quiz em{background:#FFEEE8;color:#E8643F}.rec.g-psy em{background:#F1EDFF;color:#7C5CFC}.rec.g-game em{background:#E2F6F1;color:#13917C}.rec.g-shop em{background:#FFEEF3;color:#E9557F}
.again{margin-top:24px}
.rend{display:flex;gap:10px;margin-top:24px}.rend .btn{flex:1;min-width:0}
.foot{margin:28px 20px 0;font-size:12px;color:var(--sub);text-align:center}
.toast{position:fixed;left:50%;bottom:calc(80px + env(safe-area-inset-bottom));transform:translate(-50%,8px);max-width:300px;padding:10px 16px;border-radius:12px;background:rgba(31,35,41,.88);color:#fff;font-size:13.5px;line-height:1.6;text-align:center;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:60}
.toast.on{opacity:1;transform:translate(-50%,0)}
@@ -310,7 +311,11 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
<section class="blk fade" id="rTipsB"><div class="sh2"><i>02</i><b>给你的小建议</b></div><div class="tips" id="rTips"></div></section>
<section class="blk fade" id="rRvB"><div class="sh2"><i>03</i><b id="rRvT"></b></div><div id="rRv"></div></section>
<section class="blk fade"><div class="sh2"><i>04</i><b>再测一个</b><span>共 30 个测试</span></div><div class="recs" id="rRecs"></div></section>
<button class="btn sec again" id="againBtn"><svg class="ic"><use href="#i-refresh"/></svg>重新测试</button>
<!-- 11-07 用户:「所有测一测的结果页要有一个『返回首页』按钮,返回到测试入口,也就是列表页」→ 孕妈广场「测一测」列表(guangchang/?c=ceshi) -->
<div class="rend">
<button class="btn sec" id="againBtn"><svg class="ic"><use href="#i-refresh"/></svg>重新测试</button>
<button class="btn pri" id="listBtn"><svg class="ic"><use href="#i-list" xlink:href="#i-list"/></svg>返回首页</button>
</div>
</main>
<p class="foot">趣味测试,仅供参考;身体相关问题以医生意见为准</p>
@@ -478,6 +483,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
function startQuiz() { cur = 0; ans = []; busy = false; stage.classList.remove('outL', 'outR', 'inL', 'inR'); paint(); show('quiz'); }
$('#startBtn').addEventListener('click', function () { haptic(); startQuiz(); });
$('#againBtn').addEventListener('click', startQuiz);
/* 11-07 结果页「返回首页」= 回测试列表(孕妈广场「测一测」分类),查询参数和身份 hash 原样带上 */
$('#listBtn').addEventListener('click', function () { var q = new URLSearchParams(location.search); ['id', 'c', 'n', 't'].forEach(function (k) { q.delete(k); }); q.set('c', 'ceshi'); location.href = '../?' + q.toString() + location.hash; });
$('#againTop').addEventListener('click', startQuiz);
/* ================= ③ 计分 ================= */

View File

@@ -9,7 +9,7 @@
<title>兜爸心选 · 孕育陪伴</title>
<!-- 11-04 UGC 总开关(孕妈广场 + 测一测,后台 /box_bm/plaza 顶部切换),见 js/ugc.js -->
<script src="js/ugc.js?v=26110702"></script>
<!-- V:26110647 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<!-- V:26110650 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<link rel="stylesheet" href="mama-box.css">
<link rel="stylesheet" href="night.css?v=26110608">
<link rel="stylesheet" href="js/wh-cm.css?v=26110642">
@@ -2732,7 +2732,7 @@ html.night .rs-pan .rp-card{background:rgba(255,255,255,.06);border-color:rgba(2
})();
</script>
<!-- 2026-10-03 首页彩蛋:宝宝在肚皮底下动(独立文件,删掉这一行即整体下线;开关在「隐私权限」) -->
<script src="js/bump.js?v=26110647"></script>
<script src="js/bump.js?v=26110650"></script>
<!-- 2026-10-04 首页头图:按孕周换宝宝 + 阳光水波(独立文件) -->
<script src="js/hero-fx.js"></script>
<!-- 2026-10-05 首页头图:宝宝时不时动一动小手小脚(独立文件,删掉这一行即下线) -->

View File

@@ -3,7 +3,7 @@
(function () {
'use strict';
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
var VER = '26110647';
var VER = '26110650';
const $ = (s, c) => (c || document).querySelector(s);
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));

View File

@@ -242,6 +242,13 @@
let t = .7; ft.beats = r.map(d => (t += d * m));
ft.dur = Math.max(ft.dur, t + .9); ft.kicked = true; // 有节奏就不再「中途再顶一下」
}
/* 11-07 用户:「踢的时候伴随着小音效,紧着蹬了几脚之后又缩回去」→ 小脚丫一顶上来就原地快蹬 2~4 下,蹬完就收(不再停 3~5 秒) */
if (P === PARTS.foot && !inChain && !ft.beats) {
const n = 2 + (Math.random() * 3 | 0), m = stage && stage.slow ? 1.25 : 1;
let t = .55; ft.beats = []; for (let i = 0; i < n; i++) ft.beats.push(t += (.26 + Math.random() * .12) * m);
ft.dur = t + .75; ft.kicked = true;
}
if (!pk.held) kickSnd(P.soft || P.roll ? .55 : 1);
ft.catchable = P !== PARTS.kick;
if (!skin) skin = findSkin(ft.x, ft.y);
gather(ft.x, ft.y, Math.max(P.rx, P.ry) * 1.25 + 20);
@@ -274,6 +281,15 @@
g.gain.setValueAtTime(.0001, t); g.gain.exponentialRampToValueAtTime(vol, t + .008); g.gain.exponentialRampToValueAtTime(.0001, t + len);
o.connect(g); g.connect(a.destination); o.start(t); o.stop(t + len + .02);
}
/* 11-07 踢一下「咚」:低沉短促的闷声 + 一点点软的上泛,音量很小;跟随静音键(ambient)。
AudioContext 必须在用户手势里建,否则一直是 suspended → 页面上第一次点 / 滑时先建好,之后宝宝自己踢就能出声 */
function kickSnd(v) {
if (!ac || ac.state !== 'running' || document.hidden) return;
blip(150, 62, .11 * v, .15); blip(290, 150, .025 * v, .07, .012);
}
['pointerdown', 'touchend', 'click'].forEach(t => document.addEventListener(t, function un() {
audio(); if (ac && ac.state === 'running') ['pointerdown', 'touchend', 'click'].forEach(x => document.removeEventListener(x, un, true));
}, true));
const buzz = p => { try { navigator.vibrate && navigator.vibrate(p); } catch (e) {} };
function heart(x, y) {
@@ -360,7 +376,7 @@
ft.beat++; ft.h.vel -= 85; ft.pop = .12;
ft.ox += (Math.random() - .5) * 10; ft.oy += (Math.random() - .5) * 10;
}
if (ft.pop > 0 && (ft.pop -= dt) <= 0) ft.h.vel += stage && stage.slow ? 95 : 150;
if (ft.pop > 0 && (ft.pop -= dt) <= 0) { ft.h.vel += stage && stage.slow ? 95 : 150; kickSnd(.8); }
}
if (u > ft.dur) {
// 连续踢:这一下收得快一点,旁边紧接着再来,不等下一个间隔
@@ -472,13 +488,16 @@
for (const [tx, ty, trx, try_] of TOES) { cx.moveTo(tx + dx + trx, ty + dy); cx.ellipse(tx + dx, ty + dy, trx, try_, 0, 0, 7); }
cx.fill();
}
function footprint(x, y, rx, ry, ang, k) {
if (k < .15) return;
const a = Math.min(1, (k - .15) / .6), f = .9;
function footprint(x, y, rx, ry, ang, k, life) {
/* 11-07 用户二次纠正:「隐隐约约看出来是个小脚印就行,不能那么大」——主角是页面被小脚撑起来的鼓包,
脚印只是鼓包顶上很小、很淡的一层(鼓包的 1/3 大,软边,峰值 0.12),顶到一半以上、第一下蹬上来之后才有 */
if (k < .5 || life < .35) return;
const sm = v => (v = Math.min(1, Math.max(0, v)), v * v * (3 - 2 * v));
const a = sm((k - .5) / .5) * sm((life - .35) / .4), f = .34;
cx.save(); cx.translate(x, y); cx.rotate(ang); cx.scale(rx * f, ry * f);
cx.shadowBlur = 3 * dpr;
cx.fillStyle = cx.shadowColor = 'rgba(255,255,255,' + (.3 * a).toFixed(3) + ')'; soleShape(-.025, -.03);
cx.fillStyle = cx.shadowColor = 'rgba(120,72,58,' + (.3 * a).toFixed(3) + ')'; soleShape(0, 0);
cx.shadowBlur = 4 * dpr;
cx.fillStyle = cx.shadowColor = 'rgba(255,255,255,' + (.16 * a).toFixed(3) + ')'; soleShape(-.04, -.05);
cx.fillStyle = cx.shadowColor = 'rgba(110,70,58,' + (.12 * a).toFixed(3) + ')'; soleShape(0, 0);
cx.restore();
}
function paint() {
@@ -498,7 +517,7 @@
[-.07, -.09, .2, 'rgba(255,255,255,' + (.5 * k).toFixed(3) + ')']])
]);
// 小脚丫顶上来时,隐隐约约带出一个脚印:极淡、全是软边,峰值时才看得出,凑近看像有像无
if (P === PARTS.foot || P === PARTS.kick) footprint(ft.x + ft.ox + ox, ft.y + ft.oy + oy, P.rx * sp, P.ry * sp, ft.ang + (mode === 'show' ? ft.wob : 0), Math.min(H / P.amp, 1));
if (P === PARTS.foot || P === PARTS.kick) footprint(ft.x + ft.ox + ox, ft.y + ft.oy + oy, P.rx * sp, P.ry * sp, ft.ang + (mode === 'show' ? ft.wob : 0), Math.min(H / P.amp, 1), ft.life);
}
const D = pk.d.v;
if (D < -.2) {

View File

@@ -159,6 +159,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
.mate p{margin-top:2px;font-size:13.5px;color:var(--txt);line-height:1.55}
#tools{margin-top:36px !important}
.again{margin-top:24px}
.rend{display:flex;gap:10px;margin-top:24px}.rend .btn{flex:1;min-width:0}
.foot{margin:28px 20px 0;font-size:12px;color:var(--sub);text-align:center}
.toast{position:fixed;left:50%;bottom:calc(80px + env(safe-area-inset-bottom));transform:translate(-50%,8px);max-width:300px;padding:10px 16px;border-radius:12px;background:rgba(31,35,41,.88);color:#fff;font-size:13.5px;line-height:1.6;text-align:center;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:60}
@@ -302,7 +303,11 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
<div id="tools" class="fade"></div>
<button class="btn sec again" id="againBtn"><svg class="ic"><use href="#i-refresh" xlink:href="#i-refresh"/></svg>重新测试</button>
<!-- 11-07 用户:「所有测一测的结果页要有一个『返回首页』按钮,返回到测试入口,也就是列表页」→ 孕妈广场「测一测」列表(guangchang/?c=ceshi) -->
<div class="rend">
<button class="btn sec" id="againBtn"><svg class="ic"><use href="#i-refresh" xlink:href="#i-refresh"/></svg>重新测试</button>
<button class="btn pri" id="listBtn"><svg class="ic"><use href="#i-list" xlink:href="#i-list"/></svg>返回首页</button>
</div>
</main>
<p class="foot">趣味测试,仅供娱乐;身体相关问题以产检医生意见为准</p>
@@ -525,6 +530,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
}
$('#startBtn').addEventListener('click', startQuiz);
$('#againBtn').addEventListener('click', startQuiz);
/* 11-07 结果页「返回首页」= 回测试列表(孕妈广场「测一测」分类),查询参数和身份 hash 原样带上 */
$('#listBtn').addEventListener('click', function () { var q = new URLSearchParams(location.search); ['id', 'c', 'n', 't'].forEach(function (k) { q.delete(k); }); q.set('c', 'ceshi'); location.href = '../../guangchang/?' + q.toString() + location.hash; });
/* ================= 计分 ================= */
function score(answers) {

View File

@@ -160,6 +160,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
.mate p{margin-top:2px;font-size:13.5px;color:var(--txt);line-height:1.55}
#tools{margin-top:36px !important}
.again{margin-top:24px}
.rend{display:flex;gap:10px;margin-top:24px}.rend .btn{flex:1;min-width:0}
.foot{margin:28px 20px 0;font-size:12px;color:var(--sub);text-align:center}
.toast{position:fixed;left:50%;bottom:calc(80px + env(safe-area-inset-bottom));transform:translate(-50%,8px);max-width:300px;padding:10px 16px;border-radius:12px;background:rgba(31,35,41,.88);color:#fff;font-size:13.5px;line-height:1.6;text-align:center;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:60}
@@ -306,7 +307,11 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
<div id="tools" class="fade"></div>
<button class="btn sec again" id="againBtn"><svg class="ic"><use href="#i-refresh" xlink:href="#i-refresh"/></svg>重新测试</button>
<!-- 11-07 用户:「所有测一测的结果页要有一个『返回首页』按钮,返回到测试入口,也就是列表页」→ 孕妈广场「测一测」列表(guangchang/?c=ceshi) -->
<div class="rend">
<button class="btn sec" id="againBtn"><svg class="ic"><use href="#i-refresh" xlink:href="#i-refresh"/></svg>重新测试</button>
<button class="btn pri" id="listBtn"><svg class="ic"><use href="#i-list" xlink:href="#i-list"/></svg>返回首页</button>
</div>
</main>
<p class="foot">趣味测试,仅供娱乐;每位准爸爸都在学着当爸爸</p>
@@ -531,6 +536,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
}
$('#startBtn').addEventListener('click', startQuiz);
$('#againBtn').addEventListener('click', startQuiz);
/* 11-07 结果页「返回首页」= 回测试列表(孕妈广场「测一测」分类),查询参数和身份 hash 原样带上 */
$('#listBtn').addEventListener('click', function () { var q = new URLSearchParams(location.search); ['id', 'c', 'n', 't'].forEach(function (k) { q.delete(k); }); q.set('c', 'ceshi'); location.href = '../../guangchang/?' + q.toString() + location.hash; });
/* ================= 计分 ================= */
function score(answers) {

View File

@@ -160,6 +160,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
.mate p{margin-top:2px;font-size:13.5px;color:var(--txt);line-height:1.55}
#tools{margin-top:36px !important}
.again{margin-top:24px}
.rend{display:flex;gap:10px;margin-top:24px}.rend .btn{flex:1;min-width:0}
.foot{margin:28px 20px 0;font-size:12px;color:var(--sub);text-align:center}
.toast{position:fixed;left:50%;bottom:calc(80px + env(safe-area-inset-bottom));transform:translate(-50%,8px);max-width:300px;padding:10px 16px;border-radius:12px;background:rgba(31,35,41,.88);color:#fff;font-size:13.5px;line-height:1.6;text-align:center;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:60}
@@ -337,7 +338,11 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
<div id="tools" class="fade"></div>
<button class="btn sec again" id="againBtn"><svg class="ic"><use href="#i-refresh" xlink:href="#i-refresh"/></svg>重新测试</button>
<!-- 11-07 用户:「所有测一测的结果页要有一个『返回首页』按钮,返回到测试入口,也就是列表页」→ 孕妈广场「测一测」列表(guangchang/?c=ceshi) -->
<div class="rend">
<button class="btn sec" id="againBtn"><svg class="ic"><use href="#i-refresh" xlink:href="#i-refresh"/></svg>重新测试</button>
<button class="btn pri" id="listBtn"><svg class="ic"><use href="#i-list" xlink:href="#i-list"/></svg>返回首页</button>
</div>
</main>
<p class="foot">孕期自测,仅供参考,不能代替医生判断;照顾好自己,就是在照顾宝宝</p>
@@ -563,6 +568,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
}
$('#startBtn').addEventListener('click', startQuiz);
$('#againBtn').addEventListener('click', startQuiz);
/* 11-07 结果页「返回首页」= 回测试列表(孕妈广场「测一测」分类),查询参数和身份 hash 原样带上 */
$('#listBtn').addEventListener('click', function () { var q = new URLSearchParams(location.search); ['id', 'c', 'n', 't'].forEach(function (k) { q.delete(k); }); q.set('c', 'ceshi'); location.href = '../../guangchang/?' + q.toString() + location.hash; });
/* ================= 计分 ================= */
function score(answers) {

View File

@@ -161,6 +161,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
.mate p{margin-top:2px;font-size:13.5px;color:var(--txt);line-height:1.55}
#tools{margin-top:36px !important}
.again{margin-top:24px}
.rend{display:flex;gap:10px;margin-top:24px}.rend .btn{flex:1;min-width:0}
.foot{margin:28px 20px 0;font-size:12px;color:var(--sub);text-align:center}
.toast{position:fixed;left:50%;bottom:calc(80px + env(safe-area-inset-bottom));transform:translate(-50%,8px);max-width:300px;padding:10px 16px;border-radius:12px;background:rgba(31,35,41,.88);color:#fff;font-size:13.5px;line-height:1.6;text-align:center;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:60}
@@ -322,7 +323,11 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
<div id="tools" class="fade"></div>
<p class="warn">仅供参考,不能代替医生判断,有不适请及时就医</p>
<button class="btn sec again" id="againBtn"><svg class="ic"><use href="#i-refresh" xlink:href="#i-refresh"/></svg>重新测试</button>
<!-- 11-07 用户:「所有测一测的结果页要有一个『返回首页』按钮,返回到测试入口,也就是列表页」→ 孕妈广场「测一测」列表(guangchang/?c=ceshi) -->
<div class="rend">
<button class="btn sec" id="againBtn"><svg class="ic"><use href="#i-refresh" xlink:href="#i-refresh"/></svg>重新测试</button>
<button class="btn pri" id="listBtn"><svg class="ic"><use href="#i-list" xlink:href="#i-list"/></svg>返回首页</button>
</div>
</main>
<p class="foot">生活饮食自查,仅供参考;身体相关问题以产检医生意见为准</p>
@@ -561,6 +566,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
}
$('#startBtn').addEventListener('click', startQuiz);
$('#againBtn').addEventListener('click', startQuiz);
/* 11-07 结果页「返回首页」= 回测试列表(孕妈广场「测一测」分类),查询参数和身份 hash 原样带上 */
$('#listBtn').addEventListener('click', function () { var q = new URLSearchParams(location.search); ['id', 'c', 'n', 't'].forEach(function (k) { q.delete(k); }); q.set('c', 'ceshi'); location.href = '../../guangchang/?' + q.toString() + location.hash; });
/* ================= 计分:每题 0~3,合计折算 100 分;各方面按得分率 ================= */
function score(answers) {

View File

@@ -178,6 +178,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
.disc{margin-top:14px;font-size:12.5px;line-height:1.6;color:var(--sub);text-align:center}
#tools{margin-top:36px !important}
.again{margin-top:24px}
.rend{display:flex;gap:10px;margin-top:24px}.rend .btn{flex:1;min-width:0}
.foot{margin:28px 20px 0;font-size:12px;color:var(--sub);text-align:center}
.toast{position:fixed;left:50%;bottom:calc(80px + env(safe-area-inset-bottom));transform:translate(-50%,8px);max-width:300px;padding:10px 16px;border-radius:12px;background:rgba(31,35,41,.88);color:#fff;font-size:13.5px;line-height:1.6;text-align:center;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:60}
@@ -322,7 +323,11 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
<div id="tools" class="fade"></div>
<button class="btn sec again" id="againBtn"><svg class="ic"><use href="#i-refresh" xlink:href="#i-refresh"/></svg>重新测试</button>
<!-- 11-07 用户:「所有测一测的结果页要有一个『返回首页』按钮,返回到测试入口,也就是列表页」→ 孕妈广场「测一测」列表(guangchang/?c=ceshi) -->
<div class="rend">
<button class="btn sec" id="againBtn"><svg class="ic"><use href="#i-refresh" xlink:href="#i-refresh"/></svg>重新测试</button>
<button class="btn pri" id="listBtn"><svg class="ic"><use href="#i-list" xlink:href="#i-list"/></svg>返回首页</button>
</div>
</main>
<p class="foot">生活小自查,仅供参考;具体安排以产检医生意见为准</p>
@@ -558,6 +563,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
}
$('#startBtn').addEventListener('click', startQuiz);
$('#againBtn').addEventListener('click', startQuiz);
/* 11-07 结果页「返回首页」= 回测试列表(孕妈广场「测一测」分类),查询参数和身份 hash 原样带上 */
$('#listBtn').addEventListener('click', function () { var q = new URLSearchParams(location.search); ['id', 'c', 'n', 't'].forEach(function (k) { q.delete(k); }); q.set('c', 'ceshi'); location.href = '../../guangchang/?' + q.toString() + location.hash; });
/* ================= 计分 ================= */
function pts(a) { return a.map(function (i, qi) { return QS[qi].o[i][0]; }); }