wandanle

真的假的啊 整包遊戲只要0.55mb

備份一下人文社科學生模擬器 2026_10_18的版本
另外還要下載 cubic11_full.woff2

<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, viewport-fit=cover">
<meta name="theme-color" content="#080808">
<meta name="color-scheme" content="dark light">
<!-- 第一個畫面就用對的深淺色(不等遊戲程式跑完):照存檔的設定,沒有就照裝置的深淺色 -->
<script>(function(){ try{ var p=null; try{ p=JSON.parse(localStorage.getItem('hssim_px_v2')||'null'); }catch(e){}
  var sc=p&&p.scheme, lt=sc==='light'||(sc!=='dark'&&!!window.matchMedia&&matchMedia('(prefers-color-scheme: light)').matches);
  if(lt){ document.documentElement.classList.add('lt'); var m=document.querySelector('meta[name=theme-color]'); if(m)m.content='#202c4c'; } }catch(e){} })();</script>
<title>人文社科學生模擬器</title>
<meta name="description" content="16 歲到大學畢業。理論直覺、實證努力、政治、信心、行政、口才——六種能力,一場人文社會科學的多年試煉。">
<link rel="preconnect" href="https://fonts.googleapis.com">
<!-- 思源黑體不擋畫面:先用系統字體,Google 字型到了再換上(原本會讓整頁白屏等它) -->
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;700&display=swap" rel="stylesheet" media="print" onload="this.media='all'">
<noscript><link href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;700&display=swap" rel="stylesheet"></noscript>
<!-- 內嵌像素字型保留了哪些字(tools/subset_font.py 產生);名字用到其他字時才去載同資料夾的 cubic11_full.woff2 -->
<script id="cubic11-chars">window.CUBIC11_CHARS="§±·×÷–—“”…※←↑→↓−≧─■□▲△▼▽◆◇○●★☆♪ 、。〈〉《》「」『』し・一丁七三上下不且世丘丟並中串丸主久之乎乏也亂了事二于五些亞交亦享京亮人什仁今介仍仔他代令以件任份企伊伍伏休伯估似但位低住佑佔何佘余作你佳使來例依侯便係促俊俐保俞信修個倍們倒候借倡倪值假偉偏做停健側偶偽傅傑備催傳傷像僚價僻儀億儉儒儕優儲元先光克免入內全兩八公六共其具典兼再冒冠冥冬冷凃凌凝凡凱出刁分切刊列初判別利刪到制刷券刺刻則前剛剝剩剪副割創劃劈劉劑力功加助努勇動務勝勞募勢勤勵勺勻勾包化北匯區十千升午半卓南博卜卡印即卷卻厚原厭去參又叉及友反取受叛口古句另只叫可台史右司叼吃各合吉吊同名吐向君吞否含吳吵吸呂呈告呢周呼命和咖咧咬咯品員哥哪哭哲唐唯唱唸啃商啊問啟啡啪啵喀善喔喜喝喬單喻嗎嘆嘉嘟嘴嘶噗器嚴四回因囪固圃圈國圍園圓圖團土在地圾址均坐坡坪垂垃型城域執基堂堆堡堪報場塊塔塗填塵境墊增墨壁壇壓壞士壺夏夕外多夜夠夢大天太央失夾奇奏奕套奪奶好如妍妤妮妹姊始姍姓委姚姜姵姿威娜娟婆婉婕婷媒媛媽嫌嫻嬿子孔字存孝孟季孫學它宇守安宋完宏宗官定宜客宣室宥宮宰害家宸容宿寄密富寒寓察實寧審寫寬封專尊對導小少尖尚尤就尹尾局屆屈屋屏展屜層履屬山岑岩岳峰峻崇崑崔崙崩崴嵌嵐嶸嶺巍川州工左巧巫差己已巴巷市布帆帕帝師帳帶常帽幅幕幫平年幸幹幻幼幾床序底店府度座庭康庸廊廓廖廠廢廳延廷建弈式引弟弦弧張強彈彎形彥彩彬彭影彼往待很律後徐徑得從復循微徵德心必忍志忘忙忠快念怎怒怕思怡性怪恢恥恨恩息悄悔您悶情惠惱想意愛感慈態慘慢慣慧慮慰憂憶懂應懶懷懸戀成我或戚截戰戲戴戶房所手才扎打托扛扣扯扶批找承技抉把抓投折抬抱押抽抿拆拉拋拍拒拖招拜括拱拿持指按挑挪捏捐捨捲捷授掉排掛採探接控推描提插揚換揭援損搜搞搬搭撐撒撥播擇擊擋操擎擔擠擬擲擴攢攤支收改攻放政故效敏敗敘教敢散敲整數文斌斑斗料斜新斷方於施旁旋旗既日早旺昀昇昊昌明易昕星春是昱時晉晏晚晟晨普景晰晴晶智暄暉暑暖暗暫暮曉曲更書曹曾替最會月有朋服朗望期木未末本朱朵杆李杏材村杜束杯杰東板析林果枯架柏某染柔查柯柱柳柴栗校核根格栽桂框案桌桐桿梁梅條梧梯梳棄棒棕森植椰楊楚楣業極概榜榮構樂樊樓標模樣樹橄橘機橢檔檢檻欄權欖次欣款歉歌歐歡止正此步武歧歲歷歸死殊殖殘段殷殺殼殿毅母每毒毓比毛毯民氛氣水永求汗汝江池汪汶決沁沈沒沖沙沛油治沿泓法泛泡波注泳洋洗洛洞津洪洲活派流浚浩浪浮海涂消涓涯涵淇淑淚淡深淳淵混淺清減渡渣渦測游湊湘湯源準溪溫滅滋滑滕滴滾滿漏演漢漩漸潔潘潛潤潰澄澡澤濃濤濾瀏瀚灝灣火灰炎炭為烈烏無焦然煉煌煙煜照煩熊熟熬熱燃燈燒燕營爆爍爬爭爸爺爾牆片版牌牙牛牟物特狀狼猶獎獨獲獻率玉王玟玩玫玲玳玻珀珂珈珊珍珠班珮現球理琇琉琛琥琦琪琬琮琳琴瑀瑁瑄瑋瑚瑛瑜瑞瑟瑤瑩瑾璃璇璋璟環璿瓦甄甘甚生產用甩田由申界畏留畢略畫異當疊疏疑病症痕痛痣療癒癮登發白百的皆皓皮皺盆盎盛盟監盤盧目直相省眉看真眼眾睛睜睡睫睿瞪知短矮石砂研砲破硬硯碎碟碩碰確碼磁磚磨礎示社祁祐祝神祥票福禮禹秀私秋科秒租秦移稀程種稱稿穆積穩究空穿突窄窗立站章竣童端競竹笑笙符第筆等筑答筠筱算管箱箴節範篇築篩簡簫簷簽簾籃籤米粉粒粗粘粹精糊糖糰系紀約紅紋純紗紙級素索紫紮累細紹終組結絕絡給統絲綁經綜綠維綱網綸綺緊緒線緣編緯練縈縣縫縮縱縷總繁繆織繞繩繪繼續缺罩置罵羅美群義羿翁翊翎習翔翟翠翡翰翹翻翼耀老考者而耕耗耳耿聊聖聘聚聞聯聰聲聶職聽肄股肩肯育背胡胤能脆脈脖脫腦腮腰腳膀膚膠臂臉臧臨自至致臺臻與興舉舊舌舍舒舞航舫般良色艾芃芊芬芯花芳芷芸苓苗苡若苦英茂范茵茶茹荃草荷莉莊莎莘莫菁菇菊菜華菱萊萍萬萱落葉著葛董葦葳蒙蒲蓁蓉蓋蓓蓬蓮蔚蔡蔣蔽蕙蕭蕾薄薇薑薛薪薰藍藏藝藤藥蘇蘊蘭虎處虞號虹蝴蝶融螢蟲血行衍術衛衝衡衣表衫衰袁袋袍被裁裂裕補裝裡裴製複褐褚襟襯西要覃覆見規視親覺覽觀角解觸言訂計訊討訓記訪設許訴診註評詞詠試詩話該詹誌認語誠誤說説誰課誼調談請論諭諱諷諸謊謙講謝證識譚警議譽讀變讓讚谷豆豐象豪豫貌貓貝貞負財貧貨責貴買費貼賀資賈賠賢賦質賭賴賺購賽贈赭走起超越趕趙趣跑距跟跨路跳踏蹤躁躍身躺車軍軒軟軸較載輔輕輝輩輪輯輸轉辛辜辦辭辮辯辰農近迪述迴追退送逃逆透逐途這通速造連週進逸逼遇遊運遍過道達遜遞遠遣適遮遲遵選遺避邀還邊邢那邱邵郁郝部郭都鄉鄒鄔鄧鄭配酒醒醫釋重野量金釘針鈔鈕鈞鈸鈺銅銓銘銷鋼錄錢錦錯鍵鍾鎖鎮鏡鐘鐵鑑鑫長門閃閉開閒間閱閻闆闕關阮阻附降限院陣除陰陳陶陸陽隆隊階隔際障隨險隱隻雀雅集雌雖雙雜離難雨雪雯雲零雷電需霆震霈霍霏霓霖霞霧露霸靈青靖靛靜靠面革靳韋韓韜音韻響頁頂項順頌預頒頓領頭頰頻顆題額顎顏願類顧顯風飄飛飯飽飾養餐餓餘館餵饒首香馥馨馬馮駁駱駿騙騰驊驗驚骨骰體高髮鬆鬍鬚鬢鬥鬧鬱魏魚魯鮑鮮鳥鳳鳴鴉鴨鴻鵑鵬鶯麒麗麟麥麻麼黃黎黑默黛點鼓鼻齊齡龍龔!%()+,-/0123456789:;=?|~";</script>

<style>
/* Cubic11 像素字型只保留遊戲用到的字(約 1,660 字)+台灣常見姓名用字(約 400 字):原本 400 KB → 84 KB,第一次開啟快很多。
   玩家取名用到不在裡面的冷僻字時,那幾個字會改用一般字體。改了遊戲文字要重新裁字型:tools/subset_font.py */
@font-face{font-family:'Cubic11';font-display:swap;
  src:url(data:font/woff2;base64,d09GMgABAAAAAUg8AA4AAAAH+7AAAUfkAAFzdQAAAAAAAAAAAAAAAAAAAAAAAAAAGi4bjDgchQAGYADobBEICp3mBJ6cNAE2AiQDwjALwjQABCAFjgQHIFu79JcO/20M/ys6yzsyVZsbAIPahgBL/1SLokHlK2Tns+BuIUtZFYX/gLj7clKgO5EQ6S5rZqaqqqqqqqqqLlxQEdk2PXtv9ezefUjAIwoiAqYkkDgqHL0FHUp7jxEOYpZlDq970tl0tbJNl12PHvugzWtiHI5RcuqnyhzH80ptpuhXTderSZiMQ1hu0IvMvr2+qeOpSiAZAtuw+9uax1wx7izjXfY+I8hopYUgCILLOtxytxVIoQkEmuF42FUtS5Xjvu9qjOrIQ/YhCKYmCKLXfBoxYgT6+FEghRQEBASaIFmWsADCWi5PQkIQyDYhypU7dUlJycbhB2Shrm7OOGwhFhuBxHNVYSBBECC6zQ4D0DHyadWGjvWw9GxOnlPWTS9xH9WJarSAQApyq69595ZC0FrilH1u6kMtJr5UjOMo93WsXyfetw1xQ503VQ5/PXNJSElIQUgQEgQEhBHD3eGSe5pAQHgULDQiICDQL1Xl8MxISJmAJtBnsQX0MFMHHfItuRYqX/Irdd6ll5Z4oz5tY6vf23fq3NPXag1Fdzm6eePsG/au8l6gxRYSHPb9sJbb5mlRpvn8+s2edjMNbY+r/yN+Muc/2zwdWvpLS3+VVJ/M09D++w/pX+IfQeOTOoqGf3JOHDNtczJS8p7M2qO3zNn/WKoviaXO8HK12g8D3GGZ8NeIFsQZy9qc8nx/gmiNrHrgMuENElsAfnSAClXcA6HQr1iRjH4gH/o27Q1LsLoRcdIOxIgKuotJlI3qmVUc5sT825wT85pQ5dKFf9n6eA8QQrgJzOz2r3SFrXMVtkbUiTpVZR78/55K/78HGIw3WWyCXVFRQRKVlSRJkiQiEUIIIYQQQiWEEEIIY4wxxhhjDofDqe5W0/6mhWopm7n9M/KPfSlBUgSRYFMEVXGzuEgPRADow+EbWkG7qViwmaQ7L+maWJMPWq3YPsCDj/+Xze6UdfecmZcA3e9fIZa0CoklrQLZyrYashhH/mbhtWd6Ujs4UwepmZAss1xPUH68HAzSxA1CtYG8wPFe0v2glzzllTL8v7+xQkvERD4bRdy0nOssjGz9WMr77wjnnKt1mamFPNb6/YMnjEINV/W/xtqBJ45KxKuonbx/+9+iNp3G7gyRzZVGIomaVfu96UQ4QAVMej92gKgr0/M2iOeO0DzVx7GvIL1hYjvCOWFSRcRSOhPpTH7inVrAk+6/hBxmX2YBL+ncpIHgS2M/b5XkWSz+Yb7hb1/YHSaRUHYXIqkTqmfXwXezPxETek/178S4qTFLk2nSkjIoo3Pxu/Lig2RsFELcSvDKromIIPKlPDy8h6Z9JS4VpDTHLZvz0z+emHg4xgc6xrYzebkvUJVd9JutD0S1/2XunJxfTlJFtZDDyYBxluYY50rGLenuBmVXMW61rDTwGVFtKhsLPaSgssm8rzxT4TYAooTAz2YQFaCpS8yyukoumq5CTa1WV2TCAeEJhg8oT3XuuDz+viaE868wdMaBYTOGeI040MGBUzXagTtoZWbk7Jl6oEeXR7JvfRAJjLnwYpP2oUwIMSoglqsafBb8/SZBVG4vPETTPiv7AjIgx4arkNEiZ+Z/CUm8HmIWVyNoProQuxBcrubh6Xz+//tQ06Vrh276R7No06EGWl7xOQjjVeaVfh+aIVxeIaoufPMNpTwm0+YX85TPmueIqgXUxKPE+36FQmGw5wdfqRzn+51f3BFRKIlvkgWS/srUMp0F3yzOYo9fJZJvSTl7pnIZHyqSgkxBeJjp2RF2dnb/gQUoYhc4A4AQtTTSgzxHUIcFzgB4B3mQko/e+EjGE3jvefeOpOSj48nazDgXfZC9j05BoiRVkLpQmYIsvlL0QahQoQiaW76wFBYXF9qwZkGeR/qwdUGtydDjrFr+z+78D+WXqINCCMleT03d69e3Vdi5/VEeISUhERLjERqJ//9+qb2pF8FSRcTNjNCR4x/EBFDQQgEUl0V9yfP0p7nE7ZHlGZnpmZ7hmSF96txzT79336tahRqwwAIIg+DwBYrUAosE16yQ9hxNQ/ijTgI22eLSp6ReTem3PEzTyk85QmfVGZSxM4bsjD/PFNKZfqbwhw4dRfar+4xfdXUNT06gUES6b83Nl0bQA6QfcE1s/f+3Xu3LfQFISko5fWZV1jBNhpXV42hVW2W47QpxYq+VZET0IAJrdYpET0rVJKnnGqa7zzk3cO+NG094D6A+8ACqSZDKIkEp/zDm97vastrxp8Gq1WZ71jfLbMfsnVnmo7XbO0N2CEMwXmOEVqhCa4JJjzs9Xn28qs7/8S+mz2SMUUoIIZRyPu8xppap6b6OmVhrI1EEFIQTUdHYn8eYSsuo3f6wdtmdYSgqQYKI53Ei7f/DZv/HaUzsrL7F6WzO8rqZ0oiIiIj0eiVXcov875eYq68MicPuXNmTOYrPXvzBCGOE0RhhhKNROnLTfunoXsT59aCJQ+9DP7u7bK9LWT5HKQRhHNURRhhhVEdRJvJkPBl0+7+oak92K/XijH/Dl7TbK7E4JC5wThAEiEXaBjLN+nXydtLnSv29Tb1b04oAAQIBEgghgf03RwT6AZKKN4W3fCL5tI0XbUKbILWJsQcR6GO8uWLrdqsbKgXuPPKuXHOhkbQrEg/7zfKIgrW1q53fcSplcfxP1sf/QebWb1S7vL1k5YMW/eIvI+Nzy9f2YWpX1Z5I+caGxCV/y89GUxTuBMq38t/SoNu4q6xdAhmWgnMKoFIIFiwtwyJsAIc0ZSkylWXIVpYjT1mBgqVXgsKAVSheei1KYcQ6lCsbUKVsRO3Sm1CPEG2bUj68cYUGS6R7sTSGwTLLrbTKamus/SuWjCiFBiLSRukyZMqSLUeuPPl0Cmy2BaVnUKhIsRKljMqUq1CtXoNGTZq1aGViZmFlY8cTODi5uHl4+fgFBIWynS5kgZyCksY88y20kXal1AaoWam2EdHhdRkwaM8tXXLdC/k+SgOj8jYVC6R7sUiaDDny5KMMatVr1KRZi1bm3iIZYZPuhR1P4ODk4ubh5eMXEBSaC8HZh4r9YN77+61Ecow4o8nZM19eEm0zHQvAdZFkxLpvLGN1jQCKLQBQABD9mInjZqIssd9lTZGzJqHOCyX5wYLSSCPy917uHFIY1oL6OpD1vn7fT4w+ZDxjiicNzaNP9Unou4UKamjE4YE+VP/5xnahcXx0ZgTmqYHRXgSnpqgewk/dOBzBYzQe7pyuGL0/n/e5GJ51e4cGTG5bgFAQKkLoERoBISFkBAg9CL30NtRQq+007XpnPevHAqFJOrXtaK2tuZnCjKj6G2iwMcYKhCbMdAE+G6P1cYtzpznDXdzNPdx7H/eThEFGo6B+H97Wx2gLVdrOb5Bv8aTbXpT0GOACWWeI82SdYUJxcSYP1nwurHk/H0u2ekGyP5M+VPZ77vx3kuujM9xYH0mG7O3TvF/1PUuo0NuRMuqA3pqfh6B3/GX717ePwYaaaysrO76vTm/n2yrEyOnrWdoE1XYCK4UQDrRlalMdY66q9PAIfT1ddP0GDRtFMU82flgWaRI3nvO8F7zoJS97xate83pb2PStsDUtzDR6xKMe87gnhGqqBRYrVKFU8axKOpj8EM/60/0Tos8a/s9SHyK3Xg062L+Nt5BaE38cz51L4/IdEtMB8SenhYlUJGQMlQWGKksPAv0HN/rUwR7who984Sf/TJwmmjE4TBdWEZ4R4RExi2E8GB8mjElgUpgMnUJnbCqjrnQ0TYISoVCKpfg0yqAsKqTileuMFQctdr7jD80kpfnkaRWtpc20lXbTXjpJF+gqXad79ICe01lKEslzSTPDbHPNt0+LVvz4eJyXcfKTjF78jxHzuESbiMQkWaZyVbk77+wLLr/2+svueFgwxfhYUAi/L1zCLXzp2hZU3acBzWjxoSYRGsCbxJu+gLeYt6N5g8NkcdgcPTrx9b1gsOO58ziDmhdgiDGk8soMVYaTBoiLRKnxDWbyqLGixWlzhtoGnYfz6Xw7v4MnbQqmuPzEXJtb82Ae/31mkoP8j6qnJlOr6TzVTj3UR0RDNErj9ANVpoxap7YpljIjDXlSIEVSNKVSJpVQ1/RAPdMH9UM4MqGBM9wRiBDoUI921KIBXRjAEOaxDeED2SgJlbCGQ+FROA1XuA1Pki810ioN0i19MiTjMiMrsisXEmW6eFmT2i175VQK7AYFtVAt1TGpVVvdcd9DV75mVNV27tmn39D6a7bd87CJmbnGSc3Pf/DHL02l6arQcK3TVq3RIYUa3dALvc8SpVqqh7Insley9/VN9otR+jCAQQxjBKtZxya2so3THKfQcJ2XFO8o5DaxmrtyZ3Lncld5m3f5LfefT7NBNtT2toNW7Kb9swX5ffmz9g/aIQBQTKEDEezhGvcwhQWs4QwWCBxEeMMH/ghCBGIRj1TkoAINuMQd91ZGZNNkM8yVzZctka2QbQrrlalWG27WyoLnEQ73GDaByQSZj6xTlmSmMvOZRcxyZvt963sHMsFMGlPONDAtTDvTzfQypn9HtZECeaNg1AC10FpbnfQy0lwU0CbaQbGIIBFloRxUiEpQFdqJTqMr6Dp6iB6jL+gHKmU7YAjMhcWwFrZCTdgMR+7U3YEYSIAU6AGDYBgYgglYgC04gSuoQAQ/CIAYiIM0KIJKqIRmM8osMIvNarPelDblTKSJMQnGmZHG3lDjb+JMpak3jRGLIvJHFI5oQwv9jHAIR3MsEbEt4lDEyYgfoID5LGEFO6AYKKKEWizYceEnRIQX4cuFGQoccEaNjjAiiCeJFNLIJp9SWjmJU73clwfzUB7Ly1jgR7zK63zEYjZiji3ZmuM4gTO5mptkpMyQWbJSYiIWS9FIqERKjCRJnlTJSZw6EqSRwRZKKKOCGppohSdAhDpNuoyxwBYnAAhvAggijChSKKCafzhIll8Moowm87Mwy7Iim5KZLdGnPqbwCaYj/XnklRXzy66w3JFn8nw+yKkkcqGWAVAbamjhDF8EIhR66KBHMZrhQBgdmMATADkohBXbcRFX8QzHcRIJrmI4y1jFejazlVYKvI4J5FjEElq5hUd5mdf4Xgu0T2YFFdGJLvQqJFFnSMr6bdjGb+rmLnLt1jj/OjZ1/3HzdIDDnORcI+1sP60K9nn6+EoEic666qGXvgYbbaxJZlrrKozFdMxHEbZgHy7iOjoxiDVs4RAIYgAMYAR3eMIXiUhGJgpQhsZWDTYsxUqswWbkwQA7qlGHHEogOujBBApo4YcEZKEYVbjghgde+KKBK7me6cyijkb6mKE4oSO9GMcUZjGPvfxXVIu0QbkyClJNSFRVA3mIKEa1+uMro5nGdSJsAhENHoQRW3s53FkusclWBxx2n+U3W1xp2Ud80pd9zQ9GMc7TaIxTPtXTOtYJTGg6ZmBu5n3+piT29Gdylx3BMceSslRkS/bkYA7nZE7nXB7mWC6Vq7LqBlbXvOq6uUWta2MtDbejYtXH3lRTzbW0pgf6/MGVu8wVrnWDtbZaqFXegN3uHr6NP621Nc4E8yyxJvVxZjRntsYoiogJTnzSU5KK1Oa/ZPmxlVjnIaiZxyYqqSZMF3dOnuYfjnG6si6voUUd7tF/H+hTfbEv9ZW+2R97ICzM4wkOcZQxTnOD2/ymyCBGMYXZrGA9v+USznOzemts1uaASz29wa3e4Uf+4O/+5T8e96zF/BuX4HLcgjrNTBzcOnECoQfq0BcjMRYTMAmbYhErtHrrtjYbt0U7s1ezM2cLsnBLtnzrtG9FNFkztUhLtULrtEH1alGjutSjmERz2tSpbqUQkrs0khSoYCUrW8Wq0YXu9eK5vtHrvclbvd5bfdT7HD7tu27+kbS7HXf4+cI9JvMDmwM7knPJheSKu+HuuHvucfLgPpMfn+ZCXbiLc+ku0zX4dvlcfCpe4238tPxYfiq/kkv+4DbEHXFfPOiu+cfxxCfyP0dwFGdwBQ/m0TyWJ7DjlbyeL/JlfsVv+Bv/RQzikYICVGIMxqML0zAXu7EPB3AIx3EXD/EYLzCwT+qtxV/2DdpqxESdrfN1ue7UQ3pCT+td/aCfEDShkzkyL1VoNbITuhn0w0CMxQrsxiGcwhlcwVu8J4GeRs+d+bNzLs/z+TH/aIYW0Ua0krajo+lYOpsu1hqsNWxX7qk9vzf38727D6fPcEwD2sNJKK6i6+g2d3nEU17xG+kifaRCASgZZaN81IQseQ4rsRsOwJPwQhyHE3AS5rEZizgbl+PdeB8+uOvyrif4526QWkRFNMSFeBI/Up80Is1IEakgI0k7mUxmkjlkCVlNBEJJMdlEykklqSE2spccICfIGXJ99ztykpwPdKdQiqREymRWsua8edP82FzmUd7k3/t/bQl9KbGUubBn8aFLPtbqho/tulsP67GP03o+XAqPwlE4C1fh9uMlfIUuGgsFy/n66O/pHwvEMkvIEzYKl8K98CC8tHwLX3Gu1c/8/VTLVK/UYKtkq7SYbVURBy0zWltUi95isFhfbCK2FfuJhaIk1og28ZL4Ovox+jX6DwjUBgW4gRcEQBhEQnMwQiX0AQvYwQ1hQDAZpsEcWABLYDmsgjUQD8lAYCPIsA0OwT14GTsKc6+NqdlStpxlswJmW+fezJ5hH7HP2Bfse/bLzStu3niz0cofodFiiZiIXcVdikUybywaq8d7xTlAYiPJv5dJN/r7918OH4dL9lemLdOVSWT2Mk9ZiEPy3ztlwSrY7gfgJJyBe1AGgzXYgF3XAh3ggxSMwRqUYA+e4AchEAUpkO5ZUOhlUAG13gCt3pmq8BA80mg8Hk/Cs/Bi67TqwQU8iMfdcgcvYcMnKTFl4cb0nf5zPzKIjCBjyHgyhay85vZ8iJzOl8iND0mJHJMgkplrcwv4CqxgHlgIloFt6TCIgRUAgAMUqIEIorZd2//dcnYfe4N9yr5gKevN5rKFbDs0wtlwBdwAN8OtcD8MwxwUnEIR1R167QDuUxfpizoUGYrmFVlpOs2hFrqZ7qVH6Pn7L9Gb99+h9x/wtHSw9LdMsQiWTLujVFdS253tgVKwFCpNsCO73QEOYS+HWqPDgiSQZj68OyMxoUy8VLcVVCXh+GNqtmszVWwP2k/bT6gJRq+BVzo87vW6c+uE4Sh+yYoZNax2X+IsHzu0bmsZVsb36CJ8MJJpwUlcP34y/JDr+PBT3+PcKreT263+vqow4tHxKr0ztThdcUV3m6bxZsoZG8ZOXMZzfh13zk9f35v4jB4jtV4NbaBtSHqH/G7pJNbmSaDLYjcyi9Y8vltu6GINOvVZbO217/AQesH6WTLtgrwtG95yevo57nyb2Z+v3asPZfb8OfO/VnF9GqwXbi/MukJf/n7b/o4GU2JX/uXMpOijnjmyfMn/DTes6G3Z6B0pmFm3mO56z7iix+gvmno3/hM5vuqdnIiDS75kZCcrh+uwv9UkXSPn5tCD25LxwMLKFXhx/CXh943KRCevPu/AP/taSa2WiY18arXHBuJQ911ZjsXxlPw5Mh6KUopTSrDHOtHzP7y4Hgp0FQGu0x9CudlnM9jARXHZDXyu3stP97plwTg2HtPZiMIfvya5daWHbV3SnPFPx/c8qSSt5PofTc4EAPZH9l32GqnKni4tfTjmd8fvpoPiX8/dv+K+7k7q1am49nbu7dTbsbejMsJvS4vX3jgTXzyTUWXzlXxsoqSxKW28xNncbMCmsFnbzCQT6bP0TlolzamPdEDaU5fa17J1raxh+qILkpZKc6U50jRpqu6P/EZ+IT+3fyLfkW/JN+1vyLt1VlnSFesscpFcIOfJ2bpk3WrdUt3CoQ3SdV7HtV6zMYuc70evv/WXfteP+kZf62O9pCf0uB7SHbpdN+gSJZ2vM3SsenWaoLHaWVtqaS2lxbSw5tfsmrVy/xb//31/LT4/FidPLI4e3GetspZZC3PT18Us1+5rd6zbW5uryy2W9ExYYICrpvT4V/7IR3krr+Wl3JEbclFOyFHZK0tkpkyTyTJRJgiK/fYRJyC2WWftNVZfXiwjlhJLLipml6ySSdLzW37Jd/g8n+AjfJh38w7eyMLreC2v5GW8iOfzPJ7Dk3kij2LPAw3Qj5XA8brqoK7ymmKycSbOQCV1Z5eq0zu5Ezu2HdRStUStr/6r/q3+0V/Uh/qhRr31nb7Zp3rj7q29qKeph6jiZ+z0UMlVlipa9d5rnQNU/VR9lW2qpqqqssqsDFWKKkmVWNEVXD5Ke6WdUqnklGKljvKt6qlaa5qyv7LvnSsMCwNCmZAnZAhpQqCgFTQCK9gKBsIn4a8/vvHyE/fdJCwRJtAxOkyHaD/to120k7bRFlpBC2gmTaHJNJBqqJJiCqg+fed/39Pv6AuPPXLKQQcso0uuQsqPVu+tnpQctipVFivjlIuVPZQOfKe8WqqUSqUSeaGUJc+Ux8tjpGh5pDxICuQDJIlX8YKklDiJ8G4SlFjeQbLhDaXP/Ccx5pjGT+Unm2S8Mfxp+/kd2tpsnbVWayhauAB+Ed/C53FdpzOXdXLgzDk595prcTUuz2U4L+ciBcd8Ekv8iJaoiYpQoiQcgQQQc2JAXpMqIQEpkjyJkzPkKDlEDpIDZCvZSNaQ1WQ5mUdmkgnQ+FN+yHf5FN/L5/KZfCrvxduxvLEUb8BZGzNxMo7D8yw2LFYtlvGCxQye/EPc/13cwtVfwa1wGZdwAxyGQ7EfdsXqybaXa+FyuEwunUvgYrkILowTcQJOn0Pcu97v2R7s5s7kRnYEW8+WsIWsJ+vOatj/LMsasYasNnvhj//Bn8qOY/uvOvSf/tBbekHP6Rk9pbt0mS7ROTpFJ+ggbSMlobW0lObTPJpDI2kY9aU+5CiFkimJ4iiaDHWljtSEGlM9qkvVKF/4Fu6Ha+FSOBR2hU2Bw7qwNowMI8KgkBRiQsfQODQKVU1EP6Pn799Lt9FCmk/zaCbFNJaupqvoAGqmtbQ9bUtLaTGldDPV03DqT7VUQ0ecP3/xGz/xLd/wFa/zIi/wHE/zEPdzF3dwK5fROJezOYszCSqncHzRcA5jN5cOi1qzmfUsX1S0/OUtmxlMWRLj6M1v5njUgCJQOApBAcgP6ZA30iIeYeSOnJETUiAbJEdv+1//6ave7/me7NFu7lo0FU2GfbAVtsBmmAgjoACVEEN36AYRBPCv/Jnfci9Xcy6n4e6sg2tgVynYRjae1eS7so6sZb4R+85wnh2wh8A/+Etv6RFcpUtwko6kGlAOSsFKgw2DESgmn2Qg6SB1pDYn58gcnkOIC1ETayInhOgTPfKKlIgSkGUyRyZfz1efz/vI3FPIWNIX9+DXdJVOcWZKwKEpCPtgN2yL1ViJFVgP62KE3+OAS3gZz+ExB3CbZo0a8DLzTcdT8WTo9XqvgRLIglSPdgfQgDFIQBdo+AARAhhUYAEKcBJOwDE46Nt8qc+AQUluL+yx3bAjtt922Xaba2zjbbT1sx7WYfVWY1VWZDkW6d/61/6q3+UXe/ipvtnX+XJf7AcV+N64B+6yO+umKia6wa6ja+9aumZXqaiYkez87Y/9sOf22G7ZDTtv22yDwabYZJtgo9KHW+/2ave2s9fRuJfY22w3m2LBdayJVbMqVslymZZtYmvYUraQLWAqpmQphsMX+A++j12NXY5dgoOxHbAVtoANqmEjrIcCECAF1kEyLIJ5MAdmwnBogGJYJH6OPhDvR29Hb0aviOfEs9Gtok0sE9eLEzETGApAIBL8yJd8zqEczJaszwpj+L78/3zCl/DFfC3+M297wdPud4873e5G17jShXEWfyZ/mIaE9/veCZeEc8LRfbJgEgYJvYXuQkshUlAIUOF6Q6/pXl2rpgt0ps5Q1mHaU1s0TqM1Un7Le3kpz+WcbJBlskhmyzSZIuOkl3STTqmSCimQLFGMB/lBDpMDu//e/Rf5g3xGColIMDERnsSQlWQ5QWQ0sZBmUkAakCgSQXyJEj/edQuf3nVy1z68G+/EO3AunoLH4EG4L+6Jo7APnjl9UTtqRskoHoUgT8QhgqRIhPTQP/QH/Ubf+Ire8prH3OYW5+FxiH1sYRlT0Vg0CvVjepkOpp2pYAqZLCaJiWMimBDGkTFgxIyQ4TPazD/mN6P4GNMi0yzTRNNAUyce+Kk84sfwJr6O1/F63pP34DW8kq/D1+Z+cW+4J9zjbQ+4+9vucTe4C9z5bVu4Uo5yGVw6l8alcrFcDLeGW84t5IZzA7k+XC+uIefHDToO//Ed3/ASV7ESDoaFAIZhIJpG1iQVKUlEDAInAD76S9/rLt2ha3WVLtFxOkZFR+sIbaettYU2avmI5CjHb/zEB7zGaezCdqzDPEzFBIxDXxA60IQGpCMZEcvmf/t3/rV/4h/5a36jn+cn+JF+hB/ko32Ur+Or+ao+TyS5//HK7/v78W684i/EQ3GvW+wWxemuS74gh7zXF7hUFxv4svXh737ou/7JW73Mq7zYl/sSX+zzfa7P1Iie9Kg9RUgjpYjsZKYveqtjNahMxrvEOMc4xWhiFDG12X/sa/YOe4u9wR5nt7Mb2AI2n81iM9k0VmAxu4pdY42tsGDJBlh/67WHddx6FOvFerJurJbVsEp2OVPhGCYxgSfxP/wC0zEJA1GFAlL8yH2IBcyxs2pQoWY2epd7vNFJb242WmG5xRrMN9cs092gwhTDPoHf+Mt3PvGR59zmF77nIXe5zAUGlrOUK7mQsylQ0+O9p9d1untNLa+xRc3p4ipKOMcJ/uEPfuADLufgyoUNAwXkkYaWTWxgBUtZiAZVp+y0xUbLLbXEAjPNMN1UE4wx0nBDDTFAXz20EJSIfO6iswoedKeV5pmpwn4ujIFRFfWibtSJ/+KveCzui0vjsb+G+BAdbMPTIKE7HAg7cs5qLc38TWCXbWfSMiQF/+WsJOS4HJMD8pEcloOyQzZJu5aa7uKMIomXWImRCAkQX/HqJN20UkUlxWSRRhKxhBBEAN6444YTDtiixhoLzDDFCAPE6PCLrwyzyBxhAlziLEcXrm7X4mpcmjvmDrtD7oDb7Xa47W6zC26Rm+HGuZFukJBz8aqixfa/fWPv2yv2vD1rT9pdVux025kd2YxN2JAN6P48TWqNJquvytVQiR7XAzpXN+pQNKAKeUhHKlIQDTvIIcZrGJQydK6H8b/xofG8cZfRYpyotVq5w87mzpRi6lOP2tRR7aWY/WD2pdl7ZsNsom6krq/Wq6PVOjUzPUr1UvXf7y5Bht+0Hz8ogPhLeP+FP1eNf/4e//0PAK0sUP0pt3ycP3FN9CgaFBKKo7YUggG3lJRGDx3zW4OUlDsxGk26MCGjG4Yx2BnM0jpRozEvqXKfMxphzB7ViaLBOOj1JxNJouRX35kExcVYOAsFjdZasS5wjQ/80p0icYRdZ0KTT/aNNQ4QE375cqoRKgoKw1Twd6NwnMCY4+0Pl0E8r+2kuJwIm2e5dILWFi2pjttM7ciI+/gG5nmyuOuLbUbQvfUtaWzZKvD/BIkmjuNckpPImN+shE5wpmEpp/J8UVu5s5RJqTtz4OUbWqxVj3g0H/Ic7N00kfa2KDmxVjDA+SBhuSVcubB0bRCXA1NDtX90LKdxKosyCK251TDe9muxB14aHm65QD3dffIYn3gtmrIpyyNqz7r1MNAStDk5Qx2dPPEM8hETcVsXZXF94pqkp7MXUSaf+2Ty9AdHutCEXp2Up6C5vmwe67ibDvRvDqbf62gho+A3ZxHgQTWkk9TVYlXJjE2tNZt83pQWn4GlnESOfUsNxuLH01yeqI3K2nA2OWZq1oELgKlsF1c93njo7HajUWsShGqxi/V+UVuO4MuQ8jPP6bzypz4/YIE73nfNOUN+kTPyeI41Eea0O4JaTN6sX05ePoity/vYZg4tX1/F13BGstNAaPhdsXRxYHF2iwNcALzvGLbnkDwXhzodp2wCeD/sx4aDUXGrRXW4zuU4LO5YFtuXRMcpBXjwIqnliyrhrUmQC3PAgsEqx67FkIfWtKPEj1wseIrrD5WpYEwW7de9USSvLyCD6fZdA3gRxEWS9eGjuHCyndcyfYGdu1B0HYRtnBkJdcs1a0M3xn4XTVjnfqNhbu4xVIGxFlKFxiV/faUjsNBRqz48/xpc9BIUxdF5KJ7xJ9T7Jt3bktOX5Zn2VT/SryGAV88f1ZfdOHnwv3t5eSl81hRuvewcpvtMvsd8BjBHbz9zaq8R1cWrXyNtwUv+E7+i6FO2TRtqCqjXxhYmGN2SIiZarIOG1lPzSsMALxS54VrQNi6wQDKUeV4mMnUw94/RDaR+8Yn5mcG57jG8G9smKoSMRnQbZcWC6WEY+RwjliMG/OExlATXZMp10tZs8RFR02uiiXDUtGhP/enqy5X5NZRYHTePdylNTZYSIkhvERV6z1EVbNhKkWk9jyow7yrq05ENP+mx+NqCIo6UifZCrH27fkiuJ6LSiSMWL5K9IjP3ubYxIRyOtJs3rHFknOaJsnZINfHFbsPxdEaboF4Fao8Ekv3Xuk5pFQqa7TG5nVXbO3CMCgRHosxJmLg2HvM4eDocVpRPrD2MHCt5FNjVyfrTOeqICgeBs5udSeBHjSIsN6Syk1qjZj3oaV9OndeeTIUgIQRZqke1PPrU6nzGRtPlL4vqpUIuwn0FP7uIMWxTkkQcX7Ld5c8kVWOQotlSjFgV3IZ+fc81HV2qe3rasoVRp1IISKCk/H6gZ0E0p/tK7ralu8WVZmNpoffL+uH2cvFI3mypH1A5tKLVsv8N3vRtmLy8ysB8V1HVl8tE3fujVBC/KgN5M9YtAqiHZiqnxBN013IemSkYgyVRcaqNga1S3klHEjysjWaX2PjsHB2JHTkRyZmVlXBfjGvV7D0lcQ+YWDCKSI5KRSdzV2fLhh45ij8EoZB4o5t+JR+Mjjt03aTgFbXJKDGFb8G8pS6t9N29b/mjg6f0p7GHLu+7NYmdl6JEtMki+YTcJtJbf/WvDS/mAKy5ok7J1jBN+1Yw9bbZdKeJcT0BxR72K7ZMabBuabVr9KP79dSKpS2sM633+/U6UyYyUEzFSB/p0Fgz9F4UbdX7tN9P88TU1X/in1AnaKjSmdoZbZ/GGcfWGh0FULW1q0YDrHKKMuqgNlXQQa1yym2LCG4y9rTVhdeNq75SnfZXK+CqT9ACTFNfr+edffqQPYRL707863+i+JcUupN3OGRXs/vP//m/+Gf/4p8JoemvRL1P5pcxamybQBCULSJYxPf/7AiVtmEDbUcDIaGoxLVr1dXltM+qT9e3WwCWUx+G97oedfAd7jtwGoa7qipod7yDIgDOloLAAtdQDIJwqJeRh20LTrB6SZLV9PAwrvqDL1tQJVcT2OiT7g8FOxiWu+2grpHWfnYeaWpzKSS0HrXC7qo7y828pzvfj84UbuQAhK7IWnNXBu5m52t19mAXrnIIHvWcJ+V0l1mmQR+6B4Z3/XP/RddFvj9v04BzXw/Nuc0169w8xMz3sqz77HzqzsceAbYiDAKcV/iIXF+u1fV80f7m7DonEl9KfpX7suAZqwklsmYWHiXThPttZqY2muVqcDaV0Z18WXyeBzc1Jjzcx9XmqQ3dYS6bUTPhvN+bOE9tG9fzBsD5emFk/qzzXLWL86q1KXF+l/myVcnVbPV4P1vxF9B0Xp9K5+2wrt8j0JcVLNHLeVDVZ7UpzK8qh/mI+kPV1X2SyHyHKjPeVTnjPUmE1QW0Fpg9VQnhPkNLwnfXfEBrEWaA3rVju5wv/FnyV1XNt2rSHqfmQ4PBK/g0PFWNmHP7T7iLpPofraWOZXQCOACYv0a5aMpXkbQPQ4ui461hIq+AiC9VyXHde+/yMlNbvSKT5eNewWkvDgAUyDkIUGIKV56Bl6ywDcg976aNn8NBRXWnaSUXq1NfOot6mpQLGE8jLtiXHOq6Lz4vVX25pL/0ZXmlGvpW8toX+iKCyApx/uGEpZLtMOn6pi9ZSV/OQb/15Ub39mUWGRxeltK+DK6TvCxq1R6kOGdxXI7AzCAPS3WJd4qnxfUkZ9Z7gh7MKvb4UJXoTwDw0cwwHHTNmQjxtnQHL+2PreXIf+tPZUdlzM+u4pVa72qjer2pZVgBHoZF+C0A81kbZPB0Wc8+3AE8tPY/WN+geni8PHrtWRV/yAUwFvDB8HLfGvgMrbl51WhTrimJIucARiNm+Vga0AVAHgA3uYFbTcVuEa/5iNE9SWAER1SR7ZnH9U3faUVV3GO6yWZ+HS/G2qx6kTPowdb24+Y0VpPNuAW66xGGznpQhRlWvf1qNg8Xz8PjWH3fW4g5P473Y/E+VNj1S84HWGA9jjSgGbnI1IgsnVEQF3oHN7vVeryfh3k4b7a+nQcHv/bAU4dsxgKmo56m8mkZB4NMrYcNLSCt1JS5ah2EaWpTW3Xd9r7qL4O58DQI/7snbMf0HDbL6NOQ1FvGeDaMw5RwRmGHDtT2eqz6qLT6WPVsd2MlCbmLs+5lNw331VsFEK44I/xo/csQ3+bB9jKk+bVXbTH39aiarNq4dOg0Fy8cVMW3rvIlaT/piJ+1B5+B3migT1NPXhLTg58tNafTcNpPDU6vcNoJAIKnlzrpslUVTmerjqfdlCYNTqvJDI6nNk2ZptNh1Vqd9hPDkFNNTBPA3fxy43pE3OAV3G1kc4ryAFX8hFzBBr4m2lauM9FOfRN34kUS2VAObtTPZXYKF8nZXeMqriPfh3K42VT804g/q7jZJMpYrgvAFZ8AABoAm/PW3NRV1NtNVeQzCzy1ag1aO91+dxRPtcnEf9HIBYgb1bufc6rdDwMRhP1Oca4mrKKwGlVEuMV8H/yhRAF0pwBwBQCgulGFwzAoAFw0AAWAPehxEBZQeNacQHUDq8+BL9oWOV/7yiCbmWTzR8kr9NAGNo017c+6cVir8zCsJ/ijyvthrUefhJ2s2hr0r/x7/pSoEq8ye6FPsrWGWo9Fcu4eBPw7ZfypfszhGz3R+Dtq96Rr5Rc04K8BAJWhN9YrjjAOm5m+2zP2NQObg17fJjKye84aVgBAG29PAuymObsrdmdsjEptr3bC7qrLhynYbaAdjkPtmqfdYWiNP4bdahna7mF6H4YcDkM+Vf0c3nag730C2AyQ8/7W6vsg30pkd0iS+hGTD1WFuy0M6FlrqgDXe+VDFaLwk7dhiOyv4QVVHliEXwjwTBXEdYQojCCgCusGcAtjwWBDN+BnayDcVPnUR30Yq/vNyR+jf2S80uOoj5U4Nl9VRrmqam38u8ZXsUCnJ5CRBuw3fdm+tfzhZOo3cL2F3t5750uSMwVWm53rGBcFfym+rJP4OEE/4wx5D4N39kkPX21IrTKOK+eqmm446lZcLRM8AST/bXW9ulmOQ+dTkk+3G0/H1l6HgR/1d4V/8HTFzSHPU5IcV6o9/bO2fLSWB4DX+lq7KxKSka0a6gwQtViPAHanr032+241j/v41j+gmazPEuV072AOV+DXpO6SKan/of9J/V3yo2v+W+Qzdda4e8kAJb3O3wI3Y3ZOqTOOgFnMbhUuvyRMwsEjP/+cbkbe3XHvLuGH0PUlBDtcVUUvz/Js4rPsQCDpgNPDWhLVuvBLBYypUrp3o4slnVuze65Xi9tGwU8UOpgcPbryPhlxi67FEg1rPZGJt2raApTCbF0UBV0uKwSxi1geJ+yMuyu6OyUMaNkb2bqlE2JfelOxedxrFzuUEeN21dru6mxYV9H6Q0ECRk4euZ/M26/PLmaO/a4Nw92HYlOVXLVhhFXzbtX2Rhhdtajodi9tTFDem61OS+w20/sFb4Z2XBpUwV0bWhdE34YPjbsdMZQh727VquDj4PjQFoDv0/OVJekv45kLqypmTk6AtOISR/NOhkx0Qilfnu9AIrtWoiyrZrtTqnhsrdcK/xbAD1NITRdmjpCqFVy3xmujtbTbiiUF30CF95YJdvJTIzvY9fMD9gpo85bhWLYC+JgPfhLRo7UOXbmbPKSXLk+ROr8KOe2O2FLLn9G1u+k9jqV+pJ+7RJ/ruR/nw+Fyl9PhZbnd4Q7g7Go3QHF/M72xMZpdOxP3ALu62rUWf2N2NW0uDs7DYQLelux3SbKv2lV5uavh5mBbXcf1113fdW537VOvYh4Orm89eNEOwj1Ata/VuN8x16E23pnaQR3WrOHCV7k5tNoeqsa6HnZA/n0khzsV45ZdY7/dtbb3at5c7fYIO3DY8wnd5bY+765yiKdEyP82fVhnrvpvgLuHKnxamvF3ldn5Jh6WqrHMLruxc9g15vAFVwJjbQvAZXO2C/6lAvqZADg86lbzkUn9CYH9Sncqux1bzYPnONb3fG9jvq9g+Er6ALwrGr3dJSBvMgggRoUL+CWKZy6iqKuNqHDuIuK5W/HUwEUAOANAgAF2MLiyDXAJS5lwhqAuIrgG75QL0EVlDTHXwhkIbib5ESYU4mElACQK6tZgz51GHveeA3A4A+GwFQD8Hf89CIZbUY8K+dpb6WuV/wCFq/SEr0DK4zzfjf1mXSVntbUeqnfV26Ftp2nd+9Wclgb4MgxvVfJua18qNs9Xrb23xnPRatvaMMA6yXlLa1dLknQU7qF3nxh6h9vWCnxpvb+nEj9VVU2ZkqxaYz0MnGJ/rEpdzkk05qO1dOP6KXGuU1Ult72v9LXS8iW95byqqqqUG5LkY0jOh6Yo6953PYGlNbi1nmLPtjUAWDUvxvG5tTP3lQovHpMzz6oq9xeJsIedMX68AbwBfH0W2l25nM5398XzABy5OHLgeHoVqh51AngE+JwkHBQ5enHw+vQ5SY6n4YapuTluh4FvyR17gB/j6q61HI89xyvWvvSbe38ncoRZzHEjx9mSZjBxvLTVc83NaX8Xtlfw9Pn405a31n4MZnecq+6BLcDL0Dp3MzV7nNqx+ENpHoc4rL6o1m+NL7DAbndxuKjk4mJU+JWqBzbrwyrZRv8qDozHOPjLRI9eaF7RORLr2R7Z4qUOKhzFJLZ3mYc07obHztNM//OheKV6ieOOwOWXler3AeFPGsEfQAHwJanOz+zd7mbl0s35kWbHH+Kb/hYLfGsTLPL4Kb8lcrrUyS9NfgKIfzb04QANv8aCx8/HaSMlXIP0B0rb9KAE+Ym8HfylKfnDJ3DPRWH2oRL4Xnzb+DNLztagjMTfbMKU7cJa7/219+TMBNtFz99/Ts6cxvmH0TZctrg97nS80cBqA2BkjH7Vcm8bhc1+WOSRYYHj7B866UPHil6oT8QynQ6W2Sf5vePjtXGXBglTVBqlXoddwE2s9ZGt+XaTb4oJmXCfpGq2mnpbzNOmdMw6Ts4qiZnFzsyDUgRh5c4BBEq0GTiIsvEdhvU1LCVy4g4TargV294rQp08GiPo1WvvrJu7YRN3AuuaZ2VAA/ms+DK/Rlt6fqVoHjH4WTwtaeO9YRU7Sz0FKlI5ylMTu7nGgWtoiBxhpa/8kYPQHaRlMoeboM6mvBFaQPc4N+7cvjLCmKs0CyY9a7SDhD+yHyJOaRYuk8emN9Wi9SZVm0IE45LCi66diolfCqI/FjypUAkecHGPmQaNzkNrLsUmHsCkqzync7woK3Al9CgDYIcFXEVE4UWaWO14YzCXK34CuM1YVNrULZa5syPkmp/vVXzzxWfOzB0FzCVeGCjkMRTY2zgGrV0oNrzp/2O0TpsGUA87oMouVkh56GYoPkX1l2Zpr7VihEmGW712HxlFlTrSVYWNbNcX+sMv9ixiD3IVP5JIm+RGqbXdlQXX+ppziAR4wokLuDVcpMtT+pfbZoXGAJ1bHhzjZQgtwwsLWBLvvsWmSIGvJTYidkclIvcMmYHH01ANtOKCvhS5N5AAwt6wngmpd4ibLjJ55K4jzzSy+Vfuh3ydx0KYS8fvz3NobdR8aqV5dOrgvXGsGnwvvOaYFVqelzUWkiVUo1oVkqijmoHOvxjzZzHemYsUzZeDmrVlZ2yUa770VjfC+M032OaeljkItwpQ+ZSNZyAJt/y/zIQMc5r2ycyv/un+Qt+Hofc6h+sJn7gYpfBv47Cc1+H5rfGOffNOvxT5Qfe0e6v9uefNvrrmuwEc41bro9dR7R+s9JZ38McHsRNZ/5YPPjrXp/Dbl861W3fbDsSvyi/IdnA78Nrj4rjb3tS2qii3xAjkya3t/NjyR7hy26qA0w4A7raJgo/b0By2cVjt4LjlL2U7uG3POb7dJ+HvCMsW2vy6hVEIL0/DVrdTtkn6dq7M361c1zaGp22yaoxb6LSvWUOLIMBh/7DVfrAqxOTiA/AJ8I/2fazrbWvCldlW2RAumQNs6nPx/WfUcNH7+FzxQ37rQ2tVDpdVVWe9D8NpGIbh1FprL1WJN+skIR/mag1XB9xNprp83+ovb7rgIeGnb/bWTWvaNtUarmx7jj44+OhZvD/T87PWjpozbHVY+QEPyyskdeWfA63ha6BGYJ8mM/RngdlQN9Pfs8M0sZ/GBWVda7LpfbNM7a4qvkMT/hKBXeICzUPivmqbiHDFeeIwpcqbRCsDH4m2elHU6TiN48PQ2nE3tAb7odHEzTDsh9TP1lRvW+NyiWlWB38rma40T0W+hqDfDUg03x7ix9bSwbXXcS414lJrbDzQ8Kn2cyL7cYM7C0bkayuOu1rCzzIeoM4Q+VSt6nfxmYxwOK+quuxH4NNgqT5ZGv9PuKGMRtGHYY7kvVojwKZrWs4Y7xfG1TJw4G0Yd3PM6M08ArvppDASoIP0Pt85X873W9f4ozw1YurWOcDYPXI4S9FRHTYanx1bFT81xwhynNlfl+7ZadV+zWE7X3EWcJqOjSVnJZEd0PxIZr6zitfN3f3Z15Zr+vc+7x9t29c5a5us6214aS2l9YMX1fr3FW+TExw8TKMqnsGfnWncwI9Ef6r8GqfxwgmmcWo0oD2cmbH5CMNzWvO2j5X9NK6SIOOr0P9I9OJGxC9K11vu9DSxS4bn9CTRfzTlWxtEnSeddrwBYtDvoxJkuilgGu4AAL7ocGzOmc7ct6ozPQ7LUYHl9syqT1ZMfliEW9MTAAN7svz5ww6TTl+0JoXOkwOgVQo9/wyH2URnD53VDK0ZuKiOW54/l9Dh8pkVPIAsuh73qNtY19672ShJZnetWlU3OA/2dcVkN6ihUZvrFe71kHas7Tdzh1m6K6CFil7z1QjTaT2QoPfBPoPZyDRg8LxJm3BpoHQybdiOGAe7zTx/hj9iBWavEgd4NasG9zZtK7hRbRMQZreNAWbY7xVMGPgwSQeZPBCqF3xyggp8E2gNbmetJvAqrTXYH3A69Pfln6aWF/yVcQS2PlaEna6jaPfrZF0bsMKvJaywafMu7xtt5COCo8Cdq8MRv/rMVz06QSD7whIo769qvwiOsuDbEp2m32t46cpTa+2y0WsSo7PvxgX5z+7na1bCfyrP2O1gu51FKOr1wALcFSXrYdhv5R/t865qA3DWN/BwWP4mIf6XJLsPAAp9jbYmedEt/Ex+fGntY/lR7aMscz0Mjb0Fmh592Xblp00/xyDyRiHYfkrWvX0TfuCJkCCtC+d7a3Bnqa35zfUd+KIL/cav2ynP7qQyZclba33X2vGitc3zMPipVWVtpjEjmyVm6fK0S7qH/Uo1+9Xgwa+VtBdYoDExy27JOpfO0ft9d26PPX1KCH4xSd7K1L8tFW56NxNZcGUsY5fmL6LDxRKhz7x+HMeRJ1i4QBcZ/tH4TEdoCndrhQMOAPEf8nCW+6HuB9XwUTDgZzoA4Pm29T/bCZWpLV4JQ1sdqsYtmIbksO0FF4eOrS6+3OrboYBpuxG/bW/cDu6mvUu211VVJVsRuvJ92F7v0N0n/o75JSIf8xRWbOEHxuaBmriA03NrudoOntph+vu1UfxYn2rtyE2b3Tt/ntsw/5fcAOf5oop48y+Bb9ucyFo3z4azGw9OBfhawC/1a2vi59a+JPptASWCv2tI9uEi9xpuYzYQ8Qinwt1W8LfmvsaxrhPgNpTsuKZDqRK+CwS2YOLi/N/HBK3QdpJPJMn/0C8KDu4KulXcgQV2D3Urt1VwJDiT/yntae3b4dSlgj+JBOp048jXhiP+mZbhuzz9Hv6AH6bnQNIT//IPS/XBWb4rPV+Sp0oqhh/02F6SMPrh9EN/Nk7OxrHT2ULzBBqrSL+zZsPkilmwLbo2g48RVrxKvTOCW62FOZU5IZEx2mVPa4uTwM3QnDwWK6ZnpjA9QLo4guoTlN1dZz87WcChoP9ArjM++S3zXTKokw/L7xqcTe6rvlev+a4KOkys4KrhYbJvjyUZYn5GP7SWSGMj/MTvAvYu9GtV8Vw11u8k+YYYsWMUmdN5Nwglz8uqpI6D7+ut6lN3A086D33VDz1VtctdT4ONbt5b6KGqVo49U1Xd9lSV9nBdhQ7ltEly0VNVT6myyKDERALJ7WBCLmAwkBwGe1IJhy6NkMThziTcDZLkovVUWTigg3onAlPi1O57g3QE9kkohT1WhYd+a1+c9qMXgVfuAO6hz+XJW6paPadVUVcZDOu2Z8wtrsmmBpPMyeswaBJER7ChgYTcDWWlRiQ01Q6ETMmDeelFy4vAS/kQrTEdm1RVuKkqnY/BhvFQy1w+Um9aD3lrB4sxnwcayR0HUMjxnPsYFe9sLMPmHP4WE1i3POUpBkiSqhPNXcIrn2zBBxLI87fkCB2ikFo53du+eqjmZv9MCnJRVed6BcHPJELzR4PydYkRVNiNvetZa01PvfcAL1AJ6Lq1ddCr1proa2t621qi297X1DPh0+Y4LHOCpZJrCiB1iV4n+eDUuExGIi5hYGIibmfLaIBlgs+5Cz+s7jMzr+gszubdas5kEhx7/0ERroqkNfXvpPn+fGjPjLX87/6ckue94e9QwPC8JBdXVfy0pf5HlroAICNZXy1B5rqtHgSv1iEKf6IJe8/dBu5ao12DW1T5SJKHRKteYAS5uAK42CaQAM9eEfHdSWm+O18z9Vnb03m1tSWZiIIfWwJ3arKjR6LnuY1K45HZpiv25XvaX+a9J5NfR+XJ8ShDn3gf0BBpOPLnCEd4FBurY20sa+1DdpGcB19k99Vy9qCLFtJpgzP2hbNpMyUHFRSet9tuInyhr0NEGUc+oJn4Ylhr9AalTJ2N4M3oaKg4rgPzHUa/TMChJsELFmfO09y4tuWn6ytobk3xZIgmJBxbn1VAI6xRzB9HrLibLhitEuOsfXreQnCh6CyMTAWwSs1fKV5VRLSJhLoaBPPqConQn/gTd4sMV8cvaFO7Brf0jFarEmVt7yD1Lo7s041dtk62sELj9F82Kbi5bDfKMbnpR2+YB9d/JTfe5GZqS36OublNzvfWfBe9wUVWcqM39bpYAdq/73K5T1fg1Fgh8jl2TOT7or5wCPBT9ZPCAE+qTerUf5SW/YnIhrGrdiFUMAcYT4xQT5xpAn4mdgtQ8pXg8oS+VoOUcr9SHntpF/Bj7ogfVaDvlRXgnxC0+mNc4S+r0B9Vwd8OgH6aRRDEI6yrnqQzLuU6Bn0ZRUo8Ojx2Is3mLdelYFlGn1nV/Gu7m+zAQg7ypD3nzzmUJOx8Tnbgdjdl3h9Z8rJN10eDpDnfj2A4cnXuCNzx3/360Kqe2OH2IwxcX9rq/DS3+3NVhY5cTtjUJdyeczsT576d72/4L1X/53Cts6w5X1qbpvNzejo8K3W4rkNqA/zfqYMLP+3uCP8DIqm6SwKXSaQAvifWH/olreL3RE2qVidF2cMpcfWaijLBj0SOwXcP/+//yde22X73Z8D/ngbCf8tftvKdtXdwG39K5dA+/v/D5uHjJrRvrLN6d0q+pSDkz6bkvbUfVfWYo/7bEH63HHv1ZPmU5Cfge1q9akviF1YIq9aOxex5WY712wiQyYrbcHNxz9+iHRk91VSF1rllWTbcnqrqV2mfMqd1VUkeqlqFBTxVVcnxVFVVgK9JStEvSQzfSaJwAftkSphzn4yR4zFJ64D5Owl4OqatIDvrI+SYcOExQg+ZUypjVmvhpeXoD8m2xvthDHIL2ax5vbdbsjbkC1AJyY8W2kvTMHjsy8bUMkrKSZOPiqnAY6/pSl4XI4YByNoGn3IM14BKSvDRvOhpvLPR4CMs01vBrBLLHiCvRWDE9vou4k/I14/uH7a1n+ObGuJrG7heGW3RVLgk59y2Zl+U0WVpN5NB/La8t4pdfuaH/9scPDGj9NGyzFo/NwOrZSVfrNr800g48ZugaLbDh6qk1p1zSUrlcQSh7pWJhGmTW+IBVtxfUMlVNudn+05uzs0sbkT/VQRdn2sy+LD3rhl39pOWnRsIwNT464E0Zlv7yrzuFUzV77xVVdQF7qJuqfcm4JfOBqgOPUN2yF0X+VEgqGe87UbcRM12OU+S1o6Mw7BZcz0wQFaPyeTn2PXG76y2XEwJsJK/kyx4OWa12syb2e4w8kd1Y77odTmZGO6t7eyzHNH/VZ8gftPQ/0n1bASrQA4rcH491xOT/97dvxtD4LrQsNv+JD4Zj1pjjaEMICB67FneU9sitlZrjEFIjEmwZZJomDyob23LJHmL1hhrDQAYA4gAaK1lX0X4ziK8RbsxAMYaMAhT4veQOoy185b4aKw1QBmDfAdaD0RjXJxprLEGwBgEBLSWdMe1mUVWbU3g6C0a3qq11gAA/D3NeTthmK3nt2itF5ofbKbWWo8J2o0LgFWzM7XWTjcAxgXTWms9GcD5CR5wfnyDnoL4rSllfZPyN37bmdfNwdrcMz8XanI9cEJ57Jq05PyjqJYTvTE/Evxn7aPmifKstiZ0zdv/gnC3EHHDjvevt2x2w7IhkGKNXm6v1FHhgo81cACJraMVjANeqY/83EyqASjG88HJW9giXNOTx84fO3MyH+msCkogExhSWkPii6z4RzwM29xdb9lrBDTLQHEXOiulGv9P0jVy7XjfZouQL1VPANOrS4nxYhUb85rIyFsvtEpWNyDF+vHwQvLgAx+sZCCocdR+EkdJdbMO9TDSQmEKbgzC6nA89DprtxLMpTNq8mdJ95a5sF09SYQJ5D/HNqe7XpXbgr5VF4+jdtRFbUF4vRvUHEj7xAVFgEBnYoROQYWzE32Uzd2h4oM6vX3+4b6YefPiI+tp1Gv3c+r1pkJG8J+FxDVmL0QuQfKY+dpJrson9OXS2OhmiiOXm+x4mXKYknrEGNSGfh6YE9StCK96ovk8xAOmZysxuasWFwHqI3OhXagOBm8Dplk9utUKyU7Ot+zk8fj3tckTHE2Bc6lcyBLyc7wMz171z8mWNV9HiJRT1NKBnuXgD6nzvr5XioSJ/vL53qYuFy+RzF63EiUVVIjVTm4IPoq23TV+hFcjQqZf9B56I2sR/ErI2FSFUW/SZ2fKp+e9Iy9XuSuqzhUp5C+K/gGnLzenb1JYqEoKUCmAk56/1XcKXzZvKwpSkBTYVkm7eUUKFJemirySBBtEC8lcFAUAnqQAOH3tEb1dPdtaysUp1XfJBGuVvP2irHpy259T70E8MER3VWjqpZzV6+e+HjvwVRKSWsjv6HHdDPNK/0Lz/RWIFIDGx/fzSRSFBgEvhflM2T9XzJQL92ZxLlvXQbD7soesWFnz+kLj0lFCgmmdhCSkH7y9+pEa4C1FUQIAuyEzxCSWgvEbTDGqvQnO1tIKPasyrMraVkDjWncYKRSXIBZf/6lAR5hnU63YBs15ZCWlbLIeVFXappTNZDalb0rZ/P538XWlK3j8EBZwB/CwiUJnnp3emUWSM4VFtarFRKvBLKXRsXklWHcRQtSKqJMTpmhw/Cge4/okUxW6HRfsYI4PW1Cog6VlD0gBidVma92V/b7XcZ1QFBd3SxOtWdmr53hxlVBY5IBCxTsZ8qZXWsu5L3ZtNMcLlMBoFXMhTIyizizeuvd+Rarkos/m2ePj3+rJjVMCsU8e0foxHyxaSazXnk2Ge99FyzL7vvHwTCspLyXzqoAMma4W4dktlzh3yBpcN/syFtBjyxI7pidvOHGwEl82R8aOFmQo4dxL0ILe4ufTS+ETOC1c/sLdufyN+wc3JY/+AN/tY/PUU45iTJYgl5ZpxVEGKmalFIr5hUqR3CccaTRbjm5VWiFgFHwxk2n7l4vjgZsn2KtcrJqNfwG+aEJGsU3G9g4kdGY+BL4sgy8AThpuToaOAvlWZT0mi2PH5Er7GF1kXbSxpyvXg4OKqnoz34nvq8ySe9sFRKUj1UYVJu653Qeo7ND9GQPK01f+dtkJwa8EHRPS3MtwiryAdin0nXYYdCcisurlQqKRvJnRKIED4ShKeUW/vmpjQGCDwNwyxwJtb9lZ78j4UF8dugjN/WCgQHQzqU7nAMk9Tp1XFcozEzYupHcAoUDFgeB1tiV3o98nYDvk4Q1GD2MLY6y0ZcxrlXquMDIgRVWF91SJkvt7UenGs2jWSeEjAZr7DsXuGypzj3jsrCm/u9mLsUpOYty8JunHTgFtI7oTOYoHR1FiULCtpG1dk0T7WPEozq7IsXddnPgsNo82RQKuDNQK3xWIMlWulVTuEzHrKjvpe4lB9u/QIQ+VrY+q7l/T+vFOUqfHAgHfKv05MgjwLeBt/DX5dNWy37hkwZ1Qyon9uzJqJiGKu8HM1o3AzFaSJFDg4UT/b74uEry87KPNqbRteJSzF/fvz3KltxWBfujfej/+YmyFZPWVCM5BC1/j0Ac9/AAoAof6JqQpa3KOxhvwLMTwzUUHEvOKSpjYknQfb5RQ+cPsXP76QLe5+fwjTb95VUvemIsmRu1po7HFUtYDK6z7hROJdr1AE83EDxP7Sq3lZjVcXUYg68AGoL/A+IZBhy1FjvRnCgjkYF+HgVJjoSvBQSBfjeV9NezpN5Py925ELw7TyHbTAuonw6mZ4RFPEosH3bLmTXtzHahMH+Y5IvmANfwPdUsmcUPgYfNau9TBa+myF32xaqQLC4MPOaUa3LhYkrdViPFtfQej/gsawjWGIt38zWoUnZ0V+p7hVWHAy/sbcYaN6su1KmBm1aZH7irevtSxHIIcuVCNAwro739Cn+T3u4QQegTddJUQPf9RzsMPwbb50Fvg5IJX9u3QWZDV/l9jzkI7vImzFsa5SrabvxMRzIOsHyolYvr5eicFlrrvEpz0TbFSo2/imn/tWXOnfoAmGN3IMG6WNTM075RUB18VY6QB0/wdeBpr/FN9Na2kG24zUV/PkKQsq98X4LEi+x0YPY8tBvcwo7SuGGmsI1Dt/ZUiqgetTMrDlSSvjMlGgM1/rU9OBucX7I0zZP/wu1LgsxQ4E11v6WPDDC7bHCRy/aa+RZaniKIzzNoMajC0X1SIt78ewbZ2oJne/Ky1eJ6WfZ8+1JwPEON7Bo1VMtN0ryjgUcXoNviJkTxOrg847spzFG6wZQ/++5m7ZJTST1TYIzw3zbEUJEIjVInuYMUJKsrQZf0/SNb4mCG1pPk/hv3hCRZk+IwMzlHO5GxYIAc5H/YNfJSoa94jooCXvGZ070up+2rmKiyupj/gCrOB6cjzDkmAUagFdPzcytTmHsHllRmE3WWJDP8ICel1YSWNrIdsxuAXrn9H6e56bsuN1au+Sf6H4u+3ggJaPIhOhkiS1f7vOCIwJgdIsg8NBgAE1H06pfitgZfxq9yuqh25LIA5MIQ/UGCwWb9Wf8Q3Z0xgHqS/K3D48HhSuoVI3688FdjHndyGKGy0SgMG91bszQCbPgH8MSsEv/KVttloSTiDyDWxLHnSSY+CkzY+z1tYSUOUHYjJVNRexD6sY2t8gWgg3ee3hW5vCHL4cpNY6U/2AfMN0406qaIb37RobyooFKkmfQo7g7wq+RXmKGIZygLL3GUzW/TO5ZbvxX3lJHDz2DJZQeRXEpK/luCZlfGHGgFhifA1M3FFsDlYT9Hc3540QVxIKVpp4zZ+suRi6PdTPNjhO1LCp+ldhOhuakNEdvWhuR1606g1AQr5q8HJG/1KOkN0/RUhWT0bq/58TOp7uSFGu2LhSFSp+wRdNUjf1IrkkTGYxZuJTg/aQsP5PiX1VrlaliImER1jWX9ki+pXDs3OAjBK8fyfFU4i6DultY2sXvO1+JjVfzDosg0bcsE77iiaOjqCZRuukrpk3tcrAX7IphAUs39a1xE4+4ex6yo077FyY7FZsTBJs3DhiiR7IKx5i7Me70uT5s6u4SVyft0IwR3dDwrTj4uPhqUKtEL8eUVhbuPnf0molPe4mRkrvRONMokfe0jg1dvS5ZRudC6w24+CwXv7LqKh15hHVSPXjjyo/UHgYl/gEWSh1w4oFBuQAGSeSreKmSwMCD6oWVv8ynk5PEe14VUhMZ/93B4f5GexCgym31fI3XAZxAYAY6klL/pKhSAOiPV+YSeWqK5WknvLa/Ib+JwFUJX86XINF4GKnxJ8/5TLUZUo/h4FjDfhw02NDXD7MZ4LeSp6KebxVISoBhnXWjohvCT4/KLnrxSVlca9XxlnojugGA7BIaLxqC9yiragcX67z2P0P3Dc8AwaXyM0+5Gorl5bvFCnfNaaa9mQboFc/kSNlBpwmNYw6QW3xWJs6nFvUWQ/AdqfsHltqXS/+NdyjwRr+p//DQejuHQgx565Iyj1trTKIbQGueUvSsJguWHiCQj1rddOyUNEYlT/xoEBU/fTakqjMbBhiyD7ux+pyPrCjQmSq915GQn84l64nsDW7RC00wIsSLCDcKgoFKPVJD/COt3FdxWJd7C1Il8oiuywkpUwGpvH8iDFNlrJuoiH4wazH0wSPOftmojZPCworJ6TJLoXYaWpZwgg6TY/FZTvl0EUuGFjqIMPwKWQEtCTuVbgAU6oqDW7o9lh84Ku4dKXzruNsY9GWOUvMjycNAa2Ys+56vQSGFYDRU3NfMU2Q1MfyiV+BcM5JhYzQIIhgtaWSUipTHIMu2WE4GCc5fJj7tOv3Ep/URQp+aqm4UZpBnDMvxzpghn+tzJE4S0KGf1HecuhEcDzqJ9oS7q+Cn0t6fSDtdaAqQD5xAL8s/OSEWNU8gA6gUQN6Hoto8PC7u+E9NQwgOtZoIYLK5ciIlKI+FKpG/hJ74nFvgSwh1caSO4Dpjbk2SdGYdU93xjgtM/mXI4STE+hyORwfyBnW7BgvMUx6UJ57wu+h1CzJv17/cCZZl5WSO5ICN1ST2c6kaKRgakqlPGmx+FZVdvhxqg9TI/Ymo6f5tP9R8ar/mhso3zouG4IB6CwEnuUrQ1maj8CdTLlK+plnG7BhAK+2hb9LmA/jzDGyEdbO7sQWOiU801LlyV0KO2WNNkND/mXoUtU+oBZTQEyH0Z1sExARj/gLkqm+3YHo+Gr4GgNW7V2+r2GwlD2BvG1LFXGEh8mVr6F3ztiB4ARatEX9Wpxbk2R9VAJG6qniveUGZuH0ODlmgECjQo7iSchegv5mxI7E+9KqgzyWuX+65cyZ6B1r2L6Eh4WNrBRPq0cnziYgCMP6DZoCas+HuiXN+m4y9FkaQd9vrKLrLVXTYqB/b3vddclR1p13iiGMAxueUl0KAURKPcq3YV1akt8DZsY4bd9/nMp/cs/hQmoEAtt8/NyGzC+XwqDU/B/NJfkPgrLD21ABgFtLzSTRz1rn6gpWJjgAdbkFbzNp49RiUWZGOOeC8Frf7zMh6QFg1D8fhdQf0mbnbH23AXHzv9hXx9jrikXEgKTwgYfSaZQQpDDoMlWrEfGty6cAQ3k5ZmwdXKG0Deshi0cGQzC7x63h6UpTnl/KnzlWFsA0eC4jXxB2Zinnr0FTMv5A+Wr45be/SkL9dxUZvDt0Nr3Njuxp1MW9A4GT6KQYLlbUQGTH4CnuHJaQCSt73GwM21PYikcg4hQ9T+fu5HqyrqVnndlHGw7DEtSH0Tx5OFKEFECuScJsLJCOPHy7Ge9zcONefEwbs+8gQvseVF6ELpGAMNfmCwvur7dn08Dxj+PYLhh55BD8bWmPt8ruxqGD58O7J/TKVBvmIPs/i4FGPMniba81we3A9uli62H71aJAtjh70olz/2P02ORrGFwg/VQyfxVHmPC4GZWQSPW+hsS6kFxjBes36ZVCZScnavT5uVOKalUaYHnqaq3qdWS/wRh23LnOaWIHylwzjTRQ5Sir/Cm8QHQl/brOogFJVNIFyaHQRAajITg25eqbPsI3NNx38SnMYgvBruv+p3OXo3XOwOy62cpY4McHI/Kd38tspETJEhQLrZBItppv/FC74rbXgNIclPAmEtdVhjW4XgKtBqDGZ/0yRGxoNLns8xly5t/NbDLeXDdj3j8oid4Dw03VdpC2kQusn1qWZs40ArjYQQkWhl4IpA9utSVmnocHoLmccudwoMLwr42rR19U8b1LYBqePydqXntR3YpNIBmgodWtCJgDs0/lVMkEaLHn77+yEXoUR4+wejGVWutlextQ+uh/5ODXNmZLJfFMFRuMvinRmkFohTlv/2z5wWiuY2Y1DxFni+7rqgR2MrJLA0Tfa8UNm9/3NIUq4IjHyf8k0yPXYRuc4+S1Q/IZtp8etLrcQNw9/IR9jxE+koazA0phEqEGQ3/hhL75B0f9uIqndJHtWRG5VohSZyunw0Z+kXoL9lz7F/aCpWr9LEUXPneepasQotO8CGHwA1ojdJJfd3t9uoujrMpqXz5IalHO/DSaO5rGdBgnXCS3GyZ/mipMg3FZLW26cal1U3g0Q7DXTv8dSaKMitz9LTYUmRlUaIquaKeujZ5qtwv6fDiANyKAKvCOkfaDvQ3Qj5UwkAbcYXHPtA8hfe6o8VmghUbbwKs1fI57Zq/byuxwyyL6H1PL31i/LO4wV+nojw1F1cc2d7TfD8aZENkJoFWDizkB1xjktCM04MTqZWF4TbW9Qm2nd4C14cbwJ7vnRoqaV2PJNC2g89Ph7AP28TYzn3FHZ8Sh8Gb7BVbm5XYx1QnbdZ1jnoBrSDa2s8SKXROR6NXNVJe/jzEiwp8TuFqsIirYbySMbpxSBLizGY/zGojqjbRfy4pNPeMwqvyoEr9huzytFf8F84B+9xwNVBo99BbyKEy2z9/XrXiSIfVH/mIIFYVIvcSe/lQ9Poehvgl42+b8rGHOh9dfWD/wImdjBH/OQM82HoJGa78zMfzJdXsfg1N3lJJQmzw/u5tTORq62oyC1Men8qGFHfcmg9wQgS2isuYPQJEqGA6URNrY7CgvcfP0sYrz9XdT7fxxRR8+0Zvwzz6djkFMAQvVK2lwlyWKP9a4kx6qu/VHQ0g0hQuSD7+nmJeqj6SI0LQqNXzOEDTR+YgpvVjMbPOD0UtqLF6T4eta9hK9yi598uRHF0HqcqrNG4Rm9u9co5yJH4kBPWUTydBlhDC5G9xvh9mjloM23gHgAp0QQBuz9hfaikE6pHf0jk8zm6tYTLboA5vMK4EE4/Of4Pge4BaTZDvjO3AY1ZCdbsDxWoA+O6e9zYfVIH6QzaxYFqTgQS7Zpf0dnEWrIMtiLpDNWNjexRQqsjV7wk7aWiWKfXPd+kUgiRD534b3Cr1HdiSnD7veROH3q2WGHgyJPWOmlEYhqXVlfyquTTht2GDX2pu508+i4uSE/vkaHXJo6h3G/digMUN5hBCQJ/qMBWqPxDVokCkdATYNO5VD7SdjwExP4eQrnMMb1egWODQWGZ4/xD/xxf2kToY3vGTzOCt0ogOwe+sRjkefwOcLLua/hpI9r65P35/WuF+1i/xuf7fuE/xLDHGxELqO4Y9qt8OS3YR9i89i092F6gSX/lE3ApwSLZ1iKW9FJzJBwUMNtF2cDHyKy5MYwM3ZHmDbv0A7egQHw6WvQmW0tEGI/7L4Z0ogP3xmZqIAej9hwTZLf/CUxjnfjlSGIfY1rrbxzI4/2NL+s3j4pcTanEsyCL4jcIYXNtmceLHwkKQIIlzTwNcOtsJD592n0KHvHxdMgjfSV3aHl468NHJP+ONmo+1rnJWxLdMw/ncf4WzzykseLEw1WNH7MAY4UbAK4oZTPfThTh/dlEYqNwcF/Y3VOdZ+TlgGhIx4LLnSjj+uqVs96fyOX3UN2Sc3M8zuJV1d+KbGqfHpVBiQuPeUIPeD+ISHtZmddbcDuyhgkQGrlFBXPhQrsF71aUE5ed3Slp6mkWYUa4X2iZOWz4D87IZ+h4n6e1hYB/ATp/vDVkNBE4NSz8b0zhLol/Z5F1QOP+p9JxyY58JCjRQ1ZQ2wXh2jz86m0b0EhlMwcvXTc0kZXD5oW2M7TGPwV5Z4wc2zqB+Y+tcg68vzeLBbZ0ARlno4Olpr+z6pRpfsMvzTIDPv4VXwGbavyFJ+cc5WwqWd9suEbdd2s1nGyYotjw7rjxixTB2o0Xq2dEW9dhtcojb0sZvb50V2QF8EaCnXiIFRFHubwxGco36VFqfuz0uO4HMVk2psbQgRAKdo/UPxFBpEnu+REjyCIptfi8S6mensAdcvPLIkJ7ycO2i+ZJ0ecfuKgrojjuKwuGRkPKDIgMAQHuIKCDYtggPTsmOskthjrW5qVoCxrLvbXIicovaPnCN46ovocGrG7GO5iuI/P3TCO1vk4/gEEwO4cTIA/QRVI5yIIRlSPddHkGL50SK7pUkBgxtGCFijNoPYxKgd9sNFTZ42UHbPviFXNKgVRF4yJW7pWjHCsIUBnKCLQghDZSooZq7ykOQ0UmTH72Jn3JrFI2jyEAUg3gEO4qJKEbF2FsnFYT3yTEJuJS5mFFepLUIApz5CPuMeh7uMTjlpZ0ap+scuJiy2wUlV2f3sYcHdLP8nChkaq+0di2E6opwgelGWKmqgN4j1RHq9LL5Pbg2NdQKlXYTTNpfV17L27z1YTKy5ztTKN/26DdPFUe21rD396p1mB9Kx7ThwmeeCXS2zrNXyiczOuytZnLImdrkmEn7vvNMz0MyLTToEhGlzww6QV37OBAKaBOxJJ3rQhdCpU80o2RiuzM2ALxju+xApYMBPRAeAvR+ekOwe2fYCwOQMN+PfVt4L6/VRFjDx634/QtgYykKYIbObUnv7GDV/oBgr4OISLObjBUpaK8qHW5eWfN+gzlKIPEF0KqXnQRzfR8MLg2ObtvGN29DHU0rR+MMpSvl+Ik5CHLaCs93IRUQ41CbwUOTSZTlBj3sp78hJYl+KXcGG6gIerFfXNoK8tdP3SmoJKxsg9Doq8fB3OgeA2MgCRS69PyRA+p5e1tQRU1WbvNoCkRAbl9OAYdFS1hc1706AxI4uvq7SeW0h26VF8OpraNlfjFBhXgibbXkHiqa1hZFyJe0zCbDzFL4vJXeuaN6KRiTQ6/eGTr+GwkW+55/vnQJGvO9zYTBQauM7l1IknzHC9zMaL+sEzlx8BRm1DB8s+UGFIS69njIVW507U/vMc2XPyx8dOLxjv57hsiUM8Q0D42hGIj3mBonnyoKawd2PwUbi8YCRcxUxYVneDawdv7MAEK0Q4NnCuL8YQ2qdOuaiiX3QCvBW9FHjVuEd+3li6n+VNSiiQvl3DXydEfeB18oy6xR8QHBJFRV89jlMPLUTH8M8yhbXqFfw1OVHOg67P2bw/rgIbV2OQQwVaDdWxDdovlJ+fqyMJjChIGwC4GJ+U/BvaAz9zVz+hBn7XRQLgGBclbS8TY3Wrb/n18y5gvehK3fNFIM+IQEDNXJFzsTBS5qhLBU7YApbOX6q4Dsb1vHNfCtmVJ+LJC6zElP3yjtYeqkA0k6PIJOZAE2HN2RYMMkQDj7ihDunBgzfkSuNNBig5wd7+Dw8RpNqNgZLWLjyfA9Nl+DeZxkJWleeRXPTa3cVpfv64+969ZvU88hZf/38wkGKwSpEPan8q+gqy41CFXhfXkfTP5iPkDdEdyqXF3SUuj1SfkmQrIlipzQ8qnMY/pVNrJ3IKCZD4LrqYGoypc2s/m2aJYyiWCwSIttKQXCB7D51k/dGoUcUECctcFFP14obLEY/LF8pvErp5mKnUpCqrN0kFyxD0OYm1lFAk5Ib26QM5L+4nxqP9gDZD2xLJEBPDMGqpYeKOJYcwHeOu/dS6seqnSvC/nlOwN4thadwRBNPMZkk+pK47xksfo5FOD1hG3bgTDPFj2BwW3W/1DvMHD/SicHbL4FTXi1aXbaiqXihpIYbvZmGPaLCtfqAexG7lc2yKAFbzqaMfPpV4MZ3wpI077fZnnsz94PXEB7BTwtfUswGQBdxDW8VR7EBs/kqg8F0aKpkp/VgUPoh58+2SWzt3plSE6lyG+MEKfaYRE7+LofwRD5DOonzt7D7qWHK2VoSzvLTr8w5uKBjZVpcmXDGnsQwMwepP4CvvBBI4sY8n7R5PqE3MFRElqJ17LZNdlwJChZ5nnjArsVpUIoaFTppsfZq9u2XsqLhIdyON8ysBFyUuyMLSecp14Q5Npseg+7KAqobIKPh/JS6nkT9s9lm8B+c47AV1y+7c1r7AuE+9BkW2IMqz87EHuDDFJ0EXRrRm6kquDyBQqBgaKItJkhZZ0Rpy33jQ2ePG3Y6NzUqSukjDlIOM3id2zEbXRUIPlJbWeorsTOvijRB4ixuVUpvEqfhQJKnkedMfRbmPG+So0TmGFbO7zEh2ex4quT7yndqXd+b+n/VXHWC9dQhwB0z6UE+UeeNIziSujZ7FWZC2PbRzwPC1GNUDaozEhq+ucF8AwBV34JZLYnauAQEsEESC67gHO+YHQM6yAcJkdOBkQfP/gThqYWWQR5ouggMslDLk1SgsZtyLeFQMqfkLL7+1+kO63jFj8XBI/ncbQCu3met4bYghV8TJLkHmq0h7DmqIhX9bbuiL4xqEq/ppF+OmeRfM72NlKUEAxtTh07ENxc/kl/8Y7MGFlL/EbquhySzV54Y+UPQgo+Wcn1ZMgnUPIefn06wWnnvpolGqL1vQi1hFsggLPDgNVAWZqnVchv8VhmIidTVVcSU88cuAGk4YVuy7PZ6LOEalYCN4pK63lWoTouvUofqN9aSvsu5BdWAt2ODXRqYymaGbxcQoILSaOPoyF7/DcnAWuJ1ufUpvPX5QxlAxC1roBzzxyKe6SOGN2ndxOPGaFlqq7Yfl4NLNLnujqpTCt9CnOlgIIY05t0B0KDjftp66ddUWovVYgmJ+7GaS/bPMYSTPR9R8m7NnVJtl5apvx5MoTTtV0iwOtJckijmR3zQBZ6BUqlJ6Y92pb51UEPlUlENZxAAOfOxm03B3/LHOqKKNck3UBiZUy+/S1w7lPH5cSbQ8WfUfJ9qvEn5uw7b+1nFxKrFqxkwFvyXHn9EGGZHNP/sjMCGyW+a5cxsys4atzvvMs4HwvqT18FpWtt/K3MOY/XaK6neiopiUtwlUOeS0JAeKkYfvAjb6h83V2OUP2zovv3OK5bWaN2wd6jApShg5SohenZEBr48y+CCzbKbuRtvrDwVk9Nm44CSl8kdOeIK7QDDoAanZe7PidTdpCTwr++Lwb4wjrqnwXWNnFM+c6m5ShM+wzVGwGnra913vTBCmgJ2WOBNiOhxVleRjp06ngPeYc630F4Bq42RqK2Fkc/5QpNke904mi8utyxK6TkaCwctSEkb2KBoBIouEeqh+CBwXakxoZMwjqf8kKfqbkHQ9PQFjhk9WUwBQ1Z68zkzdqKtMXZT/4q8pbMWSGydGdBZOmbqZKt6Or/OmfUz74UDBPZ5bjAhT4DMnT0DMZSJzuVvMB+sjxQ+cRmIw2XSCWbrn//DmMf0I3FvENjXnU51EywqzMcgpKNuPcPEe5klPo1DHlHcDP3ghoPh2Je3tnCVDo7RzHORI/0+bVX59/3PJRkKJTrYNnFaFEcRZAupBE+bvB4AIb3gnn/M9tl1e0Ek482rFKk/58lhV/JSmGXrBVq7Lj/oA2mdcLekhLcRSST9qndmbpARTPc5r3qe9Sdqr4Mtbe+BIEpF8y99LGTbNUECOVDq4+UoYY9IzjrHCJfC5jXXG/Mg8gZ4pPeD/XErp7CAifcGwK+NTrQ2rbYWnBI/ZNOdBU/M8qAGmYvT6aNtAORoktHBrJ3pKcxY2Ydoff4nfAvLd/tUK/obWTLRlhGWU9GySlzqe/6zGcnCl25tIGkZKyMvupleMxR+cQJDlPTXkWHs7x9UaS8ORBjA+3FSTVt0jEAFQZA5igIY7SppqbW9nVfLYL8kgnHbIBJfqhQPNPb9521KfB/gjf3VULN2rMRppl8CrOpOybtQRDhWDEfSh6i+XnBaf/D82NEjyVMSyiQhZlCdsrbhS3WYOrEcXM8aUBPelZ8gbR8iXIA6a+tknxWKeCxRskzBhFEgRKlT/TRO9JvcIZ9JJBjy+d8qfC8SkawjYj7CtKYSUUDDwtjKm2yqUiiJviGjJGunGc8eWkBLkTv5rDCSO3l5K7W372RZwlmnoJyw2Ds0Mk0oh2iDEktCm49FnVmw0ED2mNv8cy9Sq8YgApcP18rdnYFENLMwhqitltnK7ixWrDTYJQ2WzeETAf9vp3IvCjuM2QnoozaZ0BKC/lplCwvc1Oo4jPyculs2UnNOeCX/xIV+Xrzc1UueYNMjAc9jkIWLgzZ1y3+A2EVg+35crYHB+RnR89fQaV+R/CywAcAvREFNRf3KqDpnG0w1zJ3p3+nzIpp1R1xeRCnyjo6kmbwqeIOsdAceaJjtWhf80PLOPFI8i6KhaisJ1twyAyBCoPY0XZ9QY4cHO6QFCe5nutLg7HoJ8UKgtm7fWJg70DFwpRSHMwR3/eCpJdGMY+MKCGmr94/9IX6crSm7ihwb3qYGpYeK4QS+wqWhseV0xCVllTvwJZtSxIHSB3wPeJx7Qf5UrJnZuZJFBiGg3fcaMTUZ6jx2NJoZWYhgnLguGx2806pp4o3qy85ito4Dm5Ld0Aqm04YWVKKfTmV6ikwgg+1mG+/PFWtTFjaCtKo+tqPhUt63mwnfc/d/sG8IL/OumyUT5JeWr4urkmv55pDa12KewTb/4RGWyI3AD4WHzn/Ybr96yfOWMU33pJJPhPP8ms+6jrbIokXuPC+jeWpSbxrMPESjhhyooA8tUgusu/Ws5Czza1imSZF6mvSVPVXPMsrO0szYf9i/Fox5bWxDpBIpnOCYkLmIMAKtZluSVyowMbM6/5UZnWwIfQjsmA+jtiN2790XoXxQ0/9LmShrG/MNQvc8EKoSP8lD7JlR5U6KISiFLuc56G5gfoybZLXxZUU6aKsWRcla+q5ODvVklPAsh0fqj895pkiJbKQn6w5+NPCvWuzcemdryqEY4zpd0/D/+oO4GEluqg9Jr4MZsJ8KAXd6fcfPmwSh/7dpHC9GYPAPrHzPlzFxlpTAavpsZG1LkvZdCEQV5IopEtrEUCUkt1DK3iDMsW3olHsDTubKQ/8gGr/RHDnba+ZkEKZtzOnlwoZvMGCfgorlOs+TH6bg9oz02fvKKcUEo53XFG07NcIbkrhPtPOXChg5xuOHVl5DzXIaLAyiwLPVZkalRChvZbJTHyiC7kbXY7g+nyYgeJFuTMCfsBPPm4XK9QllEsAV5rJav/Y8gahltLRdb6c9DVppEOXQ1s+BxSxGWZ35vKVAxy+BdgfByP6nyWjnFPxYhnqqxodbZXO5z6yYJbghzpkzBqSiQW1fsmBZ/Ylxc+9lH5mxe25Uw/hf5HuLpcXrV4IRiqz5Hcwo3N4NJcC9qWCJD7AivF49okNy0MLMz4yg7052CTZNz4RAbBJ7IBK503yns4/KeqvzuK/X9yLPedCiUmoMialFaD8fnCXemGLcQENwHOa1bAPhzX63jBzkFp5nNLCyVzsO2Wam1bQSLe7WQnkv90B1bDMlzAlDU8ZZf5ricv9TaSpz38tyNQsN61j+jgB+9FXiWZPTbXs2uqbP6TBlYHY3Dt2MqjKrqu/spAiMtE5yqFC/e3t0y7lKYaR8YngVVbh3vgxycWatPOeq0DyGGR117jFQKDsRAF7/pNhGHg/8dvRP83WsfGZDfd2Bd5KS4w2qoUK72r56pEviRe4G9e0JmVfXJpWVIad/vnEE62E3elXMJlLzrasA9V6tH3y+a/7Vg+izWCQcL7enNVS9CCDKyGbrc+WuStTSyjT8pbtE7Ut7QkJUoe74uHeVPpe0yVOp/kRkDD6V7bwxB31lDjijSFLcD6x8UskO/xQzfSfK2dFklZLnsCZaHFX8fkBx7lqX1i5qtdn87PWFW7izXDbwA43yfGezq3C4T9aaTAvk2WjkX3yLMTYTvzVNOTFjB9kcbrdnOBL6NjOkCN9H4oUpf8WIZev+Dw3XXTvDGxVGkMXx92vv3EBetg893i7hmfw1r5FvjhQUnXhN2XKNqTRhWYcK7xjyErajDGiuf9jnh+1on+6eWyCSoYtUHgmeYkmQzrRNxmezQTgn4rBjQ8ZtBL8KEwvwZLzZin388iyAFiqn6QUU+D9SFlwXy+PgeI3mplZTbUhCGbtgvBe5UnQUsWGmSvBy09AwcshpEKB4NDHE0QKa3zEIS6rFYu4TZrQCsgq5vwkQH09nr+mke9nWcpqcYVu9sKTt7O9YXO6Uf4BZxJJeQTjUktMOWsGUq8j7PJTVbbeq36wTADFaaXIzuiJZAIXOHGJnfoupxgtXBgB1rnWc7dCgOTn/yHW8uXQltyvXIz6n7TwmJU/OCBbbnUKhkE9Y+RWnCcblfo5zaWZYdQPpQ+EJVJZ5RSbY7LRleSX2kuxQ62IvBrEPG8pFc8EaLvpcUYBr2uhN8xTWMG5K7PJE7fK6OYYcgSuGHUDyH60h+XDfhQvEVZDlTBAGJl2CWi2pDZ9ur9EGFbzsUL5IiLOYqJESffvzLUg4nJ8EP8UQmO58LQMHaM/CjTt3E0kRcuJJCUPSa7b6PMFcBl8eB7qSSXrjH5EXat/snejKBm7yBmISvfUS5tgxySwvk+xHc9UFzpSm+fVNY9w58MO9mqPXt3+YwA61+ov4C/jvkp/fbVy2H5R3EWth7em4bbnZWnSaArKcBY8sVipAJsFYaATT+fJwKZ4xrz123A8JW7lbtwIxZtA4goBqcXimM34Eb6yw5hRd/68NGxDoUSdYrG0tlAcVIY/Dnoy53jlfTOau3wbK8hOOTHA2TXlPZWlcGC9yibQsQYVhg4gywfjYljBdllhoEf311iU/by+wx1zBeurQp2wzm4NT+2Bclrm3k3U242i0wO4yjs9cIxqtesFqz+02xuSXI7iwSxx7kaP/PmQDNP+W2ujtkrgikt9mRtkR2Yv56aVO6N3iwMpBPfHPkvzwB6zFVILuQtWWgi0LQ99x21gVMwgegh38BVx0kv0/lSwMWBssmAgy4m9d8dv8RujPG0rkheTF6DpIrcb4puEeBRlWTAZctuq7vh/ZXB/uPEJmZtuy4Wm0skmA78yynui4ipfpExWtbWa+8wxsACIFH9Nw4dhdvdxFIeiZc4XSp1ZcOqMcaGkDa8YVmTp4Be2mseCiQAim1EZKqYTM+Y/jAfHXMJSqRK2CLgUlcs3+HwrBsFEbiYTCYZi+LmzJmn70raxtaTYh5iwhG985TFlZ15Rm1P8uSsC2GPPw8/ZpVAPWxu1NTT/hf48WFsdbRWQbDtn17K8F+aQ0csQm00Andldxx64kQrmtRDekpAf3KTAkS9uma7GdSmFXVnWoL4VuwizFSzQ2ug4mp58WCSdt6wUzAjOCQJn/bjwRTbvW8Dp3Lr2FiEecTGGKAhCZZfXezLvG0rlCPuSeteH5XslS5ciDtMhO/3rqhTqLpm6UM4agBFSToCk3x6fdV40/RopCjvPcIZ3839tI3agHMGGdRjxzdTeuAzh3UCj3nU2i5Anr8KARKztFeD5/sosS6fcNYx5s/cJ9G/GdjlX3mc26e3FChoY7AMsKcCVBrFPJnFjVQ7WO0bVETSb2QmGgvvrkoBPrD4p5pcNlW2mfNiZZMJmpFpIk03bqv50xvVjec6N5TeSlm3nbxckqwuTuSDSUSjc9b2Sa8bIO6qmz1VhjZW9skceGx7ymJ3f16xnqG8rZDiEdrYmmbGSIzQA/CJGgeMwH9wQeT8JVYu3aBnC9aiLheGuJSUrpf6lLyGKLo3NLI2pgAR+4z3pw/XA0Fjp25UdXjXlqnCQ5GFdMzpyPUYX24ooBaPF87mXduJ8SVXkerlfQ6H3ldl3anJHkHHecbm3kBuvzoFtv5WRb+D2vnE5DXGXS7EyXrY1z5By3Y3PFkGvXSEwJru3tm2Xc66wse7EwfWAlv5IdrbFtvmEv0EKrLdZWu2IvGNEmTikTepS9wP44wPsR4ybqjLtmykOCFGlWFmTQosPGWU0p16slbXN0eoRJFMJCNytP05zwQW5JTh3M6dnLXwQpTthqsoTPRHdYbfRzS4CVcdQZkA4eId3a1F+AmkIYyvs61Osl9qzJYtONpD/WIe8Y4cHFpNLLIVnmAIkXTlYd1ZRA8UE+XdbPXBhSSsp7p0N4rHi4uU94ke5h3zDqRbepvoDyJ1ynnBQ+v3VW0tt1m/bBu3iLAWqp3Qz48z1GPbI7pm5TK2ICgtXB9lJKblGF6d1tdGjLcHoE9ejEa18sMDx2FH4jamAL32MlQUZjaW9EoLdCpnF82/Gus2+u1dmEfUB35YFXwJMiO0F1KrzfHV39LJiGFENK92zMwl+X7Ttaoh7ijdf4HvidQhOaY7xAW9TVGqlTcfsx857U3YaOnK41ubtAUfho21G53oJMukoiBG6DvugFOtU3KzIXDlln9+3G2EiRKIZcA86CaJ7h5axOIjFTSE/KftaAVo46yAqFPpieFiIXzJyfsU3+XcDE7/ySe4N2/kuj1Mmdu14bxLE5hr27ZreKMtoz+auSkEvU1OOwRE7nqz8FTzOBUFHBP/FyiQ7eJN5Yp34G9XFRj8xYB1/A8cXUQe4OosIvWE7SQitoh2t5XJFYk12t5WesTJe/JHsj8ePhtB06xjsKoSdgPznTX0MfUDGApI3JYuEq9lK/Fvbvp+kEIjEEVcWb0uS2VAJOceSRUU+ZB21Z+PgEvP5Hq4jWsUPOMTqmu3Q0MwkenzZfCGzC1DADNVfxGhO8jIs4kvVlpwgssXzpwuIwYdw5YmYzaD8XzqXOpa7vU7WUxsrjxPJ0rouecDljY6mvjZW3ppN5x4+nMhCn5QE/IcV78gDrNry+NDwThSUruAk7kw0FrQrtp4NJ5UOpH8vTMot01UouuKzMzdiTs1QeXcCFUI8dXbDzOrAqUF6GrDA2EFICWnD6ULyd1cIMWqIsjX9IL9KEV4QbJtaNjRQBtyTSJhsrNTIZ5PkyIFcUpdQMkTr3vf82+/AKbNARBBXf9MaI+OhdHpCMZS9sqwWPMMoLYZsWdwPxg8g9o2MsSgjpkzTeIc/Mom10RwW1MJnxRN46dkE0r1lg3wpXYeX+t1PTUyaF0+/122Cdv4wa8cR4orNKbPIufDW1Rx4neAMFktTqSFQpsfzh3VqSq9/I3xYOmNj+0dWvNE77T1bLH0/nN5i4R2UYe6MmsEMFSUEv99qQPp2GAmVIT2069nNbW/dXjKz5xxvCnyWxefE88mHlWsDtyz9atC8RtnuDGTU4v2MZ7FCRrSM2vvOOor1S538P7/hSwl2IlB+M+l8sMQjU1DlxLX26m147jFTiFX8HtHfMEdn1fyIAu9CGLrIxW2fFX4JXSR723JWEABifaGH6Vr0uX+rFYBMWs1Nn/1BDpYTPafN4vrq+ubLXXJsvGmz5Aa0gw11GV7UMUvwvSoFxTSk2H0oqc2pYROfjRv5ExJ+XJCFE+mAIIiquXRU01S9IBa3LbjMIRC+KgWGvQNDpZ7VFUQPBAe6YeSwfTovEMmvHEVT/W6Fce5krnxl3Ci+Oau9J3z/Robr738rVOzJ4X9tbbEGOe6W4hWwZJW0EKYe9440qn4wy1i5cB3xdduaf7LoLZM+l1UEDmJvBW3n5FzI1quQUv1m2x04Ds45Hfh9wpr3ODSF9jM4Y2z41vFi7pF0Y6wtnXSE2YZLv+Vi9u9fDqQQMTZt90XWNiLLmW3vrruZvnczepEo2nAtbLZ6/UNCwKxtyBae1fymjPPc/g4ztuV1To1dwhTIrT99mNA7Yw7NKt2OttPiqdPAOzd72rJYKrsspR18e3oE50lnhjYwhIXcEv26puOVNfRMgLE4T4ntvpJOB+gHomty+iWkG8s3Xpyj3xdGb5A8PFCLLnH5EgN1m9qbbo09fg+4Hub6Wo8V9Gtt7aPPvPZlpCuVn853kJGEC4XJWLsJ7mGNajNVM4/SLwx+6JktaCfk/iF/peH1795UW2YT4lwFSJv+Nq9Da8EwwBppLclT/cxIQXg3cBvQIet/uafcSnu+WTTyKvMVRqRVC5/7wbveAjFdW5UN4ncuiVACGovhiDHEkgl64F6JQN6KBT012yNdMHU7Sk/0VrDCxvfQYVBK4D6wPe/krlP5AaxVsNgQDmuje9Q6J3Qahs9Is0/3kIRrqGC3GKZ97hkbzuvd10pD7pl2RERIeutO/I2/s3I4nGmU4g/WLmDHgidZrmU7Q8YuRb9owcnRevBYq7aBNlvDNL0gcH9awXnTkiSK2pxbFVLNJPnzIhj1CGVdYzvloGHMD9jAwWVq9Eyr/3XIP3PfR/IHSX1koNg4s3JayhxHu/hBeUPV10iGwyzSIcQUDw1ARAR4G7PJNgwW3AU/vB5GaqKD6vwF0aP+M+RHdywUMjSWnKaST1jWY3yEr8Bu63hw6J75DMBrlKduJetqvGpb8y48aNB8XiBxHso9MHUxnB/sZdt3GTu6MYGWfx4Zt+eXtkF8G6FMoHf0o32Ss1I1+i+VwTLvtgDeXqLsNlb/3a2KlSc5E0h1OPN3ATFj2aFxJokA20fpztEo5aeLXNFYLRHMdQsxK5EOmrrDIiqSZHo/jF20A7bVArHxAtpY+GTdJFUw1WgXd+7N4IKtVZZGFkxPR+DK+NEKd2hwtVtq/09dT3+CYIadGESIreK06PuyqZ+Ty2Wpv6gPH7m/+ylIV3lv2jhCxUd4RT8G17zJ3BkuM+3iviy7kucWfw3vRKVMaJwPxgN41qAxHLxXn85U0coNwDO20ztXLeWsYCNIsVnfn8EsRIjnJnOW61yz5cARHP7YYKqabxdU/HH+5N/+DsCbg1uAPrS/zc4Hl6HFrlDpM1cyUKF7PHKxa6nd6k8GUQuJ5A+IRPunbvQYMqfgusK+jpunwdVJ7FK4suEJK+5l25gm2yz0gG1KyfSCNhSV6g9rerewQ+UXiNyhRs370KUQwnMA8EWS7aCg9z7ZvJXzoKw+ACwpKUSsvmCGZq0x3PfE8cNSTgBUD218O/MOi/aSvw+gy2r/Q0VjeY4zq9/PbwG07cogFYsJ+AN1x51Z+4G/XopkearZPannBWhsAkdtZCmLkJLIMw24BJFuVJygE4c4T3vhRWVIThJ31rGPO2dLrccCy/AR/w5fxH/DqYwaMVxmRZ2YWDx3Ix40WiJ1zZV4L68S9NcNjiStq0u7A8oOGuI1HqGAC9qcdIUlUjWJdtBRlNjtQbQPmpWbPRPiNX1OhuJnZTdVDSIPI/zhzuvNBpAA9TehWutmlP7AEyvbwRcwNZW45oDaxDIAj8JBMHQzYvSzg7vucQG3D5pTFFkSeAEA37PhUx+7cxRR9G2bALTP46UI2PoD1coUH0Hm96uX4Qn/x1BWrHqpS28CcCRKQiL5b4iFWZvgwtbIZpt8PJgV3k4gXarNHszV+lAusgu/HyHzEnAuMqli02c8f6WcZD+u020ZSHin/3v9fml9Mn5nLt9o1zUQ3VQO490zskSNT4HE/UN72+j/mAgNuAa8M/ClpTOTFvpai32evaGIwJ5xtZa9os8BjBV9s05dqMePO5oKfvxv2ClEn73ZDFvzsZSJ3AEMVooYBOvVUbcBnxPLQqA5ZgExsKmr60+pkA7GpSgTXMUrP1Kafb9qrvqKc7kjHq/c1DWdlrAHWanS1nxMCTBHNvOBB1meatmHTYKhbOG9/Uyh2bayD4ccn1o3EwdVg3Z1y6t8e2x3AoUFOTW7pAQDlffdF/HuwsqbNINYsGxYdkjbc3DVBV13cX+iPMEAHiUE+X6Mc/EPaTWKxrK9XTbHQLLhdzyvnkISQXHu8LkEr22xqY5dDP2mxoh6jJM8kUus3rFM/RW05Db9U7br8Kz7r936eIKyqMKavNNQdo+VeV4UNw7VvttjyNAYxrwrXkV7NzlZOklcTuAta9/lLQ+0SJA3/VfAFThqCoZiBFRcBXqvzQdfT7Ws7jADx8KA6QquIdPjpBP+5wuCvVHjGzRsdrNnhTOBSHzvRRrKhjQ3YcZ2l4582DEFeF2180WDzdiDnRb+yIbsJ98Y4MxmS7xEBRnGjs7aXFZhYZ+PWe9UwICFJ6cwcJURr+JKL7RI2I+wXv5hqvu/b19L8pyO3s7L/MzIOG4SKAVDsHx0GdixcoVZoDBO3Ef1a6CSkxReZTaFPqX+hKObC4whLLqfemnV965SLT1hBqxxdFthokskw9ZKL3KRQ2STJ+yFgKDYeqjVXjicvQpMQRDVVEirZucK4ran3Hko5sV4kthQ0K+3so4PR6+VDJJtFV0xwE2I4kw3CoObQDqF2P1xoYui06nuq14/3Eh0NZ4uwL0l5Jcs2SvfXSSr4nL8iMEAfN29ut3QIQ26xeRwtNbgZgviFr3HP+ext00QyVzyp/oMngs9BJiDeAoPZNN24mR6p3MvprN4xXmdgLQ7UtgcTSTa+CGrdai6LbT6bpedjPzP0reD7gx8PyuvS2Kxg+1pu4GkH3ULVBmynV5ZI/EivP//mcW30UPSS2Vpev1FRZGh7uD7BGPPB+NQU8yWxIfNdrotHqLVO0bN9XOooAhBLIaYfk2BOdMrMZ+JvAu/nh2G+siuUksU4MrmGx5jvgfnln/EagrHzhyqJjGX3V57xz6c+MSuNc6hZtDJzwFfE7xJn22wKo4ziysuwaC/orTGqpDt9ODG3VBKJAZTRCA3R8vA3oXf4xA9lvipBTNr+d6Lzw6gx3JiH7I+Ua5ymZp2nPtmO4F3lBUWu13gTTGCnkajP7UWRni607hnRLYArl7CKeTViUJGUZo+dqq/l51ceX4G0fpukYmZdf3JOipeZyj+TpmBiOoXV1fm2f0OAQzAw5DyQpzURVPLFwfHtt6Yt33BkNX2SYdHlnR3qGucULr9zguOpcf32Z1jZiuO0/iw7IRab+T5zSSx8GsItnB5yG/U7mNt+D972HorCwIKiW/SkeR5F7TAAKCBnNfGOgeV1K935BEm07dLBPWtDH8y+nzGfx9W2vGQE+uGLnP7hA8B3iF/M24Bvr6QgXNLQoLtQoQyOcBNKe8vdmQLyvLllnmNMVbn1+MqRltSl8QkCPA8Bx1UGhFJYCyGI9okaJXLnMT6RUrkxW0ETqu9EevUD0eyYd5ipULPG0F8beV9yraHwheWEyqbODGEEkbYulFuQxjBkGXnWEp8IoPD9oLBL1nQ03GV3SBQvFKjnFEdJig8Culkvou4+AZ2dKd/7Pb0ShFrLFKRqZ+61O+Gx+Qr72p0AETMrKQ8OuY59fI6ZC8vDnEdRPn9kIp5ab8/ksbT8DrsOb5m24YdqeAoqJOGfZBajphXn/1edDjyPAuvDIgbTPt/kKUUUF9x73eU4IWCP9zHKWvll8csG/qODj0SktBR+pPlBvheHoFX7yYQpcqVzyqVDxb5FWHgmSm2odec3Kfx8bPWkNwOzumCFMEpGWR5aBPxMYNDIXOR6651cNjLKZSzqVT1jQY6Lrlf7phyBQSrxw9pXHfvoT0yTFHzVZht7tWDWN7/C/c0OaZTcEPk97a/w/7BvdQv++qhmU56m5w7q87S8i6xipzsfkVfUAuHP9EZG63+9OiHUUPLM5SsrADyEevV5qGCmecFHhC9m/mmMnsakrJBIPVWNhI+jOy/zX6ied6vmj29TsVTwd8aPWeroPb9237Vu07IT9Ce22qSm+Y5vzbaM3+xmcZz6JpKuhQTaJjL0PjHevxka+9YJt1EiNIIfCdpWVp+61/Panvofw3x3wKHHpYkaFbUESrpZqNd+yjPE9f5CPvW/JLhma3bhqWyLJQsUCzB+uBXN4DnIlZb43UOiw3mOk0PzZ8tkHa3tD4fBxLPoIK/Vb64wrqDx7eRUEfw+p7v+w4TqO2yYnShpzHvOKuMqTqmYrMbmi5kGSR9Z6hCfxDm1CgU+KGGGPC3tlRgbIqfuyjAYBISFt5Ihw2Xc9xnn/Y2gtqb8vTkrUeGeWSmcc+iGd0JsgEKZn0wkpkfAm8v9ZWl8LjcTOwnUL/ZhrL06k058+DjzYCD+nUnmu8TdPiWiq9mjvMHe6EGljASPneo73v7uB/E+czgB6eBXLXwEB1cGNRtcJKw9AUPlJj//XdiuzINLqDdwaGyy5uOXFmeQYj+74Qf7mD1eckgmHE/JrOD2nK60kcr6xshedKlgO1gRWv9359qI25a3CVG9Atu2WpIbBbpPSZU+829qqQKhAGz8DWgFYW/P2Cov1/RSSd8bz3q4mqFVo/aP+rElyo5eVTrMFqPxoeNxF+xT5Uuvv4HoxCbPJ//Icdbxi5xDKz4OgjTA9+FTTH/wWU4v5VB76m9cL28YvaVdejYXhxCOZeBjkaUivv10cr9czpOyJBqtEKTBPeTqlTCWbvWRtyTUKuQWzjmfTd4G0rHepkHDUpHjlUhRfAli17eAHaisyFRyPE5ixWvcx4dADazEnq2MIYdvRmQOpRy7ig+vq2x4IqnxePjOUIC0tIIuXZdkgEYB9ulY0OB8UuZXfY4v5uDdZacR3HswAcaqjkZu3Qh1jbTi1vr33z7N3PnPV7MWs29XcpPmUKlNmvHrantPEqxBfCeh5huM6Y4MSFZza9gL8nDMbgOovGykuztDrZ87zhmEgOSie9xlTzLyWmG/FC0jO40oJXyRd9aqgsX1p3n4zEVleWpwup8CUzLp9UWNQL5Sds9kCPZ6I6e3Ujhero8m8tiZV386CzKQDs/EUn5y1aXHMUaa6R/nQAalAEgK5f+xrdINRTwUGn1hf0ZIswRKD81OuYS1q6b5z8u51+a7/lBbYycli0J6dTyfy4TWNK5Q1E88HGdj4r9c6lKLfHa65yYyXB3S2xuG4v86tEcFcXHzC5xuVr1h14saL9+R7nt8PJQi0WGzvXNu2I/cyzKkzKUjZrUoZ/XkhIr48VrhucijibbLd2lFsJDUSuoUE0HT4Pt7+W5GEkS2c4wv5JWklIfWwn8i+PpHAHVD3H+qMk+LDh61BCV8GnnQaN7zM0yuyKoxy8sytEUYxaYILqTtV+MV4b9qgO4XyroA8EMIXZ4dLAuCWffVp5PUzHHWtC2EL68O8UPks4Hut6CsPSVYHhzOFD7oZCS08C3K3xrNR4nZmBDtzh2SlC2knoYwcWvXWonyU1bM5yHMW59V//LMsObq9cuCxZW30n803y+kbeApx6V3QEMB4YokE8NHjyE9kw6UdjNeWDFcXBjdoedbmY6U7YMSLNVp3O6TlK8VWnQ3oPO3sLqONxP6TNSY1fMLL4Grh3D3WOMHyzhx8LJFlyYuVdGDoR0FEVMD3QQC3pAe7Yan8jIGKksD4fMLzblG/S+9bW32TEvEevuTtdK21DKNEbxwTZAzuGh7lMyEpILrJAuXqo2Poyz3uXT+DpgeillW+1x7RyhmBDdQN51Yz+3kH8dynn4Vtja3Bc0OiOUP1df/wXchWH4elYpmVj8DMuzlU/MzVwZhHzeV8O3n6vfQrD3UZr6mPTrPyYTMeByxQbcQjv/aU2jznwY+apNQ5NCr5HUBIsLnjK2lX89NUUNaElfChzS6WP/+MO6eAGPZVBkBLWJHGb8HNrAzKV0ddFsP6U+S7WXLw67VX38r3d7CyQNl80QHk2lQtkxDfI9f8ZmZhep0i9cPsDHrSPRZIxWYsZ1wcajlPcGb5BBzJHBwMbE4SlfL+ycpG89iEDLIrjHjMJ90eT8fcquw62wl2egeH4TtN7WPQ93txd2WW5wEe/jIiH2donu/TstRV+UyqCP22Rx5eZn8Z6l645NL0kF+k5W50UiyWSEDMq5vBRzQDsKyTEztjSL+wpkBtR09Upl352W1oFSXxZQb71TYD74F/AaJ28HJwjnhPOabxvK4JtpBzpv1G000px13i2A18zfXa19/FKocEMkNoAvpjLS6lpQbgfefnlrOEOvnrnaVpsqzVD1VXmiHdnbhEhNyZKK9LV7E5epgbDRyNF8oHGT1NsM3/OlUrWt69hYVq6IOmdiBfRLpcar32u4YpvLz0s0BnfeVxzwbSnl2EIMjazs7Qo7kzfp5LTPauAydkkR+kOOyJv7ufP377qy1BwP/UVtmP8FxOqOYpURRfRFGCj09dJ6Pym/UXTDsHCWrfF8xe/4vdQmPq3Ex8ZHD23fu+Spe+L7pV4QuQq12eZSsZwu/pG1f4P938/QLX8MUBUMBpaHCutJWycbm1/HD6Xiv+dijsGT/x4s3wVy9vXgSt2ucP82RtScuOAdc54OrMKWpnG3bLdMbGMlQ/uY7yaVZ9mrhRN2rFunA+VRxcXyZWw9mZPUVYbbhRS68USGQuNzORJMszfmE4xxMLLxGj+WYq0Sx1dQAbMPCobzpk+kn69xKFdqt2KGm4i+164NzP9wHftYOv+EW/0Ztdwmey8+7+NXypva7BWMlyNlYI03WN8UzKepaouQu8l7NJnhpodXjZetqu1FqbxW5mOpvlvhcG5X9a49iAXblqcD1maRMXunm6k4lbelMfwWORZvbeOgHHaV9T2Gz7a8WoyQMn/ymzEmg5MN/w3uaS17OXISNFcP/o4ie3atGm0QHt/svf1OhNtI3buMugsnYhpwA+qUDzapt52jy1ow2sz1qnaGNlKqihMXA02yltp7TcK5ER2iXEthPT5KFuyI70VjlmZ9K+lXl/mrXZKWcq5NvKVN6bX1dHJrdm5vjiUSzIX7LK3sm3fmgsiCmCYd7Q+siJLxviG2MI2ltiiN9oQnnEpDuXljBP43lMPhtaAbmTKebqBWcFH2+7Ed6WUpVskkFqBnGF/nchUMZS/eXo1XYZUKj6XTHLbhrN6n5iBvLZwgDehPlLXfFDvHAgza1tFybJeFwJFLu/IFHmcZq9HXYc+jeyMPUM+Kmmqm0nE7Uns2eT5eIuztyS2rr5196ujIjH/s8bNrzgit8Fwcy2mj3fu8XkCFQzE7u4wWSXK9xel7lxXEPmKab8QGh2DvfJst+gTB4Qwm7t3zzNbTouhsZ3DlITvbC8XKcnA9q5cRv0mj7j4PWyYmnNvDKZvYlKihx3VctiRRTnyGFlS+xngSAHW2jsx8HBN8Ueu90Rm+esFO4Tfkg+BXPy7c6uVQh8S1XPPaeaKbg4eK6kiOWCnN2D8Yqk5+p76rNWClm8q5TiJN98AdqABzKbOz2NHrzs/rbVlDZrfHk+gyrpkwRgspw/oWzBIBGOMx8ouIjdbWYoAROM8UiujzThrmN3q8D9ceLbD/4GGK5yo8H/oEl4JiJIifHEpH75GLHtY7E826qDBbneL310EQGMefHVl/Hz8D/Va2vCk0aEWsRJw7dfUTJqwv2mLtjkQnRhm0b7bgO39awYW1c6f0ZYTWLl3zu6la3uxRW2EDK/2H5MjWSE/DNgWk47kAa8l0kGppwuYAS9KY0EmMqnx2Y445qMcOhsH3rAkUPBdKAqZ3FzfieM6xWryDF76ods9FtZMoZ8HmUqguNAQtF7BO40eLyDuD58NZ/4ijfZxkM15QjmdwJC59R0Zz/VCh0HxpMEfZ8Ykjd+3MnfngVTE7N2lD+II3emRGnjDqdkIZ2mCwGiARF7zNEwYSwy3tX91R2/TF2O4bo4iQ2oRjPMry5ZrtVyhCx9LhymhUyJM4QFjSeD31TWvlrkGYwdaoPwvXOolprwCLLJrnsk1j/JR7PiBtcvr7yYaw5/8uSYlk3zu1HxgcSe19uCzUcTqAWv6EoB40eFAz67cx4DdRLgo833eOFpxI8PjNIIt13gYpAs8K04sy/7HKWWh7HZRK+/hvU8nj5yZ4dnBaAlHYCJVuekyvl271jGS8BDKFpFLjbB/qHphSHi7oUbdKEZ9AnFM+UdBCC3ym1LPdU3wTr96hvefjZIVxz4fA2y3svMa1HCgNmfME7n6eN+2mqjnYolBtUl9LVcU8drn8A6ZEd7HUj1gnl4Ra1VMoLnq8K7Vbrq1hDsvQXc9+t+Ahlz4gTb/8E0x9xhIZZck039GpzkUlnDQgDSY6SpPpAN6s1xmhIZs1Xv/RoLkH2N66nTFVq6be+s8PCl/Epn6HiDRVlaLRUSIy9cG2vXDzux0SymQNf/Wzwe6/29vIwftWcpSjZIWHbbuAW4CNjYLuIn9/BeudzbDeDN8OPAQHCuO0cT+Fo58KzTv0JuYVK9AXQwGp6Q96A3q4sOHNaQNAxq7fwWHB47YGKP0S9gpDIOC40FJ4EpTe5eRsM+lGvQObTKA76WHylhQfJn9cdHrWDeBRC+ATuii5U71KMdTx5Kd0xjnYO81xdSE6a8TJjZ3qv7rbEcIWZ2MzGphCPw2e0p08Dq90NpMSVLc09uVXCmJc+eBo5AhsPJyA/3es1SAYK1IdbiZqsxCWnyrgVCDkqN4NY53m4RxiwIajQV3QldsSDHUF2gEnpGrC2zQmXczuWzeyxoH0huR+E105pzNEOPH85sUtXIZ1SiQGRsV2hhmtzjRioMf1MA65BdKp/RDQq7ozO1te3Tp8jBK/LnjFNhO9mFxaBNzdkbIAZ4JbdajAJsBXuQ6pEsAMRwN7fS2hXziY1Y26uP5GlSt/bxsuyXbVRvWww2emuMgtEtds61NE40L7g7OO+R4OgxbzqOn10Nc+uM7nh2RP0MWec/q6WZwGvm16Htcjo5o0yBnxyCMFsKE6GCA4PZnznvdjoYoRjEgjrc8ekM+glef2Bn1k1cAnrmgsam2+cwaMhQbShHwbBczeSEq9k/g7Bee6lFEh2katD2xxo/eDq7wyrsO0X/W4Y8xpTdy/869tMEtYVvaewk8jhobLJpq2M/FQg9v6+vdbnO1JBBGo3dKg3bglOsemW162WqfxBR74hwoz6WcAvy64GbPXldYsS5QkhfNRDmmgigkWG8H7xEO5QTkkcHpv24mfIA2BeR5hVlF38La9Qg+nsEMp+zpJIfU8p+JPdW/4ZW7n+Q6ovpSRuP9xvIhRJRjEN5Y9e494ZJ3b09018x61PbCSn+lm7nlWpgDLsp335HlfEqa+3TvmYit9s/3hyiVhnBlf5AUCA7n4ZvcHvwp9KBdQFVw7foOCC1u1o4Qt1r5f/rOKxXg7feJDuCkYNspNFIZnS+WX0y1ZlRZUQE5o1O3Hix5uIsChQ3yJJ9I9l96cp01Jm4lJh4QF5prFjekhLlCnhRTw4d0v88Z5qU9mft2VWVbXApg7R4LrtkoqWqxEBUhFklgJh51gXqEbwbGrkctBFLw+Vn15ZsrDn7mZfasC9r+24/VU0K3pLpWEM0vJd6wl8DsKYr/a2zaxr+OtedqgB8Wu3NJOARkk8Hh2Xad+9VXlIkr8/uAjql+V0twvGXbKWCv9UQ1bY5v9ySQLry+6sVXEs2yU1uXM168S4cKE4eSt4Yv+W8OJpkgcdmgO+vFZqo2uGLqGxeUnt6v7to4Lnta+Q9OD27OduEiYwYguKMyS2e/f2ovF0HM+nIuC/UOhVAh+tsxdQ6iYG2l+6iiFUYXSjOdpuCkw+ruUUbQcctTVwJOEMaH+rUO69lOsSHP8tGZso/mqXWKEo9HHi10n5nGytOdiM8aj9uY5SW8ZxgVEkVgCQQ9FMLjOjmHc3XRG+ICdq/cnKzOCtppdL0V649lrxi8adzxj/XL6lGEJnAEjRJXXEqxcJfahYA3yaxK0g3bQyzvUjlvQk0WvXv/W1AY495t23rjX5Dg2z9dekvPITVhxIwC5sXezqljXGmgy3auV9dgMJGlXjrUuWbEITqJufwP/qqGlGCdbYNMVkbkXxx+AM/nmW/rtCybQtb/982/xHmbIf5bXYsECQm+7FWZkMJcxFEmhQ30GHWhqEKEMuzzc1J1upXjmHNBOjmJYi+Kj0GR9KRYWeP+qQuJg9Z6qvD+c4dZi+lmfRwsTy/081PPB6uMocgWoRt2xCaivsGrPdYp3f85WZrZDA+TFHhLuDmcHiv/8w5dkTC8n2YhPFtbNRmYMVLfAXoqame+xL7ZOZ9Ety1i+vsLKZlETCBCDBVX5DxQSWAXcZd1HKzc93tuwaVf17AHDVtdmwIYyFX2nVxiFy1/Fn6Hg68PFgypKSNVqT4oWRMFadnNm1rhQoOhrfcIBYtcEE3No9OWsw0Xfob3ln7TaXbampXmKXlUUJcW8FAXg76UMB/6fThci8p51nV5XXMYxVKmsvSjobsu8tP57e2xCZkhChDbx6cnFXQdmKrQ/xZ/JQXFPhWgWwD6rpk2DgsoGJh9Ye+ACcdWxHQesJhx6tH3ubMaP7HvWGyQrRngS/A3jeKlmklCgjymMp1unuxs194X1DT8I1I6k2jdr4MuBq4COR966ZUudZL4v9qeth6qdcdc0ih9AT6gmqUw9y2p7iOfu9qQ0saVr9DZoVNgyDUqLNrCnXY3T+c8Ou+0UKT3u+JeLC3+6SecjL8mK7Z1siwWVvt7oRv1Kt7yBwcPSZv+2KKC1q1gmNcYPtb4hTvpZHaCajf6Su+2l3za8JLueXTr8hnMI65H3pIsfnJxaO4N/lbGe4wOv/RfblN/cisC7UW653eNhSzwjj0/Rj+QZpLitzgQkUDAdRJMvD/wqCnIxGZBjG0Y9wuTxcYhOO9pkNf29vbuQdkfNwydTWqrbnPKqLtKONRS5kcWzcv2Oa+W8a8WaHjfw8HLfVlkgRl1tBm0j4vkrST5DfGbgfRUOie5vVgR27ekUnLym1QzIgJK43ctFvvrXOkVrpqVqzUttK2MzagMu6cCFBsxDLpk3Hty7JI5J4w6auu2mB1igL8S26kCETeGP1D8YyQVM8caSADfsQh3q66txY1Dc2kw5aI0YxqdDfsM5KJ3ftxtkSHp0ikEmGVPppxwOfregq5SZX1S/02dzllHyejIXFT4HrX66RKk6OFm+iaH0BfA++xR2r3i80borX+FR94EiIASQ6vpx1e3IEGcKiTBr923JKQwm3SkbLEiG+OAbydhc3vLN0I4T5lccBzfIzWLD0N5o5Xzd2vM7kyAWUDosMLzVck7eEwbNv84zuVVY0tnzmc9R13UZH9zuH+0MqcMHXf/HyHmDVQg9BxrPWGOLYpJ4xk2nfRFx0VtBWD3YquJAd2SOyVOipv+HN9zv89kpx0vLrebMuHvIUKfWgkvXd2U7P2jxXGjhsWjkpgI5Cc1jZ+bLTn+mHYff7AZPnCjpCPIvKPf3WI8lbtTUUCbbQRerV+ycZ38AAT+TkMgJz1EIiEZAUVGqqzpthZm3uxOwvNdK2nFTwwqTwcHewIFU+ntU5DbXzntFk8udZ7bGU/cd5XX3SOVvrKQE9TCswFRDl6MxcRJncjv2nNtwStbBCZAk/OQ4yszAtFlVPPZhgs4Nj9VoHexie6rXJ0kE+rx+H2iYeXSJwSnhpyU27E1/pXb29mibdCSGnnviaYCFshPn6E/L7ILhlvxqc1yZ30Pn5PROkTRmVyDjnk5FeSKbTFuBEA8cHPpP1rIOq+ncqh4aZPr02sfxDAA+daCb/VqxdEpqlcrOuef32bo6CFuPxhBMiJkWuuMekkR6nMocbc/vi31SXIpv6EmjfC6vGoT4i6bCQpEWT+B+raIKw4XHTrg37H5U8jWW56jN+s4H+C7AO5ILOTK39FdiwNaSkrQj7w0Dp4vc4LgrEejOAxDW6hG0qMUjO5h6k6HA3qBHknwXQdojk32bZwEGKoGj0K/x6Cc7NWR30Zmknv9Xr3C/yAzt7zRo1Tei0aiWZWop7KqLiy2Agve2nZFUXPcMdefW274wOe1ifjfNiDEewugeCCkySLSHSE3/G57gRoAWSeWEvilIAnHJuVzh/wyOQtop19lMgBI5NGCLj2WERTcthUo6no/3fo/vsTrK0rzOcprtZWvUaD7cHGEU+8H803WnsL/vdRLE+e1luf7NGgGdcjWJbjMVhzuERp9uvSHUsLHRw+ArHl067g1Rd9OB57mmQW6pMGlgf0L17LxJX81T7WGY/cUrjna72hOHttLXoMcf4Dc/Cm14xgj7UPIpS+WoicuRZpYX8Tj6KQF1Jh2mfe+6odgDBl3P5phVi0HM46AmibU29C5FcaocknjggNsL/S0KZtolKXH62iVRK2dXSIupNYY6Vg6sZ2PlrDxcUtX+kz3uX9lVFXVeqSt89H01ZaCXPndU2u+aiRkGfKyACeOyB9O2mBevnDA24ei248PveJoDmTbGbvinbgBO7dALRIStdWaI2QmRW6uI9bTJWQY+8CGQVksfzN78AsY3Uu1T8jqq0GaGCtRy6F2lHcVurTo3wn5ERwM2TZgOo7593Z6CFwz6HrkC+Sdrf6SwkWp1YkxsIsWfTc2LnmdBSUHdWl65cNZa8Sy7gSBMaKjwXTwPOXWCgr4g4B6d2r029AQYuD8Dp33NwRZNggK/7oLjXrcFFL0zE6W50MadlUbA+6AIimeEBBMdB0MtGYodtrdiQAXjHNI8Yxd6gWoFV8gX8krl5y5lGZsWoNi2Xp0L4crJ7MawMxFnApdgKaAeISKhZQ6ahMrE1OHSZXjKuVeQOOukGamxdcRRrgZJsDAwf8MOPAWkuzyoaPuZSqZrtLpHpzmI7U0eSzEbfi/juXmydJWVxzSVunluaYGqvgbgbLv4bVQZ5lvuDcbbzJkkIzUjbOQJLpmA0LnTxhNBperSNlY11jgAJnJ/8Lg7Gn/BN49Nr5N0ITrTDDa0SAc5ZrQtkEwvvvSucXCP238iWlmJqJ1yp1fzsMCwcKCbrnSu35O/9dsqFkpo9ZGdehnu2+GNf4eNfMskQARBtL4+b/KxAFG3EYVs9yBqexFOn9a19CtKx+QkryhwO4Lp0q536hJFiS3P7/k2H06oYUIML6XzQg2Gl4Pineh9os/gOgPLBRr1NmAivXZWetBLg6nynZzi6Y/TEmuWB2EOwU8/m1AuDOODwzV8UdzIlWJ4gr9uotCp8nsyeLEVM+HHU9ClvRAAz4MXFxJK5GtsQryGzJQuWMKEAS65qXBFEMz+6ylp1kW3DTXR/Be6PNTh1ILJuhCeyiH1twSNOQesjiOYNwxLw61eekw7ZY8NOupmdyCS2GbmfM+rioKfZjcPacedW1lMdykV+9c2BuJGMCaVwAkBIyCZE6OkG/+BuUm41N/Razw46FEq6zPUXfasUKLLYoOYd7A40b1oSQTT60D8oIr73I3CXN8ImZTi90GYI8L8ZRpzcEXwqD3NDx3ZLfs4Q5tvIjVtfjBQBi0o3FZcMaKvFGaI+ouDcmxdKZJhBSUNkW03vzX+YtYLrfR7r9LYW8uCFypd9H52aCSgEfzWX98p1O6H8Zi3Ra+LLC7ZC9ueXNBNGyX+QSG9IkYdmWAxP1iZKdrf5MgUqr8Rt8hzoEMQnKmmAlYHM6dkCM1V2csBM5Bl0EfUnF/dPwzuxg3/45BjuENCY6MtoSVCu0BpbLyyxSlExsIUUllFadfaAaLsX0B51z4WnBCWD+yc/LqZnyPcMSm+fouIAEVjazZZhdA7naN0lhxFxbmAtIxqEqUbMI7PBMZ5DFR28ZjQxjHKM5fKUgUuvApN98qkS+m7+eCM5nET4T3BzmyQH19EWMkytGM9xOcoUtP5etiQ+doNve0T8hD5Do54dE+o6GS6lJTLL3VT/pW40uZMnOvBehyflSLv235f94ufZcGep3car1Ok0QDDtREL+OscVnYy3TvnUQ07ov93XmMGQ4GieP1Z/nbbq/gG5bnkVN5kxA9nSyRmNoITh0AcbqA1fuPpz/4OTDf4jsuMOwkzwWDWKjBxmF0Kns1dyRlUlB2o5zf55G+ApXWarvqjK8YX7B0VetdsREhh9Ex8Eyx8cyHtXoH9nZspmBuCh0RaiojnnUNEF2nlznH30OasENdDCjcXS2pzdvPS2B/KMTzo7LLX9nxhyjHDMJbX8wtW5UAwWtMbKcTyClJuyW0+625Sh6GZVoeu+t6bRsy4N3TohhSLPqzJUXAIfZ5LrZM/PAeXi2Y9TfyIBRnMmylmc2PbZhTuexLlGFCcpKY9m+dHv2asQS4YU7v3uOkX/eKD7NYi+dUe4ECtGoj7BKSJUWnUll6MorRn8Wkj4gokTIA6p6HOK2PvQEH+Zkr06PIASn/mzGxJAHdF5JIMCTDD38p5SX0Z2+UrTgoxz7ONLYsYUCGxDGKLaiMOrWA+J/U0YJdqvyIcijLwmp6VBBVf0OK6oaAtcBJvrekN6Inc2qaTEFatZiuh2nju0WfT9A8gJDV81jr27ZpIRiIXpLPwXUSmjuE2N7pdMtuex/i/V58KYp94xo6Jti4uL6Kdm4ar4675BO/+OVuZkrbDTY1JCqVJPRc8iUi8nzsEPHeeUaKRxyS1DkiYDnv6eSGhSfs5AmdfqN/8I7umQoVGu8H9zWC5MNKLFHUMcV5IRjKTeTN/P6g9KBXvayzcdo233lJYGPvFzo4nMcO3eOXsHfJeStU+hv12yeHlNXcYNc+vbZIwsz9RIQqKsfIebDgc2R9PbAuP0N1Sr9a1oSp2vgI14gXcW+wOk+uu2tDdFid+0aVwY6iCK7JXZcbj4CbMfQzueA5zbEGUB8OH833YP38+RWhEFuiM1OzY6nFd5JMTMDF1t6AveONA4rLMBLC+zuwNBIdsWTq2V4Q/LWt1qu+2Y3nSEtcVRtGZUsezSS1TdMk5ItHC1J7CwMIeTXkelZV5LntIZRu0lWGCmpojKBCMJGdJ0qtxvFIlMsCvO0v5HC/15tzEbED3i4nAb4F/pxn27dBFg//W/dYp0O1YseLtp+RzBFNeGWeuZkveQIlz4BTjZl5ObKg/o3zG++ofR/uSeQpQ+9NwvuCZraSNApMbhcSJtulwNi1BX1x2MkZsTmxxNkvlYuVVYl5TgZ5cFCfOefjnDyY7vCPqfJu3rS6+t9RcrwKsNumYh8pg14fOkcTSO9rE1Jur2XB6bj4jjYTXC4MrUq8YrCwgEHQit0Wp6WAA07SXStBQI0jSOAK2SqDzAlzXeN2i0ZoxvWqV2rJhqm1dymcN27oFoFAaLj47i739aFpI2PkJhozWWf+l1sGbDSQ70wmoDv5qLnaTX22eZ5SuS/Povrv5TPmUvhohrBxwyVv6vWM+FJSPx56cKTgM8yXwzCbRK3F0ZViNWQ+Kq0IY1M6uvtdSxWiV0jyTX5CzeEVmv6sIYi5B/NaL8lCCo0tnBZ3jGK+aIMVHCO8ovtKQIoUBk2eAHpTCqIcIhPBdAv84iQAUgdIFWRxXKFN7nFNWrOOm0GTWxAQk2x3MwlR9N/94yVSQ0oV6jkjUHQJaU6Kl11YUqwIVcgh5YSTN+5+UuIiYu/2t7OFVUt3qEbfjzDLoNg+cZKnv+S7uLkZisdjcDO2eAOk2fdb13pE6TKzVzOD6d1+fOWzmNCBZ4IHWw6L7zxpngYrawgqmtRcAd5NLqNXxLHT3ESYyNxHRGuHesM4K5tXA441DomaUCia8XEfZ58vUO8306IhbJWlkbzwERAAwkrNzHomMLYFSJZqP2PX+1eRyK0/2Vk0MwUCWrDqkOH7DKKzL+W5u9sQ/ecMoXCsJ9bMGr4Rv+I+1AAUX4uPuCJNTQc5nykwxIabE2bYKCvrN9hDbo8CX50v1KhNYcPBnydUXX/mRVXQMlEB3uGmv3NVx35PPpW0JADMOowkefJCMKa1BZzJGaECm5M2Av5M6Nvx/ns4DOFdJqf1dgYco/BT/vDE6QnAMO+C1x9wi510Fb5/qaaBF9Sgn73BS1Vhc0npVce+atkTCHkZ0nvPUkL9irT07Vohugz/R2iVcvLtl4NS1VJ+lhG5UuyTdsvbzYEnX+5XRsTAlPnhNHXl6l1ON66qR5x6/bp45wrRP0XlgAgjbT1Qi3CYcId9V5E92txodwiKuj3aAGUbcSWBAzFz7v8Q5RQSojTSeu2CLuhNkkAl3Rin0z2Kxi8e3B75LZtc0ct8nTsoS4+Qo1ti8vSeN1XNwSRfozZA/JY71xQ8XCk1uJBnE2eHjraAa8WPqXVKPWhtccNwYaPUsWlgUMufDZ4lT/xhNLYMleEJhDeOXoVrT4V5vh75LR5NbAqBWUmRW3JCO3+SZqeg1DkDTS5+TIswsRVXsAJBdnEefrbFAv65xKW96hc3jN8AhSQX7h16Dt96ueXDKf4zxv9oP6aL/h/Z2/HwCgXsIZLbkc4gUxQ2t6p0LjrAEZKWASoXkI3aeoiaW65ACvfnWW9khXC03O+10flUtY6DFMxUj/rib4GyWg9DCWLyp2a3VYwbANL0xHRO8UOInLe8zPJLpHq2RD05Nqt8JyT7zRw60JkaBSfWJpi3trkEDeTN+oPD1CifJBTn2DH2DaAoaoEZaUdeK0Ut+lOFlvq7VQd+OKp14fKiYV7kvfR876NP6FkB//mTE9vGvgQIJZTa6B2RUfwseojYFF3VILWSkLPzDnZDGcnHiApDVdd1vZdiSSS++lOG9s2cSt60SKdtlq+qWtpID2qnmjACsWIy5vwRm+N7LiR9MPjR/OjKpUi9V1CMCLneez2N5G1spGCyN4rk4bD1SeXxQO0q27Bq4DkhB+15VrEyP4ThiMtlihhcRAJLKOpxnbSp5QDK0PrdpOe40ZTVqrdPpwRwPJE4UqVvI9RAPoJN8NgHSrP6NW/xGUKylAWychaWmmCk6YlzUL0dSGCjuh1bR5iYaZ2jmT2osAY+oZanvSHe/RdAMCn2YAYgxze/vMkr0i4LjltuWFGreHEAZC5c7O8+IT+waVxY84QmnF3hGRRPeIGPCwbUSDv0o0kTim9aKBiShQOP1Jdg3kfe8vBFbgEII+5UYMNM/7lT0eknv1m0uBDbT6g6OdGFBdvS3rew9T2yNrlcGjy4l73ESuJRk0fYyAG+QTN0fPWryHVmcA3EU6QwIHZYLBe9sxY1vYrufJtJpeFKV9y47zSnpLX1lmr9TpFUBD21uuR/DeSKTj46i/77kOStDHM2bxEa9CgUKiNjlXqxAQyTD1oEiynsaQdJ66S19cDfFuto9doJ8YnJBnTeQ3RsJ80gASw9xVJfa4p0CCLGSrQIyfRtpmRuMdGj+IwY/qemdu7WhTd38f4E1v2nD3hjHCmKj0GpiNkrOR5IbApuesfHl9u8kniejSafzwmbnCyLZaufxMbWmjeDupn4jkzxqyZCp79/QK579avegp0UX49sfSGFiy7hdiH40EKHCXQ9AYAXc9k0Ni4nQoPGC5L52Sb5PEEr1wvGC+5xwjnu7NUbhya60fTDcs2iBoA/nbQ3ssIVvkcC+zl7fHi7eKUAXzkC2aO3fUELPsTmhmfjmgST7B8KFT3TwR1EHYsonn1QSBliOU/nGUjS+z+fK4w3QtgFBVSoiVE8OL3YatiKDVtqcGrKYrGOThHEtpZ5tjMGY2AhR86f31Ry9w26ljmAmK7C4tIfA+Nhqri1Ebljb/vApriQX8cxptJ1iO8GsoLKNcZN/LAMC5dXYWnITXz2YzTKbqP6X9YLHJYqgfehtUkKcgh7binAYmaKfpyCTGSrzrE3VMZYORzRuYbus3DEEH8UawJdAFG5AeM2PgnYQ/3iMeBBBp25EWsFXJvSBDbg7A7LTZigWutcQ1I9+TveqC4P/UGPTz4nkYThuRJmpMqkuHkpUYWCPjyFVN322Je/s9mlYc5/WVwZb26Yb8rznV3La+Zqd4yiEK9O7dMnUO22t6CNGfimPNZ1L5giTPo5t/oTdSBvy41xl3qZipgWnOgawfve/ta3YwWNzR22Fyr2NZaT+ykD5zi1lTQAmtvg97UUT22sThwQ+0XyejCmKoXpJ9u+58dHJj+DnvUxZy/ajtabG1NWpSnsUv55HYv6rwMquNYmRd8fxJke9yn+CH5LgaS3nurS5u6Nc3soujH7slFyq27Dk4gZb/IL67tHdHkjQ6jMvt2IPjJvtmoPY+JXtOS+/CPbbRv3V/mw4+TIPZ+6u5Zj0R3BNYsRzgZXCqL3ILA8ufOAwq1wVsXnR2vnECv8LqXVIkEKK/iixoUH0QAtE5fkVco/6KLlh0tgqUnkvbMq8xuUXlUc9ur2G7dEBAYdDQKI9PCotbED14lRq31nwsrddma5lrqs39CxCfYTJntFdBQSSsf7ueAYeGK8yBj/BOgaepMAk/RnJXiXDnDI82kapagKIRqWVgOCuaxmIpq3DMMDjkLbl2rcSJ95kFQLt10rWr3r+n5Y8vZXELn3hJJnrRQBUwwhIN85bl9P8IFyEJjPvqMYvcOTq/zs/R0bwqDi2iSYx6QlZJ9JgbKvKvOo8rkIoHTgUs8MdpXuD/nxVQ4Xzugu5+1BLjm9wP0MWE5MbuCAGH56Usms8hFla87cgwrJl6LhWEXukO0VjM28926C9Cih9iz3DBa7wvLkFtnzYKjEsbiFOZudYXmpFkgVtZTBcf5uWR1YKRn5obYyE3K65W4MorDAbmut3oDFQDDvZmfVszMyWMszmpLFPscHIfdcvO7c1yZnp3aB23iHqW6InvEMeVKK39EDrz/vLvPxiCVebPPAqiKckGRJ8dUtxBfwWD4HYWgs4swiUPY8nUGOs2RnczUN/Vq4gsWhGn7uvtfG2/94tecvcI6FHoTGFzzhEpnqSBgFCad2nWhosQlpkeSfCVtTmW7jU8RKkucNb5dB8tPFxrdR2RdLVUWhKwfGaBpkxv9lYBgWrMIPMcMDyLvBreOM0zmrgG8VLXDSNoi8jBWgT9S99Eelvcjp9G4e25EBrNg/2NO2VGBsGbYgFkqtuBORl1wyoIj+nBoBlhcwO6XdyytwTV60SZS1PfSlrVD+KXx33q6mAxXC8JvOt1E1ZLFFVl4D0Cx5kBDU14y2Wquhb3DBY3JokOHutq5qwiSpwoNJ5cRXjgeNEzfjzEgRioe2AASYuomYDf6AUnv1LpbEMpVcZBqVJmO81ZRssWRQGc9XQ/or9BiXJfvxq9JETm0uNkdUFRcM4XFSwPfO1EJlPJHsCI99NAjIDtCatkRcjaHdYxm6lUyOPtxNCXMHFAK7rFEVHuNsHVCF9tyZul2PowV5McDfYatBSGExEx/Lcs62403GEcXo5OHQ3HqOWlsaLyu8YVmIh9IvUIge8q4hnuTeJUoxwmPhabnV3KZg4c9Ov40evfHYR/SLAkXdRAcuuV1V+aEm64uYER6f+LEC4Q4BnVIw58Suksj2SaU2VZEiXZjle+qiaTser84wZo+WwPg0SYmMhEASe2f06Ns0E2B0ppAjFfgeKSYMf7Cd1Yu71ETxw5vxMFGWexzgzqeHx/MrJcrQNj3jW+m58prOydoqD5o+Z1Hockt6iB6flRDgP6z7vt7ixKuHSczXne4Uv5HhzO08yDdCNu9GuYYqV3CZD+s8PV6y92I0peKnpnxqoMvfaETBq6U1xM6ZHBIwiY3wYUJKrqQeqrwM9WZ44pSfoEGtWg3qw5i8qrwxuH/wilWJq7WzTuk81vP+qwNUZ4hcQovTipZaN3EHAn76JnwQRl8ugQ3SSNX2Vgs6zV7F1vUK0zb5V/MOVrRg57cH44X4gJL3czuKEPTDluXsNQaKc/jEOVTMuld4Fo3VD6r+VEne+H1X6iKbOS7JaOIzhD+a1wzUMgPbtVyQQKIHOAN4C/LZL20fnp6H2xYOhGm1PAaiK0ATkkqu+tbTvxKUb5okOang2fjI+djQ1niYfBp+X6xxtKZ7K0gZNsa6XnQnHBIqfDEZAfJh9vEqZabxup1oBacOcJk7pgSBOFWroSaW2Pp/WmmeWQotMiuuGLZ+1/E8sRbqgpELcDSeMxpC0yS6dlPq73qhjFCa/zBYYasgkbOnTYQhmvk54SsUPCIHN6i3ZHMsNSXmDLSIBpKyLaXtF98ZdtaelLj2z0SAZIw5bRunEsLOHqXZQftsESg54pEveouE9rX3joyyRphlSf5RtoZjVBR9/K/RiCRtLRqIGH8p1rk4N4bqybC3biJUNRIqPPLXHpEJCjjWLdZuJKy23yP8MNBqY9Ts4Ywx0yYFoldzrb1jPvoV6u0KNtZq0kUyZ0RZoRp68trAshzuvL+bnfcNZde1cIyGFVju4WmpFjWCt6RVLorL50UC05uk9numqH989q3zb1+F4wrYGb/85WcoA2626coXxs6K9AfWLACCOaKF2pDgMZ1ji8yT54TVzL6T/yFofNHDBermYJofwp3d6ZKDjdxkpSVOHVVi1t4VjpjypJ7fo3cCmVx8qniCbTVEKrwZPp4bbR1VX3bxXOlFQzbPngkDjdh/ViU6vZlHcM5HK/sdBUv0YT5mTosSDsqjIqmynyzMukWF6ibZIRjET0fUOISVzW/ml9ulZhYs73lucqO/M4D2FXw46dXDYdsDWo693PnE/bAzHsbNyvzHbFfz2Mrz+O+Me9dsUL1D+7Hftn4I5LT9qEaPc8tE2K3+uIIVCQQdYsuEqdZ+fIZJ+YcD5FijnVMjHA0iGqGf5f1CRw+zwFZ1tewZaXVsDTxj5hmE5cJMuL6FTQdwDX6l96a+X60oZUJPevpXZNRQCWnjNRSfvr1jQN5tsFofN0Xhp7WclfEsOPVcb1o+oJYpqpYy47qAchGHDiJxZ5lXBVSszI2rGiF9Ve5LGBpk7OgduHkyPSrxpDnr07d6zPeB1ZiZxC99HrBg5YzMi+27HVZgCZ9BfF56CM0xweZ5aCjGJlXcD58VWpdQu03LWRaUsehrFVLGRMyj4qoBS7xegy7bet7tfGhsDAaHvQc4Qy2mXsSQ/PUoh9z3XlmYq7iFOVPAmPr94xGbI8JiscZddQGQ+4NnynoAlnkuTyKp0PCqAEmcnNlL0TOsjScGXQICyV0zFx/Mbj3hOxi//t+UCfDb0A+r/KaKui8G7f2hJfV35dWcWRiWJPLCxCi4raLR1HBGBAkdjk6lzEd3I7svuKFfitOIWQxOCaLwC4TUkfCMhGTM6sAqYZqXRoduBh/cXukgpx/AYqA8Zoqlv59NqOS1oBrv+udYipmGqIlPzdIfy8zIPVDhIySYLEBqOqqH0Jd8d8tmQQ+++Rx46MQoc2tWOaxyzn0KQ/DsBXhjaCk5MYj8APGm3fN3jq1o/La3JzeZomTS4FtDgU7m+LXtS3oeYpzlg251AYLktbaK5T+nZ4F6M4L9cT9y26+kxQt4mrf3ch6dhzKDd8Bd4GFh+AzQH41tiHCm3fN18FdH1cypAqlhX9pG2/xllC48hwygnTevmfdLQbF8ObIk71y4KqixOZrLcvs4TUuiwwBaox7Scj5s+xmKNKGtrFtirFE64ArCzXQod5Q0WfC8zbM3OrHcR5dMKQUNiWhmhmKDOFouJiA9jFibwTUNHN4Gi8wQl9nusNliy/65Lgd2cDCK5erMHu9F3ZHKnZ39/PmbonfmJN/qrgtmM8aCr0vvRBmfb2HVtGhZVIBx2t7f4vjOEiukMEMns+gQJDN30fi4WRB6gPPn3bYnUu38XdvDeLrBvdBNNbnThGTzy+n6BMsyC5gHHnQzRA8dabp/eSOFobL+EN6dU+yhXUc/QIJOKUyq7SXi6UBMpjWO9ZGhWtlU29jGp9fKavtk9QNTBIrm56c3ijwwKOyYWv+dCrQNmWS7kyzispqPA3TupSiX5XXqpES1DCcR9ism0nWTB9xaUb2ClNRt6FHTh/Y10QxVFdyE2cnFM8mZcW4ppYaiPepJK3qtjjc7I4pydxt4leI2ObUY0b6lze6aV5Rte6rnin75fFMccHuJDCfI30L2afs4gKUW2wcygCysXvwFeguddSyx3UWKc/pFnhRGwNLiGKLiPoc+aAKMGjNcaxuh/lvzOdNtIws/wYA/oGCayi0iXCy80yHRmdj3Dh2O/a8guQEU2jiPEOtNa0p+0T9Nx2bYAXV1jhcMSWgQYvzu1XrV6Y4u7FrWwbfFJVFirLzA9PQG3EMVX+ubt/B0EstCC+cmDNWqwyB3Gjm3oJExQWEmibLID8XMBTKSfRB3m7hksVawqVRZLO5xbURBakF0Ahn+5iu8XU6e3o2VALOAJB5P48auqygqup7lNZq8AekibEnqENbaHSysicXLKRLLVy2PBtEkI9Hp67d356gNvsKXR/IancKgv+G56+VL3PQ44DI2GWArjY6YE6NxIVf4I6FNPWdV8o9D4k4HdduakBGbbql25yiTEQJLeViMWA+dt+x2j/DpQkcooLBKNPkAV25mvdxFlsWyium9T9JHwMxhk3YNqxuKLAzUQJi1zVfpEuE+u2/CdfP9NKxrryb+wPYz50+KDQfgSffY90ggPrpriUjZLGQhbs1kzI6enk5roDGpD3mE375A6901v3qEdC9GwuBjogsGpMLpW7pokPrR8KJK4RndcwOPWRvaXkI0emvF6d9UZbgdrqTwXQO0MqRg8sm2LfslpHtc2kqDhMPcUBxCG+GvuCtscjbeZVtiFNZgpctCNLXlboJHZW2cEwRdGb6aZuRzqGMLEHAHODJpnGUqR5FHFcY2Sq2FK6x9p4SIJkh5kcKuMXox/VcRsA7OSMoC7bakLaO5XwjTRyi9JMEFbaVPGzhNJj2G+fOgE0tDd/AQjN1UrDE52LRJEohGVJL+No+DfTMFOuee/BMEqeMZTY3xXrA2j9Y8G4Mw5sc9rUhab3KOgmMlJ+CxTODJI5lTm3d3Hy7zKgJXT7CPu1yfQIcyEZSwbQbowbveJ5BHPR3oVA9ySOIrLOi1UEAg+O2aMTC5BxdKQx91cEGXsYXlPLtnaqBEDGZmjhMRxA4aEKB+NVL4mWyibswyDHRa23FMQ9AUMAhw0z2wcBrv471n1AcJF6UmT5dfp3oNbBTPopYDvEv0UVe3MY+Ist4xV5An1kXlCGlRtjjxBYWjB+cnGPi3H2SuKnmt6g2UwoK6wUOk3/5wBJeN7vB1HM4ScjKVSi1BkGNuMVKo7iljlTEyWCczUDAkOrnB2rlCdmwje5DWSP2xPe3KGGyNuyPFdtypko8RCKWkPnU9F1Hxtb+XLnvoTzYrNUUzrGUqPCurW3iHhT5J6a4wVmRUeC05v5DKHCoTA12fjl37H+THbkTtaes2wHXSrfWFFa/6WA2LAVtulPFzwNH/AQpj7UYU6X13VV2+Vyc4Nlb3aLurCVswB10cDfxlTWmYKLTbdN0KcAIOZhgXqJQtFc3/HJ6cRiWx3l3Qqrwf4Z25Qo8DK6T2Zdx+3j7qzQ8/92RqrZbVJB28q6FfjrFqk+dlhoIWQhS4Gdw3ohcbMOf+RmJvzag1TowdidpE6KvYjCZa+8vgHfYWx4P32YJGaizHAdN/NXpQEDvTdl0V/C48GGuZCV3ZBQE1pjh8Fkgrva9VlEUgYZpWaPgYObqjUl8JfLsNk+owfWR5HlyjOlOPDaPmFhBx69maAdbeteONESA3U4WOurHhqIxto+oUUXKM19Jq0BGvlJ0MK1dmQ+l3TWOh7VvE+ixeTRJccYl4QmJhbNM7iCtvUQA6OZBJX0x0MVozDOpzns3W42DhlfgWUlbeI69M/HymaOdPLYSEbYfxcY0U73+Zb1xNYWhxcsJMFeG/5mYdjhPJqCPgdksZJEdXyW5yOzB6wI7b/o0o1xJkXtvnI/fDV4bdE5QUIn1UUuZ45KTvtXct+QT+cU2nywOHfdK55W4t1q59IO2U+nTjUaCfOHSkV3U/8+IMWFfkkkQyxpgiL7DdAjRLZya0bEROYd72YS6txCeuh6ti7tojeoSoErSLDgRiivuxriHweO7Lbgwu4Xd8Bs3CU4+SJxUhnbNwWOD7bbljqNaVjzOxcdBx+ogOwTKYKm7AuZwJB48ow5rZyHblAo0rDZdBB5tFwbJ6P6FdvfNFi0Sw5IR83W93+eXkC2dLYXRZ+NyWU+j9BCg+CXuKXaZLcZ3v69j3xzweTCKm4oKnfWHEu13rsMjUJF5KZaUjk3NXL+L/jrKfEu00JFhOrz7+G2JXGBwUcPV/zrZS/0yBWd90kTPHoOheXGU9E7mi4nkCxbnL1X23BFr1oLptpALOuF2x80vb2lbZS37m5Q7dRNdER16N12pSRBKzdovcK7GJBOGHjX/BqsEmwRgY6sBhpeInvyVxibH+b9Lbn3BNuJIDbcGwR7mx9nDUaOV5lUI6V092E4WOVB7QT/pKiVdLyCyu41bxvWwEFw0bZr9AGHFhEto6Y9bk1SzKKh3KSJ3o+qRV+PQ/hPhpMVq+GPVAT0IkzFyfL8yT5PAK+BntPUM510tQdbjt1clkDFC1WcpuqJV0RO2/Cvog51wUNfm7Rclz+vaWid+6/vVVmkYLJizhFSW9m7KRZZRtJaSTVh7H4X3le4U2qGAj2QOVwIWdLizQWwt9MECUX9abY2LMHld4vCARO3Tkvpc7011GJxbc3b2RBAVgu/CuW0tgT45K16HuqPX3X9O6EVwO7PYTkdxderOw0fZxqdlNCrK8xB5w9wY++vVFgh7kyAPIEKK6XYHJRMnAHJ3uipVvR90Y0NM1thIJB5nE2a3ffGaGpuwwvnFhrJDMbih7FvEkt65LnagcSdj6KOntvPkmk4nGcAb5sEIwOdSU5TveNPtnTA2frOz66fEYewagfp6huZUgmS/2FJO+hCgKpq4uCMKo2ziWl8I3E++hkJ4Z9GmnWlb249arCjcEDbWCs2spvwoPgsudL3miI3ncx62Kxn5t/a7Am5AYnf0h65AGHeKWnX/JLTvr1+ClQMuiJA82W/fOH8o12/OaLm4dzK7V4s84F7IQ6UFaV8yzkeXu6AL9clK2tibSR32B/eerC+RsrlpHhCGmvmljsfX79dMHaTcHmpuhQp2YX4iBqtmMqR9pif+8FA11aTCCF5CY3vG10JaOsX23EDJoiw4EdUV1td7Hlk/lSro7v6c7J5pfMjjbxjyzlD+omCCF7OkTig8vksTaH6Q9w3gzvs2NqScBcGMJlkN5WTtUNgOZJbkmglUYw02lGNe81lFX2Ud+4XzoTFnrS33ld8JY8OCip2ioWqo8KhX4d+hPZ98xg2TiXJyj1che1a9PnxytUA8hxF/b6KAyxk9tjoqbvPhsnawzH+yYMkl1tk0hlh/pXKLEBIGFdRsb2EwSCx5VFklE/DQQT0KkoOas1oHeCdiVXhAcMj2duJdBgmwPa96oiWYWJMXRu+yWQQJXj0tOUjluWfrEz3fm0yL/BG3LXLvWaQlVhxPxtA7h6H4w+0sibeEBCmFrBsnKDI8L/JmLAby0JgsnVZiGXyH+0ggMSa0a8rqPzOOhtRwgUqEnnzGzPIFs2C14WSfPg+q3xCiMbdt20x4YHxGvF2JQri+ke6fNIjg1f7zCxu+QNf59L1paUy6Whmryh6h8Jr5QUx8UAHoY/NMCf3Tzo8F1R5tUPNyvUQa8MkjB2gRWS2EAhaXa/ORfPqJ1hhJ5NfAzNypSo1JPg71+CRzi1kXiIeU9cKTAe6v2+5+ku0Hm4omyhw5zxTDL0SBK0HlBqOlvqJXx0jwEha9siF9tGVNrS0dVg1URtzSrDTFOOXcE4Z/N2gdWrdGwdpKxWH/K8UTpQlNgdSBP2k72U4FOBhTtgeffqUgZCZFr97Qqowkh7/XGC41hyxoaHSBafijal6ZRL8yd8RflwPVeq0zALUSytvcZ0UJoU9F/5eqGL6eYKq/rs7pmnoAEG1AZTiFpoCzcULheRigcZajuzN6L212HhFdh6RvxeWid91EzynIsEvdfWcZ3fKPriWUTBt1a48SRR5iJ9IFaKCThzrlnte00mJLOdXvqxkTKDZCRLpvLdSh/8/1K/gOgBXXWcn0/+2IvE8yT3fptcosCk/pu5f9ejJ5kAR+2cWxRTUK58V/b6FCFJ/fA1Ci9rfiQJiZzeVDErgdEn6oppayLxixb/dJXyHClCrEeV0O0JNC/cxBaVVcMCy++bd4sbSJLwBy/zP13MpFTKC6ZkoTMNxn36infVc24UceTAB3K4up4N5OL4LJ/v8Lbk4Vk7emPsSkHe5BggCiQ44EUOcSHiBSB7Gk6j8XKQMeQlKT4hJvCxmI6294CIEXzF0lEktdnI2c5jIfsTxpx/CCv3HZX4LU1PfOBztpb7O692fw36Gs6Quiw60NvmVzEjTGxinfZCz6FGg9t+lul1pGOmBZZoDr1CeIYqjC4BB4gVcgRfu7IpzkRyvC2nQdRzqwTJxbo21p/rRvmCSOIHP+bJoYCZARMZB6usQewU0vsIdXBY+DgqHDfmDYIA/oaNpE6R5cJSBZP3lgGsvrp2qciaQubdaKS0jA6z5ox9KA/o+qzCzWQhFog5+iUbZn0LkcrVG6WcFNOpwCfTjq3hMP7WZynN115I3K/V28OkCgoJAAbGML8NQ1W+4rGk05OKNF/cQ/HZQszPTYpW3uLBrslJoAd5wJjWHE2rXKRk3LLtfeLbn9O0GRznB7RqUyZ7bdVMfvMlDXs/u9z5KmXQUUgvILPWiknmSIU39AqW/BnbKwsUkgbaU67N7l/l1Wh7lAwtJYLtEU1gcPXqSXwqF3bAZs65NuXkTRS2C0xHD2i/bFp5Wut1xKso2Vh0lgUVn/K308V8pXaTKUTV8XjhkycYeOubKws3/1vFm+cLBUoGtDENr/2VS+wLkwIDRbJS83XxyFCpvxJfbUg6DdkZSCYtj/rXNSclc/0c6o9KKWH1hIgF1r+qM0N4U+PWr1sriJvzhNY9UfrjTcXY3kwTx+ao+3tUROy4f2p604phU3MzGcpaAGsvyfGaTCfYtEJH/RWG7yRaHJnaixIJRsbF/BU3J2uRYOZMynHsGhdmoX4RSYVYc3DPfkLc2sydGnvxqWGH5cmnO8bnuEw9qf2hol8fFzvDeNzw/jm3mmvNaCLDsTI41tVBltUoHnHSWuXD4NnlXhICNUNfF8OyFqGcdVpMNfLeX08bQtAHB7YNGWI7t69FfI2X36WqwtY3sgTPVnVigsmsa9/cBQITFwEapVszMJjUNsN4hj4hLpWXqc/SpdJwBP14qk5fvDaUgsIvtc0JsVtrIPAs7vCIP0dgix6EGguq39RDcxgjxkxFXc9Q1h/bk0iFeSFZjRcBJbqwqIYPqUFRKx5TW1PMqTAP1P+6XlxcRroqD4Ix6VX/XaJuQ7w/JWfIirdt9bbnQL+cORvvZpSXTpxZQcOb+dvaM5xDvUPOP4POOLksPqDT8o354uF4CyZekF2ctr779k3bqYL+dUDvNUHdbtf7xkjtCQqNYrvgJG22t+HtLNIj/W1AIr347Ot83gfMfjhckxVnc1k0rBE4UgOQ7UpqnWqocuABIKUW30T+ibTn/G4uTkulsdD36Qnm3dXiBZwMzL4yPsPzKiybYojgv9SwP1OyG/h+k5NAIfRxcmLtKRUneuW52cz2HBppxg1zM50IOxk/qmtsOz/KLZ48p4LsMoGMHUyR++upU1WqQEjzVV1cHM953Ul+Du6TFHT83CRnL90sdY9470O9hCUj5+drROIde5qsjy1VSRlma5twZVIHDM9OEX0+BUUJTYDHkY48wpaG4NSyJlQTBtng4e9wdzYR4O7wu912Nk+4Ph6Fg0v1yd2J2boBaeFB3yh+t9x35zDFUuZ4JIWMx/OQSZ/UXm6YRT9esDt4Gw4UUEHkXbYpykM5T5LTe6c9oQTyTuV8X4I4gvlGe8zNbrajlw+7VJpp5qMTodPNx80Bb2any6baBtA6EpF4Umjz+u0oItJojzsjsZ+16rVBc6zQNsiHTm27IeWcXiMHtKqV2lEpiVvsPRd6pBzqu8atpCZASEWPezbc92BhnmguSI5dOyM9LQcH300WRtxzqAsrKc9+O4qR+Wlxm7U9ZRQMGubry5+SNGrmT4ltmwOlFXdZz1gB/PJ2qRmPhncX+2fpqPgKaaBMcrQ7yD9YzOh+vFCuJfIf+hPlQqicaVRQtfn0tLRQIiBnKd9XM4NNF4BjmIqzfuKFN/Gf7DdRVr0051xDfBZsqaCamkNXaq6qmEBQtPmHAT5IiljcZW+YpxfInDuCPXppjv8hTWXH0JNX2/JiXhovahATSexivg7XLd0L/q16kMJAhsyM/Vll2i5ZZeGX8nEr/8Fg1KmYC7gFsuNmRyi+dk46B+Kojp4rmUucaZmAfXPlVGaK/QW0wpx5BvdcdP+eZ5f7tHsEFHoYDKSHGZA3SroVQRdrvyC6evJ71dzVq7cFPsx0+Olxoa/LdKdRD5rd4NzRm1pgQjkctFJbQX/xiABislQLjSbXNC5jteyLwISNJDbE5J7jY0dpaPBsyFKGLsbDxXEurK5PhxSe5tXa0AYmGSkc4BRW71UEnbgVs6FrF1trTMnMq+ik0Kh51Ucf2vFK8XMutMe/frKoqxnUGWYWCoS/faZ7h/4fSmjFR1/P5rbtH3F1rlAxqxc+X+Wms8xxmRwDo5xEc/UkOX7lN+0xDYyD378Op70vUQYIuGRpUmAzT0ufyDKwbM0pN3+rksxFAFKPyrHLBL6KDHC61RjX6+DFIKcjl61Jql1VVG+/4ERy4gjg1mGcpya2V3/ROOxUxMI9y8O1VPuFi/16I1jiTMScSoKVrSCMovP45dpl60UeOpYI5OBLtwgW/CZ5EZil71W+990GHiTPSmrAgCmxm+Sd6LN1Idqj3j4wt2M07fYTBVZawrkfB89M3i+zkfcNsppqMGXoD5iZKVs8CeCx03/h796ehxwRtiBY11Z93t/hRbKk+9SPXzUGgdcSTx0M2QVyo5psSjBFWCudm1r/r4NBsRLOXK5QM+VxkRGi20hKxqC9Q1+fvrz6Mw/oGaQGXII32c7ABiZii959lkSttOSYdyW/h7/YHymLSX3e0IMhkIchV/K0fO2HV/WbuUhB5bZ5cNsI7U8gic4126SJBbqCQMMnr7JNDuPFHlhsWeXC9fGq55MZ1Pcy9W+RM05XP2oEvfs27o4zVhArrP/J14GEXDJ62W1JEPLxI9rrryCtqm5gn+cxfzFGaPfLmVfpxoE8QgdGccyiR0CoaizhoLnPjii0gHa4SoswDOldxxGqUmJnLmydmmvohGSEnwCvfIWwB8JhFfgWeDSj7qoheFyfWjhIhztAxOboeVVKMZfCgBIiO1oIbiSFxQk7JemhF+3zWBlaky+G7BfPheDZGQypltD2lNfIH5v54UNIthN/oKmjlZ4Im1raDP1mO81yYnauOgnFA35qamsMnW2xLFooZOCFpA/c/pmFS1lgEGcL5Vizj1H4Dg69tLU9MrJxLxBHVlp5HBYLo1JRNa+xJVUwm1KovkuyrqbJFklBtTig4aoFMlIfspLIk4zDeBwmCJRCREYMOQ2DRyNR5syZRgJTiJeZ2NwzSsAY25eOnbxe9Wx3btz2xsHxo46qkfBkUsEHNrYr4451VVpWjJRSGPN2QXuzB5rppcksMCAvXhyXmAzDsbejtC04PoivJNSGznlbQyaLZuF4B25WPKFpm1Id3Gxjo1omj22oemm+ar+TLq9TvbahyPbzwIQ7xP17O4GWhWUmL+yrDARkapZXTQUkYW/gcdsQTIasqaKapE2VMoSQDBFLWDwEQ6kjRD24stZlSusdZQJJDAx6h2tqITLNJ6C5oXvwz22KYw6JWCzuYYyt5jX2SsfS31BPr2j/ELGPOpWM890G/L+vokKbV/gilgxbyYisNsFmNT3ELQ0XsT4Ke73D2y80zrO4rQmD7Q+AdC+zUfC9HXNZfZWHqt9ogh7qXYvPVdcfd19Z4gIeoRdEVmrnFOhYf7bLKmI542O2KnChTyfCK2I3SPsyJ5Gi6azaWOs3/7aIHPPnbVNp7as1b61dNbdTBbhUBbnP1cgftrybDA+aiWPK72B81kFAALAsU+CWkUNkgAGwDHEKCVr5jbeXjF5rLatuTxv96gwrcjRyY/IHYVu41KAkvqO/uzau2tihGGdFD8dS83NbFMIsd4CB9Gh7mHQvmG4SffIUIVr/9+G8MaIktCQZQGjwBWvlykhbmqgMdaS/MuWzByM04+NPLStDR+wP/Cvda0z2xfjFepFkDbyn0uxIyw4Ub8EiRYNMQwYNhzgFXNPdLVuHTa04DpZsJUTtS0oGVMsS6IKQga7vWCqxxmCYLe041f10P6pZVmCGvn8LnpdEk/5S4WjV2ajM+ggVqP4SlBTU1tOTomaOMQtV9gYciTXReedndRZ7mWvt1G50r2+50qYYaPPF2r/VcLpKrd1vv0ap3jWX10Ym4qMMynRzlbwvP6G2qZNi0tYO4tI6UuaHJGVtb43XqmwzLFndXoLNSNMBs29P4pWBpvD+gnXyTZ2ZPSFhpqsvV3zQjKmD/nhDiRvd7fXAWJb6ofQu+pO0TqjpZpnd8rVLc27XdWrUNjVEqCH5IcDiJs8nE+gtmdoV8PvyiNYymANAJ4/MrvBRaSudj82SIEsH7SnDV4sir9x8zU1J1MwPKXUWdXeDPYRp7dfMn0Zd/SAxHyVTisU5HGVu8VrnpkYvPJ4XqMimmI7YqfO6Qe6wtgcX6/iVi9avHVsLa0Zz2r9pJzdBbWPQg07VV/eNdi3jc2YP8YGGSg/6L14jN8P2rSnrcJNfOlPIrLmv906Sp9ISVJa37azU0bAjewHE50/y7K3pWTwpZnMZoQevkamyU+FXNaKA6U/Yya8Yp+l2Xoxh5o4138suj7ns3Tefd5q1qOZo64FrxI7iPNv6UPNoEWxRMGRvwSyso+xX1IfCmaVlJdwvEnlcP0XBog87QVg8fvSguLtOmQEeE5zeCBebTQAupdNmr7w8RoFOO1Qj7M2PVhaMvtpsjiSRbLbPEbFd+cpVrOJqbocXTVY0ymZY2DnBK+8yxmFMRYQUPlkpvzE9KToABKB1SUQri1UDPwYuctouiDmKCB4xpmHrgkOVdQnEcmki2RDho/R2e9PZhxLTGBsbLGr6LPQrVdacmIoj81GBtXmZMMvGd3/amZKwykjmbFno+emZz16igvQ6s/AsUxTLCfLlsME6zfyKWUw2ARx9MTkz4JUZiOHs4L5ZzO593NAtNnMSI4TfSesk2+9njwGF1C7i7L0T3aUO9ZSnqx7fsArLBsKT3Ub+O9umgDRH4dOhiTLNNgJqyqqiRmo8MCgehoW214RxsxCMche67qtdeTbP/waEag+HJW66iZC+vNEmGyREKw0ZPpldNGKaJbYWTs/zhnXcSKQXt1uqxnuxoZXgSkSZJ+eAfoChBiGr35Leg2nYmm6ndu25DxE+LIIunIwoRrnsFXGVxamLCdMd8DidXuHMLcN8DYkejQ1Jahkle0Kqs8sggoAt3i2Q3XFwosaTqfB0xGD8cjRr+xDcxPTHdO/JYZisvDpZvOmrDa6jS1lV+XqSSLngCRvmpP/JGHi8UC4zxZKEtPNFowa4DXm3T0jHBf6U0bOTq+6qNRv0ZDpJU/jCytuKGA4ztkwmhlASNnXBGG+j4D8RDYwrT+qY5xfyqijZswtiQri+lOIETT8tgnyZ4zx5ASgMtnG1QKmSCNzhPZuJG0Us84XDwEgnWCBp3DWCtnbKxkrDsTWN1FBBCguc2CpJeQIEfWdI9B/lQRkRAZil9Y07C4AjizwkQr6Rx1urxXUNXs93JdqEiYsnurMVVujASPSK8EiMPjNxNojQRL0fDy9uDwUOlYYhVzgb+dpQBXNJTIIJn3Or+sRCftlqr2/nrnPKyGK4JvZnGFLpiTziloX9WKbGrkzX8b6GyBBaZp/qsDQLF5BQJ2YSKe7DO7dquXbi3BbXsGLndTPQrJnb78EJLw+eg+wlls0+WVhX94UkeY+yKSgxjCr50dk6M4P+swnZ4b6RMI4fkyHupYoOkwvI/fkYucA0rwHFcchCqYFxn68odaVY+4cCrgq4i5hmHmsJjfWWRIXcTE7qdy8jb9fpmZyAZKwMw7lBML2v0ptKpE2J+nNgTsUllTv7wzbIk/sVXQJN1GUfPuXDUqzLNbZfpURwfX0A/zecUF5SsfFSilv/VahN2DwuqcFk6GT9xdSk5p1iKBl3aFMGQbMKeGZQKQ8h8hkRMNvN1Juv8cuhnFsAq/CbQz9bc5ej109jtRFC4yrfHWcFOl1RWt4WAJxho/UPM65VD4U505rbP6IWhfzjuiTrStTssmuiuLIDPjJRzhIgtsZtDEh67Cf8pAtFQ17TvZ6AsCjoJX0SOlinJMLfmlkwI9skMP+TkY2J4qs6fhHigP/f+ioFfFIl8TjHtdfkt9qgz9KWh6sS7QSTnYHMIHtkZlbUpC3GFSH7u66Q4GXocWHYCkYCwqAUM2uEHkRNIHpJeVZyG5FTHfIbVlJkJwRcrGFHJ7JeNgi53deL2wYLSg/iP51bdBbYlOOg4s0lpKS1q20oJu66Gd589BrLCE942Ew1hVsEApi2+938JbDqA50VWi6eLKGOcFiO3K8zprVMphlvEPGKGmAGXHqbrRCjBM6sSjiezDyl0lBX+PJLAd79r1/pgQXFnUbcRz92RYmgN6PlwhGM4YI2/YKE45+SSh0mGxXyalpVX9mmUOh6FcCy/I6MkVKS3jm0/m0PyjjO73Dlf4Ngj5UeGosFLayJ6NG+ED2WW59y8ki0/hHNfdzcgU5/2VlJ3kn8u8ZBpb9S6l4WtscBdfqKF84boZAzQzqwE62BJztSG83hpBH9c2/H+lps/yduaksLtEWUFr423Q2Gm8ub3WwL/6KSjrGnPqYuiYafcrpfUdaZ118sbz5IcqzI2uf6sZUF/bMh9iL8VWoc2lKA0tQ6BlORmDSn5pkowSt4lgEb6o1Nrjs75p8DFnriyoMY5MYCce8ygLc9V+MOaKqwmTUz/sAZ8KJNVnO7gJUWdAFzY7Ix3dpLP1rgt6bO6GiZv0mg3LY/UVLPKNme61z5xEb8mxVtp+UHsiYpDscdL3h40EaCdoP77BdISG5eLZ2WgIu8/AppB6w602r+H5tRVDq3wRUxHXcO5YfGCTKhO9oGrqX13Bjy+ccGvOPyulaldoKs6VW/GDxbln16wIyw6gq1HEgvvRJxMnX/wsFVwky6Ur5wlx0yC6Tx22jHm5go4qapjbVSD18w2R7H12ineTuz+tSUKq9XiAYG3XM6teooHrh3tRVZfE5vgeLhCp4ub0nuRjohgdLwnVYhW0p8VSc3JoRRoldzXot1BYZ90oqgyd03yLuOAGLnuOGi1BA6nHpD3CTMxp7NkWHAMehZy+5H2QqbOa1ApbvbbbchiveXJPE04qtDiK0zM4eSa/xs2D8KWuRYE3AcqCZSQg7kLqwxRukTxTPyAwCnUPCkwNjjUjQTiCfbrvhRSJYPGunc1seJBgq/AdlxJH8L2yWDiiVePTvKd13ZZpK93QLalf3HbJSSy29AK378kRNfJdqF86967Fpp5q/kR9CKNCdPvjI22/jqY9fTxgucaEl37jfTmpLZ30mDKLzvaJN9fqIVI8pLPgOOguVe5cYnRKgXKmKkoCNr/QQKuevlRCf6vY8IgXbsifdc/5nl2zkjSeLzbg8Tl8zbU9ZXnImKurYCt5FoSoZFbBmgazS/xKljYHbTmHWWLK0xKcHhl8Lbr1nSgVLouB3KQnOM1NXQFu4zuvKcrLP9I3fwKoB1n5fIo17pV0F5pEti8gI/BEFWBJg40KA4lFeH/JYZFob6wZLRPhLc0Nm6pZd0T26teP7odZxYNtzrd5N2OHI+/p6Y+Kl8zWc0lEX2hq6idEb/+c+PMt2VTVp+JoWm3oQwOp0UWsp/BJGciOrXTuJOB5+yq5U9Ywbp7shkx+i0w2OwNscq7SSvifFCipKhdGtLCfcuZh1Y6CZPSg/RXDCuBiVLPUdA4auDJltyVIQ84Q5RIK9gfx6p/fHIWWnOdHTkjICC/nEhEqpMtYU13saZH5btSR5a+iGphaQHFFM0mTNkFze+hieDUPpBNhvjDj1gOC3kd8sJKeoJ0xhXCL8JlySW12gNPUfsbOPg733oI88hVB6nbIzF/0Q5jafFmBZ0Adl7taVpWMND+hycTcbWgoqxMlR9fTxsLtikyJR2Wt8Pi5+XgmiP37dQuqPPHNuwfLMBrU248bUVKJK2s3DGiFLX6UYsZgF0tD8xwajdk/r5yHvairG00/cTHaI1ON7yyzZn435IVDXbvDhulGrrZf7Bz0w6oN6BY+x8mtrD2EYvYTLnwBXcuJO06NyvisATBb7x4SQlrWbhYTZlhk3J4TAw389KeqD9/81sdxSoulH6iEfxjtn0x/5k7JktRNiEVqPStSc3cq1OT6qRaTWWlJiI2EFpiLFyfcP70LrSR5HXRAn3danXRzFCJcHenpkfAvin8dIhmaDwd4fzwnmH30zO9VEmikAzojucLU52l1DJQKHop1i5sd0XltVHuVLngLJq8ZbIBCVH4cX5L9WJhiV/czCyeVPdVC6CJJgRtoxnwZvzLckb1kFxyFCt7RI866zYCb3e4JoEPmaj4Q6KOOhhGGdU6v47PhCmJGcP/Tg2ni2p483j6Y6gO3UYSEa2XNzzKbHoh5Y+jDr95H9qCbpfs6NEVfHYBm3+jKzMQdp12VQgadmGNatvekTwCwDJ3YpSzZMgSGTF5dgHU2mVL6PeG+Z424eWvxoyJfbnVZKtis721csUDhbM0pUSslE002FG/djnRvZifFcSRUYRr/a4fz+7chOqrVnOefukUCJ2qU9O6fxnDEkdBiObS7qFyTGg39U8POoeCo6d8F1sUQz9xeWiVFg8NOUgsC/u1wSoAf1T+mU7vnD9szZqmlgBBfX6KThMn1jf7G368UrxiZM3p8leHH+JCkf0OBdX6h9dcA/jJUFJ6mkA8W8Kvg4jpzJMytLD7Jc+IeO0K13oSEtr1pi3rq6DBpxgCWw54kMsF5QhqeOOpPtv49xkfwyGtxcBUOyasXvD0ntC12hYZv4p6I+5sIjLcKVeZamJMpZDwdia9LDIBydkIPJYPVHCeG2l1YgtIkfXEJP6vWt6zcztMaOtNq9XiBLP4TFqzkfIbITn4dk1tI591kuX6qRdjH4bFtbo65YL0xlNydRcC0FGDbvGmYntEUPQNKnJDHem/PeGUBA4km7G11iZ8eb0z1D8OXwO4yvKIsaXGqhls8oRYckCMdm0JBPrH/XldLznJRVEs+v7r01Zx6Sw9DntbbJn9lj/LSSRvNQAHDSL7N0rh+gLLdl5nkI3cJrNC2kpSan84w/MscXRSHYPSst5dMVUSz3pfHGdqiPOHr58+SZEhYP0j2axhkpvtGct2Z2Y+cNX1k+hPpn8N1ZRsrDw8mIzcdjs0jWv8uFz01AUFs/Eq42RauN1gsPWlAMaRPBsA5eZ8fFduwfuXp2TjfpmG5bqqr5pgMBA1F7mHQKDqR3u52KLLJxAaIpwoQ7emNT0x0Y+aTru5+MNVXhpR/jdkkQtyPXftBNCYnQwrM23+8vy+F7m8iAs1pzkxiwrybicN0TZMMsgrYDF+vHnpWicBB4JX2fd32VnfNOph7wpcxfl3Ssoq+VcrRQJgyT1rI4jobViTh5DwkjINhxKjN7W/Sjqi7zeowlAS4k/O8bi0h3NlLyWS7fvrUOj1lC/NhLiv5sQlgfKIATfSuQAipI2KQSUEjKdDkxNs4fmUvDHGcVnpAVtXNORECQ/er7KRf5MVcrCbMJKN6OJGO8PqfIjPPRCaIfqe7LKdabLJ390ER0ScfxIi8wvxTlW3kTbGHecReOQ4Jlhgb+lGEkz9//Pj36Em/iJmlaT4H19yrVrPR1LlCcRCZkHJySG7YfyaygaI3KFFUfXBxDX5GoiiX2NJN2v+5qGSkumdN76vetDVqKN7clT8vxBMvV6uF4OO+1o9VVpZq4I64Jf3USsxgg+ksDYiOmkc4ak6hkdtkVSGTfhSaaECTgbCoYqwBakjQxt5edMoaD7duZm6lxPdjEtaQDv1+e4/vunstyEmFUoFXfhvPdifrOFNtRIT+9TbrHDA2TN5DELWbTT8+znOtgxR4LrbNrRnuQI0AB9XEP/KPecs8Trhc8q061hmzXeaiAdMTOg0yKl4eYRSfI5dA6wFJ8ZjRaXuqutx0mieom/V6aNnk28Jpp1crYyNCMHia9W952ClYfYtlMvZ33KDimNEprfzqdfXpizwVjbmswqneYLDKOD+lu4gQhvyHAxGC3RZLQYO/DPMHu+GjBnaL/Wfs2tFDET78cV4vNMJoZ+kQ99NwikCe8SkdHLZoFKh+KwKXtpC4VXNtHOjYDy8JYV8HJJ7+GBjgPJfTSCJCVMc1oY/utOgekRs7VBMFFN2FyU04aZ6Aidu7ptD3Rui8A8LfhcqByGWLKCFJSmHSqaKr+6N07QeNNFHZabcwNNcvS9dSDt+HXQG8JdzuFpBSJ0+zvoO7Uc2RSuUfBLJRrcdGVEkAoceS2AwV2KfGnc41TdU4GT1ioSMoHTBU1xWitt7WJ5KMFq9gw+hpAYYwlRC31pWOU87F27mkELFRsMvGILzSsLL288YJlrylVelL1f0MO2z+RZpKaeR+V7Wewpk2m7LNmjrCKdGvBO15Cdjurw3reE4Sh1RBEumoVr+Ot9kLOEyMiERy0zbKnZouu7QgI0r+R5e/LPU3p+wkBkVerYHrCE7NEEwQFCK/8QpNe4PaL5Ub72W1TCf8cg+unHQClmiit2kzNfPGX2s+oU6N4I4mDK9pLhRYURqKhYEZCYGhh9NMoV2QTYaKiK5BaVSz/3O9PU67Z0L5r+JARrqkakJttlofzklU/gFJkqTT716BnPqL0w+PBTqgm1M6qgc/30Zbd8S7eDNFjtePG/0RdjMiryVTQjphbw8MxrH+vNMrot9jgKbvc6LCZRaP5vZWLlKhjnD66KNK9SmU7q0wOAZeWQUmS/3isWEXG/jPWjNZJ/rm1dE+zhU12QqvLfyoPdTXxuFDSaefxmYruZAKBT6cyc4kumZEqjOx8aozV7iREkoeJ3E59aoKG9Muu9PGl9lB1QQunbg38jrHD5gFb06ThL2qVcKGwYaMptcyvooqLdzcaidxhTA7etDamgDhbTJRSakSq1OvTjSK2xF7q9R2vxGPvADu+g06V3LVM7R/JAv6nWQDhDtKIjyLXdB57zMPo8wx6AI3VwaHw4FlomVxFeb4wfCRNH8GXjoSEI5FyTf5fMZj8TKIbtCMXhVnFhDh3REsLxZZB0MB8UJrU7XnUiPoQhC8zFrZ3H2+jkQsJiCdqjzUW5qShstvfSwGT4G3SV/K454kvti9vuUo3ZflYprJlE2fyyRWq7C20IsTuzGrdGRmXo9zP/KvuS1kSj75T9RhHrwnE3OISDCDrgjeuPuk7ICVgbRdX+rK/IzIky+UKXrYZkgaKZsjsCI7XeAWVHjXJUt18DlMZn19umBRqLBCPF2CcxXTH/YAKki92od4ssZDN+CpNs0ERg0ZhDzKlG7P9YZzEYaRgaywhR2kPHf462fRILn3a1LW1boPPT77Tn6uMe8GRpr8GLVXX2sEAWUfWDL7ZLTpb1t7TvBqbpPBQgxspkLbzOU3uPBwypZhSaZjx4LuZ2YGk38PRf1CJoM2kD1dlwe2YU6dbFFYBlPZrQRAcz6LsWz6h6vvBzp4rFHnakrZbk7W2HE2vxwlZ98F+DxK0oew+Amuu7w+29cy8q7b5CG+aQZRPvMw8EHiqiCOsCbTEgXH63+ezjnxk/FvFUu/B/3vnTkT/uJf3tkn/P/U/nXSZJc6szscjObLFhz6AYVDKS7LPV0iNknUqfDFk7Y4YfTTHwZeGx2qw+SDHnzPku6bC++bbJM+7eHnnwLPg/veOf7uDNlSfuXioWt2ShHx3PUjhQ8ts/RabYAWGGwktg0pD3reoCbDyyd9QbfaPEgTthlGUvK+8Pva2HmceE/7KrZwmG4beBXKCoeuzieY4x1FeVUnEWe6Pjdauq2Yb3dV/Vg8n4HdGH9PiH8vwQf/7C3kt/L6HmHTsHoGLJNu64IKW8oeHvCY4qiRfy/aRXVfqaqpc/Qt/xcKqnG/a+YJW8M/bIe5GOOYBXhtihGRMM8JcS9x4XED7Sq/C4SnDk3w9K0QLPY8q3DzNfCWbeT2At9sLQ91nc2Uh7v5+fv9gN7YrGSBH6GAHpj8mL/zDTvb7LIJL24PEVXhisPsonb88kMmR4bbiv4h1LBHAAJC0/6zFY2qm98XG9DX4h+eOGmm5xbcO8DLFo3a2RIu/A2dkxJ7iSc6I2AFGPFu5vcVvMxfcs6O5turtlXZxuE1trIEnbNJ0LdEY9hphladCWBrEFdPKqqD1XL3hj2Uh582LRkj7vh4Co2S4Pi+d9522l5Ca5Yz6A0y22MKwGZLYmSRCQmQDRACmKmP0+0Hpso3sIrXPMsYxOBikOkgN0/jlfVxst/u3H10pC9414thxihN7Iqxf5pvQTMi/Ug6gNwIGoC3xJx3DYp0Nk2jO+GXSN7WyPth2iimHAgsFSorMdzKtlhlZ5eH/o1fPROavCuUgk1zNyPCPHUWVBgmQRTks4Fyy4arAYUe8cRi7HeQjDwzI696zZbkmTcfwbJka801jDaawhZjlFtE5uN6R4GWDtEAR4o+IFnuV0+8jfwgmA5ZQA7jggYUHCfCySRUpv4jGW0j73hW6NpkR2yktqsHb84TevXMxbLSfMQUa+lrjd8uUVLzfq2QxRu9R0Uc1fbNQjtWFo6b5WR1ujKkYjpK/eWGvUzsI/XRgGWos59XIkAMvRgPjql/Ns+ZGidueC7ZZ8dxJ9xg2GwuGo34GgcT6HrbGls8Mpk8GWHC0+kkGCHI0YZDoHdY0cB4OkRyfI7UkZXzclXN5ldSSyk8F4keymsdOgWVY3ih99vBxitOZ24/c/fSCcFtAoo8pn4ThyInebR5UDqIfjEtls5RplxDgHAU7Ug7+HOWVuxU7PaBSilsSkwMNiSXt9fKd6tGaIKp3DIVadcV+wKVoE3NeMQbl/tGXlFTbH7FT+ctMCoq4etB7g93PcsdWHuDJxMx1JO9b/T7v4tOUECyyAlu6UK6Fv6TOoC9QOYkhASsC2jztuzA0AANQEMS/QIDELABDbIOYGAICoHQC1AwCABmgArpkRu3/CfAqJqLcEUJs2r6I7OAAvVHuxcfw5vDan2Dew9O/XX78LMd8gwZxoxHwjMQs0iJ+/SE1f+bIkPm3qvt1znWEGSJ0n00/XtQ1gJqjE0WBuSwL0G7Gh8SlGuQt1gajNLHxOBP3rCyQ6LGjeStzZrNLONGen0TZXYuWoJEuuEmtyc0qqxLqJ+465g6/beMrPWezlZXR7C499ggALb+Woywukl5aXfWAo/QywHdSkUb62XqezcQWG5cR7UW2ez8WUz3L7tXHMR96/zW2dPh2nM+b7y4Nvc3X0r6s2v4qf/n0DnADOv0WOzd1T5QbcZa6pxu9k8Y2Ds9Ij01tKrYu4EF09dS4HQqgPlX7qf1AHABKM1rd2tz61l/bVL2fruYPaQW0gvs6vBoDWPv1HOOoxADA0ABrQgAVip1ko1/4FWxuaRnwdCSABgIR2NHNVHx5u9LP7039e4Pc/fgYnqDeoCxDPBQAGWJl+9VkLuX+TT+4sqsR3juNoRaPTTvMYmvoxhgQZpKZK//yHKgMA8i+M6hH+v6ilKoA0QPz0T6AmSC/AiXoAEO/QdPz0zwYJHp7nASzAvoGrU17FT0cRhboxWwCN/xGIZ4Kyy39azwLsG9gCaoJ3ARaIpwCQ4D8jD0BjIAGJKtBINKgCwSOM13XX6aT7xdlBD+hBL+gTVyP3RxQ4z4vbi5qS3AeAGLj0lht1IckKRPBt+eev31F1KF3lZ+v//4EHYwAf4MQEEMEEMG5CLaHzlnCVrx39K+sHLrALLk69TjqjxzcBHNPe9nWljf7Vs+PF5O6gFnkB4WfI8T06Ot663zHIdDirjCpkevHdAw4VZmUCFjlD+rFma4f+x+tIT995tCL0hJ8IHH/buHiwBlCaOxmLE33xIoefIE5kmp4OtIrJs9XeMtydI8UIRnQw9Vr0MRhlOPzXb2d79APi780HqAO/eMCDHcTTruzvAO+aH/bQuYnqyGdrNNAQt2dTL3y9O44PJ9YQkwZvEMwAMHp5xY9/4s8ZrOoxtW3p+Nf1vHPJALyota0SHmRQhgdVA8iCEaI7fkg41OZKv6m6Vz45lstYxQh4VLLjcqQI/Rf08XceuPEnFjjBDS7wtUEfnC9eTOxgBTsAplB51jfBI7W0I0HMZ8W5wbFVgC6+wX4wUh2ObY094MDjKNd3JzGrsQp0P3N+hKw8J1c94mpjUcafNxOOv2ow42O5N3OfLNW9z/kejBbu9R/sA/zQKWkSdjE3jZ7Xq4T/8D/gTzrwgxzgBfSRJ0N1zU54YavW/Rf4S7bDD0TPuD/FVRsFzBLuyItZv/HrJ24Tbz9zeWvtBT3ncJr2s5dgBgRr+0Bkf6gHXlxg6R/a3XMwaWWbxqBUAZSaaP3B7ePX76AX8i9jBreClv2p57icjqL7f2/6NVS+btcCc1Wx6AUz3trvYdLdE7ADmCX/+seJ3vjvsjJj/WqN0skL32nwcD19wQqK9UPMsKvJa1qFmc9AGRZjhIWcYdN/3xrxC9HaFINOKFkr4d34lozB5wS6k1UeyFBs1C7q540V35YXyH3JrsVOIR1P0JxDzMfKKi6UN4bYpC9HHY/rlh2c3V6uBEbtl/NUPEvHgDuWCYgb0KMT+Ab4wXgY2MMvCTIAUGAnY469bPAaEJR99ht5gn7ggONTrWEZ6sqozQDgkYgZvbd+4MIIKixqni95dGKZmdlkLH7wkLxwcjDswfFT6SwyJKouvlPwijyKXrRVdJwbTL6vV0oPMlmuU2EIoweJQLJ9bCFIjIORELYHWR/RqufPtRcV1J4NyjZHl2s/zHNM7qrrtWK6qs571JycnL0+aIbXjT7Lq/SCZs+WYOYJv5xSG0CLDQEt5XkCVb8jAHaBweGCfZI/D1fxi7urvZDAc3CVk1BvFe/Jp9sLI5f1D/UH4gEgAirR5A54OV3JNOwRoLxt+fD4gjrAC4hIuxj+LC8bo8zT1HtW/4M8Fxp20dDKc8L7gMueAY3ovED/NJKWYC7mJlCNImSNfgWxgGg3MIrBEqFA3qw15f+K1IePO/7ecoJIcfH4oZDKomkPnrr8gBmn1D0mHu9o2o9Dm+d1jjcKa1BsU0+5DQPF27t3LAB6Od+Q+cu5XmsFPEDvZ6UvPwjI/nBnDLRB7vDjJ+DKc/QostA2XfPnnueXPqWRMOmwGu2bnAGy0ZrYBJPrf92tCBhHi5/WZuqgwk0js9hq9TGqn8jexNeO2AvJ7OJQSlfi9KMpYYTvUmfb8cuhqpxs1dHLUYVdeeCk8C6Y9ftztWsLcsB+evymkRMTeXS8Jv7uT5n4wAsnjSPiK2Z0PBs5XYZ3VE454cnhBvl9m51oTOVXrU6XGzNGUo5MCG5LOK9Z765eBZfHh5nykzpAdv6kRCnj5VaRx/L6oA/IIHgBAdhBo/AZNRIqIQV4Dz6RT478Xk6Bu8748CLki7KMJz0bTUurnrymQKH9cnIXHxyJQZjYLh5EDYBaOiHG8ele/wBMAL1AHyxZuaFWFyGaHul/XOE/fn5c96C4+/P5ICq/Hw6x4urDV9D36kmpPpzMjBu3TTjv4qrtocxYK8JwH1OBIwV1EZb3BUB2/AGPJAuAdpRxjMXoYSeFKpfvbebW5Z8TsAp4ALsAAIWtzuvQ9gvp29QUO2redQ3nmwisBBDn01ihZwF/Rm8xo+BcyJSWjL0h6qswNFNoTDdA252930i2LsQPpUPWL2X+1irmc0jrofgg+dAfeLnpRPVPO42261tsyd2FAM0RQtAGYsVMxilGpsqPws71kcPVBZZSlqU5WklUKUPwxJpc5MSwyFhEDoH3hxS8oAJGmMmZOL/4znrBgYbGcoySvwexAh7khqL93b14cKEHEyegwN7uxASPxGEgzFW7ojcsoM4zEM2vPF8u72YM+JR3mCsKkVU5QO0wfwhLwAKiUiv07h9cq0xMSuDeX/VOhN/FuJ+VMGz9sYWg2XsyXC0zAWbJc7awdYNro+avKQMbe2frrRlL7pfg3zSuAyc4AT0AOC4Amp+p76OA/CsHK4q3vBqOMvV05ZPKQkSv0pAUv8EiyzeiKtfiA73o1eSL9Om9+vCBvyvLfv77njgIRJQOeBki2q6+RhyDS/UKInlc/ns+6JZMbvboD5BL5T49oT3QMr5TcRSgUCDd1KLz6MW6GDAGa0d5rQ9al7zZvGBMDKtedn31ad8Nmvf2LzTQcMDm1ZLOixwPKEEX6kIPbN36eCguuMj7L240E1ea1joIZUcM9IZmyq3JnHn5dYMJzveg4yW40BvjAdniXfG2o9gBsVTPxlCvEUtn/LgBMEzfUA/4BaMftNrOdeXoPdHaTVeyEvsw3NaD3M9u5S0zFzgSyCx2RSXEvJ7mrGsPRqif68iSo2ORtcJMuBwjJ3GU82I5WhUpeXvxZdpHlugymQr3ImPQ6OwrYVZNvIuk0SdNkdRRvySPodvq+yqggxlvp0eCh4mVrWhIHSBZnmQfIAPanJsQsXLYW4VY8NH0gJVDPM9mp/D2uIgPQ7khqXr253Mm/p20w9qAmS2IttgmvfjTbVPEg10PHIADNl6BuFyYFnGix9dkr28kffAhDqqrHXNwcGXJkd9IJwhUBc19g/d/t4jgRQQ9eEEFVMCFXxw/8IMeeix5SqoCilYjMwFsY1DLy9eBGrNIDnlOMiJDuzPJx2Kd2bXQ+ftQH3Bknv/heQXACKDBdd1nLQjd4a3SxLRA3TYeJBTJPbwV94zmAIUJ1DPKfzn/CTniA8cfaOgLd68KGmKmf3nMcBL+LfepUR1GsjsUsJxqlOqxf/7nQ1fw7z4N8NdfhhuVn/29rOD3fzzowekfWggWM8un+pDIDV95wHOZVOXFX30NaI1uVwBWDGueKLiQQs5fjuvODShg3fE18GYYHxiz3Oj2ceiDEYlH8WAqAGpwrKySEj9j6KWrga/nGmO9eKmY+/uNBnbgMkSxRMAxGTv5eygaJKOFBl+tU0FpL3veHz2I5YV6HaV9qaUvPdk3wwgY8Xbuk0/hOZx+u5zgA/Ph3fAC+CBP3OTjuxDnLFUEsCKuBH34J+BIcIMPxjWguAKuKOCYiQN8m8K18YMZlcXcyRMd41LaUQpe6BGUtiG6IC1WHUNOucoHRl0uxf8y6ov4AB/gAxyYmAAAcuPBA76Qv99/QQ3YB8aHmAQIleYn8EWKf1ZVxRbrtIqxjl5TJYAFSy6EVVU5D2XiiYS0pRKxZStDxbILtDQU05GZEEPAwZP1xYHisOFvGZ/UN+qQA3GKQdvTWxloMV6+4uppZ2TLHe94b0DmF/TF4+fZ33rYfcf5sosRN2fYYZUg30JHD/1z+OpjwYEoqFwpA7pwoSvrRaFb46laQ3kTO3sC44F+Rxiz2wD9JSPZe04uBkNg4R4Wyt3Ky9RovaGNN5CyRhKMS0lX2S5Pw8DHJd9VxrnEKFd5QeswwhfqWRwluIcPEHFl/v/4kcMI4WxcjdONmvWgPLtE9e/K3fZkCtaXQWQZFSioPQJEPH53BL6/GPp8V230wN769h9a9rC+jHxG5A32pKA6CXg+L5D/WlY9ahy0kf2Di1DNyAs3jubOuZ2Z1huXTrRThy8cDIdrUIU+YtyAE59or2qguDI/ZAe2Mq+MQH2eXtgDg6AZow6FaKFYIR2/3r8yDrArUrJeI6MGQee4RebfdKWjWrT4rnzisYifCYZzbW7Gx79RRdDGf2PPlihX0ih22g5tV6JVGeWHalBvdhv0WHD9jka+WYfenWRnYQqQL+cCdl7jrplJvnUZcWeRsr+kAtmhizl9zEvJyzbvEeBFo9rKjOff/0LlnT8fJncm5C3p5crmSFi/iL/6J2d1gCxAA3TCZXyL3h30AlKVlUJkuD4hTTT5WokIQDgWwY2mWFJZpsm0BvQvaiJzfmd+3XCN+i9HJRUSwtxKD26nxZgah06nbp9z2TupymWi6pOGv7Q7+2C2Uofe5+bVJ8iTKJivlP0+gOMB9oCe5DhDddQGdds1QJ5i8hptviucYkN5ilG+sZY4JXtfSmpgIjf2APgCgaID0aajoKbHbRVj8Qyr3QKJevlpCEADHDtBD8iv9OyyCmoBIu4ZVVoiIBw+hC8w3Re3jjQCky/0daypJVqa0jCuoj4onS1XUnyH7wIm9KDbynqE+PQCU8v0s4MsSsLy+HI8wWMVdY+8UMhVd0H+CtZw6QcXrljGgMWOz4QvqIIjlf7mVNzSAonybxaXIILIKb85uezQhkqIu1gDXoKR6Izb0Ox+ADvslQRtr77ts8giVE2w/ohLFneGiAmWf8RXABOwD1ShGwvZgscMF1x7DMj8hG4SdoEnEEo4VVAuI7g7pSZfMq59HD/xkKrMZW3A9cppiNa+PbVRdCc3RbaTw5cUskAfIJuw7tMBrck9eZ6HbF0I+8hYhpErhLIN5z+zyZ32nRoys6rEkXn+k1hKrKZ+zPfjcgEZTTT/4c4CUcAoANbL0Y2ridqLnzTFPohDop+Cck9ym8U3MFUxpwp677m4Uf9M9LaVOYoVvT7lfNIQ8J0zttoroKbmAN5P9i2zqjD1n7CJm8qMgEa/qSFraVGhu0meQTMPpJcIO1mgVncRg6vV4UFOWNNDdkEIzCpSYjRDaQuey5gdn5TDFbwerjwxKazOg93j0r/gEKIoYCabx7ent8UHS49MdgYVvlqaAySFIL0q4lJOKrLzpskEQ9hpwR2v8alwvkGrHcvQ4jOY4tDA/afYBSZcY19A/XcQW2XWVhmPDW4AGT8CV7//PxdPCWO1VkldaeYIZTIyjFHPIZ3gHnQcmtFYuloIRv6wSaEq2rg89rgBOf7tXYAJjldF0zA+vMUDkAXg2Dm9keMKsaAmaeOqUslVpG021+d6XnyYIjwsoARxqAL//J1oeLEONzJw48IHgD9ossGMEUF5CMnd8d/S8fyOhKLgsqb6Krx0qdTqvTAz0tqRCTq3Zc4TrOEBNM08vlBZwfE24gM+fYuRoXrDVHt+vCu1hvUAQfAKZDA8ueHfHXNVhe3lXGTy0+1G4GveiwPWj7C4G3ERvJqkQ7A3S0MUkTm4GR8bjTQE0BO1iwPuxWtoL16qqT49Y3rWPXV0kAPYjcJbYpN3c2FnzEondgy4LGqsG13o7+s30I0LIMKSOR/pggebAXrBhypgmlgqmDs0/U9mLmiRuug8ZNHerkD1rayAuY0NZs2GNXcl3PUweRQW2JyGbitTHQ4H3d6Kh77ccS9I+wxITLWoJBg1n2J4+nqbcVpj0emCn3R6Z/usloCCQlqYLRk8AVCNwFBRGDBVsM2ZD4F5Yy42nn0lDOypt9qT/dWO65PsIR7QdQkpIQtEhJW68/4NKuqpofjAnWqFKd/XBM1cSTyfL7y+EULuMQ6qSWN3nxJrEQvRU9QeScpepkfyLipRbN8u9ODBV10NWm7WgcRW9HDkcdVcaoOrRsHQ1V3emcucDvmwEwVSeQDyNDu/E9FV5inQ6ShBQqBXhjpPjkehlgE4hLhSE+Z+BOXlHEb3EbBsfffFFRP2QbkWX0EXzOXS4GcfEFDn+fo9f1g1u9BWZTLojX8w8+gqNDhZO+hkNOAWyA1yFeeRz61xPaSqE4k0ZO/D+c3HrCqOYjF1z3dsBtgpTNr32giZzYJ9MBYQU6r1bAvgAx/AH81ZAbBTeiW2rZgfiWxZKamR0KpLMqB2RTHkB/QxFnTRsvavhl908XnSQAYsJpWgRvYMdYO0jPxfErgAWcEwD6apXzC3YTuUcK/ewIddTwAjRuWmlchM3BljqHHXcsz8YON18ufMIzONJ589uK/9m+DjB3Hr8D1fHsl6UfR89vagsUGPvD21bbedy51967voE+oRwnKXuIKziqo89yJ7EAZzjXcMy0jyBtU0sH59KH2QF4gJyk8gc7j2FrXx3KTjT/SDl2V8Ot7TbTj1XKySnDxelNJ4WqkeoVssNzgyYWqT31Sddn0eob833/D24kADrHW16lzCIct11NzX4gsioBeMGzy9cuI+Msx132FOcNWX8zIEs+bgqd/FHzA2Ht3QdiUzDbud4aIiDpCbsTUux2mx7sMwFsqI/Gxx+5Li12HGR33wRGplREC+eOKiY0AQb2gmvMg+L5aFjmK+lcXAjf5IY+Ha6c4pajwbv0Pqg7H1DEQeY2q8Z8YKOHIwCiAqro3UuNb+LEtqpfUCu09GhfECXfOcmubpmFIyBXYFseCz6gdaaapnIRN1hJGLGwcfhlQqCIx5cYpJ+BBv9OCxLjp04kNTlwjJEjkyODHR1vgiGhlDi7u/2zYwUW0t2wTylx2j4TrPenykoZe/whzwsvd4qozFsbO5vIQ9GMVX36UOekoA1ODQODSNo+Mw8r9XQ3oX4sOLf23cpR9xl7VJL7J6YiwLYrHJPthycqGMdbdx1oPE8QR/0+51yIbBaLjQ2dUS0xvN2BAj26+o1VIYZ8vw8C1cJdOwRIq3b8rtjLySwKWPI8gM1wQE0tXUYuG/oHw4tgAvUOddhhmF39PWcmLl8IosuFVE2Wb09SLxkWhq18f6NXStB8HrX4nRGO+kXTTr6KMW8nJjzJlBjNWrj6PHaJcx1l2lW8nzZ36lBtp92lYjY0Zel9GbJlyEhOj+OKlUiRl+1C/LgellH5EpgCbxi/SH4QCaQxfe/WTDAIO2PbstcrQD923eA958uaGKBGI+YrnK7GK7M8YjfYyN0yxUvZtHO/UijJYlb6vUTu4BTN9QXsDUH/m6meXF0Im7iMKwM1ZAznN8Qh4JSKEwM2VvXI7UHEhIbCOaWRy4IpTLK3kYOAXl7/GhwttXpRud+dwPDd9GxkaxeRTY3P9o9GE5vsBkHW61VVoGGv9zEewFgKm5QwrJd68iNpl68eaS2xCL3hMjLOjWt5P9lvxBA7wO4CVfXndlLvfcJXN4KGrBBMCMUPH1rSkLv+VH67eFUZb5S5lwGZHvD78RHgVgM2khQAwBOARYkUxsVYy39zzDTcUT9GuZahacQ/P3O1kB9HhoH2HyEuLV7vX0L11iqf/0tfFGslgiaQV9jAU6ZW5yXM2eIInkksaw3FQ8lAlxfQx1VLP2A3A86uS2uqL4DMoiuxTR3iQ7bCs0UBiO1Xg+w3/99oIGNa8DCS4+UXaAfFtcwLFBhNqE9Lr4sB7wo5jx+T6Gv2CxXPFj6E9C4PXS32qT4Yh8WLg+c1OKny6eurUAvdsqH8DLmeqnKX7tpesosnhPNyYvcJELArqTF/8L3l+Kru/4J6hcUbfLzKyOK5uR1LTTZddFU+7cCBstqu8XkD/NYaw+RBehvCsZxpwTN9phAsntkEPUybGPTVtjXNbHWMXwYZXexccgU7R4KcJSuCZ7hcpNfe2CdMmRhLITTjpCrYXGh/e9CXjAhEqhvt+Jtu8e2Qicu0tWDzbwfL46tRyjeUqU9j9MwpFCSiyhRX4aHNzpeCCL0jDkwyfS+wBEQL3s8N3+PG2ZZHgwJgYMaI6efhGQqWG0L8jaLUDq+dXXz8vOblfjw5yinzU4fjYvWnXc9jsHf1+3x0udtnD5SuFaKNNz1Ctkh7n4nrB8/p8fDzNxmvKCihmPc6ghUr6oiMqvoOIn5s6GhdVuy6Z1IJ/uGQqsM4LBXvlpy0RgL0cpXO/SCa/AiNaR95aUYodap2Bu5aSFEJuXsirKt/fVeIu3A92pjSbLra11rIl/Cnqxghc3JiDeppecbVPsJxd7AcdyRsSLX02Z3cI01OqdXwU3I/8VtR9YGRgDPvTgwv4AH6JgbXb6aRfVMcDD7eFpwOvIxe+JY/aKH/61PAL4A9gFsAtCJ0pyfCdsT0f6BgRcrr7+osTkNSKa2G+9jtRxMFiL9OAif7DO9eZI4i9pobLMRW+BUMW7phq1qpwXb/UjWB/+cNtpijaNCRGbnIjUK7I/n77HAeDDHgAXVONIKralx2fmMbIwXoYygmd1OTxtEcMAivdFAxMfRvAFga5O093xKfmHefDUElz6DuHvySI3lIR3aQMN9CF0PA97D+lAtcnQ7uWDcFQEfVWyUPi7H0UsYAd7ABcsE8HxZBA2v035BPjRzn0xgoYIXjSMYAQr+DDz37+KAtQC+LALoJeCYxKMz9jycOBtoN7VbzcK2CmWNdnKrL8+Wds/NvdyivDdxWj9KrTwhx9VnKB3nJkKgbGc/+GVOvJmGLtF+IbfH8a4zKW0poKWVqTkvwd4wQcAiII/gLHgQPjmqj9gPN2A1KDXmXw4CPfBSz8X2GOldDjj7/cOalEHgAYiVUFzNRABsGCvZ30VWS4pSuVBaMrXeRyEkZFzE+Yd/7FrF1NTZmv7tUDLDUFjB71r6BWJRSlSxHrjEaU+gzjLz1Jb2H6xg0Mom694Ar8Za8Daiwp473ZFvjgjtSVGM8vP22CO3s6MNzEiSmx4O8iMKPKt6CIx0bnmB+WwTa+3xWC31OPRKuwDnQpmMpqzJye//48ist2gPKwpIdL3yA/UgndDlDBTvx+8fUEdbgAM8/dukwG4Ux21sKrkmTylRrhaBKfuSpAipk3W3M+cSq5W6RU/smX4ksXCdxyzK7gW1yIucjdJPHdinYaN8q0V6JHM5BK/HcWXHdCT2S1hOJJQwr71Htvhm1d2GZCPlT4akFMjkZ1GSHpDuBd60A/WE1KvlVvumizqzTFauJ714onW+J5zYibLvu66PSwRepZcfrmM2TSqX9+ZWtpPIX8XXQA+DDfUM7XUwlfNH/AJQXVFpbW456tl0hvE8EJ+gEeLtFs7uInnF7UbkeETAGnFk6o8WnKAzfreWTqBZnBIEGVxEXcxXuYCR2J0YsaIgKk67pFEgVHlrYSHOTd4wYOs4Ki3rvhYcyepWi8lgtHHghEJh4+Nv6iCZchX7oiFf6DG4AJ9kBvAHOPSDOKd7qCKseQMJ6pxVHBGWWvQPf89FjnGXm+A77ZlS4/behVcFUSaK3Qqlz9qGCFTw4WlWnVGTU12xRrvoD38J2CCXkCFTRnKFd9EkEm6TTDKjfJsAv7a6HlaYA3/ptD+e/E65gLPZ+6wMOMte2c2uzUqHsKvfrVOD4rQ1GWLIkF1K0alY69jOygC1JCD5V7YiEL3iVZTorLE11e2FS7CNjsMEuEZykYMZdgW33CcbyS5YKGesiQTx3e6h0+wigEf+sC+r9AlJcN5WboIF02pw82IK40p1bhJBiWN9fK1cUPQ/KcSEw1wZ0ZOuj52kZo4A4GRUGqcgRy8mcHFl3Kw+U+hB7zQR1+ow0MrUFr+L747KgOmWR8XPqRjsbcHIxIz/LBUybdP7RCM09jZA4Z2qeqY96d8uPoUkfeeDWnAmkVFceUK+WBIJQx423HlikqbkiskmTS1meZx03HQJoF41Q6lHjhxBwWXeIV2rVapHKNCTdjqUlpXqV4z1+hfhjzrtVvvnLx4hpNx3GeOW+wjPSdoAqGgwLVlmDYejrTHp53crlc+osWviGh/3k6YqqypzjHkjYkIIVuZynYbXMLbuR55gyp0nbPgTIGiSSc93D4Xk0ObQzmZkUODmVgVHn2sBcu4eQzbL+hYM16/lV+e8kBuBqbaPz5xcPwOfDwUS+32zTI23tSp3nZ3v4xSLBQ3lRM8F+2n8DVwlyvh/tXRFZIe87xEIKLmHhlt9Oe+K/ECcoxexmKdZcdXLYuc9ylf6+CApDky5wH14iznZsOhdbIjKB9MEPUtpQ4nQMMlVfS+jFxB48NjXbchLuqbcTyQUS3XYxEHq+lLXrpKnH578MtRxwxR6bh3rxJ+LEtqI/Pm2QwQUoKZTBupX/q1GBcwuu4rPLRHqD56OJNtG32Oe6I43CZn5T1WMwtoYrVG88Aropf19hSqHAGLHzCZv4SooB74kDk/rHLtpn0preC2PTsWm3MN14Q9L8oBz2J1AI594KX3R9PWvkC9zi08FgyNxyWsmyjezC1LsFPFIjA5NtDafDN9NPdnat+Z8FFzLh7gbe5jOZfKeElruQmWhc8PcKgQDMu45v4BCfFeAzTAoEJDcsB8PGTLVHX5YS6CsYaUKhu7jNO4kt6t3Io+6jzjZrSOCz/tb1vDZclA2vZ+lRNEfSKwVVF6em/qB6Bh541w41JsiCrHPt3uRl9ADqEK86AWoCftY7qmgqId+TIu8rZX8QJqWRrt5e4rerwFyw5C8LrvwTXgxSBZfZxzAgXhGiD7u1x8r80O6AO2VfQkL7gKF//yyxmLxbSZEh6wIqU0anTIcMRkwZkdH83tzbhwbLGPKsPMB7TVGmdBc5SN/mL7DPRx4DhYr5c2RNuYLrZESqc6k/3rMaPILZNMUa+LbyAPGPvh9QWZgD7gJceU9pux3+qTQhXXAk5eIV2Wwg0EpeUOcyq3xKSLDT7za4EP9YOTV3HtrOTmkAmlfDQ3XdM6MN260R+4qRK71OtFjeMIoBUXeJ9GJ4wZtQ56YlEzJnn3Iu9Z8uemSJCuZXr4JeCHhg/x8C2ybB3PoP0f/AuMYCK6VlxEAATAFABTG3d2iiq9tsudZvnXFH6IfKAj7/e4UAYevtqYqxlgpbuXQryvnPPtwms3y6vU8B3uyfn165KM0qDQo2MGXvLLzNbIcdEiqpipWXo7qx+4IxuJ+G+zB/THYQH9hmI/+PkIby7EieO2Ncy0JlErXO7YKNzICViLkilBXNUEvzk/nN4Lv+gwO/nA32HNzk8+v/UzQYt3+Z0jY2zBux1ZWB/LOBhGQHfm7qcFA1xgH+C4gMys7/CGM17HAMCm+9BY0HC7LqvP+XAoPFlyoqLLyPs7j4C9aCI3UChAD7FrGsh7mN0OLwcCkEJPzWMKbPTiUKys6K/5I2G+0x3WBz4YGzkexDhwgKo0w7D9DmyT7Xp7EId2tXVIeNfXRQdIv4eDbAaMhIABCGeDkdf8wbwyMKRl15kM9cFU7EkuqavyT7ByO3Nlxtx63Dp+vbWlGaAmeDXLxkVcjlCHfI1JLmltlxZWTOgPfLvapTHwk8gisdhYBa6hKRiAJ+Uqvr7O6d5TSaMdPJmhlot3rTbj2qL3cygn6B6bsISkoL140TbWcBNydTkqFbxJMwluwF4wBq5tqlAX3MYOQpvCG9f2U6RWYAn/0PwJbcW5oi9uXUDSJvXjoLgd0QC/f7y4GCYdLksVF5cBwib8/rSDYcMMXCfDJl2tqknmI1RfzJ5eOS4A5UKs3YHfpHfaMyJpouxYqMOvue+y+Cf0JohO5Zbn0tHX4VEmDZEk0gYlvhx1a32M1RG4MAeguA1kQpNhccpztOpcCBJpqiX7JRXslZRVePlT6IPkiBN1qT0Y/HPPCrv34jBbN7P++f2Kb2zVpHBaofmeuVpouB6/x4+jRaCCxNlWSRBWBUwB5cQOL88Ei0uvjB+aT0AOQC/zokLmFlehhyWKzHvlTJH3EX7KWWzLamvy7ctspabUFmhbvdyqa1ZBli/45dWUJmTfr1GKdH88wQM2c0pX6uWfWJM5ke08Nqx3EuMyv4hVMMFEPJEUJ2GB0TiwOD1oDml3egqK+1egTaN3NUsBTGVrQSGYG6UEVjOna/Z9mM2z6tX2/4DlnsqzXB0/UKOv4V1w0yGCrFEqt1roIQUYB+DjVeEj1gGpI+/7BmBu4kuwhAh9sy+SKzn8L1qn4IYEZi+TFvN/PUpyxAHxis5Uo3cf7NAdsCNkbM2xtCHX8b9Vp7cZRzF9Qh+fXXB+dDxsAzyJM2xbQF73BYxCg+YDr9BR3XJZvzuTcOKw4ULnNczLmQenv+FjUdulcdcNJ49uqajdMyPggJu/rt89eqdUQRYo69hq6i1fzTGAbdbws01aBaLw6H0EVTZN7/o7sycgMXb2y0pnCp2qkLTNaHaV8GkbuyOr7PRCdg/3ww2O54sFrHYi+WVchjE9FhdYRgXVwnnn9Kx8IxOQGcWoW9siYNO1+r98XxWngOSjfC9oTTasNFGFdA18F2Uw5KVGOJrqLuZye20cfdSDPQTUMVL4+h8e7HuE0GbmbT7g8ljQhvoSU+Feft0KHyaYaIGzohJr+ff76jTcNcq4d3YA1KYHxeAtAoeY9tM8N8hexVDYtKZU3nBtf6X92bAW9AUw8l1wQ4SKZw/83teeVHKD9Vr5lgrORyGL2G2uj/vTyZ5T8pSe3j7vBAxNYIn2Tv2dv0z8YOMaPgijnN1VmCNXEfAh+GeA6Ie+wYOKA6Mg7+XQiZoEZO8HRNxyDCHwV7RauZ1GDmwzHxBjna5SCyoAeGykdrkMK3hGbVHw9Su8sDdoM1RU6/k8ZAtZUgUKV9fmdab6Zy7jNYSVTeMeyg3YW0eqnjrLiKFt+eQBRuOtfCXc1w7QhUG6GVPFq1tjo3+pV5GZ3+ugXPDWa1Tf1DCNq+wBlV74JKgNmkp39TxRWb/dwl7PSpcFG31t7QN8975MXyaJ1Dss6NZlI8Wwp+qgHBB3W0hspJxyyhA+uIYX8OC8aZ/hZ96sUhZQG7nwlx4qRoxEvn+mAfZQAv7aaLfD07aceF7yTAzx56GL6vW8dCvIOl3HLqAMxc808Hp9J1qdhoM5KisJRCTvMa/9Q1C7rCS1eR812nG+QHc3ABax0LJiuzN29Cpqfv50MwAqmLjwYSeGeHkeBIOfS2K/jRDp1tUwSvVwOth727fqcI3c/Np75wPAEWffZYF95TPXyU4Oto6TZbGCWHN1f2yWyQQZlZbs5GHC652F5ZKRkJDkb34YlMyRZgdSh/fgBXJzi+c771lXtpqr0EPch6RgXe7vvys6mpGd2jjkSvEhkR64OwzIa9fd6dmB2ke7BO5a8AeMhBIiHgsRhz0zSZAEAoqgPOxh0bTvgLR7ot/ZVx/weuBoUBZSNMbAVB8RnJuCp/8tDaHYIEDDe+RKiR6THdZzeAWrjtuYDC1MYjPWI/5i91p0NZhtRe9kxwGPfn9w06l9HNwsy9fAXm0NVhVbxiOSi6k0Wl7ycQwRffluXKR47dkVJ1o7o66n9t4xTMraoR4YfcEkBXsQtWlQF5m3QPaS1QKto18O2Sqfbbzq05O6+w8c4KA/LfpubMPevdllNlYfzDU3F25I3oA4BMJfKUFKCDKpocWODDavGQW/tO0MfDs7yXK+F9QJk/pANHQdpylSbBE6jvwXQ1JR3P+w8v345muGOPu2nxaLXFiX936n9nGRdxk5ADdc74Ct0OItCXE7611XbWb9xe0FCgYu5duoHlZLanZ35NQYT3VCUNtWN9OL3P89/j6ldJFrXXnlraboKPOpg/Tkb+C3DnOv1iyvJVrX0ZqMXG/4HAGvBNutCFwO+C9P0hNjCPdJgIij5wv7/8lE8x4XXm3L7vc6chVYMboKMivBv68nPmQgF6AW7xz02n8Hz8MvCRY9BjtGYqW5QJsCrqB2CBcVBB6OIT1UMNcb7qdgB6shkIeGd7jHxz1vqfaf67L1LiEiEemP8+4C/zP5zRC+kB/2zZhJPC/QH0bY50TiE22eXLGd/0B5DWacwLzfhPiztK/SyvIwrgTBK9wnCf/77gzbLxm8n0ewD/TgVJZACRRKP6ugah1GyK9CXN8X8h8Pg/LCd61D5+9clJpXjzHUmdvv+tUbX5bkpvTyq7fUYSab3Cu2hCYef2e8K6n5D58nZBvcLVbEr331t/Enjka9ZodH8EgWKfkB7qkHJDYRDEKXalxAfuSCf0IV6IfpTcO4p7t97AQT+l7bsMgWbKUloB9pDtNTpQatmuWaiV2h88mxMpvk2+uy0/y/easgZm82d+0X2UEXCZQ0o+rn9GsI463mRCwy7sB2fPwbi+HR/I27WUAk9Snb0pPzSD+U5xxnidQCokJliDaceL07v0Jo4ebtfVhozUabkJPmhsqRgXpqdZhS3bK/IH4itQNyYAXYb0evh4yF1TjUCELoPOWrJcaICcogyTH6opWC32nFJ3dtoLpKWvv1UqPu2VTL8xptVBm6SwTgljS8naq/2h+N1T9hBWh/hcKjc7cxIKrq/IXeaGAaJ+w6hMgQd5BGM7srwYmoTES3jzyjW0ge5l8ThNb3dZnp36qSut1am8tzfM3PVLfPKROwJ9EpDaEv6CFksQ2xZ90ERxbaTcBkF36Kuv0O3Ga/K0hqRCGNIDp1TMZK6mEFS8cp5Wg3ckPUR04MsNZzax5dK7mwGlYa/vkV2Ki/YiOuEufrGK7kdQAzTMDJIadp9WIW9VWmFx4TsSwk5mxPUdjgHQCi+KA8KlrU9a7vOOM7CNUeX2j2TU8w+J/AdkEfZGB/oGJeU2bs7ZfmF960009Q2OdiewHHtPgSqIq1a9DvhDVg6er1or+EDKzgIo4QaA/m0PI0VKEeEB+o4PyOuj71EdXTrX8Don08oRngUGMbDp7WIkd0ESeN66+C7IyQgBA3MyfrQ1S5eubt1gt+DhS2aheGNliBZ+d44ipu4MTWOHAypwHcnkw+2sb8gjaauPVIvERDZKEwmc8XrzM+xCARGrPD7V+wgxG/qjVoCMefdmo6iBZdGZeP32UvOt6JLxbrAU+vQqzLieiKieAt+S6doED884G7ygf60ZN+nlFxZL8XGlgzKo9KIi+qqkLuNOjKMPHlho2ClpKhQUIbUF5rzhGHMkXbFjWox4utRwFOskKdFBBy5/DO2REby4a1zHwUeaQ5q35krYcFhBeKop5SwoYEHUdUsIpNXAlYvw8+0GM//fdtNYL/FkEUxRszozXv1v4wCkRmbp2JFwq5u2PfgTffaQ48mMbP+krQtos9mftsMgszX2d35nhAirpc2Vrs1V1P10e+wL1uEL1od76Ogmejcu9JHMN95tXwMj9nRtKW44w9+JJqsWP9Ad5wqlEyFgTYgYQ7zQ1WkcI4UxjTPf5z2T9cgD7gBVXALiGJmqiohJ9kkL6KGmhF42GYnF225BTZ4q561RKoFNLGM5OlFb50cn3GgFFiEPahCQ204TdlTSWnrvJjYS6u5+N9KjGuxCRYzObD9PtgoHVtwQc2v0D2Z7IM8P7UMckMGQaZWiUVfUmPRrRGfxswpS85tDnBNvptigMIONW844AxMGApXaqHx0IMYEjPFc1shRpc4F35i14ALdhM/kT5Sp6jBPJ8YhgHIrgxCq6u3ZQoGNOrj3ZCrckRntHALqr4MlnYro76PT4ygD82L3FD3ooNDSeeuugZrVZ40znKztHwMXgVcLXxw1cinS87fBLV7etqCZFVNkL6tMuijwTTSDUCiBeDQczGtpGvag1ojpYKEqOjk5NaTkrk1lZ7DcAgLW/3BLcEWCD9mcsFAK7GgaWoILGqvXr1WHgu7gVfGrnZDaSWxnB+uMw1vcyKQLk1R8ChwlOn0UwDaORcw57BkGi5Ta/5AvFPTc5Wjy/CjQao4BhSi7ATXpZfeOD4J2zLYPTm58kDcoAvAd9wEgAmNF39Aftos0Qu24d3+ihYAc/LkKUkkkotfejD4Ke8SPkVSaVFAeGO4l6LTm56hqU4ZWgLiYz1A62EwKnwvwxSvdDj0JB9UptesRM3QC0hmUzDXHKF2ZjKvHDMVapzqM1OTuAt0Tq7aytlIrzaaniTadvUr9/rFhMcbz8D/GIHk1WaLTaBbM6fRFVkyh0JNJnDJRN5N8mXKb82jX0VS+Cmp60MwHhEaJ/AFN+M7TZljbN5vrqW6WqWM1GU2vHKiQuwyJPlfcmTmGxvsggkC8UAxw+dTh/yzqjfc0hPJsyyL2FPZeyOIyL1tei78d2eHpZXFO9k5sbQMCFB9cq/5PhuD07hi/g8MpRYtPo5Txx1eR2l2ufLqB0TD02BpgzroNWg8gl/hnswmRQGY9GVmU7u7fgCpxQlRpThe2iKfMc5YeV1/WaFmc/CpRx82lVoyWCJ7DayBi8SyzV8YaJFgC6sxpXug4UMJAHfDPnuCrOANZrRCnNxxszbi5bgf07kBtAPQAUjmLhQuhEgFs2jLaO+pg5XOUH2COo1w4Db2SyKyvSykRkooE2/+it7r83LUKzWoyQIsnKPf58ZBbyAcegi8hPAHsAHJms5p3zGYLQfb7i5jpPMKXfV2l6aYf45dCBcxPXo2eCbdxA69WeT0sC/bIPkpV0aE8kvOULwmHYYSyh+DRRr2DvHPwEDNQDYH0aCd23hPeq4oLUkvv3IPEJLUWmq4COEaAGMwl/iX//4xZEgI13UmujDObrbuxyy1JZ47RC4oOgqXo2DfuhKebECgzjoXVradub7Mq9/CTFR491HH/zFco62y3SZfv8NvChEF2oq3NNWVLAqRWJGMiY4kdl2bQKWel3Deo7WkCBOAWVeNq0RlnHlbnd0TNH4KXT8QCYYtizcst6SlEaXzY7Qc7DZMwY6hAfoMgyadyvxgepeT3g20W2k94hn2LS3HrkQrVblQ4C6+qfg7IzJ5/1gxo0OT24GdPzJIYP6XYF6hXjPLa2V8Gl1u7udPM9hFutg/rkeCoeK6JybB6N+IJF/9gsz+uUM1FBJs4DYE9t4N/eaUw8w1g8JMUM/wRW5H6zVvhLypJGWVUAlT8Rui9bik86uNGrQMuRrLuz2Q52DNFQVur8IbRO3kJkqzPpGOd32IhvqPnLBVmzBChAMhbni89Zpic1dvg5tGuTtAyWF04XsKdf0Cvo3SozJ+CZfC8SUq3nKGtyL7tqPSF9AZeWKUC5YVFWemSGVKryfA7x2GsqE02QRlSr33AtPmgHGpAQiSvqgP0yQWkUcx1bfUc6W90z19lQm/y2HLcUVIFhAe/OuztO8VQwCpue6zlJ6BNVqe3BZwqSMTiJlSGSBZX49+HqsT2pvowkh6fmW/fXsl2ep3YgKed4u4X2Ew8zpPAsf1tL/gw4rgIl2IzFMDNNW6jJtIwH1tF3uO0sGPYMGN77SYY3a7NCAEBC4ZbuxYB+b6OBqBHmCAYKxHrZpuB9/IfFDnSRbTkpOwNOxKknZip0ROgKunIJfvNxFMGQ9RR/3oJD1WuqW8ZuA8tkasg8kdjM4hpAZBPsVnz11WWvoYbcrRWS51ql5QSMv+gViQ3Jsj9+RYZGq1xwJS1LYhuToNFLuxnZxPktbyGTwplA+yV56LcNJU5EYL8Zsq99jumKMdxNTnlbTN347sa/Sss8/GqpyZLv8CEfa8qUAL6UfoegLwZ1dMcK/Qvt9rZ/ndCCl0Nh3FtRDCpl8lCvMJHCslyNFnuZN+7yJm/yvi/SRBRroVAK+tixH+EBg7ufaqu8gD6i7o1Gc258l5WgKFzFjZ4QAiMAkifU9D0gKXFRaFEbo2/fxsODuKnpA6h6MeR8HeilJhVa/LfzCwE5TCNR+xps3RTPgFPeGd6qUD/9QbgpOoje6qI6h44spTvccKXINZaBTdI6+0Sj67v+9SWIZ6zsGWhf4OdmfKLsYWv06J8zukthAB2j13xTEmhw4XFbNv2Lx3FLx2gRJjlYDFq79wInzyTueePCit9kB96EMvbwynHf8gng4F+zjon39xtoYZqrMlGNX4ZzaR2/WlFAUXxuDRvVn55HTZ4/D+X1wObrs0MoWHhSYphjPucrD2hfABBzoVVrqW8Lb5r6UBSEImDzsw0NdB1awFmyxSUoKM76qg/VE4BYZTOoyuqTVNFQOwtoBuXFfcPbgF9yItTXUo9cud4PIvIAPsJ6So8hxuYmmteh04uN//L1+enHo22qkyPXT1N0YR9/Vec9g9WMgVAoW6hRPHBSNBHJp1xpie5FnnpI3/fDRC/LStmUJc9Fp7VKBgZUXHpj8tetZV31uVp2e/g1A2crFBFNTr5KVsr5mabQpXfIGrmzJTW6bXwEFjjhSWGBEX47X84ELvQmLhW3UIispM89QPnss5HdlsFs9HkEa+OP6AxfDEURg8aBxQf/RJUauFWD8A9VXnmERRqbUPH0U2+JhLmH7Q+pJQpCxcD+349ghGnmEnqK21zoW2PmGFrxMqonVz6uwzSqAYN5TzcpX6rx44KdNPfhmCZpq/uAeDp/GED+Qbc839AQdBaXJUT2VhVNvTPOI9+Lv3AvxhOHUF1ZIiA/Dcjif8zwW03c+ILjEYIxUovPOrtOLYtnCVMgiXwkuVAKdVo12xbCXFtM41q3hx2EMCCWNT+EdQHjkh+pD1KcjjDU7iPfV77pxK241kr8NzEC8Z0nogwtjZf7uHg8X6gMNwB5esoMS2XUuOHKek42F4a0IaeAMKtwX/vGvzzi+iU+MPFxOaQ1simwIOlvv9GhRBQEjLRANYLk6QPv6qw/VQJ33A4TQsQ0dElJswdnBaDEq/V2277egXiPYsIIZ+mnPCjTR1wPxn+BKgun0rkv73Lj5COFYfRirD4dqWrSWMnNX7qnhquyPVg/ySuA9bYG9/Vn2qZkpTl5pGQOjSgpWjRfR80ZD0JF8zDGtr1UV+PiN4BndNc3gUrmNkjVdCk+Z15EsHF2FgkU30otXGTcbv6Di9to4yVHzUb0OIgi1mS+oxEwe5VpWYNhUpa4gIIPV1/fhQSplMCZOpkLi7m7NbekPz/oQDUtwTvuS9udYTS2O/CoC6UOk09jnPPprqLDR6UU1ee3dghU0twiaoOZOtUjaxz0Z77vKgAGL4/HAYsJp5CYf36W9lghWcgylXsduV3zFjfipCvX8D7Sz9LAzWMqu8JlhRHp+cwyAcE/bXknVKHUlSo0AtPFOvmKTNxBIcwInORhWbURkdCOrGXZWciGPbOtMuLuLLDfDs/4mu+yQIoEZ+5PZ98Bj2s59tkhrsfWBX6GGPozlIBCaEo7cbC87cweg+GClkzVX7euMiKhgHY7dA3Bl/VX77am9pT+A1ljq9U0TOEO5UYJn/Oj65ElPeCVtm0ew70LlANJpQ7+AF79hpqZF41xS1kWe7GMwytR4ekk/CLGCdZOPQ9bIYxoLpskbhukfTwRm/h6SBLwAXxqpZ+58ndk5/6Jxpm5DKnjKM+UG+tEbnB2MvaESyUEk6vTSxe5ihZnyM64iR415U1URhVBJXi6+CzGhAsYnTMGQXyLJNIyNAfqO01BE0Ie7LAJ6XQ3tJJaBFzPyro1kdkpnER6AFJKZPmScRW3U+jOpu4lM5w3LjQs4C2Mg2+A1jCX3nZXRUPPcKMROQQtBti0c1JTxINPTjAbagew0P/l4fDqS4vw2J8oIxhrBHoxsJpfXyPuXXaFOzJPek1aQDfauOeeFtb0pqmFZfK3mX5HDsAllLycZHzFOocmXjc7YL3FN4qQApA9gsnTTtviA+yivne5T0yA+PFgPADlwNpIjhosM6jfCmZhaGPR8R5sV2pXxAabB3nJBZgrapUIbDPkVhDI+TTwkKsJOxTW/DgKRBHs/AjyhqplA6Tf8iJJrpWmYtaIclha7ofsBjApTyTjqgtwJivfCdZt8Y9GmZ/cPdXO8crnVWh8iPcmVB8WMl16jt8BihOsrk96Blv9xd/YxjgpG9l3dB6MgjoIrpmOHMQ9WDRfN+FGzlDry2voDmPDzV8HXy1JRualHDqvdtkcKK3InxvGtKA472AMqSKpPpVRduAW9ZXQEaVu8YvNSeQGcZryNjk/PDgq9Xy5k0ZRMTBZ3AmH8Vb1q5hfxBYdzSPZWcUg4V3UskDt3b/3x87L5CmJpgLl3AR8iN/X8jG9nxGAB5Mj5t2RhXh7bzFzhW1n4yCi3RXfGSRPrFsoOusi20JQtsgTKiJxNmjJ/InotqfUhvvWgC7fW9BRZnp6NgXgByRYnYGbkKvtSb1FWUGHXkw1wTqiwc4W63T3bixAlEDn7b4r3vx5Y2Z46SvB+0u74dFsv0/wxxWe7gIsWpQXh7UB9RMVc9jMzjsjerkI5YRIVQd7WOxfwk+L6OBiDCzvSWc54oVE/fYBqKTSraImQVjhDh8aI6eMiS9S9KS+qRPqlrMVSlk/k7Vyi8TsvZqsCbwTmTdcEMEyD39/9QBVwid/qfd8U3uaMb7RgThPY4ulCYqOhd+5s6HqsEdkutozJtPeMS5Jtykv3YzA+29LSUYwVFsiiOxwv0y4QUBTgV0pFKcVn4QKdUGzOdTdIdGrnbX8U7XrgAjyAAwDA3RBy7hM6j2p8YETM7LsgAYqRwht+51u5mvEu14vXNuYwOHEIQCXK5hX3me5m46MfArpXHKQ4To0/1SYv6WIjl59ty6WIMOSr4vdwShadh6wmmh8hR3dA7fDezf6RfTG5hH81z08LehvJgKUnqt0ZRGmD0DpHcCi/mvK7mumSbjvs0QMCIWpskT1IYv/zETRYgu2Ub1/xgSM6HGnNGhohqZxkvep9NdpM/Xmiu/YGgB9cNbH+kmMFP+ABwJT6LA20iWgSH7S6yS1WhclpayKwEG8FOA3YX4b60Oqwj0SI60DaujZs2rDjTeHqWlnpGAx/plZqojHoKVppiH4eJGNsJpyU4PWsdnH/zTBomFZh8oMeeZt8Ng3O0Scy0dNYJBAvrTLQKkLq0XHjdudZ9TjVORCY77SGVvxos70itX0G41To92IRaHMGfh1C9t3XhkDGf9thjjaRaszp6kAtk7HbghCO7PDP6IURn2aQOKBAM3HbYQ1JwibzZQN1WElB8DL6YKoYfIl7IMfwf4A1IAM99PIwmM2Dy7JfLqgoAYDuXynClfJMi1cGjACuTdVeD2zmNiN4ZULhuexkP5WJ3y+jiA+TWOgDJBeAJgfdFRw5u4hGNidxpzE3pVwU2+RHqheM7Y+9pUKlSD3GF4qf16YYreCEnFFqvAhyCCQCK8I+Pw6c3UDFpXLVdiiSRtKHTfsAdZxorn/p97GV/mJIYe1CKzJhJD1M/xF9gK+0oXSNxIvM/GMP48MFtOUsfdHdrAC+xmTgJeAq3u01+mATB65MrDRWwLe5YtvDsh8rsZvaixVdbWrHe0wrHmoF7Ok1mfKPFLOXEJAI3hMfgLFYvS7xDrBkhCS9coFGqhNitl3i82zwKm5fhT3Xoy9YsScZz20L+qoByhs3uhDYte3tAo3c147yApLBGtbwdfE7EC7PkD25PJgOxwMoSoJG8hqUwKOnqpGK8d/dChoAJnbQsIPkR8H2pGUq2KTTxpXTkPTSunyyWqZXPhHH0k50g0qxGmPRryMLjYSW6XyxK35GcL7JT+HeaKKyjN1hEl3E86QsnYhXm2o8QA7vlPEwDjR09rgU7iGp7uCjmayBl4AN/4eq2EXhtQS96WVGqBg4yxozsqXwV0nyIx8PggU/edYGYpipx8lKWL1NWj5k5NhpTZjJeF9WagheKetlhYJyq2v3wEWGMuzLDSVx+AFj4bCpQqnTL15Ys0tW4DZF6m9DRIb886F6rdY7JG5GMTvzkuaB1xAb2ogV0FEsYaPo8HLxZGgSYYyUEbt9MGka+BG6zjHoreXWhnTyCJvGwEUCAJYR2y8wRMnGMBe9M1NoH69lyzYs8A1Ep2PsHngAzdLDdgE0tX7adQFWAS+gAnj/XEy8+H/9slL7zM+Um9arV28gtPICq38O/i+FN2NXyXe9ZqG8YWut96mRBdwNgJtVj1HbmYaFqquO9xbs7lR+kXAAKmvzmr4S326kS0q2w4wjCAyucg7QSa4W57BLPRUF4sKn10uT3GBiSSrWOKEtalCK2X/OF0Lgdo1d8tTnC9H6xgkKO0tZ67Ojc2YN4paxOf86dORrXTkPm9QHRRR1A7Gb36ydF9gI/dj/r2ot3V7/pDrW9bRe34TWx/cX1YzE53JdLJMb1CjklXDTblVeqVojsQ6LkN3I4PVlhcnIdRB7qYy5pNKYrZlY09RZXVlwro9gu3kJ46UzXR+78TAxuTr1xdBcFBz3aJf7JO2B8BtTNd/nucM7PBeY4Lnj97nXId/mDp4sF26MO5HzMApsiR8/C1xBONfykexY+2PCBIwPaCCrAqDILUSNZJw/0F6LnGCKS8rypZARQ5Zw6JRGYbCQqqtYNBZfiH1QKAiqCRgbxlU4awj8HAHDJriH1CAt4splKrqJdCCgCyYg7JuGuRzGnebExlALn1EAtwIzGkMFXtEKeJpsObX83/pLm3JRjyLJUQ/fqyXAeX9hnApZa3BWI9qq2XSCAyZ8MPkSMPWtKUK/ZtK6M5tJq66LCopoIv+FmfYB8QXyU8F50XDxAdMB1ebGJjW4JzJYVuFwoexOzeFR1KJc+TyHsmybxj50OLW7+AQG5LsGC3CxWoFoy+fGRAJEzwGTHlIhFARaqQbPqlVALVx5fsF5C8fCcMTq2VX6l/jw4UXdPyUvmUYJ+efRBU6BwxNXWFG77MvYfaqP5auIFjJ3nBfQCvDXiAs5hGh2VciOJxguG92IByBDaRqN7DusAuKX6Wb7YGcsug7tejBMbY7+Wa7GexydoQ+fNoyCE+wFHC9Bl4b+CYwD22OL9ubOfzDxomdt5wjMjcKxnDe8kUWz5Se6+R8LZr2WF2gf/BGcaGqANFGSlfXXiaBk1hVmgtGGrZyN/7iKhrgAk6+phM/WK+XFeuCfFBpgIhNAFAw/0tT1Xos1qwFkyef6SiqIzipjXOZXVINmLaMqwal21BfAwiMqU/4n0xcAH7jRgwv8sHt8ExOE62l1B9nBh0xNcZjMsadH0OViU5NK4U4DTMMKVWCiWcaa84ULpFSV8g28MBeGRWPL69GH8kRa9s+I14YGXageFzECWR3rLhDZ2G+hSaHmuQQyrLJVj0NxvGZaR9KVDLOu/Q4/8l7MWru8t23GzusH7MUQElr+iNcXLmbF6FahRdZMqs2rVH0igIyJvFCZ+6GWYOgkYJyzZdfDKMqNAPJBOFoHdgoOz5DvDsd0TCTUuE8N4TGFJO/uMjWFkRIXTK34Ut8RmBSQ9t2dE4w7bjoyL6l9wJcd3wNSmy+cLAczpOrvKQcRB1cuOqwHSN+r2vhJGrZ3KdJ3G25izi4LnnnJ+sJK1bk65SGdgO9xzUivmLSDWrFNtqVE2r4hw6IGt/BHpZRBOcBYlH6c/tmHDyMx4AProARXPpJv/i3TralGufwD+l8PNUKn6HVczbrX45CBiyzznh0Q/OmpZhXlDV5dF+N8TGbWz3jIWv5OIXmBs/KkNL1rwdeOZSEXuMKy9egc0shQGjqPc6LfYA9sVFVekvWw0FxFrnYadhhvKVkHxmWoev98moou5YPJhm44zQaHlFMSGPsGKOuDd1MYNxdF864/+ueSmmKe43uJJ+aDMZ+lNIQPgFlBYDZjfqNa+8b0zLGji1pVgfFyGJ1eSoRgB7VqR3FgJuC9n2r2QiC1MCWgzNDzbkGFEoapOp4KA05tHYxPphfsPXqx9MhxtNevHhFDGCUcYaoJfMBAMAW1h9ku/HTpVR5t6h0nm6UnENhsZwOredOuZSUMJuGJuQZ26Grhe+5tCiDtvubdIGtPnvGwTeBnr5oHNY7h9juqtnM0194QNLAJ190/gERpcYztJEucYjRyGqlOb6E2hjrbnzo3sK0HtCxKdhahPQA/QLiPqSx8dewy6D+SkpAX9XwckglSx5IIjU7WhgSLMLyegvxbiyWKBDAWF7jysoqm7zMRwY+VbopL3ezJ1UXy6oXUW+obRe+YhLA4VuEe6AfIWThN1znF9wpDmL2MYcUO/vPWIdRfCm5gPsaWizCSqOjBll4071hXVAVN+tcrpvaSJewRsBurpBslJbo4xo2LAZgC19p2RtvzI8hZA+jgORpfhNqFZOXq5QrOzQJ7Q5bLeBjMxoR4fauvjXA0Vd/eXyx35yYiCa+W/0Bd4Rme481lLyJX5u9c2YtP/JWBStSOx5mvAqtw4qkiZYYXan840bx190ANoF40f/V0tbviqsURJA4EvYQhxmDkVIYcy7Ddq58P4Lo0Pqr51T4bpTenpa+ZIK0N6rTp9+LVhUevzXb6yrVmguyXjfGy9dZ4RPdgUvZn2DluXLWMwSLv3jfft4DTsDt9PDpMvtAwKND21fHt24zBA3jS+WQPEp6DsPbXaHx4Nb7pa9DAORM4ZheodV9VA2XFLU1EmHl+JVpKAq56iic1kNSTXxfcaT0jeANJodZVdIfQlFszVgsRIHPZfsHsG0i6EhdN7TLI/AQIuPZWGoNYC0Sa6A+EwOhzOzqRVAMRw3Ai5yr12QWtzEOD8onnunT3VhMK/J5+JsiFBNMaFY3TC+OXP1vsnXhFjhqUYTuWjgFclh0bwGyaD+QDCWXMacdAUVu8j6ybQXTZbjn8iqpiEw7BdsHQcXZbTgPUcJH4vvbiSq2X8DjZuCK0pdkG9m6RnpLh/8w6h+hiJncdLjCeBK8oYHQ5K9SgBSvIce4XNMRTuAidRNuKXmZHe2vy2RG1zYP186Ve1HTE98UJPwlKBDrbnIy3X/MuN/A8EiPcxQzneJxO2GdndDEzRHX4HGyzo+kpQJVj4BNVK26tIvp2vqzSdwVW9xLZHZ9+q4uozqEbwWH0FL0ttoJJucPihqjZ+6HM/qQaa1JVSbHjSek1HY1qb6ImWjPK5rSdk1lnD/ghGbUZB66in1qEVBPB7nUhKk8e+itdtuL6GuCW5QZ+iNeo6Phn4cKlrqUhbqXE0kIGxIJ0e+YwZbJMa13KvL+d54Ndd8eP8feGl60qcXE/ax6Y4L1ulD0TIFfxg4+4uk1p51Q/2uMyBcHFb+Xgwo33VNfDHjWk8JXW0RohPf0WYjPst5bPM+TcRAEznP4S0C2jNbuoNWpwJd5yP+SFQI3aftYbsTVdCovH6slFf36u4tqF0xaVR5Tqr9kWrBnH0x/d5DRXwyWstQ88bhu4PhHLZvCm1g6qtgs7yf9s9gMTD+yzwF6333mT2RdQgPLaW8Kpo4iQmyS09SG9umSbs4LIvA+cdj3/JEJai1jpyAfpBBeykAUxjlK6eMEZpgRqcMe8qL/2CSaVbxIpdRptn6GfqtQuxJ8I9oQE22nFE9wr1OKWMHgRd5z6wgA/rY7kSsFALWvofpa7d2Eb0O4amCu+jBTXJii4/O1nuf51TS1eb23x6mdJsfyT34v2St//4v336EzrM+20np3Q3sKLBLJ3FuA3ObMCDQtqHvhcUM7dnlhVdAVg9gYDRYLAo3+ZooG9uzbLNFJ/raBpNcKaLnUPl9efhO7qWKd+Tiqo3uGnhshUbKrOC+n6cVn1uiMb4WFQTpHMHofsBptWYDeBPFcuZjDC+8eMK/wOYChOn57X5hpFs9yCQhr5yo1WrzuU4xqXO5bzYm7eLhbo9pB9rSyWm20+fmy9TDkaqx1T3394bYNsrfvj2zVUjG7eUnqS1hZSDabDzNR5nFCyN8wX6B5KHezMV93xgmGrM/gXf3+IcxVvfoM/milANcOuHWCKdGt/mPET8Wv8CFZ2UAOo9Y++xoLq7zDJg+cwcdFP0GHfj1t6DDTNKeQLiX3cHmHTsD7wesfgde71VXm8BJ85lhgStgAFd7LW+wgCnusDxIPf7Mkx25UXKFNs/8TiUBV1qZ6ySGKG62kATy7tGoFV+/T4P8wkKiDzbCO4lk3rMOyAq64lizT78DBWMEEDUUS5mcfbGM8BRc5gcJoxjJlAfgJOpq0hDFfLTOfT1vwOnRdq5R+kD/8+ZGIXjIAswGyVKWyVQqXUGNp8sPySDvhpjGml99P17QVcQ+Glcu2Zsqkyt3zKGsNqj2eS6Zl0muR4rtAIVON5Z4lk9lWzrykzWG74RzR8gsYj179kaIgcpMZtYYNpa5QC7YOm0NuhttlyoJtgIsv2lBy1/JEZFwI3CPfAPoANbE9saZtUjFD9/MagjdV8XCQ9aKg20bCw643rCxEbwaSmYXsq+hhNZb1zIeWz2hMwYjmdBFZ6fr+NIpApOBeZ+QdMIqzliHClMGGvUOrD0zIHyDB42ogn88/cCwy7Q9m6BYSiYo18WTfCZePE89fzOC9sKKpzwZ62uJNh6umMQ+liGL4iBJD5iTfstTzPfIfVtkVQQaPW8TqHfNu7eqthHI1k8qWOIB9NHRvi9at7sZo5ObHJoAMEm3C3xYIsWxRXAPPdSB/sw9BKRgxh/UoMb8CmibdmOE+5tOQV3BYjwfhLuCYabGsBKjPspUZnIEaTrp9dpDMdulN5bVPoO863sY0oWN03ieDd4bKOxS9qcpIXW4QHfA73AEZQ/e2bcJqarEv0gkgMmYN6elPN4Lotp39Un4s9941rZ6ku3krywSu2j7Y3tPY0ByRf19ALqrwTAY82ufWVmUliju9R8Bw9W6U/5T4uca9TraJW3w93lSzD1Q+q/osLxkaKIwZ5SkC7d4oXtz8qiYGR6TMQy5y3SUHrL3j8tVT0fE22yyCHpwtw4+bcvsTvekTqiK9p4CxKWR8d7Ji1wrEAKweTS9AGoJdvUlNcMrKFk35y9NJsBw2txmDd8Uhk1GXiems1wIx/BXJyNV3ehyd+GmMtAEaxAgQiGmjCJUGPIXxF/2WjAlAcgdFKIEef3XstvXaAfwjY9m67L3L/nC4cxbePvjgnvDFQ3da6oWIxGsZNb1k0oBzQRjOHI07h2Qb9C/miglFgF+I7/rntqcg3L+jHNqKM4VwfSh9BrfGdpbQALAhGNNNcOfJuPhQhRMJ/YKwa7ENTrapjL05P55uiuvkTMMu2ssVS3mp0rGU9dwBGhkcN0hp82U8meufaktaOCMKroBTO9rjNXEX3x4NVgPzu9WcgHhLlf5gAPkwQkQsuw4WpQIgrv+WFFRZpSNNF6uIWpaHsmelz80Y9gWZx1T3GjHGjSCvUOoK7OsFYPTqm1i7aBjvDnppFzLACH5d1nHnABsVXvP6upoPfMk9jYAv7gACprHxy3b060ehheqwd6lGb0vPJHwGOPzp2/7NKSLxxUsOzLDd45HKvnmroNr2ioxiekfvcnIOu2sGYpzWtcqIv9ErpQK5bwRoKnseJxhWBd8ERKRvx1rIPvC6r1FimL/W5pBUYo7+qDYHVu4pkm7hu0oNFJXAt7TBsN3BDLsAaQ667Fw2dmT8z7oDjFuMBKeVylFYMI6iLfnk4egMOxyNkxbidwVdLLUw87NkvaT4mXnEy+pfuyTW+QIfCjK7CNAEUNMnfthzA3zOP+GaVE8HL0oMS6JX79EK7FgKzUcHNwtXBeV+w/UJKrQJtS2aUTJU59usljfQL9zH6O9UKaPW7DnRWxetShxEGfTGkM7x21jb8kBtahG3v650BmiwLbfgDD4oV/xXuCw9CpBxhUZqL76sdvOCVfO0MzeI0cmA66qrlArN4EbFG0wcossIfJne7SuBC7iXth3eNiintP6h+9/iYW1YbMtR2gXjcFr8xSSZ3yZj7jAXKk+HvgPtBWUMNwvw9XB/gch6+3kYVOo93HmB0HYSyCnwGgxmYWfQ5VzILPBnXTU1oi3zMOX6CHjdoWh026PWHhHl7gRmb+Fg/PzDdMPoVR77/xH3QDtxxz74P4j0OAzgPuScrJAk59TT9wVQNCGsh857GmMpzx2XUFuO35wb1x0jZRLrhVPRPFw8Mbt96EwVmcwUhufXn4r3IefP3UVqTe1pnrWcwRKTkF8KPnBaLIE9jHfR3IDPSbJZzFLkJqMbKK6CpY9rZIscYLvdKdWco6btygceul28PxlqmuEaA5y/GvAdNMJmmVpGLDAyFL19Ze+wTSHmOGPWk4Gc6MNqQWUTOcwGJNOivK/XJkqLZ2oQMSlIKoV/RZgBJ3uQxvsAz5RZ0Wz8UzSz5lkvhoHha8O1eixwoozvy+lNbTMSfR2G7qCu8qjE9uE5VQjrTzLlcRbucX6/zBp/4VhXD4RIq1KEawEp+pcvGsMRE9yx6WbTM8E7fUsfvNEUnXOhsZ+FDxhSZH9p8eXlWa92voK9w4CDD2o8cH+EU4D1LpWkbKtbImb2nOw5tGQ5JRlwr0Flwrn3uhQV53pAZFq9DP8HelyOKgNAFtF7OZtxnVBLssU/UpZK9kINCGsX7LNUx6VdwA7AkTxzugk98OMkMa5eSSstyIAHDDIDDESdKrEB7uS0KzEZAECwfEg5qBANaT9FPgqnNLrpHH7dtMFb7rjK/GIPBVOOjXg95v/AdCy6z3ns/j6tbBa7/obIBYA0YROe6mWEbyQw49Rks0NUv1Kg4Br5F262lfFX5FSr1eRyjzaVtk3IAeLkQ5SDUerRtjsgv+7UD/InP7QxPG2AYeCsAs7RNeU/tdW0mkPMRP6QPPP4r8I8vs6BOuKMY434kMAtcgOOb4Kh6UMgZBDi43F+xsRVlVDMHI3gUZuL+s3Jz3PyJVi1Qc66v4IxYbIuvg+3uSGy7Y/oHBj9e3yHYSEirtR4w1tSktVnc0KGHvIhrdqQHdJQ5ouF8Juw24SEJ8JLgRQ+wqWy21MFiYgDUalNMiUqwfRjrTw2hJ0UmHx62j+Zb58F6rNUdDB9+EFnissJAcQOSLAIxlMKJwSguFS+FxcvLVYpvWjuk7z4srRswV6pjl47YE2udSfFN+8Lst9YuMbV65NAHLMUo/FSuBwk0wBpYYpIgAIjaewWpHwL6Qw5wYdc1XEWF/9jL14AVEAanx9xlMjJb/Y27f/W+JPtYz1mmLT5kQhwmGl5Yulbuay4r2J7SCY9Jq+5pg1k+DBsO1cj4vEbjrg+Oc2CNNXA8WAijUsmor6Bww3rAVtIMr8u1ng/b8Jmlm0A/kORI2p/Yd5kEM57grbgeyEVMIqoC5Nq2a7HHiQSoouUqbmJ0jyOglPcw6EMhTNCs+oVX8S4VcO2belYR7SuMsnuP+fBgYWhrSlzKnHqSvsca2GV3rZiD1KyG9jEK4qK1LyvCXZVxuFVx3PqIgapSJZv/Bv0QyZtaQvfem/8TXzB2kmd4i5V90TbvoHzq14WHC9A8Mp/D/KUW0n9Xb4Bb2frUyU7oByMj3e0xXzAc3XMf0VDibWdwQMD7zT2EA3CS/xjvZsHr1074C9oh/+/z5x4fDob/hqo3gSuNVCFlp7ZG/7mmw2b53C1JQiymYKxWa0PJ/sYBNT8+QqJtga4oTDUYrDg7aLHLphBwEyjdJT/dTuXUqXuOCRueBl55zHHFmBYlSeSXI36iXaGMEyV+Z5HYrGpjbYgQd51zMbES/4ZNeGzxgbExaFmforqZeeljo7FmmRfyGWKpyKr+OKodYLaUIl2lBrPGryUvm0+9IkAWsJOhC32N4J1ufv1ZYHScwPwF4a3iRohotj5RfPEPpGACVh+HpF1A75ImzL+4ctE1KSrmfmHenS3FbiZtmdwvv7/tv5D6kIWGXNtwoKa2Ltdttwt9G8TqZvd+TMgEOUeFqY9R0AZrGnk0Sqyk7zQIxB6ulPrUKndlneA9vCMbeFADey+vNl/piU8njaom/zhicGzS8sfwgC+RM7EWH8aBU6zk0bFW4pRvvf6QYReelejbJ66mZhL2fzG0Z8hsQgF/rzXnQo8XjfVaBIoltZr/I3SsmIeDF79wphJYadns4mThUCurEPbj4xr3gtCV1ZBVZ96kTKrxKJOhyG/Q8X/9VpClBen7TgQ8mElClutm6U35Fn8EYtGrsaIlN5B5RAx54vq4HLUOVrEoJ4rvsrHWAnitQMXhK5jMcpRjvja1hAIcIOJ9M0EGYAQxFNNTEonrO1Ro7s/Qcpt1Nzy/R8xEImudi00YdB0HyPzDYEnngAw9joRlrGYFjJ49kxqDrVoHCQaJkxjJq23MA716XxljXCjbSErW3YvTeIajwJuaNpNmDiFT6xKQv3QW681oMhtM0zbgS7ahGS48QTcW7uMe7MPwu5YBmLBzEJ8c30FLUfifgvQJpCsJCL17Xbobk3MpzOXR+TBch+Pyltvj35po4qlQ3n86BysgAqgBGkDTnwvJ3FWLw3OsNHQ7Sg2EIgOL5znM9pnvQsMED+AVBsVfc1cvIK0gMMN8eONRoQwHL8ipj/GgTiZY6Sus/7i1SGQiSQDcEgLiSLe1BsMOAdF5MMyXoUFYG0HsfsstckMJVlTv+Vzqdy/sBzLRkm2vhiSxFPXNgt5t2To9f40Indlp7mtZNOs3uZzBizdOGmXwR6g83NBu+uZRLtEtd/wXbXcWP7s9vK+eAajz7/kyxbyqrk820d04PMHGQadkc+bPvaBuFkY2hyv52IXJja4G7N+S6wCN4cZ+rOzlHWxW3iFHBqPEss3Bi2R66XuxeWbauci8yQUsqmGSWT1JartH3nVtLlg90QDBTmQWVyX0L907cMVnUV6eGnMiChbBi2ahYk2avVaYJ++hLHBeE3JvAmacG3DQPeA1XV1AgChEugFS2FyPr2U23N5FQ1/nov3jXzq5m17po4r3r5cxihDwi7riKxnSvzy1OnbXmAtEiBYjwfin9BzN9PZ06Kk1CyA/NHH/uV6W2v6rr96n65h4B6p+83gbkkbeWrF67rqjnwP++l2AFAllmtK5Ifz7jUHt4Lv8xmd8xq+EU9DJlkcvVbwHKKP05r4LXPWMzuLDnJI6XIyHn3y8N9F3fBuAKnEMlmV+6X0gME2kmZ9V5gNqbz20G9QFaNCABRLcz75NAuKb9L+iPzoYi6815TVSSYw8oPIwqYn4N4xzMwAMA0A8BYCYm1NIzo6nvfn2N+6Up/Tqd0itf17Edud9f28PJABS9/bVlhvxXH+uDWufjWx9LGb9dxcNaA0OABIiMQDA8FyQ8irQ4PaGifkgYWCkPKSXYbjJb0MML4TdI5I0zlX4hpWHT+J5QBqoCzW9jT/9mONP7u/9/ddwh/LbNH1o+k9/DjR0zMtZ3fh8PsUBts8Xc0T2unnMDXmlp5pivodej4pEfLuYbVHXKR3dkK42RH99pLFPD9DI7Du9ladmfp3efqBjUeVfqnnyFwHglw6JAcC/F+6SJOOl8ZTl3AEAKshAEPDLF76ytLKC9zjzDIerrJdtJEFiwWtFlPmXvAJEOO3ESuDAdpNYWRE5rfEKjnmEpwtxPonpgHsmcIzXOzM+n8hK5oFyaTgbqx2oKX6ITMtC2SvHwO9AdkwyzkFbom4mJpoDt8dTXiOuuy1lOYkROGDsV4iuPWgrG02t1iCUwfAcio+GmG6ZlWJPQuJpOC3jMUR6bGn+OPEtGX1iiVQmOqI3lHAoZnHa2gKZ3y97pSUOk4jNx1D0jOvPAUR7V6mPnobEtnvL7m51d8su+ZMq7smO98bdcnb/+N0jT9PuGTfuqYm7PW3x5brb291tc3d6b6Q2QhJbv2yC7e0tgMBWOfEAM+LbxWyrGGZJrNSNUKuqs2wbmjmgjMle8QuIDrakwyCfmMjifqz5TEbR4cJU6AUHIlcDCiswP5BgscL6QBkWKsIP5KBRDJbL6+UpJUmxz/QuQIC1iq0IacCMbgyIQKuHHm0aNODfauxdU88rkJP7aaAGQ8Ghr1hbBz42+jHVtWydWmEy95YSVD0zEUOjNHXfNO5+cUHv6OHomjmecAxNVaQm/sAzNuQBL/2oaXRWjBfmzGbfUQkTA9H6jtlh87RLzLDPKSqiksnWXiniGMrz+GwLTTQNlJdpSqgKeyc04AwABwFbY2bmENRwF3uaXHCnWTIXR/7i3PdFylHMNwGU2yn9oVu14yYuNPU1g2fPuKvx3HnZI8AZ+7wwaUxDjdFOq6t2mriQFvIdMEEnz8PNfTjbiToaPcBxnkNiyOfb07vFYdv78uxWKssfYiJ197edT74Hd1bMsNMaXgBdHc+bePoGRrpX3tE+3Wqd2Wp6yqT5vhbX8YnU2wVniY/ybmamNH+Xcuece69TMXt1SIUldIC/QrNbd9pmNrnftFsiO4c08O6dqhuV7Fdo9rx7vjTfvty+gD9qT/Ky+DX/M2pShJjRDG0jxpbAtSEfrZ15kga0Lehqb3AoihGeJrLmPc+MJg0ZZQEAr29ajw11Fx44Yyq1hvZvMOnasymKVtNfcF5wjRCu2//6YCLuPC4vBXXRvXQXHaXf0KfoaRqnY4dzO0T/l1Q3HJrR00FJTV/NGsXp4/RJ+jDto4G+PYLWI15gO93TsypQ3WC0T90jlb7eFkLRwpGDlNBr6dMq2mB2Kx101nrEBKG5EdpLb6SE0h6i7pKm1XQpKHHsY7Z2jgboHuqi/dTqe2z02jRkLa+0L9w7kcpn7668aOapCNEjbaQddF+tLrtL73OiR1/Oh7tL0h+/CMXQQ3wdeMXhLOgSPQq6YtSMCIbAYcCfNyw5AA==) format('woff2');}
:root{
  /* 主題色由 JS 寫入(會跟著信心微調)。這裡是 JS 跑完前第一個畫面用的預設:深色=炭灰(ash),淺色=藍裂(crack,見下方 html.lt),
     都是兩組主題在 toneT=.5 的值(改 px.js 的 THEMES 時一起改) */
  --bg:#0e0e0d; --bg2:#050505; --panel:#171716; --panel2:#111010; --ink:#dcd7cc; --dim:#8a867e; --line:#000000; --rim:#2c2b29;
  --btn:#1d1d1c; --btnInk:#dcd7cc; --acc:#bcb6a9; --accInk:#0c0c0c; --hl:#ccc6b7; --gold:#b4a98e; --good:#98a58a; --bad:#c0604f;
  --info:#8e9aa4; --sat:#a08c9a; --barA:#2a9d8f; --barB:#e9b949; --hud:#080808; --hudInk:#d6d1c6; --sheet:#d8d2c4; --sheetInk:#121212;
  --vig:#000000a0; --app:#00000030; --hudHl:#e8dfca;
  /* 舊變數名稱(遊戲內文字串會用到) */
  --paper:var(--ink); --brass:var(--hl); --seal:var(--acc); --blue:var(--info); --edge:var(--rim);
  --fz:16px; --fzs:12px; --fzb:24px;
  --pix:'Cubic11','Cubic11Full','Noto Sans TC','PingFang TC','Microsoft JhengHei',sans-serif;
  --read:'Noto Sans TC',-apple-system,'PingFang TC','Microsoft JhengHei',sans-serif;
  --sans:var(--pix); --mono:var(--pix); --serif:var(--pix);
  /* 像素框:四邊各 2px、角落留空 */
  --edges:0 -2px 0 0 var(--line),0 2px 0 0 var(--line),-2px 0 0 0 var(--line),2px 0 0 0 var(--line);
  --bevel:inset 2px 2px 0 0 var(--rim),inset -2px -2px 0 0 #00000060;
}
html.lt{
  --bg:#e4e1d8; --bg2:#d6d1c8; --panel:#eeebe4; --panel2:#ddd9ce; --ink:#1c2640; --dim:#4f5b72; --line:#2c4778; --rim:#c5bfb2;
  --btn:#e6e1d7; --btnInk:#1c2640; --acc:#3c598e; --accInk:#f3efe6; --hl:#2d4782; --gold:#72571e; --good:#245a3d; --bad:#922f20;
  --info:#284c86; --sat:#5c3e72; --barA:#2a9d8f; --barB:#e9b949; --hud:#202c4c; --hudInk:#ece6da; --sheet:#f3efe6; --sheetInk:#1c2640;
  --vig:#0000001e; --app:#ffffff40; --hudHl:#b9c9ea}
html.crisp{--sans:var(--read)}
.ph{display:inline-block}  /* 結局文字的詞組:只在詞組之間換行(手機上不會把一個詞拆到兩行) */
*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
html{background:var(--bg2)}
html,body{height:100%}
body{background:radial-gradient(ellipse 100% 75% at 50% 25%,var(--bg) 0%,var(--bg2) 100%) fixed;
  color:var(--ink);font-family:var(--sans);font-size:var(--fz);line-height:1.75;
  -webkit-font-smoothing:none;-moz-osx-font-smoothing:unset;font-smooth:never}
/* 底片顆粒+暗角 */
body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:90;background-image:var(--grain,none);
  background-size:192px 192px;image-rendering:pixelated;opacity:.7}
body::after{content:'';position:fixed;inset:0;pointer-events:none;z-index:89;
  background:radial-gradient(ellipse 85% 80% at 50% 45%,transparent 55%,var(--vig,#00000099) 100%)}
canvas{image-rendering:pixelated;image-rendering:crisp-edges;display:block}
button{font-family:var(--pix)}
a{color:var(--info)}
#app{max-width:560px;margin:0 auto;min-height:100vh;min-height:100dvh;display:flex;flex-direction:column;
  background:var(--app,#00000030);box-shadow:-2px 0 0 0 #ffffff08,2px 0 0 0 #ffffff08}

/* ---------- 抬頭 ---------- */
#board{position:sticky;top:0;z-index:20;background:var(--hud);color:var(--hudInk);
  box-shadow:0 2px 0 0 var(--line),0 4px 0 0 #00000070}
#scene-wrap{position:relative;overflow:hidden;background:#000}
#scene{width:100%}
#bd-top{position:absolute;left:8px;right:8px;top:7px;display:flex;align-items:flex-start;gap:6px;pointer-events:none}
#bd-name{flex:1;min-width:0;font-family:var(--pix);font-size:var(--fzb);line-height:1.05;color:#ece5d4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  text-shadow:2px 0 0 #000,-2px 0 0 #000,0 2px 0 #000,0 -2px 0 #000,2px 2px 0 #000}
#bd-name small{display:inline-block;font-size:var(--fzs);line-height:1;margin:6px 0 0;padding:4px 6px 3px;color:var(--hl);background:#000000b8;text-shadow:none;letter-spacing:.04em}
#bd-team{flex:none;font-family:var(--pix);font-size:var(--fzs);line-height:1;padding:5px 7px 4px;margin-top:2px;background:#000000b8;color:var(--hudInk);letter-spacing:.04em}
#bd-team span{color:inherit!important}
#hud-btns{display:flex;gap:6px;flex:none;pointer-events:auto}
.hb{position:relative;width:26px;height:24px;border:0;background:#000000b8;color:var(--dim);font-size:var(--fzs);line-height:1;cursor:pointer;
  box-shadow:inset 0 0 0 2px #ffffff14}
.hb:hover{color:var(--hl)}
.hb:active{transform:translateY(2px)}
.hb.off::after{content:'';position:absolute;left:5px;right:5px;top:11px;height:2px;background:var(--bad);transform:rotate(-38deg)}
#bd-mh{position:absolute;left:8px;right:8px;bottom:6px;display:flex;gap:6px;flex-wrap:wrap;pointer-events:none}
.mh{font-size:var(--fzs);line-height:1;padding:4px 6px 3px;background:#000000c4;color:var(--hudInk);box-shadow:inset 0 -2px 0 0 currentColor}
.mh.dep{color:#8ea0c8}.mh.adhd{color:#c9a35a}.mh.bip{color:#b48ac0}.mh.rel{color:#c98a96}.mh.str{color:var(--dim)}
#scene-wrap.compact{background:var(--hud);padding:8px 8px 4px;display:flex;flex-wrap:wrap;gap:4px}
#scene-wrap.compact #scene,#scene-wrap.compact #floats{display:none}
#scene-wrap.compact #bd-top,#scene-wrap.compact #bd-mh{position:static}
#scene-wrap.compact #bd-top{width:100%}
#bd-row{display:flex;gap:10px;padding:10px 10px 6px;align-items:stretch}
#bd-face{flex:none;margin:2px;box-shadow:var(--edges),0 0 0 4px var(--rim)}
#bd-grid{flex:1;display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.bd-cell{background:var(--panel2);text-align:center;padding:5px 2px 2px;margin:2px;box-shadow:var(--edges),inset 0 2px 0 0 #00000080}
.bd-cell b{display:block;font-family:var(--pix);font-size:var(--fzb);font-weight:400;line-height:1;color:var(--hl)}
.bd-cell span{font-size:var(--fzs);line-height:1.6;color:var(--dim);letter-spacing:.1em}
#lamps{display:flex;gap:6px;padding:2px 10px 9px}
.lamp{flex:1;text-align:center;font-size:var(--fzs);line-height:1;padding:5px 0 4px;color:var(--dim);background:var(--panel2);letter-spacing:.06em;
  box-shadow:inset 0 -2px 0 0 #00000080}
.lamp i{width:6px;height:6px;background:#ffffff18;display:inline-block;margin-right:6px;vertical-align:1px}
.lamp.on{color:var(--ink);box-shadow:inset 0 -2px 0 0 var(--acc)}
.lamp.on i{background:var(--acc);box-shadow:0 0 6px 1px var(--acc)}

/* ---------- 紀錄 ---------- */
#log{flex:1;padding:18px 16px 28px;display:flex;flex-direction:column;gap:16px}
.yr-body{display:flex;flex-direction:column;gap:16px;margin-top:14px}
.card{--tone:var(--dim);background:var(--panel);color:var(--ink);padding:11px 14px 12px;margin:2px;
  box-shadow:var(--edges),var(--bevel),0 6px 0 0 #00000055;animation:in .32s steps(4);overflow-wrap:anywhere}
@keyframes in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.card.gold,.card.bad,.card.good,.card.info,.card.satire{box-shadow:var(--edges),inset 0 2px 0 0 var(--tone),inset 2px 0 0 0 var(--rim),inset -2px -2px 0 0 #00000060,0 6px 0 0 #00000055}
.card.gold{--tone:var(--gold)} .card.bad{--tone:var(--bad)} .card.good{--tone:var(--good)}
.card.info{--tone:var(--info)} .card.satire{--tone:var(--sat)}
.card h4{font-family:var(--pix);font-weight:400;font-size:var(--fz);line-height:1.3;letter-spacing:.1em;color:var(--tone);
  margin:0 0 9px;display:flex;align-items:center;gap:9px}
.card:not(.gold):not(.bad):not(.good):not(.info):not(.satire) h4{color:var(--ink)}
.card h4::before{content:'';width:8px;height:8px;flex:none;background:var(--tone);box-shadow:2px 2px 0 0 #000}
.card:not(.gold):not(.bad):not(.good):not(.info):not(.satire) h4::before{background:var(--acc)}
.card h4::after{content:'';flex:1;min-width:16px;height:2px;background:repeating-linear-gradient(90deg,var(--tone) 0 2px,transparent 2px 6px);opacity:.45}
.card p{font-size:var(--fz)} .card p+p{margin-top:4px}
.up{color:var(--good)}.dn{color:var(--bad)}.hl{color:var(--hl)}
.up,.dn,.hl,b{font-weight:400}
html.crisp .up,html.crisp .dn,html.crisp .hl{font-weight:700}
.statline{font-family:var(--pix);font-size:var(--fzs);line-height:2;color:var(--ink);background:var(--panel2);
  padding:7px 10px;margin:10px 0 2px;box-shadow:inset 2px 2px 0 0 #00000090,inset -2px -2px 0 0 var(--rim)}
.statline b{font-size:var(--fz)}
.trait{display:inline-block;font-family:var(--pix);font-size:var(--fzs);line-height:1;padding:5px 8px 4px;margin:6px 8px 2px 2px;
  color:var(--hl);background:#00000040;box-shadow:0 -2px 0 0 var(--hl),0 2px 0 0 var(--hl),-2px 0 0 0 var(--hl),2px 0 0 0 var(--hl)}
.pf{float:right;margin:2px 2px 8px 14px;box-shadow:var(--edges),0 0 0 4px var(--rim)}
/* 學年標題:像章節 */
.yr-head{display:flex;align-items:center;gap:12px;margin:8px 0 0;font-family:var(--pix);font-size:var(--fzs);line-height:1;letter-spacing:.16em;
  color:var(--hl);cursor:pointer;user-select:none}
.yr-head::before,.yr-head::after{content:'';flex:1;height:2px;background:repeating-linear-gradient(90deg,var(--rim) 0 4px,transparent 4px 6px)}
.yr-head span{padding:5px 2px 4px;white-space:nowrap}
.yr-head:hover{color:var(--ink)}
.yr-block.collapsed .yr-body{display:none}
.yr-block.collapsed .yr-head span::after{content:' +';color:var(--dim)}
.yr-block:not(.collapsed) .yr-head.has-body span::after{content:' -';color:var(--dim)}

/* ---------- 操作區 ---------- */
#act{position:relative;z-index:1;background:var(--hud);color:var(--hudInk);
  padding:12px 14px calc(14px + env(safe-area-inset-bottom));
  box-shadow:0 -2px 0 0 var(--line),0 -4px 0 0 #00000070}
#act .title{font-family:var(--pix);font-size:var(--fzs);letter-spacing:.14em;color:var(--hl);margin:2px 2px 10px;line-height:1.6}
.btn{display:block;width:calc(100% - 4px);background:var(--btn);border:0;border-radius:0;color:var(--btnInk);
  font-family:var(--pix);font-size:var(--fz);font-weight:400;line-height:1.4;padding:10px 14px 9px;
  margin:4px 2px 10px;cursor:pointer;text-align:left;position:relative;
  box-shadow:var(--edges),var(--bevel),0 4px 0 0 #000000a0}
.btn:hover{box-shadow:0 -2px 0 0 var(--hl),0 2px 0 0 var(--hl),-2px 0 0 0 var(--hl),2px 0 0 0 var(--hl),var(--bevel),0 4px 0 0 #000000a0}
.btn:active{transform:translateY(2px);box-shadow:var(--edges),inset 2px 2px 0 0 #00000070,0 2px 0 0 #000000a0}
.btn:focus-visible{outline:2px dashed var(--hl);outline-offset:4px}
.btn small{display:block;font-family:var(--sans);font-size:var(--fzs);line-height:1.6;color:var(--dim);margin-top:3px}
.btn small b{font-family:var(--pix);color:var(--ink)}
.btn.main{background:var(--acc);color:var(--accInk);text-align:center;
  box-shadow:var(--edges),inset 2px 2px 0 0 #ffffff26,inset -2px -2px 0 0 #00000050,0 4px 0 0 #000000a0}
.btn.main small{color:var(--accInk);opacity:.75}
.btn.main small b{color:var(--accInk)}
.btn.main:hover{filter:brightness(1.12)}
.btn.warn{background:color-mix(in srgb,var(--bad) 22%,var(--btn));color:var(--ink)}
.btn.warn::before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--bad)}
.btn:disabled{opacity:.36;cursor:default}
.btn:disabled:active{transform:none}

/* 骰子:骨色點數骰 */
#dice{display:flex;gap:12px;flex-wrap:wrap;margin:4px 4px 14px}
.die{width:40px;height:40px;background:#d5cbb5;display:grid;grid-template:repeat(3,1fr)/repeat(3,1fr);padding:6px;gap:2px;position:relative;margin:2px;
  box-shadow:0 -2px 0 0 #000,0 2px 0 0 #000,-2px 0 0 0 #000,2px 0 0 0 #000,inset -2px -3px 0 0 #a39880,inset 2px 2px 0 0 #ece4d3,0 5px 0 0 #000000a0}
.die i{display:block}
.die i.p{background:#1c1916}
.die.six i.p{background:#9a2e23}
.die.used{opacity:.22;transform:translateY(3px)}
.die.active{transform:translateY(-4px);outline:2px solid var(--hl);outline-offset:4px}
.die.roll{animation:roll .5s steps(5)}
@keyframes roll{0%{transform:translateY(-12px) rotate(-90deg);opacity:0}40%{transform:translateY(0) rotate(18deg);opacity:1}70%{transform:rotate(-6deg)}100%{transform:none}}
.abrow{display:flex;align-items:center;gap:10px;background:var(--panel);color:var(--ink);padding:8px 11px;margin:6px 2px 10px;cursor:pointer;user-select:none;
  box-shadow:var(--edges),var(--bevel),0 4px 0 0 #00000090}
.abrow:hover{box-shadow:0 -2px 0 0 var(--hl),0 2px 0 0 var(--hl),-2px 0 0 0 var(--hl),2px 0 0 0 var(--hl),var(--bevel),0 4px 0 0 #00000090}
.abrow:active{transform:translateY(2px)}
.abrow .nm{width:80px;font-family:var(--pix);font-size:var(--fz);flex:none}
.abrow .bar{flex:1;height:10px;background:#00000080;position:relative;box-shadow:0 0 0 2px var(--line)}
.abrow .bar i{display:block;height:100%;background:linear-gradient(90deg,var(--barA),var(--barB))}
.abrow .bar::after{content:'';position:absolute;inset:0;pointer-events:none;
  background:repeating-linear-gradient(90deg,transparent 0 calc(6.25% - 2px),var(--panel) calc(6.25% - 2px) 6.25%)}
.abrow .bar em{position:absolute;top:-4px;bottom:-4px;width:2px;background:var(--acc);z-index:2;box-shadow:0 0 0 1px #000}
.abrow .val{font-family:var(--pix);width:58px;text-align:right;font-size:var(--fz);flex:none;line-height:1.15}
.abrow .val b{color:var(--good)}
.abrow.capped,.abrow.locked{opacity:.38;cursor:default}
#act .row2{display:flex;gap:10px}#act .row2 .btn{flex:1;text-align:center}

/* ---------- 開場 ---------- */
#start{position:fixed;inset:0;z-index:50;overflow-y:auto}
#hero{position:relative;overflow:hidden;background:#000;padding-bottom:64px;box-shadow:0 2px 0 0 var(--line)}
#fx{position:absolute;inset:0;width:100%;height:100%}
#hero-in{position:relative;max-width:560px;margin:0 auto;padding:34px 20px 0;text-align:center}
#seal{display:inline-flex;width:58px;height:58px;align-items:center;justify-content:center;font-family:var(--pix);font-size:var(--fzb);
  line-height:1;color:#ead9bb;background:#922c22;text-align:center;padding-top:2px;transform:rotate(-3deg);
  box-shadow:inset 0 0 0 3px #922c22,inset 0 0 0 5px #ead9bb99,0 0 0 2px #000}
#start h1{font-family:var(--pix);font-weight:400;font-size:48px;line-height:1.2;margin-top:18px;color:#e6dfcf;letter-spacing:.04em;
  text-shadow:3px 3px 0 #000,0 3px 0 #000,3px 0 0 #000}
#start h1 em{font-style:normal;color:var(--hl);display:block;font-size:36px;letter-spacing:.12em}
#start .sub{display:inline-block;color:#b9b4a8;margin:18px auto 0;font-size:var(--fzs);letter-spacing:.08em;line-height:1.9;padding:7px 12px 6px;background:#000000a8}
#scroller{position:absolute;left:0;right:0;bottom:10px;width:100%;height:48px}
.ver{display:block;color:#8d887d;font-size:var(--fzs);margin:12px 0 0;letter-spacing:.08em}
.ver i{display:inline-block;width:8px;height:8px;background:#922c22;margin-right:8px;vertical-align:0}
#start .wrap{max-width:560px;margin:0 auto;padding:26px 16px 60px}
.pane{background:var(--panel);color:var(--ink);padding:12px 14px 14px;margin:2px 2px 22px;box-shadow:var(--edges),var(--bevel),0 6px 0 0 #00000055}
.pane-h{font-family:var(--pix);font-size:var(--fz);letter-spacing:.12em;color:var(--hl);margin:0 0 12px;display:flex;align-items:center;gap:10px}
.pane-h::after{content:'';flex:1;height:2px;background:repeating-linear-gradient(90deg,var(--rim) 0 4px,transparent 4px 6px)}
.pane-h small{order:3;font-size:var(--fzs);color:var(--dim);letter-spacing:.04em}
.field{margin-top:16px}
.field:first-of-type{margin-top:0}
.field label{display:block;font-family:var(--pix);font-size:var(--fzs);letter-spacing:.14em;color:var(--dim);margin-bottom:8px}
.field input{width:calc(100% - 4px);background:var(--panel2);border:0;border-radius:0;color:var(--ink);margin:2px;
  font-family:var(--pix);font-size:var(--fz);padding:10px 12px 9px;outline:none;box-shadow:var(--edges),inset 2px 2px 0 0 #00000090}
.field input::placeholder{color:var(--dim)}
.field input:focus{box-shadow:0 -2px 0 0 var(--hl),0 2px 0 0 var(--hl),-2px 0 0 0 var(--hl),2px 0 0 0 var(--hl),inset 2px 2px 0 0 #00000090}
.seg{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-top:12px}
.seg button{background:var(--btn);border:0;color:var(--btnInk);font-size:var(--fz);padding:9px 10px 8px;cursor:pointer;text-align:left;margin:2px;
  box-shadow:var(--edges),var(--bevel)}
.seg button small{display:block;font-family:var(--sans);font-size:var(--fzs);color:var(--dim);margin-top:3px;line-height:1.55}
.seg button.on{box-shadow:0 -2px 0 0 var(--hl),0 2px 0 0 var(--hl),-2px 0 0 0 var(--hl),2px 0 0 0 var(--hl),var(--bevel);color:var(--hl)}
.yrbtn{width:44px;flex:none;background:var(--btn);border:0;color:var(--btnInk);font-size:var(--fzb);line-height:1;padding:8px 0;cursor:pointer;margin:2px;
  box-shadow:var(--edges),var(--bevel)}
.yrbtn:active{transform:translateY(2px)}
#odds{display:flex;flex-direction:column;gap:8px}
.odd{display:flex;align-items:center;gap:10px;font-size:var(--fzs)}
.odd .on{width:78px;flex:none;font-family:var(--pix)}
.odd .ob{flex:1;height:8px;background:#00000070;position:relative;box-shadow:0 0 0 2px var(--line)}
.odd .ob i{display:block;height:100%;background:var(--acc)}
.odd .op{width:38px;text-align:right;font-family:var(--pix);color:var(--dim);flex:none}
.oddsnote{font-size:var(--fzs);color:var(--dim);margin-top:10px;letter-spacing:.03em;line-height:1.75}
.oddsnote a{color:var(--info);margin-left:6px}
/* 角色建立 */
#look{display:flex;gap:16px;align-items:flex-start}
#look-stage{flex:none;width:148px;display:flex;flex-direction:column;gap:14px}
#look-face{width:144px;height:144px;margin:2px;box-shadow:var(--edges),0 0 0 4px var(--rim)}

#look-opts{flex:1;min-width:0;display:flex;flex-direction:column;gap:7px}
.lo{display:flex;align-items:center;gap:6px;font-size:var(--fzs)}
.lo span{width:26px;flex:none;color:var(--dim);font-family:var(--pix)}
.lo b{flex:1;text-align:center;font-family:var(--pix);background:var(--panel2);padding:4px 0 3px;min-width:0;white-space:nowrap;overflow:hidden;
  box-shadow:inset 2px 2px 0 0 #00000080}
.lo button{width:24px;height:24px;border:0;flex:none;background:var(--btn);color:var(--btnInk);cursor:pointer;font-size:var(--fzs);margin:2px;
  box-shadow:var(--edges),var(--bevel)}
.lo button:hover{color:var(--hl)}
.lo button:active{transform:translateY(2px)}
.lo i{display:inline-block;width:10px;height:10px;vertical-align:-1px;margin-right:5px;box-shadow:0 0 0 2px #000}
.mini{display:flex;gap:10px;margin-top:14px}
.mini .btn{margin-top:2px;margin-bottom:6px;padding:7px 8px 6px;font-size:var(--fzs);text-align:center}
.tog{display:flex;gap:10px;margin-top:16px}
.tog .btn{margin-top:2px;margin-bottom:6px;text-align:center;font-size:var(--fzs);padding:7px 6px 6px}
/* 成就 */
#ach-wall{margin-top:4px}
#ach-head{display:flex;justify-content:space-between;align-items:baseline;padding-bottom:10px}
#ach-head span{font-family:var(--pix);font-size:var(--fz);letter-spacing:.14em;color:var(--hl)}
#ach-head b{font-family:var(--pix);font-size:var(--fzb);color:var(--hl)}
#ach-head i{font-style:normal;font-size:var(--fzs);color:var(--dim);margin-left:8px}
#ach-bar{margin:24px 2px 0;padding:10px 14px 9px;background:var(--panel);display:flex;align-items:center;justify-content:space-between;cursor:pointer;user-select:none;
  box-shadow:var(--edges),var(--bevel)}
#ach-bar span{font-family:var(--pix);font-size:var(--fz);letter-spacing:.14em;color:var(--ink)}
#ach-bar b{font-family:var(--pix);font-size:var(--fz);color:var(--hl)}
#ach-panel{display:none;margin:14px 2px 0;background:var(--panel);padding:6px 12px 14px;box-shadow:var(--edges),var(--bevel)}
#ach-panel.open{display:block}
.ach-grp{font-family:var(--pix);font-size:var(--fzs);color:var(--dim);letter-spacing:.2em;margin:16px 0 8px}
.ach-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(66px,1fr));gap:8px}
.ach-cell{position:relative;min-height:60px;display:flex;align-items:center;justify-content:center;text-align:center;padding:7px 5px;margin:2px;
  font-family:var(--pix);font-size:var(--fzs);line-height:1.45;background:var(--panel2);color:#ffffff2a;cursor:pointer;overflow:hidden;word-break:break-all;
  box-shadow:var(--edges),inset 2px 2px 0 0 #00000080}
.ach-cell.on{background:var(--sheet);color:var(--sheetInk);box-shadow:var(--edges),inset -2px -2px 0 0 #00000030,0 4px 0 0 #00000080}
.ach-cell.on::before{content:'';position:absolute;right:4px;bottom:4px;width:6px;height:6px;background:#922c22}
.ach-cell.sel{outline:2px solid var(--hl);outline-offset:3px}
html.lt .ach-cell:not(.on){color:color-mix(in srgb,var(--ink) 34%,transparent)}  /* 深色用的半透明白字在淺底上看不到 */
.ach-cell.new::after{content:'新';position:absolute;top:0;left:0;background:var(--acc);color:var(--accInk);font-size:var(--fzs);line-height:1;padding:3px 4px 2px}
.ach-detail{margin-top:14px;padding:10px 12px;background:var(--panel2);font-size:var(--fzs);color:var(--ink);line-height:1.85;min-height:54px;
  box-shadow:inset 2px 2px 0 0 #00000090,inset -2px -2px 0 0 var(--rim)}
.ach-detail b{display:block;font-family:var(--pix);font-size:var(--fz);color:var(--hl);margin-bottom:3px}
.ach-reset{margin-top:12px;font-size:var(--fzs);color:var(--dim);text-decoration:underline;cursor:pointer}
#byline{margin-top:28px;font-size:var(--fzs);color:var(--dim);letter-spacing:.04em;line-height:1.9}
#byline a{color:var(--ink);text-decoration:none;border-bottom:2px solid var(--rim)}
#byline a:hover{color:var(--hl);border-bottom-color:var(--hl)}
.seedline{font-family:var(--pix);font-size:var(--fzs);color:var(--dim);margin:22px 2px 0;line-height:2}
#seed-show{width:118px;background:var(--panel2);color:var(--hl);border:0;padding:4px 6px 3px;font-family:var(--pix);font-size:var(--fzs);text-align:center;margin:0 4px;
  box-shadow:var(--edges),inset 2px 2px 0 0 #00000090}
#btn-start{margin-top:6px;font-size:var(--fzb);padding:14px 10px 12px}
#act-toggle{display:none!important;margin:0 auto;position:relative;z-index:21;background:var(--hud);border:0;color:var(--dim);font-size:var(--fzs);
  padding:6px 16px 3px;cursor:pointer;box-shadow:0 -2px 0 0 var(--line),-2px 0 0 0 var(--line),2px 0 0 0 var(--line)}
#act-toggle:hover{color:var(--hl)}
#act.collapsed{display:none!important}
/* 浮動數值 */
#floats{position:absolute;inset:0;pointer-events:none;overflow:hidden}
.flt{position:absolute;font-family:var(--pix);font-size:var(--fzs);line-height:1;white-space:nowrap;padding:4px 5px 3px;color:#e9e2d2;background:#000000d0;
  animation:flt 1.4s steps(8) forwards;box-shadow:inset 0 -2px 0 0 currentColor}
.flt.up{color:#9fbf7d}.flt.dn{color:#d9705a}.flt.rp{color:#d6b062}
@keyframes flt{0%{opacity:0;transform:translateY(6px)}12%{opacity:1;transform:none}75%{opacity:1}100%{opacity:0;transform:translateY(-14px)}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
@media (max-width:380px){#look{flex-direction:column;align-items:center}#look-opts{width:100%}}
/* ---------- 角色建立(picrew 式) ---------- */
#mk-top{display:flex;gap:14px;align-items:flex-start;justify-content:center;flex-wrap:wrap}
#look-face{flex:none;margin:4px;box-shadow:var(--edges),0 0 0 4px var(--rim)}
#mk-side{flex:1;min-width:120px;max-width:200px;display:flex;flex-direction:column;align-items:stretch}
#mk-side .btn{margin:4px 2px 8px;padding:8px 10px 7px;font-size:var(--fzs);text-align:center}

.mk-note{font-size:var(--fzs);color:var(--dim);line-height:1.7;margin:12px 2px 0}
#mk-groups{display:flex;gap:6px;flex-wrap:wrap;margin-top:16px;padding:0 2px}
.mg{flex:1 1 0;min-width:0;background:var(--panel2);color:var(--dim);border:0;cursor:pointer;font-size:var(--fzs);line-height:1;padding:8px 2px 7px;margin:2px;box-shadow:var(--edges);white-space:nowrap}
.mg:hover{color:var(--ink)}
.mg.on{background:var(--acc);color:var(--accInk)}
#mk-tabs{display:flex;gap:6px;overflow-x:auto;padding:10px 2px 10px;scrollbar-width:thin;scrollbar-color:var(--rim) transparent}
#mk-tabs:empty{display:none}
.mt{flex:none;background:transparent;color:var(--dim);border:0;cursor:pointer;font-size:var(--fzs);line-height:1;padding:6px 8px 5px;margin:2px;box-shadow:inset 0 -2px 0 0 var(--rim)}
.mt:hover{color:var(--ink)}
.mt.on{color:var(--hl);box-shadow:inset 0 -2px 0 0 var(--hl)}
#mk-opts{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(calc(var(--tw,72px) + 14px),1fr));max-height:360px;overflow-y:auto;padding:6px 4px 8px;margin-top:4px;
  scrollbar-width:thin;scrollbar-color:var(--rim) transparent}
#mk-opts.mk-colors{grid-template-columns:repeat(auto-fill,minmax(56px,1fr))}
.mo{background:var(--panel2);border:0;padding:6px 4px 5px;margin:2px;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:5px;
  color:var(--dim);font-size:var(--fzs);line-height:1.2;box-shadow:var(--edges)}
.mo canvas{display:block}
.mo:hover{color:var(--ink)}
.mo.on{color:var(--hl);box-shadow:0 -2px 0 0 var(--hl),0 2px 0 0 var(--hl),-2px 0 0 0 var(--hl),2px 0 0 0 var(--hl)}
.mo.sw i{display:block;width:100%;height:26px;box-shadow:0 0 0 1px #00000080}
.mo span{white-space:nowrap}
/* 抬頭:大頭貼+2×2 數值 */
#bd-face{display:block;align-self:center}
#bd-grid{grid-template-columns:repeat(2,1fr);gap:8px}
.bd-cell{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:4px 8px 3px}
.bd-cell b{order:2}
.bd-cell span{order:1;line-height:1}

/* 網頁版:開始畫面外觀(左)與基本資料(右)並置 */
@media (min-width:980px){
  #start .wrap{max-width:1100px;display:grid;grid-template-columns:minmax(0,1.08fr) minmax(0,1fr);column-gap:26px;align-items:start}
  #start .wrap>*{grid-column:2;min-width:0}
  #start .wrap>#maker{grid-column:1;grid-row:1 / span 8}
}
/* 遊戲中的大頭貼:網頁版在主欄左側放大半身像(頂部改為四格數值) */
#side-face{display:none}
@media (min-width:1180px){
  body.ingame #side-face{display:block;position:fixed;z-index:15;top:24px;left:calc(50% - 280px - 30px - 272px);width:272px;
    background:var(--panel);color:var(--ink);padding:8px 8px 12px;box-shadow:var(--edges),var(--bevel),0 6px 0 0 #00000055}
  #side-face canvas{display:block;margin:0 auto;box-shadow:var(--edges),0 0 0 4px var(--rim)}
  .sf-name{font-family:var(--pix);font-size:var(--fzb);color:var(--hl);margin:14px 4px 6px;letter-spacing:.08em}
  .sf-sub{font-size:var(--fzs);color:var(--dim);margin:0 4px;line-height:1.6;letter-spacing:.06em}
  body.ingame #bd-face{display:none}
  body.ingame #bd-grid{grid-template-columns:repeat(4,1fr)}
}
/* 像素小人已移除:編輯器不再顯示小人預覽 */

/* 結局半身像:與捏臉時同大(256px) */
.pf.big{float:none;display:block;margin:6px auto 16px;box-shadow:var(--edges),0 0 0 4px var(--rim)}
/* 壞結局的遺照:木框本身就是邊框,不再套細框;底下一道硬陰影 */
.pf.big.memo{box-shadow:0 5px 0 0 #00000066;max-width:100%;height:auto!important;image-rendering:pixelated}  /* 遺照約 320px(整數倍裝置像素);窄螢幕時縮到欄寬 */
/* 頂部:場景縮減、大頭貼放大,數值改直排在右側 */
#bd-face{align-self:flex-start}
#bd-grid{grid-template-columns:1fr;gap:6px;align-content:space-between}
#bd-top{justify-content:flex-end}
#bd-side{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}
#bd-side #bd-name{flex:none;white-space:normal;color:var(--ink);text-shadow:none;line-height:1.1}
#bd-side #bd-name small{display:block;margin:5px 0 0;padding:0;background:none;color:var(--dim)}
#bd-side #bd-team{align-self:flex-start;margin:0;background:var(--panel2)}
#bd-side #bd-grid{flex:1;gap:5px}
#bd-side{gap:5px}
#bd-side .bd-cell{padding:2px 8px 1px}
@media (min-width:1180px){
  body.ingame #bd-side{flex-direction:row;flex-wrap:wrap;align-items:center;column-gap:12px}
  body.ingame #bd-side #bd-grid{flex-basis:100%}
}
/* ---------- 閱讀式排版:內文清晰字、加大行距、減少框線與雜訊;像素字只留給標題、數字與按鈕 ---------- */
body::before,body::after{z-index:0}
#app{position:relative;z-index:1}
html.crisp body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
html.crisp :is(h4,.yr-head,.statline,.trait,.up,.dn,button,.bd-cell,.lamp,#bd-top,.flt){-webkit-font-smoothing:none;-moz-osx-font-smoothing:unset}
html.crisp .card,html.crisp .card p{font-size:16px;line-height:1.9;letter-spacing:.02em}
#log,.yr-body{gap:24px}
.card{background:none;box-shadow:none!important;padding:2px 2px 0;margin:0}
.card h4{margin-bottom:8px}
.statline{background:none;box-shadow:none;padding:0;margin:10px 0 0;color:color-mix(in srgb,var(--dim) 45%,var(--ink))}
html.crisp .card [style*="font-size:12"],html.crisp .card [style*="font-size:11.5px"]{font-size:13.5px!important;line-height:1.75}
.card [style*="color:var(--dim)"]{color:color-mix(in srgb,var(--dim) 50%,var(--ink))!important}
/* 主題色修正:選項區改用主題面板色;頂部(深色 HUD)上的文字一律用 HUD 字色,亮底主題也看得到 */
#act{background:var(--panel);color:var(--ink)}
#bd-side #bd-name{color:var(--hudInk)}
#bd-side #bd-name small{color:color-mix(in srgb,var(--hudInk) 60%,var(--hud))}
#bd-side #bd-team{background:color-mix(in srgb,var(--hudInk) 14%,var(--hud));color:var(--hudInk)}
.hb{color:color-mix(in srgb,var(--hudInk) 65%,transparent)}
.hb:hover{color:var(--hudInk)}
/* 頂部右欄:核心六能力為主,次要數值(學年、年齡、綜合、聲望)縮成一行小字;高度與大頭貼對齊 */
#bd-abs{display:flex;flex-direction:column;gap:4px}
#bd-abs .ab{display:flex;align-items:center;gap:7px;font-family:var(--pix);font-size:12px;line-height:1;color:var(--hudInk)}
#bd-abs .ab span{flex:none;color:color-mix(in srgb,var(--hudInk) 62%,var(--hud))}
#bd-abs .ab i{flex:1;position:relative;height:6px;background:color-mix(in srgb,var(--hudInk) 14%,var(--hud))}
#bd-abs .ab u{position:absolute;left:0;top:0;bottom:0;background:var(--hudHl,var(--hl))}
#bd-abs .ab s{position:absolute;top:-2px;bottom:-2px;width:2px;background:var(--bad)}
#bd-abs .ab b{flex:none;width:2em;text-align:right;font-weight:400}
#bd-side #bd-grid{display:flex;flex-wrap:wrap;align-items:baseline;gap:3px 10px;flex:none}
#bd-side .bd-cell{background:none;box-shadow:none;padding:0;margin:0;display:inline-flex;align-items:baseline;gap:4px}
#bd-side .bd-cell b{font-size:12px;color:var(--hudInk)}
#bd-side .bd-cell span{font-size:12px;letter-spacing:.04em;color:color-mix(in srgb,var(--hudInk) 55%,var(--hud))}
#bd-side #bd-team{padding:3px 5px 2px;font-size:12px}
#bd-head{display:flex;flex-wrap:wrap;align-items:flex-start;gap:4px 8px}
#bd-head #bd-name{flex:1 1 auto;min-width:0}
#bd-head #bd-team{flex:none;margin-top:3px}
#bd-abs{flex:1;justify-content:space-evenly}
#bd-side .bd-cell #bd-age+span{display:none}
#bd-age::after{content:' 歲'}
@media (max-height:719px){ #bd-side #bd-name small{display:none} #bd-abs{gap:3px} }
@media (min-width:1180px){ body.ingame #bd-abs{flex-basis:100%;display:grid;grid-template-columns:repeat(3,1fr);gap:6px 18px} }
/* 年初進修(擲骰分配)不參與捲動:手機與中寬固定在畫面底部(確認後收起);寬螢幕放在主欄右側空白處 */
#act.alloc{position:sticky;bottom:0;z-index:20;overflow-y:auto;padding-top:10px;
  max-height:calc(100vh - var(--hdrH,260px) - 8px);max-height:calc(100dvh - var(--hdrH,260px) - 8px);
  box-shadow:0 -2px 0 0 var(--line),0 -6px 0 0 #00000080}
@media (max-width:979px){
  #act.alloc{padding:8px 10px 10px}
  #act.alloc .title{margin:0 2px 6px;line-height:1.45;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  #act.alloc #dice{gap:7px;margin:0 2px 6px}
  #act.alloc .die{width:30px;height:30px;padding:4px;gap:1px}
  #act.alloc .abrow{padding:3px 10px;margin:2px 2px 4px}
  #act.alloc .row2{margin-top:2px}
}
@media (min-width:1180px){
  body.ingame #act.alloc{position:fixed;top:24px;bottom:auto;left:calc(50% + 310px);width:min(320px,calc(50vw - 326px));max-height:calc(100vh - 48px);
    box-shadow:var(--edges),var(--bevel),0 6px 0 0 #00000055}
  body.ingame #act.alloc .abrow .nm{width:74px;white-space:nowrap}
}
/* 配色依裝置深淺色自動(深=炭灰、淺=藍裂);能力條固定鮮明漸層(兩種配色共用);淺色時首頁文字改深色 */
#theme-sw{display:block}
#bd-abs .ab u{background:linear-gradient(90deg,var(--barA),var(--barB))}
html.lt .abrow .bar{background:color-mix(in srgb,var(--ink) 16%,transparent)}
/* 宣告網頁自己支援深淺色:三星瀏覽器「網頁有深色樣式就優先用網頁的」設定需要這個宣告,否則會強制變暗(淺色主題的標題被改成淺色、canvas 背景卻不變 → 看不見);瀏覽器內建捲軸、輸入框跟著遊戲主題 */
html{color-scheme:dark} html.lt{color-scheme:light}
html.lt #hero{background:var(--bg)}
html.lt #start h1{color:var(--ink);text-shadow:2px 2px 0 #fbf8f1,0 2px 0 #fbf8f1,2px 0 0 #fbf8f1}
html.lt #start .sub{color:var(--ink);background:#f7f3ebe6;box-shadow:0 0 0 2px var(--line)}
/* 能力條(頂部六條與年初分配):單色鮮明青綠;突破潛力上限的那段與現值改金色;上限標記與上限數字淡色、現值亮色 */
:root{--abC:#2fb8a4;--abO:#f2b53c}
.abrow .bar i,#bd-abs .ab u{background:var(--abC)}
.abrow .bar em{background:color-mix(in srgb,var(--ink) 55%,transparent);box-shadow:none}
#bd-abs .ab s{background:color-mix(in srgb,var(--hudInk) 50%,transparent)}
.abrow .val{color:var(--ink)}
.abrow .val small{color:var(--ink);opacity:.45!important}
.abrow.over .val{color:var(--abO)}
.abrow.over .val small{color:var(--ink)}
#bd-abs .ab.over b{color:var(--abO)}
/* 遊戲內的「重新開始」確認框(取代瀏覽器 confirm) */
#rs-modal{position:fixed;inset:0;z-index:100;background:#000000a0;display:flex;align-items:center;justify-content:center;padding:16px}
#rs-modal .rs-box{background:var(--panel);color:var(--ink);padding:18px 16px 14px;max-width:340px;width:100%;box-shadow:var(--edges),var(--bevel),0 6px 0 0 #00000080}
#rs-modal p{margin:0 0 14px;line-height:1.7}
#rs-modal p small{display:block;color:var(--dim);font-size:13px;margin-top:4px}
#rs-modal .row2{display:flex;gap:10px}
#rs-modal .row2 .btn{flex:1;text-align:center}
/* 信心低於 22(憂鬱症風險開始上升):頂部信心列轉警示紅 */
#bd-abs .ab.warn span,#bd-abs .ab.warn b{color:#ff6b5a}
#bd-abs .ab.warn u{background:#e8473a}
#bd-abs .ab.warn i{box-shadow:0 0 0 1px #e8473a99}
/* 全力衝刺:鮮明但不負面(橘金),其他 warn 按鈕維持紅 */
.btn.warn.sprint{background:color-mix(in srgb,#f2a03a 24%,var(--btn))}
.btn.warn.sprint::before{background:#f2a03a}
/* 取得的屬性:頂部大頭貼列下方一排小標籤(沒有屬性時不顯示) */
#bd-traits{display:flex;flex-wrap:wrap;gap:4px 6px;padding:0 10px 6px}
#bd-traits:empty{display:none}
#bd-traits span{font-family:var(--pix);font-size:12px;line-height:1;padding:4px 6px 3px;color:var(--hudHl,var(--hl));
  background:color-mix(in srgb,var(--hudInk) 8%,var(--hud));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--hudHl,var(--hl)) 55%,transparent)}
</style>
</head>
<body>
<div id="start">
  <div id="hero">
    <canvas id="fx"></canvas>
    <div id="hero-in">
      <div id="seal">人文<br>社科</div>
      <h1>人文社科<em>學生模擬器</em></h1>
      <p class="sub">理論直覺・實證努力・政治・信心・行政・口才<br>六種能力,決定你在學術生態系的位置</p>
      <p class="ver"><i></i>抉擇從高中到大學畢業的生活</p>
    </div>
    <canvas id="scroller"></canvas>
  </div>
  <div class="wrap">
    <section class="pane" id="maker">
      <div class="pane-h">建立角色<small>外觀不影響數值</small></div>
      <div id="mk-top">
        <canvas id="look-face"></canvas>
        <div id="mk-side">
          <button class="btn" id="look-rand">隨機外觀</button>
          <button class="btn" id="look-stg">預覽:高中制服</button>
        </div>
      </div>
      <p class="mk-note">遊戲中的表情、黑眼圈、汗、淚、鼻血與白髮會依角色狀態自動出現。</p>
      <div id="mk-groups"></div>
      <div id="mk-tabs"></div>
      <div id="mk-opts"></div>
    </section>
    <section class="pane">
      <div class="pane-h">基本資料</div>
      <div class="field"><label>姓名</label><input id="in-name" maxlength="10" placeholder="例如:陳彥廷">
        <p class="oddsnote">本遊戲無後台玩家紀錄,名字不會被儲存或上傳,請放心隨意填寫。</p></div>
      <div class="field"><label>起始年份(十六歲那年)</label>
        <div style="display:flex;gap:8px;align-items:center">
          <button class="yrbtn" id="yr-dn">-</button>
          <input id="in-year" type="number" inputmode="numeric" style="text-align:center">
          <button class="yrbtn" id="yr-up">+</button>
        </div>
        <p class="oddsnote" id="yr-note"></p>
      </div>
      <div class="field"><label>出身 命運分配表</label>
        <div id="odds"></div>
        <p class="oddsnote">出身由命運抽選,按下開始才會揭曉。<a href="#" id="force-toggle">指定出身</a></p>
        <div class="seg" id="seg-org" style="display:none"></div>
      </div>
    </section>
    <section class="pane">
      <div class="pane-h">介面</div>
      <div id="theme-sw"></div>
      <div class="tog">
        <button class="btn" id="tg-bgm" style="flex:1">音樂:開</button>
        <button class="btn" id="tg-sfx" style="flex:1">音效:關</button>
        <button class="btn" id="tg-font" style="flex:1">內文:像素字</button>
      </div>
    </section>
    <button class="btn main" id="btn-start">開始人生 → 十六歲的夏天</button>
    <p class="seedline">命運種子
      <input id="seed-show" maxlength="24">
      · <a href="#" id="seed-re">換一個</a><br>種子決定這一局的隨機結果<br>記下它,就能重玩或和朋友玩同一局</p>
    <div id="ach-bar"><span>成就</span><b id="ach-count">0 / 0</b></div>
    <div id="ach-panel"></div>
    <p id="byline">by <a href="https://wandanle.bearblog.dev/" target="_blank" rel="noopener">wandanle</a> · 在作者的網誌閱讀無關的文章<br>像素字型:俐方體11號 Cubic 11(SIL OFL 1.1)</p>
  </div>
</div>
<div id="app">
  <header id="board" style="display:none">
    <div id="scene-wrap">
      <canvas id="scene"></canvas>
      <div id="bd-top">
        <div id="bd-name"></div>
        <div id="bd-team"></div>
        <div id="hud-btns">
          <button class="hb" id="btn-sfx" title="音效">♪</button>
          <button class="hb" id="btn-scene" title="場景">▲</button>
          <button class="hb" id="btn-restart" title="重新開始">×</button>
        </div>
      </div>
      <div id="bd-mh"></div>
      <div id="floats"></div>
    </div>
    <div id="bd-row">
      <canvas id="bd-face"></canvas>
      <div id="bd-grid">
        <div class="bd-cell"><b id="bd-age">16</b><span>年齡</span></div>
        <div class="bd-cell"><b id="bd-year">2026</b><span>年份</span></div>
        <div class="bd-cell"><b id="bd-ovr">30</b><span>綜合</span></div>
        <div class="bd-cell"><b id="bd-rep">0</b><span>聲望</span></div>
      </div>
    </div>
    <div id="lamps">
      <span class="lamp" id="lp0"><i></i>年初進修</span>
      <span class="lamp" id="lp1"><i></i>年度事件</span>
      <span class="lamp" id="lp2"><i></i>年末結算</span>
    </div>
  </header>
  <main id="log"></main>
  <button id="act-toggle" style="display:none">▼ 收合選項</button>
  <footer id="act" style="display:none"></footer>
</div>
<script>
/* ================= 錯誤可見化 ================= */
function showFatal(err){
  const box=document.createElement('div');
  box.style.cssText='position:fixed;left:10px;right:10px;bottom:10px;z-index:999;background:#2a1416;border:1px solid #dd7264;'+
    'color:#ffdad4;font:12px/1.6 monospace;padding:10px 12px;border-radius:8px;white-space:pre-wrap;max-height:45vh;overflow:auto';
  box.textContent='執行錯誤(請把這段訊息回報)\n'+(err&&(err.stack||err.message)||err);
  document.body.appendChild(box);
}
window.addEventListener('error',e=>showFatal(e.error||e.message));

/* ================= RNG(種子化) ================= */
let SEED = new URLSearchParams(location.search).get('seed') || Math.random().toString(36).slice(2,10);
let _s = 0;
function seedInit(str){ _s = 1779033703; for(let i=0;i<str.length;i++){ _s = Math.imul(_s ^ str.charCodeAt(i), 3432918353); _s = _s<<13 | _s>>>19; } }
function R(){ _s|=0; _s = _s + 0x6D2B79F5 |0; let t = Math.imul(_s ^ _s>>>15, 1|_s); t = t + Math.imul(t ^ t>>>7, 61|t) ^ t; return ((t ^ t>>>14)>>>0)/4294967296; }
const ri=(a,b)=>a+Math.floor(R()*(b-a+1));
const pick=a=>a[Math.floor(R()*a.length)];
const chance=p=>R()*100<p;
const clamp=(v,a,b)=>Math.max(a,Math.min(b,v));
const $=id=>document.getElementById(id);
/* 用 | 切好的句子 → 一段一段不斷行的詞組(.ph) */
const PH=t=>t.split('|').map(x=>`<span class="ph">${x}</span>`).join('');
function scrollBottom(){ requestAnimationFrame(()=>window.scrollTo(0,document.body.scrollHeight)); }

/* ================= 能力定義 ================= */
const KEYS=['th','em','po','cf','ad','sp'];
const ABL={th:'理論直覺',em:'實證努力',po:'政治',cf:'信心',ad:'行政',sp:'口才'};
const AB_MAX=80, BAR=80;

/* 出身:s = 初始值區間、p = 潛力上限區間(未列者採基準);w = 抽選權重 */
const BASE={s:[20,30],p:[55,65]};
const ORIGINS={
 mid :{n:'都會中產', w:45, d:'沒有多特別的優勢,也沒有多特別的理由。', ab:{}},
 town:{n:'小鎮做題家', w:20, d:'你比誰都會寫考卷,只是沒人問過你在想什麼。',
       ab:{em:{s:[30,40],p:[70,80]}, ad:{p:[70,80]}, th:{p:[42,50]}}},
 prof:{n:'教授世家', w:10, camp:true, d:'你從小就知道學者也是人。',
       ab:{po:{s:[30,40],p:[70,80]}, ad:{s:[30,40],p:[70,80]}, em:{s:[25,35]}}},
 art :{n:'文藝家傳', w:10, d:'這不過是你們家的家常音樂。',
       ab:{th:{s:[30,40],p:[70,80]}, sp:{s:[30,40],p:[70,80]}, cf:{s:[30,40],p:[70,80]}}},
 poor:{n:'偏鄉貧寒', w:10, camp:true, d:'城裡人真會玩,可你不會。',
       ab:{po:{s:[10,15],p:[45,55]}, cf:{s:[10,15],p:[45,55]}}},
 cap :{n:'資本之家', w:5, dice:2, d:'低垂的果實從沒缺過,除了苦工。',
       ab:{em:{p:[38,45]}, cf:{s:[35,45],p:[75,80]}, po:{p:[75,80]}, sp:{p:[75,80]}}},
};
function drawOrigin(){ const tot=Object.values(ORIGINS).reduce((a,o)=>a+o.w,0); let r=R()*tot;
  for(const k of Object.keys(ORIGINS)){ r-=ORIGINS[k].w; if(r<0)return k; } return 'mid'; }

const TIERS={
 emp :{n:'帝大霸權', d:'骰數固定 5–6', dice:()=>ri(5,6), pot:{th:6,po:4}},
 top :{n:'頂大系統', d:'骰數固定 4 以上', dice:()=>{const r=R();return r<0.4?4:r<0.8?5:6;}, pot:{th:3,em:3}},
 nat :{n:'國立大學', d:'一般骰數', dice:()=>{const r=R();return r<0.35?3:r<0.75?4:r<0.95?5:6;}, pot:{}},
 priv:{n:'私校聯盟', d:'骰數不超過 3', dice:()=>ri(2,3), pot:{sp:4,ad:4}},
 intl:{n:'跨國鈔能力', d:'骰數固定 5–6|政治無法升級', dice:()=>ri(5,6), pot:{sp:4,cf:6}},
};

/* ================= 狀態 ================= */
let S=null, stepQ=[], _curYearBody=null;
const MAX_YEARS=12;
function newState(name,org,year){
  const O=ORIGINS[org], ab={}, pot={};
  KEYS.forEach(k=>{ const m=O.ab[k]||{}, sr=m.s||BASE.s, pr=m.p||BASE.p;
    ab[k]=ri(sr[0],sr[1]);
    pot[k]=Math.max(ab[k]+5, ri(pr[0],pr[1]));
  });
  return {name,org,O,ab,pot,carry:{},traits:{},traitList:[],
    age:16,year:year||new Date().getFullYear(),startYear:year||new Date().getFullYear(),rep:0,six:0,tier:null,lockPo:false,
    stage:'HS',log:[],
    litEntries:0,litWins:0,stress:0,dep:null,mania:null,mhList:[],
    thesis:null,dualMajor:null,dest:null,
    grade:0,lost:0,skipNext:false,lostYear:false,crisis:0,hsGov:false,weakPhd:false,msLevel:'none',slack:0,chkWin:0,
    rel:null,relLog:[],loveGuaranteed:false,exes:0,loveFails:0,loveYears:0};
}
function abCost(k){ const cur=S.ab[k],pk=S.pot[k];
  let c=cur>=70?4:cur>=55?3:cur>=40?2:1; if(cur>=pk)c*=3; return c; }
function addAb(k,v){ const o=S.ab[k]; let cur=o,bud=v+(S.carry[k]||0);
  while(bud>0&&cur<AB_MAX){ let cost=cur>=70?4:cur>=55?3:cur>=40?2:1; if(cur>=S.pot[k])cost*=3;
    if(bud>=cost){bud-=cost;cur++;} else break; }
  S.carry[k]=cur>=AB_MAX?0:bud; S.ab[k]=cur; return cur-o; }
/* 事件加值:不吃成長成本,直接加減 */
function bump(k,v){ const o=S.ab[k]; S.ab[k]=clamp(o+v,1,AB_MAX); return S.ab[k]-o; }
function bumps(list){ /* [['th',6],['po',10]] → 文字 */
  return list.map(([k,v])=>{ const d=bump(k,v);
    if(d===0)return `<span style="opacity:.45">${ABL[k]} ±0${v>0?'(已達上限 '+AB_MAX+')':''}</span>`;
    return `${ABL[k]} <b class="${d>=0?'up':'dn'}">${d>0?'+':''}${d}</b>`; }).join(' ');
}
function trait(key,name,desc,tone){ if(S.traits[key])return; S.traits[key]=true; S.traitList.push(name);
  card(tone||'gold','取得屬性:'+name,desc+`<div style="margin-top:6px"><span class="trait">${name}</span></div>`); }
function ovr(){ const w=[0.30,0.24,0.18,0.13,0.09,0.06];
  const a=KEYS.map(k=>S.ab[k]).sort((x,y)=>y-x);
  return Math.round(a.reduce((s,v,i)=>s+v*w[i],0)); }
function schoolScore(){ const a=S.ab; return a.em*0.5+a.th*0.3+a.sp*0.1+a.cf*0.1; }
function scholarType(){ const a=S.ab;
  const arr=KEYS.map(k=>[k,a[k]]).sort((x,y)=>y[1]-x[1]);
  if(arr[0][1]<34)return '尚未定型';
  if(arr[0][1]-arr[1][1]<=3&&arr[0][1]>=52)return '六邊形戰士';
  return {th:'理論怪物',em:'田野工作者',po:'學術政治家',cf:'無畏發言者',ad:'行政大師',sp:'口才型選手'}[arr[0][0]];
}
function goodP(){ return S.traits.gifted?70:50; }

/* ================= UI ================= */
function logTarget(){ return _curYearBody||$('log'); }
function card(cls,title,html){ const d=document.createElement('div'); d.className='card '+cls;
  d.innerHTML=(title?`<h4>${title}</h4>`:'')+html; logTarget().appendChild(d); scrollBottom(); }
function divider(t){ const log=$('log'); const blocks=log.querySelectorAll('.yr-block');
  const prev=blocks[blocks.length-1];
  if(prev){ const h=prev.querySelector('.yr-head'); if(h&&prev.querySelector('.yr-body').children.length)h.classList.add('has-body'); }
  const pp=blocks[blocks.length-2]; if(pp)pp.classList.add('collapsed');
  const block=document.createElement('div'); block.className='yr-block';
  const head=document.createElement('div'); head.className='yr-head'; head.textContent=t;
  const body=document.createElement('div'); body.className='yr-body';
  head.onclick=()=>block.classList.toggle('collapsed');
  block.appendChild(head); block.appendChild(body); log.appendChild(block); _curYearBody=body;
  const nb=log.querySelectorAll('.yr-block');
  if(nb.length>MAX_YEARS){ for(let i=0;i<nb.length-MAX_YEARS;i++)nb[i].remove(); } }
function board(phase){
  $('bd-name').innerHTML=`${S.name}<small>${S.O.n}·${scholarType()}${S.traits.gifted?' ★':''}</small>`;
  $('bd-team').innerHTML=`<span style="color:var(--brass)">${stageLabel()}</span>`;
  $('bd-age').textContent=S.age; $('bd-year').textContent=S.year;
  $('bd-ovr').textContent=ovr(); $('bd-rep').textContent=S.rep;
  [0,1,2].forEach(i=>$('lp'+i).classList.toggle('on',i===phase));
  const mh=[];
  if(S.dep)mh.push('<span class="mh dep">憂鬱症</span>');
  if(S.traits.adhd)mh.push('<span class="mh adhd">ADHD</span>');
  if(S.traits.bipolar)mh.push(`<span class="mh bip">躁鬱症・${maniaPhase()===0?'躁期':'鬱期'}</span>`);
  if(S.rel)mh.push(`<span class="mh rel">${REL[S.rel.kind].n}</span>`);
  if(S.stress>0)mh.push(`<span class="mh str">壓力 ${S.stress}</span>`);
  $('bd-mh').innerHTML=mh.join(''); }
function stageLabel(){
  if(S.lostYear)return '休學療養';
  if(S.grade<3)return '高'+['一','二','三'][S.grade];
  return TIERS[S.tier].n+'(大'+['一','二','三','四'][clamp(S.grade-3,0,3)]+')'; }
function actClear(){ const a=$('act'); a.innerHTML=''; a.classList.remove('collapsed');
  const t=$('act-toggle'); if(t)t.style.display='none'; }
function actSync(){ const a=$('act'),t=$('act-toggle'); if(!t)return;
  const has=a.innerHTML.trim()!==''; t.style.display=has?'block':'none';
  t.textContent=a.classList.contains('collapsed')?'▲ 展開選項':'▼ 收合選項'; }
function choose(title,opts){ actClear(); const a=$('act'); a.classList.remove('collapsed');
  if(title)a.innerHTML=`<div class="title">${title}</div>`;
  opts.forEach(o=>{ const b=document.createElement('button');
    b.className='btn'+(o.main?' main':'')+(o.warn?' warn':'');
    b.innerHTML=o.t+(o.s?`<small>${o.s}</small>`:'');
    if(o.dis){ b.disabled=true; }else{ b.onclick=()=>{ actClear(); o.f(); }; }
    a.appendChild(b); });
  actSync(); scrollBottom(); }
function allocUI(dice,label,done){
  actClear(); const a=$('act'); let idx=0, hist=[], rolled=false;
  a.innerHTML=`<div class="title">${label}</div><div id="al-top"></div><div id="al-rows"></div><div class="row2" id="al-btm"></div>`;
  const top=$('al-top'),rows=$('al-rows'),btm=$('al-btm');
  const locked=k=>S.lockPo&&k==='po';
  function render(){
    top.innerHTML='<div id="dice">'+dice.map((v,i)=>`<div class="die ${i<idx?'used':''} ${i===idx?'active':''} ${v===6?'six':''} ${rolled?'':'roll'}" title="${v}">${PX.pips(v)}</div>`).join('')+'</div>'; rolled=true;
    rows.innerHTML='';
    KEYS.forEach(k=>{ const v=S.ab[k],cap=v>=AB_MAX,lk=locked(k);
      const r=document.createElement('div'); r.className='abrow'+(cap?' capped':'')+(lk?' locked':'');
      const pk=S.pot[k],cst=abCost(k),cr=S.carry[k]||0;
      r.innerHTML=`<span class="nm">${ABL[k]}${lk?' ×':''}</span><span class="bar"><i style="width:${Math.min(100,v/BAR*100)}%"></i><em style="left:${Math.min(100,pk/BAR*100)}%"></em></span>`+
        `<span class="val">${v}<small style="opacity:.5">/${pk}</small>${cst>1?`<span style="display:block;opacity:.5;font-size:10.5px;margin-top:-2px">${cr}/${cst}</span>`:''}</span>`;
      if(!cap&&!lk&&idx<dice.length)r.onclick=()=>{ const amt=dice[idx],pc=S.carry[k]||0;
        const got=addAb(k,amt); hist.push([k,got,pc]); idx++; render(); board(0); };
      rows.appendChild(r); });
    btm.innerHTML='';
    const u=document.createElement('button'); u.className='btn'; u.style.textAlign='center';
    u.textContent='← 復原'; u.disabled=!hist.length; u.style.opacity=hist.length?'1':'.35';
    if(hist.length)u.onclick=()=>{ const [k,got,pc]=hist.pop(); S.ab[k]-=got; S.carry[k]=pc; idx--; render(); board(0); };
    btm.appendChild(u);
    const allCap=KEYS.every(k=>S.ab[k]>=AB_MAX||locked(k));
    if(idx>=dice.length||allCap){ const c=document.createElement('button'); c.className='btn main';
      c.textContent=(idx<dice.length&&allCap)?'無處可加,捨棄剩餘骰子 →':'確認 →';
      c.onclick=()=>{ actClear(); done(); }; btm.appendChild(c); }
    actSync(); }
  render(); scrollBottom(); }

/* ================= 年度流程 ================= */
function nextStep(){ const f=stepQ.shift(); if(f)f(); }
function startYear(){ divider(`${S.year} 年 · ${S.age} 歲 · ${stageLabel()}`);
  if(S.lostYear){ lostYearCard(); return; }
  /* 高一、高二年初的努力暗示(使用者寫的台詞):放在年初進修(擲骰分配)之前;純文字,不碰亂數 */
  if(S.stage==='HS'&&S.grade===0)card('satire','班導師說','<span style="color:var(--dim)">高中一步一腳印<br>踏實努力把大考的東西都練熟<br>其他的等上台大便知道了</span>');
  if(S.stage==='HS'&&S.grade===1&&!['prof','art','cap'].includes(S.org))card('satire','爸媽說','<span style="color:var(--dim)">你表哥就是從高二就開始努力衝刺<br>今年才考得上頂大<br>現階段的你應該要務實<br>不要整天搞一些有的沒的</span>');
  stepQ=[phaseTrain,phaseEvent,phaseLit,phaseLove,phaseMental]; nextStep(); }
function lostYearCard(){ board(1);
  card('info','休學療養',pick([
    '你在家裡住了一年。前三個月幾乎沒有出門,後來開始每天走到巷口的便利商店,再走回來。',
    '那一年你沒有讀任何一本學術著作。你養了一隻貓,學會做三道菜,體重回到高中的樣子。'])+
    `<div class="statline">同屆的人已經升上下一個年級了。<br>你錯過了一整年:沒有進修骰、沒有事件、沒有任何累積。</div>`);
  choose('',[{t:'→ 一年後',main:true,f:()=>{ S.lostYear=false; endYear(); }}]); }
function endYear(){
  if(S.skipNext){ S.skipNext=false; S.age++; S.year++; S.lost++; S.lostYear=true; startYear(); return; }
  if(S.grade>=6){ finale(); return; }
  S.age++; S.year++; S.grade++; if(S.grade>=3)S.stage='U';
  if(S.tier==='intl'){ const d=bump('cf',3);
    card('good','盎格魯撒克遜的善意',`教授常說你的研究主題很有意思,説你很有學術天份。信心 <b class="up">+${d}</b>`); }
  startYear(); }
/* --- 年初:自主進修擲骰 --- */
function phaseTrain(){ board(0);
  let n = S.stage==='HS' ? (()=>{const r=R();return r<0.35?3:r<0.75?4:r<0.95?5:6;})() : TIERS[S.tier].dice();
  n += S.O.dice||0;
  const dice=[]; let newSix=0;
  for(let i=0;i<n;i++){ const v=S.traits.gifted?ri(4,6):ri(1,6); dice.push(v);
    if(v===6&&S.age<20&&!S.traits.gifted){S.six++;newSix++;} }
  let msg=`${S.stage==='HS'?'課餘自習':'學期進修'}擲出 <b class="hl">${n}</b> 顆骰${S.O.dice?`(${S.O.n}:+${S.O.dice} 顆)`:''}。`;
  if(newSix)msg+=` 出現「6」累計 <b class="hl">${S.six}/5</b> 次。`;
  card('','年初進修',msg);
  if(S.six>=5&&!S.traits.gifted&&S.age<20){
    const cands=KEYS.filter(k=>S.ab[k]<S.pot[k]-5); const bl=[];
    for(let i=0;i<2&&cands.length;i++){ const j=Math.floor(R()*cands.length); const k=cands.splice(j,1)[0];
      S.pot[k]=Math.min(AB_MAX,S.pot[k]+8); bump(k,4); bl.push(`${ABL[k]} <b class="up">+4</b>(上限 +8 → ${S.pot[k]})`); }
    trait('gifted','天縱英才',`20 歲前五度擲出「6」。你不是特別努力的那種人,你是那種讓努力的人心裡難受的人——從今以後每顆骰<b class="hl">永久固定 4 點以上</b>,事件好結果機率提升至 <b class="hl">70%</b>。`+(bl.length?`<div class="statline">${bl.join('<br>')}</div>`:''));
    board(0); }
  choose('',[{t:`→ 分配進修成果(${dice.length} 顆骰)`,main:true,
    f:()=>allocUI(dice,'分配進修成果(點能力套用|40/55/70 以上成長遞減,超過潛力上限成本 ×3)',()=>nextStep())}]); }
/* --- 年中:事件 --- */
function phaseEvent(){ board(1);
  if(S.grade===0)e16();
  else if(S.grade===1)e17();
  else if(S.grade===2)e18();
  else eUni(); }
/* --- 年末:文學獎 → 精神健康 --- */
function phaseLit(){ board(2); litAward(); }
function phaseMental(){ board(2); mentalPhase(); }

/* ================= 16 歲:社團 ================= */
function e16(){
  choose('高一下・社團博覽會',[
    {t:'加入校刊社',s:'理論直覺 +4 口才 +2',f:()=>{
      card('good','校刊社',`你第一次讀到有人把你說不出口的東西寫成一整頁。<div class="statline">${bumps([['th',4],['sp',2]])}</div>`); nextStep(); }},
    {t:'加入辯論社',s:'口才 +5 政治 +2 信心 +1',f:()=>{
      card('good','辯論社',`你學會了一件事:立場可以抽籤決定。<div class="statline">${bumps([['sp',5],['po',2],['cf',1]])}</div>`); nextStep(); }},
    {t:'選進學生會',s:'政治 +4 行政 +4 ※大學必定出現學生會長改選',f:()=>{
      S.hsGov=true;
      card('good','學生會',`你經手了人生第一份預算表,也第一次知道誰跟誰不合。<br><span style="color:var(--dim);font-size:12.5px">有些人是進去混一年就走,有些人從此再也離不開那間辦公室。</span><div class="statline">${bumps([['po',4],['ad',4]])}</div>`); nextStep(); }},
    {t:'哪都不去,補習班衝刺',s:'實證努力 +6 信心 −1',f:()=>{
      card('info','北車',`你的世界只剩下講義、模考、排名。有些能力就是在這種地方磨出來的。<div class="statline">${bumps([['em',6],['cf',-1]])}</div>`); nextStep(); }},
  ]); }

/* ================= 17 歲:人社營 ================= */
function e17(){
  const auto=!!S.O.camp;
  const sc=S.ab.th*0.4+S.ab.sp*0.3+S.ab.em*0.2+S.ab.po*0.1;
  const p=auto?100:clamp(25+(sc-30)*1.5,8,60);
  choose('升高二暑假・全國人文社會科學營',[
    {t:'報名人社營',main:true,s:auto?`${S.O.n}:保障錄取 100%`:`預估錄取率 ${p.toFixed(0)}%(基準 25%,看理論直覺與口才)`,
     f:()=>{
      if(chance(p)){
        trait('camp','人社營',`兩週的營隊裡,你認識了未來二十年會一直在大學裡遇到的那些人。學術,從來不只是讀書。<div class="statline">${bumps([['po',10],['th',6]])}</div>`);
      }else{
        card('bad','未錄取',`備取名單上沒有你的名字。你反覆讀了三次那封信,然後把它刪掉。<div class="statline">${bumps([['cf',-2]])}</div>`);
      } nextStep(); }},
    {t:'不報名,把暑假留給自己',s:'什麼都不會發生',f:()=>{
      card('','平凡的暑假',`樹上開著杜鵑,白雲飄過窗前,你什麼都沒做。多年後你會想起這個暑假。`); nextStep(); }},
  ]); }

/* ================= 18 歲:篩選機制 ================= */
function e18(){
  const sc=schoolScore();
  const tier = sc>=42?'emp' : sc>=36?'top' : sc>=30?'nat' : 'priv';
  const det=`<div class="statline">實證努力 ${S.ab.em}×0.5 理論直覺 ${S.ab.th}×0.3<br>口才 ${S.ab.sp}×0.1 信心 ${S.ab.cf}×0.1<br>綜合分數 <b class="hl">${sc.toFixed(1)}</b> (42 / 36 / 30 為分水嶺)</div>`;
  card('info','大學入學篩選',`三年的積累,被壓縮成一個數字。<br>${det}`);
  const go=t=>()=>{ enterUni(t); nextStep(); };
  const opts=[{t:`進入 ${TIERS[tier].n}`,main:true,s:TIERS[tier].d,f:go(tier)}];
  if(S.org==='cap')opts.push({t:'啟動跨國鈔能力',warn:true,
    s:'直接出國唸書|骰數固定 5–6、每年信心 +3|大學期間政治無法升級',f:go('intl')});
  choose('十八歲的分水嶺',opts); }
function enterUni(t){
  S.tier=t; S.stage='U';
  const T=TIERS[t]; const bl=[];
  Object.entries(T.pot).forEach(([k,v])=>{ S.pot[k]=Math.min(AB_MAX,S.pot[k]+v); bl.push(`${ABL[k]} 潛力上限 <b class="up">+${v}</b> → ${S.pot[k]}`); });
  if(t==='intl'){ S.lockPo=true; S.rep+=10; }
  if(t==='emp')S.rep+=15; if(t==='top')S.rep+=8; if(t==='nat')S.rep+=3;
  const txt={
   emp:'從此以後,你說的每一句話都會自動附贈一點可信度與責任。',
   top:'很好的學校,很好的系,只是每次自我介紹完,對方總會多問一句「那你怎麼沒去帝大」。',
   nat:'不上不下,剛剛好。你會花很多年才明白,這個位置其實最需要意志力。',
   priv:'系上一半的人在準備轉學考。你決定不轉,這個決定會跟著你很久。',
   intl:'你在異國的機場拖著兩個行李箱。台灣的排名遊戲,從此與你無關——你玩的是另一個。',
  }[t];
  card(t==='priv'?'bad':'gold',TIERS[t].n,txt+(bl.length?`<div class="statline">${bl.join('<br>')}</div>`:'')); }

/* ================= 文學獎(累積體制) ================= */
function litRate(){ return Math.min(85, 15 + S.litEntries*5 + S.litWins*10); }
function litAward(){
  const ok=S.ab.th>39, p=litRate();
  const bonus=S.litEntries*5+S.litWins*10;
  const detail = ok
    ? `得獎機率 <b>${p}%</b>${bonus?`(基礎 15%+參賽 ${S.litEntries}次 +${S.litEntries*5}%+得獎 ${S.litWins}次 +${S.litWins*10}%)`:'(基礎 15%)'}`
    : `<b>0%</b> 未達基礎門檻:理論直覺 40,目前 ${S.ab.th}`;
  choose(`${S.year} 年・文學獎徵稿`,[
    {t:'投稿', main:ok, s:`${detail}|寫作佔掉時間:實證努力 −1|落選:信心 −2`,
     f:()=>{ submitLit(); nextStep(); }},
    {t:'今年不投', s:'沒有任何變化,累積也不會增加', f:()=>{
      card('','文學獎徵稿',pick([
        '總感覺還不夠好,你把寫完的稿留在硬碟裡。',
        '想想其實也沒有什麼話要說。',
        '今年不投。理由你說得出十個,真正的那個不在裡面。',
        '你決定把這段時間留給該做的事。文學獎明年還會再辦。'])); nextStep(); }},
  ]); }
function submitLit(){
  bump('em',-1); const p=litRate(); S.litEntries++;
  const acc=()=>`<div class="statline" style="opacity:.75">累積:參賽 ${S.litEntries} 次・得獎 ${S.litWins} 次 → 明年得獎機率 <b class="hl">${litRate()}%</b></div>`;
  if(S.ab.th>39&&chance(p)){
    S.litWins++;
    if(S.ab.th>S.ab.em){
      S.rep+=20;
      if(!S.traits.prodigy){
        card('gold','全國文學獎',`頒獎典禮上,評審說你的文字「有一種不合年齡的透明」。你其實只是把痛苦寫得比較好看。<br><span class="hl">聲望 +20</span>`);
        trait('prodigy','早慧文青',`太早被肯定的人,會用一輩子來驗證那次肯定是不是誤會。(此屬性一生只取得一次)<div class="statline">${bumps([['th',2],['cf',6],['po',2]])}</div>`+acc());
      }else{
        card('gold','再一次全國大獎',`第 ${S.litWins} 座。評審裡有兩個人去年也在。他們記得你的名字,也記得你的句法。<br>得獎的人會越得越多,這件事沒有人會說破。<div class="statline">${bumps([['th',1],['cf',3],['po',3]])}</div><span class="hl">聲望 +20</span>`+acc());
      }
    }else{
      S.rep+=8;
      card('good','地方文學獎',`縣府大禮堂,獎金一萬五。你的文字很紮實,紮實到評審說「像一篇好的報告」。<div class="statline">${bumps([['th',-4],['cf',4],['em',4]])}</div><span class="hl">聲望 +8</span>`+acc());
    }
    return; }
  if(!(S.ab.th>39)){
    card('bad','初選未過',pick([
      '你知道自己還寫不出那種東西,但還是投了。信封寄出的那一刻你就後悔了。',
      '初選名單三十個人,沒有你。你安慰自己說評審看的是別的東西。',
      '你把稿子重讀一遍,這次讀出了問題在哪。太晚了。'])+
      `<div class="statline">${bumps([['cf',-2]])}</div>`+acc());
    return; }
  card('bad','落選',pick([
    '得獎名單公布了。你把自己的稿子重讀一遍,還是覺得寫得不錯。這就是最傷的地方。',
    '入圍名單上有你認識的人。你按了讚,然後關掉手機。',
    '評審講評裡有一句「有些作品野心過大而失焦」。你確定那說的是你。'])+
    `<div class="statline">${bumps([['cf',-2]])}</div>`+acc());
}

/* ================= 三階機率事件引擎 ================= */
function tierEvent(cfg,done){
  const sc=cfg.score();
  const calc=sp=>{
    let g=Math.round(clamp((sc-cfg.pivot)*cfg.slope+(cfg.gbase||22)+(sp?18:0),3,sp?80:66));
    let o=Math.round(clamp(38+(sc-cfg.pivot)*0.6+(sp?4:0),18,58));
    if(g+o>96)o=96-g;
    return [g,o,100-g-o]; };
  const a=calc(false), b=calc(true);
  const opts=[
    {t:cfg.t1||'認真準備',main:true,s:`大成功 <b>${a[0]}%</b> 普通 ${a[1]}% 失敗 ${a[2]}%`,f:()=>go(false)},
    {t:'全力衝刺',warn:true,s:`大成功 <b>${b[0]}%</b> 普通 ${b[1]}% 失敗 ${b[2]}% |代價:信心 −3、壓力 +1`,f:()=>go(true)},
  ];
  if(cfg.skip)opts.push({t:cfg.skip.t,s:cfg.skip.s,f:()=>{ cfg.skip.f(); done(); }});
  choose(cfg.title,opts);
  function go(sp){
    if(sp){ S.stress++;
      card('info','全力衝刺',pick([
        '你連續兩週睡在研究室的沙發上,靠咖啡因撐著。',
        '你把所有能推掉的事都推掉了,包括那個問你最近好不好的朋友。',
        '截稿前那幾天你沒怎麼吃東西。你告訴自己,撐過去就好。'])+
        `<div class="statline">${bumps([['cf',-3]])} 壓力 <b class="dn">+1</b> → ${S.stress}</div>`); }
    const [g,o]=calc(sp), r=R()*100;
    if(r<g)cfg.great(); else if(r<g+o)cfg.ok(); else cfg.fail();
    done(); }
}

/* ================= 大學事件 ================= */
function eUni(){ const y=S.grade-2;
  if(y===1)u1(); else if(y===2)u2(); else if(y===3)u3(); else u4(); }

function u1(){
  choose('大一・你發現這裡沒有標準答案',[
    {t:'衝系學會與社團',s:'政治 +5 口才 +4 實證努力 −2',f:()=>{
      card('good','人脈的複利',`你記得每個學長姊的研究題目,也記得誰在哪個老師底下。這些以後都有用。<div class="statline">${bumps([['po',5],['sp',4],['em',-2]])}</div>`); evJournal(); }},
    {t:'泡在圖書館',s:'理論直覺 +5 實證努力 +3 政治 −2',f:()=>{
      card('good','總圖地下室',`你一個人啃完了那本沒人啃得完的書。沒有人知道,但你自己知道。<div class="statline">${bumps([['th',5],['em',3],['po',-2]])}</div>`); evJournal(); }},
    {t:'打工分擔家計',s:'行政 +6 實證努力 +2 信心 −2',f:()=>{
      card('info','基本工資',`同學在討論傅柯的時候,你在算今天的班表。你學會了效率,代價是你再也無法享受純粹的閒逸。<div class="statline">${bumps([['ad',6],['em',2],['cf',-2]])}</div>`); evJournal(); }},
    {t:'什麼都不做',s:'實證努力 −5 行政 −3 信心 +2 壓力 −2',f:()=>{
      S.stress=Math.max(0,S.stress-2); S.slack=(S.slack||0)+1;
      card('','大一的空白',pick([
        '你翹了三分之一的課,其餘時間在宿舍打電動、上網、睡到下午。<br>沒有人管你。這是你人生第一次感覺到絕對的自由。',
        '你什麼都沒參加。系上的活動、讀書會、社團,你都在報名截止前一天想起來,想想還是算了。'])+
        `<div class="statline">${bumps([['em',-5],['ad',-3],['cf',2]])} 壓力 <b class="up">−2</b> → ${S.stress}</div>`);
      evJournal(); }},
    {t:'談一場戀愛',s:'理論直覺 +1 信心 +6 口才 +3 實證努力 −3 ※直接進入關係,不會失敗',f:()=>{
      S.loveGuaranteed=true;
      card('good','大一的春天',`有人願意聽你講兩個小時你正在想的事。你第一次感覺到自己是被理解的。<div class="statline">${bumps([['th',1],['cf',6],['sp',3],['em',-3]])}</div>`); evJournal(); }},
  ]); }
function u2(){
  const both=S.ab.th>=45&&S.ab.em>=45;
  const nx=()=>{ const g=govDestiny(); if(g)evStudentGov(g); else if(chance(50))evDual(); else evStudentGov(null); };
  choose('大二・學派的分歧',[
    {t:'走理論路線',s:'理論直覺 +7、上限 +6 實證努力 −3',f:()=>{
      S.pot.th=Math.min(AB_MAX,S.pot.th+6);
      trait('theory','理論派',`你決定相信:世界需要先被重新描述,才有可能被改變。<div class="statline">${bumps([['th',7],['em',-3]])}<br>理論直覺 潛力上限 <b class="up">+6</b> → ${S.pot.th}</div>`); nx(); }},
    {t:'走實證路線',s:'實證努力 +7、上限 +6 理論直覺 −3',f:()=>{
      S.pot.em=Math.min(AB_MAX,S.pot.em+6);
      trait('empiric','實證派',`你決定相信:沒有資料的話,都只是空話。<div class="statline">${bumps([['em',7],['th',-3]])}<br>實證努力 潛力上限 <b class="up">+6</b> → ${S.pot.em}</div>`); nx(); }},
    {t:'兩邊都要',s:both?'理論 +4 實證 +4 信心 +2':'需要 理論直覺 ≧45 且 實證努力 ≧45',dis:!both,f:()=>{
      trait('both','方法論通才',`你在兩個讀書會之間跑來跑去,兩邊的人都覺得你不夠純粹。但你確實兩邊都聽得懂。<div class="statline">${bumps([['th',4],['em',4],['cf',2]])}</div>`); nx(); }},
    {t:'兩邊都聽,還沒想好',s:'信心 −2 保留彈性',f:()=>{
      card('','懸而未決',`你說你還在探索。有些人一輩子都在探索。<div class="statline">${bumps([['th',1],['em',1],['cf',-2]])}</div>`); nx(); }},
    {t:'什麼都不做',s:'實證努力 −6 理論直覺 −2 壓力 −2 ※不選學派',f:()=>{
      S.stress=Math.max(0,S.stress-2); S.slack=(S.slack||0)+1;
      card('','大二的空白',pick([
        '讀書會你去了一次就沒再去,那本書你到現在還放在書架上。',
        '樹上開著杜鵑 白雲飄過窗前,你只能躺在床上看著螢幕咯咯笑,隱約感覺有點一年不如一年。'])+
        `<div class="statline">${bumps([['em',-6],['th',-2]])} 壓力 <b class="up">−2</b> → ${S.stress}</div>`); nx(); }},
  ]); }
function u3(){
  const opts=[];
  if(S.ab.em>=45||S.org==='poor')opts.push({t:'跟老師下田野',s:'實證努力 +7 行政 +3 聲望 +10'+(S.org==='poor'?' ※出身相關':''),f:()=>{
    S.rep+=10; card('gold','田野',`你在一個沒有訊號的地方待了六週。逐字稿打了四萬字。那些人的臉,你到現在還記得。<div class="statline">${bumps([['em',7],['ad',3]])}</div><span class="hl">聲望 +10</span>`);
    if(S.org==='poor'){ S.pot.cf=Math.min(AB_MAX,S.pot.cf+12); S.pot.po=Math.min(AB_MAX,S.pot.po+8);
      trait('resonance','底層共鳴',`第三天你才發現,那個村子跟你長大的地方是同一種安靜。同行的同學拿著訪綱問「您覺得您被剝奪了什麼」,而你連問都不必問。<div class="statline">${bumps([['cf',6]])}<br>信心 潛力上限 <b class="up">+12</b> → ${S.pot.cf} 政治 潛力上限 <b class="up">+8</b> → ${S.pot.po}</div>`); }
    evExchange(); }});
  if(S.ab.po>=35)opts.push({t:'當教授的研究助理',s:'行政 +6 政治 +4 實證努力 +3 理論 −2',f:()=>{
    S.rep+=6; card('good','老師的 RA',`你負責核銷、排會議、催進度。你也因此看見了學術的後台——那裡沒有一句是在談論真理。<div class="statline">${bumps([['ad',6],['po',4],['em',3],['th',-2]])}</div><span class="hl">聲望 +6</span>`); evExchange(); }});
  opts.push({t:'什麼都不做,好好活著',s:'信心 +3 壓力 −1',f:()=>{
    S.stress=Math.max(0,S.stress-1); S.slack=(S.slack||0)+1;
    card('','空白的一年',`你把大三拿來睡覺、看電影、跟朋友喝酒。多年後這是你唯一不後悔的一年。<div class="statline">${bumps([['cf',3]])} 壓力 <b class="up">−1</b> → ${S.stress}</div>`); evExchange(); }});
  choose('大三・機會與代價',opts); }

/* --- a 雙主修 --- */
function evDual(){ tierEvent({
  title:'大二・雙主修申請',
  score:()=>S.ab.em*0.5+S.ab.ad*0.3+S.ab.th*0.2, pivot:40, slope:1.7,
  great:()=>{ S.dualMajor='full'; S.rep+=8; S.pot.ad=Math.min(AB_MAX,S.pot.ad+6);
    trait('dual','雙主修',`你拿到了另一個系的學位,代價是連續三個學期修 28 學分。你在兩個系館之間跑,兩邊都覺得你不是自己人。<div class="statline">${bumps([['ad',5],['em',5],['cf',-2]])}<br>行政 潛力上限 <b class="up">+6</b> → ${S.pot.ad} <span class="hl">聲望 +8</span></div>`); },
  ok:()=>{ S.dualMajor='minor';
    card('good','改申請輔系',`雙主修沒上,你退而求其次修了輔系。履歷上還是多一行,只是那一行你自己知道分量。<div class="statline">${bumps([['ad',3],['em',3]])}</div>`); },
  fail:()=>{ card('bad','未通過',`今年系上只收五個人,你默默關了網頁。<div class="statline">${bumps([['cf',-3]])}</div>`); },
},()=>nextStep()); }

/* 空白的四年:大一到大三都選「什麼都不做」,而且沒有當選學生會長、出國交換、拿到國科會 */
function voidU(){ return S.slack>=3&&!S.chkWin; }

/* --- d 競選學生會 --- */
/* 命定競選:高中做過學生會,或政治/口才是你最強的一項 */
function govDestiny(){
  if(S.hsGov)return 'hs';
  const top=KEYS.slice().sort((a,b)=>S.ab[b]-S.ab[a])[0];
  return (top==='po'||top==='sp')?(top==='po'?'po':'sp'):null; }
function evStudentGov(why){
  if(why){ const t={
      hs:['回到那間辦公室','高中那三年你就在做這件事。開學第二週,學長把你約去談,說今年需要一個人扛。<br><span style="color:var(--dim)">你說你要想一下。你們都知道你會答應。</span>'],
      po:['沒有人問你要不要選','你只是幫忙處理了幾件事,然後名字就開始出現在別人的口中。到了登記參選時,你已經沒有退路了。'],
      sp:['你的嘴巴替你報了名','系上座談會你講了五分鐘,隔天就有三個人來問你要不要選。你講話的時候,人們會停下來聽——這件事在這裡是一種資產。'],
    }[why];
    card('info',t[0],t[1]+`<div class="statline" style="opacity:.8">命定事件:${why==='hs'?'高中學生會經歷':(why==='po'?'政治是你的最強項':'口才是你的最強項')}${why==='hs'?'|選情分數 <b class="hl">+6</b>(做過的人比較知道怎麼做)':''}</div>`); }
  tierEvent({
  title:'大二・學生會長改選',
  score:()=>S.ab.sp*0.4+S.ab.po*0.35+S.ab.cf*0.25+(S.hsGov?6:0), pivot:33, slope:1.8,
  great:()=>{ S.rep+=10; S.chkWin++;
    trait('presid','學生會長',`你是校園進步派的共主,你當選了,然後花一整年學會被自己人罵是什麼感覺。<div class="statline">${bumps([['po',8],['sp',6],['ad',5],['em',-4]])}<span class="hl"> 聲望 +10</span></div>`); },
  ok:()=>{ card('good','落選,回到學代會,繼續工作',`開票那晚你領先了整晚,可你漏算醫學院校區最後送來的選票,多年後這場難堪的逆轉還是會被提起,不過你確實喜歡這些事情。<div class="statline">${bumps([['po',3],['sp',3],['ad',2]])}</div>`); },
  fail:()=>{ card('bad','慘敗',`你的選票比廢票還要少。開票那晚有人安慰你說「大家只是不認識真正的你」,這句話比落選更難聽。<div class="statline">${bumps([['cf',-5],['po',1]])}</div>`); },
  skip:why?{t:'臨陣脫逃',s:'政治 −4 聲望 −5',f:()=>{ S.rep-=5;
    card('','臨陣脫逃',`退路是人走出來,逃避雖然可恥,但你還是退出了競選,幫你拉過票的人沒有多說什麼,只是之後有事比較少找你了。<div class="statline">${bumps([['po',-4]])} 聲望 <b class="dn">−5</b></div>`); }}
   :{t:'臨陣脫逃',s:'信心 −2',f:()=>{
    card('','臨陣脫逃',`你填好了登記表,也找好了搭檔,可是截止那天你一直想到要站在台上被問問題,最後還是沒有去選委會,之後在系館遇到搭檔,你們都假裝沒有看到對方。<div class="statline">${bumps([['cf',-2]])}</div>`); }},
},()=>nextStep()); }

/* --- c 投稿學生刊物 --- */
function evJournal(){ tierEvent({
  title:'大一・系刊徵稿',
  score:()=>S.ab.th*0.5+S.ab.sp*0.3+S.ab.em*0.2, pivot:37, slope:1.8, gbase:24,
  great:()=>{ S.rep+=8;
    card('gold','封面故事',`你的文章被放在封面,主編說這是這幾年最好的學生稿。有教授在課堂上提到它,沒說作者是誰,但你知道。<div class="statline">${bumps([['th',4],['sp',3],['cf',4]])}</div><span class="hl">聲望 +8</span>`); },
  ok:()=>{ card('good','順利刊登',`一萬字,排在第 34-37 頁。<div class="statline">${bumps([['th',2],['sp',2],['cf',2]])}</div>`); },
  fail:()=>{ card('bad','退稿',`主編說「內容很扎實,但看不到你自己的論點」。你想反駁,發現他說得對。<div class="statline">${bumps([['th',1],['cf',-3]])}</div>`); },
  skip:{t:'不投稿',s:'信心 −2',f:()=>{
    card('','沒有投稿',`為此你焦慮了好幾天,最終還是沒有把答應的稿件交出去,系刊出來的時候,你翻了一下目錄,上面有好幾個你認識的名字。<div class="statline">${bumps([['cf',-2]])}</div>`); }},
},()=>nextStep()); }

/* --- b 交換學生 --- */
function evExchange(){ const rich=(S.org==='cap'||S.tier==='intl');
  tierEvent({
  title:'大三・交換學生甄選'+(rich?'(家裡出得起)':''),
  score:()=>S.ab.th*0.3+S.ab.sp*0.3+S.ab.cf*0.2+S.ab.ad*0.2+(rich?8:0), pivot:37, slope:1.6,
  great:()=>{ S.rep+=15; S.chkWin++; S.pot.th=Math.min(AB_MAX,S.pot.th+5);
    trait('exch','交換學生',`你去了那間你只在註腳裡看過的學校。研討課上第一次舉手,講得結結巴巴,但你切身體會了後殖民之必要。<div class="statline">${bumps([['th',6],['cf',6],['sp',5]])}<br>理論直覺 潛力上限 <b class="up">+5</b> → ${S.pot.th} <span class="hl">聲望 +15</span></div>`); },
  ok:()=>{ S.rep+=6; S.chkWin++; if(!S.traits.exch){ S.traits.exch=true; S.traitList.push('交換學生'); }  /* 備取也是出去交換了(使用者):一樣有交換學生屬性 */
    card('good','備取上了一間',`不是第一志願,但你還是去了。那一年你學會自己搬家、自己生病、自己過生日。<div class="statline">${bumps([['th',3],['cf',4],['sp',3]])}</div><span class="hl">聲望 +6</span><div style="margin-top:6px"><span class="trait">交換學生</span></div>`); },
  fail:()=>{ card('bad','未錄取',`名額六個,語言檢定卡在最後一關。你看著同學海外生活的限時動態一則一則跳出來。<div class="statline">${bumps([['cf',-4]])}</div>`); },
  skip:{t:'不申請',s:'信心 −2',f:()=>{
    card('','沒有送出申請',`你看了看自己的GPA,終究是沒有送出申請,看著出國的同學的生活,有點後悔自己大一大二沒有認真點。<div class="statline">${bumps([['cf',-2]])}</div>`); }},
},()=>evNSC()); }

/* --- 國科會大專生研究計畫 --- */
function evNSC(){ tierEvent({
  title:'大三・國科會大專生研究計畫',
  t1:'寫計畫書投出去',
  score:()=>S.ab.th*0.35+S.ab.em*0.35+S.ab.po*0.2+S.ab.ad*0.1, pivot:46, slope:1.7, gbase:18,
  great:()=>{ S.rep+=20; S.chkWin++;
    trait('nsc','大專生國科會計畫主持人',`你的計畫不但過了,還拿到研究創作獎。指導教授在系上餐敘時特地提你的名字——你第一次感覺到,這條路上有人願意讓出一點位置給你。<div class="statline">${bumps([['th',5],['em',5],['ad',3],['po',3]])}<span class="hl"> 聲望 +20</span></div>`); },
  ok:()=>{ S.rep+=10; S.chkWin++; card('good','計畫通過',`四萬八千塊研究費,每個月六千塊。那份核定通知你截圖存了很久。<div class="statline">${bumps([['em',4],['ad',3],['th',2]])}</div><span class="hl">聲望 +10</span>`); },
  fail:()=>{ card('bad','未通過',`審查意見只有兩行:「研究問題不夠聚焦」。你至少學會了計畫書的格式,這東西以後你會寫一輩子。<div class="statline">${bumps([['ad',2],['cf',-3]])}</div>`); },
  skip:{t:'不申請',s:'需要指導教授點頭,也需要一整個暑假',f:()=>{
    card('','沒有申請',pick([
      '你問了老師,他說「你想清楚題目再來找我」。你沒有再去找他。',])); }},
},()=>nextStep()); }

/* --- 大四:畢業論文(選擇性) --- */
function u4(){
  const sc=S.ab.th*0.4+S.ab.em*0.4+S.ab.ad*0.2;
  const det=`<div class="statline">理論直覺 ${S.ab.th}×0.4 實證努力 ${S.ab.em}×0.4 行政 ${S.ab.ad}×0.2<br>論文分數 <b class="hl">${sc.toFixed(1)}</b> (56 優等/42 及格)</div>`;
  choose('大四・畢業論文(系上沒有強制)',[
    {t:'寫,而且要寫好',main:true,s:`論文分數 ${sc.toFixed(1)}|影響推甄與博班資格`,f:()=>{
      if(sc>=56){ S.rep+=25; S.thesis='great';
        trait('honors','學士論文獎',`口試委員說:「這個題目你應該繼續做下去。」${det}<span class="hl">聲望 +25</span>`);
      }else if(sc>=42){ S.rep+=10; S.thesis='ok';
        card('good','順利完成',`不是什麼驚天動地的作品,但每一節都是你自己親手寫的。這在這個年代已經不容易。${det}<span class="hl">聲望 +10</span>`);
      }else{ S.thesis='bad';
        card('bad','低空飛過',`口試委員翻了翻,問了三個問題,你答不出兩個。他嘆了口氣,還是簽了名。${det}<div class="statline">${bumps([['cf',-5]])}</div>`);
      } nextStep(); }},
    {t:'不寫,把時間拿去準備出路',s:'沒有作品|推甄扣分|信心 +2、壓力 −1',f:()=>{
      S.thesis='none'; S.stress=Math.max(0,S.stress-1);
      card('','沒有畢業論文',`系上沒有強制,你就沒有寫。多年後每次有人問起你的大學論文,你都要解釋一次。<div class="statline">${bumps([['cf',2]])} 壓力 <b class="up">−1</b> → ${S.stress}</div>`); nextStep(); }},
  ]); }

/* ================= 精神健康系統 ================= */
function maniaPhase(){ return S.mania?(S.age-S.mania.since)%2:-1; }
function mentalPhase(){
  if(S.traits.bipolar)maniaCycle();
  depressionDecay();
  checkADHD(); checkBipolar(); checkDepression();
  if(crisisCheck())return;
  if(S.dep){ depressionTurn(); return; }
  choose('',[{t:'→ 進入下一年',main:true,f:()=>endYear()}]);
}
function maniaCycle(){
  if(maniaPhase()===0){
    card('gold','躁期',pick([
      '你三天寫完了兩萬字,而且你確定那些字是好的。你回信給每一個人,語氣熱烈得讓他們有點怕。',
      '這幾個月你同時開了四個題目,每一個都覺得可以做成書。你睡四小時就飽了。'])+
      `<div class="statline">${bumps([['th',5],['em',4],['cf',5],['po',3],['sp',3]])}</div>`);
  }else{
    card('bad','鬱期',pick([
      '躁期寫的那兩萬字,你現在一個字都讀不下去。信箱裡有十七封未讀。',
      '你答應的事全部沒做。你不是不想做,你是連開檔案都做不到。'])+
      `<div class="statline">${bumps([['cf',-6],['ad',-5],['po',-3],['sp',-3]])}</div>`);
  }
}
function checkADHD(){
  if(S.traits.adhd||S.ab.ad>=23||S.age<17)return;
  if(!chance(60))return;
  S.mhList.push('ADHD');
  trait('adhd','ADHD',`你終於去了身心科。醫生問完之後說:「你不是懶,你是注意力的分配方式跟別人不一樣。」<br>那些跳躍的、抓不住的東西,原來是同一件事的兩面——你想得比誰都遠,也永遠交不出期限內的東西。<div class="statline">${bumps([['th',9],['em',-5]])}</div>`,'info');
}
function checkBipolar(){
  if(S.traits.bipolar||S.ab.th<55||S.ab.cf>=26)return;
  if(!chance(40))return;
  S.mania={since:S.age+1}; S.mhList.push('躁鬱症');
  trait('bipolar','躁鬱症',`你以為那是靈感。連續幾個月的高速運轉之後,是同樣長度的什麼都做不了。<br>診斷書上的字很短。從今以後,你的產出會有節奏——只是那節奏不歸你管。<span style="color:var(--dim);font-size:12px">(終身屬性・每年在躁期與鬱期之間交替)</span>`,'info');
}
function beginDepression(intro){
  if(S.dep)return;
  const deb={sp:-6,po:-5,ad:-5,em:-6};
  const applied={}; Object.entries(deb).forEach(([k,v])=>{ applied[k]=bump(k,v); });
  S.dep={years:0,deb:applied}; S.mhList.push('憂鬱症');
  card('bad','憂鬱症',(intro||`一開始只是不想回訊息,後來是不想出門,最後是不想起床。<br>你還是能讀書,只是讀完什麼都沒留下。你以為這是你的問題。`)+
    `<div class="statline">${Object.entries(applied).map(([k,v])=>`${ABL[k]} <b class="dn">${v}</b>`).join(' ')}<br><span style="opacity:.7">暫時性減損,治癒後歸還|未治癒:每年信心持續下降</span></div>`);
}
function checkDepression(){
  if(S.dep)return;
  if(S.age<17)return;
  const risk=Math.min(55,(S.ab.cf<22?(22-S.ab.cf)*3.5:0)+S.stress*6);
  if(risk<=0||!chance(risk))return;
  beginDepression();
}
function depressionDecay(){
  if(!S.dep)return;
  if(S.dep.years>0){ const d=bump('cf',-4);
    card('bad','還沒有好',pick([
      '又一年。你學會了在別人面前表現得正常,這件事本身就很累。',
      '你把「我最近不太好」在對話框裡打了又刪。最後傳出去的是一個貼圖。'])+
      `<div class="statline">信心 <b class="dn">${d}</b></div>`); }
  S.dep.years++; }
function restoreDep(){ const t=Object.entries(S.dep.deb).map(([k,v])=>`${ABL[k]} <b class="up">+${-v}</b>`).join(' ');
  Object.entries(S.dep.deb).forEach(([k,v])=>bump(k,-v)); S.dep=null; return t; }
function depressionTurn(){
  if(!S.dep)return;
  const restore=()=>restoreDep();
  choose('要處理它嗎',[
    {t:'看醫生,開始服藥',main:true,s:'治癒|理論直覺永久 −6',f:()=>{
      const r=restore(); const d=bump('th',-6); S.stress=Math.max(0,S.stress-2);
      S.mhList[S.mhList.lastIndexOf('憂鬱症')]='憂鬱症(藥物)';
      card('good','藥物治療',`兩個月後你發現自己會餓了,也會想出門了。<br>只是那種一頁書讀下去就通到底的感覺不見了。你不確定是藥,還是你已經不是那個人了。<div class="statline">${r}<br>理論直覺 <b class="dn">${d}</b>(永久)</div>`); endYear(); }},
    {t:'冥想、運動、規律作息',s:'治癒|實證努力永久 −6',f:()=>{
      const r=restore(); const d=bump('em',-6); S.stress=Math.max(0,S.stress-2);
      S.mhList[S.mhList.lastIndexOf('憂鬱症')]='憂鬱症(自療)';
      card('good','慢慢走出來',`每天六點起床、走路四十分鐘、十一點睡。你確實好了。<br>代價是你再也回不去那種為了一份報告連熬三天的狀態——你的身體不肯了。<div class="statline">${r}<br>實證努力 <b class="dn">${d}</b>(永久)</div>`); endYear(); }},
    {t:'撐著,這沒什麼',warn:true,s:'不治療|維持減損|每年信心持續下降',f:()=>{
      card('','撐著',pick([
        '你查了掛號費和門診時間,然後關掉分頁。',
        '你想,等這學期過完就好了。每個學期你都這樣想。'])); endYear(); }},
  ]);
}

/* ================= 戀愛路線(大學階段) ================= */
const REL={
 stable:{n:'穩定交往',c:'good'},
 burn  :{n:'相愛相殺',c:'gold'},
 toxic :{n:'有毒的關係',c:'bad'},
};
const AGEQ={
 young:{n:'年幼',d:['小你兩屆的那個人','剛升大一、比你小三歲的那個人','系上直屬學弟妹']},
 peer :{n:'同儕',d:['同班的那個人','隔壁系同屆的那個人','讀書會上坐你對面的那個人']},
 old  :{n:'年長',d:['大你三屆、已經在唸碩班的那個人','系上的兼任助理,大你五歲','在交友軟體上認識、已經出社會的那個人']},
};
const FEELQ={
 like   :{n:'感興趣',d:'你確實被吸引——或許是因為對方的眼睛,或許是因為對方講話的方式讓你想一直聽下去。'},
 neutral:{n:'不討厭',d:'你對這個人沒有特別的感覺。不討厭,也不心動,只是剛好在同一個空間裡很久了。'},
 hate   :{n:'討厭',d:'你其實有點討厭這個人。討厭到你會在洗澡的時候反覆想起對方說過的話。'},
};
function meetPerson(){
  const age=pick(['young','peer','peer','peer','old','old']);
  const r=R()*100, feel=r<46?'like':r<92?'neutral':'hate';
  const theyMove=chance(40);
  return {age,feel,theyMove,desc:pick(AGEQ[age].d)}; }
function loveRate(p,mode){
  const base=S.ab.sp*0.5+S.ab.cf*0.3+S.ab.po*0.2;
  /* 對方已經主動了,答應幾乎不會失敗——真正的風險在後面 */
  if(mode==='passive')return Math.round(clamp(90+(base-30)/6,90,99));
  let v=(base-28)*1.8+32;
  if(S.org==='cap'||S.org==='art')v+=15;
  if(p.age==='old')v+=8; else if(p.age==='young')v-=5;
  if(p.feel==='like')v-=5; else if(p.feel==='neutral')v+=5; else v-=15;
  return Math.round(clamp(v,8,92)); }
function outcomeKind(p,mode,boost){
  const w=[];
  let stable=boost?60:40, burn=(boost?35:25), betray=(boost?6:10), toxic=(boost?8:16);
  if(p.feel!=='like')burn=0;
  if(p.age==='old')betray*=2.0;
  if(mode!=='passive')toxic=0;
  if(p.feel==='hate'){ stable*=0.6; betray*=1.5; toxic*=1.4; }
  w.push(['stable',stable],['burn',burn],['betray',betray],['toxic',toxic]);
  const tot=w.reduce((a,b)=>a+b[1],0); let r=R()*tot;
  for(const [k,v] of w){ r-=v; if(r<0)return k; }
  return 'stable'; }
function phaseLove(){
  if(S.grade<3){ nextStep(); return; }
  board(2);
  if(S.loveGuaranteed){ S.loveGuaranteed=false;
    const p=meetPerson(); p.feel=chance(70)?'like':'neutral';
    card('info','那個人',`${p.desc}。${FEELQ[p.feel].d}<div class="statline" style="opacity:.8">大一就決定要談戀愛:<b class="hl">直接進入關係,不會有失敗</b></div>`);
    settleRomance(p,'active',true); return; }
  if(S.rel){ relationshipTick(); return; }
  encounter(); }
function encounter(){
  if(!chance(70)){ 
    card('','沒有什麼特別的事',pick([
      '這一年你沒有喜歡上任何人。你以為自己壞掉了,其實只是還沒輪到你。',
      '有幾次差一點。差一點約出來,差一點傳出去,差一點就開口了。',
      '這一年你把所有的力氣都用在別的地方了。感情這件事排在很後面。']));
    nextStep(); return; }
  const p=meetPerson(), passiveP=loveRate(p,'passive'), activeP=loveRate(p,'active');
  card('info','那個人',
    `${p.desc}。<br>${FEELQ[p.feel].d}<br>`+
    `<span style="color:var(--dim)">${p.theyMove?'對方已經很明顯了。系上的人都看得出來,只有你還在裝作不知道。':'球在你這邊。要不要開口,是你的事。'}</span>`+
    `<div class="statline" style="opacity:.85">${AGEQ[p.age].n} ${FEELQ[p.feel].n} ${p.theyMove?'對方主動':'沒有人先開口'}</div>`);
  const opts=[];
  if(p.theyMove)opts.push({t:'接受對方',main:true,
    s:`成功率 <b>${passiveP}%</b>|被動追求|有人主動的時候,答應幾乎不會失敗——風險在後面`,
    f:()=>tryLove(p,'passive',passiveP)});
  opts.push({t:p.theyMove?'反過來主動':'主動追求',main:!p.theyMove,
    s:`成功率 <b>${activeP}%</b>|主動追求|口才 50%・信心 30%・政治 20%`,f:()=>tryLove(p,'active',activeP)});
  opts.push({t:'不要,這學期很忙',s:'什麼都不會發生',f:()=>{
    card('',null,pick([
      '<p>你把那句話吞回去了。後來也沒有再拿出來過。</p>',
      '<p>你選擇了論文。這個決定本身沒有錯,只是你會偶爾想起。</p>'])); nextStep(); }});
  choose('這一年,有一個人',opts); }
function tryLove(p,mode,rate){
  if(chance(rate)){ settleRomance(p,mode,false); return; }
  S.loveFails++;
  const d=bump('cf',-3);
  card('bad','沒有成功',pick([
    '對方說「我們這樣就很好」。你點頭說對啊,然後回去把對話紀錄從上到下讀了一遍。',
    '訊息已讀了兩天。第三天對方回了一個貼圖,你就懂了。',
    '你們還是朋友。這句話從對方嘴裡說出來的時候,聽起來像是一種安慰。'])+
    `<div class="statline">信心 <b class="dn">${d}</b></div>`);
  nextStep(); }
function settleRomance(p,mode,boost){
  const kind=outcomeKind(p,mode,boost);
  const tag=`${AGEQ[p.age].n}・${FEELQ[p.feel].n}・${mode==='passive'?'被動':'主動'}`;
  if(kind==='betray'){
    S.exes++; S.loveYears++; S.relLog.push({k:'無情背叛',tag,y:1});
    const d=bump('cf',-12);
    card('bad','無情背叛',
      (p.age==='old'
        ?'對方一直有另一段關係,而你是後來才被加進去的那一個。你從別人口中知道這件事,對方連解釋都省了。'
        :'你是最後一個知道的。所有人都知道,只有你還在幫對方跟別人解釋。')+
      `<br><span style="color:var(--dim)">你花了很久才明白,被騙的人不必為自己的相信道歉。但那時候你不知道。</span>`+
      `<div class="statline">信心 <b class="dn">${d}</b>|${tag}</div>`);
    if(chance(S.ab.cf>=40?35:75))
      beginDepression('你沒有辦法解釋為什麼一件感情的事會讓你連書都讀不下去。<br>你只知道每天醒來的第一個念頭都是那個人,而那個念頭已經不是想念了。');
    else card('info','你撐住了',`你哭了兩個晚上,第三天照常去上課。<br><span style="color:var(--dim)">信心夠厚的人不是不會痛,是痛完之後還站得起來。</span>`);
    nextStep(); return; }
  if(kind==='toxic'){
    S.relLog.push({k:'有毒的關係',tag,y:1}); S.loveYears++;
    S.rel={kind:'toxic',age:p.age,feel:p.feel,years:0,tag,li:S.relLog.length-1};
    const d=bump('cf',-10);
    card('bad','有毒的關係',
      '一開始你覺得是自己太敏感。後來你開始為了避免爭吵而預先修改自己說話的方式,'+
      '再後來你發現自己已經很久沒有跟朋友出去了。<br>'+
      '<span style="color:var(--dim)">對方沒有做錯任何一件具體的事,這是最難跟別人說明的部分。</span>'+
      `<div class="statline">信心 <b class="dn">${d}</b>|${tag}<br><span style="opacity:.75">每年持續消耗信心與口才,直到你離開</span></div>`);
    if(chance(S.ab.cf>=45?55:85))
      beginDepression('你已經分不清楚是這段關係讓你變成這樣,還是你本來就是這樣,所以才留在這裡。');
    nextStep(); return; }
  if(kind==='burn'){
    S.relLog.push({k:'相愛相殺',tag,y:1}); S.loveYears++;
    S.rel={kind:'burn',age:p.age,feel:p.feel,years:0,tag,li:S.relLog.length-1};
    card('gold','相愛相殺',
      '你們可以為了一個概念吵到凌晨三點,然後和好,然後再吵。<br>'+
      '對方是唯一一個會直接說「你怎麼不去死」的人,也是唯一一個真的讀完你寫的每一個字,真正接住你的人。<br>'+
      '<span style="color:var(--dim)">你在這段關係裡變得更聰明,也變得更不確定自己值不值得被喜歡。</span>'+
      `<div class="statline">${bumps([['th',6],['sp',5],['cf',-4]])}|${tag}</div>`);
    nextStep(); return; }
  S.relLog.push({k:'穩定交往',tag,y:1}); S.loveYears++;
  S.rel={kind:'stable',age:p.age,feel:p.feel,years:0,tag,li:S.relLog.length-1};
  card('good','穩定交往',
    pick(['你們的日常很無聊:一起吃飯、一起讀書、一起在深夜的便利商店挑飯糰。',
          '對方會在你趕報告的時候安靜地坐在旁邊做自己的事。你後來才知道這件事有多稀有。'])+
    '<br><span style="color:var(--dim)">被穩定地喜歡著,會讓一個人變得比較敢講話。</span>'+
    `<div class="statline">${bumps([['cf',8],['sp',6]])}|${tag}<br><span style="opacity:.65">往後每年仍有加成,但會逐年遞減至零;分手機率則逐年上升</span></div>`);
  nextStep(); }
/* --- 已有關係:每年結算 --- */
function relationshipTick(){
  S.rel.years++; S.loveYears++;
  if(S.relLog[S.rel.li])S.relLog[S.rel.li].y++;
  const R2=S.rel;
  if(R2.kind==='stable'){
    const y=R2.years;
    /* 分手機率逐年上升,壓力與憂鬱會加速 */
    const bp=Math.round(clamp(26+(y-1)*11+S.stress*3+(S.dep?7:0),15,80));
    if(chance(bp)){ S.rel=null; S.exes++;
      const d=bump('cf',-(3+y));
      card('bad','分手',pick(y>=3?[
        '在一起這麼久之後,你們花了兩個月才把話說完。沒有人做錯什麼,這才是最難接受的部分。',
        '你們把彼此的東西分好,發現大部分都已經分不清是誰的了。'
      ]:[
        '沒有誰對不起誰。你們只是各自忙到某一天發現已經三週沒有好好講過話了。',
        '對方要去別的城市。你們試了半年,然後很有禮貌地結束。'])+
        `<div class="statline">信心 <b class="dn">${d}</b> (在一起 ${y} 年)</div>`);
      nextStep(); return; }
    /* 加成逐年遞減至零 */
    const gc=[0,4,2,0,0][Math.min(y,4)], gs=[0,3,1,0,0][Math.min(y,4)];
    if(gc||gs){
      card('good','還在一起',pick(y===1?[
        '你們開始有只有彼此聽得懂的笑話。',
        '你把口試的簡報先講給對方聽了一次。對方聽不懂,但問了三個很好的問題。'
      ]:[
        '第 '+y+' 年。對方已經記得你所有的地雷,你也是。',
        '你們的相處變得很省力。省力這件事,一開始你以為只有好處。'])+
        `<div class="statline">${bumps([['cf',gc],['sp',gs]])} <span style="opacity:.6">(第 ${y} 年,加成遞減;分手機率 ${bp}%)</span></div>`);
    }else{
      card('','還在一起,但沒有變化',pick([
        '你們已經很久沒有為對方帶來新的東西了。這不是誰的錯,只是它就是會這樣。',
        '你發現自己在轉述對方的話的時候,用的是「我們」,但心裡想的是「反正就這樣」。'])+
        `<div class="statline"><span style="opacity:.7">關係加成已歸零(第 ${y} 年)|分手機率 ${bp}%</span></div>`);
    }
    nextStep(); return; }
  if(R2.kind==='burn'){
    if(chance(35)){ S.rel=null; S.exes++;
      card('info','燒完了',`最後一次吵架沒有結論,只是兩個人都累了。<br>你留下了那些被逼出來的想法,也留下了那個「我是不是很難相處」的問題。<div class="statline">${bumps([['th',3],['cf',-2]])}</div>`);
    }else{
      card('gold','還在燒',pick([
        '對方列了一堆理由說你寫的東西是垃圾,你氣了三天,然後不得不承認每一條都對。',
        '你們又為了一個引註吵起來。凌晨四點,你發現自己在笑。'])+
        `<div class="statline">${bumps([['th',5],['sp',3],['cf',-4]])}</div>`);
    }
    nextStep(); return; }
  /* toxic */
  const d1=bump('cf',-5), d2=bump('sp',-3);
  card('bad','還在裡面',pick([
    '你又一次為了不吵架而沒有把話講完。你已經很習慣了,習慣本身就是問題。',
    '朋友問你最近怎麼都不出來,你說最近比較忙。你連撒謊都變得很熟練。'])+
    `<div class="statline">信心 <b class="dn">${d1}</b> 口才 <b class="dn">${d2}</b> (第 ${R2.years} 年)</div>`);
  const p=Math.round(clamp((S.ab.cf*0.5+S.ab.po*0.3+S.ab.sp*0.2-14)*2.6+18,12,88));
  choose('要離開嗎',[
    {t:'離開這段關係',main:true,s:`成功率 <b>${p}%</b>(信心 50%・政治 30%・口才 20%)|失敗則再撐一年`,f:()=>{
      if(chance(p)){ S.rel=null; S.exes++;
        card('good','走出來了',`你把東西收一收就走了,沒有大吵,也沒有解釋。<br><span style="color:var(--dim)">你花了半年才重新習慣自己講話不必先想過三遍。</span><div class="statline">${bumps([['cf',5],['sp',3]])}</div>`);
      }else{
        const d=bump('cf',-3);
        card('bad','又回去了',`你提了。然後對方哭了、道歉了、說會改。你相信了,因為相信比較不痛。<div class="statline">信心 <b class="dn">${d}</b></div>`);
      } nextStep(); }},
    {t:'再看看,也許會變好',warn:true,s:'維持現狀|下一年繼續消耗',f:()=>{
      card('','再看看',`你在心裡給了對方一個期限。你不會遵守那個期限的。`); nextStep(); }},
  ]); }

/* ================= 崩潰・住院・壞結局 ================= */
function crisisCheck(){
  if(!S.dep||S.ab.cf>=15)return false;
  if(S.crisis>=1){ badEnding(); return true; }
  S.crisis=1; hospitalize(); return true; }
function hospitalize(){
  S.skipNext=true; S.stress=0;
  const r=restoreDep();
  const i=S.mhList.lastIndexOf('憂鬱症'); if(i>=0)S.mhList[i]='憂鬱症(住院)';
  const dth=bump('th',-4), dem=bump('em',-4), dsp=bump('sp',-3);
  const dcf=bump('cf',Math.min(12,Math.max(0,20-S.ab.cf)));
  const hs=S.grade<3;
  card('bad','崩潰・住院療養',
    (hs?`你已經一個月沒有進教室了。系辦打了幾通電話,最後是你媽媽請假來把你帶走。<br>`
       :`你已經一個月沒有進教室了。最後是室友聯絡了你家人,他們開了車到學校把你接走。<br>`)+
    `醫院的日光燈很亮,作息表貼在牆上,每天六點半有人叫你起床。你在那裡待了一整個冬天。<br>`+
    `<span style="color:var(--dim)">${hs?'學校幫你辦了休學,沒有人特別問起。':'系上幫你辦了休學。你的名字從那一屆的名單上消失,沒有人特別問起。'}</span>`+
    `<div class="statline">${r}<br>理論直覺 <b class="dn">${dth}</b> 實證努力 <b class="dn">${dem}</b> 口才 <b class="dn">${dsp}</b>`+
    (dcf?` 信心 <b class="up">+${dcf}</b>(治療穩定)`:'')+
    `<br>壓力歸零|<b class="hl">下一年休學,完全停止累積</b></div>`);
  choose('',[{t:'→ 明年見',main:true,f:()=>endYear()}]); }

  function badEnding(){
  board(2); divider('結局');
  const rows=KEYS.map(k=>`${ABL[k]} <b>${S.ab[k]}</b>`).join(' ');
  card('bad','壞結局・人社系484有毒',
    `復學之後你撐了不到一個學期。<br>`+
    `<br>`+
    `“看著窗外的光<br>`+
    `分不清是路燈還是太陽<br>`+
    `仔細搜索著自己的身體<br>`+
    `試著找出一道合理的傷<br>`+
    `卻還是得說謊”<br>`+
    `<div class="statline">${S.O.n}出身・${S.tier?TIERS[S.tier].n:'高中'}・${S.age} 歲離開<br>${rows}<br>`+
    `精神科病史 ${S.mhList.join('、')||'無'}|住院 ${S.crisis} 次</div>`);
  if(voidU())card('','',`<span style="color:var(--dim);font-size:12.5px">你在這裡的四年幾乎沒有留下任何東西。連要恨誰都找不到對象。</span>`);
  card('info','',`<span style="color:var(--dim);font-size:12.5px">這是人們眼中最壞的一種結局,但你相信,自找的苦痛比不請自來的更有尊嚴。`);
  endGame('bad','人社系484有毒',[`${S.age} 歲離開學校`,'沒有人會為這件事負責'],[
    ['§','紀錄'],
    ['出身',S.O.n],['學校',S.tier?TIERS[S.tier].n:'高中'],
    ['住院',S.crisis+' 次'],['精神科病史',S.mhList.join('、')||'無'],
    ['文學獎',`參賽 ${S.litEntries}・得獎 ${S.litWins}`],
    ...loveRows(),
  ]); }

/* ================= 結算與畢業去向 ================= */
function finale(){
  board(2); divider(`${S.age} 歲 · 畢業`);
  const rows=KEYS.map(k=>{ const v=S.ab[k],pk=S.pot[k];
    return `<div class="abrow" style="cursor:default"><span class="nm">${ABL[k]}</span><span class="bar"><i style="width:${Math.min(100,v/BAR*100)}%"></i><em style="left:${Math.min(100,pk/BAR*100)}%"></em></span><span class="val">${v}<small style="opacity:.5">/${pk}</small></span></div>`; }).join('');
  const tl=S.traitList.length?S.traitList.map(t=>`<span class="trait">${t}</span>`).join(''):'<span style="color:var(--dim)">無</span>';
  card('gold',`${S.age} 歲・畢業`,
    `${S.O.n}出身的 <b class="hl">${S.name}</b>,從 ${TIERS[S.tier].n} 畢業${S.lost?`(休學 ${S.lost} 年,延畢)`:''}。`+
    `<div style="margin-top:8px">${rows}</div>`+
    `<div class="statline" style="margin-top:8px">學者類型 <b class="hl">${scholarType()}</b> 綜合 <b class="hl">${ovr()}</b> 聲望 <b class="hl">${S.rep}</b><br>文學獎 參賽 ${S.litEntries} 次・得獎 ${S.litWins} 次${S.mhList.length?`<br>精神科病史 ${S.mhList.join('、')}${S.crisis?`|住院 ${S.crisis} 次`:''}`:''}`+
    `${S.relLog.length?`<br>感情紀錄 ${S.relLog.map(r=>`${r.k}・${r.y} 年`).join('、')}${S.rel?`(${REL[S.rel.kind].n}中)`:''}`:'<br>感情紀錄 無'}${S.loveFails?`|被拒 ${S.loveFails} 次`:''}</div>`+
    `<div style="margin-top:8px;font-size:12px;color:var(--dim);letter-spacing:.15em">已取得屬性</div><div>${tl}</div>`);
  gradChoice(); }

function msRate(){
  let sc=S.ab.th*0.3+S.ab.em*0.3+S.ab.po*0.2+S.ab.ad*0.1+S.rep*0.1;
  sc+= S.thesis==='great'?8 : S.thesis==='ok'?3 : S.thesis==='none'?-8 : 0;
  return {sc,p:Math.round(clamp((sc-32)*3.2+30,5,95))}; }
function phdOK(){ return S.ab.th>=55&&S.rep>=45&&(S.thesis==='great'||S.traits.nsc); }
function gradChoice(){
  const m=msRate(), ok=phdOK();
  choose('畢業去向',[
    {t:'推甄碩士班',main:true,s:`錄取率 <b>${m.p}%</b>(理論 30%/實證 30%/政治 20%/行政 10%+聲望+論文 ${S.thesis==='great'?'+8':S.thesis==='ok'?'+3':S.thesis==='none'?'−8':'0'})|落榜則進入職場`,
     f:()=>{ if(chance(m.p)){
        card('gold','推甄上了',`備審資料二十頁,面試十五分鐘。放榜那天你反覆重新整理了四十次頁面。<br>你還不知道,真正的篩選現在才開始。`);
        masterProgram(); }
      else{ card('bad','落榜',`正取六名、備取三名,沒有你。有人跟你說「再考一年就好」,但你算了一下家裡還能撐多久。<div class="statline">${bumps([['cf',-6]])}</div>`);
        career('碩士落榜'); } }},
    {t:'直攻博士班',s:ok?'預備研究生資格審查|學術路線的極端解':'需要 理論直覺 ≧55、聲望 ≧45,且有學士論文獎或國科會計畫',dis:!ok,
     f:()=>{ card('gold','直攻博士',`老師說:「你要想清楚,這是十年的事。」你說你想清楚了。你當然沒有。`);
        phdChoice(true); }},
    {t:'投入職場',warn:true,s:'進入結局|依 理論直覺・信心・政治・行政 判定',
     f:()=>career('主動求職')},
  ]); }

/* 少年股神:理論 ≥62(躁鬱症 ≥55)、行政 ≤42、實證 ≤48(躁鬱症 ≤50、≤55)。有資格的人擲 stockP()%,特質疊加(使用者):
   一般 40%、ADHD +10、躁鬱症 +40 → ADHD 50%、躁鬱症 80%、ADHD+躁鬱症 90%(使用者:現在錢難賺,聰明人本來就會找捷徑)。
   (更早是一般 50%/躁鬱症 85%) */
const STOCK_P=40, STOCK_ADHD=10, STOCK_BIP=40;
function stockP(){ return STOCK_P+(S.traits.adhd?STOCK_ADHD:0)+(S.traits.bipolar?STOCK_BIP:0); }
/* 轉職科技業樂透(使用者):取代原本 100% 照能力判定的聰明型轉職專屬路線。
   彩票(%):國立 交換 20;頂大 ADHD 30、雙主修 20、輔系 10、交換 20;帝大 ADHD 40、雙主修 30、輔系 15、交換 25。私校、海外大學部沒有。
   交換:甄選大成功、備取都算(兩種都有交換學生屬性)。雙主修、輔系二選一。
   好幾張不讓它堆:最高那張全額,其他每多一張只加 LOTTO_EXTRA%。
   碩士畢業:只剩 ADHD 彩票(碩士肄業照常)。
   實證怪(本來會去當研究助理的人)鎖死固定機率、不另外抽:頂大、帝大都是 10%(使用者:帝大比頂大低是偽命題);碩士畢業沒有。
   中獎後判型(lottoType):理論或實證是六項裡最高 → 聰明型;其他 → 會講型(ADHD 不鎖:做人的工作的 ADHD 也不少,使用者) */
const LOTTO={nat:{exch:20},top:{adhd:30,dual:20,minor:10,exch:20},emp:{adhd:40,dual:30,minor:15,exch:25}}, LOTTO_EMF={top:10,emp:10}, LOTTO_EXTRA=5;
const lottoMS=()=>S.msLevel==='ok'||S.msLevel==='great';
function lottoTickets(){ const L=LOTTO[S.tier]; if(!L)return []; const ms=lottoMS(), t=[];
  if(L.adhd&&S.traits.adhd)t.push(['ADHD',L.adhd]);
  if(!ms){ if(L.dual&&S.dualMajor==='full')t.push(['雙主修',L.dual]);
    if(L.minor&&S.dualMajor==='minor')t.push(['輔系',L.minor]);
    if(L.exch&&S.traits.exch)t.push(['交換學生',L.exch]); }
  return t.sort((a,b)=>b[1]-a[1]); }
function lottoP(t){ return t.length?t[0][1]+LOTTO_EXTRA*(t.length-1):0; }
function lottoType(){ const a=S.ab; return Math.max(a.th,a.em)>=Math.max(a.th,a.em,a.po,a.cf,a.ad,a.sp)?'smart':'people'; }
function stockGod(){
  const bip=!!S.traits.bipolar;
  const thMin=bip?55:62, adMax=bip?50:42, emMax=bip?55:48;  /* 要打敗大盤得夠聰明(使用者):理論門檻 52→62,躁鬱症 45→55 */
  if(!(S.ab.th>=thMin&&S.ab.ad<=adMax&&S.ab.em<=emMax))return false;
  return chance(stockP()); }
/* ================= 碩士班 ================= */
function msThesisScore(){ return S.ab.th*0.35+S.ab.em*0.35+S.ab.ad*0.10+S.ab.cf*0.15+S.ab.po*0.05; }
function msDropRisk(){
  return Math.round(clamp(14+(30-S.ab.cf)*1.4+(S.dep?22:0)+(S.traits.adhd?8:0)+S.stress*3-(S.ab.ad-30)*0.6,4,72)); }
function masterProgram(){
  const drop=msDropRisk(), sc=msThesisScore();
  card('info','碩士班',
    `修業兩年,寫論文三年。你開始知道那些掛在研究室門口,沒見過人的名字是怎麼來的。<br>`+
    `<span style="color:var(--dim)">碩士班不篩選聰明,它篩選的是「能不能把一件沒有人在乎的事做完」。</span>`+
    `<div class="statline">退學風險 <b class="dn">${drop}%</b> (信心・行政・精神狀態・壓力)<br>`+
    `論文分數 <b class="hl">${sc.toFixed(1)}</b> 理論 35%・實證 35%・信心 15%・行政 10%・政治 5%<br>`+
    `<span style="opacity:.7">58 以上為優秀論文,否則平庸</span></div>`);
  choose('',[{t:'→ 三年後',main:true,f:()=>{
    if(chance(drop))msDropout();
    else if(sc>=58)msGreat();
    else msMediocre(); }}]); }
function msDropout(){
  S.msLevel='drop';
  const a=bump('ad',4), c=bump('cf',-16);
  card('bad','碩士退學',
    `第三年你已經很久沒有進研究室了。指導教授最後一次寄信給你,你連開都沒有開。<br>`+
    `辦退學的手續比想像中簡單,蓋七個章,四十分鐘。<br>`+
    `<span style="color:var(--dim)">你把那些讀書會的筆記整箱丟掉的時候,才真的哭出來。</span>`+
    `<div class="statline">行政 <b class="up">+${a}</b>(你至少學會了怎麼跑流程) 信心 <b class="dn">${c}</b></div>`);
  choose('',[{t:'→ 進入職場',main:true,f:()=>career('碩士退學')}]); }
function msMediocre(){
  S.msLevel='ok';
  card('info','平庸論文',
    `你交出去了。口試委員問的問題都很客氣,客氣到你知道他們沒有很認真讀。<br>`+
    `<span style="color:var(--dim)">你曾經幻想能夠創造些什麼屬於你的東西,但現在的你只求順利畢業。</span>`+
    `<div class="statline">${bumps([['em',6],['ad',6]])}</div>`);
  choose('接下來呢',[
    {t:'進入職場',main:true,s:'依 理論直覺・信心・政治・行政 判定',f:()=>career('碩士畢業')},
    {t:'硬考本土博士',warn:true,
     s:'政治 +7 行政 +5 實證 +3|碩論平庸:教職競爭力 −10|可能唸完仍然沒有專任',
     f:()=>{ S.weakPhd=true;
       card('info','還是唸下去了',
         `沒有人特別鼓勵你唸,但也沒有人阻止你。你考上了,因為那年報名的人只比錄取名額多兩個。<br>`+
         `<span style="color:var(--dim)">「先唸再說,反正外面也不好找。」這句話你會在往後十年裡聽很多人說,包括你自己。</span>`+
         `<div class="statline">${bumps([['po',7],['ad',5],['em',3]])}</div>`);
       academicCareer('local'); }},
  ]); }
function msGreat(){
  S.msLevel='great';
  card('gold','優秀論文',
    `口試那天有兩個委員為了你的第三章的立論吵了起來,而你發現自己有能力回答他們兩個人。<br>`+
    `會後有人問你要不要把它改寫成專書。<br>`+
    `<span style="color:var(--dim)">那是你第一次感覺到,自己說的話可能有一點重量。</span>`+
    `<div class="statline">${bumps([['cf',8],['th',6],['em',5],['po',5]])}</div>`);
  S.rep+=20; phdChoice(false); }
function phdChoice(direct){
  const ok=S.ab.th>=50;
  choose('接下來呢',[
    {t:'你受夠了',warn:true,s:'離開學術|進入職場判定',f:()=>career(direct?'放棄直攻博士':'碩士畢業・離開學術')},
    {t:'海外博士',main:true,s:'理論 +8 口才 +6 信心 +4 政治 −6|教職競爭力 +8'+(ok?'':'|理論直覺偏低,風險高'),
     f:()=>{ card('gold','海外博士',
        `你在異國的圖書館裡度過了六年。第一年你連點餐都會緊張,第四年你在系上的 colloquium 主講。<br>`+
        `<span style="color:var(--dim)">回國那天你發現同屆的人已經在系上有位子了,而你連誰是誰都還要重新認一次。</span>`+
        `<div class="statline">${bumps([['th',8],['sp',6],['cf',4],['po',-6]])}</div>`);
        academicCareer('overseas'); }},
    {t:'本土博士',s:'政治 +9 行政 +6 實證 +4 理論 +2|留在同一個系統裡',
     f:()=>{ card('gold','本土博士',
        `你留在原本的系統裡。同一批老師、同一間研究室、同一組人脈,只是身分從學生變成了「小老師」。<br>`+
        `<span style="color:var(--dim)">你很早就知道誰跟誰不合、哪個委員會該爭取。這些東西在國外唸書的人要花十年才學得會。</span>`+
        `<div class="statline">${bumps([['po',9],['ad',6],['em',4],['th',2]])}</div>`);
        academicCareer('local'); }},
  ]); }

/* ================= 三十年學術職涯 ================= */
function academicCareer(kind){
  const a=S.ab, YEARS=30;
  /* 時間推進:博班年數 + 三十年職涯 */
  const dy=kind==='overseas'?9:8, degreeYear=S.year+dy;
  S.year=degreeYear+YEARS; S.age+=dy+YEARS;
  /* --- 教職 --- */
  const tierBonus={emp:6,top:3,nat:1,priv:0,intl:5}[S.tier]||0;
  /* 就業市場:那年有沒有缺、缺在不在你的領域,這件事不是你能控制的 */
  const luck=ri(-9,9);
  const post=a.th*0.30+a.po*0.25+a.em*0.20+a.ad*0.10+Math.min(S.rep,100)*0.10
    +(kind==='overseas'?8:0)+tierBonus-(S.weakPhd?14:0)+luck;
  const POSTS=[[78,'帝大霸權 教職'],[66,'頂大系統 教職'],[54,'國立大學 教職'],[42,'私校聯盟 教職'],[-99,'沒有專任教職']];
  const job=POSTS.find(x=>post>=x[0])[1];
  const tenured=job!=='沒有專任教職';
  /* --- 科技部計畫:30 次申請 --- */
  const gp=clamp((a.em*0.35+a.po*0.30+a.ad*0.25+a.th*0.10-24)*1.7,6,86)*(tenured?1:0.45);
  let grants=0; for(let i=0;i<YEARS;i++)if(chance(gp))grants++;
  /* 計畫是研究的燃料:決定產出係數,也小幅提升品質 */
  const fund=grants/YEARS, mult=0.58+0.72*fund;
  /* --- 研討會論文:政治主導、理論次之、行政再次、實證最輕 --- */
  const nConf=Math.max(0,Math.round((1.5+a.po*0.20+a.th*0.09+a.ad*0.06+a.em*0.04)*mult*(tenured?1:0.55)));
  /* 國際比例:本土博士的場子多半在國內,海外博士反過來 */
  const intlShare=clamp(0.04+a.po/700+fund*0.14+(kind==='overseas'?0.26:-0.02),0.03,0.62);
  const confI=Math.round(nConf*intlShare), confD=nConf-confI;
  /* --- 產出總量 --- */
  let nPapers=Math.max(1,Math.round((4+a.em*0.22+a.po*0.08+a.ad*0.04)*mult*(tenured?1:0.5)));
  let nBooks =Math.max(0,Math.round((0.6+a.th*0.032+a.em*0.018)*mult*(tenured?1:0.5)));
  /* 一年就那麼多時間:跑場子跑得多,寫出來的就少 */
  const confDrag=clamp(1-Math.max(0,(nConf/Math.max(1,nPapers))-0.85)*0.28,0.55,1);
  /* --- 分級規則 --- */
  const landmarkOK = a.th>=80&&a.po<=60;
  const influOK    = (a.th>=70&&a.em>=60)||a.po>=70;
  const pInflu = influOK?clamp((a.th+a.em+a.po*0.5)/4-18+fund*7,10,52):0;
  /* 乏人問津有兩個獨立來源:政治低=沒有人注意到,理論低=有人翻開但讀不完 */
  const pIgnorPo = a.po<60?(60-a.po)*0.75:0;
  const pIgnorTh = a.th<60?(60-a.th)*0.70:0;
  const pIgnor = clamp(pIgnorPo+pIgnorTh,0,45);
  let landmarkLeft=0;
  if(landmarkOK)for(let i=0;i<3;i++)if(chance(50))landmarkLeft++;
  function grade(n,landP){
    const r={land:0,infl:0,mid:0,ign:0};
    for(let i=0;i<n;i++){
      if(landmarkLeft>0&&chance(landP)){ r.land++; landmarkLeft--; continue; }
      if(chance(pInflu)){ r.infl++; continue; }
      if(chance(pIgnor)){ r.ign++; continue; }
      r.mid++; }
    return r; }
  /* 套用研討會排擠效應 */
  nPapers=Math.max(1,Math.round(nPapers*confDrag));
  nBooks =Math.max(0,Math.round(nBooks*clamp(confDrag+0.10,0.6,1)));
  const B=grade(nBooks,70), P=grade(nPapers,16);
  /* 劃時代名額沒用完的,補在專書上(經典多半是書) */
  while(landmarkLeft>0&&B.mid>0){ B.mid--; B.land++; landmarkLeft--; }
  /* 聲望特例:名氣本身就會讓書被讀——最多兩部專書 */
  let repSlots=0;
  if(S.rep>=75&&chance(75))repSlots++;
  if(S.rep>=110&&chance(60))repSlots++;
  let repUp=0;
  for(let i=0;i<repSlots;i++){
    if(B.mid>0){ B.mid--; B.infl++; repUp++; }
    else if(B.ign>0){ B.ign--; B.infl++; repUp++; } }
  /* --- 優良教師 --- */
  const tp=clamp((a.sp*0.6+a.cf*0.4-38)*1.6,2,48)*(tenured?1:0.6);
  let teach=0; for(let i=0;i<YEARS;i++)if(chance(tp))teach++;
  /* --- 系主任 --- */
  let chair=0;
  if(tenured){ const cp=clamp((a.ad*0.5+a.po*0.5-38)*3.0,0,92);
    if(chance(cp)){ chair=3; if(chance(cp*0.55))chair+=3; if(chance(cp*0.25))chair+=3; } }
  /* --- 呈現 --- */
  const row=(l,v,c)=>`<div style="display:flex;justify-content:space-between;gap:10px;padding:2px 0"><span style="color:${c||'var(--paper)'}">${l}</span><b style="font-family:var(--mono);color:${c||'var(--brass)'}">${v}</b></div>`;
  const kindN=kind==='overseas'?'海外博士':'本土博士';
  card(tenured?'gold':'bad','三十年後',
    `${kindN}。你在 ${degreeYear} 年前後拿到學位,然後是三十年。<br>`+
    `<span style="color:var(--dim)">${tenured?'你有一間自己的研究室,門口貼著你的名字和 office hour。':'你沒有拿到專任教職。三十年來你在四所學校之間跑鐘點,每學期重新簽一次約。'}</span>`+
    `<div class="statline" style="line-height:1.9">`+
    row('教職',job,tenured?'var(--brass)':'var(--bad)')+
    row(' 就業市場運氣',(luck>=0?'+':'')+luck,'var(--dim)')+
    row('科技部計畫',`${grants} / ${YEARS} 件`)+
    row(' 產出係數',`×${mult.toFixed(2)}`,'var(--dim)')+
    `<div style="margin-top:6px;color:var(--dim);font-size:11.5px;letter-spacing:.15em">學術專書 ${nBooks} 本</div>`+
    row(' 劃時代經典',B.land+' 本',B.land?'var(--brass)':'var(--dim)')+
    row(' 有影響力',B.infl+' 本')+
    (repUp?row('  其中靠聲望',repUp+' 本','var(--dim)'):'')+
    row(' 平庸無奇',B.mid+' 本','var(--dim)')+
    row(' 乏人問津',B.ign+' 本','var(--dim)')+
    `<div style="margin-top:6px;color:var(--dim);font-size:11.5px;letter-spacing:.15em">期刊論文 ${nPapers} 篇</div>`+
    row(' 劃時代經典',P.land+' 篇',P.land?'var(--brass)':'var(--dim)')+
    row(' 有影響力',P.infl+' 篇')+
    row(' 平庸無奇',P.mid+' 篇','var(--dim)')+
    row(' 乏人問津',P.ign+' 篇','var(--dim)')+
    `<div style="margin-top:6px"></div>`+
    `<div style="margin-top:6px;color:var(--dim);font-size:11.5px;letter-spacing:.15em">研討會論文 ${nConf} 篇</div>`+
    row(' 國際研討會',confI+' 篇')+
    row(' 國內研討會',confD+' 篇','var(--dim)')+
    `<div style="margin-top:6px"></div>`+
    row('優良教師',teach+' 次')+
    row('系主任',chair?chair+' 年':'沒有當過')+
    `</div>`);
  board(2);
  academicCoda(kind,job,tenured,B,P,grants,teach,chair,mult,repUp,nBooks,nPapers,luck,nConf,confI,confD,confDrag); }

function academicCoda(kind,job,tenured,B,P,grants,teach,chair,mult,repUp,nBooks,nPapers,luck,nConf,confI,confD,confDrag){
  const land=B.land+P.land, infl=B.infl+P.infl, ign=B.ign+P.ign;
  let title,body;
  if(land>=2&&chair>=6){ title='學科台柱';
    body='你的名字變成了一種形容詞,而系上的每一份預算表也都有你的簽名。<br>'+
      '你既寫得出讓人反覆引用的東西,也守得住一個系的存續——這兩件事很少長在同一個人身上。<br>'+
      '<span style="color:var(--dim)">退休那天有人說,沒有你就沒有這個系。你知道那句話的另一半意思是,這個系從此要自己走下去了。</span>'; }
  else if(land>=3){ title='學派';
    body='你的名字變成了一種形容詞。研究生在報告裡寫「某某式的讀法」,指的是你。<br>'+
      '你活著看到自己的東西進了教科書——這件事發生的時候,你正在為了一份核銷單跟會計室吵架。'; }
  else if(land>=1){ title='那一本書';
    body='你寫過一本大家都會引用的書。之後的二十年,每一次自我介紹都會被提到它。<br>'+
      '<span style="color:var(--dim)">你後來寫的東西沒有一本超過它。你不確定那是因為你退步了,還是因為那本書把你用完了。</span>'; }
  else if(tenured&&S.ab.sp>=65&&(nBooks+nPapers)<=22&&teach>=6){ title='網紅教授';
    body='你的一場演講在網路上被看了兩百萬次。有高中生寫信給你,說是因為你才決定要讀這個系。<br>'+
      '系上有些耳語你當然聽過——說你把學問講得太簡單,說你的書單十年沒換過,說你上一篇期刊論文是哪一年的事。<br>'+
      '你不太在意。你相信這個學科需要有人去引入活水,而那個人剛好是你。<br>'+
      '<span style="color:var(--dim)">你的行程表排到明年。你確實已經很久沒有坐下來寫完一篇東西了。</span>'; }
  else if(nConf>=26&&S.ab.po>=65&&nConf>=nPapers*1.2&&(B.infl+P.infl)<=4){ title='研討會動物';
    body='你的履歷上,研討會那一欄比期刊那一欄長。<br>'+
      '你認識每一個人,每一個人也都認識你。你在茶敘時間促成的合作案比你寫過的論文還多。<br>'+
      '<span style="color:var(--dim)">那些發表過的東西後來有沒有變成什麼,沒有人追問過。</span>'; }
  else if(chair>=6){ title='行政人生';
    body='你把最好的十年給了會議、評鑑、招生和系務。系上因為你而運作良好。<br>'+
      '<span style="color:var(--dim)">退休演講上,同事說你是系上的支柱。沒有人提到你的研究。</span>'; }
  else if(infl>=6){ title='穩健的一生';
    body='你不是天才,但你三十年沒有停過。你的論文被引用、被反駁、被繼續寫下去。<br>學術大部分就是由你這種人撐起來的。'; }
  else if(!tenured){ title='流浪';
    body='你到現在還在教通識。學生很喜歡你,每學期的評鑑都很高分。<br>'+
      '<span style="color:var(--dim)">你六十歲那年還在投履歷。你已經不太記得當初想研究的是什麼問題了。</span>'; }
  else if(ign>=(nBooks+nPapers)*0.35){ title='沒有人讀';
    body='你發表了很多東西。你可以確定的是,其中大部分沒有第二個人從頭讀到尾。<br>'+
      '<span style="color:var(--dim)">但升等需要,評鑑需要,系上的排名需要。所以你繼續寫。</span>'; }
  else { title='一份工作';
    body='你按時上下班,論文按時產出,課按時教完。三十年就這樣過去了。<br>'+
      '<span style="color:var(--dim)">你偶爾會想起大學那年在總圖地下室啃完那本書的自己。那個人以為前面有別的東西。</span>'; }
  const extra = voidU()?'<br><br><span style="color:var(--dim)">大學那四年你幾乎什麼都沒做。後來每次有學生問你怎麼走到這裡的,你都答不太出來。</span>'
    : S.traits.bipolar?'<br><br><span style="color:var(--dim)">你的產出一直是一陣一陣的。系上的人習慣了,說你是「有靈感型的」。</span>'
    : S.dep?'<br><br><span style="color:var(--dim)">那件事你從來沒有真的處理過。它跟著你進了研究室,也跟著你退休。</span>'
    : S.traits.adhd?'<br><br><span style="color:var(--dim)">你到六十歲還是會在系務會議上走神。你已經不再為此感到抱歉了。</span>':'';
  /* 色階:金=留下了東西 綠=好好活著 藍=中性 紫=諷刺 紅=壞 */
  const ATONE={'學科台柱':'gold','學派':'gold','那一本書':'gold',
    '穩健的一生':'good','行政人生':'good','一份工作':'info',
    '研討會動物':'satire','網紅教授':'satire',
    '流浪':'bad','沒有人讀':'bad'};
  const atone=ATONE[title]||(land>=1?'gold':tenured?'info':'bad');
  card(atone,'結局・'+title,body+extra+
    `<div class="statline">${KEYS.map(k=>`${ABL[k]} <b>${S.ab[k]}</b>`).join(' ')}<br>`+
    `${S.O.n}出身|${TIERS[S.tier].n}畢業|${kind==='overseas'?'海外':'本土'}博士|${job}${S.mhList.length?`|${S.mhList.join('、')}`:''}</div>`);
  endGame(atone,title,
    [`${kind==='overseas'?'海外':'本土'}博士・三十年學術生涯`,job],[
    ['§','職位與資源'],
    ['教職',job],
    ['科技部計畫',grants+' / 30 件'],
    ['就業市場運氣',(luck>=0?'+':'')+luck,'#948da6'],
    ['產出係數','×'+mult.toFixed(2),'#948da6'],
    ['§','學術專書 '+nBooks+' 本'],
    ['劃時代經典',B.land+' 本',B.land?'#d4a24c':'#948da6'],
    ['有影響力',B.infl+' 本'],
    ...(repUp?[[' 其中靠聲望',repUp+' 本','#948da6']]:[]),
    ['平庸無奇',B.mid+' 本','#948da6'],
    ['乏人問津',B.ign+' 本','#948da6'],
    ['§','期刊論文 '+nPapers+' 篇'],
    ['劃時代經典',P.land+' 篇',P.land?'#d4a24c':'#948da6'],
    ['有影響力',P.infl+' 篇'],
    ['平庸無奇',P.mid+' 篇','#948da6'],
    ['乏人問津',P.ign+' 篇','#948da6'],
    ['§','研討會論文 '+nConf+' 篇'],
    ['國際研討會',confI+' 篇'],
    ['國內研討會',confD+' 篇','#948da6'],
    ['§','教學與行政'],
    ['優良教師',teach+' 次'],['系主任',chair?chair+' 年':'沒有當過'],
    ['§','出身與紀錄'],
    ['出身',S.O.n],['大學',TIERS[S.tier].n],
    ['碩士論文',S.weakPhd?'平庸':'優秀'],
    ['精神科病史',S.mhList.join('、')||'無'],
    ...loveRows(),
  ]); }

function msBonus(){ return {none:0,drop:2,ok:7,great:11}[S.msLevel]||0; }
function DEGN(){ return {none:'學士',drop:'碩士肄業',ok:'碩士(平庸論文)',great:'碩士(優秀論文)'}[S.msLevel]; }
function musicianRoll(){
  if(S.ab.th<=50)return false;
  let p=7;
  if(S.org==='art')p+=17;
  if(S.traits.prodigy)p+=8; else if(S.litWins>0)p+=5;
  if(S.traits.bipolar)p+=5;
  return chance(p); }
function career(reason){
  const raw=S.ab.th*0.35+S.ab.cf*0.30+S.ab.po*0.20+S.ab.ad*0.15;
  const mb=msBonus(), sc=raw+mb;
  /* 早慧文青:不動判定分數,只在「哪一項主導」的比較上悄悄偏向理論 */
  const thBias=S.traits.prodigy?5:0;
  const cand=[['th',S.ab.th+thBias],['cf',S.ab.cf],['po',S.ab.po],['ad',S.ab.ad]].sort((a,b)=>b[1]-a[1]);
  const dom=cand[0][0];
  let band=sc>=50?0:sc>=38?1:2;
  /* 轉職科技業:一般結局的兩格(使用者)——中段×理論最高=聰明型;口才最高(中段,或高分但理論不到 MINGSHI_TH)=會講型;
     另外是機率:轉職科技業樂透(lottoTickets)、偏鄉貧寒 POOR_TECH% 向下兼容 */
  const domE=dom, MINGSHI_TH=55;
  /* 偏鄉貧寒向下兼容(使用者,數字待調):本來會是文化評論家(高分×理論最高)或抽中藝文工作者,各有 POOR_TECH% 改去轉職(家裡需要一份穩定的薪水) */
  const POOR_TECH=40;
  /* 轉職科技業兩版內文(標題同一個):聰明型=產品、使用者研究;會講型=人資、PM */
  const TECH={smart:PH(`你把在田野|練出來的訪談技術,|拿去觀察消費者|為什麼在結帳頁面|猶豫了。`)+`<br>`+
        PH(`以前你讀社會學|是為了拆解|資本隱蔽的宰制結構,|現在你寫訪談報告,|是幫公司|把讓人上癮的設計|藏得更好。`)+`<br>`+
        PH(`去年年終領了四個月,|你搬出了頂樓加蓋,|公司有員工餐廳和健身房,|出國不用再挑|最便宜的紅眼班機和住宿。`)+`<br>`+
        `<span style="color:var(--dim)">`+PH(`入職第一筆薪水入帳那天,|你才意識到|原來自己也有標價,|但你還是收下了。`)+`</span>`,
    people:PH(`你不會寫程式,|但你很會追蹤進度,|也很會開會,|也很會做|上頭想看的投影片。`)+`<br>`+
        PH(`你每天夾在|工程師和老闆中間,|把雙方的話|翻成對方聽得下去的版本。`)+`<br>`+
        `<span style="color:var(--dim)">`+PH(`那些年讀的批判理論|沒有幫你改變世界,|只是讓你很清楚,|自己的位置|是體制裡最好用的潤滑劑。`)+`</span>`,
    /* 資本之家的嘴砲王(使用者寫的):口才那一格 */
    vc:PH(`你不會寫程式,|也不懂演算法,|但你在研討課|練出來的口才,|讓你可以|把任何空洞的點子|講得像一場社會運動。`)+`<br>`+
        PH(`以前你在課堂上|批判晚期資本主義的拜物教,|現在你做|精美的英文募資簡報,|跟投資人解釋|你們找外包做的軟體 demo&nbsp;|如何站在|下一波工業革命的|風口浪尖上。`)+`<br>`+
        PH(`這幾年你開過兩間公司,|第一間把錢燒光了,|第二間連產品都沒上線,|你的自介欄|寫上了連續創業家。`)+`<br>`+
        PH(`今年你又順利拿到了|兩千萬的天使輪資金,|把團隊搬進|信義區的共享辦公室。`)+`<br>`+
        `<span style="color:var(--dim)">`+PH(`領投的天使投資人|在你小時候過年|包過紅包給你,|但財經雜誌的專訪上|寫你們是在|創業媒合會上|一拍即合。`)+`</span>`};
  const E={
   0:{th:['文化評論家','一家還算有名的出版社要你當編輯,兩年後你開始在副刊寫專欄。<br>薪水很低,但每次有人在書店拿起你編的書,你都覺得值得。'],
      cf:['自媒體創作者','你開了一個談社會議題的頻道。第八個月開始有業配,第二年你辭掉了正職。<br>你把人社訓練變成了說故事的能力,系上老師不太理解,但你的訂閱者理解。'],
      po:['政治幕僚','你進了立委辦公室當助理,三年後成為辦公室主任。<br>你寫的新聞稿上不會有你的名字,但那些法案的第三條第二項是你熬夜改出來的。'],
      ad:['高考文官','你考上高考三級,分發到部裡。<br>同事說你是他們見過最會寫公文的人。你偶爾會想起大學讀過的那些理論,然後繼續處理下一個案子。']},
   1:{th:['轉職科技業',TECH.smart],
      cf:['企業行銷企劃','你進了一間中型企業做品牌企劃。面試官說「人社背景的比較會講故事」。<br>你確實會。只是你偶爾會想,講故事是不是本來該用在別的地方。'],
      po:['NGO 倡議工作者','你進了一個議題型 NGO,薪水三萬八,一個人做三個人的事。<br>你很累,但你知道自己在做的是對的事情——這句話你會反覆說很多年。'],
      ad:['大學系辦助理','你在母校的系辦上班,處理招生、排課、核銷。<br>你認識每一個教授,也看得懂每一次系務會議的暗流。你就在那條路旁邊,站了很久。']},
   2:{th:['接案文字工作者','你接文案、寫稿、做逐字稿。有一單沒一單。<br>你還在寫自己的東西,只是越來越少跟人提起。'],
      cf:['服務業','你在一間連鎖店做正職。班表輪三班,領班說你很聰明。<br>你偶爾在深夜的休息室滑到大學同學的動態,然後鎖螢幕。'],
      po:['保險與直銷','你進了保險業,因為那是唯一沒有嫌你科系的地方。<br>你的口才很好,人脈也還可以。你告訴自己這只是過渡。'],
      ad:['派遣行政','你在一間公司做約聘行政,一年一簽。<br>工作內容不難,你做得很好。沒有人問過你大學讀什麼。']},
  };
  /* --- 專屬結局判定,優先於一般分帶 --- */
  let special=null, rule='', tsw=null;
  if(musicianRoll()){
    if(S.org==='poor'&&chance(POOR_TECH)){
      tsw='smart'; special=['轉職科技業',TECH.smart];
      rule=`轉職科技業・偏鄉貧寒|本來走得上藝文這條路(理論直覺 ${S.ab.th}),但家裡需要一份穩定的薪水(${POOR_TECH}%)`;
    }else if(S.org==='art'){
      special=['藝文工作者',
        `家裡本來就有樂器,也本來就有人聽你彈。你要做這件事,在你家從來不需要解釋。<br>`+
        `你知道有人說你是靠家裡。你也知道那句話有一半是真的。<br>`+
        `但某一場唱到一半的時候,你想起李雙澤唱的「我用你的破鼓,但不唱你的歌」。<br>`+
        `<span style="color:var(--dim)">鼓是誰的,你沒有辦法選。要唱什麼,是你自己的事。</span>`];
      rule=`文藝家傳・藝文工作者|理論直覺 ${S.ab.th} > 50,出身加成 +10%`;
    }else{
      special=['藝文工作者',
        `你組了團。大三那年在地下的場子演出過幾次,畢業後你們發了一張沒有人聽過的 EP。<br>`+
        `你白天上班晚上練團,週末載著音箱跑南部。三十歲那年有一首歌突然被演算法選中,五年後又沒有人記得。<br>`+
        `<span style="color:var(--dim)">你寫的詞裡有整個大學讀過的東西,只是沒有人會用那種方式聽出來。<br>`+
        `這條路沒有升等、沒有評鑑,也沒有人可以怪。</span>`];
      rule=`藝文工作者|理論直覺 ${S.ab.th} > 50 的低機率分支`; }
  }else if(S.org==='cap'){
    if(Math.max(S.ab.ad,S.ab.em)>=45){
      special=['繼承家業',
        `你沒有投履歷。畢業那年夏天你回家,開始跟著看帳、跑工廠、認識那些叫你「小少爺」卻比你懂事的老員工。<br>`+
        `做得好的時候,人們說你是靠爸媽。做得不好的時候,人們說你敗家。<br>`+
        `你花了很多年才想明白:這兩句話其實可以同時是真的,而且沒有第三句在等你。<br>`+
        `<span style="color:var(--dim)">你系上那些理論還在你腦子裡。開董事會的時候偶爾會浮上來,然後你把它按回去。</span>`];
      rule='資本之家專屬|行政或實證努力 ≧45';
    }else if(S.ab.th>=50){
      special=['享受人生',
        `你沒有找工作。這件事在你家不需要解釋,你也不避諱說自己就是條米蟲。<br>`+
        `你去了三十幾個國家,在京都住過一季,在柏林和巴黎租過半年的房子,在南美洲學會了衝浪。<br>`+
        `你出生就註定是來體驗世界的,這句話從別人嘴裡說出來像諷刺,從你的人生看起來像事實。<br>`+
        `<span style="color:var(--dim)">你偶爾把想到的東西寫成長文放在網誌上,寫得其實很好。<br>`+
        `不必靠這些字活下去的時候,它們反而更自由——這件事對真正需要靠字吃飯的人而言是有些殘忍。</span>`];
      rule='資本之家專屬|理論直覺 ≧50';
    }else{
      band=0; rule='資本之家:不會落到那四種結局以外';
    }
  }else if(S.ab.em>=60&&S.ab.em>=cand[0][1]+8&&!lottoMS()&&LOTTO_EMF[S.tier]&&chance(LOTTO_EMF[S.tier])){
    /* 轉職科技業樂透・實證怪:鎖死固定機率(其他彩票不算) */
    tsw=lottoType(); special=['轉職科技業',TECH[tsw]];
    rule=`轉職科技業・${tsw==='smart'?'聰明型':'會講型'}(樂透)|實證怪+${TIERS[S.tier].n}(固定 ${LOTTO_EMF[S.tier]}%)`;
  }else if(S.ab.em>=60&&S.ab.em>=cand[0][1]+8){
    /* 實證努力在職場上唯一有效的地方 */
    const hasMS=(S.msLevel==='ok'||S.msLevel==='great');
    if(hasMS){
      special=['研究助理',
        `你成為專任研究助理。月薪41500,有勞健保,辦公室在系館四樓最裡面那間。<br>`+
        `你很快發現,一天裡真正花在研究上的時間不到兩小時。<br>`+
        `其餘的時間你在核銷、跑採購、追廠商的統一發票、填計畫變更申請、訂便當、借場地、做海報、發公告`+
        `把成果報告改成科技部規定的格式。<br>`+
        `<span style="color:var(--dim)">你的碩士學位在這裡最大的用途,是讓你有資格做這些事。<br>`+
        `計畫兩年一期。每兩年你會重新煩惱一次同樣的問題。</span>`];
      rule=`研究助理|實證努力 ${S.ab.em} 明顯高於其他能力 +碩士學位`;
    }else{
      special=['兼任研究助理',
        `你在一個計畫底下當兼任助理,時薪基本工資多一點,一個月排四十小時。<br>`+
        `做的事情跟研究確實有關:找資料、跑統計、整理逐字稿、把訪談檔案一個一個重新命名。<br>`+
        `你去問過有沒有專任的缺。對方說得很客氣:<br>`+
        `<span style="color:var(--dim)">「現在專任助理都要碩士了。你要不要先去考個研究所?」<br>`+
        `你點頭說好,回家算了一下學費和兩年的機會成本,然後沒有再去想這件事。</span>`];
      rule=`兼任研究助理|實證努力 ${S.ab.em} 明顯高於其他能力 無碩士學位`; }
  }else if(stockGod()){
    const bip=!!S.traits.bipolar;
    special=['少年股神',
      `大四下你開了證券戶,本來只是想搞懂那些新聞在講什麼。<br>`+
      `結果你發現人社訓練最值錢的地方,是看穿一個敘事怎麼被製造出來、又怎麼被一群人集體相信——`+
      `這件事在金融市場上,比在期刊上值錢得多。<br>`+
      `期貨、選擇權、當沖。有一年你賺了同學五年的薪水,也有一個月賠掉一台車。<br>`+
      (bip?`<span style="color:var(--dim)">躁期的時候你覺得自己看穿了整個系統,重押、加碼、不睡覺。<br>`+
           `鬱期的時候你不敢打開 APP,帳號密碼放在抽屜最裡面。<br>`+
           `你分不清那些勝利是判斷力還是病——你也不太想分清楚。</span>`
          :`<span style="color:var(--dim)">你不跟人講你在做什麼。同學問起就說「接案」。<br>`+
           `你其實知道自己在賭,只是比起每天打卡上班等,今年的年終,明年的調薪,每兩個月的發票開獎,你寧可把命運押在自己的判斷上。</span>`)];
    rule='少年股神|理論直覺高・行政與實證皆不高'+(bip?'(躁鬱症門檻放寬)':'')+`(${[S.traits.adhd?'ADHD':'',bip?'躁鬱症':''].filter(Boolean).join('+')}${S.traits.adhd||bip?' ':''}${stockP()}%)`;
  }
  /* 中段×理論最高=轉職科技業(聰明型)。例外照舊:實證是最高的人不轉職(使用者核心設計:認真念書在職場沒用)、
     碩士畢業要理論 ≥61(碩士是轉職的阻力);不轉職的人看理論以外最高的那一項 */
  let fb=domE;
  /* 口才那一格(使用者):口才是六項能力裡最高時——
     高分且理論 ≥ MINGSHI_TH → 補教業名師;其他高分、還有中段 → 轉職科技業・會講型。低段不看口才,照下面四項那一格 */
  if(!special&&band<=1&&S.ab.sp>=Math.max(S.ab.th,S.ab.em,S.ab.po,S.ab.cf,S.ab.ad)){
    if(S.org==='cap'){  /* 資本之家的嘴砲王去科技業創業(使用者選 C,另一版內文);不看理論,不會變補教業名師 */
      tsw='vc'; special=['轉職科技業',TECH.vc];
      rule=`轉職科技業・創業家|資本之家、口才 ${S.ab.sp} 是六項能力裡最高`;
    }else if(band===0&&S.ab.th>=MINGSHI_TH){
      special=['補教業名師','你在補習班教學測國文與社會,講得比誰都好。<br>學生說你上課會扯到傅柯,你笑說那是職業病。你也確實沒有那麼想離開那裡。'];
      rule=`補教業名師|判定分數 ${sc.toFixed(1)} 高分、口才 ${S.ab.sp} 是六項能力裡最高、理論直覺 ${S.ab.th} ≧ ${MINGSHI_TH}`;
    }else{
      tsw='people'; special=['轉職科技業',TECH.people];
      rule=`轉職科技業・會講型|${band===0?'高分':'中段分數'}、口才 ${S.ab.sp} 是六項能力裡最高`+(band===0?`,理論直覺 ${S.ab.th} 不到名師門檻 ${MINGSHI_TH}`:'');
    } }
  if(!special&&band===1&&domE==='th'){ const a=S.ab, ms=S.msLevel==='ok'||S.msLevel==='great';
    if(a.em>=Math.max(a.th,a.cf,a.po,a.ad)||(ms&&a.th<61))fb=cand.find(c=>c[0]!=='th')[0];
    else{ tsw='smart'; rule=`轉職科技業・聰明型|中段分數、理論直覺 ${a.th} 最高${ms?' 碩士學歷反而是轉職的阻力':''}`; } }
  if(!special&&band===0&&fb==='th'&&S.org==='poor'&&chance(POOR_TECH)){
    tsw='smart'; special=['轉職科技業',TECH.smart];
    rule=`轉職科技業・偏鄉貧寒|判定分數 ${sc.toFixed(1)}、理論直覺 ${S.ab.th},本來可以當文化評論家,但家裡需要一份穩定的薪水(${POOR_TECH}%)`; }
  /* 轉職科技業樂透:中段、低段,實證不是最高,沒拿到別的特殊結局、也不在轉職那兩格的人,有彩票就抽一次 */
  if(!special&&band>=1&&!(band===1&&fb==='th')&&S.ab.em<Math.max(S.ab.th,S.ab.cf,S.ab.po,S.ab.ad)){
    const tk=lottoTickets(), p=lottoP(tk);
    if(p&&chance(p)){ tsw=lottoType(); special=['轉職科技業',TECH[tsw]];
      rule=`轉職科技業・${tsw==='smart'?'聰明型':'會講型'}(樂透)|${TIERS[S.tier].n}+${tk.map(x=>x[0]).join('+')}(${p}%)`; } }
  const [title,body]=special||E[band][fb];
  const rows=KEYS.map(k=>`${ABL[k]} <b>${S.ab[k]}</b>`).join(' ');
  /* 同一套色階;個別結局以 CTONE 覆寫分帶預設 */
  const CTONE={'研究助理':'good','兼任研究助理':'bad','接案文字工作者':'good','少年股神':'satire','轉職科技業':'good'};
  const tone=CTONE[title]||(special||band===0?'gold':band===1?'good':'bad');
  card(tone,'結局・'+title,
    `${body}<div class="statline">${reason}|職涯判定分數 <b class="hl">${sc.toFixed(1)}</b>${rule?`<br><span class="hl">${rule}</span>`:''}<br>`+
    `理論直覺 ${S.ab.th}×0.35 信心 ${S.ab.cf}×0.30 政治 ${S.ab.po}×0.20 行政 ${S.ab.ad}×0.15 = ${raw.toFixed(1)}<br>`+
    `${mb?`學位加成 <b class="hl">+${mb}</b>(${DEGN()}) `:`學位 ${DEGN()} `}<span style="opacity:.7">50 / 38 為分水嶺</span><br>${rows}</div>`);
  const coda = special&&title==='藝文工作者'&&S.org==='art' ? '很多年後有個大學生在訪談裡說,是聽你的歌才決定讀人社的。你不知道該高興還是道歉。'
    : special&&title==='藝文工作者' ? '同學會上有人提了你的作品。你說那是很久以前寫的了。'
    : voidU() ? '大學那四年你幾乎沒有留下任何東西。你偶爾會懷疑那四年到底發生過沒有。'
    : special&&title==='研究助理' ? '有人問你在做什麼研究。你想了一下,說「幫老師做一些事」。'
    : special&&title==='兼任研究助理' ? '你認識的每一個人都說你很認真。這句話你已經聽了很多年。'
    : special&&title==='少年股神' ? '你偶爾會夢見大學還沒有那麼需要在乎錢的自己,醒來之後開盤了。'
    : title==='轉職科技業' ? (tsw==='smart' ? PH('你沒有背叛|你讀過的東西,|只是你的田野|現在是電商的後臺。') : tsw==='vc' ? PH('你沒有背叛|你讀過的理論,|你只是發現|理論放在募資簡報上|比在論文裡更有價值。') : PH('你會想起當年|那個說唸人社沒有用的親戚,|現在你覺得|他說對了一半。'))
    : special&&title==='繼承家業' ? '同學會上大家問你在做什麼,你說「家裡的事」。話題就停在那裡了。'
    : special&&title==='享受人生' ? '有人說你浪費了那顆腦袋。你想反駁,但你想不出要拿它去換什麼。'
    : S.traits.prodigy&&band===2 ? '十六歲那年你得過全國文學獎。這件事現在沒有人記得,包括你自己也很少想起。'
    : S.dep ? '你沒有去看醫生。那件事還在,只是你學會了不去碰它。'
    : S.traits.adhd ? '你到現在還是會在會議中途走神。但你已經知道那不是你的錯了。'
    : band===0 ? '你偶爾還會夢到大學的生活種種,夢見以為有無限可能的自己,夢醒了,是時候去上班了。'
    : '學術這條路你沒有走。多年後你會發現,走了的人也未必比較快樂。';
  card('info','後來',coda);
  endGame(tone,title,[reason,rule||`職涯判定分數 ${sc.toFixed(1)}`],[
    ['§','職涯判定'],
    ['判定分數',sc.toFixed(1)],
    ['學位',DEGN()],
    ...(mb?[['學位加成','+'+mb,'#948da6']]:[]),
    ['出身',S.O.n],['學校',TIERS[S.tier].n],
    ['綜合評價',ovr()],['聲望',S.rep],
    ['§','大學紀錄'],
    ['文學獎',`參賽 ${S.litEntries}・得獎 ${S.litWins}`],
    ['畢業論文',{great:'學士論文獎',ok:'完成',bad:'低空飛過',none:'沒有寫'}[S.thesis]||'—'],
    ['精神科病史',S.mhList.join('、')||'無'],
    ['取得屬性',S.traitList.length?S.traitList.join('・'):'無'],
    ...loveRows(),
  ]); }

/* ================= 成就系統(本機儲存) ================= */
const ACH_KEY='hssim_ach_v1';
const ACH=[
 {g:'求職結局',list:[
  ['文化評論家','你是文化的引水人與產婆'],
  ['自媒體創作者','你在乎要向社會發出聲音,你的訂閱者也在乎你'],
  ['政治幕僚','法案的第三條第二項是你熬夜改的,上面沒有你的名字'],
  ['高考文官','你成了部裡最會寫公文的人。'],
  ['補教業名師','你現在也是說書人了'],
  ['企業行銷企劃','你發現了行銷界對文科學歷來者不拒'],
  ['NGO 倡議工作者','三萬八,偶而還要回捐,一個人做三個人的事'],
  ['大學系辦助理','系上的人都認識你'],
  ['接案文字工作者','還在寫作,只是無法為興趣而寫了'],
  ['服務業','刷條碼可不是鬧著玩的'],
  ['保險與直銷','同學開始有點害怕你吃飯的邀約'],
  ['派遣行政','一年一簽,做得很好。沒有人問過你讀什麼'],
  ['研究助理','很少研究,很多行政'],
  ['兼任研究助理','時薪基本工資多一點,你甚至沒有拿到職工證'],
  ['藝文工作者','白天上班晚上練團。'],
  ['少年股神','你總算找到了你過剩智識的應許之地'],
  ['轉職科技業','你發現涓滴理論在台灣是真實的'],
  ['繼承家業','靠爸與敗家之外,還有得選嗎?'],
  ['享受人生','誰說錢買不到快樂?'],
 ]},
 {g:'教職結局',list:[
  ['學科台柱','你帶來了新的知識典範,也帶來了新的經費支持'],
  ['學派','你的名字變成一種學術形容詞'],
  ['那一本書','你寫得不多,但你留下一本不會被遺忘的經典'],
  ['穩健的一生','不是天才,但三十年沒有停過'],
  ['行政人生','最好的幾年都給了會議與評鑑,很少人想到你的研究'],
  ['一份工作','按時上下班,按時產出,三十年很快就過去了'],
  ['網紅教授','你很少研究,可你很愛說話,好消息是人們也愛聽你說'],
  ['研討會動物','研討會使你快樂!'],
  ['流浪','你感覺自己永遠在流浪,但誰不是呢'],
  ['沒有人讀','你大半的著作完成後再也沒有人翻開過'],
 ]},
 {g:'其他',list:[
  ['人社系484有毒','決定離開~待了十七年的世界~沒有打算要和任何人告別~'],
 ]},
];
const ACH_SPECIAL=[
 {g:'特殊',id:'l:zero',n:'七進七出',h:'只找到扶不起的自己,人們願稱你為文學獎趙子龍'},
 {g:'特殊',id:'l:monster',n:'怪物新人',h:'大獎一座接著一座(獲獎超過5次)'},
 {g:'特殊',id:'s:nepo',n:'用你的破鼓',h:'但不唱你的歌(文藝家傳出身成為藝文工作者)'},
 {g:'特殊',id:'s:money',n:'錢買不到快樂',h:'是你很想說的話(資本之家出身進入登出結局)'},
 {g:'特殊',id:'s:void',n:'師大跟台北一樣什麼都沒給我',h:'你度過了空白的四年'},
 {g:'特殊',id:'s:gifted',n:'天縱英才',h:'你不是特別認真的人,你是讓認真的人心裡特別難受的人'},
 {g:'特殊',id:'s:hospital',n:'生命鬥士',h:'你不得不休學離開,但你回來了'},
 {g:'特殊',id:'s:scum',n:'渣人磁鐵',h:'被無情背叛第二次之後,你開始懷疑問題出在自己身上'},
 {g:'特殊',id:'s:all',n:'結局收藏家',h:'解鎖了全部結局'},
];
function achAllIds(){ const a=[]; ACH.forEach(g=>g.list.forEach(x=>a.push('e:'+x[0]))); return a; }
function achLoad(){ try{ const a=JSON.parse(localStorage.getItem(ACH_KEY)||'[]').map(x=>({'e:文化評論者':'e:文化評論家','e:補教業講師':'e:補教業名師'})[x]||x); return new Set(a); }catch(e){ return new Set(); } }  /* 結局改名:舊紀錄照算 */
function achSave(set){ try{ localStorage.setItem(ACH_KEY,JSON.stringify([...set])); }catch(e){} }
function achEarned(title){
  const got=['e:'+title];
  if((S.relLog||[]).filter(r=>r.k==='無情背叛').length>=2)got.push('s:scum');
  if(S.litEntries>=7&&S.litWins===0)got.push('l:zero');
  if(S.litWins>=5)got.push('l:monster');
  if(title==='藝文工作者'&&S.org==='art')got.push('s:nepo');
  if(S.org==='cap'&&title==='人社系484有毒')got.push('s:money');
  if(voidU())got.push('s:void');
  if(S.traits.gifted)got.push('s:gifted');
  if(S.crisis>=1&&title!=='人社系484有毒')got.push('s:hospital');
  return got; }
function achGrant(title){
  const set=achLoad(), fresh=[];
  achEarned(title).forEach(id=>{ if(!set.has(id)){ set.add(id); fresh.push(id); } });
  if(achAllIds().every(id=>set.has(id))&&!set.has('s:all')){ set.add('s:all'); fresh.push('s:all'); }
  achSave(set); return {fresh,set}; }
function achName(id){
  if(id.slice(0,2)==='e:')return id.slice(2);
  const f=ACH_SPECIAL.find(x=>x.id===id); return f?f.n:id; }
function achMarkup(fresh){
  const set=achLoad(), total=achAllIds().length+ACH_SPECIAL.length;
  let owned=0; achAllIds().forEach(id=>{ if(set.has(id))owned++; });
  ACH_SPECIAL.forEach(x=>{ if(set.has(x.id))owned++; });
  const fs=new Set(fresh||[]);
  const cell=(id,name,hint)=>{ const on=set.has(id);
    return `<div class="ach-cell ${on?'on':''} ${fs.has(id)?'new':''}" data-n="${name}" data-h="${hint}">${name}</div>`; };
  let html='';
  ACH.forEach(grp=>{
    html+=`<div class="ach-grp">${grp.g}</div><div class="ach-grid">`;
    grp.list.forEach(([n,h])=>{ html+=cell('e:'+n,n,h); });
    html+='</div>'; });
  html+=`<div class="ach-grp">特殊</div><div class="ach-grid">`;
  ACH_SPECIAL.forEach(x=>{ html+=cell(x.id,x.n,x.h); });
  html+='</div>';
  html+=`<div class="ach-detail">${fresh&&fresh.length
      ? `<b>${achName(fresh[0])}</b>本場新解鎖。點任一格看說明。`
      : '點一格看說明。亮起來的是已經走過的路。'}</div><div class="ach-reset">清除本機成就紀錄</div>`;
  return {html,owned,total}; }
function achBind(root,onReset){
  const det=root.querySelector('.ach-detail');
  root.querySelectorAll('.ach-cell').forEach(c=>{ c.onclick=()=>{
    root.querySelectorAll('.ach-cell.sel').forEach(x=>x.classList.remove('sel'));
    c.classList.add('sel');
    det.innerHTML=`<b>${c.dataset.n}</b>${c.dataset.h}`; }; });
  const rs=root.querySelector('.ach-reset');
  if(rs)rs.onclick=()=>{ if(askYes('確定要清除這台裝置上的成就紀錄?')){
    try{localStorage.removeItem(ACH_KEY);}catch(e){} onReset&&onReset(); } }; }
function achPanel(){
  const panel=$('ach-panel'); if(!panel)return;
  const m=achMarkup([]); panel.innerHTML=m.html;
  $('ach-count').textContent=`${m.owned} / ${m.total}`;
  achBind(panel,achPanel); }
function achWall(fresh){
  const m=achMarkup(fresh);
  const head=`<div id="ach-head"><span>成就</span><div><b>${m.owned} / ${m.total}</b>`+
    `${fresh&&fresh.length?`<i>本場新解鎖 ${fresh.length}</i>`:''}</div></div>`;
  const box=document.createElement('div'); box.className='card'; box.id='ach-wall';
  box.innerHTML=head+m.html; logTarget().appendChild(box);
  achBind(box,()=>{ box.remove(); achWall([]); });
  scrollBottom(); }

/* ================= 結算圖・分享・重播 ================= */
function loveRows(){
  const PINK='#dd8fa4', RED='#dd7264', GREY='#948da6';
  if(!S.relLog.length&&!S.loveFails)
    return [['§','大學情史'],['沒有談過戀愛','—',GREY],['被拒次數','0 次',GREY]];
  const rows=[['§','大學情史']];
  S.relLog.forEach(r=>rows.push([r.tag,`${r.k}・${r.y} 年`,/背叛|有毒/.test(r.k)?RED:PINK]));
  rows.push(['交往年限',S.loveYears+' 年',PINK]);
  rows.push(['被拒次數',S.loveFails+' 次',GREY]);
  rows.push(['最後狀態',S.rel?REL[S.rel.kind].n+'中':'單身',GREY]);
  return rows; }
function endGame(tone,title,subs,rows){
  S.endInfo={tone,title,subs,rows};
  let _fresh=[]; try{ _fresh=achGrant(title).fresh; }catch(e){}
  const sh=document.createElement('div'); sh.className='card';
  sh.innerHTML=`<h4>分享這段人生</h4>
    <div style="display:flex;gap:8px;flex-wrap:wrap">
      <button class="btn main" id="sh-img" style="flex:1;margin-top:0">產生結算圖</button>
      <button class="btn" id="sh-url" style="flex:1;margin-top:0">複製重播連結</button>
    </div><div id="sh-out" style="margin-top:8px"></div>`;
  logTarget().appendChild(sh);
  sh.querySelector('#sh-img').onclick=e=>{ e.target.textContent='繪製中…'; e.target.disabled=true;
    shareImage(sh.querySelector('#sh-out'),()=>{ e.target.textContent='產生結算圖'; e.target.disabled=false; }); };
  sh.querySelector('#sh-url').onclick=e=>{
    const url=replayURL();
    const ok=()=>{ e.target.textContent='已複製!'; setTimeout(()=>e.target.textContent='複製重播連結',1600); };
    if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(url).then(ok,()=>prompt('手動複製連結:',url));
    else prompt('手動複製連結:',url); };
  try{ achWall(_fresh); }catch(e){}
  choose('',[
    {t:'開啟新的人生(新種子)',main:true,f:()=>softRestart(null)},
    {t:'用同一個種子重來',s:'seed: '+SEED,f:()=>softRestart(SEED)}]);
  scrollBottom(); }
function base(){ return location.href.split('?')[0].split('#')[0]; }
/* 重新開始不重新載入網頁(使用者:每次開新一局都像重開網頁,很慢、會卡):直接回到開始畫面。
   遊戲狀態全部重建;亂數照舊在按「開始人生」時用種子重設(seedInit),所以同一個種子+同樣的選擇,結果跟重新開網頁完全一樣。
   seed:null=換新種子;字串=用同一個種子重來。網址照舊(新種子 ?y=年份;同種子 ?seed=…&y=…),重新整理網頁也回到同一個狀態。 */
function softRestart(seed){
  const yr=(S&&S.startYear)||null;
  SEED=seed||Math.random().toString(36).slice(2,10);
  S=null; stepQ=[]; _curYearBody=null; selOrg=null;
  $('log').innerHTML=''; actClear(); $('act').style.display='none'; $('board').style.display='none'; $('start').style.display='';
  { const g=$('seg-org'); g.style.display='none'; g.querySelectorAll('button').forEach(x=>x.classList.remove('on')); $('force-toggle').textContent='指定出身'; }
  $('seed-show').value=SEED;
  if(yr){ const inp=$('in-year'); inp.value=yr; try{ inp.oninput&&inp.oninput(); }catch(e){} }
  try{ history.replaceState(null,'',seed?'?seed='+encodeURIComponent(SEED)+(yr?'&y='+yr:''):(yr?'?y='+yr:location.pathname)); }catch(e){}
  try{ achPanel(); }catch(e){}
  try{ if(typeof PX!=='undefined'&&PX.reset)PX.reset(); }catch(e){}
  window.scrollTo(0,0); }
function replayURL(){ return base()+'?seed='+encodeURIComponent(SEED)+'&y='+S.startYear; }

/* Google Fonts 的中文依 unicode-range 分段下載,canvas 繪圖不會觸發下載,
   因此先把實際要畫的字串餵給 document.fonts.load 逐一預載 */
function summaryText(){
  const E=S.endInfo||{};
  return [S.name,E.title,(E.subs||[]).join(''),
    (E.rows||[]).map(r=>r[0]+r[1]).join(''),
    KEYS.map(k=>ABL[k]).join(''),S.O.n,(S.tier&&TIERS[S.tier].n)||'',
    '人文社科學生模擬器能力值歲年月日'].join(''); }
async function ensureFonts(text){
  if(!document.fonts||!document.fonts.load)return;
  try{ if(typeof PX!=='undefined'&&PX.fullFont)await PX.fullFont(text); }catch(e){}  /* 名字用到裁掉的字:先補載完整像素字型 */
  const specs=['400 24px "Cubic11"','400 24px "Cubic11Full"','400 24px "Noto Sans TC"','500 24px "Noto Sans TC"','700 24px "Noto Sans TC"',
    '900 24px "Noto Sans TC"','700 24px "Noto Serif TC"','900 24px "Noto Serif TC"',
    '500 24px "IBM Plex Mono"','700 24px "IBM Plex Mono"'];
  try{ await Promise.all(specs.map(sp=>document.fonts.load(sp,text))); }catch(e){}
  try{ await document.fonts.ready; }catch(e){} }
async function shareImage(out,done){
  try{ await ensureFonts(summaryText()); }catch(e){}
  let url,fileName;
  try{ url=drawSummary(); }catch(err){ out.innerHTML=`<div class="statline">結算圖產生失敗:${err.message}</div>`; done&&done(); return; }
  fileName=`${S.name}_人文社科學生模擬器.png`;
  out.innerHTML=`<img src="${url}" style="width:100%;border-radius:8px;display:block" alt="結算圖">
    <div style="display:flex;gap:8px;margin-top:8px">
      <button class="btn main" id="sh-save" style="flex:1;margin-top:0">儲存/分享圖片</button>
      <button class="btn" id="sh-dl" style="flex:1;margin-top:0">下載到裝置</button>
    </div>
    <div class="statline" style="margin-top:6px">若按鈕無效,長按上方圖片也可儲存</div>`;
  const dl=()=>{ const a=document.createElement('a'); a.href=url; a.download=fileName;
    document.body.appendChild(a); a.click(); a.remove(); };
  out.querySelector('#sh-dl').onclick=dl;
  out.querySelector('#sh-save').onclick=async()=>{
    try{
      const blob=await (await fetch(url)).blob();
      const file=new File([blob],fileName,{type:'image/png'});
      if(navigator.canShare&&navigator.canShare({files:[file]})){
        await navigator.share({files:[file],title:'人文社科學生模擬器',text:`${S.name}|${S.endInfo.title}`});
        return; }
    }catch(e){ if(e&&e.name==='AbortError')return; }
    dl(); };
  done&&done(); scrollBottom(); }

function drawSummary(){
  const E=S.endInfo, rows=E.rows||[], subs=E.subs||[];
  const W=900, PAD=52, DPR=2;
  const H = 712 + subs.length*34 + rows.reduce((h,r)=>h+(r[0]==='§'?44:36),0);
  const cv=document.createElement('canvas'); cv.width=W*DPR; cv.height=H*DPR;
  const c=cv.getContext('2d'); c.scale(DPR,DPR);
  const SANS=PX.canvasFont(), SERIF=SANS, MONO=SANS, TH=PX.th();
  const PAPER=TH.hudInk, DIM=TH.hudInk+'99', BRASS=TH.barB, SEAL=TH.bad, EDGE=TH.hudInk+'30';
  /* 底 */
  c.fillStyle=TH.hud; c.fillRect(0,0,W,H);
  for(let yy=0;yy<H;yy+=8)for(let xx=(yy/8)%2*8;xx<W;xx+=16){ c.fillStyle='#ffffff08'; c.fillRect(xx,yy,8,8); }
  const g=c.createLinearGradient(0,0,0,320); g.addColorStop(0,TH.acc+'55'); g.addColorStop(1,TH.acc+'00');
  c.fillStyle=g; c.fillRect(0,0,W,320);
  const T=(t,x,y,size,color,font,weight,align)=>{ size=Math.max(12,Math.round(size/6)*6); c.font=`${weight||400} ${size}px ${font||SANS}`;
    c.fillStyle=color||PAPER; c.textAlign=align||'left'; c.textBaseline='alphabetic'; c.fillText(t,x,y); };
  const fitRight=(t,x,y2,maxW,color)=>{
    let size=18; c.textAlign='right'; c.fillStyle=color;
    for(;size>=12;size-=6){ c.font=`700 ${size}px ${MONO}`; if(c.measureText(t).width<=maxW)break; }
    let str=t;
    if(c.measureText(str).width>maxW){ while(str.length>1&&c.measureText(str+'…').width>maxW)str=str.slice(0,-1); str+='…'; }
    c.fillText(str,x,y2); };
  let y=64;
  /* 印章 */
  c.strokeStyle=SEAL; c.lineWidth=3; c.strokeRect(PAD,y-4,64,64);
  T('人文',PAD+10,y+22,20,SEAL,SERIF,700); T('社科',PAD+10,y+46,20,SEAL,SERIF,700);
  T('人文社科學生模擬器',PAD+84,y+22,26,PAPER,SERIF,700);
  T(`${S.startYear} → ${S.year} ${S.age} 歲`,PAD+84,y+50,17,DIM,MONO,500);
  y+=104;
  c.strokeStyle=EDGE; c.lineWidth=1; c.beginPath(); c.moveTo(PAD,y); c.lineTo(W-PAD,y); c.stroke();
  try{ c.fillStyle='#000'; c.fillRect(W-PAD-196,y-132,200,200); PX.drawFace(c,W-PAD-194,y-130,2); }catch(e){}
  y+=48;
  /* 姓名與出身 */
  T(S.name,PAD,y,34,PAPER,SERIF,900);
  const meta=`${S.O.n} ${S.tier?TIERS[S.tier].n:'未升學'}${S.traitList.length?' '+scholarType():''}`;
  T(meta,PAD,y+30,17,DIM,SANS,500);
  y+=76;
  /* 結局 */
  const tc={bad:TH.bad,gold:TH.gold,good:TH.good,info:TH.info,satire:TH.sat}[E.tone]||TH.good;
  c.fillStyle=tc; c.fillRect(PAD,y-22,6,30);
  T(E.title,PAD+18,y,30,tc,SERIF,900);
  y+=26;
  subs.forEach(t=>{ y+=34; T(t,PAD,y,17,DIM,SANS,400); });
  y+=42;
  /* 能力 */
  T('能力值',PAD,y,14,DIM,SANS,700); y+=22;
  KEYS.forEach(k=>{
    const v=S.ab[k],pk=S.pot[k],bx=PAD+108,bw=W-PAD*2-108-92;
    T(ABL[k],PAD,y+12,17,PAPER,SANS,700);
    c.fillStyle='#100f15'; c.fillRect(bx,y+2,bw,12);
    const gg=c.createLinearGradient(bx,0,bx+bw,0); gg.addColorStop(0,TH.barA); gg.addColorStop(1,BRASS);
    c.fillStyle=gg; c.fillRect(bx,y+2,bw*Math.min(1,v/AB_MAX),12);
    c.fillStyle='#d4a24c88'; c.fillRect(bx+bw*Math.min(1,pk/AB_MAX)-1,y,2,16);
    T(String(v),W-PAD,y+13,19,BRASS,MONO,700,'right');
    T('/'+pk,W-PAD-46,y+13,13,DIM,MONO,500,'right');
    y+=42; });
  y+=4;
  /* 明細 */
  rows.forEach(r=>{
    if(r[0]==='§'){ y+=30; T(r[1],PAD,y,13,DIM,SANS,700); y+=14;
      c.strokeStyle=EDGE; c.beginPath(); c.moveTo(PAD,y-6); c.lineTo(W-PAD,y-6); c.stroke(); return; }
    y+=36; T(r[0],PAD,y,17,r[2]||PAPER,SANS,400);
    c.font=`400 17px ${SANS}`; const lw=c.measureText(r[0]).width;
    fitRight(String(r[1]),W-PAD,y,W-PAD*2-lw-24,r[2]||BRASS); });
  /* 頁尾 */
  y=H-40;
  c.strokeStyle=EDGE; c.beginPath(); c.moveTo(PAD,y-26); c.lineTo(W-PAD,y-26); c.stroke();
  T('seed '+SEED,PAD,y,14,DIM,MONO,500);
  T('wandanle.bearblog.dev',W-PAD,y,14,DIM,MONO,500,'right');
  return cv.toDataURL('image/png'); }

/* ================= 開場 ================= */
(function(){ const t=$('act-toggle');
  t.onclick=()=>{ $('act').classList.toggle('collapsed');
    t.textContent=$('act').classList.contains('collapsed')?'▲ 展開選項':'▼ 收合選項'; }; })();
const NOW_YEAR=new Date().getFullYear();
(function(){ const inp=$('in-year');
  inp.min=2010; inp.max=NOW_YEAR; inp.value=NOW_YEAR;
  const note=()=>{ const y=clamp(parseInt(inp.value,10)||NOW_YEAR,2010,NOW_YEAR);
    $('yr-note').textContent=`2010 – ${NOW_YEAR} 你會在 ${y+2} 年參加大學入學篩選,${y+6} 年畢業。`; };
  const step=d=>{ inp.value=clamp((parseInt(inp.value,10)||NOW_YEAR)+d,2010,NOW_YEAR); note(); };
  $('yr-dn').onclick=e=>{e.preventDefault();step(-1);};
  $('yr-up').onclick=e=>{e.preventDefault();step(1);};
  inp.oninput=note; inp.onblur=()=>{inp.value=clamp(parseInt(inp.value,10)||NOW_YEAR,2010,NOW_YEAR);note();};
  note(); })();
let selOrg=null; /* null = 交給命運 */
$('odds').innerHTML=Object.entries(ORIGINS).map(([k,v])=>
  `<div class="odd"><span class="on">${v.n}</span><span class="ob"><i style="width:${v.w/45*100}%"></i></span><span class="op">${v.w}%</span></div>`).join('');
$('seg-org').innerHTML=Object.entries(ORIGINS).map(([k,v])=>
  `<button data-v="${k}">${v.n}<small>${v.d}</small></button>`).join('');
document.querySelectorAll('#seg-org button').forEach(b=>b.onclick=()=>{
  document.querySelectorAll('#seg-org button').forEach(x=>x.classList.remove('on'));
  b.classList.add('on'); selOrg=b.dataset.v; });
$('force-toggle').onclick=e=>{ e.preventDefault();
  const g=$('seg-org'), open=g.style.display==='none';
  g.style.display=open?'grid':'none'; e.target.textContent=open?'交給命運':'指定出身';
  if(!open){ selOrg=null; g.querySelectorAll('button').forEach(x=>x.classList.remove('on')); } };
try{ achPanel(); }catch(e){}
$('ach-bar').onclick=()=>{ const pn=$('ach-panel'); pn.classList.toggle('open');
  if(pn.classList.contains('open'))achPanel(); };
$('seed-show').value=SEED;
$('seed-re').onclick=e=>{e.preventDefault();SEED=Math.random().toString(36).slice(2,10);$('seed-show').value=SEED;};
function askYes(msg){ try{ return confirm(msg); }catch(e){ return true; } }
function restart(){ softRestart(null); }
$('btn-restart').onclick=()=>{ if(askYes('重新開始一段人生?'))restart(); };
$('btn-start').onclick=()=>{ try{
  const nm=$('in-name').value.trim()||'賴祥德';
  const sv=$('seed-show').value.trim(); if(sv)SEED=sv;
  const qy=new URLSearchParams(location.search).get('y');
  if(qy)$('in-year').value=clamp(parseInt(qy,10)||NOW_YEAR,2010,NOW_YEAR);
  /* file:// 與部分內嵌檢視器會讓 replaceState 拋 SecurityError,不能讓它擋住開場 */
  try{ history.replaceState(null,'','?seed='+encodeURIComponent(SEED)+'&y='+$('in-year').value); }catch(e){}
  seedInit(SEED);
  const org=selOrg||drawOrigin();
  const yr=clamp(parseInt($('in-year').value,10)||NOW_YEAR,2010,NOW_YEAR);
  S=newState(nm,org,yr);
  $('start').style.display='none'; $('board').style.display=''; $('act').style.display='';
  const rows=KEYS.map(k=>`${ABL[k]} <b class="hl">${S.ab[k]}</b><span style="opacity:.5">/上限 ${S.pot[k]}</span>`).join(' ');
  card('info','天賦判定',`${S.year} 年,十六歲的 <b class="hl">${S.name}</b>。<br>命運擲出了 <b class="hl">${S.O.n}</b>(${S.O.w}%)——${S.O.d}`+
    `<div class="statline">${rows}</div>`+
    `<p style="color:var(--dim);font-size:12px;margin-top:6px">提示:20 歲前累積擲出 5 次「6」可覺醒隱藏屬性。</p>`);
  startYear();
  }catch(err){ showFatal(err); } };
</script>
<script>
/* =====================================================================
   大頭貼產生器 v4 —— 3/4 側臉、128×128、墨線(黑/白/淺灰)+純色背景
   ‧ 臉、下巴、脖子、肩膀的輪廓與頭髮分層(前髮/側髮/後髮/綁髮)依參考比例
   ‧ 眼睛、表情、衣服細節都是自己畫的像素圖
   ‧ 畫面上的「隨機」一律用座標雜湊,不碰遊戲的命運種子
   ===================================================================== */
const FACE=(()=>{
const W=128,H=128,N=W*H, INK=2, PAP=1, LG=3, RED=4, KHK=5, GRN=6, LBL=7, BLD=8, BRN=9, HBL=10, HGR=11, WIN=12;
const D4=[[1,0],[-1,0],[0,1],[0,-1]];
const id=(x,y)=>y*W+x;
const ci=(v,a,b)=>v<a?a:v>b?b:v;
const fh=(x,y,s)=>{ const v=Math.sin(x*12.9898+y*78.233+(s||0)*37.719)*43758.5453; return v-Math.floor(v); };
const BY=[0,8,2,10,12,4,14,6,3,11,1,9,15,7,13,5], by=(x,y)=>BY[((y|0)&3)*4+((x|0)&3)]/16;
const M=()=>new Uint8Array(N);
const cp=a=>new Uint8Array(a);

/* ---------- 遮罩 ---------- */
function ell(m,cx,cy,rx,ry,rot){ const c=Math.cos(rot||0), s=Math.sin(rot||0), R=Math.max(rx,ry)+1;
  const x0=ci(Math.floor(cx-R),0,W-1),x1=ci(Math.ceil(cx+R),0,W-1),y0=ci(Math.floor(cy-R),0,H-1),y1=ci(Math.ceil(cy+R),0,H-1);
  for(let y=y0;y<=y1;y++)for(let x=x0;x<=x1;x++){ const dx=x+.5-cx, dy=y+.5-cy, u=(dx*c+dy*s)/rx, v=(-dx*s+dy*c)/ry; if(u*u+v*v<=1)m[id(x,y)]=1; } return m; }
function poly(m,P){ let y0=1e9,y1=-1e9; for(const p of P){ if(p[1]<y0)y0=p[1]; if(p[1]>y1)y1=p[1]; }
  for(let y=ci(Math.floor(y0),0,H-1);y<=ci(Math.ceil(y1),0,H-1);y++){ const cy=y+.5, xs=[];
    for(let i=0;i<P.length;i++){ const a=P[i],b=P[(i+1)%P.length]; if((a[1]<=cy&&b[1]>cy)||(b[1]<=cy&&a[1]>cy))xs.push(a[0]+(cy-a[1])/(b[1]-a[1])*(b[0]-a[0])); }
    xs.sort((p,q)=>p-q);
    for(let k=0;k+1<xs.length;k+=2){ const xa=Math.max(0,Math.ceil(xs[k]-.5)), xb=Math.min(W-1,Math.floor(xs[k+1]-.5)); for(let x=xa;x<=xb;x++)m[id(x,y)]=1; } }
  return m; }
function splC(P,seg){ const n=P.length,out=[]; seg=seg||8;
  for(let i=0;i<n;i++){ const p0=P[(i-1+n)%n],p1=P[i],p2=P[(i+1)%n],p3=P[(i+2)%n];
    for(let k=0;k<seg;k++){ const t=k/seg,t2=t*t,t3=t2*t, f=(a,b,c,d)=>.5*((2*b)+(-a+c)*t+(2*a-5*b+4*c-d)*t2+(-a+3*b-3*c+d)*t3);
      out.push([f(p0[0],p1[0],p2[0],p3[0]),f(p0[1],p1[1],p2[1],p3[1])]); } } return out; }
function spline(P,seg){ if(P.length<3)return P; const out=[], p=[P[0],...P,P[P.length-1]];
  for(let i=1;i<p.length-2;i++)for(let k=0;k<seg;k++){ const t=k/seg,t2=t*t,t3=t2*t, f=(a,b,c,d)=>.5*((2*b)+(-a+c)*t+(2*a-5*b+4*c-d)*t2+(-a+3*b-3*c+d)*t3);
    out.push([f(p[i-1][0],p[i][0],p[i+1][0],p[i+2][0]),f(p[i-1][1],p[i][1],p[i+1][1],p[i+2][1])]); }
  out.push(P[P.length-1]); return out; }
const shape=(P,seg)=>poly(M(),splC(P,seg||8));
function cap(m,ax,ay,bx,by_,r,r2){ r2=r2===undefined?r:r2; const R=Math.max(r,r2);
  const x0=ci(Math.floor(Math.min(ax,bx)-R-1),0,W-1),x1=ci(Math.ceil(Math.max(ax,bx)+R+1),0,W-1),y0=ci(Math.floor(Math.min(ay,by_)-R-1),0,H-1),y1=ci(Math.ceil(Math.max(ay,by_)+R+1),0,H-1);
  const dx=bx-ax,dy=by_-ay,L=dx*dx+dy*dy||1e-6;
  for(let y=y0;y<=y1;y++)for(let x=x0;x<=x1;x++){ const px_=x+.5-ax,py=y+.5-ay; let t=(px_*dx+py*dy)/L; t=t<0?0:t>1?1:t; const ex=px_-t*dx,ey=py-t*dy, rr=r+(r2-r)*t; if(ex*ex+ey*ey<=rr*rr)m[id(x,y)]=1; } return m; }
function fnm(m,f){ for(let y=0;y<H;y++)for(let x=0;x<W;x++)if(f(x+.5,y+.5,x,y))m[id(x,y)]=1; return m; }
function and(a,b){ for(let i=0;i<N;i++)if(!b[i])a[i]=0; return a; }
function or(a,b){ for(let i=0;i<N;i++)if(b[i])a[i]=1; return a; }
function sub(a,b){ for(let i=0;i<N;i++)if(b[i])a[i]=0; return a; }
const any=m=>{ for(let i=0;i<N;i++)if(m[i])return true; return false; };
function dil(m,n){ let a=cp(m); for(let k=0;k<n;k++){ const b=cp(a); for(let y=0;y<H;y++)for(let x=0;x<W;x++){ if(a[id(x,y)])continue; for(const [dx,dy] of D4){ const X=x+dx,Y=y+dy; if(X>=0&&Y>=0&&X<W&&Y<H&&a[id(X,Y)]){ b[id(x,y)]=1; break; } } } a=b; } return a; }
/* 以 X 為自變數的折線:回傳 y(X) */
function hlFn(P){ return X=>{ if(X<=P[0][0])return P[0][1]; for(let i=0;i<P.length-1;i++){ const a=P[i],b=P[i+1]; if(X<=b[0])return a[1]+(b[1]-a[1])*(X-a[0])/((b[0]-a[0])||1); } return P[P.length-1][1]; }; }
const below=(P,dy)=>{ const f=hlFn(P); return fnm(M(),(X,Y)=>Y>=f(X)+(dy||0)); };
const above=(P,dy)=>{ const f=hlFn(P); return fnm(M(),(X,Y)=>Y<f(X)+(dy||0)); };

/* ---------- 上色:1px 外框(去 L 形轉角) ---------- */
function edgeSet(m,open){ const E=M();
  for(let y=0;y<H;y++)for(let x=0;x<W;x++){ if(!m[id(x,y)])continue;
    for(const [dx,dy] of D4){ const X=x+dx,Y=y+dy; if(Y>=H){ if(open)continue; E[id(x,y)]=1; break; }
      if(X<0||X>=W||Y<0||!m[id(X,Y)]){ E[id(x,y)]=1; break; } } }
  const at=(x,y)=>x>=0&&y>=0&&x<W&&y<H&&E[id(x,y)];
  for(let y=0;y<H;y++)for(let x=0;x<W;x++){ if(!E[id(x,y)])continue;
    const l=at(x-1,y),r=at(x+1,y),u=at(x,y-1),d=at(x,y+1);
    if((l&&u&&!r&&!d&&!at(x+1,y+1))||(u&&r&&!l&&!d&&!at(x-1,y+1))||(r&&d&&!l&&!u&&!at(x-1,y-1))||(d&&l&&!r&&!u&&!at(x+1,y-1)))E[id(x,y)]=0; }
  return E; }
function paint(B,m,fill,o){ o=o||{}; const ol=o.ol===undefined?INK:o.ol; const E=ol?edgeSet(m,o.open!==false):null;
  for(let i=0;i<N;i++){ if(!m[i])continue; if(E&&E[i]){ B[i]=ol; continue; } const v=typeof fill==='function'?fill(i%W,(i/W)|0):fill; if(v)B[i]=v; } }
/* 黑髮的手繪毛邊:外緣偶爾缺一格或多一格 */
function roughen(B,m,seed){ const m2=cp(m); for(let y=1;y<H-1;y++)for(let x=1;x<W-1;x++){ const i=id(x,y); if(!m[i])continue;
  for(const [dx,dy] of D4){ const j=id(x+dx,y+dy); if(!m[j]&&B[j]===0){ const r=fh(x,y,seed); if(r<.07)m2[i]=0; else if(r>.95)m2[j]=1; break; } } } return m2; }
function px(B,x,y,v){ x=Math.floor(x); y=Math.floor(y); if(x>=0&&y>=0&&x<W&&y<H)B[id(x,y)]=v; }
function pxIf(B,x,y,v,ok){ x=Math.floor(x); y=Math.floor(y); if(x>=0&&y>=0&&x<W&&y<H&&ok(B[id(x,y)]))B[id(x,y)]=v; }
function raster(P){ const out=[];
  for(let i=0;i<P.length-1;i++){ const [x0,y0]=P[i],[x1,y1]=P[i+1]; const n=Math.max(1,Math.ceil(Math.hypot(x1-x0,y1-y0)*3));
    for(let k=0;k<=n;k++){ const t=k/n, x=Math.floor(x0+(x1-x0)*t), y=Math.floor(y0+(y1-y0)*t); const L=out[out.length-1]; if(!L||L[0]!==x||L[1]!==y)out.push([x,y]); } }
  if(P.length===1)out.push([Math.floor(P[0][0]),Math.floor(P[0][1])]);
  const pp=[]; for(let i=0;i<out.length;i++){ const b=out[i];
    if(pp.length&&i<out.length-1){ const a=pp[pp.length-1], c=out[i+1];
      if((a[0]===b[0]||a[1]===b[1])&&(c[0]===b[0]||c[1]===b[1])&&a[0]!==c[0]&&a[1]!==c[1])continue; }
    pp.push(b); }
  return pp; }
function line(B,P,v,o){ o=o||{}; const pts=raster(P.length>2?spline(P,10):P), w=o.w||1, ok=o.ok;
  const put=(X,Y)=>ok?pxIf(B,X,Y,v,ok):px(B,X,Y,v);
  pts.forEach(([x,y],i)=>{ if(o.dash&&i%(o.dash[0]+o.dash[1])>=o.dash[0])return; put(x,y); if(w>=2)put(x,y+1); if(w>=3){ put(x+1,y); put(x+1,y+1); } }); }
/* 反色線:黑底上畫白、白底上畫黑(只在 mask 內) */
function flip(B,P,mask){ for(const [x,y] of raster(spline(P,10))){ if(x<0||y<0||x>=W||y>=H)continue; const i=id(x,y); if(mask&&!mask[i])continue;
  if(B[i]!==INK){ B[i]=INK; continue; }
  let k=0; for(let dy=-1;dy<=1;dy++)for(let dx=-1;dx<=1;dx++){ if(!dx&&!dy)continue; const X=x+dx,Y=y+dy; if(X>=0&&Y>=0&&X<W&&Y<H&&B[id(X,Y)]===INK)k++; }
  if(k>=5)B[i]=PAP; } }
/* 小圖:'#' 墨、'o' 白、'+' 淺灰、其他透明 */
function spr(B,rows,x,y,flipX,ok){ x=Math.round(x); y=Math.round(y); rows.forEach((r,j)=>{ for(let i=0;i<r.length;i++){ const c=r[i]; if(c!=='#'&&c!=='o'&&c!=='+')continue; const X=flipX?x+r.length-1-i:x+i; const v=c==='#'?INK:c==='o'?PAP:LG; ok?pxIf(B,X,y+j,v,ok):px(B,X,y+j,v); } }); }
const isPap=v=>v===PAP,=>v===INK, notBg=v=>v!==0;
const PAT={ diag:(x,y)=>((x+y)%3===0?INK:PAP), diag2:(x,y)=>((x-y+999)%3===0?INK:PAP), cross:(x,y)=>((x+y)%4===0||(x-y+999)%4===0?INK:PAP),
  vline:(x,y)=>(x%2===0?INK:PAP), vline3:(x,y)=>(x%3===0?INK:PAP), knit:(x,y)=>(((x+((y>>1)&1))%3===0)?INK:PAP),
  d25:(x,y)=>(by(x,y)<.25?INK:PAP), d50:(x,y)=>(by(x,y)<.5?INK:PAP) };

/* =====================================================================
   骨架(參考比例)
   ===================================================================== */
const FACE_P=[[29.4,40],[29,48],[29.8,56],[30.8,63],[32,69],[34,72.6],[38,77.4],[42,81.6],[46,85],[49.6,87.2],[53,87.8],[56,87],[60,84.6],[64,82],[68,79],[72,75.6],[75.4,72],[77.6,68],[79.6,62],[80.4,54],[80,46],[78,38],[70,30],[54,27],[38,29],[31,34]];
const FACES={
 full:[[29.4,40],[29,48],[29.8,56],[30.6,63],[31.6,69],[33.2,73],[37,78.4],[41,82.6],[45.2,86],[49.2,88],[53,88.6],[56.4,87.8],[60.4,85.6],[64.4,83],[68.4,80],[72.4,76.4],[75.6,72.6],[77.6,68],[79.6,62],[80.4,54],[80,46],[78,38],[70,30],[54,27],[38,29],[31,34]],
 sharp:[[29.4,40],[29,48],[29.8,56],[31,62.6],[33.4,68],[35.6,71.6],[39.4,76.2],[43,80.6],[46.6,84.4],[50,87],[53,87.8],[56,86.8],[60,84.4],[64,81.6],[68,78.6],[72,75],[75.2,71.6],[77.6,68],[79.6,62],[80.4,54],[80,46],[78,38],[70,30],[54,27],[38,29],[31,34]],
 round:[[29.4,40],[29,48],[29.6,56],[30.2,63],[30.8,69],[32,74],[35,79.6],[39,84],[43.6,87.4],[48.6,89.4],[53,90],[57,89.4],[61,87.6],[65,85.2],[69,82.4],[72.8,78.8],[76,74.4],[78,69],[79.6,62],[80.4,54],[80,46],[78,38],[70,30],[54,27],[38,29],[31,34]],
};
const EAR_P=[[79.4,47.4],[82.4,45],[86.4,45.2],[89,48],[89.6,53],[88.6,58.4],[86,62.6],[82.4,65.2],[79,64.6],[78.4,56]];
const BODY_L=[[54.2,86],[54.6,90],[55,93],[52.6,94.6],[49,96.6],[45,99],[40.6,101.6],[36,104],[32.6,106.4],[30.2,109.6],[28.8,114],[28.4,120],[28.4,128]];
const BODY_R=[[76.8,70],[76.6,74],[77.4,79],[78.8,83],[81.2,86.6],[85,89.4],[89.6,92],[94.6,95],[100,98.4],[105.6,101.6],[110.6,104.6],[114.4,108.6],[116,113],[116.6,120],[116.6,128]];
const SKULL=[57.6,37,33.4,34];
const EYE_F=[39.5,55], EYE_N=[65,54.2], MOUTH=[50.6,78.6];
const LENS_F=[38.8,56.6,8.2], LENS_N=[63.8,56,8.6];
const LOBE_N=[81.6,64.6], LOBE_F=[31.6,68.6];
const midX=y=>64.4-(y-100)*.2;

const EYESPR={"plain":{"near":["...#####...",".#########.","#...###...#","....###....","....###....","...........",".....###..."],"far":["..#####..",".#######.","#..###..#","...###...","...###...",".........","...##...."]},"crease":{"near":["..######...",".#......#..","...######..","..#########","#...###...#","....###....","....###...."],"far":[".#####...","#.....#..","..#####..",".#######.","#..###..#","...###...","...###..."]},"round":{"near":["...#####...","..#.....#..",".#.......#.","....###....","...#####...","....###....","...........",".....###..."],"far":["..####...",".#....#..","#......#.","...###...","..####...","...##....",".........","...##...."]},"heavy":{"near":["...........",".#########.","###########","...#####...","....###....","...........","....####..."],"far":[".........",".#######.","#########","..####...","...##....",".........","..###...."]},"narrow":{"near":["...........","..#######..","##########.","....###...#","...........","...###....."],"far":[".........",".######..","########.","...##....",".........","..##....."]},"dot":{"near":["...........",".#########.","....###....","....###....","...........",".....##...."],"far":[".........",".#######.","...##....","...##....",".........","...#....."]},"sharp":{"near":["........##.",".....###...","..######...","##.###.....","...###.....","...........","...####...."],"far":["##.......","..###....","..#####..","...###.##","...###...",".........","....##..."]},"droop":{"near":["...#####...",".##.....##.","#...###...#","....###...#","....###....","...........","....###...."],"far":["..####...",".#....##.","#..###..#","#..###...","...##....",".........","...##...."]},"lash":{"near":["..#.#.#.#..","..#######..",".#########.","#...###...#","....###....","...........",".....###..."],"far":[".#.#.#...",".######..",".#######.","#..###..#","...###...",".........","...##...."]},"sleepy":{"near":["...........","...........","..#######..",".#.#####.#.","...#####...","...........","....###...."],"far":[".........",".........",".######..","#.#####.#","..####...",".........","..##....."]},"wide":{"near":["...#####...","..#.....#..",".#...#...#.","...#####...","...#####...","...#####...","....###....","...........","....###...."],"far":["..####...",".#....#..","#..#...#.","..####...","..####...","..####...","...##....",".........","...##...."]},"spiral":{"near":["...#####...",".##.....##.","#..#####..#","..#.....#..","..#.###.#..","..#.#.#.#..","..#...#.#..","...#####..."],"far":["..####...",".#....##.","#.####..#",".#....#..",".#.##.#..",".#.#..#..","..####..."]},"void":{"near":["...#####...",".##.....##.","#..#ooo#..#","..#ooooo#..","..#ooooo#..","...#ooo#...","....###....","...........","....###...."],"far":["..####...",".#....##.","#.#oo#..#",".#oooo#..",".#oooo#..","..####...",".........","...##...."]},"cry":{"near":["...........","..#######..","#.........#","..#######..","...........","..#######..","...#####..."],"far":[".........",".######..","#.......#",".######..",".........",".######..","..####..."]},"smile":{"near":["...........","...........","....###....","..##...##..",".#.......#.","...........","..........."],"far":[".........",".........","...###...",".##...##.","#.......#",".........","........."]},"closed":{"near":["...........","...........","...........",".##.....##.","...#####...","...........","..........."],"far":[".........",".........",".........",".#.....#.","..#####..",".........","........."]}};
const EYEMOOD={"joy":{"near":["...........","...........","....###....","..##...##..",".#.......#.","...........","..........."],"far":[".........",".........","...###...",".##...##.","#.......#",".........","........."]},"tired":{"near":["...........","...........","...........",".#########.","#...###...#","....###....","...#.#.#..."],"far":[".........",".........",".........",".#######.","#..###..#","...###...","..#.#...."]}};


/* =====================================================================
   部件表
   ===================================================================== */
const BG=[['#496a72','灰青'],['#7e7e7e','灰'],['#3863a2','藍'],['#6e7b43','橄欖'],['#6a4d7a','紫'],['#a43c37','紅'],['#b17b49','赭'],['#ddc849','黃'],
  ['#a1bbbb','霧藍'],['#7ed2b0','薄荷'],['#c7be8e','卡其'],['#889264','灰綠'],['#dfb49f','膚粉'],['#f2a76a','橘'],['#ec5a6b','珊瑚'],['#b091be','薰衣草'],['#2b2d33','墨'],['#ffffff','白']];
const CATS=[
 {k:'bg',n:'背景',g:'背景',color:1,o:BG},
 {k:'bangs',n:'前髮',g:'頭髮',o:[['none','露額'],['blunt','齊瀏海'],['short','短瀏海'],['mgap','M字'],['center','中分'],['side','旁分'],['curtain','八字'],['eye','遮眼'],['bowl','香菇頭'],['choppy','碎瀏海'],['curly','捲瀏海'],['slick','後梳'],['spiky','刺刺頭'],['buzz','平頭'],['bald','光頭']],c:[8,0,104,80]},
 {k:'side',n:'側髮',g:'頭髮',o:[['none','無'],['short','短鬢'],['chin','及下巴'],['long','長鬢'],['thin','細鬚'],['curl','內彎'],['asym','不對稱'],['wavy','波浪']],c:[8,16,104,104]},
 {k:'back',n:'後髮',g:'頭髮',o:[['none','無'],['short','短髮'],['bob','鮑伯'],['lob','及肩'],['long','長髮'],['wave','波浪長'],['curlybob','捲短髮'],['fluffy','蓬鬆'],['flip','外翹'],['wolf','狼尾'],['messy','亂髮']],c:[0,0,128,128]},
 {k:'tied',n:'綁髮',g:'頭髮',o:[['none','無'],['bun','丸子頭'],['lowbun','低丸子'],['messybun','亂丸子'],['pony','馬尾'],['sidepony','側馬尾'],['braid','單辮'],['twin','雙辮'],['pig','雙馬尾']],c:[0,0,128,128]},
 {k:'hairc',n:'髮色',g:'頭髮',o:[['black','黑'],['brown','栗棕'],['blond','亞麻金'],['blue','霧藍'],['green','墨綠'],['wine','酒紅'],['grey','灰'],['white','白']],c:[8,0,104,80]},
 {k:'dye',n:'染髮',g:'頭髮',o:[['none','無'],['ear','耳圈染'],['streak','挑染'],['tips','髮尾漸層']],c:[0,0,128,128]},
 {k:'dyec',n:'染色',g:'頭髮',o:[['blond','亞麻金'],['brown','栗棕'],['blue','霧藍'],['green','墨綠'],['wine','酒紅'],['white','白'],['black','黑']],c:[0,0,128,128]},
 {k:'face',n:'臉型',g:'臉',o:[['std','標準'],['full','寬下顎'],['sharp','尖下巴'],['round','圓臉']],c:[16,36,80,64]},
 {k:'brow',n:'眉',g:'臉',o:[['thin','細'],['flat','平'],['arch','彎'],['worry','八字'],['angry','怒'],['thick','粗'],['bushy','濃'],['short','麻呂'],['none','無']],c:[26,36,52,28]},
 {k:'eye',n:'眼',g:'臉',o:[['plain','杏眼'],['crease','雙眼皮'],['round','圓眼'],['heavy','厚眼皮'],['narrow','細長'],['sharp','上揚'],['droop','下垂'],['lash','睫毛'],['sleepy','半睜'],['wide','瞪大'],['dot','豆豆眼'],['spiral','漩渦'],['void','空洞'],['smile','笑眼'],['closed','閉眼']],c:[26,40,52,26]},
 {k:'nose',n:'鼻',g:'臉',o:[['L','し'],['short','短'],['hook','勾'],['round','圓'],['dot','鼻孔']],c:[34,54,30,24]},
 {k:'mouth',n:'嘴',g:'臉',o:[['line','一字'],['small','小嘴'],['smile','微笑'],['frown','下彎'],['wavy','抿嘴'],['open','張口'],['oh','喔'],['grin','咧嘴'],['teeth','咬牙'],['tongue','吐舌'],['cat','貓嘴'],['pout','嘟嘴'],['stalk','叼著'],['maskw','白口罩'],['maskb','黑口罩']],c:[30,62,42,32]},
 {k:'cheek',n:'腮紅',g:'臉',o:[['none','無'],['lines','直線'],['hatch','斜線'],['dots','點點']],c:[22,44,64,36]},
 {k:'mole',n:'痣',g:'臉',o:[['none','無'],['eye','淚痣'],['mouth','嘴角'],['cheek','臉頰'],['two','兩顆'],['freckle','雀斑']],c:[22,44,64,44]},
 {k:'beard',n:'鬍子',g:'臉',o:[['none','無'],['goatee','下巴鬍'],['mustache','小鬍子'],['stubble','鬍渣'],['both','鬍子+下巴'],['full','落腮鬍']],c:[22,52,64,44]},
 {k:'wrinkle',n:'皺紋',g:'臉',o:[['none','無'],['laugh','法令紋'],['eye','魚尾紋'],['all','都有']],c:[20,36,72,52]},
 {k:'bags',n:'黑眼圈',g:'狀態',o:[['none','無'],['light','淡'],['heavy','深']],c:[26,44,52,28]},
 {k:'sweat',n:'汗',g:'狀態',o:[['none','無'],['one','一滴'],['few','幾滴'],['many','滿頭']],c:[16,24,84,72]},
 {k:'tear',n:'淚',g:'狀態',o:[['none','無'],['drop','淚珠'],['stream','淚痕'],['flood','大哭']],c:[22,44,64,44]},
 {k:'blood',n:'鼻血',g:'狀態',o:[['none','無'],['one','一條'],['two','兩條'],['long','到下巴']],c:[30,54,40,40]},
 {k:'glass',n:'眼鏡',g:'配件',o:[['none','無'],['round','圓框'],['oval','橢圓'],['rect','細方框'],['bold','粗框'],['half','眉框'],['roundsun','圓墨鏡'],['rectsun','方墨鏡']],c:[20,42,72,32]},
 {k:'ear',n:'耳飾',g:'配件',o:[['none','無'],['stud','耳釘'],['gauge','擴耳'],['tassel','流蘇'],['beads','串珠'],['hoop','圓圈'],['diamond','菱形'],['helix','耳骨釘']],c:[20,40,80,52]},
 {k:'hat',n:'帽子',g:'配件',o:[['none','無'],['marine','海軍帽'],['helmet','通學帽'],['duck','鴨舌帽'],['beanie','毛帽']],c:[0,0,128,96]},
 {k:'uni',n:'制服',g:'衣服',o:[['khaki','卡其制服'],['green','綠色制服'],['blue','淺藍制服'],['whiteu','白制服'],['tie','襯衫領帶'],['ribbon','襯衫蝴蝶結'],['sailor','水手服'],['gakuran','立領'],['pe','運動服']],c:[0,72,128,56],stage:'uniform'},
 {k:'inner',n:'便服',g:'衣服',o:[['none','無'],['tee','素T'],['print','印花T'],['ringer','滾邊T'],['mock','小高領'],['shirt','襯衫'],['open','開領襯衫'],['band','立領襯衫'],['mandarin','盤扣'],['tie','襯衫領帶'],['ribbon','襯衫蝴蝶結'],['sailor','水手服'],['tank','背心']],c:[0,72,128,56],stage:'casual'},
 {k:'cc',n:'衣色',g:'衣服',o:[['white','白'],['black','黑']],c:[0,72,128,56],stage:'casual'},
 {k:'outer',n:'外套',g:'衣服',o:[['none','無'],['blazer','西裝外套'],['hood','帽T'],['cardigan','開襟衫'],['jacket','黑外套'],['vneck','V領毛衣'],['vest','針織背心'],['track','運動外套']],c:[0,72,128,56],stage:'casual'},
 {k:'bag',n:'包包',g:'衣服',o:[['none','無'],['black','黑背包'],['white','白背包'],['hatch','格紋背包'],['guitar','吉他袋'],['tote','白托特'],['toteb','黑托特']],c:[0,24,128,104]},
];
const DEF={dye:'none',dyec:'blond',face:'std',bg:'#496a72',bangs:'blunt',side:'thin',back:'none',tied:'bun',hairc:'black',brow:'thin',eye:'plain',nose:'L',mouth:'line',cheek:'none',
  mole:'eye',beard:'none',wrinkle:'none',bags:'none',sweat:'none',tear:'none',blood:'none',glass:'round',ear:'none',hat:'none',
  uni:'khaki',inner:'tee',cc:'white',outer:'none',bag:'none'};
const RARE={dye:.15,hat:.25,glass:.45,blood:.04,tear:.05,sweat:.12,beard:.08,wrinkle:.05,tied:.35,bag:.25,outer:.5,cheek:.35,mole:.4,ear:.3,bags:.2,side:.7,back:.75};
const BIAS={hairc:[.5,.12,.07,.05,.05,.06,.08,.07],cc:[.6,.4],face:[.55,.15,.15,.15]};
function randomLook(rnd){ rnd=rnd||Math.random; const L={};
  for(const c of CATS){ const keys=c.o.map(o=>o[0]);
    if(BIAS[c.k]){ let r=rnd(),i=0; for(;i<BIAS[c.k].length-1;i++){ r-=BIAS[c.k][i]; if(r<0)break; } L[c.k]=keys[i]; continue; }
    if(c.k in RARE&&keys[0]==='none'){ L[c.k]=rnd()<RARE[c.k]?keys[1+Math.floor(rnd()*(keys.length-1))]:'none'; }
    else L[c.k]=keys[Math.floor(rnd()*keys.length)]; }
  if((L.mouth==='maskb'||L.mouth==='maskw')&&rnd()<.6)L.mouth='line';
  if(L.inner==='none'&&L.outer==='none')L.inner='tee';
  return L; }
function norm(L){ const o=Object.assign({},DEF); if(L&&L.hat==='strap')L=Object.assign({},L,{hat:'helmet'}); for(const c of CATS){ const v=L&&L[c.k]; if(v!==undefined&&c.o.some(x=>x[0]===v))o[c.k]=v; } return o; }

/* =====================================================================
   主繪製
   ===================================================================== */
/* 染髮:依圖層產生遮罩。耳圈染=內層(後髮/綁髮),挑染=順著髮流的幾縷,髮尾漸層=依髮長決定起點 */
const TIPB={short:54,bob:70,lob:80,long:84,wave:84,curlybob:66,fluffy:74,flip:70,wolf:86,messy:70};
const TIPS={short:50,chin:64,long:84,thin:62,curl:56,asym:76,wavy:80};
const tipStart=L=>L.back!=='none'?(TIPB[L.back]||70):L.side!=='none'?(TIPS[L.side]||64):70;
function lock(r,S,C,E,w){ for(let k=0;k<=80;k++){ const t=k/80, u=1-t, bx=u*u*S[0]+2*u*t*C[0]+t*t*E[0], byy=u*u*S[1]+2*u*t*C[1]+t*t*E[1], rr=w*(.5+.5*Math.min(1,t*4));
  for(let y=Math.floor(byy-2);y<=byy+2;y++)for(let x=Math.floor(bx-2);x<=bx+2;x++){ if(x<0||y<0||x>=W||y>=H)continue; const dx=x+.5-bx, dy=y+.5-byy; if(dx*dx+dy*dy<=rr*rr)r[id(x,y)]=1; } } return r; }
const DYE={
 ear:(m,lay,K)=>{ if(!(lay===17||lay===31||lay===37||(lay===13&&K.L.back==='none')))return null;
   return fnm(M(),(fx,fy,x,y)=>m[id(x,y)]&&(y>55||(y>48&&by(x,y)<(y-48)/7))); },
 streak:(m,lay,K)=>{
   if(lay===11){ const r=M(); lock(r,[46,10],[41,22],[37,48],1.05); lock(r,[62,10],[66,22],[68,48],1.05); return and(r,m); }
   if(lay===13){ const r=M(); for(let y=0;y<H;y++)for(const lo of [0,56]){ let a=-1,b=-1; for(let x=lo;x<lo+56&&x<W;x++)if(m[id(x,y)]){ if(a<0)a=x; b=x; }
       if(a<0||b-a<3)continue; const c=Math.round(a+(b-a)*(lo?.4:.6)); r[id(c,y)]=1; if(b-a>=6)r[id(lo?c+1:c-1,y)]=1; } return r; }
   return null; },
 tips:(m,lay,K)=>{ const T=K.tipY; return fnm(M(),(fx,fy,x,y)=>m[id(x,y)]&&(y>=T||(y>T-10&&by(x,y)<(y-(T-10))/10))); },
};
function render(L0,st){
  const L=norm(L0); st=st||{};
  const B=new Uint8Array(N);
  const age=st.age||16, adult=age>=18, old=age>=40, outfit=st.outfit||'casual';
  let hc=L.hairc; if(old&&(hc==='black'||hc==='brown'))hc='grey';
  const K={L,st,mood:st.mood||'neutral',age,adult,old,outfit,hc};
  K.HF={black:INK,grey:LG,white:PAP,blond:BLD,brown:BRN,blue:HBL,green:HGR,wine:WIN}[hc]||INK;   // 頭髮填色
  K.HO=hc==='grey'?LG:INK;                       // 頭髮外框
  K.HS=hc==='white'?LG:PAP;                      // 髮絲
  K.FLY=hc==='white'?INK:K.HF;                   // 散髮
  K.rough=['black','brown','blue','green','wine'].includes(hc);
  const DF={blond:BLD,brown:BRN,blue:HBL,green:HGR,wine:WIN,white:PAP,black:INK}[L.dyec];
  K.dye=(DYE[L.dye]&&DF!==undefined&&DF!==K.HF)?L.dye:null; K.DF=DF; K.dm=null; K.tipY=tipStart(L);
  K.HFF=K.dye?((x,y)=>K.dm&&K.dm[id(x,y)]?K.DF:K.HF):K.HF;
  K.face=shape(FACES[L.face]||FACE_P,8);
  K.ear=shape(EAR_P,8);
  K.hat=hatGeom(outfit==='gown'?'grad':L.hat);
  if(L.bangs==='buzz'||L.bangs==='bald'){ L.side='none'; L.back='none'; L.tied='none'; }
  bagBack(B,K);
  tiedBack(B,K);
  backHair(B,K);
  body(B,K);
  clothes(B,K);
  straps(B,K);
  tiedFront(B,K);
  braidsFront(B,K,true);
  ear(B,K);
  paint(B,K.face,PAP,{open:false});
  features(B,K);
  frontHair(B,K);
  sideHair(B,K);
  braidsFront(B,K);
  if(L.mouth==='maskw'||L.mouth==='maskb')mask(B,K);
  glasses(B,K);
  earrings(B,K);
  hat(B,K);
  return B; }

/* ---------- 身體、耳朵 ---------- */
function body(B,K){
  const m=poly(M(),[...spline(BODY_L,6),...spline(BODY_R,6).reverse(),[70,74],[62,80]]);
  paint(B,m,PAP,{open:true}); K.body=m;
  line(B,[[40.4,104.8],[44,106],[49,107],[54,107.6],[58,108.4]],INK);
  line(B,[[70.6,106.8],[76,105.8],[84,105.2],[94,105],[101,105.4]],INK);
  line(B,[[62.6,109.6],[64.6,110.6],[66.8,110]],INK);
  line(B,[[36.6,114],[36,121],[36.2,128]],INK); line(B,[[101,114],[100.6,121],[100.8,128]],INK); }
function ear(B,K){
  paint(B,K.ear,PAP,{open:false});
  line(B,[[83.6,48.6],[86.4,50.6],[86.6,55.4],[84.6,58.6]],INK);
  line(B,[[81.4,53.6],[82,56]],INK); }

/* ---------- 頭髮 ---------- */
function hairPaint(B,m,K,seed,open){ const m2=K.rough?roughen(B,m,seed):m; K.dm=K.dye?DYE[K.dye](m2,seed,K):null; paint(B,m2,K.HFF,{ol:K.HO,open:!!open}); K.dm=null; return m2; }
function strands(B,m,K,lines){ if(K.hc==='grey')return; const col=K.HS;
  for(const P of lines){ raster(spline(P,10)).forEach(([x,y],i)=>{ if(x<1||y<1||x>=W-1||y>=H-1||i%6===5)return; const j=id(x,y); if(!m[j])return; for(const [dx,dy] of D4)if(!m[id(x+dx,y+dy)])return; if(B[j]===K.HF)B[j]=col; }); } }
const BANGS={
 none:  [[20,47],[29.4,47],[30.6,42],[32.6,36.4],[36,32.6],[41,30.6],[47,29.8],[53,29.6],[59,30],[65,30.8],[70,32.2],[74,34.8],[76.6,39],[78,46],[79.4,54],[100,54]],
 blunt: [[20,48],[29.4,48],[30.4,44],[31.4,38.6],[34,37.8],[40,38],[46,37.6],[52,38],[58,37.8],[64,38],[70,37.6],[74.6,38],[76.4,41.6],[78,47],[79.4,54],[100,54]],
 short: [[20,47],[29.4,47],[30.4,42],[31.6,35],[34,34],[40,34.2],[46,33.8],[52,34.2],[58,34],[64,34.2],[70,33.8],[74.6,34.4],[76.6,39],[78,46],[79.4,54],[100,54]],
 mgap:  [[20,48],[29.4,48],[30.4,44],[31.4,38.6],[34,37.8],[40,38],[46,37.6],[48.6,37],[50,33],[51.4,31.4],[53.6,31.4],[55,33.2],[56.4,37.2],[58,37.8],[64,38],[70,37.6],[74.6,38],[76.4,41.6],[78,47],[79.4,54],[100,54]],
 center:[[20,49],[29.4,49],[30.6,46.4],[33,43.4],[37,39.6],[42,35.4],[47,31.4],[51,28.8],[53,28.6],[56,30.6],[61,33.8],[66,36.6],[71,39.4],[74.6,42.4],[77,47],[79.4,54],[100,54]],
 side:  [[20,48],[29.4,48],[30.6,43],[32.4,38],[35,33.6],[38.6,30.6],[42,29.8],[46,31.2],[52,33.6],[58,36],[64,38.4],[69,41],[73,43.6],[76,46.6],[78.4,50],[79.4,54],[100,54]],
 eye:   [[20,58],[29.4,60],[32,61.4],[35,61.6],[38,60.4],[42,57.6],[46,53.4],[50,48.4],[54,43.6],[58,39.8],[63,37.4],[68,36.8],[72,37.6],[75,40.8],[77,45.6],[79.4,54],[100,54]],
 curtain:[[20,52],[29.4,52],[31.4,50],[34,47.4],[38,43.6],[42,39.6],[46,35],[49.6,30.8],[52,29.2],[54.6,29.6],[57.6,32.8],[62,37],[67,40.2],[72,43.2],[75.6,46.8],[78,50.6],[79.4,54],[100,54]],
 bowl:  [[16,52],[24,49],[28.6,45],[31.6,42.6],[40,42.4],[50,42.8],[60,42.4],[70,42.8],[76,43.4],[82,45.6],[88,48.6],[100,52]],
 slick: [[20,46],[29.4,46],[30.6,41],[32.6,35.4],[36,31.6],[41,29.4],[47,28.4],[53,28],[59,28.4],[65,29.2],[70,30.8],[74,33.6],[76.6,38],[78,45],[79.4,54],[100,54]],
};
(()=>{ const P=[[20,48],[29.4,48],[30.4,44],[31.2,38]]; let up=true; for(let x=32.6;x<=74;x+=3.2){ P.push([x,up?34.2:39.4]); up=!up; } P.push([76.4,41.6],[78,47],[79.4,54],[100,54]); BANGS.choppy=P; })();
(()=>{ const P=[[20,48],[29.4,48],[30.4,44],[31.2,39]]; for(let x=32;x<=74;x+=1.2)P.push([x,36.4+2.8*Math.abs(Math.sin((x-32)*.36))]); P.push([76.4,42],[78,47],[79.4,54],[100,54]); BANGS.curly=P; })();
(()=>{ const P=[[20,47],[29.4,47],[30.6,42],[32,36]]; let up=true; for(let x=33.6;x<=74;x+=3.4){ P.push([x,up?30.6:34.8]); up=!up; } P.push([76,38],[78,46],[79.4,54],[100,54]); BANGS.spiky=P; })();
const STR={
 none:[],
 blunt:[[[44,31],[44,37]],[[60,31],[60.4,37]]],
 short:[[[46,29],[46,33]],[[60,29],[60.2,33]]],
 mgap:[[[42,31],[42,37]],[[64,31],[64.2,37]]],
 center:[[[46,27],[42,34]],[[59,27],[63,33]]],
 side:[[[52,28],[57,34]]],
 eye:[[[50,40],[45,48]],[[57,36],[53,42]]],
 curtain:[[[45,30],[41,38]],[[60,31],[65,38]]],
 bowl:[[[44,35],[44,42]],[[60,35],[60.4,42]]],
 choppy:[[[44,31],[44,36]],[[58,31],[58,36]]],
 curly:[],
 slick:[[[38,30],[46,19],[58,12]],[[50,29],[59,19],[70,14]]],
 spiky:[],
};
function frontHair(B,K){
  const s=K.L.bangs;
  if(s==='bald'||s==='buzz'){
    const skull=ell(M(),SKULL[0],SKULL[1],SKULL[2],SKULL[3]); let hair=M();
    if(s==='buzz'){ const hl=hlFn([[20,47],[29.4,46],[31,40],[34,35.4],[40,32],[48,30.6],[56,30.2],[64,31],[70,32.6],[74.6,35.4],[76.8,39.4],[78.2,44],[79.4,48],[100,48]]);
      hair=and(or(cp(skull),ell(M(),87.4,43.6,4.8,5.2)),fnm(M(),(X,Y)=>Y<hl(X))); }
    const head=sub(sub(or(cp(skull),hair),K.face),K.ear);
    if(K.hat){ sub(head,K.hat.head); sub(hair,K.hat.head); }
    sub(hair,K.ear);
    for(let i=0;i<N;i++)if(head[i])B[i]=PAP;
    for(let i=0;i<N;i++){ if(!K.face[i]||B[i]!==INK||((i/W)|0)>=60)continue; const x=i%W,y=(i/W)|0;
      for(const [dx,dy] of D4){ const X=x+dx,Y=y+dy; if(X>=0&&Y>=0&&X<W&&Y<H&&head[id(X,Y)]){ B[i]=PAP; break; } } }
    if(s==='buzz'){ const bc=K.dye?K.DF:K.HF, dens=bc===INK?.34:bc===LG?.12:bc===PAP?.3:.22, base=bc===INK?LG:bc, dot=bc===PAP?LG:INK;
      for(let i=0;i<N;i++){ if(!hair[i])continue; const x=i%W,y=(i/W)|0; let edge=false;
        for(const [dx,dy] of D4){ const X=x+dx,Y=y+dy; if(X>=0&&Y>=0&&X<W&&Y<H&&!hair[id(X,Y)]&&(K.face[id(X,Y)]||head[id(X,Y)]))edge=true; }
        B[i]=fh(x,y,53)<(edge?dens*.5:dens)?dot:base; } }
    const all=or(cp(head),hair);
    for(let i=0;i<N;i++){ if(!all[i])continue; const x=i%W,y=(i/W)|0;
      for(const [dx,dy] of D4){ const X=x+dx,Y=y+dy; if(X<0||Y<0||X>=W||Y>=H||(!all[id(X,Y)]&&!K.face[id(X,Y)]&&!K.ear[id(X,Y)]&&B[id(X,Y)]===0)){ B[i]=INK; break; } } }
    return; }
  const sk=s==='bowl'?ell(M(),57.6,34.6,35.8,33.4):ell(M(),SKULL[0],SKULL[1],SKULL[2],SKULL[3]);
  if(s!=='bowl')ell(sk,87.4,43.6,4.8,5.2);
  if(s==='spiky'){ for(let a=196;a<=344;a+=11){ const t=a*Math.PI/180, x=SKULL[0]+Math.cos(t)*SKULL[2]*.97, y=SKULL[1]+Math.sin(t)*SKULL[3]*.97, ox=Math.cos(t), oy=Math.sin(t), tx=-oy, ty=ox;
      poly(sk,[[x+tx*3.4,y+ty*3.4],[x+ox*5.6+tx*.6,y+oy*5.6+ty*.6],[x-tx*3.4,y-ty*3.4]]); } }
  if(s==='curly'){ for(let a=190;a<=350;a+=14){ const t=a*Math.PI/180; ell(sk,SKULL[0]+Math.cos(t)*SKULL[2]*.94,SKULL[1]+Math.sin(t)*SKULL[3]*.94,4.6,4.6); } }
  if(s==='slick')ell(sk,52,10,20,8.6);
  const hl=hlFn(BANGS[s]||BANGS.none);
  const m=and(sk,fnm(M(),(X,Y)=>Y<hl(X)));
  if(s!=='bowl')sub(m,K.ear); else sub(m,and(K.ear,fnm(M(),(X,Y)=>Y>50)));
  if(K.hat)sub(m,K.hat.head);
  if(!any(m))return;
  const m2=hairPaint(B,m,K,11,false);
  strands(B,m2,K,K.hat?[]:(STR[s]||[]));
}
function sideHair(B,K){
  const s=K.L.side; if(s==='none')return;
  const m=M();
  if(s==='short'){ poly(m,splC([[28.6,38],[32,38.6],[32.6,46],[32.2,54],[30.8,57.6],[29.4,52],[28.8,44]],6)); poly(m,splC([[75.6,40],[78.6,41],[79.2,50],[78.8,58],[77.6,60.4],[76.4,52],[75.8,46]],6)); }
  if(s==='chin'){ poly(m,splC([[27.6,36],[32.6,37.4],[33.6,48],[33.4,60],[32.8,70],[31.4,76.6],[29.6,72],[28.6,60],[28,48]],6)); poly(m,splC([[75,38],[79.6,40],[80.6,52],[80.2,62],[79,70],[77.4,74.6],[76.2,66],[75.8,52]],6)); }
  if(s==='long'){ poly(m,splC([[27,36],[33,37.4],[34.2,50],[34.2,70],[33.6,90],[32.6,104],[30.6,108.6],[28.6,100],[27.6,80],[27,56]],6)); poly(m,splC([[75,38],[80,40],[81.4,56],[82,76],[82.4,96],[81,104],[78.6,96],[77.6,76],[76.4,56]],6)); }
  if(s==='thin'){ cap(m,30.4,38,30.8,60,1.3,1.1); cap(m,30.8,60,31.6,76,1.1,.6); cap(m,77.4,40,78,60,1.3,1.1); cap(m,78,60,78.8,74,1.1,.6); }
  if(s==='curl'){ poly(m,splC([[27.6,36],[32.6,37],[33.4,48],[33.4,58],[35,64],[37.4,67.4],[35,69.4],[31,66],[29,58],[28,46]],6)); poly(m,splC([[75.4,38],[79.6,40],[80.6,52],[79.8,62],[77.6,67.6],[74.6,69.4],[74.4,66.4],[76.6,62],[76.2,50]],6)); }
  if(s==='asym'){ cap(m,30.6,38,31,52,1.3,.6); poly(m,splC([[74.6,38],[80.6,40],[82.2,56],[82.2,74],[80.8,86],[78.6,90.6],[76.6,80],[75.6,60]],6)); }
  if(s==='wavy'){ const wv=(x0,dir)=>{ const P=[]; for(let y=38;y<=96;y+=4)P.push([x0+Math.sin(y*.3)*1.6,y]); const Q=[]; for(let y=96;y>=38;y-=4)Q.push([x0+dir*5.6+Math.sin(y*.3+.6)*1.6,y]); return [...P,...Q]; };
    poly(m,spline(wv(27.6,1),3)); poly(m,spline(wv(75.6,1),3)); }
  if(K.hat&&K.hat.head)sub(m,K.hat.head);
  hairPaint(B,m,K,13,false); }
function backHair(B,K){
  const s=K.L.back; if(s==='none')return;
  const BOB=[[30,14],[24.4,28],[21.6,44],[20.8,60],[21.4,72],[23.6,81],[28,84.4],[38,84.6],[50,85],[62,85.4],[76,85.2],[88,84.6],[96,83],[100,77],[101.6,66],[101.4,52],[99.4,38],[95,26],[87,15],[75,7],[60,4],[44,6]];
  let m=M();
  if(s==='short'){ or(m,shape([[76,34],[88,26],[94.6,36],[95,48],[92.4,58],[87.6,64.6],[81.6,64],[78.6,54]],8)); or(m,shape([[25.4,38],[23.6,48],[25,56],[29.4,54],[30.6,42]],6)); }
  if(s==='bob')m=shape(BOB,8);
  if(s==='lob')m=shape([[30,14],[24.4,28],[21,46],[19.6,66],[19.4,86],[20.6,96],[25,100.6],[40,101],[64,101],[90,100.6],[101,99],[104.6,92],[105.6,76],[105,58],[102.6,42],[98,28],[89,16],[76,7],[60,4],[44,6]],8);
  if(s==='long')m=poly(M(),[...splC([[30,14],[24,28],[20.6,46],[19,70],[18.4,100],[18,124],[64,140],[108,124],[107.6,100],[106.6,76],[105.4,56],[103,40],[98,28],[89,16],[76,7],[60,4],[44,6]],8)]);
  if(s==='wave'){ const P=[[30,14],[24,28],[20.6,44]]; for(let y=50;y<=128;y+=4)P.push([19.6-Math.sin(y*.34)*2.6,y]); P.push([19,132],[108,132]); for(let y=128;y>=50;y-=4)P.push([107+Math.sin(y*.34+1.2)*2.6,y]); P.push([104,40],[98,28],[89,16],[76,7],[60,4],[44,6]); m=poly(M(),P); }
  if(s==='curlybob'){ m=shape(BOB.map(([x,y])=>[x,y<80?y:y-4]),8); const out=splC(BOB,3); for(let i=0;i<out.length;i+=2){ const [x,y]=out[i]; if(y>24)ell(m,x,y-2,4.4,4.4); } }
  if(s==='fluffy'){ ell(m,60,42,41,38); for(let a=0;a<360;a+=20){ const t=a*Math.PI/180; ell(m,60+Math.cos(t)*40,42+Math.sin(t)*37,7.4,7.4); } and(m,fnm(M(),(X,Y)=>Y<92)); }
  if(s==='flip'){ m=shape(BOB.map(([x,y])=>[x,y]),8); or(m,shape([[16.4,88.6],[21,80],[26,84],[22.6,87]],4)); or(m,shape([[106,87],[100,79],[96.6,83.6],[101.6,86.4]],4)); }
  if(s==='wolf'){ or(m,shape([[76,34],[88,26],[94.6,36],[95,48],[92.4,58],[87.6,64.6],[81.6,64],[78.6,54]],8)); or(m,shape([[25.4,38],[23.6,48],[25,56],[29.4,54],[30.6,42]],6));
    or(m,shape([[82,44],[94,44],[97.6,60],[98,78],[96.6,94],[93.6,106],[90,110],[88,98],[86.6,80],[83.4,62]],8)); }
  if(s==='messy'){ m=shape(BOB,8); const out=splC(BOB,2); out.forEach(([x,y],i)=>{ if(y<20||i%2)return; const cx=60, cy=44, dx=x-cx, dy=y-cy, L=Math.hypot(dx,dy), ux=dx/L, uy=dy/L, tx=-uy, ty=ux, k=3+fh(i,3,5)*3;
      poly(m,[[x+tx*2.6,y+ty*2.6],[x+ux*k,y+uy*k],[x-tx*2.6,y-ty*2.6]]); }); }
  if(K.hat&&K.hat.head)sub(m,K.hat.head);
  hairPaint(B,m,K,17,true); }
function tiedBack(B,K){
  const t=(K.hat&&K.hat.h==='grad'&&(K.L.tied==='bun'||K.L.tied==='messybun'))?'none':K.L.tied, m=M();
  if(t==='bun')ell(m,94.6,18.6,10.2,9.8);
  if(t==='messybun'){ ell(m,95,18,10.6,10); for(const [a,r] of [[205,4.4],[255,4.6],[305,4.2],[350,3.8],[35,4]]){ const q=a*Math.PI/180; ell(m,95+Math.cos(q)*9.6,18+Math.sin(q)*9,r,r); } }
  if(t==='lowbun')ell(m,92.4,57,8.8,8.4);
  if(t==='pony')poly(m,splC((K.hat&&K.hat.h==='grad')?[[86,36],[93,33],[99.6,37],[104,52],[105.6,70],[104,88],[100.6,98],[97.6,90],[97,72],[94.6,54],[90,42]]:[[86,22],[95,17],[102.6,23],[106,38],[108,56],[108.4,74],[106.4,90],[102.6,100],[99.6,92],[99.4,74],[97,54],[92.6,36]],6));
  if(t==='pig'){ poly(m,splC([[39,60],[46,62],[45,74],[42.4,84],[39.6,96],[36.4,108],[33,118],[30.6,120],[30,108],[32.4,94],[35,82],[37,70]],6)); poly(m,splC([[86,50],[93,50],[96,64],[98,82],[97.6,100],[95,108],[92,100],[91,82],[88.6,64]],6)); }
  if(K.hat&&K.hat.h==='grad')sub(m,K.hat.head);
  if(!any(m))return;
  hairPaint(B,m,K,31,false);
  const ok=v=>v===K.HF;
  if(t==='bun'||t==='messybun'){ line(B,[[89,12.4],[94,10],[99.6,12]],K.HS,{dash:[3,1],ok}); line(B,[[90,19.4],[96,17],[101,19.6]],K.HS,{dash:[2,1],ok}); }
  if(t==='messybun'){ line(B,[[101,7],[104.6,3.6],[108,5]],K.FLY); line(B,[[86,9.6],[83.6,5.4]],K.FLY); line(B,[[105,20],[110,22.6]],K.FLY); }
  if(t==='lowbun')line(B,[[87.6,53.4],[92,51.4],[97,53.6]],K.HS,{dash:[3,1],ok});
  if(t==='pony'){ const tie=(K.hat&&K.hat.h==='grad')?shape([[88.6,35.4],[96.6,33.8],[97.6,37.4],[89.6,39]],4):shape([[91.4,21],[97.6,18.6],[98.6,22],[92.6,24.4]],4); paint(B,tie,PAP); }
  if(t==='pig'){ for(const [x,y] of [[36.4,77.6],[89,52]]){ const tie=ell(M(),x,y,3.2,1.6); paint(B,tie,PAP); } } }
function tiedFront(B,K){
  const t=K.L.tied; if(t!=='sidepony')return;
  const m=shape([[83,58],[90,56],[93.4,66],[95.4,82],[95.6,100],[92.6,114],[88.6,119],[87.4,106],[86.4,88],[84.6,72]],6);
  hairPaint(B,m,K,37,false);
  const tie=shape([[83.4,60],[90.4,58],[91,61.6],[84,63.4]],4); paint(B,tie,PAP); }
function braidsFront(B,K,far){
  const t=K.L.tied; if(t!=='braid'&&t!=='twin')return;
  const one=(x0,y0,x1,y1,n,seed)=>{ for(let i=0;i<n;i++){ const q=i/(n-1), x=x0+(x1-x0)*q, y=y0+(y1-y0)*q, m=ell(M(),x,y,3.8-q*.6,3.1); K.dm=(K.dye==='ear'&&i%2&&q>.2)||(K.dye==='tips'&&q>.55)?m:null; paint(B,m,K.HFF,{ol:K.HO}); K.dm=null;
      if(K.hc!=='grey'){ px(B,x-.6,y+.4,K.HS); px(B,x+.4,y-.6,K.HS); } }
    const tie=ell(M(),x1,y1+3.6,2.4,1.5); paint(B,tie,PAP);
    const tuft=shape([[x1-2.2,y1+5],[x1+2.2,y1+5],[x1+3,y1+10],[x1,y1+8.4],[x1-3,y1+10]],4); K.dm=(K.dye==='ear'||K.dye==='tips')?tuft:null; paint(B,tuft,K.HFF,{ol:K.HO}); K.dm=null; };
  if(far){ if(t==='twin')one(38.4,70,35,108,9,43); return; }
  one(81.2,68,86.4,108,10,41); }

/* ---------- 臉部細節 ---------- */
function eyes(B,K){ const t=K.L.eye; let set=EYESPR[t]||EYESPR.plain;
  if(K.st.blink&&!['closed','dot','smile'].includes(t))set=EYESPR.closed;
  else if(K.mood==='joy')set=EYESPR.smile;
  else if(K.mood==='tired'&&!['dot','closed','narrow','sleepy','smile'].includes(t))set=EYEMOOD.tired;
  const f=set.far,n=set.near;
  spr(B,f,Math.round(EYE_F[0]-f[0].length/2),51);
  spr(B,n,Math.round(EYE_N[0]-n[0].length/2),50); }
const BROW={
 thin: {f:[[33.4,46.6],[37.6,45],[42.8,45.2]], n:[[57.6,44.6],[62.6,43.2],[68.8,43.6]], w:1},
 flat: {f:[[33.6,45.8],[38,45.2],[43,45.2]], n:[[58,44.2],[63,43.8],[69,43.8]], w:1},
 arch: {f:[[33.2,47],[36.6,44.8],[41,44.4],[43.4,45.4]], n:[[57.4,44.6],[61,42.6],[66,42.2],[69.6,43.6]], w:1},
 worry:{f:[[33.4,47.6],[38,46.4],[42.6,44]], n:[[57.6,43.2],[62.4,43.8],[69,46.6]], w:1},
 angry:{f:[[33.4,44],[38,45],[42.8,47.2]], n:[[57.6,47],[63,45],[69,42.8]], w:1},
 thick:{f:[[34,45.6],[42.6,45]], n:[[58.6,44.2],[68.6,43.6]], w:2},
 bushy:{f:[[33.4,46.8],[36,45],[42.6,44.8]], n:[[57.6,44.4],[64,42.8],[69.6,44]], w:2},
 short:{f:[[37.6,44.8],[40,44.8]], n:[[61.6,43.8],[64.6,43.8]], w:2},
};
/* 鬍子:黑色、毛邊 */
function fuzz(B,m,seed,hair){ const E=edgeSet(m,false);
  for(let i=0;i<N;i++){ if(!m[i])continue; const x=i%W,y=(i/W)|0; if(E[i]&&fh(x,y,seed)<.3)continue; B[i]=INK; }
  for(let i=0;i<N;i++){ if(!E[i])continue; const x=i%W,y=(i/W)|0; if(fh(x,y,seed+5)>=hair)continue;
    for(const [dx,dy] of D4){ const X=x+dx,Y=y+dy; if(X<0||Y<0||X>=W||Y>=H||m[id(X,Y)])continue;
      B[id(X,Y)]=INK; const X2=X+dx,Y2=Y+dy; if(fh(x,y,seed+9)<.35&&X2>=0&&Y2>=0&&X2<W&&Y2<H)B[id(X2,Y2)]=INK; break; } } }
function beard(B,K){
  const b=K.L.beard; if(b==='none')return; const F=K.face;
  if(b==='stubble'){ for(let y=72;y<92;y++)for(let x=28;x<82;x++){ const i=id(x,y); if(!F[i]||B[i]!==PAP)continue;
      const lip=y>=73&&y<=76&&x>=43&&x<=58, chin=y>=81&&Math.abs(x-52)<10, jaw=!F[id(x,Math.min(H-1,y+3))]||!F[id(Math.max(0,x-3),y)];
      if((lip||chin||jaw)&&fh(x,y,23)<.26){ B[i]=INK; if(fh(x,y,29)<.3&&F[id(x,Math.min(H-1,y+1))])B[id(x,Math.min(H-1,y+1))]=INK; } } return; }
  if(b==='mustache'||b==='both')fuzz(B,or(cap(M(),44.2,75.8,48.6,74.8,1.15),cap(M(),52.6,74.8,57.6,75.8,1.15)),31,.45);
  if(b==='goatee'||b==='both')fuzz(B,and(ell(M(),52.6,85.4,5.6,3.4),dil(F,1)),37,.55);
  if(b==='full'){ const m=shape([[79.4,52],[78,60],[74.6,66.4],[68.6,71],[61,73.4],[52,73.2],[45,72.8],[39,71],[34,67],[30.6,62],[28.8,62.6],[29.2,68.6],[32.4,75],[37,80.6],[42.4,85.4],[47.6,89],[53,90],[58.6,88.4],[65,84.6],[71,79.6],[76,73.4],[79.2,66],[80.2,58]],8);
    fuzz(B,m,41,.42);
    const E=edgeSet(m,false); for(let i=0;i<N;i++){ if(!m[i]||E[i]||!F[i])continue; const x=i%W,y=(i/W)|0; if(fh(x,y,47)<.15)B[i]=PAP; }
    const lip=and(ell(M(),50.6,78.8,5.2,2),F); for(let i=0;i<N;i++)if(lip[i])B[i]=PAP; } }
function features(B,K){
  const L=K.L, st=K.st, mood=K.mood, okF=isPap;
  let ch=L.cheek; if(mood==='joy'&&ch==='none')ch='lines';
  if(ch==='lines'){ for(let i=0;i<4;i++){ line(B,[[33+i*2,61.4],[33+i*2,64.4]],INK,{ok:okF}); line(B,[[60+i*2.2,60.8],[60+i*2.2,63.8]],INK,{ok:okF}); } }
  if(ch==='hatch'){ for(let i=0;i<4;i++){ line(B,[[32+i*2.4,64.6],[34.4+i*2.4,61]],INK,{ok:okF}); line(B,[[58.6+i*2.6,64.2],[61+i*2.6,60.6]],INK,{ok:okF}); } }
  if(ch==='dots'){ for(const [x,y] of [[33,62],[36,62.6],[39,62],[34.6,64.4],[37.6,64.8],[60,61.6],[63,62.4],[66,61.8],[61.6,64],[64.6,64.6]])px(B,x,y,INK); }
  let bg=L.bags; if(st.bags===2)bg='heavy'; else if(st.bags===1&&bg==='none')bg='light'; if(mood==='tired'&&bg==='none')bg='light';
  if(bg!=='none'){ const dash=bg==='light'?[1,1]:null; line(B,[[35.6,59.4],[39.6,60.4],[43,59.6]],INK,{ok:okF,dash}); line(B,[[60.6,58.8],[65,59.8],[69.6,58.8]],INK,{ok:okF,dash});
    if(bg==='heavy'){ line(B,[[36.4,61.4],[40,62.2],[42.6,61.4]],INK,{ok:okF,dash:[2,1]}); line(B,[[61.6,60.8],[65,61.6],[68.6,60.8]],INK,{ok:okF,dash:[2,1]}); } }
  eyes(B,K);
  let br=L.brow; if(mood==='sad'&&br!=='none')br='worry';
  const BRW=BROW[br]; if(BRW){ const dy=mood==='joy'?-1:0; line(B,BRW.f.map(([x,y])=>[x,y+dy]),INK,{w:BRW.w,ok:okF}); line(B,BRW.n.map(([x,y])=>[x,y+dy]),INK,{w:BRW.w,ok:okF}); }
  ({L:()=>line(B,[[48.4,60.4],[47.4,65.4],[46.2,68.4],[47,69.8],[49.4,70.2]],INK),
    short:()=>line(B,[[47.6,64.8],[46.4,68.4],[47.2,69.8],[49.2,70]],INK),
    hook:()=>line(B,[[49,59.6],[47,66.4],[45.4,69.2],[46.8,70.6],[49.6,70.4],[50.8,69.4]],INK),
    round:()=>{ line(B,[[44.6,68.4],[45.6,70.4],[48,70.8],[50,69.6]],INK); line(B,[[47.8,64.4],[46.8,66.6]],INK); },
    dot:()=>{ px(B,46,69,INK); px(B,49,69.6,INK); }})[L.nose]?.();
  const ml={eye:[[70.6,61]],mouth:[[56,80.6]],cheek:[[35.6,70]],two:[[70.6,61],[35.6,70]]}[L.mole];
  if(ml)for(const [x,y] of ml){ px(B,x,y,INK); px(B,x+1,y,INK); px(B,x,y+1,INK); }
  if(L.mole==='freckle')for(const [x,y] of [[33,62.6],[36,63.4],[34.6,65],[44,61],[51,60.6],[60,62],[63,63],[66,62.2],[61.6,64.6],[64.6,65]])px(B,x,y,INK);
  if(L.face==='sharp')line(B,[[75.6,60.2],[73,61.6],[70.4,62.6]],INK,{ok:isPap});
  beard(B,K);
  const wr=L.wrinkle, aged=K.old;
  if(wr==='laugh'||wr==='all'||aged){ line(B,[[44,70.6],[42.8,74.4],[43.4,77.6]],INK,{ok:okF}); line(B,[[55.6,71.6],[57.4,75.4],[56.6,78.6]],INK,{ok:okF}); }
  if(wr==='eye'||wr==='all'||aged){ line(B,[[72.6,53],[74.6,52]],INK,{ok:okF}); line(B,[[72.6,55.6],[74.6,56.4]],INK,{ok:okF}); line(B,[[33,54.6],[31.4,54]],INK,{ok:okF}); }
  mouth(B,K);
  let sw=L.sweat; if(st.sweat>=2)sw='many'; else if(st.sweat===1&&sw==='none')sw='one';
  const U=['#..#','#..#','#..#','.##.'];
  const SW={one:[[70,40]],few:[[70,40],[33,41],[57,66]],many:[[70,40],[33,41],[57,66],[47,38],[61,35],[36,72],[69,70]]}[sw];
  if(SW)for(const [x,y] of SW)spr(B,U,x,y);
  let te=L.tear; if(st.tear&&te==='none')te='stream';
  const stream=(x0,y0,len,w)=>{ for(let y=y0;y<y0+len;y++){ px(B,x0,y,INK); px(B,x0+w+1,y,INK); for(let x=1;x<=w;x++)px(B,x0+x,y,PAP); } px(B,x0+1,y0+len,INK); if(w>1)px(B,x0+2,y0+len,INK); };
  if(te==='drop')spr(B,['.#.','#o#','#o#','.#.'],36,60);
  if(te==='stream'){ stream(37,58,10,1); stream(63,57,11,1); }
  if(te==='flood'){ stream(36,58,16,2); stream(62,57,17,2); spr(B,['.#.','#o#','.#.'],31,62); spr(B,['.#.','#o#','.#.'],70,63); }
  let bl=L.blood; if(st.blood&&bl==='none')bl='one';
  if(bl==='one')line(B,[[47.6,71],[47.8,76.6]],INK,{w:3});
  if(bl==='two'){ line(B,[[46.6,71],[46.8,76]],INK,{w:2}); line(B,[[49.4,71.2],[49.6,77]],INK,{w:2}); }
  if(bl==='long'){ line(B,[[47.6,71],[47.8,80],[48.2,89]],INK,{w:3}); } }
function mouth(B,K){
  let mo=K.L.mouth; if(mo==='maskw'||mo==='maskb')return;
  const mood=K.mood;
  if(mood==='happy'&&['line','small','frown','wavy'].includes(mo))mo='smile';
  if(mood==='joy')mo='grin';
  if(mood==='sad'&&!['open','oh','stalk'].includes(mo))mo='frown';
  if(mood==='tired'&&['smile','grin','cat'].includes(mo))mo='line';
  const [mx,my]=MOUTH;
  ({line:()=>line(B,[[mx-3.6,my],[mx+3.4,my-.2]],INK),
    small:()=>line(B,[[mx-1.6,my],[mx+1.6,my]],INK),
    smile:()=>line(B,[[mx-4.6,my-1.4],[mx-2.6,my+.2],[mx+2.2,my+.2],[mx+4.2,my-1.2]],INK),
    frown:()=>line(B,[[mx-4.2,my+1.2],[mx-2.4,my],[mx+2,my],[mx+3.8,my+1.2]],INK),
    wavy:()=>line(B,[[mx-4,my+.4],[mx-2,my-.6],[mx,my+.2],[mx+2,my-.6],[mx+4,my+.2]],INK),
    open:()=>spr(B,['.###.','#####','#####','.###.'],mx-2.5,my-1.5),
    oh:()=>spr(B,['.##.','#oo#','#oo#','.##.'],mx-2,my-1.5),
    grin:()=>spr(B,['#######','#ooooo#','.#ooo#.','..###..'],mx-3.5,my-1.5),
    teeth:()=>spr(B,['.#######.','#o#o#o#o#','#ooooooo#','.#######.'],mx-4.5,my-2),
    tongue:()=>{ line(B,[[mx-3.6,my],[mx+3.6,my]],INK); spr(B,['#oo#','#oo#','.##.'],mx-.6,my+1); },
    cat:()=>spr(B,['#..#..#','.##.##.'],mx-3.5,my-1),
    pout:()=>spr(B,['.##.','#..#','.##.'],mx-2,my-1.5),
    stalk:()=>{ line(B,[[mx-2.4,my],[mx+2.6,my-.4]],INK);
      if(K.adult){ const x0=mx-1.6, y0=my+.4, x1=mx-16, y1=my+5.4, dx=x1-x0, dy=y1-y0, L2=dx*dx+dy*dy;
        const c=cap(M(),x0,y0,x1,y1,1.9); paint(B,c,PAP,{open:false});
        for(let i=0;i<N;i++){ if(!c[i])continue; const x=i%W,y=(i/W)|0, t=((x+.5-x0)*dx+(y+.5-y0)*dy)/L2;
          if(t>1.0)B[i]=RED; else if(t<.27&&B[i]===PAP)B[i]=LG; }
        line(B,[[x1-1.4,y1-3],[x1-3.6,y1-7.6],[x1-1,y1-12.4],[x1-3.4,y1-17.4],[x1-.8,y1-22.4]],LG,{dash:[2,1],ok:v=>v!==INK}); }
      else { line(B,[[mx-1,my+.4],[mx-10,my+3]],INK); const c=ell(M(),mx-12.4,my+3.6,2.8,2.8); paint(B,c,PAP,{open:false}); line(B,[[mx-13.6,my+3],[mx-12,my+3.4],[mx-12.6,my+5]],INK); } }})[mo]?.(); }
function mask(B,K){
  const black=K.L.mouth==='maskb';
  const m=and(shape([[28,66],[38,63.6],[47,61.6],[58,62.6],[77,63.6],[78.4,70],[71,79],[58,88],[46,88],[36,81],[29,72]],8),fnm(M(),(X,Y)=>K.face[id(X|0,Y|0)]||(X>70&&Y<74)));
  paint(B,m,black?INK:PAP,{open:false});
  const c=black?PAP:INK;
  line(B,[[31,70],[47,67.6],[74,69]],c,{ok:notBg}); line(B,[[34,77],[48,75],[70,76]],c,{ok:notBg});
  line(B,[[77.6,60.6],[80.6,53.6]],INK); line(B,[[77,69],[82,63.4]],INK); }

/* ---------- 眼鏡 ---------- */
function setE(B,m,v){ const E=edgeSet(m,false); for(let i=0;i<N;i++)if(E[i])B[i]=v; }
function glasses(B,K){
  const g=K.L.glass; if(g==='none')return;
  const [fx,fy,rf]=LENS_F, [nx,ny,rn]=LENS_N;
  const bridge=y=>line(B,[[fx+rf-.6,fy-1.6],[50.6,y],[nx-rn+.6,ny-2]],INK);
  const arm=()=>line(B,[[nx+rn-.4,ny-1.4],[80,49]],INK);
  if(g==='round'){ setE(B,ell(M(),fx,fy,rf,rf),INK); setE(B,ell(M(),nx,ny,rn,rn),INK); bridge(54.4); arm(); }
  if(g==='oval'){ setE(B,ell(M(),fx,fy,rf+.6,rf-2.4),INK); setE(B,ell(M(),nx,ny,rn+.6,rn-2.4),INK); bridge(55); arm(); }
  if(g==='rect'||g==='bold'){ for(const [cx,cy,r] of [[fx,fy,rf],[nx,ny,rn]]){ const o=fnm(M(),(X,Y)=>Math.abs(X-cx)<=r-.4&&Math.abs(Y-cy)<=r-2.6); if(g==='bold'){ let x0=W,x1=-1,y0=H,y1=-1; for(let i=0;i<N;i++)if(o[i]){ const x=i%W,y=(i/W)|0; if(x<x0)x0=x; if(x>x1)x1=x; if(y<y0)y0=y; if(y>y1)y1=y; } const inn=fnm(M(),(X,Y,x,y)=>x>=x0+2&&x<=x1-2&&y>=y0+2&&y<=y1-2); const fr=sub(cp(o),inn); for(let i=0;i<N;i++)if(fr[i])B[i]=INK; } else setE(B,o,INK); }
    if(g==='bold'){ for(let x=46;x<=56;x++)for(const y of [53,54])B[id(x,y)]=INK;
      paint(B,poly(M(),[[nx+rn-1.2,ny-4.6],[81.2,46.8],[81.2,49.6],[nx+rn-1.2,ny-1.6]]),INK,{ol:INK});
      paint(B,poly(M(),[[fx-rf+1,fy-5],[fx-rf-1.8,fy-5.2],[fx-rf-1.8,fy-2.4],[fx-rf+1,fy-2.2]]),INK,{ol:INK}); }
    else { bridge(54.8); arm(); } }
  if(g==='half'){ for(const [cx,cy,r] of [[fx,fy,rf],[nx,ny,rn]]){ const o=ell(M(),cx,cy,r+.4,r-2); setE(B,o,INK); const top=and(fnm(M(),(X,Y)=>Y<cy-2.4),ell(M(),cx,cy,r+.4,r-2)); for(let i=0;i<N;i++)if(top[i])B[i]=INK; } bridge(53.6); arm(); }
  if(g==='roundsun'||g==='rectsun'){ for(const [cx,cy,r] of [[fx,fy,rf],[nx,ny,rn]]){ const m=g==='roundsun'?ell(M(),cx,cy+.4,r-1,r-1):fnm(M(),(X,Y)=>Math.abs(X-cx)<=r-.4&&Math.abs(Y-cy)<=r-3.4); paint(B,m,INK);
      line(B,[[cx+1,cy-r*.42],[cx+r*.46,cy-r*.08]],PAP,{ok:onInk}); } bridge(54.6); arm(); } }

/* ---------- 耳飾 ---------- */
function earrings(B,K){
  const e=K.L.ear; if(e==='none')return;
  for(const [x,y,near] of [[LOBE_N[0],LOBE_N[1],1],[LOBE_F[0],LOBE_F[1],0]]){
    if(e==='gauge'&&near){ const r=ell(M(),x-.2,y+1.2,3.3,2.9); paint(B,r,INK,{ol:INK}); paint(B,ell(M(),x-.2,y+1.2,1.3,1.1),PAP,{ol:0}); spr(B,['##','##'],x+4.4,y-15); }
    if(e==='stud'&&near)spr(B,['##','##'],x-1,y-1);
    if(e==='tassel'){ line(B,[[x,y],[x,y+3]],INK); spr(B,['.#.','###','.#.'],x-1,y+3); const t=shape([[x-1.2,y+6],[x+1.2,y+6],[x+1.8,y+16],[x-1.8,y+16]],3); paint(B,t,INK); }
    if(e==='beads'){ line(B,[[x,y],[x,y+11]],INK); for(const yy of [y+4,y+8,y+12])spr(B,['.#.','###','.#.'],x-1,yy-1); }
    if(e==='hoop'){ const r=ell(M(),x+.4,y+4.2,3.4,3.6); setE(B,r,INK); }
    if(e==='diamond'){ line(B,[[x,y],[x,y+2]],INK); spr(B,['...#...','..#o#..','.#ooo#.','#ooooo#','.#ooo#.','..#o#..','...#...'],x-3,y+2); }
    if(e==='helix'&&near){ for(const [dx,dy] of [[4.4,-16],[5.4,-12],[5.2,-8]])spr(B,['#'],x+dx,y+dy); spr(B,['##','##'],x-1,y-1); } } }

/* ---------- 帽子 ---------- */
function hatGeom(h){
  if(!h||h==='none')return null;
  if(h==='marine'){ const crown=shape([[23.4,30],[25,19],[31,12],[42,7],[56,5.4],[70,6.6],[84,12],[94,19.6],[98.6,28],[99.6,38],[97,43.6],[84,45],[64,45],[44,44.6],[30,43],[24.6,38]],8); return {h,head:crown,crown}; }
  if(h==='helmet'){ const base=X=>29.4+(X-30)*.16;
    const dome=and(ell(M(),60,27.4,30.8,23.8),fnm(M(),(X,Y)=>Y<base(X)+.6));
    const brim=poly(M(),splC([[14.6,36],[16.4,31],[22,27.6],[32,25.2],[46,23.8],[60,23.8],[74,26],[85,30.4],[93.4,36],[98.6,42.4],[97.6,47.4],[92,45.6],[82,40.6],[72,36],[60,32.2],[46,31.4],[34,32.8],[24,35.6],[17.4,38]],4));
    return {h,head:or(cp(dome),brim),dome,brim,base}; }
  if(h==='duck'){ const crown=shape([[23.4,40],[22.6,30],[26.4,19.6],[35,10.6],[47,4.6],[61,3],[75,5.4],[86.4,11.6],[94,21],[97.4,31],[97,40.4],[91,44.6],[82,42.6],[68,38.8],[52,37.8],[36,38.6]],8);
    const bill=shape([[25,37.6],[40,36.8],[55,37.8],[64,40.4],[53,43],[37,44.8],[21,45.6],[11,44.2],[7.6,41.2],[12.6,38.6]],8);
    return {h,head:or(cp(crown),bill),crown,bill}; }
  if(h==='grad'){ const bot=hlFn([[0,33],[22,33.6],[34,30.6],[48,29.2],[62,29.4],[76,31],[88,34],[98,33],[128,31]]);
    const cap_=and(ell(M(),58.6,33,35.6,31.6),fnm(M(),(X,Y)=>Y<bot(X)+.5));
    return {h,head:fnm(M(),(X,Y)=>Y<bot(X)+.5),cap:cap_,bot,board:poly(M(),[[5,14],[58,3.4],[117,10.8],[63,23.4]])}; }
  if(h==='beanie'||h==='grad'){ const g=h==='grad';
    const bot=hlFn(g?[[12,45],[22,45.4],[34,41.6],[48,39.8],[62,40.2],[76,42.8],[86,46.2],[96,45],[106,42]]:[[12,46.4],[22,46.4],[34,42.8],[48,41],[62,41.4],[76,43.8],[86,47.2],[96,46.4],[106,44]]);
    const cap_=and(shape([[21,47],[20.6,34],[24.6,21],[33.6,11.6],[46.6,4.4],[61,1.8],[75,4.2],[86.4,11],[94,21],[97.8,32],[98,42.6],[95.4,48],[86,49]],8),fnm(M(),(X,Y)=>Y<bot(X)+.5));
    const G={h,head:cap_,cap:cap_,bot};
    if(g)G.board=poly(M(),[[1,13.6],[58,1.6],[121,10.4],[63,24.6]]);
    return G; }
  return null; }
function hat(B,K){
  const G=K.hat; if(!G)return; const h=G.h;
  if(h==='marine'){ paint(B,G.crown,INK);
    line(B,[[26,31],[44,32.8],[64,33.4],[84,32.6],[98,30.2]],PAP,{ok:onInk}); line(B,[[25.6,38.6],[44,40],[64,40.6],[84,39.8],[98.6,37.4]],PAP,{ok:onInk});
    const visor=shape([[14.6,42.6],[17.6,38.2],[24,37],[33,39.4],[41,43.4],[30,45.8],[20,45.6]],6); paint(B,visor,INK);
    line(B,[[16.6,40],[24,38.4],[32,40.4]],PAP,{ok:onInk});
    spr(B,['ooooooo','o#####o','ooooooo'],78,38); }
  if(h==='helmet'){
    paint(B,sub(cp(G.brim),G.dome),PAP); paint(B,G.dome,PAP,{open:false});
    for(const P of [[[60,3.6],[46,9],[36,18],[31,28]],[[60,3.6],[54,13],[51,23],[50.4,31.4]],[[60,3.6],[67,13],[71,23],[72.6,34.6]],[[60,3.6],[76,9],[86,19],[89.6,36]]])line(B,P,INK,{ok:isPap});
    const band=y=>{ const P=[]; for(let x=30;x<=91;x+=3)P.push([x,G.base(x)-y]); return P; };
    line(B,band(2.8),INK,{ok:isPap}); line(B,band(5.2),INK,{ok:isPap});
    spr(B,['.####.','#oooo#','#o##o#','#oooo#','.####.'],86,31.6); }
  if(h==='duck'){ paint(B,G.crown,PAP);
    for(const P of [[[61,3.4],[50,12],[42,24],[38.6,37.6]],[[61,3.4],[64,15],[66,27],[66.6,38.4]],[[61,3.4],[77,11],[88,23],[92.6,41]]])line(B,P,INK,{ok:isPap});
    spr(B,['.##.','####'],59,1); spr(B,['#'],48,19); spr(B,['#'],78,18);
    paint(B,G.bill,PAP);
    line(B,[[12,41],[24,39.6],[40,39],[56,40.4]],INK,{ok:isPap,dash:[2,1]}); }
  if(h==='beanie'){ paint(B,G.cap,INK);
    const top=X=>G.bot(X)-7.4;
    for(let x=21.6;x<=98;x+=2.6)line(B,[[x,top(x)+1],[x+.3,G.bot(x)-1]],PAP,{ok:onInk});
    const fold=[]; for(let x=20;x<=99;x+=2)fold.push([x,top(x)]); line(B,fold,PAP,{ok:onInk});
    for(let k=0;k<7;k++){ const x=30+k*10; line(B,[[x,top(x)-1.6],[x+(60-x)*.3,19],[60+(x-60)*.35,6.6]],PAP,{ok:onInk,dash:[2,2]}); } }
  if(h==='grad'){ paint(B,G.cap,INK);
    const th=M(); for(let i=0;i<N;i++)if(G.board[i]){ const x=i%W,y=(i/W)|0; for(let d=1;d<=3;d++)if(y+d<H)th[id(x,y+d)]=1; }
    paint(B,or(th,cp(G.board)),INK,{ol:INK});
    line(B,[[6.6,14],[63,22.2],[115.4,11]],PAP,{ok:onInk});
    spr(B,['.o.','ooo','.o.'],59,11);
    line(B,[[61,12.6],[90,12.2],[108,12.6],[111.6,14.6],[112,38]],PAP);
    const tu=poly(M(),[[109.6,38],[114.4,38],[115.6,47.4],[108.6,47.4]]); paint(B,tu,PAP);
    line(B,[[111,40],[110.6,47]],INK,{ok:isPap}); line(B,[[113,40],[113.4,47]],INK,{ok:isPap}); } }

/* ---------- 衣服 ---------- */
const NL={
 crew: [[0,93],[50,93],[54.8,92.6],[58,94.6],[62,96],[66,96.2],[70,95.2],[74,93],[78,90.2],[81.4,87.4],[90,86],[128,86]],
 v:    [[0,93],[50,93],[54.8,92.6],[58.6,99],[62,104.6],[64.6,108.4],[67.6,104],[72,97.6],[77,91.4],[81.4,87.4],[90,86],[128,86]],
 shirt:[[0,93],[50,93],[54.8,92],[58,95],[61.4,98.6],[64.4,101.4],[67.4,99],[72,95.4],[77,90.6],[81.4,87],[90,86],[128,86]],
 open: [[0,93],[50,93],[54.8,92.4],[58,98],[61,104],[63.6,108.6],[66.4,104],[71,97],[76.4,91],[81.4,87.4],[90,86],[128,86]],
 stand:[[0,93],[50,93],[54.8,91.2],[58,92.8],[62,94],[66,94.2],[70,93.4],[74,91.6],[78,89],[81.4,86.6],[90,86],[128,86]],
 tank: [[0,99],[38,99],[42,100],[48,105],[56,110],[64,112],[72,110],[80,105.6],[88,100],[94,97],[128,97]],
};
const OPEN_V=[[55.6,91],[57.8,102],[60.6,114],[60.4,128],[67,128],[67.4,114],[72,102],[80,88.2]];
function clothes(B,K){
  const L=K.L, o=K.outfit;
  let inner, outer='none', cc=L.cc;
  if(o==='uniform'){ inner=L.uni; cc=inner==='gakuran'?'black':'white'; }
  else if(o==='gown'){ inner='gown'; cc='black'; }
  else if(o==='pajama'){ inner='pajama'; cc='white'; }
  else if(o==='suit'){ inner='tie'; cc='white'; outer='blazer'; }
  else if(o==='work'){ inner='work'; cc='white'; }
  else if(o==='bare'){ K.cloth=M(); return; }
  else { inner=L.inner; outer=L.outer; if(o==='coat')outer='trench'; }
  if(inner==='gakuran')cc='black';
  const f=cc==='black'?INK:PAP, d=cc==='black'?PAP:INK;
  const body=K.body, gm=(P,dy)=>and(cp(body),below(P,dy||0));
  const cloth=M(); K.cloth=cloth;
  const rib=(P,x0,x1,c,dy)=>{ const q=hlFn(P), pts=[]; for(let x=x0;x<=x1;x+=.5)pts.push([x,q(x)+(dy||2.4)]); line(B,pts,c,{ok:notBg}); };
  const wings=(open,fc,lc)=>{ const Lw=open?[[55.6,90.6],[50.4,101.4],[57.4,104.6],[62,99]]:[[55.6,90.4],[50.8,101.2],[58.4,104.6],[63.6,99.8]];
    const Rw=open?[[80.8,86.4],[85.4,97],[73,103.4],[67.6,98.6]]:[[80.8,86.2],[85.2,97.2],[72.4,103.8],[65.6,99.8]];
    paint(B,or(shape(Lw,4),shape(Rw,4)),fc,{ol:lc}); };
  const buttons=ys=>{ for(const y of ys){ const m=ell(M(),midX(y),y,1.5,1.5); paint(B,m,PAP,{ol:f===PAP?INK:PAP}); } };
  const placket=y0=>line(B,[[midX(y0),y0],[midX(127),127]],d,{ok:notBg});
  const collarBand=(P,h,fc,lc)=>{ const m=and(and(cp(body),below(P,-h)),above(P,1.4)); and(m,fnm(M(),(X)=>X>53.4&&X<83.4)); paint(B,m,fc,{ol:lc}); return m; };
  let g=null;
  if(inner==='none'){ }
  else if(['tee','print','ringer','pe'].includes(inner)){ g=gm(NL.crew); paint(B,g,f);
    if(inner==='ringer'){ const bandM=and(cp(g),above(NL.crew,3.2)); paint(B,bandM,d===INK?INK:PAP,{ol:INK}); }
    else rib(NL.crew,55.6,80.6,d);
    if(inner==='print'){ const bx=fnm(M(),(X,Y)=>X>48&&X<64&&Y>108&&Y<120); paint(B,bx,f,{ol:d}); line(B,[[50.6,116],[53,111.6],[55.6,116],[58,111.6],[61,116]],d); }
    if(inner==='pe'){ const em=shape([[89,107],[96,106.4],[96.4,112],[92.6,115.4],[89.4,112]],4); paint(B,em,f,{ol:d}); px(B,92.6,110.4,d); } }
  else if(inner==='mock'){ g=gm(NL.crew); paint(B,g,f); const c=collarBand(NL.crew,6.4,f,INK); const E=edgeSet(c,false);
    for(let i=0;i<N;i++)if(c[i]&&!E[i]&&(i%W)%3===0)B[i]=d; }
  else if(['khaki','green','blue','whiteu'].includes(inner)){ const UC={khaki:KHK,green:GRN,blue:LBL,whiteu:PAP}[inner];
    g=gm(NL.shirt); paint(B,g,UC); wings(false,UC,INK); placket(103);
    for(const y of [104,111,118,125])spr(B,['##'],midX(y)+1,y);
    const ep=and(cap(M(),89.4,93.6,103.6,102,1.8),cp(body)); paint(B,ep,UC,{ol:INK}); spr(B,['#'],90.4,93.4);
    const pk=poly(M(),[[83.4,108.6],[96,107.4],[96.6,120.4],[84,121.4]]); paint(B,pk,UC,{ol:INK});
    const fl=poly(M(),[[82.8,107],[96.6,105.8],[96.8,109.8],[90,111.6],[83,110.8]]); paint(B,fl,UC,{ol:INK}); spr(B,['#'],89.6,109.4);
    line(B,[[84.4,103.6],[95.6,102.8]],INK,{dash:[1,1],ok:v=>v===UC}); }
  else if(['shirt','open','tie','ribbon','work','pajama'].includes(inner)){
    const openC=inner==='open'||inner==='pajama';
    g=gm(openC?NL.open:NL.shirt);
    paint(B,g,inner==='pajama'?((x,y)=>(x%5===0?INK:PAP)):f);
    wings(openC,f===INK?INK:PAP,f===INK?PAP:INK);
    if(openC){ placket(109); buttons([114,122]); }
    else if(inner==='shirt'){ placket(103); buttons([101.8,109,116.6,124]); }
    if(inner==='tie'||inner==='work'){ const k=shape([[61.4,100.6],[66.6,100.4],[66,104.6],[62,104.8]],4); paint(B,k,INK,{ol:f===INK?PAP:INK});
      const bl=shape([[62,104.2],[66,104],[68.6,120],[64.6,126.4],[60,120]],4); paint(B,bl,o==='uniform'?((x,y)=>((x+y)%5===0?PAP:INK)):INK,{ol:f===INK?PAP:INK}); }
    if(inner==='ribbon'){ const c=d; line(B,[[64.4,103],[59,100.4],[57.6,103.6],[64.4,103.6]],c); line(B,[[64.4,103],[70,100.4],[71,103.6],[64.4,103.6]],c); px(B,64.4,103.4,c); line(B,[[63.6,104],[60.6,112]],c); line(B,[[65.2,104],[68,112]],c); placket(106); }
    if(inner==='work'){ line(B,[[57.6,96],[50,110],[48.6,112]],INK); line(B,[[78,90],[72,101]],INK,{ok:notBg}); const bd=shape([[42,111],[53,110],[54,123],[43,124]],3); paint(B,bd,PAP); const ph=fnm(M(),(X,Y)=>X>44&&X<48.6&&Y>113&&Y<118.6); paint(B,ph,PAT.d50,{ol:INK}); line(B,[[49.6,114],[52.4,114]],INK); line(B,[[49.6,116.6],[52,116.6]],INK); } }
  else if(['band','mandarin'].includes(inner)){ g=gm(NL.stand); paint(B,g,f); collarBand(NL.stand,inner==='band'?4.4:5.4,f,d);
    placket(95); if(inner==='band')buttons([101,109,117,125]);
    else for(const y of [100,107,114,121]){ line(B,[[midX(y)-4.6,y],[midX(y)+4.6,y]],d,{w:1}); spr(B,f===PAP?['#.#','.#.','#.#']:['o.o','.o.','o.o'],midX(y)-1.5,y-1); } }
  else if(inner==='sailor'){ g=gm(NL.v); paint(B,g,f);
    const CL=[[0,112],[30,111],[40,110.4],[50,111],[58,112],[64.6,113.4],[70,108.6],[78,103],[88,98],[98,98.6],[108,103],[128,106]];
    const col=and(cp(g),above(CL)); paint(B,col,INK,{ol:INK});
    const s1=hlFn(CL), pts=[], pts2=[]; for(let x=29;x<=64;x+=.5)pts.push([x,s1(x)-2.6]); for(let x=65;x<=112;x+=.5)pts2.push([x,s1(x)-2.6]);
    line(B,pts,PAP,{ok:onInk}); line(B,pts2,PAP,{ok:onInk});
    const kn=shape([[60.6,110.4],[68.6,110],[64.6,115.6]],4); paint(B,kn,f===PAP?INK:PAP,{ol:INK}); }
  else if(inner==='gakuran'){ g=gm(NL.stand); paint(B,g,INK); const c=collarBand(NL.stand,5.4,INK,INK); rib(NL.stand,55,81.6,PAP,-5.2);
    for(const y of [104,113,122]){ const m=ell(M(),midX(y),y,1.7,1.7); paint(B,m,PAP,{ol:PAP}); } }
  else if(inner==='tank'){ g=and(cp(body),fnm(M(),(X,Y)=>X>37.4&&X<100.6&&(Y>=hlFn(NL.tank)(X)||(X>40&&X<46.6)||(X>88.6&&X<95.4)))); paint(B,g,f,{ol:INK}); }
  else if(inner==='gown'){ g=gm(NL.v); paint(B,g,INK); const v=hlFn(NL.v), P1=[], P2=[]; for(let x=54;x<=64;x+=.5)P1.push([x,v(x)+2.6]); for(let x=65;x<=82;x+=.5)P2.push([x,v(x)+2.6]); line(B,P1,PAP,{w:2,ok:onInk}); line(B,P2,PAP,{w:2,ok:onInk}); }
  if(g)or(cloth,g);
  /* 外套 */
  if(outer!=='none'){
    let ow=null;
    const ov=OPEN_V;
    if(outer==='blazer'||outer==='trench'||outer==='jacket'||outer==='track'){ ow=sub(gm(NL.crew,-1.4),poly(M(),ov));
      const fill=outer==='blazer'||outer==='jacket'?INK:outer==='track'?PAT.diag:PAP;
      paint(B,ow,fill);
      if(outer==='blazer'||outer==='trench'){ const lap=or(shape([[55.6,91],[49.4,102.4],[52.8,104.4],[50.6,107.6],[60.6,116.4]],4),shape([[80,88.4],[87.4,98],[84,100.6],[86.6,103],[67.4,116]],4));
        paint(B,lap,fill,{ol:outer==='blazer'?PAP:INK});
        if(outer==='blazer'){ const ps=shape([[90,106],[96,105.4],[94.6,108.6],[91,109]],3); paint(B,ps,PAP); }
        else for(const [x,y] of [[52.6,116],[53.4,124],[75,116],[74.4,124]])spr(B,['.#.','###','.#.'],x-1,y-1); }
      if(outer==='jacket'){ line(B,[[56.8,93],[58.6,104],[61.4,116],[61.4,127]],PAP,{ok:onInk}); line(B,[[78.6,89.6],[71,103],[66.4,116],[66,127]],PAP,{ok:onInk}); rib(NL.crew,50,86,PAP,.6); }
      if(outer==='track'){ const st=or(cap(M(),56.8,93,61.2,128,1.8),cap(M(),78.4,89.6,66.2,128,1.8)); and(st,ow); paint(B,st,INK,{ol:INK});
        const cl=and(and(cp(ow),above(NL.crew,3.4)),fnm(M(),()=>true)); paint(B,cl,INK);
        for(let y=96;y<128;y+=2)px(B,midX(y)-.4,y,INK); } }
    if(outer==='hood'){ ow=gm(NL.crew,-1.4); paint(B,ow,PAP);
      /* 帽子垂在脖子後面:近側一大團、遠側一小團,前面交疊成 V */
      const hood=and(or(shape([[78,80],[86,76.6],[95,79],[102,86.6],[103,95],[97,99.6],[88,98.6],[81,92.6]],8),shape([[56.6,88],[51,89.6],[45.6,94],[43.6,99.6],[49,101.6],[56,99],[60.6,95]],8)),cp(K.body));
      or(hood,and(poly(M(),[[54,92],[64,104.6],[74,94],[81.4,87.4],[84,94],[66,110],[60,108],[50,98]]),cp(K.body)));
      sub(hood,poly(M(),[[56,92.6],[64.4,103.4],[73.4,93.6],[81,87.6],[76,80],[60,86]]));
      paint(B,hood,PAP,{ol:INK});
      line(B,[[86,82],[93,86],[97,93]],INK,{ok:isPap}); line(B,[[83,88],[90,92.6],[93,97.4]],INK,{ok:isPap,dash:[3,1]}); line(B,[[50,94],[47.6,98]],INK,{ok:isPap});
      line(B,[[60.6,104],[59.6,114]],INK); line(B,[[68.6,103.4],[69.4,113]],INK); px(B,59.6,115,INK); px(B,69.4,114,INK); }
    if(outer==='cardigan'){ ow=sub(gm(NL.v),poly(M(),[[58.6,99],[60.6,114],[60.4,128],[66.4,128],[66.6,114],[67.6,104]])); paint(B,ow,PAT.diag2);
      for(const y of [110,118,126])spr(B,['.#.','#o#','.#.'],midX(y)-4,y-1); }
    if(outer==='vneck'){ ow=gm(NL.v); paint(B,ow,PAP); for(const x0 of [42,50,76,86,96])for(let y=104;y<128;y+=4){ line(B,[[x0,y],[x0+1.4,y+2],[x0,y+4]],INK,{ok:isPap}); }
      rib(NL.v,55,80.6,INK,2.6); }
    if(outer==='vest'){ ow=and(gm(NL.v),fnm(M(),(X)=>X>37.6&&X<100.4)); paint(B,ow,PAT.diag2);
      const vb=and(cp(ow),above(NL.v,3.2)); paint(B,vb,INK,{ol:INK});
      line(B,[[38.6,104],[39.6,116],[40.4,128]],INK); line(B,[[99.4,100],[98,114],[97.6,128]],INK); }
    if(ow){ or(cloth,ow); if(outer==='track'||outer==='jacket'||outer==='blazer'){} }
  }
  /* 手臂分界線、肩線(反色) */
  if(any(cloth)){ flip(B,[[37,112],[36.2,120],[36.4,128]],cloth); flip(B,[[100.6,113],[100.2,120],[100.4,128]],cloth);
    flip(B,[[43,100.2],[39,103],[36.4,107.6]],cloth); flip(B,[[95,95.4],[100,98.4],[103,103]],cloth); } }
/* 包包:背在後面的部分先畫(會被頭髮蓋住),肩帶最後畫在衣服上 */
function bagBack(B,K){
  const b=K.L.bag; if(b==='none'||K.outfit==='gown'||K.outfit==='bare')return;
  const bm=poly(M(),[...spline(BODY_L,6),...spline(BODY_R,6).reverse(),[70,74],[62,80]]), out=fnm(M(),(X,Y,x,y)=>!bm[id(x,y)]);
  if(b==='tote'||b==='toteb')return;
  if(b==='guitar'){ const ax=99.6,ay=106,bx=110.6,by2=29,L=Math.hypot(bx-ax,by2-ay),ux=(bx-ax)/L,uy=(by2-ay)/L,qx=-uy,qy=ux,w=10.6,w0=9.6;
    const pt=(t,s2)=>[ax+ux*t+qx*s2,ay+uy*t+qy*s2];
    const neck=poly(M(),[pt(0,-w0),pt(L-3.2,-w),pt(L-.8,-w+1),pt(L,-w+3.2),pt(L,w-3.2),pt(L-.8,w-1),pt(L-3.2,w),pt(0,w0)]);
    const bodyC=shape([[98,106],[110,97],[123,99],[131,108],[131,131],[106,131],[100,118]],6);
    paint(B,and(or(neck,bodyC),out),INK,{ol:INK});
    line(B,[pt(8,w0-2.2),pt(L-3.6,w-2.2),pt(L-2.2,w-3.8),pt(L-2.2,-w+3.8),pt(L-3.6,-w+2.2),pt(8,-w0+2.2)],PAP,{ok:onInk,dash:[2,1]});
    line(B,[[110.6,100.6],[122,103],[127,109]],PAP,{ok:onInk,dash:[2,1]});
    const tab=pt(L-10,w-2.2); spr(B,['oo','oo'],tab[0]-.5,tab[1]-.5); return; }
  const fill=b==='black'?INK:b==='white'?PAP:PAT.diag, sc=b==='black'?PAP:INK;
  paint(B,and(shape([[84,92],[90,84],[100,79.6],[113,78.4],[123,80.4],[131,86],[131,131],[108,131],[99,110]],6),out),fill,{ol:INK});
  line(B,[[104,81.6],[116,80.6],[126,84]],sc,{ok:notBg,dash:[2,1]});
  line(B,[[118.6,86],[121.6,128]],sc,{ok:notBg,dash:[2,1]}); }
function straps(B,K){
  const b=K.L.bag; if(b==='none'||K.outfit==='gown'||K.outfit==='bare')return;
  const body=K.body;
  if(b==='tote'||b==='toteb'){ const fill=b==='toteb'?INK:PAP, sc=b==='toteb'?PAP:INK;
    const back=or(cap(M(),94.2,92.4,100.6,97.6,1.8),cap(M(),100.6,97.6,107.6,130,1.8)); paint(B,back,fill,{ol:INK,open:false});
    const front=or(cap(M(),90.6,90.2,96.8,96,2.4),cap(M(),96.8,96,103.4,130,2.4)); paint(B,front,fill,{ol:INK,open:false});
    line(B,[[92.4,92.6],[97.6,97.4],[101.8,128]],sc,{ok:v=>v===fill,dash:[2,1]}); return; }
  const dk=b==='black'||b==='guitar', fill=dk?INK:b==='white'?PAP:PAT.diag, sc=dk?PAP:INK;
  const far=and(shape([[37,99],[47.6,96],[45,128],[33.6,128]],3),cp(body)), near=and(shape([[86.4,89.6],[96,93],[104.6,128],[93.4,128]],3),cp(body));
  paint(B,far,fill); paint(B,near,fill);
  line(B,[[40.4,101],[38.6,128]],sc,{dash:[2,1],ok:v=>v!==0}); line(B,[[91,93.6],[98.4,128]],sc,{dash:[2,1],ok:v=>v!==0}); }

/* =====================================================================
   輸出
   ===================================================================== */
const RGB={}; function rgb(h){ if(RGB[h])return RGB[h]; const v=[parseInt(h.slice(1,3),16),parseInt(h.slice(3,5),16),parseInt(h.slice(5,7),16)]; RGB[h]=v; return v; }
const INKC=[22,20,19], PAPC=[244,241,234], LGC=[192,190,186], REDC=[214,62,42], KHKC=[196,180,138], GRNC=[0,78,26], LBLC=[172,198,220], BLDC=[196,170,112], BRNC=[112,76,54], HBLC=[96,118,146], HGRC=[50,80,62], WINC=[118,44,52];
const PALC=[null,PAPC,INKC,LGC,REDC,KHKC,GRNC,LBLC,BLDC,BRNC,HBLC,HGRC,WINC];
function toCanvas(Bf,bg,crop){ const [cx,cy,cw,ch]=crop||[0,0,W,H]; const cv=document.createElement('canvas'); cv.width=cw; cv.height=ch;
  const c=cv.getContext('2d'), im=c.createImageData(cw,ch), d=im.data, b=rgb(bg||DEF.bg);
  for(let y=0;y<ch;y++)for(let x=0;x<cw;x++){ const v=Bf[id(cx+x,cy+y)], col=PALC[v]||b, i=(y*cw+x)*4; d[i]=col[0];d[i+1]=col[1];d[i+2]=col[2];d[i+3]=255; }
  c.putImageData(im,0,0); return cv; }
const cache=new Map();
function get(L,st,crop){ const key=JSON.stringify([norm(L),st||{},crop||0]); let cv=cache.get(key); if(cv)return cv;
  cv=toCanvas(render(L,st),norm(L).bg,crop); if(cache.size>260)cache.clear(); cache.set(key,cv); return cv; }
return {CATS,DEF,BG,norm,randomLook,render,get,W,H,raw:(L,st)=>Array.from(render(L,st))};
})();
</script>
<script>
/* =====================================================================
   像素外殼 PX —— 只負責畫面、角色、音效,不碰遊戲數值與命運種子
   (視覺上的隨機一律用 Math.random 或座標雜湊,R() 一次都不會被呼叫)
   ===================================================================== */
const PX=(()=>{
const LS='hssim_px_v2', MR=Math.random;
/* ---------------- 主題:只有深色(炭灰 ash)與淺色(藍裂 crack)兩組,依裝置或玩家切換(autoKey) ---------------- */
const CSSK=['bg','bg2','panel','panel2','ink','dim','line','rim','btn','btnInk','acc','accInk','hl','gold','good','bad','info','sat','barA','barB','hud','hudInk','sheet','sheetInk'];
/* 固定鍵=文字類(對比不變);lo/hi=低信心/高信心兩端,依 toneT 連續內插。HTML 的 :root/html.lt 預設色=這兩組在 toneT=.5 的值 */
const THEMES={
 ash:{"n":"炭灰","ink":"#dcd7cc","dim":"#8a867e","line":"#000000","btnInk":"#dcd7cc","accInk":"#0c0c0c","good":"#98a58a","bad":"#c0604f","info":"#8e9aa4","sat":"#a08c9a","hudInk":"#d6d1c6","sheet":"#d8d2c4","sheetInk":"#121212","vig":"#000000a0","app":"#00000030","hudHl":"#e8dfca","lo":{"bg":"#070708","bg2":"#020203","panel":"#0f1011","panel2":"#0a0a0b","rim":"#222324","btn":"#161718","acc":"#8e8a83","hl":"#a8a398","gold":"#8f8878","barA":"#2a9d8f","barB":"#e9b949","hud":"#050506"},"hi":{"bg":"#151411","bg2":"#080706","panel":"#1f1d1a","panel2":"#171614","rim":"#36332e","btn":"#24221f","acc":"#e9e1cf","hl":"#f0e8d6","gold":"#d8c9a4","barA":"#2a9d8f","barB":"#e9b949","hud":"#0b0a09"},"sky":["#020202","#0b0b0b","#1e1d1b"],"sil":"#060606","sil2":"#000000","win":"#d8cfb6","fog":"#232322","moon":"#e6e0d2"},
 crack:{"n":"藍裂","light":true,"ink":"#1c2640","dim":"#4f5b72","line":"#2c4778","btnInk":"#1c2640","accInk":"#f3efe6","good":"#245a3d","bad":"#922f20","info":"#284c86","sat":"#5c3e72","hudInk":"#ece6da","sheet":"#f3efe6","sheetInk":"#1c2640","vig":"#0000001e","app":"#ffffff40","hudHl":"#b9c9ea","lo":{"bg":"#d9d8d4","bg2":"#c9c8c4","panel":"#e4e3df","panel2":"#d2d1cc","rim":"#bab8b2","btn":"#dcdbd6","acc":"#4b5b78","hl":"#36456a","gold":"#6a5428","barA":"#2a9d8f","barB":"#e9b949","hud":"#232c42"},"hi":{"bg":"#efe9dc","bg2":"#e2dacb","panel":"#f7f2e8","panel2":"#e8e0d0","rim":"#cfc5b2","btn":"#efe7d8","acc":"#2c56a4","hl":"#24489a","gold":"#7a5a14","barA":"#2a9d8f","barB":"#e9b949","hud":"#1c2c55"},"sky":["#dcd6ca","#ebe6dc","#f5f2ec"],"sil":"#1c2640","sil2":"#1c2640","win":"#e8c070","fog":"#d2ccbf","moon":"#bfb6a2"}
};
let toneT=.5;
function themeMid(T){ if(T&&!T._mid){ for(const k in T.lo)T[k]=mix(T.lo[k],T.hi[k],.5); T._mid=1; } return T; }
function themeVars(T,t){ const V={}; for(const n of CSSK)V[n]=(T.lo&&n in T.lo)?mix(T.lo[n],T.hi[n],t):T[n]; return V; }
let pref={sfx:false,bgm:true,crisp:null,compact:false,look:Object.assign({},FACE.DEF)};
try{ const p=JSON.parse(localStorage.getItem(LS)||'null'); if(p){ pref=Object.assign(pref,p); pref.look=FACE.norm(p.look||{}); } }catch(e){}
function save(){ try{ localStorage.setItem(LS,JSON.stringify(pref)); }catch(e){} }
/* 配色:初始依裝置深淺色(深=炭灰 ash、淺=藍裂 crack),玩家可用按鈕切換(pref.scheme) */
const autoKey=()=>{ if(pref.scheme==='dark')return 'ash'; if(pref.scheme==='light')return 'crack'; try{ return matchMedia('(prefers-color-scheme: light)').matches?'crack':'ash'; }catch(e){ return 'ash'; } };
const th=()=>themeMid(THEMES[autoKey()]);

/* ---------------- 色彩工具 ---------------- */
function rgb(h){ h=h.replace('#',''); return [parseInt(h.slice(0,2),16),parseInt(h.slice(2,4),16),parseInt(h.slice(4,6),16)]; }
function hex(a){ return '#'+a.map(v=>clamp(Math.round(v),0,255).toString(16).padStart(2,'0')).join(''); }
function dk(h,f){ return hex(rgb(h).map(v=>v*f)); }
function mix(a,b,t){ const x=rgb(a),y=rgb(b); return hex(x.map((v,i)=>v+(y[i]-v)*t)); }
const BAY=[0,8,2,10,12,4,14,6,3,11,1,9,15,7,13,5];
const bay=(x,y)=>BAY[((y|0)&3)*4+((x|0)&3)]/16;
/* 依裝置像素比,以整數倍放大像素圖,避免不均勻的像素 */
function crisp(cv,src,css){ const dpr=window.devicePixelRatio||1, s=Math.max(1,Math.round(css*dpr/src.width)), w=src.width*s, h=src.height*s;
  if(cv.width!==w||cv.height!==h){ cv.width=w; cv.height=h; cv.style.width=(w/dpr)+'px'; cv.style.height=(h/dpr)+'px'; }
  const c=cv.getContext('2d'); c.imageSmoothingEnabled=false; c.clearRect(0,0,w,h); c.drawImage(src,0,0,w,h); return cv; }
const HEAD_CROP=[14,0,100,100];
function newCanvas(w,h){ const c=document.createElement('canvas'); c.width=w; c.height=h; return c; }

/* ---------------- 字型:Cubic 11 的格線是 12px ---------------- */
function applyFont(){
  const dpr=window.devicePixelRatio||1;
  const k=Math.round(15.5*dpr/12); let fz=k*12/dpr; const ok=fz>=13.5&&fz<=18.5;
  if(!ok)fz=16;
  const R=document.documentElement.style;
  R.setProperty('--fz',fz+'px'); R.setProperty('--fzs','12px'); R.setProperty('--fzb','24px');
  /* 閱讀式:內文預設清晰字(新設定鍵 rd,舊存檔的 crisp 不再沿用);像素字只留給標題與數字 */
  if(pref.rd===undefined)pref.rd=true;
  document.documentElement.classList.toggle('crisp',!!pref.rd);
  const b=$('tg-font'); if(b)b.textContent='內文:'+(pref.rd?'清晰字':'像素字'); }
function applyTheme(){
  const T=th(), R=document.documentElement.style;
  const V=themeVars(T,toneT); CSSK.forEach(n=>R.setProperty('--'+n,V[n])); R.setProperty('--vig',T.vig||'#00000099'); R.setProperty('--app',T.app||'#00000030'); R.setProperty('--hudHl',T.hudHl||T.hl); document.documentElement.classList.toggle('lt',!!T.light);
  document.querySelectorAll('canvas.pf.memo').forEach(c=>{ if(c._face){ const m=memorial(c._face); crisp(c,m,320); } });  /* 遺照框跟著深淺色換 */
  const m=document.querySelector('meta[name=theme-color]'); if(m)m.content=T.hud;
  heroBg=null; scrollerStrip=null; SC.bgKey=''; try{ schemeSync(); }catch(e){} }
function makeGrain(){ const c=newCanvas(96,96), x=c.getContext('2d'), im=x.createImageData(96,96), d=im.data;
  for(let i=0;i<d.length;i+=4){ const r=MR(); if(r<.5){ const v=r<.25?255:0; d[i]=d[i+1]=d[i+2]=v; d[i+3]=10+MR()*22|0; } }
  x.putImageData(im,0,0); document.documentElement.style.setProperty('--grain',`url(${c.toDataURL()})`); }

/* 原小人高度:表情粒子(react)的位置沿用(小人程式已刪除) */
const SH=18;
const GLYPH={'?':['.###.','#...#','..##.','.....','..#..'],'!':['..#..','..#..','..#..','.....','..#..'],'…':['.....','.....','#.#.#','.....','.....'],
 heart:['##.##','#####','#####','.###.','..#..'],die:['#####','#...#','#.#.#','#...#','#####'],note:['..###','..#.#','..#..','###..','##...'],
 z:['####','..#.','.#..','####'],star:['.#.','###','.#.'],crow0:['#...#','.###.','..#..'],crow1:['.....','#####','..#..']};
function glyph(c,g,x,y,col){ c.fillStyle=col; GLYPH[g].forEach((row,r)=>{ for(let i=0;i<row.length;i++)if(row[i]==='#')c.fillRect((x|0)+i,(y|0)+r,1,1); }); }

/* =====================================================================
   音效:低音量、小調的方波
   ===================================================================== */
let AC=null; const lastS={};
function ac(){ if(!AC){ try{ AC=new (window.AudioContext||window.webkitAudioContext)(); }catch(e){ return null; } } if(AC.state==='suspended'){ const p=AC.resume(); if(p&&p.catch)p.catch(()=>{}); } return AC; }
function tone(f,d,t0,type,vol,f2){ const a=ac(); if(!a)return; const t=a.currentTime+(t0||0);
  const o=a.createOscillator(), g=a.createGain(); o.type=type||'square'; o.frequency.setValueAtTime(f,t); if(f2)o.frequency.exponentialRampToValueAtTime(f2,t+d);
  g.gain.setValueAtTime(vol||.03,t); g.gain.exponentialRampToValueAtTime(.0001,t+d); o.connect(g); g.connect(a.destination); o.start(t); o.stop(t+d+.02); }
function sfx(n){ if(!pref.sfx)return; const now=performance.now(); if(lastS[n]&&now-lastS[n]<110)return; lastS[n]=now;
  const A3=220,C4=262,D4=294,E4=330,G4=392,A4=440,C5=523,E5=659,A5=880;
  switch(n){
   case 'click': tone(660,.03,0,'square',.018); break;
   case 'up':    tone(440,.05,0,'square',.022,660); break;
   case 'dice':  for(let i=0;i<5;i++)tone(180+MR()*260,.03,i*.05,'square',.018); break;
   case 'good':  [A4,C5,E5].forEach((f,i)=>tone(f,.1,i*.08,'triangle',.04)); break;
   case 'gold':  [A4,C5,E5,A5].forEach((f,i)=>tone(f,.12,i*.08,'triangle',.04)); break;
   case 'trait': [E4,A4,C5,E5].forEach((f,i)=>tone(f,.14,i*.09,'square',.025)); tone(A5,.5,.4,'triangle',.035); break;
   case 'bad':   tone(D4,.16,0,'triangle',.05); tone(A3,.3,.14,'triangle',.05,160); break;
   case 'year':  tone(E5,.25,0,'triangle',.035); tone(A4,.4,.18,'triangle',.03); break;
   case 'end_gold': [A4,C5,E5,A5,E5,A5].forEach((f,i)=>tone(f,.18,i*.14,'triangle',.04)); break;
   case 'end_bad':  [E4,D4,C4,A3].forEach((f,i)=>tone(f,.4,i*.3,'triangle',.05)); break;
   default: [A4,E4,G4].forEach((f,i)=>tone(f,.16,i*.12,'triangle',.04)); } }

/* =====================================================================
   結局配樂(原創 8-bit):只在結局畫面播放(進入結局時淡入)。E 小調、50 BPM、4/4。質感依原曲前兩分半:旋律吉他+沙沙聲(不取用原曲的旋律與錄音)
   原曲分析:吉他在 E3–E5、每秒約 3.3→4.9 個音、單音約 2.4 秒衰減到 1/4;沙沙聲是約 5.2 kHz 的刷聲,跟著拍子(每 1.2 秒一拍、0.6 秒細分)
   曲式:開場一小節只有沙沙聲;A 主段 16 小節(Em–D 與 C–D)+B 對比段 8 小節(C–G–Am–C–B)+A2(前四小節換長音)+B2(分解和弦高八度)
         =48 小節一大輪(約 3 分 50 秒),無縫循環回 A;第一輪分解和弦八分音符、第二輪十六分音符(越來越密,跟原曲一樣)
   聲部:撥弦感脈衝波吉他(主旋律+分解和弦,附點八分回音)、帶通雜訊沙沙聲+很淡的嘶聲;沒有鼓與低音
   層次:結局時全開(layers() 保留信心連動,留給之後的遊戲中配樂用:信心 <22 只剩沙沙聲、22 起加分解和弦、26 起加主旋律)
   排程:每 40ms 檢查一次,提前 0.6 秒把整小節排進 AudioContext 的時間軸(不碰遊戲的亂數)
   ===================================================================== */
const ENDM=(()=>{
  const BPM=50, ST=60/BPM/4, PCN={C:0,'C#':1,D:2,'D#':3,E:4,F:5,'F#':6,G:7,'G#':8,A:9,'A#':10,B:11};
  const mid=s=>{ const m=/^([A-G]#?)(\d)$/.exec(s); return 12*(+m[2]+1)+PCN[m[1]]; }, hz=m=>440*Math.pow(2,(m-69)/12);
  const CH={Em:['E4','G4','B4','E5'],D:['D4','F#4','A4','D5'],C:['C4','E4','G4','C5'],G:['G3','B3','D4','G4'],Am:['A3','C4','E4','A4'],B:['B3','D#4','F#4','B4']};
  const HA=['Em','Em','D','D','Em','Em','C','D','Em','Em','D','D','C','D','Em','Em'], HB=['C','C','G','G','Am','C','B','B'];
  const MA=['-:4 B4:2 E5:2 G5:4 F#5:2 E5:2','D5:4 E5:4 B4:8','-:4 A4:2 D5:2 F#5:4 E5:2 D5:2','E5:4 D5:4 A4:8',
            '-:4 B4:2 E5:2 G5:4 A5:2 B5:2','A5:4 G5:4 E5:8','G5:6 E5:2 C5:4 E5:4','F#5:6 E5:2 D5:4 A4:4',
            '-:2 B4:2 E5:2 B4:2 G5:4 F#5:2 E5:2','D5:4 E5:4 G5:8','-:4 A4:2 D5:2 F#5:4 A5:4','G5:4 F#5:4 D5:8',
            'C5:2 E5:2 G5:4 B5:4 A5:4','F#5:6 E5:2 D5:4 F#5:4','B5:8 A5:4 G5:4','F#5:4 G5:2 F#5:2 E5:8'];
  const MA2=['G5:12 F#5:4','E5:8 B4:8','F#5:12 E5:4','D5:8 A4:8'].concat(MA.slice(4));
  const MB=['E5:4 G5:4 C6:8','B5:4 G5:4 E5:8','D5:4 G5:4 B5:8','A5:4 G5:4 D5:8','C5:4 E5:4 A5:8','G5:4 E5:4 C5:4 E5:4','D#5:8 F#5:8','B4:4 D#5:4 F#5:4 A5:4'];
  const parse=bar=>{ let s=0; const o=[]; bar.split(' ').forEach(tk=>{ const [n,d]=tk.split(':'); if(n!=='-')o.push([s,+d,mid(n)]); s+=+d; }); return o; };
  const BARS=[]; [[HA,MA,'A'],[HB,MB,'B'],[HA,MA2,'A2'],[HB,MB,'B2']].forEach(([h,m,k])=>h.forEach((c,i)=>BARS.push({c,mel:parse(m[i]),k,i})));
  const ARP={A:[0,2,1,2,3,2,1,2,0,2,1,2,3,2,1,2],B:[0,1,2,3,2,1,2,3,0,1,2,3,2,3,2,1]};
  function kit(c){ if(c._bk)return c._bk;
    const pw=duty=>{ const n=48, re=new Float32Array(n), im=new Float32Array(n); for(let k=1;k<n;k++){ re[k]=Math.sin(2*Math.PI*k*duty)/(Math.PI*k); im[k]=(1-Math.cos(2*Math.PI*k*duty))/(Math.PI*k); } return c.createPeriodicWave(re,im); };
    const len=c.sampleRate*2|0, nb=c.createBuffer(1,len,c.sampleRate), d=nb.getChannelData(0); let r=1, v=1;  /* 15 位元 LFSR 雜訊 */
    for(let i=0;i<len;i++){ if(i%2===0){ const fb=(r^(r>>1))&1; r=(r>>1)|(fb<<14); v=(r&1)?.9:-.9; } d[i]=v; }
    return c._bk={p25:pw(.25),nz:nb}; }
  /* 吉他(主旋律+分解和弦)共用一條附點八分回音;沙沙聲直出 */
  function bus(c,dst){ const g=()=>c.createGain(), B={m:g(),lead:g(),arp:g(),gt:g(),sand:g()};
    B.lead.connect(B.gt); B.arp.connect(B.gt); B.gt.connect(B.m);
    const dl=c.createDelay(2), fb=g(), lp=c.createBiquadFilter(), wet=g(); dl.delayTime.value=ST*3; fb.gain.value=.32; lp.type='lowpass'; lp.frequency.value=2200; wet.gain.value=.3;
    B.gt.connect(dl); dl.connect(lp); lp.connect(fb); fb.connect(dl); lp.connect(wet); wet.connect(B.m);
    B.sand.connect(B.m); B.m.connect(dst); B._kill=[B.lead,B.arp,B.gt,dl,fb,lp,wet,B.sand]; return B; }
  /* 撥弦:脈衝波+低通由亮轉暗,音量指數衰減(ring=時間常數;原曲單音約 2.4 秒衰減到 1/4) */
  function gtr(c,o,f,t,d,v,ring,vib){ const s=c.createOscillator(), lp=c.createBiquadFilter(), g=c.createGain(); s.setPeriodicWave(kit(c).p25); s.frequency.setValueAtTime(f,t);
    lp.type='lowpass'; lp.Q.value=.7; lp.frequency.setValueAtTime(Math.min(9000,f*10),t); lp.frequency.exponentialRampToValueAtTime(Math.max(500,f*2.2),t+.35);
    g.gain.setValueAtTime(0,t); g.gain.linearRampToValueAtTime(v,t+.004); g.gain.setTargetAtTime(0,t+.004,ring); const end=t+Math.max(d,ring*3.2);
    if(vib){ const l=c.createOscillator(), lg=c.createGain(); l.frequency.value=5; lg.gain.setValueAtTime(0,t); lg.gain.linearRampToValueAtTime(0,t+.3); lg.gain.linearRampToValueAtTime(10,t+.9); l.connect(lg); lg.connect(s.detune); l.start(t); l.stop(end); }
    s.connect(lp); lp.connect(g); g.connect(o); s.start(t); s.stop(end); }
  /* 沙沙:帶通雜訊(約 5.2 kHz),慢起快收的刷聲 */
  function swish(c,o,t,v,n){ const s=c.createBufferSource(), f=c.createBiquadFilter(), g=c.createGain(); s.buffer=kit(c).nz; f.type='bandpass'; f.frequency.value=5200; f.Q.value=.9;
    g.gain.setValueAtTime(0,t); g.gain.linearRampToValueAtTime(v,t+.045); g.gain.exponentialRampToValueAtTime(.0001,t+.3); s.connect(f); f.connect(g); g.connect(o); s.start(t,(n*.0731)%1.6); s.stop(t+.32); }
  function bed(c,o,t0){ const s=c.createBufferSource(), f=c.createBiquadFilter(), g=c.createGain(); s.buffer=kit(c).nz; s.loop=true; f.type='highpass'; f.frequency.value=4000; g.gain.value=.004;
    s.connect(f); f.connect(g); g.connect(o); s.start(t0); return s; }
  function bar(c,B,n,t){
    if(n<0){ for(let s=0;s<16;s+=2)swish(c,B.sand,t+s*ST,s%4?.008:.014,s); return; }  /* 開場:只有沙沙聲 */
    const b=BARS[n%BARS.length], C=CH[b.c], k=b.k, two=k.length>1;
    b.mel.forEach(([s,d,m])=>gtr(c,B.lead,hz(m-12),t+s*ST,d*ST,.06,1.6,d>=4));
    const ap=ARP[k[0]]; for(let s=0;s<16;s+=two?1:2)gtr(c,B.arp,hz(mid(C[ap[s]])-12+(k==='B2'?12:0)),t+s*ST,ST,.016,1.1,false);
    for(let s=0;s<16;s+=2)swish(c,B.sand,t+s*ST,s===0?.03:s%4===0?.02:.012,n*16+s); }
  let A=null, Bs=null, on=false, tm=0, n=0, tNext=0;
  function layers(){ const t=ending?1:(S&&S.ab)?toneOf():1, now=A.currentTime;
    Bs.arp.gain.setTargetAtTime(t>=.28?1:0,now,.5); Bs.lead.gain.setTargetAtTime(t>=.36?1:0,now,.5); }
  function pump(){ if(!on||!A)return; try{ layers(); }catch(e){} const L=16*ST;
    if(tNext<A.currentTime-.1){ const k=Math.ceil((A.currentTime+.05-tNext)/L); n+=k; tNext+=k*L; }  /* 落後太多就跳到現在,不補排錯過的小節 */
    let c=0; while(tNext<A.currentTime+.6&&c<3){ bar(A,Bs,n,tNext); n++; tNext+=L; c++; } }
  function start(op){ if(on)return; A=ac(); if(!A)return; on=true; Bs=bus(A,A.destination); const skip=op&&op.skip; n=skip?0:-1; tNext=Math.max((op&&op.at)||0,A.currentTime+.1); Bs.bed=bed(A,Bs.sand,A.currentTime);
    Bs.m.gain.setValueAtTime(0,A.currentTime); Bs.m.gain.linearRampToValueAtTime(.6,tNext+(skip?.4:1.5));  /* skip:結局轉場時略過沙沙聲前奏,吉他直接進來 */  /* 比音效小聲,音效才聽得到 */
    pump(); tm=setInterval(pump,40); }
  function stop(){ if(!on)return; on=false; clearInterval(tm); const B=Bs, t=A.currentTime; Bs=null;
    B.m.gain.cancelScheduledValues(t); B.m.gain.setValueAtTime(B.m.gain.value,t); B.m.gain.linearRampToValueAtTime(0,t+.4); try{ B.bed.stop(t+.5); }catch(e){} setTimeout(()=>{ try{ (B._kill||[]).forEach(x=>{ try{ x.disconnect(); }catch(e){} }); B.m.disconnect(); }catch(e){} },600); }
  /* 試聽檔:開場一小節+nb 小節(全部聲部) */
  function render(sr,nb){ const oc=new OfflineAudioContext(1,Math.ceil(((nb+1)*16*ST+4)*sr),sr), B=bus(oc,oc.destination); bed(oc,B.sand,0);
    for(let i=-1;i<nb;i++)bar(oc,B,i,(i+1)*16*ST+.05); return oc.startRendering(); }
  return {start,stop,render,get on(){ return on; },BARS,ST,bus,bar,bed}; })();
/* =====================================================================
   遊戲中配樂(開始畫面+遊戲中):卡帶放入開場(CC0 錄音)→ 99 BPM 行進曲(動雌搭雌鼓組、連續低音、撥弦吉他旋律:1564+卡農進行)
   +卡帶嘶聲、音樂進來後疏版黑膠劈啪、整體殘響。第一次點擊時開始;進入結局時 toEnd() 換成結局配樂 ENDM(約 1 秒的換帶轉場)
   ===================================================================== */
const BGM=(()=>{
  /* ---------- 遊戲中配樂(原創 8-bit 行進曲)---------- */
  const PLAY=(()=>{
  const BPM=99, E8=60/BPM/2, hz=m=>440*Math.pow(2,(m-69)/12);
  /* 和弦根音(MIDI,低音在 E3 附近):1564 進行 E–B–C#m–A ×2 | 卡農進行 E–B–C#m–G#m–A–E–A–B */
  const PROG=[52,47,49,45, 52,47,49,45, 52,47,49,44,45,40,45,47];
  /* 每小節最後一個八分音符=走向下一小節根音的經過音(E 大調音階內,由下往上或由上往下差一級) */
  const SCLB=[4,6,8,9,11,1,3], inS=m=>SCLB.includes(((m%12)+12)%12);
  const approach=(r,nx)=>{ if(r===nx)return null; if(nx>r){ for(const d of [1,2])if(inS(nx-d))return nx-d; } else { for(const d of [1,2])if(inS(nx+d))return nx+d; } return null; };
  /* 主旋律:16 小節,第二輪加低三度和聲 */
  const PCN={C:0,'C#':1,D:2,'D#':3,E:4,F:5,'F#':6,G:7,'G#':8,A:9,'A#':10,B:11}, mid=x=>{ const m=/^([A-G]#?)(\d)$/.exec(x); return 12*(+m[2]+1)+PCN[m[1]]; };
  /* 旋律:前 8 小節(1564)用「三、三、二」切分的下行和弦分解+往上爬的答句;後 8 小節(卡農)用《卡農》(帕海貝爾,公領域)的級進下行線,每小節一個主音加小迴音 */
  const MEL=['E5:6 B4:6 G#4:4','F#4:2 G#4:2 B4:4 D#5:8','E5:6 C#5:6 G#4:4','A4:2 B4:2 C#5:4 E5:8',
    'G#5:6 E5:6 B4:4','B4:2 C#5:2 D#5:4 F#5:8','G#5:6 E5:6 C#5:4','A4:4 C#5:4 E5:4 F#5:4',
    'G#5:8 F#5:2 E5:2 F#5:4','F#5:8 E5:2 D#5:2 E5:4','E5:8 D#5:2 C#5:2 D#5:4','D#5:8 C#5:2 B4:2 C#5:4',
    'C#5:8 B4:2 A4:2 B4:4','B4:8 A4:2 G#4:2 A4:4','C#5:6 E5:2 A5:4 F#5:4','D#5:8 F#5:4 D#5:2 B4:2'];
  const MELP=MEL.map(b=>{ let st=0; const o=[]; b.split(' ').forEach(tk=>{ const [x,d]=tk.split(':'); if(x!=='-')o.push([st,+d,mid(x)]); st+=+d; }); if(st!==16)throw Error('bar length '+b); return o; });
  const S16=E8/2;
  /* 主旋律的回音(附點八分);音色見 gtrA/gtrB */
  function leadBus(c,o){ if(o._lb)return o._lb;  /* 每條匯流排各一份(遊戲裡會重建匯流排) */ const g=()=>c.createGain(), inp=g(), dl=c.createDelay(1), fb=g(), lp=c.createBiquadFilter(), wet=g();
    dl.delayTime.value=E8*1.5; fb.gain.value=.38; lp.type='lowpass'; lp.frequency.value=2400; wet.gain.value=.32;
    inp.connect(o); inp.connect(dl); dl.connect(lp); lp.connect(fb); fb.connect(dl); lp.connect(wet); wet.connect(o);
    const cv=c.createConvolver(), rg=g();  /* 立體聲殘響:左右不同的衰減雜訊(同一個 AudioContext 只算一次) */
    if(!c._irLead){ const sr=c.sampleRate, n=Math.floor(sr*1.8), ir=c.createBuffer(2,n,sr);
      for(let ch=0;ch<2;ch++){ const d=ir.getChannelData(ch); let sd=ch?777:333; for(let i=0;i<n;i++){ sd=(sd*16807)%2147483647; d[i]=(sd/2147483647*2-1)*Math.pow(1-i/n,3); } } c._irLead=ir; }
    cv.buffer=c._irLead; rg.gain.value=.12; inp.connect(cv); cv.connect(rg); rg.connect(o);
    o._kill=(o._kill||[]).concat([inp,dl,fb,lp,wet,cv,rg]);  /* 停止時要拆掉:回音迴圈(dl→lp→fb→dl)不拆會一直留在記憶體 */
    return o._lb=inp; }
  const LMODE='ks';  /* 定案:撥弦物理模型吉他 */
  /* A:撥弦感脈衝波(同結局配樂):低通由亮轉暗+指數衰減 */
  function gtrA(c,o,f,t,d,v){ const L=leadBus(c,o), s=c.createOscillator(), lp=c.createBiquadFilter(), g=c.createGain(); g.gain.value=0; s.setPeriodicWave(kit(c).p25); s.frequency.setValueAtTime(f,t);
    lp.type='lowpass'; lp.Q.value=.7; lp.frequency.setValueAtTime(Math.min(9000,f*10),t); lp.frequency.exponentialRampToValueAtTime(Math.max(500,f*2.2),t+.3);
    const end=t+d+.25; g.gain.setValueAtTime(0,t); g.gain.linearRampToValueAtTime(v*1.3,t+.004); g.gain.setTargetAtTime(0,t+.004,.9); g.gain.setValueAtTime(v*1.3*Math.exp(-(end-.084-t)/.9),end-.08); g.gain.linearRampToValueAtTime(0,end);
    s.connect(lp); lp.connect(g); g.connect(L); s.start(t); s.stop(end+.01); }
  /* B:撥弦物理模型(Karplus–Strong,分數延遲調音),每個音高算一次存起來 */
  function ksBuf(c,m){ c._ks=c._ks||{}; if(c._ks[m])return c._ks[m]; const sr=c.sampleRate, f=hz(m), n=Math.floor(sr*2.6), bf=c.createBuffer(1,n,sr), y=bf.getChannelData(0);
    const Ld=sr/f-.5, N=Math.ceil(Ld)+2, g=Math.exp(-1/(.87*sr)); let seed=1234+m, pv=0; const rnd=()=>{ seed=(seed*16807)%2147483647; return seed/2147483647*2-1; };
    for(let i=0;i<N&&i<n;i++){ pv=pv*.68+rnd()*.32; y[i]=pv; }
    const at=p=>{ const i0=Math.floor(p), fr=p-i0; return (y[i0]||0)*(1-fr)+(y[i0+1]||0)*fr; };
    for(let i=N;i<n;i++)y[i]=g*.5*(at(i-Ld)+at(i-Ld-1));
    let pk=0; for(let i=0;i<n;i++)pk=Math.max(pk,Math.abs(y[i])); for(let i=0;i<n;i++)y[i]/=pk||1; return c._ks[m]=bf; }
  function gtrB(c,o,m,t,d,v){ const L=leadBus(c,o), s=c.createBufferSource(), g=c.createGain(), end=t+Math.min(2.5,d+.3); g.gain.value=0; s.buffer=ksBuf(c,m);
    g.gain.setValueAtTime(0,t); g.gain.linearRampToValueAtTime(v*1.8,t+.03); g.gain.setValueAtTime(v*1.8,end-.08); g.gain.linearRampToValueAtTime(0,end); if(c._wow)c._wow.connect(s.detune);
    s.connect(g); g.connect(L); s.start(t); s.stop(end+.01); }
  function lead(c,o,f,t,d,v,vib,m){ if(LMODE==='ks')gtrB(c,o,m,t,d,v); else gtrA(c,o,f,t,d,v); }
  /* 第二輪:低三度和聲(E 大調音階內) */
  const SCL=[4,6,8,9,11,1,3], third=m=>{ const i=SCL.indexOf(m%12); if(i<0)return m-3; const pc=SCL[(i+5)%7]; let x=m-1; while((x%12+12)%12!==pc)x--; return x; };
  function noise(c){ if(c._nz)return c._nz; const len=c.sampleRate|0, b=c.createBuffer(1,len,c.sampleRate), d=b.getChannelData(0); let r=1,v=1;
    for(let i=0;i<len;i++){ if(i%2===0){ const fb=(r^(r>>1))&1; r=(r>>1)|(fb<<14); v=(r&1)?.9:-.9; } d[i]=v; } return c._nz=b; }
  /* 所有音的音量在建立時先設 0:否則第一個排程事件前的預設值 1 會在起點漏出一個全音量取樣點(爆音/沙塵感) */
  function nz(c,o,t,v,dec,type,f,q,att,off){ const s=c.createBufferSource(), fl=c.createBiquadFilter(), g=c.createGain(); g.gain.value=0; s.buffer=noise(c); fl.type=type; fl.frequency.value=f; fl.Q.value=q;
    g.gain.setValueAtTime(0,t); g.gain.linearRampToValueAtTime(v,t+(att||.001)); g.gain.exponentialRampToValueAtTime(.0001,t+dec); s.connect(fl); fl.connect(g); g.connect(o); s.start(t,Math.abs(off*.0731)%.8); s.stop(t+dec+.02); }
  /* 動:悶悶的大鼓。正弦 180→55Hz 下滑+低通雜訊的「噗」,沒有清脆的敲擊頭 */
  function kick(c,o,t,v,n){ const s=c.createOscillator(), g=c.createGain(); g.gain.value=0; s.type='sine'; s.frequency.setValueAtTime(180,t); s.frequency.exponentialRampToValueAtTime(55,t+.12); if(c._wow)c._wow.connect(s.detune);
    g.gain.setValueAtTime(0,t); g.gain.linearRampToValueAtTime(v,t+.006); g.gain.exponentialRampToValueAtTime(.0001,t+.32); s.connect(g); g.connect(o); s.start(t); s.stop(t+.34);
    nz(c,o,t,v*.35,.05,'lowpass',320,.7,.003,n); }
  /* 搭:特別鮮明的小鼓。亮的 LFSR 雜訊(帶通 2.6kHz+高通 6kHz 的「啪」)+三角波鼓身 */
  function snare(c,o,t,v,n){ nz(c,o,t,v,.17,'bandpass',2600,.6,.001,n); nz(c,o,t,v*.6,.07,'highpass',6000,.7,.001,n+3);
    const s=c.createOscillator(), g=c.createGain(); g.gain.value=0; s.type='triangle'; s.frequency.setValueAtTime(240,t); s.frequency.exponentialRampToValueAtTime(170,t+.06);
    g.gain.setValueAtTime(v*.5,t); g.gain.exponentialRampToValueAtTime(.0001,t+.09); s.connect(g); g.connect(o); s.start(t); s.stop(t+.1); }
  /* 雌:反拍的短鈸 */
  const hat=(c,o,t,v,n)=>nz(c,o,t,v,.045,'highpass',7800,.7,.001,n);
  function kit(c){ if(c._pk)return c._pk; const pw=duty=>{ const n=40, re=new Float32Array(n), im=new Float32Array(n); for(let k=1;k<n;k++){ re[k]=Math.sin(2*Math.PI*k*duty)/(Math.PI*k); im[k]=(1-Math.cos(2*Math.PI*k*duty))/(Math.PI*k); } return c.createPeriodicWave(re,im); };
    return c._pk={p25:pw(.25),p50:pw(.5)}; }
  /* 低音:連續長音。每小節一個音從頭撐到尾,小節之間交叉淡入淡出;經過音用滑音接過去(方波過低通+三角波低八度) */
  function bassBar(c,o,steps,t,len,v){ const s=c.createOscillator(), lp=c.createBiquadFilter(), g=c.createGain(), u=c.createOscillator(), ug=c.createGain(), x=.025;
    s.setPeriodicWave(kit(c).p50); lp.type='lowpass'; lp.frequency.value=900; lp.Q.value=.5; u.type='triangle';
    steps.forEach(([j,m],i)=>{ const tt=t+j*E8; if(i===0){ s.frequency.setValueAtTime(hz(m),tt-x); u.frequency.setValueAtTime(hz(m-12),tt-x); }
      else{ s.frequency.setTargetAtTime(hz(m),tt,.02); u.frequency.setTargetAtTime(hz(m-12),tt,.02); } });
    [[g,v],[ug,v*.9]].forEach(([G,V])=>{ G.gain.value=0; G.gain.setValueAtTime(0,t-x); G.gain.linearRampToValueAtTime(V,t+x); G.gain.setValueAtTime(V,t+len-x); G.gain.linearRampToValueAtTime(0,t+len+x); });
    if(c._wow){ c._wow.connect(s.detune); c._wow.connect(u.detune); }
    s.connect(lp); lp.connect(g); g.connect(o); u.connect(ug); ug.connect(o); s.start(t-x); s.stop(t+len+x+.01); u.start(t-x); u.stop(t+len+x+.01); }
  function bar(c,o,n,t,withBass){ for(let j=0;j<4;j++){ kick(c,o,t+j*2*E8,j%2?.42:.5,n*8+j); hat(c,o,t+(j*2+1)*E8,.05,n*8+j+4); if(j%2)snare(c,o,t+j*2*E8,.2,n*8+j); }  /* 動 雌 搭 雌 動 雌 搭 雌 */
    if(!withBass)return;
    for(let hh=0;hh<2;hh++){ const h=n*2+hh, i=h%PROG.length, r=PROG[i], nx=PROG[(i+1)%PROG.length], th=t+hh*4*E8;  /* 半小節=一個和弦 */
      const st=[[0,r]]; if(i===15)st.push([1,47],[2,49],[3,51]); else{ const ap=approach(r,nx); if(ap)st.push([3,ap]); }
      bassBar(c,o,st,th,4*E8,.045);
      const two=Math.floor(h/MELP.length)%2===1; MELP[h%MELP.length].forEach(([q,d,m])=>{ lead(c,o,hz(m),th+q*S16/2,d*S16/2,.07,d>=8,m); if(two)lead(c,o,hz(third(m)),th+q*S16/2,d*S16/2,.03,d>=8,third(m)); }); } }
  /* 開場=卡帶切歌聲(原創合成,結構依參考曲後段的切歌):喀 → 約 0.4 秒安靜 → 喀 → 約 0.5 秒安靜 → 音樂直接進來。
     「喀」=很短很亮的濾波雜訊(約 25ms 衰減到 10%,能量集中在 1.5–4kHz,另有一點 4kHz 以上),沒有音高、沒有低頻;不墊嘶聲 */
  function kclick(c,o,t,v){ nz(c,o,t,v,.09,'bandpass',2700,.9,.0008,101); nz(c,o,t,v*.45,.06,'highpass',4500,.7,.0008,202); nz(c,o,t+.006,v*.35,.05,'bandpass',3100,1.1,.0005,303); }  /* 固定取同一段雜訊:每一聲形狀一致 */
  /* 沙塵感(刻意做、比原本低):每秒約 6 下隨機細碎劈啪,4 秒一循環 */
  function dust(c,o,t0,v,t1){ if(!c._dust){ const sr=c.sampleRate, n=sr*4, b=c.createBuffer(1,n,sr), d=b.getChannelData(0); let sd=4242; const r=()=>{ sd=(sd*16807)%2147483647; return sd/2147483647; };
    for(let k=0;k<24;k++){ const i=Math.floor(r()*(n-8)), a=(.3+.7*r())*(r()<.5?-1:1); for(let j=0;j<6;j++)d[i+j]+=a*Math.pow(.45,j)*(j%2?-1:1); } c._dust=b; }  /* 內容固定,算一次 */
    const s=c.createBufferSource(), hp=c.createBiquadFilter(), g=c.createGain(); s.buffer=c._dust; s.loop=true; hp.type='highpass'; hp.frequency.value=1500; g.gain.value=v;
    s.connect(hp); hp.connect(g); g.connect(o); s.start(t0); if(o._loops)o._loops.push(s); if(t1){ g.gain.setValueAtTime(v,t1-.05); g.gain.linearRampToValueAtTime(0,t1); s.stop(t1+.01); } }
  /* 黑膠唱片感(音樂進來後):很細很密的小劈啪+偶爾較大的「啵」+極淡的唱盤表面雜音;8 秒一循環、不進殘響 */
  function vinyl(c,dst,t0,k){ k=k||.4;  /* k=劈啪密度倍率;定案用「更疏」0.4:小劈啪每秒約 18 下、啵約每四秒一下 */ c._vin=c._vin||{}; const b=c._vin[k]||(c._vin[k]=vinylBuf(c,k));
    const s=c.createBufferSource(), hp=c.createBiquadFilter(), lp=c.createBiquadFilter(), g=c.createGain(); s.buffer=b; s.loop=true;
    hp.type='highpass'; hp.frequency.value=500; lp.type='lowpass'; lp.frequency.value=8000; g.gain.value=0; g.gain.setValueAtTime(0,t0); g.gain.linearRampToValueAtTime(.12,t0+.6);
    s.connect(hp); hp.connect(lp); lp.connect(g); g.connect(dst); s.start(t0); if(dst._loops)dst._loops.push(s); }
  function vinylBuf(c,k){ const sr=c.sampleRate, n=sr*8, b=c.createBuffer(1,n,sr), d=b.getChannelData(0); let sd=90210; const r=()=>{ sd=(sd*16807)%2147483647; return sd/2147483647; };
    for(let i=0;i<n;i++)d[i]=(r()*2-1)*.012;                                                     /* 表面雜音 */
    for(let q=0;q<n/sr*45*k;q++){ const i=Math.floor(r()*(n-4)), a=Math.pow(r(),3)*.35*(r()<.5?-1:1); d[i]+=a; d[i+1]-=a*.5; }   /* 細密小劈啪 */
    for(let q=0;q<n/sr*.5*k;q++){ const i=Math.floor(r()*(n-200)), a=(.4+.6*r())*(r()<.5?-1:1); for(let j=0;j<160;j++)d[i+j]+=a*Math.exp(-j/18)*Math.cos(j*.35); }  /* 偶爾的啵 */
    return b; }
  /* 卡帶高頻嘶聲:開場就有,音樂進來後降低但一直墊著 */
  function hiss(c,o,t0,tm){ const s=c.createBufferSource(), f=c.createBiquadFilter(), g=c.createGain(); g.gain.value=0; s.buffer=noise(c); s.loop=true; f.type='highpass'; f.frequency.value=3500;
    g.gain.setValueAtTime(0,t0); g.gain.linearRampToValueAtTime(.05,t0+.08); g.gain.setValueAtTime(.05,tm); g.gain.linearRampToValueAtTime(.01,tm+1.5); s.connect(f); f.connect(g); g.connect(o); s.start(t0); if(o._loops)o._loops.push(s); }
  /* 開場:真實卡帶放入聲(Freesound "cassette.wav" by symphoid,CC0,不需標示)。音效檔已剪成兩段接在一起:
     0–3.6 秒=卡帶放進隨身聽再「喀」蓋上(原檔 4.15–7.75 秒);3.6–3.95 秒=按鍵的「喀」(原檔 14.55–14.90 秒),拿來當播放鍵
     節奏照參考曲切歌:放入 → 約 0.4 秒 → 播放鍵「喀」 → 約 0.5 秒 → 音樂;沒有音效檔時退回合成的喀聲 */
  function cassette(c,o,t0,buf){
    if(!buf){ const tm=t0+1.05; hiss(c,o,t0,tm); dust(c,o,t0,.035,tm); kclick(c,o,t0+.15,.28); kclick(c,o,t0+.55,.24); return tm; }
    let pk=0; for(let ch=0;ch<buf.numberOfChannels;ch++){ const d=buf.getChannelData(ch); for(let i=0;i<d.length;i++)pk=Math.max(pk,Math.abs(d[i])); }
    /* 放卡帶的小喀喀聲比最後蓋上那一下小 9–16dB:整段拉高約 10dB,再過限制器,最響那一下不超過音樂 */
    const lim=c.createDynamicsCompressor(); lim.threshold.value=-14; lim.knee.value=4; lim.ratio.value=20; lim.attack.value=.001; lim.release.value=.08; lim.connect(o);
    const G=.5/(pk||1)*3.2, play=(off,dur,t,v)=>{ const s=c.createBufferSource(), g=c.createGain(); s.buffer=buf; g.gain.value=v; s.connect(g); g.connect(lim); s.start(t,off,dur); };
    const tm=t0+4.85; hiss(c,o,t0,tm); dust(c,o,t0,.035,tm); play(0,3.6,t0,G); play(3.6,.35,t0+4.0,G*.85); return tm; }
  /* 整體空間:濾掉 250Hz 以下(大鼓、低音不糊)送進 2.4 秒的立體聲殘響 */
  function room(c,src,dst){ const hp=c.createBiquadFilter(), cv=c.createConvolver(), wet=c.createGain();
    if(!c._irRoom){ const sr=c.sampleRate, n=Math.floor(sr*2.4), ir=c.createBuffer(2,n,sr);  /* 同一個 AudioContext 只算一次 */
      for(let ch=0;ch<2;ch++){ const d=ir.getChannelData(ch); let sd=ch?991:557; for(let i=0;i<n;i++){ sd=(sd*16807)%2147483647; d[i]=(sd/2147483647*2-1)*Math.pow(1-i/n,2.6); } } c._irRoom=ir; }
    hp.type='highpass'; hp.frequency.value=250; cv.buffer=c._irRoom; wet.gain.value=.22; src.connect(hp); hp.connect(cv); cv.connect(wet); wet.connect(dst);
    src._kill=(src._kill||[]).concat([hp,cv,wet]); }
  const CAS='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TsyPEqHXtseSck82Gi33/3bEbGmkzMiqn2jnkm3qiPo2K5yrV/q/2fzX+v//+7+uMtjbAIAAKTguXqPQu1iNqLuW0u+FwaAAgJirifyNWzbW7Ukhji0lFuRHs9Cq+iAz3ay+l16o6qV1dUql0meKlVmToaS4hsIMfdx6nlEy7SXeP1PFBKKIvuAQ4QEMvY8eOcuwd0X+bXZuafcw8PuRsRU7s0eL9/QQnaNn9DVLopbm0AuRT1Km8jkbToEbKFGqTsbCydCaXLAe66OuOOFrW5G0C7CU/VATLdNsI62qax/IoDOCD5jHtDvV0h5k2WWiNPnFATSh4cc6//uEZGSAAsQwT+tJKlApYBk4AAAACtzBTeeYbOChgCUsAAAAnrJftsJA0N6ZS9apy/oXuCSgIBHAvUUcecpbEUJ6UrX2L6qdd+0A7LaLer10o37sYn+nkK8NbMrVFpVEVDBEae8mO0FYygjXHIfinequ7dWtDccjVBSmCyoKILnlQs4kZmapRdHd1dr1uEwIRyUbpep2zHqh1to/NyGPcSYCNdWlvv56+fCoB+NMWfpF+hJQygAA8clY1ilEZrRuU3RWK1y33fIKZpS/pX/7Po7WJVpd/rBCVrcsl2lTckSabaRSLoS0BmJSLmZO0ONPjOhQGWUTUkbyuHTvggDQEZFtI401hwPxzTcAsi4FsOk8iRI9xJ2oUqLdg+LUWd5SK+XtycX8J5HXTtjUryDEZ4zUonNxW3ado2bm72fDm5RN6zvcRxg6cbQMPt7x81tL//uEZHmAAq8yz/VgoAAjoAk4oAAAFAkbObmngAiCiSZzAiAASubbivncCl7YpfV723WbeL6+c7vjM96yOvP1r+1fCA3XOCAph7EEAAEAABB1zoQAgAB3/Mv/3r6tCHABoQMJTfZ1f//wmkPqAGgjDAtDQwwwgwgA0UQiJpPBOwMtIZwx4WeirCajg8IFELspaPJES0uK+iPUcR0kf/HcfLpkYkj/+cRLqRiXTL//cxUiiZL//+bF1FJEumQlPf+dAIcAQBQhAhAghBAAH6XiPzP6F/zP+XKn/mXX//d4b/aMER7/VEwK//nlCorVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uEZHIAAsk/z2ZJoAAnBQkowIgAAAABpBwAACAAADSDgAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV';  /* 卡帶錄音(CC0)剪好的兩段,MP3 */
  function sample(c){ if(c._casP)return c._casP; let u; try{ const bin=atob(CAS); u=new Uint8Array(bin.length); for(let i=0;i<bin.length;i++)u[i]=bin.charCodeAt(i); }catch(e){ return c._casP=Promise.resolve(null); }
    return c._casP=new Promise(res=>{ try{ const p=c.decodeAudioData(u.buffer,b=>res(b),()=>res(null)); if(p&&p.catch)p.catch(()=>res(null)); }catch(e){ res(null); } }); }
  /* 先把旋律會用到的撥弦音(含低三度和聲)算好,避免播放中卡頓 */
  function prep(c){ const ms=[]; MELP.forEach(b=>b.forEach(([q,d,m])=>{ ms.push(m,third(m)); })); let i=0; const step=()=>{ const t=performance.now(); while(i<ms.length&&performance.now()-t<8)ksBuf(c,ms[i++]); if(i<ms.length)setTimeout(step,16); }; step(); }  /* 分批算,每段最多 8ms */
  function bus(c){ const m=c.createGain(), o=c.createGain(), pc=c.createConstantSource(), pw=c.createGain(); m.gain.value=.6; m.connect(c.destination); o.connect(m); room(c,o,m); o._loops=m._loops=[];
    pc.offset.value=0; pc.connect(pw); pc.start(); return {m,o,pc,pw}; }  /* .6:比音效小聲;pc=音高(音分),停帶時往下拉 */
  const peak=b=>{ if(b._pk)return b._pk; let p=0; for(let ch=0;ch<b.numberOfChannels;ch++){ const d=b.getChannelData(ch); for(let i=0;i<d.length;i++)p=Math.max(p,Math.abs(d[i])); } return b._pk=p||1; };
  /* 按鍵「喀」單獨播一聲(結局轉場用):卡帶錄音的第二段,音量同開場 */
  function click(c,buf,t){ const dst=c.createGain(); dst.gain.value=.6; dst.connect(c.destination); if(!buf){ kclick(c,dst,t,.28); return; }
    const lim=c.createDynamicsCompressor(); lim.threshold.value=-14; lim.knee.value=4; lim.ratio.value=20; lim.attack.value=.001; lim.release.value=.08; lim.connect(dst);
    const s=c.createBufferSource(), g=c.createGain(); s.buffer=buf; g.gain.value=.5/peak(buf)*3.2*.85; s.connect(g); g.connect(lim); s.start(t,3.6,.35); }
  /* 試聽/測試:開場+前奏 1 小節+16 小節 */
  async function render(sr){ const nb=17, oc=new OfflineAudioContext(2,Math.ceil((nb*8*E8+8)*sr),sr), B=bus(oc), buf=await sample(oc);
    const tm=cassette(oc,B.o,.05,buf); vinyl(oc,B.m,tm); for(let i=0;i<nb;i++)bar(oc,B.o,i-1,tm+i*8*E8,i>=1); return oc.startRendering(); }
  return {L:8*E8,bus,bar,cassette,vinyl,sample,prep,render,click}; })();
  let A=null, P=null, on=false, tmr=0, n=0, tNext=0;
  /* 拆掉整條匯流排:回音迴圈、殘響、主音量、音高控制(不拆的話回音迴圈會一直留在記憶體) */
  function killBus(B){ try{ (B.o._kill||[]).forEach(x=>{ try{ x.disconnect(); }catch(e){} }); B.o.disconnect(); B.m.disconnect(); B.pc.stop(); B.pc.disconnect(); }catch(e){} }
  /* 排程:落後太多(分頁被丟到背景、主執行緒卡住)時直接跳到現在的小節,不要一口氣把錯過的幾十小節全部排進去(那會一次建上千個節點而當掉) */
  function pump(){ if(!on||!A||!P)return; const L=PLAY.L;
    if(tNext<A.currentTime-.1){ const k=Math.ceil((A.currentTime+.05-tNext)/L); n+=k; tNext+=k*L; }
    let c=0; while(tNext<A.currentTime+.6&&c<3){ PLAY.bar(A,P.o,n,tNext,n>=0); n++; tNext+=L; c++; } }
  function start(){ if(on||ENDM.on)return; A=ac(); if(!A)return; on=true; const my=P=PLAY.bus(A); A._wow=my.pw;
    PLAY.sample(A).then(buf=>{ if(!on||P!==my)return; const t0=A.currentTime+.08, tm=PLAY.cassette(A,my.o,t0,buf); PLAY.vinyl(A,my.m,tm);
      n=-1; tNext=tm; setTimeout(()=>{ try{ PLAY.prep(A); }catch(e){} },30); pump(); tmr=setInterval(pump,40); }); }  /* 卡帶開場後只留 1 小節沒有旋律的鼓 */
  function stop(){ if(!on)return; on=false; clearInterval(tmr); const B=P; P=null; if(!B||!A)return; const t=A.currentTime;
    B.m.gain.cancelScheduledValues(t); B.m.gain.setValueAtTime(B.m.gain.value,t); B.m.gain.linearRampToValueAtTime(0,t+.4);
    (B.m._loops||[]).forEach(x=>{ try{ x.stop(t+.5); }catch(e){} }); setTimeout(()=>killBus(B),700); }
  /* 結局轉場(約 1 秒):行進曲像按下停止鍵,0.5 秒內音高與音量一起往下拖到停 → 停止鍵「喀」 → 0.25 秒 → 播放鍵「喀」 → 結局配樂(吉他直接進來) */
  function toEnd(){ if(ENDM.on)return; A=A||ac(); if(!A)return;
    if(!on||!P){ on=false; ENDM.start({skip:true}); return; }
    const B=P, t=A.currentTime; on=false; clearInterval(tmr); P=null; A._wow=null;
    B.pc.offset.cancelScheduledValues(t); B.pc.offset.setValueAtTime(0,t); B.pc.offset.linearRampToValueAtTime(-1500,t+.5);
    B.m.gain.cancelScheduledValues(t); B.m.gain.setValueAtTime(B.m.gain.value,t); B.m.gain.linearRampToValueAtTime(0,t+.5);
    (B.m._loops||[]).forEach(x=>{ try{ x.stop(t+.55); }catch(e){} }); setTimeout(()=>killBus(B),900);
    PLAY.sample(A).then(buf=>{ const k=Math.max(t+.5,A.currentTime+.02); PLAY.click(A,buf,k); PLAY.click(A,buf,k+.25); ENDM.start({skip:true,at:k+.3}); }); }
  /* 轉場試聽:行進曲 4 小節半 → 轉場 → 結局配樂 5 小節 */
  async function demoEnd(sr){ const oc=new OfflineAudioContext(2,sr*40,sr), B=PLAY.bus(oc), buf=await PLAY.sample(oc); oc._wow=B.pw; PLAY.vinyl(oc,B.m,.05);
    for(let i=0;i<5;i++)PLAY.bar(oc,B.o,i,.05+i*PLAY.L,true); const t=.05+4.5*PLAY.L;
    B.pc.offset.setValueAtTime(0,t); B.pc.offset.linearRampToValueAtTime(-1500,t+.5); B.m.gain.setValueAtTime(.6,t); B.m.gain.linearRampToValueAtTime(0,t+.5);
    PLAY.click(oc,buf,t+.5); PLAY.click(oc,buf,t+.75); const EB=ENDM.bus(oc,oc.destination); ENDM.bed(oc,EB.sand,t+.8); EB.m.gain.setValueAtTime(0,t+.8); EB.m.gain.linearRampToValueAtTime(.6,t+1.2);
    for(let i=0;i<5;i++)ENDM.bar(oc,EB,i,t+.8+i*16*ENDM.ST); return oc.startRendering(); }
  return {start,stop,toEnd,demoEnd,get on(){ return on||ENDM.on; },PLAY,ENDM}; })();
function bgmSync(){ const a=$('tg-bgm'), b=$('btn-bgm'); if(a)a.textContent='音樂:'+(pref.bgm?'開':'關'); if(b)b.classList.toggle('off',!pref.bgm); }
function bgmToggle(){ pref.bgm=!pref.bgm; save(); bgmSync(); if(!pref.bgm){ BGM.stop(); ENDM.stop(); } else if(ending)BGM.toEnd(); else BGM.start(); }

/* =====================================================================
   場景:低解析度、陰天與暮色、霧、電線桿與烏鴉
   ===================================================================== */
const SC={cv:null,ctx:null,W:180,H:40,gy:32,scale:3,bg:null,bgKey:'',from:null,to:null,tStart:0,
  sx:-16,tx:50,walkUntil:0,jumpAt:0,jumpH:0,parts:[],bubble:null,moodTmp:null,moodUntil:0,key:'hs',tod:'morn',lastHeart:0,lastFw:0,phase:0,
  crow:null,nextCrow:0,blood:false,tearUntil:0,tone:.5};
let ending=null, grad=false, firstYear=true;
/* 結局場景表(使用者逐一指定)。顏色(tone)只管氣氛(表情、標題色、彩帶),不再決定場景。
   s:場景 key;alma=母校校景;job=任教那一級的校景(兩款的照入學規則由種子固定;沒有專任教職時:紅→雨夜城市、其他→夕陽城市)
   tod:時段;fw:煙火;rain:大雨。原本金色的「白色單屋」(end-gold)不再使用(使用者:金可能要重畫)。 */
const END_SCENES={
 '文化評論家':{s:'end-info',fw:1},'自媒體創作者':{s:'end-info',fw:1},'政治幕僚':{s:'end-rally'},'高考文官':{s:'end-info',fw:1},
 '藝文工作者':{s:'end-live'},'繼承家業':{s:'end-info',fw:1},'享受人生':{s:'end-info',fw:1},
 '補教業名師':{s:'end-talk'},'企業行銷企劃':{s:'end-info'},'NGO 倡議工作者':{s:'end-info'},'接案文字工作者':{s:'end-good'},
 '大學系辦助理':{s:'alma',tod:'dusk'},'研究助理':{s:'alma',tod:'dusk'},'兼任研究助理':{s:'alma',tod:'night',rain:1},
 '少年股神':{s:'end-info'},'轉職科技業':{s:'end-info'},'服務業':{s:'end-bad'},'保險與直銷':{s:'end-bad'},'派遣行政':{s:'end-bad'},'人社系484有毒':{s:'end-bad'},
 '學科台柱':{s:'end-stage'},'學派':{s:'end-stage'},'那一本書':{s:'end-book'},
 '穩健的一生':{s:'job',tod:'dusk'},'行政人生':{s:'job',tod:'dusk'},'一份工作':{s:'job',tod:'dusk'},
 '網紅教授':{s:'end-talk'},'研討會動物':{s:'end-conf'},'沒有人讀':{s:'job',tod:'night',rain:1},'流浪':{s:'end-bad'}};
const SCENE_TOD={'end-info':'dusk','end-good':'dusk','end-bad':'night','end-stage':'night','end-rally':'night','end-live':'night','end-book':'night','end-talk':'night','end-conf':'day'};
/* 室內結局場景:底色;不畫天空,也不算戶外(不疊霧、星星、烏鴉) */
const INDOOR={'end-stage':'#120a16','end-rally':'#0b0810','end-live':'#140d09','end-book':'#120a16','end-talk':'#05060a','end-conf':'#1a1410'};
/* 網紅教授的電腦螢幕:16:9、置中(paintBg 與 frame 共用) */
function talkGeo(W){ const sw=46, cx=Math.max(27,Math.min(W>>1,W-112)); return {cx,sx0:cx-(sw>>1),sw,top:3,sh:26}; }  /* 窄螢幕往左挪,避開右上角按鈕(約 85px) */
const JOB_TIER={'帝大霸權 教職':'emp','頂大系統 教職':'top','國立大學 教職':'nat','私校聯盟 教職':'priv'};
function endScene(tone,title,subs){
  const e=END_SCENES[title]||{s:tone==='bad'?'end-bad':tone==='good'?'end-good':'end-info',fw:tone==='gold'};
  let tier=null;
  if(e.s==='alma')tier=(S&&S.tier)||'nat';
  else if(e.s==='job'){ tier=JOB_TIER[(subs||[]).find(x=>JOB_TIER[x])]||null; if(!tier)return tone==='bad'?{scene:'end-bad',tod:'night'}:{scene:'end-info',tod:'dusk'}; }
  if(tier)return {scene:'uni-'+tier,tod:e.tod||'dusk',altTier:tier,fw:!!e.fw,rain:!!e.rain};
  return {scene:e.s,tod:e.tod||SCENE_TOD[e.s]||'dusk',fw:!!e.fw}; }
function sceneKey(){ if(!S)return 'hs'; if(ending)return ending.scene||'end-'+ending.tone; if(S.lostYear)return 'lost'; if(S.grade<3)return 'hs'; return 'uni-'+(S.tier||'nat'); }
function sceneTod(){ if(ending)return ending.tod||{gold:'night',bad:'night',satire:'night',good:'dusk',info:'dusk'}[ending.tone]||'dusk'; if(grad)return 'day'; return ['morn','day','dusk'][SC.phase]||'day'; }
function curOutfit(){ if(!S)return 'uniform'; if(ending)return ending.outfit; if(grad)return 'gown'; if(S.lostYear)return 'pajama'; if(S.grade<3)return 'uniform'; if(S.tier==='intl')return 'coat'; return 'hoodie'; }
function curMood(noTmp){ const now=performance.now();
  if(!noTmp&&SC.moodTmp&&now<SC.moodUntil)return SC.moodTmp;
  if(!S)return 'neutral';
  if(ending)return ending.tone==='bad'?'tired':(ending.tone==='gold'||ending.tone==='good')?'happy':'neutral';
  if(S.dep)return 'tired'; if(S.ab.cf<22)return 'sad'; if(S.ab.cf>=50||(S.rel&&S.rel.kind==='stable'))return 'happy'; return 'neutral'; }
const FACE_OUT={hoodie:'casual',uniform:'uniform',coat:'coat',gown:'gown',pajama:'pajama',suit:'suit',work:'work'};
function faceState(noTmp){ const now=performance.now();
  if(!S){ const g=STG[lookStage]; return {outfit:g.f,age:g.age,mood:'neutral'}; }
  const st={outfit:FACE_OUT[curOutfit()]||'casual',mood:curMood(noTmp),age:S.age};
  if(S.dep)st.bags=2; else if(S.stress>=2)st.bags=1;
  if(S.stress>=3)st.sweat=2; else if(S.stress>=2)st.sweat=1;
  if(!noTmp&&now<SC.tearUntil)st.tear=1;
  if(SC.blood)st.blood=1;
  return st; }

const SKY={morn:['#2a323d','#48505a','#6b6d6c'],day:['#37404a','#565f67','#787e81'],dusk:['#10131e','#382a36','#874b32'],
  night:['#03050a','#09101a','#131b26'],rain:['#1c2127','#2e343b','#454b51']};
function paintBg(key,tod,alt){
  const W=SC.W,H=SC.H,gy=SC.gy, cv=newCanvas(W,H), c=cv.getContext('2d');
  const R=(x,y,w,h,col)=>{ c.fillStyle=col; c.fillRect(x|0,y|0,w|0,h|0); };
  const night=tod==='night', dusk=tod==='dusk';
  /* 信心連動:tone 0=低信心(偏灰、偏暗)、0.5=原色調、1=高信心(偏暖、偏亮) */
  const td=(SC.tone==null?.5:SC.tone)-.5, TN=c=>td<0?dk(mix(c,'#5b6064',-td*.55),1+td*.34):mix(mix(c,'#e2b272',td*.2),'#f4efe4',td*.08);
  const D=col=>TN(night?mix(dk(col,.34),'#0d1520',.35):dusk?mix(dk(col,.55),'#2a1f2c',.25):mix(col,'#646a70',.28));
  const lit=night||dusk;
  const hash=i=>{ const v=Math.sin(i*127.1+key.length*31.7)*43758.5453; return v-Math.floor(v); };
  function sky(cols){ for(let y=0;y<gy;y++){ const t=y/(gy-1)*2, s=Math.min(1,Math.floor(t)), f=t-s; for(let x=0;x<W;x++)R(x,y,1,1,bay(x,y)<f?cols[s+1]:cols[s]); } }
  function circle(cx,cy,r,col){ for(let y=-r;y<=r;y++)for(let x=-r;x<=r;x++)if(x*x+y*y<=r*r+r*.6)R(cx+x,cy+y,1,1,col); }
  function stars(){ for(let i=0;i<34;i++){ const x=hash(i)*W|0,y=hash(i+99)*(gy-10)|0; R(x,y,1,1,i%6?'#5d6578':'#bdb8aa'); } }
  function hills(col,base,amp,fr,ph){ for(let x=0;x<W;x++){ const h=base-Math.round((Math.sin(x*fr+ph)*.6+Math.sin(x*fr*2.3+ph*1.7)*.4+1)*amp/2); R(x,h,1,gy-h,col); } }
  function box(x,y,w,h,fill,ol){ R(x,y,w,h,ol); R(x+1,y+1,w-2,h-2,fill); }
  function windows(x,y,w,h,{cols,rows,ww=2,wh=2,col}){ const gx=(w-cols*ww)/(cols+1), gyy=(h-rows*wh)/(rows+1);
    for(let r=0;r<rows;r++)for(let i=0;i<cols;i++){ const lx=x+gx*(i+1)+ww*i, ly=y+gyy*(r+1)+wh*r; const on=lit&&hash(r*31+i*7+x)>(night?.55:.7); R(lx,ly,ww,wh,on?th().win:col); } }
  function tree(x,col,bare){ col=D(col||'#2f3d2c'); const ol=dk(col,.6);
    R(x,gy-4,1,4,D('#3a2a20'));
    if(bare){ for(const [dx,dy] of [[-1,-5],[-2,-6],[-3,-7],[1,-5],[2,-7],[3,-8],[0,-6],[0,-8],[-1,-9],[1,-9],[-4,-8],[4,-9]])R(x+dx,gy+dy,1,1,D('#3a2a20')); return; }
    for(const [dx,dy,w] of [[-2,-10,5],[-3,-9,7],[-4,-8,9],[-4,-7,9],[-4,-6,9],[-3,-5,7]])R(x+dx,gy+dy,w,1,col);
    R(x-2,gy-11,5,1,ol); R(x-4,gy-9,1,4,ol); R(x+4,gy-9,1,4,ol); R(x-3,gy-4,7,1,ol); }
  function palm(x){ const tr=D('#4a3a2a'), lf=D('#2c3a2c'); for(let i=0;i<12;i++)R(x+(i>8?1:0),gy-1-i,1,1,tr);
    const tx=x+1,ty=gy-13; for(let i=1;i<=5;i++){ R(tx-i,ty+(i>2?i-2:0),1,1,lf); R(tx+i,ty+(i>2?i-2:0),1,1,lf); } R(tx-1,ty-1,3,1,lf); R(tx,ty-2,1,1,lf); }
  function pole(x,h){ const col=night?'#0a0d12':dusk?'#16131a':'#262a2f'; R(x,gy-h,1,h,col); R(x-3,gy-h+2,7,1,col); R(x-2,gy-h+4,5,1,col); return [x,gy-h+2]; }
  function wires(pts){ const col=night?'#0a0d12':dusk?'#16131a':'#22262b';
    for(let i=0;i<pts.length-1;i++){ const [x0,y0]=pts[i],[x1,y1]=pts[i+1]; for(let x=x0;x<=x1;x++){ const t=(x-x0)/(x1-x0||1); for(const off of [-3,0,3]){ R(x,y0+off*.3+Math.sin(t*Math.PI)*3,1,1,col); } } } }
  function crowsOn(pts,n){ for(let k=0;k<n;k++){ const i=Math.floor(hash(k+40)*(pts.length-1)); const [x0,y0]=pts[i],[x1]=pts[i+1]; const t=.2+hash(k+50)*.6, x=x0+(x1-x0)*t|0, y=y0+Math.sin(t*Math.PI)*3-2|0;
      R(x,y,2,2,'#08090b'); R(x+2,y,1,1,'#08090b'); R(x-1,y+1,1,1,'#08090b'); } }
  function ground(top,body){ R(0,gy,W,H-gy,D(body)); R(0,gy,W,1,D(top)); R(0,gy+1,W,1,D(dk(top,.85))); }
  const rainy=key==='uni-intl'||key==='end-bad'||(key==='uni-top'&&alt===1)||!!(ending&&ending.rain&&ending.scene===key);  /* 政大:陰天+毛毛雨;結局「沒有人讀」:校景下大雨 */
  /* 大學建築(依實景照片):共用小工具 */
  function tex(x,y,w,h,c1,c2,t){ for(let j=y;j<y+h;j++)for(let i=x;i<x+w;i++)R(i,j,1,1,bay(i,j)<t?c2:c1); }
  function roof(cx,y0,hws,cL,cR,cD,ol,tips){ const n=hws.length, yb=y0+n-1, hb=hws[n-1];
    for(let i=0;i<n;i++){ const hw=hws[i]+1; R(cx-hw,y0+i-1,2*hw+1,2,ol); }
    if(tips){ R(cx-hb-2,yb-2,2,2,ol); R(cx+hb+1,yb-2,2,2,ol); }
    for(let i=0;i<n;i++){ const y=y0+i, hw=hws[i]; for(let x=cx-hw;x<=cx+hw;x++)R(x,y,1,1,i>0&&x!==cx&&(x-cx)%2===0?cD:(x<cx?cL:cR)); }
    if(tips){ R(cx-hb-1,yb-1,1,1,cL); R(cx+hb+1,yb-1,1,1,cR); } }
  function palm2(x,h){ const tr=D('#57534b'), cs=D('#4b5a3b'), lf=D('#26352a'), hi=D('#3b4f38'), t=gy-h;
    R(x,t,1,h,tr); R(x,t+1,1,2,cs);
    for(const [dx,dy,c] of [[0,-3],[2,-2],[0,-2],[1,-1],[0,-1],[1,0,1],[2,0,1],[3,0],[4,0],[4,1],[5,1],[6,2],[6,3],[1,1],[2,1,1],[3,2],[3,3],[2,-1,1]]){ R(x+dx,t+dy,1,1,c?hi:lf); R(x-dx,t+dy,1,1,c?hi:lf); } }
  function bush(x,w){ const c=D('#2b3c29'), hi=D('#3a5034'), ol=D('#18221a'), hw=[w-2,w-1,w,w,w];
    R(x-hw[0],gy-6,2*hw[0]+1,1,ol);
    for(let i=0;i<5;i++)R(x-hw[i]-1,gy-5+i,2*hw[i]+3,1,ol);
    for(let i=0;i<5;i++)for(let xx=x-hw[i];xx<=x+hw[i];xx++)R(xx,gy-5+i,1,1,bay(xx,gy-5+i)<.22?hi:c); }
  /* 帝大:台大總圖(紅磚、白色山牆拱窗、兩側塔、一樓三拱、椰林) */
  function bNTU(){ const cx=Math.max(41,Math.min(W-41,W*0.6|0));
    const BR=D('#a86c42'),BD=D('#8c5636'),WH=D('#d4cfc2'),WD=D('#a6a194'),RF=D('#4c5158'),GL=D('#283038'),OP=D('#1b1613'),OL=D('#24130f');
    const win=(x,y,w,h)=>R(x,y,w,h,lit&&hash(x*7+y*13)>.5?th().win:GL);
    for(const p of [4,16,W-5,W-17])if(p<cx-41||p>cx+41)palm2(p,22+p%3);
    for(const s of [-1,1]){
      const wx=s<0?cx-39:cx+28;
      R(wx+2,9,8,1,OL); R(wx+1,10,10,2,RF);
      box(wx,12,12,gy-12,BR,OL); tex(wx+1,13,10,gy-14,BR,BD,.12); R(wx+1,13,10,1,WH);
      for(let r=0;r<3;r++)for(let i=0;i<3;i++)win(wx+2+i*3,15+r*4,2,2);
      R(wx+1,27,10,1,WD); for(let i=0;i<3;i++)win(wx+2+i*3,29,2,2);
      const tx=s<0?cx-28:cx+19;
      box(tx,7,10,gy-7,BR,OL); tex(tx+1,8,8,gy-9,BR,BD,.12);
      R(tx-1,6,12,1,OL); R(tx,7,10,1,WH); R(tx+1,8,8,1,WH);
      R(tx+2,10,6,4,WH); win(tx+3,11,4,2);
      R(tx+3,15,4,10,WH); for(let y=16;y<24;y+=3)win(tx+4,y,2,2);
      R(tx+3,26,4,1,WH); R(tx+2,27,6,gy-27,WH); R(tx+4,27,2,1,OP); R(tx+3,28,4,gy-28,OP);
      const px=s<0?cx-19:cx+15;
      box(px,11,5,gy-11,WH,OL); for(let y=13;y<25;y+=3)win(px+2,y,1,2); }
    box(cx-15,9,31,gy-9,BR,OL); tex(cx-14,10,29,gy-11,BR,BD,.12);
    const ghw=y=>Math.round((y-3)*14/6);
    for(let y=3;y<=9;y++){ const h=ghw(y); R(cx-h-1,y-1,2*h+3,2,OL); }
    for(let y=3;y<=9;y++){ const h=ghw(y), p=y>3?ghw(y-1):-1; tex(cx-h,y,2*h+1,1,BR,BD,.12); R(cx-h,y,h-p,1,WH); R(cx+p+1,y,h-p,1,WH); }
    R(cx-1,5,3,1,WH); R(cx-2,6,5,1,WH); R(cx-1,7,3,1,WH); R(cx-1,6,3,1,GL);
    for(let y=10;y<=13;y++){ const h=[1,4,7,9][y-10]; R(cx-h-1,y-1,2*h+3,1,WD); R(cx-h,y,2*h+1,1,WH); }
    R(cx-9,14,19,10,WH); R(cx+9,13,1,11,WD);
    const aw=lit?th().win:GL; R(cx-2,13,5,1,aw); R(cx-4,14,9,1,aw); R(cx-5,15,11,8,aw);
    for(const dx of [-3,0,3])R(cx+dx,14,1,9,WD); R(cx-5,18,11,1,WD);
    R(cx-10,23,21,1,WH); R(cx-10,24,21,1,WD); for(let i=-6;i<=6;i+=2)R(cx+i,24,1,1,WH);
    for(const dx of [-8,0,8]){ const c=cx+dx; R(c-2,25,5,1,WH); R(c-3,26,7,gy-26,WH); R(c-1,26,3,1,OP); R(c-2,27,5,gy-27,OP); }
    bush(cx-33,5); bush(cx+33,5);
    ground('#3c5132','#33452b'); R(cx-12,gy,25,1,D('#8f8a7f')); R(cx-14,gy+1,29,1,D('#77736a')); }
  /* 私校:文化大學(山上、綠琉璃瓦宮殿、中間金色攢尖頂) */
  function bPCCU(){ const cx=Math.max(44,Math.min(W-45,W*0.55|0));
    const GO=D('#d1a03c'),GL=D('#b5862c'),GD=D('#94701f'),GH=D('#e6c46a');
    const TE=D('#5f8c6b'),TL=D('#527a5c'),TD=D('#3f6249');
    const RD=D('#9e3a2b'),WH=D('#d6d1c4'),GS=D('#6f7d84'),OL=D('#1d221e');
    const far=D('#56706a'), mA=D('#365532'), mB=D('#3c5a40'), mH=D('#456741'), mS=D('#2a4426');
    for(let x=0;x<W;x++){ const h=Math.round(gy-15-5*Math.sin(x*.07+1)-3*Math.sin(x*.17+2)); R(x,h,1,gy-h,far); }
    const g=(x,mx,s,ht)=>{ const t=(x-mx)/s; return ht*Math.exp(-t*t); };
    for(let x=0;x<W;x++){ const a=g(x,cx+W*0.2,W*0.3,27), b=g(x,W*0.1,W*0.18,17), h=Math.round(gy-2-Math.max(a,b));
      for(let y=h;y<gy;y++){ const v=bay(x,y); R(x,y,1,1,v<.16?mH:v>.92?mS:(a>=b?mA:mB)); } }
    const wall=(x0,x1,y0,y1,st)=>{ R(x0,y0,x1-x0+1,y1-y0+1,WH); for(let x=x0;x<=x1;x+=st)R(x,y0,1,y1-y0+1,RD);
      for(let x=x0+1;x<x1;x+=st)for(let y=y0+1;y<y1;y+=3)R(x,y,st-1,2,lit&&hash(x*13+y)>.55?th().win:GS); };
    const pav=(x,top,w)=>{ roof(x,top,[w-8,w-6,w-4,w-2,w-1,w],TL,TE,TD,OL,true);
      R(x-w+7,top-2,1,1,OL); R(x+w-7,top-2,1,1,OL);
      R(x-w+1,top+6,2*w-1,1,RD); wall(x-w+2,x+w-2,top+7,gy-1,3);
      const ym=top+13; if(ym<gy-4){ roof(x,ym,[w-1,w],TL,TE,TD,OL,true); R(x-w+1,ym+2,2*w-1,1,RD); } };
    pav(cx-30,11,12); pav(cx+31,12,12);
    roof(cx,4,[0,1,2,3,4,6,8,10,12,14,15],GL,GO,GD,OL,true); for(let y=5;y<15;y++)R(cx,y,1,1,GH);
    R(cx,0,1,1,GH); R(cx-1,1,3,2,GO); R(cx,1,1,1,GH); R(cx,3,1,1,GD);
    R(cx-14,15,29,1,RD); wall(cx-12,cx+12,16,21,4);
    roof(cx,22,[14,16],TL,TE,TD,OL,true); R(cx-15,24,31,1,RD); wall(cx-13,cx+13,25,gy-1,3);
    const fx=cx-14; roof(fx,19,[3,5,7,9,11,13,15,16],TL,TE,TD,OL,true); R(fx-4,17,1,1,OL); R(fx+4,17,1,1,OL);
    R(fx-15,27,31,1,RD); wall(fx-14,fx+14,28,gy-1,3);
    const can=(x,r)=>{ circle(x,gy-1,r+1,D('#1b2a1a')); for(let y=-r;y<=r;y++)for(let xx=-r;xx<=r;xx++)if(xx*xx+y*y<=r*r+r*.6){ const X=x+xx,Y=gy-1+y; R(X,Y,1,1,bay(X,Y)<.2?D('#40603a'):D('#2b4228')); } };
    can(3,7); can(W-4,6); can(cx-38,5);
    ground('#34472e','#2c3b27'); }
  function canopy(x,r){ const c=D('#2b4228'), hi=D('#40603a'); circle(x,gy-1,r+1,D('#1b2a1a'));
    for(let y=-r;y<=r;y++)for(let xx=-r;xx<=r;xx++)if(xx*xx+y*y<=r*r+r*.6){ const X=x+xx,Y=gy-1+y; R(X,Y,1,1,bay(X,Y)<.2?hi:c); } }
  function pmap(x0,y0,rows,col,ol){ rows.forEach((r,j)=>{ for(let i=0;i<r.length;i++)if(r[i]!=='.')R(x0+i-1,y0+j-1,3,3,ol); });
    rows.forEach((r,j)=>{ for(let i=0;i<r.length;i++)if(r[i]!=='.')R(x0+i,y0+j,1,1,col(r[i],i,j)); }); }
  /* 頂大 A:清大人社院(清水混凝土、粉紅牆、斗拱頂高塔、退縮量體) */
  function bNTHU(){ const cx=Math.max(36,Math.min(W-32,W*0.55|0));
    const CL=D('#a39e94'),CM=D('#8c877e'),CD=D('#66625b'),PK=D('#b98577'),PD=D('#9c6c5f'),GL=D('#2b3138'),OL=D('#23211e');
    const win=(x,y,w,h)=>R(x,y,w,h,lit&&hash(x*7+y*13)>.55?th().win:GL);
    const ribbon=(x0,x1,y)=>{ for(let x=x0;x+2<=x1;x+=4)win(x,y,3,2); };
    box(cx+12,24,19,gy-24,CM,OL); R(cx+11,23,21,2,CL); R(cx+12,25,19,1,CD); ribbon(cx+14,cx+29,27);
    const tx=cx+3, tc=tx+3;
    box(tx,5,7,gy-5,CL,OL); R(tx+5,6,1,gy-7,CM); R(tx+1,15,4,gy-16,PK); R(tx+5,15,1,gy-16,PD);
    R(tx+1,6,5,2,GL); R(tc,6,1,2,CL); R(tx+1,8,5,1,CD);
    for(const y of [10,12])R(tc,y,1,1,GL); for(const y of [16,18,20])R(tc,y,1,1,D('#5a3a34'));
    pmap(tc-5,0,['.....a.....','....aab....','...aaabb...','aaaaaabbbbb','a.aaaabbb.b','...aaab....'],ch=>ch==='a'?CL:CM,OL);
    const M0=cx-6, M1=cx+12;
    box(M0,22,M1-M0+1,gy-22,CM,OL); R(M0-1,21,M1-M0+3,2,CL); R(M0,23,M1-M0+1,1,CD);
    for(let x=M0+2;x<M1-1;x+=3){ win(x,25,2,2); win(x,28,2,2); }
    const L0=cx-34, L1=cx-6;
    box(L0,14,L1-L0+1,gy-14,CM,OL);
    R(L0-2,11,L1-L0+5,1,OL); R(L0-2,12,L1-L0+5,2,CL); R(L0-1,14,L1-L0+3,1,CD);
    R(L0+1,15,L1-L0-1,5,PK); R(L0+1,19,L1-L0-1,1,PD); R(L1-1,15,1,5,PD);
    for(const y of [21,25,28])ribbon(L0+2,L1-2,y);
    for(let x=L0+1;x<L1;x+=9)R(x,20,1,gy-21,CL);
    canopy(L0+3,6); canopy(cx+35,4); canopy(W-5,5);
    ground('#34452f','#3b3f3a'); }
  /* 頂大 B:政大社科院(雙塔、方格窗、頂部門形缺口、中間玻璃中庭、操場) */
  function bNCCU(){ const cx=Math.max(38,Math.min(W-37,W*0.57|0));
    const MV=D('#b3a6a3'),MS=D('#988c89'),ML=D('#c4b9b5'),WN=D('#3d3b41'),GS=D('#29313b'),GH=D('#45515d'),DK=D('#262a30'),OL=D('#29242a');
    const win=(x,y,w,h)=>R(x,y,w,h,lit&&hash(x*7+y*13)>.6?th().win:WN);
    R(cx-10,17,13,1,OL); R(cx-9,18,11,gy-18,GS); for(let x=cx-8;x<cx+2;x+=3)R(x,18,1,gy-18,GH);
    for(let i=0;i<15;i++){ R(cx-12+i,14+(i/5|0),1,2,DK); }
    const L0=cx-37, L1=cx-11;
    box(L0,2,L1-L0+1,gy-2,MV,OL); R(L1-1,3,1,gy-4,MS);
    for(let x=L0+2;x<L1-2;x+=3)R(x,3,1,1,WN);
    for(let y=6;y<gy-2;y+=2)for(let x=L0+2;x<L1-2;x+=3)win(x,y,2,1);
    box(cx+27,5,10,gy-5,MV,OL); R(cx+35,6,1,gy-7,MS);
    for(let y=10;y<gy-2;y+=2){ win(cx+29,y,1,1); win(cx+32,y,1,1); }
    box(cx+3,8,7,gy-8,MV,OL); for(let y=11;y<gy-2;y+=2)win(cx+6,y,1,1);
    box(cx+3,5,34,4,ML,OL); R(cx+4,7,32,1,MS);
    R(cx+15,12,6,2,D('#5d6a73')); R(cx+16,11,4,1,D('#5d6a73'));
    box(cx+9,14,19,gy-14,ML,OL); for(let y=16;y<gy-1;y+=2)for(let x=cx+10;x<cx+27;x+=4)win(x,y,Math.min(4,cx+27-x),1);
    const gp=D('#d4d8da'), gx=cx-17; R(gx,gy-13,1,13,gp); R(gx+6,gy-13,1,13,gp); R(gx,gy-5,7,1,gp);
    canopy(cx+41,3); canopy(L0-3,3);
    ground('#3f5a33','#3a5230'); R(0,gy+5,W,H-gy-5,D('#7b4c3e')); R(0,gy+6,W,1,D('#a39a8e')); }
  /* 國立 A:台北大學圖書館(深藍灰直向百葉、上翹薄屋頂、弧形側牆、中央黑色鋼梯、國立石) */
  function bNTPU(){ const cx=Math.max(44,Math.min(W-44,W*0.58|0));
    const LD=D('#3b4452'),LL=D('#4e5868'),BD=D('#6a7482'),SD=D('#333a46'),ED=D('#d9dcde'),GL=D('#2e3640'),GM=D('#4a5562'),CG=D('#7d8a96'),BK=D('#121418'),RL=D('#d2d5d7'),RU=D('#525962'),OL=D('#1c2026');
    const hw=y=>33+Math.round(3*Math.sin(Math.PI*(y-8)/(gy-7)));
    for(let y=8;y<gy;y++){ const h=hw(y); R(cx-h-1,y,2*h+3,1,OL); }
    for(let y=8;y<gy;y++){ const h=hw(y); for(let x=cx-h;x<=cx+h;x++){ const d=Math.abs(x-cx); let c;
        if(y<=10)c=(x%3===0)?GM:(lit&&hash(x*5)>.6?th().win:GL);
        else if(d>=h-2)c=d===h?ED:SD;
        else if(y%5===0)c=BD;
        else c=(x%2)?LL:LD;
        R(x,y,1,1,c); } }
    R(cx-5,8,11,gy-8,CG); if(lit)for(let y=9;y<gy;y+=3)R(cx-4,y,9,1,th().win);
    for(let k=0;k<4;k++){ const ys=11+k*5; R(cx-5,ys,11,1,BK); for(let i=0;i<=10;i++)R(k%2?cx+5-i:cx-5+i,ys+(i>>1),1,1,BK); }
    R(cx-6,8,1,gy-8,OL); R(cx+6,8,1,gy-8,OL);
    for(let x=cx-44;x<=cx+44;x++){ const d=Math.abs(x-cx), o=d>=41?2:d>=36?1:0; R(x,5-o,1,1,OL); R(x,6-o,1,1,RL); R(x,7-o,1,1,RU); }
    for(const [bx,w] of [[cx-28,4],[cx-18,3],[cx+18,3],[cx+28,4]])bush(bx,w);
    const RK=D('#a8a194'),RS=D('#857f73'),RO=D('#2a2722'), rw=[3,5,6,7,7,7,7,7];
    for(let i=0;i<8;i++)R(cx-rw[i]-1,gy-8+i,2*rw[i]+3,1,RO); R(cx-2,gy-9,5,1,RO);
    for(let i=0;i<8;i++)for(let x=cx-rw[i];x<=cx+rw[i];x++)R(x,gy-8+i,1,1,x>cx+2||bay(x,gy-8+i)<.1?RS:RK);
    R(cx-2,gy-6,4,1,RO); R(cx+1,gy-5,1,2,RO); R(cx-4,gy-3,2,2,RS); R(cx+1,gy-3,2,2,RS);
    canopy(cx-44,5); canopy(cx+46,5);
    ground('#3a5132','#34482d'); }
  /* 國立 B:東華大學(背後高山、白色高塔、灰色四坡屋頂、米色石材基座) */
  function bNDHU(){ const cx=Math.max(37,Math.min(W-37,W*0.55|0));
    const WH=D('#d8d5cc'),WS=D('#b3afa5'),BG=D('#c4aa82'),BGd=D('#a58d68'),RF=D('#4a4f57'),RFl=D('#5d636b'),GL=D('#363e46'),TL=D('#2f5a5a'),OL=D('#25262a');
    const mb=D('#4d6383'), mbl=D('#5f7795'), mg=D('#3b5e37'), mgl=D('#4b7246'), mgd=D('#2d4a2b');
    const g=(x,mx,s,ht)=>{ const t=(x-mx)/s; return ht*Math.exp(-t*t); };
    for(let x=0;x<W;x++){ const h=Math.round(gy-4-Math.max(g(x,cx+8,W*0.2,28),g(x,cx+44,W*0.22,22),g(x,cx-28,W*0.2,17)));
      for(let y=h;y<gy;y++)R(x,y,1,1,bay(x,y)<.14?mbl:mb); }
    for(let x=0;x<W;x++){ const h=Math.round(gy-2-Math.max(g(x,-W*0.05,W*0.32,24),g(x,W,W*0.25,9)));
      for(let y=h;y<gy;y++){ const v=bay(x,y); R(x,y,1,1,v<.16?mgl:v>.9?mgd:mg); } }
    const win=(x,y,w,h)=>R(x,y,w,h,lit&&hash(x*7+y*13)>.55?th().win:GL);
    const hip=(c,y0,hws)=>{ for(let i=0;i<hws.length;i++)R(c-hws[i]-1,y0+i-1,2*hws[i]+3,2,OL); for(let i=0;i<hws.length;i++){ R(c-hws[i],y0+i,2*hws[i]+1,1,RF); R(c-hws[i],y0+i,hws[i],1,RFl); } };
    for(const s of [-1,1]){ const lc=cx+s*26;
      hip(lc,21,[6,8,10]);
      box(lc-9,24,19,gy-24,WH,OL); R(lc+s*8,25,1,gy-26,WS);
      for(let r=0;r<2;r++)for(const dx of [-7,-4,4,6])win(lc+dx,25+r*2,1,1);
      R(lc-1,25,3,4,GL); R(lc-1,26,3,1,WS); R(lc-1,28,3,1,WS);
      R(lc-8,29,17,gy-30,BG); R(lc-8,29,17,1,BGd); for(let dx=-7;dx<8;dx+=4)R(lc+dx,30,2,1,OL); }
    hip(cx,17,[12,14,16]);
    box(cx-16,20,33,gy-20,WH,OL);
    for(const dx of [-11,-2,6]){ R(cx+dx,22,4,6,GL); for(let y=23;y<28;y+=2)R(cx+dx,y,4,1,lit&&hash(dx*3+y)>.5?th().win:D('#4a525b')); }
    R(cx-15,28,31,gy-29,BG); R(cx-15,28,31,1,BGd); R(cx-3,28,7,gy-28,D('#2a2a2e'));
    const tx=cx-21;
    box(tx,7,9,gy-7,WH,OL); R(tx-1,5,11,2,WH); R(tx-1,4,11,1,OL); R(tx-1,7,11,1,OL);
    R(tx+1,8,7,2,TL); R(tx+4,8,1,2,WH); R(tx+7,10,1,10,WS);
    for(let y=11;y<19;y+=2){ win(tx+2,y,1,1); win(tx+4,y,1,1); win(tx+6,y,1,1); }
    R(tx+1,20,7,gy-21,BG); for(let y=21;y<gy-1;y+=2)R(tx+1,y,7,1,BGd);
    R(tx+1,23,7,3,WH); for(const dx of [2,4,6])R(tx+dx,24,1,1,GL);
    canopy(3,5); canopy(W-4,5);
    ground('#3e5a33','#365130'); for(let i=0;i<3;i++)R(cx-6-i*3,gy+i,13+i*6,1,D(i%2?'#a9a08e':'#b8af9c')); R(0,gy+5,W,1,D('#8e8a7e')); }
  /* 國外大學共用:草坪(割草條紋)、梧桐大樹。
     國外大學刻意畫得比本國大(使用者:「國外大學就是比較高大上」):主體約 150–160px 寬,塔尖/圓頂頂到畫面上緣;兩側不複製建築,留草坪與大樹 */
  function lawn(cx0){ const A=D('#4b6e33'),B=D('#54783a'),E=D('#344d26');
    for(let y=gy;y<H;y++)for(let x=0;x<W;x++)R(x,y,1,1,(Math.floor((x-cx0+606)/6)%2)?A:B);
    R(0,gy,W,1,E); }
  function bigTree(x,r,tk){ const tr=D('#3a2f25'), c1=D('#2e4829'), c2=D('#3d5c34'), ol=D('#1a2918'), cy=gy-tk-r;
    R(x,cy+r,2,gy-cy-r,tr); circle(x+1,cy,r+1,ol);
    for(let y=-r;y<=r;y++)for(let xx=-r;xx<=r;xx++)if(xx*xx+y*y<=r*r+r*.6&&!(y<-r+2&&Math.abs(xx)>r-2&&hash(X0(x,xx,y))>.5)){ const X=x+1+xx,Y=cy+y; R(X,Y,1,1,bay(X,Y)<.22?c2:c1); } }
  const X0=(x,xx,y)=>x*31+xx*7+y*13;
  /* 兩側樹:大小、樹幹高度、間距都用 hash 變化,不要一排一樣的棒棒糖 */
  function sideTrees(cx0,L,Rr){ const one=(x,k)=>bigTree(x,5+(hash(k)*4|0),6+(hash(k+17)*4|0));
    for(let x=cx0-L-12,k=0;x>-14;k++){ one(x,x); x-=13+(hash(x+3)*8|0); }
    for(let x=cx0+Rr+10,k=0;x<W+14;k++){ one(x,x+5); x+=13+(hash(x+9)*8|0); } }
  /* 跨國 A:UCL(白色石造、十柱門廊+三角楣、圓頂頂到畫面上緣、長翼+兩端山牆樓、銅綠屋簷、前庭草坪與步道、維多利亞路燈) */
  function bUCL(){ const cx=W>>1;
    const ST=D('#d6d0c2'),WS=D('#aaa395'),RC=D('#6a665d'),DM=D('#bab7af'),DS=D('#8f8c85'),CU=D('#6f8f7e'),CL=D('#8fb09d'),TY=D('#c4bdae'),WN=D('#2c3036'),DR=D('#1d1a17'),OL=D('#26241f'),BK=D('#15171a');
    const win=(x,y,w,h)=>R(x,y,w,h,lit&&hash(x*7+y*13)>.5?th().win:WN);
    lawn(cx); sideTrees(cx,80,80);
    for(let y=gy;y<H;y++){ const hw=30+(y-gy)*2; R(cx-hw,y,2*hw+1,1,D(y%3===1?'#958f82':'#a59f91')); R(cx-hw,y,1,1,D('#857f73')); R(cx+hw,y,1,1,D('#857f73')); }
    for(const s of [-1,1]){ const x0=s<0?cx-65:cx+26, w=40;
      R(x0,11,w,1,OL); R(x0,12,w,1,CU); for(let x=x0+1;x<x0+w;x+=2)R(x,12,1,1,CL);
      R(x0,13,w,gy-13,ST); R(x0,14,w,1,WS);
      for(const y of [16,21]){ for(let x=x0+2;x+2<=x0+w-1;x+=4){ win(x,y,2,3); R(x-1,y+3,4,1,WS); } }
      R(x0,25,w,1,WS); R(x0,26,w,gy-26,WS); for(let x=x0+2;x+2<=x0+w-1;x+=4)R(x,28,2,2,RC); }
    for(const s of [-1,1]){ const px=s<0?cx-80:cx+66, pc=px+7;
      [1,3,5,7].forEach((hw,i)=>R(pc-hw-1,4+i,2*hw+3,2,OL)); [1,3,5,7].forEach((hw,i)=>R(pc-hw,5+i,2*hw+1,1,i>1?TY:ST));
      box(px,9,15,gy-9,ST,OL); R(px+1,10,13,1,WS);
      for(let k=0;k<5;k++)R(px+1+k*3,11,1,15,WS);
      for(const y of [12,17,22])for(let k=0;k<4;k++)win(px+2+k*3,y,2,3);
      R(px+1,26,13,gy-26,WS); R(px+5,27,5,gy-27,DR); }
    const dh=[3,5,7,8,9,10,10,11];
    dh.forEach((h,i)=>R(cx-h-1,i-3,2*h+3,2,OL));
    dh.forEach((h,i)=>{ for(let x=cx-h;x<=cx+h;x++)R(x,i-2,1,1,(x-cx)%3===0&&i>0?DS:(x>cx+2?DS:DM)); });
    box(cx-13,6,27,4,ST,OL); for(let x=cx-11;x<=cx+11;x+=2)R(x,7,1,2,WN);
    const ph=[3,7,11,15,19,24];
    ph.forEach((h,i)=>R(cx-h-1,7+i,2*h+3,2,OL));
    ph.forEach((h,i)=>{ R(cx-h,8+i,2*h+1,1,ST); if(i>1)R(cx-h+3,8+i,2*h-5,1,TY); });
    R(cx-25,14,51,1,ST); R(cx-25,15,51,1,WS);
    R(cx-24,16,49,12,RC); R(cx-3,20,7,8,DR);
    for(let i=0;i<10;i++){ const x=cx-23+i*5; R(x-1,16,4,1,ST); R(x,17,2,10,ST); R(x+1,18,1,9,WS); R(x-1,27,4,1,WS); }
    for(let i=0;i<4;i++)R(cx-25-i*3,28+i,51+i*6,1,i%2?WS:ST);
    for(let k=0;k<8;k++){ const px=cx-20+k*5+(hash(k+3)*3|0), py=28+k%3; R(px,py,1,2,D(['#2a2c34','#4a3a30','#3a4a5a'][k%3])); }
    for(const lx of [cx-37,cx+37]){ R(lx,gy-14,1,14,BK); R(lx-1,gy-17,3,3,BK); R(lx,gy-16,1,1,lit?th().win:D('#8a8676')); R(lx,gy-18,1,1,BK); R(lx-1,gy-2,3,2,BK); } }
  /* 跨國 B:愛丁堡大學新學院 New College(依使用者附圖):雙方塔+四角尖塔、中間尖拱大門、左翼小尖塔、
     右側淺色石樓與煙囪、最右階梯山牆樓、左側公寓、後方高尖塔衝出畫面上緣、草坪、紅色圓花圃、黑鐵欄杆、路燈 */
  function bEDI(){ const cx=W>>1;
    /* 石材一律偏棕的砂岩色(使用者:兩翼顏色要一致、偏棕) */
    const S1=D('#7d6447'),S2=D('#624d37'),S3=D('#94795a'),SO=D('#221a12'),SR=D('#4b5058'),SRL=D('#5b6168'),WN=D('#24272d'),DRK=D('#1a1410');
    const B1=S1,B2=S2,B3=S3,T1=S1,T2=S2,BK=D('#141518');
    const win=(x,y,w,h)=>R(x,y,w,h,lit&&hash(x*7+y*13)>.55?th().win:WN);
    lawn(cx); sideTrees(cx,80,72);
    /* 後方高尖塔:細長尖頂衝出畫面上緣 */
    { const sx=cx+27;
      for(let y=0;y<11;y++){ const hw=y>>2; R(sx-hw-1,y,2*hw+3,1,SO); R(sx-hw,y,hw+1,1,S1); if(hw)R(sx+1,y,hw,1,S2); }
      box(sx-4,11,9,7,S2,SO); R(sx-3,12,7,1,S3); R(sx-2,13,1,3,DRK); R(sx+2,13,1,3,DRK);
      for(const px of [sx-4,sx+4])R(px,8,1,3,SO); }
    /* 最右:階梯山牆樓 */
    { const x0=cx+53, w=20, gc=x0+10;
      for(const [y0,hw] of [[9,2],[11,5],[13,8]]){ R(gc-hw-1,y0-1,2*hw+3,3,SO); R(gc-hw,y0,2*hw+1,2,B2); }
      win(gc-1,11,3,2); box(x0,15,w,gy-15,B2,SO); R(x0+1,15,w-2,1,B3);
      for(let r=0;r<3;r++)for(let x=x0+3;x+2<=x0+w-2;x+=4)win(x,17+r*4,2,2); }
    /* 右:淺色石樓(老虎窗、煙囪) */
    { const x0=cx+16, w=37;
      R(x0,12,w,1,SO); R(x0,13,w,3,SR); R(x0,13,w,1,SRL);
      for(const dx of [3,16,28,34]){ R(x0+dx-1,8,4,5,SO); R(x0+dx,9,2,4,B2); R(x0+dx,8,2,1,DRK); }
      for(const dx of [9,22]){ R(x0+dx-2,12,5,4,SO); R(x0+dx-1,13,3,3,B1); R(x0+dx,11,1,1,SO); win(x0+dx,14,1,2); }
      box(x0,16,w,gy-16,B1,SO); R(x0+1,17,w-2,1,B3);
      for(let r=0;r<3;r++)for(let x=x0+3;x+2<=x0+w-2;x+=4)win(x,19+r*4,2,2); }
    /* 最左:公寓 */
    { const x0=cx-80, w=30;
      R(x0,16,w,1,SO); R(x0,17,w,2,SR);
      for(const dx of [4,14,24]){ R(x0+dx-1,12,4,5,SO); R(x0+dx,13,2,4,T2); }
      box(x0,19,w,gy-19,T1,SO);
      for(let r=0;r<3;r++)for(let x=x0+2;x+1<=x0+w-2;x+=3)win(x,21+r*3,1,2); }
    /* 左翼:尖拱窗+屋頂小尖塔 */
    { const x0=cx-51, w=36;
      R(x0,13,w,1,SO); R(x0,14,w,2,SR); R(x0,14,w,1,SRL);
      box(x0,16,w,gy-16,S1,SO); R(x0+1,17,w-2,1,S3);
      for(const y of [19,24]){ for(let x=x0+3;x+2<=x0+w-3;x+=5){ win(x,y+1,2,2); R(x,y,1,1,WN); R(x+1,y,1,1,SO); } }
      R(x0+1,23,w-2,1,S2); R(x0+1,28,w-2,1,S2);
      for(const dx of [2,18,33]){ const tx=x0+dx; R(tx-2,11,5,6,SO); R(tx-1,12,3,5,S1); R(tx+1,12,1,5,S2); R(tx-1,10,3,1,SO); R(tx,6,1,4,SO); } }
    /* 中間:尖拱大門 */
    box(cx-3,12,7,gy-12,S1,SO); R(cx-3,9,1,3,SO); R(cx+3,9,1,3,SO); R(cx,8,1,4,SO);
    win(cx-1,16,3,6); R(cx,15,1,1,WN);
    R(cx,24,1,1,DRK); R(cx-1,25,3,1,DRK); R(cx-2,26,5,gy-26,DRK);
    /* 雙方塔:四角尖塔頂出畫面上緣 */
    const tower=x0=>{ const w=12;
      box(x0,6,w,gy-6,S1,SO); R(x0+w-3,7,2,gy-8,S2); R(x0+1,7,w-4,1,S3);
      for(let i=2;i<w-2;i+=2)R(x0+i,5,1,1,SO);
      for(const px of [x0,x0+w-2]){ R(px-1,2,4,5,SO); R(px,3,2,3,S1); R(px+1,3,1,3,S2); R(px,0,2,2,SO); R(px+(px===x0?0:1),0,1,1,S2); }
      R(x0+5,3,2,3,SO); R(x0+5,1,1,2,SO);
      for(const dx of [3,8]){ win(x0+dx,9,1,6); R(x0+dx,8,1,1,SO); win(x0+dx,18,1,4); R(x0+dx,17,1,1,SO); }
      R(x0+1,16,w-2,1,S3); R(x0+1,23,w-2,1,S3); };
    tower(cx-15); tower(cx+4);
    /* 前景:紅色圓花圃、路燈、黑鐵欄杆 */
    { const bx=cx+44; R(bx-7,gy+2,15,1,D('#3c5a2a')); for(const [dy,hw] of [[3,8],[4,10],[5,8]])for(let x=bx-hw;x<=bx+hw;x++)R(x,gy+dy,1,1,bay(x,gy+dy)<.3?D('#c4473a'):D('#a8322a')); }
    { const lx=cx+19; R(lx,17,1,gy+4-17,BK); R(lx-1,gy+3,3,2,BK); R(lx-1,16,3,1,BK); R(lx-1,13,3,3,lit?th().win:D('#dcd8c8')); R(lx,12,1,1,BK); }
    R(0,H-3,W,1,BK); for(let x=1;x<W;x+=3){ R(x,H-3,1,3,BK); R(x,H-4,1,1,BK); } }
  /* 休學療養(使用者要求:明亮舒適、有貓、有大自然,證明真的在休養):陽光小房間+大窗外的山與綠丘+盆栽;貓與光影的動態在 restFX */
  function paintRest(){ const L=restLayout(W), dk2=tod==='dusk', {wx,wy,ww,wh}=L;
    /* 牆:上奶油白、下淡藍腰牆(依使用者參考圖),不要直紋;地板:深灰磨石子 */
    const WALL=dk2?'#efdcbc':'#efe9d7', LOW=dk2?'#cbc4bd':'#bcd4e4', LOWL=dk2?'#e4d6c4':'#dce9f0', LOWD=dk2?'#b3a9a2':'#a6bfd1';
    R(0,0,W,gy,WALL); R(0,gy-15,W,15,LOW); R(0,gy-15,W,1,LOWL); R(0,gy-14,W,1,LOWD);  /* 腰牆約佔牆面一半(使用者:藍色要高一點) */ R(0,gy-2,W,2,LOWD);
    const TZ=dk2?'#8a847d':'#8e8f8a', C1=dk2?'#dcd4c8':'#dedbd2', C2=dk2?'#a9a29a':'#adaca6', C3=dk2?'#625d58':'#646561';  /* 磨石子灰再淡一階(使用者) */
    for(let y=gy;y<H;y++)for(let x=0;x<W;x++){ const v=hash(x*31+y*977)*100; R(x,y,1,1,v<4?C1:v<10?C2:v<16?C3:TZ); }
    R(0,gy,W,1,dk2?'#7a746d':'#7e7f7a');
    const S1=dk2?'#ef9a72':'#8fcbe9', S2=dk2?'#f8d7a3':'#d4edf4';
    R(wx-2,wy-2,ww+4,wh+4,'#bba98a'); R(wx-1,wy-1,ww+2,wh+2,'#f7f3ea');
    for(let y=0;y<wh;y++)for(let x=0;x<ww;x++)R(wx+x,wy+y,1,1,bay(x,y)<y/(wh-1)?S2:S1);
    if(!dk2){ for(const [cx,cy,cw] of [[wx+6,wy+4,10],[wx+27,wy+7,8]]){ R(cx,cy,cw,2,'#ffffff'); R(cx+2,cy-1,cw-4,1,'#ffffff'); } }
    else circle(wx+ww-12,wy+wh-8,3,'#ffe6b0');
    for(let x=0;x<ww;x++){ const m=Math.round(wh-8-3*Math.sin(x*.18+1)-2*Math.sin(x*.41)); R(wx+x,wy+m,1,wh-m,dk2?'#a08c7a':'#93b6c4');
      const hh=Math.round(wh-4-1.5*Math.sin(x*.25+2)); R(wx+x,wy+hh,1,wh-hh,dk2?'#8f8f5c':'#7ebd60'); if(!dk2&&bay(x,hh)<.3)R(wx+x,wy+hh,1,1,'#97cf74'); }
    const t2=wx+ww-9; R(t2,wy+wh-6,1,4,'#7a5a3a'); circle(t2,wy+wh-8,3,dk2?'#727c46':'#4f9a48'); R(t2-1,wy+wh-10,2,1,dk2?'#8a944f':'#66b55a');
    R(wx+(ww>>1),wy,1,wh,'#f7f3ea'); R(wx,wy+(wh>>1),ww,1,'#f7f3ea');
    const CU=dk2?'#f0dcb8':'#eee6cd', CU2=dk2?'#e0c799':'#ddd3b5';  /* 米白紗簾(參考圖) */
    R(wx-11,1,ww+22,1,'#8a6a44');
    for(const cx of [wx-10,wx+ww+4]){ R(cx,2,6,wh+5,CU); for(let k=1;k<6;k+=2)R(cx+k,2,1,wh+5,CU2); R(cx,wy+wh+5,6,1,CU2); }
    R(wx-3,wy+wh+1,ww+6,2,'#f5f0e4'); R(wx-3,wy+wh+3,ww+6,1,'#cdbf9f');
    for(const [px,h] of [[wx+3,6],[wx+17,4],[wx+ww-8,7]]){ for(let i=0;i<h;i++){ R(px+1+(i%2),wy+wh-1-i,1,1,'#4f9a4a'); if(i%2)R(px+(i>>1)%2*3,wy+wh-1-i,1,1,'#6cb85a'); }
      R(px,wy+wh-1,4,2,'#c9673f'); R(px,wy+wh-1,4,1,'#df8257'); }
    c.globalAlpha=dk2?.32:.36; const BEAM=dk2?'#ffcf94':'#fff6dc';
    for(let y=wy+wh+4;y<H;y++){ const sh=(y-(wy+wh+4))*.9, x0=Math.max(0,wx+1-sh|0), x1=Math.min(W,wx+ww-6-sh|0); if(x1>x0)R(x0,y,x1-x0,1,BEAM); }
    c.globalAlpha=1;
    const tX=L.tx; { const RA=dk2?'#b98656':'#c49a62', RB=dk2?'#9a6c40':'#a87d48', RE=dk2?'#7d5530':'#8a6538';  /* 土色藤編地毯(使用者指定) */
      for(let y=0;y<4;y++)for(let x=0;x<40;x++)R(tX-7+x,gy+1+y,1,1,((x+(y%2)*2)%4<2)?RA:RB); R(tX-7,gy+1,40,1,RE); R(tX-7,gy+4,40,1,RE); R(tX-8,gy+2,1,2,RE); R(tX+33,gy+2,1,2,RE); }
    R(tX,gy-6,24,2,'#a87347'); R(tX+1,gy-4,2,5,'#8d5f39'); R(tX+21,gy-4,2,5,'#8d5f39');
    R(tX+4,gy-10,6,4,'#ece6da'); R(tX+5,gy-11,4,1,'#ece6da'); R(tX+6,gy-12,2,1,'#cfc6b4'); R(tX+10,gy-9,2,1,'#ece6da'); R(tX+3,gy-9,1,2,'#cfc6b4');
    R(tX+14,gy-9,3,3,'#e07a5a'); R(tX+17,gy-8,1,1,'#e07a5a'); R(tX+18,gy-7,5,1,'#5a7fb0'); R(tX+18,gy-8,5,1,'#7c9fca');
    R(tX-6,gy-2,8,3,'#dccbaa'); R(tX-6,gy-2,8,1,'#ebdfc6');  /* 米色坐墊(使用者:拿掉粉紅) */
    { const fx=L.px; R(fx-3,gy-1,8,1,'#e8834a'); R(fx-2,gy-6,6,5,'#f4f2ee'); R(fx+3,gy-6,1,5,'#d9d6cf'); R(fx-2,gy-6,6,1,'#ffffff');  /* 白盆+橘色底盤(參考圖) */ R(fx,gy-12,1,7,'#5b7a3a');
      for(const [lx,ly,lw,lh,cl] of [[-6,-17,6,4,'#3f8a46'],[1,-19,6,5,'#4f9a4a'],[-4,-23,5,4,'#5aa857'],[2,-25,5,4,'#3f8a46'],[-1,-14,5,3,'#5aa857']]){ R(fx+lx,gy+ly,lw,lh,cl); R(fx+lx+1,gy+ly+1,lw-2,1,'#6cbf62'); } }  /* 落地植物 */
    const hx=Math.max(4,tX-12); R(hx,0,1,5,'#ece8df'); R(hx-2,5,5,3,'#f4f2ee'); R(hx+2,5,1,3,'#d9d6cf');  /* 白色吊盆(使用者) */ for(let i=0;i<9;i++){ R(hx-2+(i%3===0?0:4)-(i>5?1:0),8+i,1,1,i%2?'#6cb85a':'#4f9a4a'); } }
  /* 天空 */
  if(INDOOR[key])R(0,0,W,H,INDOOR[key]);
  else if(key!=='lost'){ sky((rainy?(night?['#030408','#0a0e18','#141a26']:SKY.rain):SKY[tod]).map(TN));
    if(night&&!rainy)stars();
    if(night&&!rainy){ circle(W-22,8,4,'#cfc9b8'); circle(W-20,7,3,SKY.night[0]); for(let a=0;a<40;a++){ const t=a/40*Math.PI*2, x=W-22+Math.cos(t)*7|0, y=8+Math.sin(t)*7|0; if(bay(x,y)<.35)R(x,y,1,1,'#1a2232'); } }
    if(dusk&&!rainy){ circle(W*0.78|0,gy-2,7,'#a35a34'); for(let x=0;x<W;x++)for(let y=gy-9;y<gy;y++)if(bay(x,y)<(y-(gy-9))/20)R(x,y,1,1,'#6a3a2c'); }
    if(!night&&!dusk){ for(let i=0;i<5;i++){ const cx=hash(i+7)*W|0, cy=3+hash(i+9)*10|0; for(let x=-9;x<9;x++)for(let y=-2;y<3;y++)if(bay(cx+x,cy+y)<.5-Math.abs(x)/22)R(cx+x,cy+y,1,1,mix(SKY[tod][0],'#9aa0a3',.35)); } } }
  if(key==='hs'){
    hills(D('#3e4b3f'),gy,8,.05,1);
    const x0=W*0.44|0, w=60, y0=9;
    box(x0,y0,w,gy-y0,D('#8a877c'),D('#2f2c28'));
    for(let f=0;f<4;f++){ const fy=y0+2+f*5.4|0; R(x0+1,fy+4,w-2,1,D('#a5a195')); windows(x0+1,fy,w-2,4,{cols:9,rows:1,ww:3,wh:3,col:D('#2b3138')}); }
    box(x0+6,y0-4,6,4,D('#6d7174'),D('#2f2c28')); box(x0+w-14,y0-3,5,3,D('#6d7174'),D('#2f2c28'));
    R(x0-5,4,1,gy-4,D('#9a9a96')); for(const [i,w] of [[0,2],[1,5],[2,8],[3,5],[4,2]])R(x0-4,4+i,w,1,D('#a8322a'));  /* 紅色三角旗(使用者從三方案選定) */
    tree(x0-14,'#2c3a2a'); tree(x0+w+8,'#2c3a2a');
    const p1=pole(6,22), p2=pole(W-6,22); wires([p1,[W*0.3|0,p1[1]+1],p2]); crowsOn([p1,[W*0.3|0,p1[1]+1],p2],3);
    ground('#3e4a36','#4f3328'); R(0,gy+4,W,1,D('#6e5246')); R(0,gy+7,W,1,D('#6e5246')); }
  else if(key==='uni-emp')bNTU();
  else if(key==='uni-top'){ if(alt)bNCCU(); else bNTHU(); }
  else if(key==='uni-nat'){ if(alt)bNDHU(); else bNTPU(); }
  else if(key==='uni-priv')bPCCU();
  else if(key==='uni-intl'){ if(alt)bEDI(); else bUCL(); }
  else if(key==='lost')paintRest();
  else if(key==='end-gold'){  /* 白色單屋:目前沒有結局用到(見 endScene),留著等重畫 */
    hills(D('#2d3a46'),gy,8,.05,2);
    const x0=W*0.42|0; box(x0,12,52,gy-12,D('#8a8070'),'#0a0a0c'); windows(x0+1,13,50,gy-14,{cols:8,rows:3,ww:3,wh:3,col:D('#262c33')});
    box(x0+20,4,12,9,D('#8a8070'),'#0a0a0c'); for(let i=0;i<5;i++)R(x0+20+i,3-i,12-i*2,1,'#0a0a0c');
    tree(10,'#26302a'); palm(W-12); ground('#25301f','#2a2d33'); }
  else if(key==='end-good'){
    hills(D('#6a4a46'),gy,14,.03,1); hills(D('#4a3844'),gy,8,.06,2);
    for(let i=0;i<6;i++){ const bx=W*0.5+i*10|0, bh=4+hash(i)*7|0; R(bx,gy-bh,8,bh,D('#2a2430')); R(bx+2,gy-bh+2,2,1,th().win); }
    tree(14,'#2f3626'); tree(W*0.3|0,'#2f3626',true); ground('#33402c','#3a3028'); }
  else if(key==='end-info'){
    for(let i=0;i<14;i++){ const bw=8+hash(i)*10|0, bx=i*14-4, bh=8+hash(i+50)*20|0; R(bx,gy-bh,bw,bh,D(i%2?'#4a4e5e':'#3e4252'));
      for(let y=gy-bh+2;y<gy-1;y+=3)for(let x=bx+1;x<bx+bw-1;x+=3)if(hash(x*7+y)>.62)R(x,y,1,1,th().win); }
    const p1=pole(4,26), p2=pole(W-4,26); wires([p1,p2]); crowsOn([p1,p2],4);
    ground('#2a2d36','#23262e'); }
  else if(key==='end-stage'){
    for(let x=0;x<W;x++)if(bay(x,3)<.25)R(x,2,1,1,'#a88a4a');
    for(let s=0;s<2;s++){ const x0=s?W-28:0; R(x0,0,28,gy+2,'#5a1a1c'); for(let i=0;i<28;i+=4)R(x0+i+(s?0:2),0,1,gy+2,'#360e10'); }
    R(0,0,W,4,'#3a1012'); R(0,gy,W,H-gy,'#3a2a1c'); R(0,gy,W,1,'#5a4430'); for(let x=0;x<W;x+=8)R(x,gy,1,H-gy,'#2a1e14'); }
  else if(key==='end-book'){  /* 那一本書:頒獎舞台改版——聚光燈下一座講台,上面攤開一本大書(📖);聚光燈外壓暗(使用者:像地下演出一樣) */
    const cx=W>>1;
    for(let x=0;x<W;x++)if(bay(x,3)<.25)R(x,2,1,1,'#3e3220');
    for(let s=0;s<2;s++){ const x0=s?W-28:0; R(x0,0,28,gy+2,'#260b0d'); for(let i=0;i<28;i+=4)R(x0+i+(s?0:2),0,1,gy+2,'#170607'); }
    R(0,0,W,4,'#180708'); R(0,gy,W,H-gy,'#140e09'); R(0,gy,W,1,'#20170e'); for(let x=0;x<W;x+=8)R(x,gy,1,H-gy,'#0e0906');
    /* 聚光:中間亮、往兩側漸淡(不要硬邊三角形);地上一圈柔和的光 */
    for(let y=3;y<gy;y++){ const q=(y-3)/(gy-3), sp=3+q*13; for(let x=Math.floor(cx-sp);x<=cx+sp;x++){ const e=Math.abs(x-cx)/sp; c.globalAlpha=(.07+q*.1)*(1-e*e); R(x,y,1,1,'#ffe2a6'); } }
    for(let y=gy-1;y<gy+4;y++)for(let x=cx-20;x<=cx+20;x++){ const e=Math.hypot((x-cx)/20,(y-gy-.5)/3.2); if(e<1){ c.globalAlpha=.34*(1-e*e); R(x,y,1,1,'#ffe2a6'); } } c.globalAlpha=1;
    R(cx-6,23,13,1,'#9a7048'); R(cx-5,24,11,8,'#5a3c24'); R(cx-4,25,9,6,'#6e4e30'); R(cx-4,28,9,1,'#4a3220'); R(cx-6,31,13,1,'#2a1a10');
    { const bx=cx-8, by=14, top=d=>by+1+Math.round((8-d)*.35), bot=d=>by+7+Math.round((8-d)*.15);
      for(let x=-1;x<=17;x++){ const d=Math.min(8,Math.abs(x-8)); R(bx+x,top(d)+2,1,bot(d)-top(d)-1,'#8a2e26'); R(bx+x,bot(d)+1,1,1,'#4a1612'); }
      for(let x=0;x<=16;x++){ if(x===8)continue; const d=Math.abs(x-8), t0=top(d), b0=bot(d);
        R(bx+x,t0,1,b0-t0+1,d===1?'#dccaa0':'#f6ecd0'); R(bx+x,t0,1,1,'#fffaf0');
        if(d>=2&&d<=7)for(let y=t0+2;y<b0;y+=2)R(bx+x,y,1,1,'#b8a888'); }
      R(bx+8,top(0)+1,1,bot(0)-top(0)+1,'#8a2e26'); } }
  else if(key==='end-rally'){  /* 競選舞台(政治幕僚;依使用者附圖構圖):大螢幕、重複圖樣背板、台上一排幕僚剪影、聚光;紫色系(中性,不用藍綠)、不放文字標誌。彩帶與台下觀眾在 frame */
    const cx=W>>1, sw=Math.max(56,Math.min(96,W*0.44|0)), sx=cx-(sw>>1), bw=Math.min(W-6,Math.max(120,W*0.8|0)), bx=cx-(bw>>1);
    R(0,0,W,1,'#1a1422'); for(let x=3;x<W;x+=6)R(x,1,1,1,'#efe4ff');
    R(sx-1,2,sw+2,15,'#151018');
    for(let y=3;y<16;y++)for(let x=sx;x<sx+sw;x++){ const d=Math.hypot((x-cx)/(sw*.5),(y-9)/7); R(x,y,1,1,bay(x,y)<1-d*.9?'#c9a3ea':(y%2?'#7d4fa8':'#8a5bb4')); }
    { const P='#6a3f92'; circle(cx,7,2,P); R(cx-3,10,7,6,P); R(cx-5,9,2,1,P); R(cx+4,9,2,1,P); for(let i=0;i<4;i++){ R(cx-4-i,8-i,1,1,P); R(cx+4+i,8-i,1,1,P); } }
    R(bx,17,bw,12,'#4f2470'); R(bx,17,bw,1,'#8a5bb0');
    for(let r=0;r<2;r++)for(let x=bx+3+(r?5:0);x+3<=bx+bw-2;x+=10){ const y=19+r*5; R(x,y,3,3,'#6c3a94'); R(x+1,y+1,1,1,'#4f2470'); }
    R(0,29,W,3,'#1c1224'); R(bx-4,29,bw+8,1,'#3a2650'); R(0,31,W,1,'#2a1a36');
    /* 台上幕僚剪影:高低不一;有人雙手舉高(V 字)、有人只舉一手、有人手放下 */
    { const SIL='#1e1029', RIM='#4a2e66';
      for(let x=bx+5,i=0;x<bx+bw-5;x+=8,i++){ const top=19+(hash(i+11)*3|0), pose=hash(i+31);
        R(x+1,top,1,1,RIM); R(x,top+1,3,2,SIL); R(x,top+1,1,1,RIM); R(x+2,top+1,1,1,RIM); R(x-1,top+3,5,29-top-3,SIL);
        const arm=sd=>{ const ax=sd<0?x-2:x+4, ox=sd<0?-1:1; R(ax,top+2,1,2,SIL); R(ax+ox,top,1,2,SIL); R(ax+ox,top-1,1,1,RIM); };
        if(pose>.35)arm(-1); if(pose>.35||pose<.15)arm(1); } }
    R(0,gy,W,H-gy,'#1d1229'); R(0,gy,W,1,'#2a1a36'); }
  else if(key==='end-live'){  /* 地下演出場子(藝文工作者;依使用者附圖構圖):天花板燈架往下打光束、布幕、台上四人樂團剪影、音箱、台下觀眾;
      光用暖黃與琥珀、半透明光束(使用者:不要那麼霓虹)。最前排觀眾起伏在 frame */
    const cx=W>>1, SIL='#0d0805', RIM='#f6d08a', IN='#1a1009', INR='#d9a85a';
    R(0,0,W,3,'#0b0806'); R(0,3,W,1,'#2a1f16');
    for(let y=4;y<24;y++)for(let x=0;x<W;x++){ const d=Math.hypot((x-cx)/(W*.42),(y-15)/13), a=Math.max(0,1-d)*.62; R(x,y,1,1,mix(x%3===0?'#1a100b':'#22150f','#9a6230',a)); }
    const fx0=cx-Math.floor((cx+8)/16)*16;
    for(let fx=fx0,k=0;fx<W+8;fx+=16,k++){ const tx=fx+(cx-fx)*.3, warm=k%2?'#f0a650':'#ffd27a';
      for(let y=5;y<25;y++){ const q=(y-5)/19, xc=fx+(tx-fx)*q, sp=1+q*6, x0=Math.round(xc-sp), x1=Math.round(xc+sp), ci=Math.round(sp*.4);
        c.globalAlpha=.13*(1-q*.4); R(x0,y,x1-x0+1,1,warm); c.globalAlpha=.16*(1-q*.4); R(Math.round(xc)-ci,y,2*ci+1,1,warm); c.globalAlpha=1; }
      R(fx-1,3,3,2,'#1d150f'); R(fx,4,1,1,'#fff0c0'); }
    R(0,24,W,1,'#7a5530'); R(0,25,W,3,'#2e1f13');
    const amp=x=>{ R(x,15,7,9,'#0e0a07'); R(x,15,7,1,'#4a3622'); for(let y=17;y<23;y+=2)for(let i=1;i<6;i+=2)R(x+i,y,1,1,'#2c2118'); R(x+1,12,5,3,'#0e0a07'); R(x+1,12,5,1,'#4a3622'); };
    amp(cx-54); amp(cx+47);
    const person=(x,top,gtr)=>{ R(x+1,top,1,1,RIM); R(x,top+1,3,2,SIL); R(x,top+1,1,1,RIM); R(x+2,top+1,1,1,RIM); R(x-1,top+1,1,3,SIL);
      R(x-1,top+3,5,5,SIL); R(x-1,top+3,1,1,RIM); R(x+3,top+3,1,1,RIM);
      R(x-1,top+8,2,24-top-8,SIL); R(x+2,top+8,2,24-top-8,SIL);
      if(gtr){ R(x-3,top+6,3,3,IN); R(x-3,top+6,3,1,INR); for(let i=0;i<7;i++)R(x-1+i,top+6-(i*.6|0),1,1,i>4?INR:IN); } };
    person(cx-36,14,true); person(cx+10,13,true); person(cx+34,14,true);
    R(cx+7,16,1,8,'#2a2018'); R(cx+6,16,3,1,'#2a2018'); R(cx+8,15,2,1,'#5a4028');
    { const dx=cx-12; R(dx,15,3,2,SIL); R(dx+1,14,1,1,RIM); R(dx-1,17,5,3,SIL); R(dx-1,17,1,1,RIM); R(dx+3,17,1,1,RIM);
      for(const [x0,x1] of [[dx-9,dx-5],[dx+5,dx+9]]){ R(x0,16,x1-x0+1,1,'#e8c47a'); R((x0+x1)>>1,17,1,7,'#2a2018'); }
      circle(dx+1,21,3,IN); R(dx-1,18,5,1,INR); R(dx-6,19,4,2,IN); R(dx-6,19,4,1,INR); R(dx+5,19,4,2,IN); R(dx+5,19,4,1,INR); }
    R(0,28,W,H-28,'#1c120b');
    for(const [y,sz,rim] of [[25,2,'#a67844'],[29,3,'#8a6234'],[33,4,'#6b4a26']])for(let x=-2,i=0;x<W+2;i++){ const jx=x+(hash(i*3+y)*2|0), jy=y+(hash(i*7+y)*2|0);
      R(jx,jy,sz,2,'#070504'); R(jx-1,jy+2,sz+2,H-jy-2,'#070504'); R(jx,jy,sz,1,rim); x+=sz+3+(hash(i+y)*3|0); }
    }
  else if(key==='end-conf'){  /* 研討會(研討會動物;依使用者附圖):木牆+鮮紅布條(白色字塊,不是真字)、黑板、投影幕、
      論壇長桌(五位與談人)+左側講台,右側投影幕下是茶水桌(使用者:茶敘融入演講版二合一),前景一排聽眾;名牌吊繩用藍色(使用者) */
    const cx=W>>1, SKIN='#d9b592', HAIR='#2a2420', LAN='#3d7bd6', BADGE='#f2f0ea';
    R(0,0,W,2,'#1a1410'); for(let x=5;x<W;x+=12)R(x,1,2,1,'#f0dca0');
    for(let y=2;y<31;y++)for(let x=0;x<W;x++)R(x,y,1,1,(x%10===0)?'#563a26':(y===15?'#7a573c':'#6a4a32'));
    const scr=x0=>{ R(x0-1,5,27,16,'#26262a'); R(x0,6,25,14,'#dfe6ea'); R(x0+3,8,19,2,'#9aa6b2'); for(let k=0;k<4;k++)R(x0+3,12+k*2,12+(hash(x0+k)*8|0),1,'#b8c2cc'); };
    scr(cx-72); scr(cx+48);
    R(cx-45,11,91,12,'#5a3d28'); R(cx-44,12,89,10,'#2f4a3a'); for(let x=cx-40;x<cx+40;x+=7)if(hash(x)>.5)R(x,14+(hash(x+1)*5|0),3,1,'#4a6656');
    { const bx=cx-43, bw=87; R(bx,3,bw,7,'#c8281f'); R(bx,3,bw,1,'#e04a3a'); R(bx,9,bw,1,'#9a1d17'); R(bx-1,3,1,1,'#e8e4dc'); R(bx+bw,3,1,1,'#e8e4dc');
      for(let k=0,x=bx+4;x+3<bx+bw-3;k++,x+=5)for(let yy=0;yy<4;yy++)for(let xx=0;xx<3;xx++)if(hash(k*31+yy*7+xx)>.42||yy===0&&xx===1)R(x+xx,5+yy,1,1,'#f6f1e8'); }
    const sit=(x,cl,hr)=>{ R(x,14,3,1,hr||HAIR); R(x,15,3,2,SKIN); R(x,15,1,1,hr||HAIR); R(x-1,17,5,5,cl); R(x,17,1,2,LAN); R(x+2,17,1,2,LAN); R(x+1,19,1,2,BADGE); };
    const stand=(x,top,cl,pt,cup,hr)=>{ R(x,top,3,1,hr||HAIR); R(x,top+1,3,2,SKIN); R(x-1,top+3,5,5,cl); R(x,top+3,1,2,LAN); R(x+2,top+3,1,2,LAN); R(x+1,top+5,1,2,BADGE);
      R(x-1,top+8,2,gy-top-9,pt); R(x+2,top+8,2,gy-top-9,pt); R(x-1,gy-1,2,1,'#141414'); R(x+2,gy-1,2,1,'#141414'); if(cup){ R(x+4,top+5,1,1,cl); R(x+4,top+4,2,1,'#f4f2ee'); } };
    const flowers=(x,y)=>{ for(const [dx,dy,c] of [[0,0,'#d9443a'],[2,-1,'#e86a8a'],[-2,-1,'#c8281f'],[1,1,'#f0a0b0'],[-1,1,'#d9443a'],[3,1,'#e86a8a'],[-3,1,'#3f7a3a'],[4,0,'#3f7a3a'],[0,-2,'#4f8a44']])R(x+dx,y+dy,2,2,c); R(x-2,y+3,5,2,'#2a3a2a'); };
    /* 茶水桌(右側投影幕下):咖啡壺、杯子、點心,旁邊端著杯子寒暄的人 */
    R(cx+46,23,26,1,'#d8d4cc'); R(cx+46,24,26,6,'#efece6'); for(let x=cx+47;x<cx+72;x+=4)R(x,25,1,5,'#d8d4cc');
    for(const ux of [cx+48,cx+53]){ R(ux,17,4,6,'#9da2a8'); R(ux,17,4,1,'#c4c8cc'); R(ux+1,16,2,1,'#6a6e74'); R(ux+4,20,1,1,'#6a6e74'); }
    for(let k=0;k<5;k++)R(cx+59+k*2,22,1,1,'#f4f2ee'); R(cx+66,22,5,1,'#c8a060');
    const T=gy-13;
    stand(cx+50,T+1,'#6a3a3a','#2a2a30',true); stand(cx+57,T,'#2a3550','#26262a',false,'#4a3a2a'); stand(cx+64,T+1,'#5a5a5e','#3a3a40',true); stand(cx+71,T,'#7a6a5a','#2a2a30',true,'#1a1a1a');
    /* 論壇長桌:五位與談人;左側講台與講者 */
    [[-36,'#2a3550'],[-21,'#5a5a5e','#4a3a2a'],[-6,'#1e1e22'],[9,'#4a6a8a'],[24,'#6a5a4a','#1a1a1a']].forEach(([dx,cl,hr])=>sit(cx+dx,cl,hr));
    R(cx-44,22,84,1,'#3a3c46'); R(cx-44,23,84,8,'#1a1c24'); for(let x=cx-43;x<cx+40;x+=3)R(x,24,1,7,'#14161c');
    for(const dx of [-36,-21,-6,9,24]){ R(cx+dx-1,21,5,1,'#f2f0ea'); R(cx+dx+4,18,1,4,'#202020'); R(cx+dx+4,17,1,1,'#5a5a5a'); R(cx+dx-3,19,1,3,'#9ac4d8'); }
    flowers(cx+36,19);
    R(cx-58,12,3,1,HAIR); R(cx-58,13,3,2,SKIN); R(cx-59,15,5,4,'#2a2a30'); R(cx-58,15,1,2,LAN); R(cx-56,15,1,2,LAN);
    R(cx-61,18,9,13,'#4a3424'); R(cx-62,17,11,1,'#6a4a32'); R(cx-53,15,1,2,'#202020'); R(cx-54,14,2,1,'#5a5a5a');
    R(0,31,W,H-31,'#4a4448'); for(let y=32;y<H;y+=2)for(let x=(y%4)?1:3;x<W;x+=4)R(x,y,1,1,'#56505a');
    /* 前景聽眾(背影):兩排,後腦勺+肩膀,脖子後面露出藍色吊繩 */
    const SH=['#3a4458','#5a5a60','#2a2a30','#6a5040','#4a5a6a','#7a6a5a','#3a3a46'];
    for(let x=1,k=0;x<W+4;x+=9,k++){ const hr=hash(k*5)>.8?'#5a4a3a':'#1e1a18', y=34+(hash(k*3+1)*2|0);
      R(x+1,y,3,1,hr); R(x,y+1,5,3,hr); R(x-1,y+4,7,H-y-4,SH[k%SH.length]); R(x,y+4,5,1,LAN); } }
  else if(key==='end-talk'){  /* 網紅教授(使用者定案):晚上沒開燈、只有電腦螢幕亮著;16:9 螢幕裡播著裁切過的頒獎舞台影片,
      講者是全黑剪影、像 TED 一樣在台上走動、聚光燈跟著他(在 frame),影片下方紅灰播放條會前進 */
    const g=talkGeo(W), cx=g.cx, sx0=g.sx0, sw=g.sw, y0=g.top, sh=g.sh;
    /* 螢幕泛光:離螢幕方框越近越亮(近處一圈亮、遠處慢慢暗掉),桌面在螢幕正下方被照亮 */
    const glow=(x,y)=>{ const dx=Math.max(sx0-2-x,0,x-(sx0+sw+1)), dy=Math.max(y0-2-y,0,y-(y0+sh+1)), d=Math.hypot(dx,dy*1.2); return Math.min(1,Math.exp(-d/11)*.62+Math.exp(-d/2.5)*.3); };
    for(let y=0;y<H;y++)for(let x=0;x<W;x++){ const g2=glow(x,y); R(x,y,1,1,y<33?mix('#05060a','#6a7aa0',g2):y===33?mix('#141009','#7a7a8a',g2):mix('#0c0907','#4a4c5c',g2*.95)); }
    R(sx0-2,y0-2,sw+4,sh+4,'#14151a'); R(sx0-2,y0-2,sw+4,1,'#24262e'); R(cx-1,y0+sh+1,3,1,'#2a2c34');
    R(cx-2,y0+sh+2,5,3,'#18191e'); R(cx-8,33,17,2,'#1c1d22'); R(cx-8,33,17,1,'#2a2c34');
    R(sx0,y0,sw,sh,'#120a16');
    R(sx0,y0,sw,2,'#3a1012'); for(let x=sx0;x<sx0+sw;x++)if(bay(x,y0+2)<.3)R(x,y0+2,1,1,'#a88a4a');
    for(const x0 of [sx0,sx0+sw-7]){ R(x0,y0+2,7,16,'#5a1a1c'); for(let k=1;k<7;k+=3)R(x0+k,y0+2,1,16,'#360e10'); }
    const fl=y0+17; R(sx0,fl,sw,4,'#3a2a1c'); R(sx0,fl,sw,1,'#5a4430');
    for(let x=sx0+1;x<sx0+sw-1;x+=4)R(x,fl+2+(hash(x)>.5?1:0),3,2,'#07040a');
    const cb=y0+sh-5; R(sx0,cb,sw,5,'#0e0e12'); R(sx0+2,cb+1,sw-4,1,'#5a5a60');
    R(sx0+2,cb+2,1,3,'#f2f2f2'); R(sx0+4,cb+2,1,3,'#f2f2f2');  /* 暫停鍵(影片正在播) */
    R(sx0+6,cb+3,2,1,'#c8c8c8'); R(sx0+9,cb+3,1,1,'#c8c8c8'); R(sx0+sw-5,cb+3,3,1,'#c8c8c8'); R(sx0+sw-4,cb+2,1,3,'#c8c8c8');
    R(cx-17,36,35,2,'#101218'); for(let x=cx-16;x<cx+17;x+=2)R(x,36,1,1,mix('#1e2028','#8a92aa',glow(x,36)));
    R(cx+22,36,3,2,'#121418'); R(cx+23,36,1,1,mix('#22242c','#8a92aa',glow(cx+23,36)));
    R(cx-31,31,4,4,'#24201c'); R(cx-27,32,1,2,'#24201c'); R(cx-28,31,1,4,mix('#24201c','#9aa2b8',glow(cx-28,31))); R(cx-30,31,2,1,'#100c08'); }
  else if(key==='end-bad'){
    for(let i=0;i<10;i++){ const bw=14+hash(i)*10|0, bx=i*20-6, bh=10+hash(i+20)*14|0; R(bx,gy-bh,bw,bh,'#0e121b');
      for(let y=gy-bh+2;y<gy-2;y+=4)for(let x=bx+2;x<bx+bw-2;x+=4)if(hash(x*3+y)>.86)R(x,y,2,1,'#7a6438'); }
    const lx=W*0.5|0; R(lx,gy-20,1,20,'#1a1d24'); R(lx-2,gy-21,5,2,'#2a2d34'); R(lx-1,gy-19,3,1,'#d8c890');
    for(let y=gy-18;y<gy;y++){ const sp=(y-(gy-18))*.5+1; for(let x=lx-sp;x<=lx+sp;x++){ const e=Math.abs(x-lx)/sp; if(bay(x|0,y)<(1-e)*.5)R(x,y,1,1,e<.45?'#4a4630':'#2c2c28'); } }
    R(0,gy,W,H-gy,'#11141b'); R(0,gy,W,1,'#1d2230'); for(let x=lx-6;x<lx+7;x++)if(bay(x,gy+3)<.4)R(x,gy+3,1,1,'#6a6040'); }
  return cv; }
/* 同一級大學有兩種校景時:入學那刻由種子決定,四年不換;不消耗遊戲亂數 R() */
function sceneAlt(){ const tr=(ending&&ending.altTier)||(S&&S.tier); if(!S||!tr)return 0; const t=String(typeof SEED==='undefined'?'':SEED)+'|'+tr;  /* 教職結局:任教那一級,同級就跟讀書時同一個校園 */ let h=2166136261;
  for(let i=0;i<t.length;i++){ h^=t.charCodeAt(i); h=Math.imul(h,16777619); } return (h>>>0)%2; }
function sizeScene(){ const cv=SC.cv; if(!cv)return; const w=cv.parentElement.clientWidth||360;
  const sc=2, W=Math.ceil(w/sc);  /* 場景縮減:一律 2 倍(高 80px),把篇幅讓給大頭貼 */
  if(W!==SC.W||sc!==SC.scale){ SC.W=W; SC.scale=sc; cv.width=W; cv.height=SC.H; cv.style.height=(SC.H*sc)+'px'; SC.bgKey=''; SC.from=null; }
  SC.tx=((SC.key==='end-stage'||SC.key==='end-book')?SC.W/2-8:SC.W*0.27)|0; }
function syncScene(){ if(!SC.cv)return;
  SC.key=sceneKey(); SC.tod=sceneTod(); SC.tx=((SC.key==='end-stage'||SC.key==='end-book')?SC.W/2-8:SC.W*0.27)|0;
  SC.alt=sceneAlt(); const k=SC.key+'|'+SC.tod+'|'+SC.W+'|'+autoKey()+'|'+SC.alt+'|'+SC.tone+'|'+(ending&&ending.rain?1:0);
  if(k!==SC.bgKey){ const nb=paintBg(SC.key,SC.tod,SC.alt);
    if(SC.bg&&SC.bg.width===nb.width){ SC.from=SC.bg.getContext('2d').getImageData(0,0,SC.W,SC.H); SC.to=nb.getContext('2d').getImageData(0,0,SC.W,SC.H); SC.tStart=performance.now(); }
    SC.bg=nb; SC.bgKey=k; } }
function spawn(n,f){ for(let i=0;i<n;i++)SC.parts.push(f(i)); }
const CONF=['#c4a05a','#c2543f','#7393ab','#d3d0c5','#829c66'];
const RCONF=['#c9a0e8','#f2eef7','#e0b84c','#e48fb5','#9d6fd6'];  /* 競選舞台的彩帶:紫、白、金、粉(中性,不用藍綠) */
function react(kind){ const now=performance.now(), hx=SC.sx+8, hy=SC.gy-SH+4;
  if(kind==='gold'||kind==='trait'){ SC.jumpAt=now; SC.jumpH=kind==='trait'?8:5; SC.moodTmp='joy'; SC.moodUntil=now+1800;
    if(kind==='trait'){ spawn(28,()=>({t:'conf',x:MR()*SC.W,y:-MR()*20,vx:(MR()-.5)*.02,vy:.01+MR()*.01,life:2600,col:CONF[MR()*5|0],born:now})); SC.bubble={g:'!',until:now+1600}; } }
  else if(kind==='good'){ SC.jumpAt=now; SC.jumpH=3; SC.moodTmp='happy'; SC.moodUntil=now+1200; }
  else if(kind==='bad'){ SC.moodTmp='sad'; SC.moodUntil=now+2400; SC.tearUntil=now+2400; }
  else if(kind==='sat'){ SC.bubble={g:'…',until:now+1500}; }
  else if(kind==='end'){ SC.jumpAt=now; SC.jumpH=6;
    if(ending&&ending.tone!=='bad')spawn(36,()=>({t:'conf',x:MR()*SC.W,y:-MR()*30,vx:(MR()-.5)*.02,vy:.009+MR()*.01,life:3200,col:CONF[MR()*5|0],born:now})); } }

/* 休學療養的動態:貓在陽光裡睡覺(呼吸、偶爾甩尾)、光束浮塵、茶杯熱氣、窗外飛鳥 */
function restLayout(W){ const ww=46, wx=Math.max(56,Math.min(W-90,Math.round(W*0.42)-23)); return {wx,wy:4,ww,wh:16,tx:Math.max(16,wx-50),px:Math.min(W-14,wx+ww+16)}; }  /* 窗戶偏左,避開右上角按鈕 */
function restFX(c,ts){ const W=SC.W, gy=SC.gy, t=ts/1000, L=restLayout(W), R=(x,y,w,h,col)=>{ c.fillStyle=col; c.fillRect(Math.round(x),Math.round(y),w,h); };
  /* 玳瑁貓(使用者指定):黑褐底+橘、薑黃斑塊,半橘半黑的臉;在陽光裡睡覺,會呼吸、偶爾甩尾 */
  const PAL={d:'#2b2320',b:'#4d3528',o:'#d8823c',g:'#a95a28',k:'#1a1210',p:'#7a5040'}, cx=L.wx+3, cy=gy-3, br=Math.floor(t/1.7)%2, flick=(t%5.2)<.45;
  const MAP=['o..d...........','ooddddodddg....','okdbdooddddd...','podddddgodddddd','.oodbddoddbdd..'];
  c.fillStyle='#00000020'; c.fillRect(cx,gy+2,15,1);
  if(br){ for(const [x,ch] of [[5,'d'],[6,'d'],[7,'o'],[8,'d']]){ c.fillStyle=PAL[ch]; c.fillRect(cx+x,cy,1,1); } }
  MAP.forEach((row,j)=>{ for(let i=0;i<row.length;i++){ const ch=row[i]; if(ch==='.')continue; c.fillStyle=PAL[ch]; c.fillRect(cx+i,cy+j,1,1); } });
  if(flick){ R(cx+13,cy+3,1,1,PAL.d); R(cx+14,cy+2,1,1,PAL.d); R(cx+15,cy+1,1,1,PAL.o); } else { R(cx+13,cy+4,2,1,PAL.d); R(cx+15,cy+4,1,1,PAL.o); }
  c.fillStyle='#fff8e2'; for(let i=0;i<7;i++){ const yy=L.wy+L.wh+6+((i*5.3+t*1.3)%10), sh=(yy-(L.wy+L.wh+4))*.9, xx=L.wx+4-sh+((i*11.7+t*2.2)%(L.ww-14)); if(Math.sin(t*1.7+i*2)>-.3)c.fillRect(xx|0,yy|0,1,1); }
  c.fillStyle='#ffffffa0'; for(let i=0;i<3;i++){ const k=(t*3+i*1.6)%5; c.fillRect(L.tx+15+(Math.sin(t*2+i)>0?1:0),gy-10-k|0,1,1); }
  const bp=(t%11)/11*(L.ww+24)-12; if(bp>0&&bp<L.ww-3){ const bx=L.wx+bp, by=L.wy+5+Math.sin(t*6)*1; R(bx,by,1,1,'#3d3a36'); R(bx+1,by+1,1,1,'#3d3a36'); R(bx+2,by,1,1,'#3d3a36'); } }
let lastFrame=0, lastFaceKey='';
function frame(ts){
  requestAnimationFrame(frame);
  if(document.hidden)return;
  heroFrame(ts); lookFrame(ts);
  if(!SC.cv||!SC.bg||$('board').style.display==='none')return;
  hudFace(ts);
  if(SC.cv.offsetParent===null)return;
  if(ts-lastFrame<33)return; lastFrame=ts;
  const c=SC.ctx, W=SC.W, H=SC.H, gy=SC.gy, t=ts/1000;
  if(SC.from){ const p=Math.min(1,(ts-SC.tStart)/700), o=c.createImageData(W,H), a=SC.from.data, b=SC.to.data, d=o.data;
    for(let y=0;y<H;y++)for(let x=0;x<W;x++){ const i=(y*W+x)*4, s=bay(x,y)<p?b:a; d[i]=s[i];d[i+1]=s[i+1];d[i+2]=s[i+2];d[i+3]=255; }
    c.putImageData(o,0,0); if(p>=1)SC.from=null; }
  else c.drawImage(SC.bg,0,0);
  const R=(x,y,w,h,col)=>{ c.fillStyle=col; c.fillRect(Math.round(x),Math.round(y),w,h); };
  const outdoor=SC.key!=='lost'&&!INDOOR[SC.key];
  /* 霧:地面上方一條會流動的點陣霧 */
  if(outdoor){ c.fillStyle=SC.tod==='night'?'#26303d':SC.tod==='dusk'?'#4a3c40':'#7c8285';
    for(let y=gy-9;y<gy+3;y++){ const fall=1-Math.abs(y-(gy-3))/8; if(fall<=0)continue;
      for(let x=0;x<W;x++){ const dsty=(.22+.14*Math.sin(x*.05+t*.35)+.1*Math.sin(x*.13-t*.6))*fall; if(bay(x+(t*5|0),y)<dsty*.7)c.fillRect(x,y,1,1); } } }
  /* 星星閃爍 */
  if(SC.tod==='night'&&outdoor&&SC.key!=='end-bad'&&!(ending&&ending.rain)){ for(let i=0;i<3;i++){ const ph=(t*1.1+i*.9)%3.2; if(ph<.35){ const x=(i*53+17)%W, y=(i*13+3)%(gy-12); glyph(c,'star',x-1,y-1,'#bdb8aa'); } } }
  /* 烏鴉偶爾飛過(室內場景不畫,切進室內時清掉飛到一半的那隻) */
  if(!outdoor)SC.crow=null;
  if(outdoor&&!SC.crow&&ts>SC.nextCrow){ SC.crow={x:-6,y:4+MR()*10,v:.018+MR()*.012,born:ts}; SC.nextCrow=ts+7000+MR()*9000; }
  if(SC.crow){ const cr=SC.crow, x=cr.x+(ts-cr.born)*cr.v, y=cr.y+Math.sin((ts-cr.born)/400)*1.5; glyph(c,Math.floor(ts/160)%2?'crow0':'crow1',x,y,'#07080a'); if(x>W+6)SC.crow=null; }
  /* 煙火(低彩度) */
  if(ending&&ending.fw&&ts-SC.lastFw>1100){ SC.lastFw=ts; const fx=20+MR()*(W-40), fy=4+MR()*12, col=CONF[MR()*5|0];
    spawn(16,i=>{ const a=i/16*Math.PI*2; return {t:'fw',x:fx,y:fy,vx:Math.cos(a)*.016,vy:Math.sin(a)*.016,life:900,col,born:ts}; }); }
  /* 舞台聚光 */
  if(SC.key==='end-book'){ for(let i=0;i<3;i++){ const ph=(t*1.3+i*.7)%2.1; if(ph<.4)glyph(c,'star',(W>>1)-9+i*8,10+(i%2)*2,'#fff0c0'); } }  /* 那一本書:書上方的閃光 */
  if(SC.key==='end-stage'||SC.key==='end-book'){ if(SC.key==='end-stage'){ c.fillStyle='#e8dcb02e'; for(let y=4;y<gy+2;y++){ const sp=3+(y-4)*.42; for(let x=SC.tx+8-sp;x<SC.tx+8+sp;x++)if(bay(x|0,y)<.35)c.fillRect(x|0,y,1,1); } }
    for(let i=0;i<W;i+=7){ const b=Math.sin(t*3+i)>.7?1:0; R(i+1,H-4-b,5,4,'#07040a'); R(i+2,H-6-b,3,2,'#07040a'); } }
  /* 競選舞台:台下觀眾剪影起伏、有人舉手;彩帶一直落 */
  if(SC.key==='end-rally'){ for(let i=0;i<W;i+=6){ const b=Math.sin(t*2.6+i*.7)>.55?1:0; R(i,H-4-b,4,4,'#07050a'); R(i+1,H-5-b,2,1,'#07050a');
      if(Math.sin(t*1.7+i*1.3)>.62)R(i+(i%12?3:0),H-9-b,1,5,'#07050a'); }
    if(ts-(SC.lastConf||0)>60){ SC.lastConf=ts; spawn(4,()=>({t:'conf',x:MR()*W,y:-2,vx:(MR()-.5)*.02,vy:.007+MR()*.008,life:6500,col:RCONF[MR()*RCONF.length|0],born:ts})); } }
  /* 地下演出:最前排觀眾跟著節奏起伏、有人舉手(暖色輪廓光) */
  if(SC.key==='end-live'){ for(let i=0;i<W;i+=7){ const b=Math.sin(t*4.2+i*.9)>.3?1:0; R(i,H-5-b,5,6,'#060403'); R(i+1,H-6-b,3,1,'#060403'); R(i+1,H-6-b,3,1,'#7a5530');
      if(Math.sin(t*1.9+i*1.7)>.7){ const hx=i+4; R(hx,H-11-b,1,6,'#060403'); R(hx,H-11-b,1,1,'#7a5530'); } } }
  /* 研討會:茶水桌那群人頭上輪流冒出「…」對話泡泡 */
  if(SC.key==='end-conf'){ const cx=W>>1, k=Math.floor(t/1.1)%3, x=cx+[52,61,68][k], y=gy-19; if((t%1.1)<.85){ R(x-3,y,9,5,'#f4f2ee'); R(x-1,y+5,2,1,'#f4f2ee'); for(let i=0;i<3;i++)R(x-1+i*2,y+2,1,1,'#5a5550'); } }
  /* 網紅教授:影片播放條紅色進度往前走(約一分鐘一輪),紅點拖桿 */
  if(SC.key==='end-talk'){ const g=talkGeo(W), cb=g.top+g.sh-5, L=g.sw-4, p=Math.floor(((t/60)%1)*L), fl=g.top+17;
    /* 講者:全黑剪影,像 TED 一樣在台上來回走動,偶爾舉手比劃;聚光燈跟著他 */
    const ph=t*.45, sx=Math.round(g.cx+Math.sin(ph)*11), mv=Math.abs(Math.cos(ph))>.3, dir=Math.cos(ph)>0?1:-1, st=Math.floor(t*4)%2, K='#000000';
    c.fillStyle='#e8dcb048'; for(let y=g.top+3;y<fl;y++){ const sp=1.5+(y-g.top-3)*.42; for(let x=Math.round(sx-sp);x<=sx+sp;x++)if(bay(x,y)<.35)c.fillRect(x,y,1,1); }
    c.fillStyle='#c8a86a66'; c.fillRect(sx-6,fl,13,1);
    R(sx-1,fl-9,3,3,K); R(sx-2,fl-6,5,4,K);
    if(mv){ if(st){ R(sx-2,fl-2,1,2,K); R(sx+1,fl-2,2,2,K); } else { R(sx-1,fl-2,2,2,K); R(sx+2,fl-2,1,2,K); } } else { R(sx-2,fl-2,2,2,K); R(sx+1,fl-2,2,2,K); }
    const ax=dir>0?sx+3:sx-3; if(Math.sin(t*1.7)>.45)R(ax,fl-9,1,3,K); else R(ax,fl-6,1,3,K);
    R(g.sx0+2,cb+1,p,1,'#e8322a'); R(g.sx0+1+p,cb,3,3,'#e8322a'); }
  if(SC.key==='lost')restFX(c,ts);
  /* 雨(結局「沒有人讀」:大雨——更密、更長、更快) */
  if(ending&&ending.rain){ c.fillStyle='#6b7690'; for(let i=0;i<84;i++){ const x=(i*29.7+t*14)%W, y=((i*13.1)+t*95*(1+i%3*.25))%(H+6)-6; c.fillRect(x|0,y|0,1,3); } }
  else if(SC.key==='end-bad'||SC.key==='uni-intl'||(SC.key==='lost'&&false)){ c.fillStyle=SC.key==='end-bad'?'#56607a':'#7f8a98';
    const n=SC.key==='end-bad'?46:26; for(let i=0;i<n;i++){ const x=(i*37.3+t*8)%W, y=((i*17.9)+t*60*(1+i%3*.3))%(H+4)-4; c.fillRect(x|0,y|0,1,2); } }
  /* 政大(頂大 B):每個時段都下毛毛雨——細短斜線、落得快、半透明(不能像雪:不用慢速單點) */
  if(SC.key==='uni-top'&&SC.alt===1){ c.fillStyle=SC.tod==='dusk'?'rgba(150,158,172,.5)':'rgba(190,200,210,.45)';
    for(let i=0;i<56;i++){ const sp=72+(i%4)*10, y=((i*17.3)+t*sp)%(H+6)-6, x=((i*37.9)+y*.3+t*8)%W|0; c.fillRect(x,y|0,1,3); } }
  /* 像素小人已移除(使用者決定):場景只留校景與全畫面效果 */
  SC.parts=SC.parts.filter(p=>ts-p.born<p.life);
  for(const p of SC.parts){ const dt=ts-p.born, k=dt/p.life;
    const px=p.x+p.vx*dt+(p.t==='conf'?Math.sin(dt/180+p.x)*2:0), py=p.y+p.vy*dt+(p.t==='fw'?dt*dt*.000012:0);
    if(p.t==='spark'){ if(k<.8)glyph(c,'star',px-1,py-1,p.col); else R(px,py,1,1,p.col); }
    else if(p.t==='conf')R(px,py,(dt/120|0)%2?2:1,1,p.col);
    else if(p.t==='fw'){ if(bay(px|0,py|0)<1-k)R(px,py,1,1,k>.6?'#d3d0c5':p.col); }
    else if(p.t==='note')glyph(c,'note',px,py,p.col);
    else if(p.t==='heart'){ if(k<.85||Math.floor(dt/80)%2)glyph(c,'heart',px,py,p.col); }
    else if(p.t==='z')glyph(c,'z',px,py,p.col);
    else if(p.t==='sweat'){ R(px,py,1,2,p.col); R(px-1,py+1,1,1,p.col); } } }

/* 抬頭的大頭貼:64×64 裁切,1:1 顯示 */
function hudFace(ts){ const cv=$('bd-face'); if(!cv||!S)return;
  const st=faceState(); st.blink=(ts%4600)<150;
  const sc=$('sf-cv'), side=!!(sc&&sc.offsetParent!==null);
  const key=JSON.stringify([pref.look,st,side]); if(key===lastFaceKey)return; lastFaceKey=key;
  /* 頂部大頭貼:與捏臉同構圖的半身像;上限=矮螢幕 150、一般 200,且不超過列寬 55% */
  const rw=((cv.parentElement&&cv.parentElement.clientWidth)||360)-20, dm=Math.min(innerHeight<720?150:200,rw*.55), dp=window.devicePixelRatio||1, sk=Math.max(1,Math.floor(dm*dp/128));
  crisp(cv,FACE.get(pref.look,st),128*sk/dp);  /* 只取不超過上限的整數倍,避免把右欄擠爆 */
  if(side){ const ss=Math.max(1,Math.floor(256*dp/128)); crisp(sc,FACE.get(pref.look,st),128*ss/dp);  /* 只取不超過 256px 的整數倍:Windows 125%/175% 縮放時不會超出白色底圖 */ $('sf-name').textContent=S.name||''; try{ $('sf-sub').textContent=S.age+' 歲・'+stageLabel(); }catch(e){} } }

/* =====================================================================
   開場:夜裡的校舍剪影、流動的霧、烏鴉、正弦捲軸
   ===================================================================== */
let heroBg=null, heroW=0, heroH=0, lastHero=0, scrollerStrip=null, fontReady=false, heroCrow=null, heroNextCrow=0;
const SCROLL_TXT='人文社科學生模擬器 ── 十六歲到大學畢業 ── 理論直覺・實證努力・政治・信心・行政・口才 ── 六種能力,一場人文社會科學的多年試煉 ── 獻給所有還在寫論文的人 ── ';
function paintHero(w,h){ const T=th(), cv=newCanvas(w,h), c=cv.getContext('2d'), R=(x,y,ww,hh,col)=>{ c.fillStyle=col; c.fillRect(x|0,y|0,ww|0,hh|0); };
  /* 淺色(藍裂):跟深色版一樣的剪影畫法——深靛近黑的剪影一路到底、淡紙色黎明天空、不疊霧(線描與淡色地面都被使用者否決) */
  const lt=!!T.light, S=(x,y,ww,hh)=>R(x,y,ww,hh,T.sil);
  const hz=h*.72|0, s=T.sky;
  for(let y=0;y<hz;y++){ const t=y/(hz-1)*2, k=Math.min(1,Math.floor(t)), f=t-k; for(let x=0;x<w;x++)R(x,y,1,1,bay(x,y)<f?s[k+1]:s[k]); }
  const hs=i=>{ const v=Math.sin(i*91.7+w*.13)*43758.5453; return v-Math.floor(v); };
  if(lt)R(0,hz,w,h-hz,T.sil); else for(let i=0;i<60;i++)R(hs(i)*w,hs(i+300)*hz*.8,1,1,i%7?mix(s[1],T.moon,.25):T.moon);
  const mx=w*.8|0, my=h*.16|0;
  for(let y=-7;y<=7;y++)for(let x=-7;x<=7;x++){ const d=Math.hypot(x,y); if(d<=4.4)R(mx+x,my+y,1,1,T.moon); else if(!lt&&d<7&&bay(mx+x,my+y)<(7-d)/9)R(mx+x,my+y,1,1,mix(s[1],T.moon,.4)); }
  if(!lt){ R(mx+1,my-2,1,1,mix(T.moon,'#000',.15)); R(mx-2,my+1,2,1,mix(T.moon,'#000',.12)); }
  /* 遠景:校舍、鐘樓、尖塔、煙囪 */
  const base=hz+2; let x=0; const wins=[];
  while(x<w){ const bw=10+hs(x+11)*18|0, bh=8+hs(x+23)*16|0; S(x,base-bh,bw,bh+h);
    if(hs(x+7)>.6){ const sx=x+bw/2|0; for(let i=0;i<8;i++)S(sx-3+i*.4,base-bh-i,6-i*.8,1); }
    if(hs(x+9)>.75){ S(x+2,base-bh-6,2,6); }
    for(let yy=base-bh+3;yy<base-2;yy+=4)for(let xx=x+2;xx<x+bw-2;xx+=4)if(hs(xx*3+yy)>.78)wins.push([xx,yy]);
    x+=bw+1; }
  const tx=w*.34|0; S(tx,base-34,10,34); for(let i=0;i<9;i++)S(tx+i*.55,base-35-i*1.6,10-i*1.1,2);
  R(tx+3,base-28,4,4,mix(T.sil,T.win,.35));
  /* 近景:鐵欄杆、枯樹、電線桿 */
  const fy=h-12|0; R(0,fy+4,w,h,T.sil2);
  for(let xx=0;xx<w;xx+=3){ R(xx,fy-4,1,8,T.sil2); R(xx,fy-5,1,1,T.sil2); } R(0,fy-1,w,1,T.sil2); R(0,fy+2,w,1,T.sil2);
  const bare=(bx,sz)=>{ R(bx,fy-sz,1,sz,T.sil2); for(let i=0;i<sz;i+=2){ const len=(sz-i)*.35|0; for(let k=0;k<len;k++){ R(bx-k,fy-i-k*.6,1,1,T.sil2); R(bx+k,fy-i-1-k*.5,1,1,T.sil2); } } };
  bare(w*.12|0,22); bare(w*.9|0,18);
  if(!lt){  /* 淺色天空上電線會變成一條明顯黑線:淺色不畫電線桿與電線 */
  const px1=w*.56|0; R(px1,fy-34,1,34,T.sil2); R(px1-4,fy-31,9,1,T.sil2);
  for(let xx=0;xx<w;xx++){ const sag=Math.sin(xx/w*Math.PI)*4; R(xx,fy-31+sag*(xx<px1?xx/px1:(w-xx)/(w-px1)),1,1,T.sil2); }
  }
  return {cv,wins,fy}; }
function heroFrame(ts){
  const st=$('start'); if(!st||st.style.display==='none')return;
  if(ts-lastHero<50)return; lastHero=ts;
  const cv=$('fx'); if(!cv)return;
  const w=Math.ceil(cv.clientWidth/3), h=Math.ceil(cv.clientHeight/3); if(!w||!h)return;
  if(cv.width!==w||cv.height!==h){ cv.width=w; cv.height=h; heroBg=null; }
  if(!heroBg||heroW!==w||heroH!==h){ heroBg=paintHero(w,h); heroW=w; heroH=h; }
  const c=cv.getContext('2d'), T=th(), t=ts/1000;
  c.drawImage(heroBg.cv,0,0);
  /* 窗燈:慢慢明滅 */
  heroBg.wins.forEach(([x,y],i)=>{ const v=Math.sin(t*.7+i*1.7); if(v>-.2){ c.fillStyle=v>.6?T.win:mix(T.win,T.sil,.5); c.fillRect(x,y,1,1); } });
  /* 兩層霧,速度不同 */
  if(!T.light)for(const [y0,hh,sp,dens] of [[h*.55,h*.22,4,.42],[h*.74,h*.2,9,.5]]){ c.fillStyle=T.fog;
    for(let y=y0|0;y<y0+hh;y++){ const fall=1-Math.abs(y-(y0+hh/2))/(hh/2); for(let x=0;x<w;x++){ const d=(.5+.5*Math.sin(x*.045+t*.25+y*.11)*Math.sin(x*.017-t*.15))*fall*dens; if(bay(x+(t*sp|0),y)<d)c.fillRect(x,y,1,1); } } }
  if(!heroCrow&&ts>heroNextCrow){ heroCrow={x:-6,y:h*.2+MR()*h*.25,v:.012+MR()*.01,born:ts}; heroNextCrow=ts+5000+MR()*7000; }
  if(heroCrow){ const cr=heroCrow, x=cr.x+(ts-cr.born)*cr.v, y=cr.y+Math.sin((ts-cr.born)/380)*2; glyph(c,Math.floor(ts/170)%2?'crow0':'crow1',x,y,T.light?T.sil2:'#020203'); if(x>w+6)heroCrow=null; }
  scrollerFrame(ts); }
/* 像素字型只內嵌裁切過的字(window.CUBIC11_CHARS)。名字等文字用到裁掉的字(全形、中日韓範圍)時,才去載同資料夾的
   完整字型 cubic11_full.woff2(約 400 KB),載好後以 'Cubic11Full' 接在 'Cubic11' 後面補字。
   檔案不在(沒上傳)就照舊用一般字體,不會壞;一般名字不會觸發下載 */
let fullFontP=null, fullSet=null;
function fullFont(text){ const cs=window.CUBIC11_CHARS; if(!cs||!text)return Promise.resolve(false); if(!fullSet)fullSet=new Set(cs);
  let need=false; for(const ch of String(text)){ const cp=ch.codePointAt(0); if(cp>=0x2000&&cp<=0xFFEF&&!fullSet.has(ch)){ need=true; break; } }
  if(!need)return Promise.resolve(false);
  if(!fullFontP){ try{ const ff=new FontFace('Cubic11Full','url(cubic11_full.woff2)'); fullFontP=ff.load().then(f=>{ document.fonts.add(f); return true; },()=>false); }catch(e){ fullFontP=Promise.resolve(false); } }
  return fullFontP; }
function buildStrip(){ const fnt='12px Cubic11', tmp=newCanvas(10,10).getContext('2d'); tmp.font=fnt;
  const tw=Math.ceil(tmp.measureText(SCROLL_TXT).width)+4, cv=newCanvas(tw,18), c=cv.getContext('2d'); c.font=fnt; c.textBaseline='top';
  for(const [dx,dy] of [[-1,0],[1,0],[0,-1],[0,1],[1,1]]){ c.fillStyle='#000'; c.fillText(SCROLL_TXT,2+dx,2+dy); }
  c.fillStyle='#fff'; c.fillText(SCROLL_TXT,2,2);
  const T2=th(), id=c.getImageData(0,0,tw,18), d=id.data, ink=rgb(T2.hudInk), hl=rgb(T2.light?T2.hudHl:T2.hl), ol=[0,0,0];
  for(let i=0;i<d.length;i+=4){ if(d[i+3]<110){ d[i+3]=0; continue; } d[i+3]=255; const y=(i/4/tw|0);
    if(d[i]>110){ const g=y<9?ink:hl; d[i]=g[0];d[i+1]=g[1];d[i+2]=g[2]; } else { d[i]=ol[0];d[i+1]=ol[1];d[i+2]=ol[2]; } }
  c.putImageData(id,0,0); scrollerStrip=cv; }
function scrollerFrame(ts){ const cv=$('scroller'); if(!cv)return;
  if(!scrollerStrip){ if(!fontReady)return; buildStrip(); }
  const w=Math.ceil(cv.clientWidth/2), h=24; if(cv.width!==w){ cv.width=w; cv.height=h; }
  const c=cv.getContext('2d'); c.clearRect(0,0,w,h);
  const S2=scrollerStrip, tw=S2.width, off=(ts*.022)%tw, t=ts/1000;
  for(let x=0;x<w;x++){ const sx=(off+x)%tw|0, dy=Math.round(Math.sin((x+off)*.05+t*1.6)*2); c.drawImage(S2,sx,0,1,18,x,3+dy,1,18); } }

/* =====================================================================
   角色建立:picrew 式的分類標籤+選項格
   ===================================================================== */
const STG=[{f:'uniform',age:16,n:'預覽:高中制服'},{f:'casual',age:19,n:'預覽:大學'},{f:'gown',age:22,n:'預覽:畢業袍'},{f:'casual',age:52,n:'預覽:三十年後'}];
let lookStage=0, lastLook=0, curCat='bangs', thumbQ=[], lookKey='';
function lookFrame(ts){
  const st=$('start'); if(!st||st.style.display==='none')return;
  for(let k=0;k<3&&thumbQ.length;k++)thumbQ.shift()();
  if(ts-lastLook<80)return; lastLook=ts;
  const g=STG[lookStage], blink=(ts%3600)<150;
  const fc=$('look-face'); if(fc){ const key=JSON.stringify([pref.look,lookStage,blink]); if(key!==lookKey){ lookKey=key; crisp(fc,FACE.get(pref.look,{outfit:g.f,age:g.age,blink}),256); } }
}
const GROUPS=['頭髮','臉','狀態','配件','衣服','背景'];
let curGroup='頭髮';
function thumbLook(cat,v){ const L=Object.assign({},pref.look,{[cat.k]:v});
  if(cat.g==='頭髮')L.hat='none';
  if(cat.k==='dyec'&&L.dye==='none')L.dye='streak';
  if(['face','eye','brow','bags','tear','cheek','mole','wrinkle'].includes(cat.k)){ L.glass='none'; L.hand='none'; }
  if(['nose','beard','blood','mouth'].includes(cat.k)){ L.hand='none'; if(cat.k!=='mouth'&&(L.mouth==='maskw'||L.mouth==='maskb'))L.mouth='line'; }
  if(['glass','inner','cc','outer','uni','bag','ear'].includes(cat.k))L.hand='none';
  return L; }
function makerUI(){
  const gb=$('mk-groups'), tabs=$('mk-tabs'), box=$('mk-opts'); if(!gb||!tabs||!box)return;
  const cats=FACE.CATS.filter(c=>c.g===curGroup);
  if(!cats.some(c=>c.k===curCat))curCat=cats[0].k;
  gb.innerHTML=GROUPS.map(g=>`<button class="mg${g===curGroup?' on':''}" data-g="${g}">${g}</button>`).join('');
  gb.querySelectorAll('.mg').forEach(b=>b.onclick=e=>{ e.preventDefault(); curGroup=b.dataset.g; makerUI(); });
  tabs.innerHTML=cats.length>1?cats.map(c=>`<button class="mt${c.k===curCat?' on':''}" data-k="${c.k}">${c.n}</button>`).join(''):'';
  tabs.querySelectorAll('.mt').forEach(b=>b.onclick=e=>{ e.preventDefault(); curCat=b.dataset.k; makerUI(); });
  const cat=FACE.CATS.find(c=>c.k===curCat), cur=pref.look[cat.k];
  thumbQ=[];
  if(cat.color){ box.className='mk-colors';
    box.innerHTML=cat.o.map(([v,n])=>`<button class="mo sw${v===cur?' on':''}" data-v="${v}" title="${n}"><i style="background:${v}"></i><span>${n}</span></button>`).join(''); }
  else { box.className='';
    const [cx,cy,cw,ch]=cat.c, css=cw>=96?80:Math.min(96,Math.max(72,cw*1.5)), dpr=window.devicePixelRatio||1, sc=Math.max(1,Math.round(css*dpr/cw));
    box.style.setProperty('--tw',(cw*sc/dpr)+'px');
    box.innerHTML=cat.o.map(([v,n])=>`<button class="mo${v===cur?' on':''}" data-v="${v}"><canvas style="width:${cw*sc/dpr}px;height:${ch*sc/dpr}px"></canvas><span>${n}</span></button>`).join('');
    const stg=STG[lookStage], st=cat.stage?{outfit:cat.stage,age:Math.max(stg.age,cat.stage==='casual'?19:16)}:{outfit:stg.f,age:stg.age};
    if(cat.k==='mouth'&&st.age<18)st.age=19;
    box.querySelectorAll('.mo').forEach(b=>{ const v=b.dataset.v, cvs=b.querySelector('canvas');
      thumbQ.push(()=>crisp(cvs,FACE.get(thumbLook(cat,v),st,cat.c),css)); }); }
  box.querySelectorAll('.mo').forEach(b=>b.onclick=e=>{ e.preventDefault(); pref.look[cat.k]=b.dataset.v; if(cat.k==='dyec'&&pref.look.dye==='none')pref.look.dye='streak'; save();
    box.querySelectorAll('.mo').forEach(x=>x.classList.toggle('on',x===b)); if(!cat.color)makerUI(); }); }
/* 右上角 ×:不用瀏覽器 confirm()(App 內建檢視器常封鎖對話框=按了沒反應),改遊戲內確認框;確認後換新種子回到開始畫面(原本 reload 會沿用同一種子=同一段人生) */
function askRestart(){ let m=$('rs-modal'); if(m)return;
  m=document.createElement('div'); m.id='rs-modal';
  m.innerHTML='<div class="rs-box"><p>重新開始一段新的人生?<small>目前這一局不會保留,會換一個新的命運種子。</small></p><div class="row2"><button class="btn" id="rs-no">取消</button><button class="btn main" id="rs-ok">開始新人生</button></div></div>';
  document.body.appendChild(m);
  $('rs-no').onclick=()=>m.remove(); m.onclick=e=>{ if(e.target===m)m.remove(); };
  $('rs-ok').onclick=()=>{ m.remove(); softRestart(null); }; }  /* 不重新載入網頁:回到開始畫面、換新種子 */
/* 「重新開始」不重新載入網頁(使用者:每開新一局都像重開網頁、很卡):畫面層回到剛載入時的樣子,遊戲狀態由 softRestart 重設。
   音訊環境、算好的撥弦音與殘響都留著重用;結局配樂停掉、開場卡帶重新放(這一下點擊就是瀏覽器要的使用者操作)。 */
function reset(){
  ending=null; grad=false; firstYear=true; lastRep=null; lastFaceKey='';
  floatQ.length=0; if(floatT){ clearTimeout(floatT); floatT=0; } { const fb=$('floats'); if(fb)fb.innerHTML=''; }
  Object.assign(SC,{bg:null,bgKey:'',from:null,to:null,parts:[],bubble:null,moodTmp:null,moodUntil:0,blood:false,tearUntil:0,jumpAt:0,jumpH:0,
    walkUntil:0,sx:-16,crow:null,nextCrow:0,lastHeart:0,lastFw:0,lastConf:0,phase:0,key:'hs',tod:'morn',tone:.5});
  document.body.classList.remove('ingame'); { const a=$('act'); if(a)a.classList.remove('alloc','collapsed'); }
  try{ toneSync(); }catch(e){}
  try{ ENDM.stop(); }catch(e){} try{ BGM.stop(); }catch(e){}
  if(pref.bgm){ try{ BGM.start(); }catch(e){} } }
function toggleScheme(){ pref.scheme=autoKey()==='crack'?'dark':'light'; save(); applyTheme(); try{ syncScene(); }catch(e){} }
function schemeSync(){ const lt=autoKey()==='crack', b=$('tg-scheme'); if(b)b.textContent=lt?'淺色模式':'深色模式';
  const h=$('btn-theme'); if(h)h.title=lt?'切換到深色模式':'切換到淺色模式'; }
function themeUI(){ const box=$('theme-sw'); if(!box)return;
  box.innerHTML='<button class="btn" id="tg-scheme" style="width:100%"></button><p class="oddsnote">預設跟隨裝置設定,點按切換;遊戲中右上角 ◐ 也可切換。</p>';
  $('tg-scheme').onclick=e=>{ e.preventDefault(); toggleScheme(); };
  applyTheme(); }

/* =====================================================================
   掛接
   ===================================================================== */
function pips(v){ const P={1:[4],2:[0,8],3:[0,4,8],4:[0,2,6,8],5:[0,2,4,6,8],6:[0,2,3,5,6,8]}[v]||[]; let s=''; for(let i=0;i<9;i++)s+=`<i${P.includes(i)?' class="p"':''}></i>`; return s; }
function setBubble(g){ SC.bubble=g?{g,until:0}:null; }
function sfxBtnSync(){ const a=$('tg-sfx'), b=$('btn-sfx'); if(a)a.textContent='音效:'+(pref.sfx?'開':'關'); if(b)b.classList.toggle('off',!pref.sfx); }
function bootScene(){ document.body.classList.add('ingame'); if(SC.cv)return; SC.cv=$('scene'); SC.ctx=SC.cv.getContext('2d'); if(pref.compact)$('scene-wrap').classList.add('compact'); sizeScene(); syncScene(); }
const SHORT={th:'理論',em:'實證',po:'政治',cf:'信心',ad:'行政',sp:'口才',rep:'聲望'};
const floatQ=[]; let floatT=0, lastRep=null;
/* 數值飄字:排隊依序出現,落在場景的「格位」上,同一格要等前一個飄完才會再用,所以不會疊字。
   格位:上下兩排 × 依寬度分欄(兩排的上下範圍不重疊);順序是跳格走(隔約四成寬、上下交替),看起來分散。
   游標跨回合保留,每次出現的位置不同。右上角按鈕(#hud-btns)蓋住的格位跳過。純畫面,不用 R()。 */
const FLT={cur:0,cols:0,order:[],busy:[]};
function fltSlots(cols){ if(FLT.cols===cols)return; FLT.cols=cols; FLT.busy=Array(cols*2).fill(0); FLT.cur=0;
  const gcd=(a,b)=>b?gcd(b,a%b):a, st=Math.max(1,Math.round(cols*.4)), L=cols/gcd(st,cols), col=j=>((j%L)*st+Math.floor(j/L))%cols;  /* 每步跳約四成寬,繞完一圈就位移一欄=各欄剛好一次 */
  FLT.order=[]; for(let p=0;p<2;p++)for(let j=0;j<cols;j++)FLT.order.push(((j+p)%2)*cols+col(j)); }  /* 兩輪:上下交替;第二輪上下對調=每格剛好一次 */
function float(k,d){ if(!d||pref.compact||!SC.cv)return; floatQ.push([k,d]); pumpFloats(); }
function pumpFloats(){ if(floatT||!floatQ.length)return;
  const box=$('floats'); if(!box){ floatQ.length=0; return; }
  const Wc=box.clientWidth||360, Hc=box.clientHeight||80, two=Hc>=64, cols=Math.max(3,Math.min(12,Math.floor((Wc-8)/68)));
  fltSlots(cols); const now=performance.now(), N=two?cols*2:cols, cw=(Wc-8)/cols, rowY=r=>two?(r?Hc-25:15):Math.round(Hc/2-6);
  const bb=box.getBoundingClientRect(), hb=$('hud-btns'), hr=hb&&hb.offsetParent?hb.getBoundingClientRect():null;
  const ok=o=>{ if(o>=N)return false; if(!hr)return true; const r=Math.floor(o/cols), c=o%cols, y=rowY(r);
    return !(4+cw*(c+1)>hr.left-bb.left-4 && 4+cw*c<hr.right-bb.left && y-14<hr.bottom-bb.top && y+25>hr.top-bb.top); };
  let slot=-1;
  for(let i=0;i<FLT.order.length;i++){ const o=FLT.order[(FLT.cur+i)%FLT.order.length]; if(ok(o)&&FLT.busy[o]<=now){ slot=o; FLT.cur=(FLT.cur+i+1)%FLT.order.length; break; } }
  if(slot<0){ const av=FLT.order.filter(ok); if(!av.length){ floatQ.length=0; return; } const wait=Math.min(...av.map(o=>FLT.busy[o]))-now; floatT=setTimeout(()=>{ floatT=0; pumpFloats(); },Math.min(2000,Math.max(30,wait+20))); return; }
  const [k,d]=floatQ.shift(), el=document.createElement('span'), r=Math.floor(slot/cols), c=slot%cols;
  el.className='flt '+(k==='rep'?'rp':d>0?'up':'dn'); el.textContent=`${SHORT[k]||k} ${d>0?'+':''}${d}`;
  el.style.top=rowY(r)+'px'; box.appendChild(el);
  el.style.left=Math.round(Math.max(2,Math.min(Wc-el.offsetWidth-2,4+cw*(c+.5)-el.offsetWidth/2)))+'px';
  FLT.busy[slot]=now+1450; setTimeout(()=>el.remove(),1450);
  floatT=setTimeout(()=>{ floatT=0; pumpFloats(); },floatQ.length>4?110:190); }
function portrait(card,big,memo){ if(!card)return; const st=faceState(true);
  let src=big?FACE.get(pref.look,st):FACE.get(pref.look,st,HEAD_CROP), face=null;
  if(memo){ face=document.createElement('canvas'); face.width=src.width; face.height=src.height; face.getContext('2d').drawImage(src,0,0); src=memorial(face); }
  const cv=document.createElement('canvas'); cv.className='pf'+(big?' big':'')+(memo?' memo':''); cv._face=face; crisp(cv,src,big?(memo?320:src.width*2):52);
  const h=card.querySelector('h4'); if(h)h.after(cv); else card.prepend(cv); }
/* 壞結局「人社系484有毒」:遺照。頭像強制黑白,外加厚框;框色與主題相反(深色主題白框、淺色主題黑框),四角斜接,只留很淡的倒角 */
function memorial(src){
  /* 裁掉肩膀以下再放大:量過 200 組外觀,頭頂 0–3、臉前緣約 18–24、耳朵與包頭後緣約 90–105;留到衣領(長髮與馬尾末端會被裁掉) */
  const X0=10, Y0=0, C=104, F=10, N=C+F*2, cv=document.createElement('canvas'); cv.width=N; cv.height=N;
  const c=cv.getContext('2d'); c.drawImage(src,X0,Y0,C,C,F,F,C,C); const im=c.getImageData(0,0,N,N), d=im.data;
  const BLK=document.documentElement.classList.contains('lt')?[[4,4,4],[12,12,12],[22,22,22],[36,36,36],[58,58,58]]
    :[[150,150,148],[238,238,236],[244,244,243],[250,250,249],[255,255,255]];  /* 0 陰影與接縫 1 框面 2–4 受光 */
  for(let y=0;y<N;y++)for(let x=0;x<N;x++){ const i=(y*N+x)*4, dl=x, dr=N-1-x, dt=y, db=N-1-y, m=Math.min(dl,dr,dt,db);
    if(m>=F){ let g=d[i]*.299+d[i+1]*.587+d[i+2]*.114; const e=Math.min(x,y)-F; if(e<2)g*=e?.7:.45;  /* 黑白;框的內緣在照片上投一點陰影 */
      d[i]=d[i+1]=d[i+2]=Math.round(g); d[i+3]=255; continue; }
    const side=m===dt?0:m===dl?1:m===db?2:3;  /* 0上 1左 2下 3右 */
    let t;
    if(m===0||m===F-1)t=0;
    else if(m<=2)t=side<2?(m===1?4:3):1;
    else if(m>=F-3)t=side<2?0:(m===F-3?3:2);
    else t=1;
    if((dl===dt||dr===dt||dl===db||dr===db)&&m>0&&m<F-1)t=Math.min(t,0);  /* 斜接縫 */
    const w=BLK[t]; d[i]=w[0]; d[i+1]=w[1]; d[i+2]=w[2]; d[i+3]=255; }
  c.putImageData(im,0,0); return cv; }
function drawFace(ctx,x,y,scale){ ctx.imageSmoothingEnabled=false; const src=FACE.get(pref.look,faceState(true)); ctx.drawImage(src,x,y,src.width*scale,src.height*scale); }
/* 色調跟信心值連續連動:介面(主題 lo↔hi 內插,文字色固定)+場景(tone 分 8 級重畫) */
function toneOf(){ return (!S||!S.ab)?.5:clamp(((S.ab.cf|0)-8)/50,0,1); }
function toneSync(){ const t=toneOf(); if(Math.abs(t-toneT)<.004)return; toneT=t;
  const T=th(), V=themeVars(T,t), R=document.documentElement.style; for(const n in T.lo)if(CSSK.includes(n))R.setProperty('--'+n,V[n]);
  const q=Math.round(t*8)/8; if(q!==SC.tone){ SC.tone=q; syncScene(); } }
function absSync(){ if(!S||!S.ab)return; toneSync();
  { const tl=S.traitList||[], tb=$('bd-traits'); if(tb&&tb.dataset.n!==String(tl.length)){ tb.dataset.n=String(tl.length); tb.innerHTML=tl.map(t=>`<span>${t}</span>`).join(''); } } document.querySelectorAll('#bd-abs .ab').forEach(r=>{ const k=r.dataset.k, v=S.ab[k]|0, p=(S.pot&&S.pot[k])|0;
  const pc=Math.min(100,v/BAR*100), pp=Math.min(100,p/BAR*100), u=r.querySelector('u'), over=v>p&&pc>0; u.style.width=pc+'%';
  u.style.background=over?`linear-gradient(90deg,var(--abC) 0 ${pp/pc*100}%,var(--abO) ${pp/pc*100}% 100%)`:''; r.classList.toggle('over',over);
  r.classList.toggle('warn',k==='cf'&&v<22);  /* 信心 <22:憂鬱症風險開始上升 → 警示色 */
  r.querySelector('s').style.left=pp+'%'; r.querySelector('b').textContent=v; }); barGrad(); }
/* 能力條:單色青綠=一般成長;超過潛力上限的那段接金色、現值數字也轉金色(突破上限的強制升級)。漸層方案被使用者否決(不直觀) */
function barGrad(){ document.querySelectorAll('.abrow').forEach(r=>{ const i=r.querySelector('.bar i'), e=r.querySelector('.bar em'); if(!i)return;
  const v=parseFloat(i.style.width)||0, p=e?parseFloat(e.style.left)||0:100, over=v>p+.01;
  r.classList.toggle('over',over); i.style.background=over?`linear-gradient(90deg,var(--abC) 0 ${p/v*100}%,var(--abO) ${p/v*100}% 100%)`:''; }); }
/* =====================================================================
   結算圖(重做):依現在的美術——主題底色+顆粒、像素字標題、拍立得框住玩家捏的頭像、
   能力條與遊戲內一致(青綠單色、突破上限金色、上限淡色)
   ===================================================================== */
function drawSummary2(){
  const E=S.endInfo||{}, rows=E.rows||[], subs=E.subs||[], TH=th(), DPR=2, W=900, PAD=56;
  const PIXF='"Cubic11","Cubic11Full","Noto Sans TC","PingFang TC","Microsoft JhengHei",sans-serif', READ='"Noto Sans TC","PingFang TC","Microsoft JhengHei",sans-serif';
  const INK=TH.ink, DIM=TH.dim, LINE=mix(TH.rim,TH.bg,.2);
  const PW=384, PF=24, PB=108, PWW=PW+PF*2, PH=PF+PW+PB;
  const rowsH=rows.reduce((h,r)=>h+(r[0]==='§'?50:38),0);
  const mc=document.createElement('canvas').getContext('2d'); mc.font='400 18px '+PIXF;
  const tl=S.traitList||[], cwd=t=>Math.ceil(mc.measureText(t).width)+28, CH=[]; { let row=[],w=0; tl.forEach(t=>{ const x=cwd(t)+(row.length?10:0); if(row.length&&w+x>W-PAD*2){ CH.push(row); row=[]; w=0; } w+=row.length?cwd(t)+10:cwd(t); row.push(t); }); if(row.length)CH.push(row); }
  const TRH=CH.length?62+CH.length*42:0;
  const H=126+PH+70+60+subs.length*34+TRH+70+30+3*48+30+rowsH+110;
  const cv=document.createElement('canvas'); cv.width=W*DPR; cv.height=H*DPR;
  const c=cv.getContext('2d'); c.scale(DPR,DPR);
  const T=(t,x,y,size,color,font,align)=>{ if(font!==READ)size=Math.max(12,Math.round(size/6)*6); c.font=`400 ${size}px ${font||PIXF}`; c.fillStyle=color||INK; c.textAlign=align||'left'; c.textBaseline='alphabetic'; c.fillText(t,x,y); };
  const hr=(y)=>{ c.fillStyle=LINE; for(let x=PAD;x<W-PAD;x+=6)c.fillRect(x,y,4,2); };
  /* 底:主題底色+細顆粒 */
  c.fillStyle=TH.bg; c.fillRect(0,0,W,H);
  c.fillStyle=TH.light?'#00000010':'#ffffff0c'; for(let i=0;i<5200;i++)c.fillRect(MR()*W|0,MR()*H|0,2,2);
  /* 頁首:印章+標題+年份 */
  c.fillStyle='#922c22'; c.fillRect(PAD,34,64,64); c.strokeStyle='#ead9bb99'; c.lineWidth=2; c.strokeRect(PAD+5,39,54,54);
  T('人文',PAD+8,62,24,'#ead9bb'); T('社科',PAD+8,88,24,'#ead9bb');
  T('人文社科學生模擬器',PAD+86,76,30,INK); T(`${S.startYear} → ${S.year} ${S.age} 歲`,W-PAD,76,18,DIM,PIXF,'right');
  hr(116);
  /* 拍立得:白框、底邊留白寫名字;兩段膠帶 */
  const px=(W-PWW)/2|0, py=150;
  c.fillStyle='#00000059'; c.fillRect(px+6,py+12,PWW,PH);
  c.fillStyle='#f6f3ec'; c.fillRect(px,py,PWW,PH); c.fillStyle='#d9d3c6'; c.fillRect(px+PF-2,py+PF-2,PW+4,PW+4);
  try{ const src=FACE.get(pref.look,faceState(true)); c.imageSmoothingEnabled=false; c.drawImage(src,px+PF,py+PF,PW,PW); c.imageSmoothingEnabled=true; }catch(e){}
  T(S.name||'',px+PF,py+PF+PW+54,36,'#1f1d19');
  T(`${S.year}・${S.age} 歲`,px+PWW-PF,py+PF+PW+54,18,'#7a736b',PIXF,'right');
  T(`${S.O?S.O.n:''}出身・${S.tier?TIERS[S.tier].n:'未升學'}`,px+PF,py+PF+PW+86,17,'#7a736b',READ);
  for(const [tx,rot] of [[px+18,-0.22],[px+PWW-18,0.2]]){ c.save(); c.translate(tx,py+4); c.rotate(rot); c.fillStyle='#e8dfc4c4'; c.fillRect(-52,-15,104,30); c.fillStyle='#ffffff30'; for(let k=-48;k<52;k+=8)c.fillRect(k,-15,3,30); c.restore(); }
  /* 結局 */
  let y=py+PH+70;
  const tc={bad:TH.bad,gold:TH.gold,good:TH.good,info:TH.info,satire:TH.sat}[E.tone]||TH.hl;
  T('結局',W/2,y,18,DIM,PIXF,'center'); y+=60; T(E.title||'',W/2,y,48,tc,PIXF,'center');
  subs.forEach(t=>{ y+=34; T(t,W/2,y,19,DIM,READ,'center'); });
  if(CH.length){ y+=34; T('取得屬性',W/2,y,18,DIM,PIXF,'center'); y+=28;
    CH.forEach(row=>{ const rw=row.reduce((a2,t,i)=>a2+cwd(t)+(i?10:0),0); let x=(W-rw)/2|0;
      row.forEach(t=>{ const w2=cwd(t); c.strokeStyle=TH.gold; c.lineWidth=2; c.strokeRect(x+1,y+1,w2-2,30); T(t,x+13,y+23,18,TH.gold); x+=w2+10; }); y+=42; }); }
  /* 能力值:兩欄 */
  y+=70; T('能力值',PAD,y,18,DIM); hr(y+14); y+=30;
  const colW=(W-PAD*2-40)/2;
  KEYS.forEach((k,i)=>{ const x0=PAD+(i<3?0:colW+40), yy=y+(i%3)*48+30, v=S.ab[k], pk=S.pot[k];
    T(ABL[k],x0,yy,18,INK,READ);
    const bx=x0+96, bw=colW-96-92, by=yy-13, fw=bw*Math.min(1,v/AB_MAX), cw=bw*Math.min(1,pk/AB_MAX);
    c.fillStyle=TH.light?'#1c264022':'#ffffff14'; c.fillRect(bx,by,bw,14);
    c.fillStyle='#2fb8a4'; c.fillRect(bx,by,Math.min(fw,cw),14);
    if(fw>cw){ c.fillStyle='#f2b53c'; c.fillRect(bx+cw,by,fw-cw,14); }
    c.fillStyle=TH.bg; for(let s2=1;s2<16;s2++)c.fillRect(bx+bw*s2/16-1,by,2,14);
    c.fillStyle=TH.light?'#1c264088':'#ffffff80'; c.fillRect(bx+cw-1,by-4,2,22);
    T(String(v),x0+colW-36,yy,24,v>pk?'#f2b53c':INK,PIXF,'right'); T('/'+pk,x0+colW,yy,12,DIM,PIXF,'right'); });
  y+=3*48+30;
  /* 明細 */
  const fitRight=(t,x,y2,maxW,color)=>{ let size=18; c.textAlign='right'; c.fillStyle=color;
    for(;size>=13;size-=1){ c.font=`400 ${size}px ${READ}`; if(c.measureText(t).width<=maxW)break; }
    let str=t; if(c.measureText(str).width>maxW){ while(str.length>1&&c.measureText(str+'…').width>maxW)str=str.slice(0,-1); str+='…'; } c.fillText(str,x,y2); };
  rows.forEach(r=>{
    if(r[0]==='§'){ y+=36; T(r[1],PAD,y,18,DIM); hr(y+12); y+=14; return; }
    y+=38; T(r[0],PAD,y,18,r[2]||INK,READ); c.font=`400 18px ${READ}`; const lw=c.measureText(r[0]).width;
    fitRight(String(r[1]),W-PAD,y,W-PAD*2-lw-24,r[2]||TH.hl); });
  /* 頁尾 */
  y=H-44; hr(y-28); T('seed '+SEED,PAD,y,18,DIM); T('wandanle.bearblog.dev',W-PAD,y,18,DIM,PIXF,'right');
  return cv.toDataURL('image/png'); }
function install(){
  const _card=card,_board=board,_divider=divider,_choose=choose,_actClear=actClear,_allocUI=allocUI,_endGame=endGame,_finale=finale,_startYear=startYear,_bump=bump,_addAb=addAb;
  bump=function(k,v){ const d=_bump(k,v); try{ float(k,d); absSync(); }catch(e){} return d; };
  addAb=function(k,v){ const d=_addAb(k,v); try{ float(k,d); absSync(); }catch(e){} return d; };
  card=function(cls,title,html){ _card(cls,title,html); try{
      const el=logTarget().lastElementChild;
      if(title==='全力衝刺')SC.blood=true;
      if(title&&/^取得屬性/.test(title)){ react('trait'); portrait(el,false); sfx('trait'); }
      else if(cls==='gold'){ react('gold'); sfx('gold'); }
      else if(cls==='good'){ react('good'); sfx('good'); }
      else if(cls==='bad'){ react('bad'); sfx('bad'); }
      else if(cls==='satire'){ react('sat'); }
    }catch(e){} };
  board=function(phase){ _board(phase); try{ absSync(); SC.phase=phase; bootScene(); syncScene(); if(lastRep!==null&&S.rep!==lastRep)float('rep',S.rep-lastRep); lastRep=S.rep; }catch(e){} };
  divider=function(t){ _divider(t); try{ const hd=logTarget().parentElement&&logTarget().parentElement.querySelector('.yr-head'); if(hd&&!hd.querySelector('span'))hd.innerHTML='<span>'+hd.textContent+'</span>';
      bootScene(); SC.blood=false; SC.sx=-18; SC.walkUntil=performance.now()+1300; syncScene(); if(!firstYear)sfx('year'); firstYear=false; }catch(e){} };
  choose=function(title,opts){ _choose(title,opts); try{ $('act').querySelectorAll('.btn.warn').forEach(b=>{ if(/^全力衝刺/.test(b.textContent))b.classList.add('sprint'); }); if(opts&&opts.some(o=>/分配進修成果/.test(o.t||'')))$('act').classList.add('alloc'); if(opts&&opts.length>1&&!ending)setBubble('?'); }catch(e){} };
  actClear=function(){ _actClear(); try{ setBubble(null); $('act').classList.remove('alloc'); }catch(e){} };
  /* 年初進修(擲骰分配)不參與捲動:#act 加 .alloc → 手機固定在底部、寬螢幕固定在右側;確認後 actClear 移除 */
  allocUI=function(d,l,done){ _allocUI(d,l,done); try{ barGrad(); $('act').classList.add('alloc'); setBubble('die'); sfx('dice'); }catch(e){} };
  finale=function(){ grad=true; try{ syncScene(); react('end'); sfx('end_gold'); }catch(e){} _finale(); };
  endGame=function(tone,title,subs,rows){
    try{ const acad=(subs||[]).some(s=>/學術生涯/.test(s));
      ending=Object.assign({tone,title,outfit:'hoodie'},endScene(tone,title,subs))  /* 三十年後保有穿衣自由:一律沿用玩家自選便服;場景見 endScene */;
      grad=false; SC.blood=false; syncScene(); react('end'); sfx(tone==='bad'?'end_bad':tone==='gold'?'end_gold':'end'); if(pref.bgm)BGM.toEnd();  /* 結局:換一捲卡帶(停帶→喀→喀→結局配樂) */
      const hs=[...$('log').querySelectorAll('.card h4')].reverse().find(h=>/^(壞)?結局・/.test(h.textContent)); if(hs)portrait(hs.parentElement,true,/^壞結局・/.test(hs.textContent));
      /* 結局卡(有畫像)放最上面:學術線把它移到「三十年後」(論文、計畫數)之前;畫面停在結局卡(現在是由上往下讀) */
      if(hs){ const ec=hs.parentElement, box=ec.parentElement, tc=[...box.children].find(c=>c!==ec&&c.querySelector&&c.querySelector('h4')&&c.querySelector('h4').textContent==='三十年後');
        if(tc)box.insertBefore(ec,tc); newEl=ec; scrollBottom(); } }catch(e){}
    _endGame(tone,title,subs,rows); };
  startYear=function(){ try{ bootScene(); }catch(e){} _startYear(); };
  drawSummary=drawSummary2;  /* 結算圖改用新版(拍立得) */
  /* 捲動:不再跳到最底。每批新內容出現後,把這批的第一個元素捲到頂部面板下方,玩家自己往下讀到選項 */
  let newEl=null, scrollQ=false;
  try{ new MutationObserver(ms=>{ if(newEl)return; for(const m of ms)for(const n of m.addedNodes)if(n.nodeType===1){ newEl=n; scrollBottom(); return; } }).observe($('log'),{childList:true,subtree:true}); }catch(e){}
  scrollBottom=function(){ if(scrollQ)return; scrollQ=true; requestAnimationFrame(()=>{ scrollQ=false; const el=newEl; newEl=null;
      const beh=matchMedia('(prefers-reduced-motion:reduce)').matches?'auto':'smooth', hd=$('board'), top=hd&&hd.style.display!=='none'?hd.getBoundingClientRect().height:0;
      if(el&&el.isConnected){ window.scrollTo({top:Math.max(0,el.getBoundingClientRect().top+scrollY-top-10),behavior:beh}); return; }
      const a=$('act'); if(a&&a.style.display!=='none'){ const r=a.getBoundingClientRect(); if(r.top>innerHeight-48)window.scrollTo({top:Math.max(0,r.top+scrollY-innerHeight*0.5),behavior:beh}); } }); }; }
function init(){
  try{ matchMedia('(prefers-color-scheme: light)').addEventListener('change',()=>{ if(!pref.scheme)applyTheme(); }); }catch(e){}
  { const rb=$('btn-restart'); if(rb)rb.onclick=e=>{ e.preventDefault(); askRestart(); }; }
  { const hb=$('hud-btns'); if(hb){ const b=document.createElement('button'); b.className='hb'; b.id='btn-theme'; b.title='深色/淺色模式'; b.textContent='◐'; b.onclick=()=>toggleScheme(); hb.prepend(b); } }
  /* 配樂:遊戲內 ♫ 開關(放在音效 ♪ 前)。
     瀏覽器要先有使用者「啟用」才能出聲;手機觸控的 pointerdown 還不算(要到 pointerup/touchend/click 才算)。
     舊版只在第一下 pointerdown 開始一次,音訊環境若卡在暫停就一直沒聲音(結局後開啟新的人生常遇到,要按音樂開關才響)。
     改成每個手勢都確認一次:沒在播就開始、暫停就恢復;確定在播了才拿掉監聽。
     (換頁後自動開始配樂的做法已拿掉:新頁面一律等第一下點擊。) */
  { const evs=['pointerdown','pointerup','touchend','click','keydown'];
    const unlock=()=>{ if(!pref.bgm)return; if(!BGM.on){ if(ending)BGM.toEnd(); else BGM.start(); } const a=ac();
      if(a&&a.state==='running'&&BGM.on)evs.forEach(ev=>document.removeEventListener(ev,unlock,true)); };
    evs.forEach(ev=>document.addEventListener(ev,unlock,true));
    try{ sessionStorage.removeItem('hssim_bgm_go'); }catch(e){} }  /* 已拿掉「換頁後一載入就自動開始配樂」:新頁面載入時不做音訊工作(疑似造成開新一局卡頓),照舊等第一下點擊 */
  { const sb=$('btn-sfx'); if(sb){ const b=document.createElement('button'); b.className='hb'; b.id='btn-bgm'; b.title='音樂'; b.textContent='♫'; b.onclick=()=>bgmToggle(); sb.before(b); } }
  { const tg=$('tg-bgm'); if(tg)tg.onclick=e=>{ e.preventDefault(); bgmToggle(); }; bgmSync(); }
  { const nm=$('in-name'); if(nm){ nm.addEventListener('input',()=>fullFont(nm.value)); fullFont(nm.value); } }  /* 名字用到裁掉的字 → 補載完整像素字型 */
  document.addEventListener('visibilitychange',()=>{ try{ if(!AC)return; if(document.hidden)AC.suspend(); else AC.resume(); }catch(e){} });  /* 切到背景就暫停,回來接著播 */
  try{ const bd=$('board'); new ResizeObserver(()=>document.documentElement.style.setProperty('--hdrH',bd.offsetHeight+'px')).observe(bd); }catch(e){}
  /* 頂部:名字、出身標籤、學年移到大頭貼右側,場景上只留按鈕 */
  { const row=$('bd-row'), grid=$('bd-grid'); if(row&&grid){ const side=document.createElement('div'); side.id='bd-side'; row.insertBefore(side,grid);
      const hd=document.createElement('div'); hd.id='bd-head'; side.appendChild(hd); for(const id of ['bd-name','bd-team']){ const el=$(id); if(el)hd.appendChild(el); }
      /* 核心六能力:頂部右欄的主角(年齡、綜合、聲望縮成一行小字,年份由每年標題呈現) */
      const ab=document.createElement('div'); ab.id='bd-abs'; ab.innerHTML=KEYS.map(k=>`<div class="ab" data-k="${k}"><span>${SHORT[k]}</span><i><u></u><s></s></i><b>0</b></div>`).join(''); side.appendChild(ab);
      side.appendChild(grid); { const tr=document.createElement('div'); tr.id='bd-traits'; row.after(tr); }  /* 取得的屬性:大頭貼列下方 */
      const yr=$('bd-year'); if(yr&&yr.parentElement)yr.parentElement.style.display='none'; } }
  { const sf=document.createElement('aside'); sf.id='side-face'; sf.innerHTML='<canvas id="sf-cv"></canvas><div class="sf-name" id="sf-name"></div><div class="sf-sub" id="sf-sub"></div>'; document.body.appendChild(sf); }
  makeGrain(); applyFont(); themeUI(); makerUI(); sfxBtnSync();
  if(document.fonts&&document.fonts.load)document.fonts.load('12px Cubic11',SCROLL_TXT).then(()=>{ fontReady=true; scrollerStrip=null; },()=>{ fontReady=true; });
  else fontReady=true;
  setTimeout(()=>{ fontReady=true; },2500);
  $('look-rand').onclick=e=>{ e.preventDefault(); pref.look=FACE.norm(FACE.randomLook(MR)); save(); makerUI(); };
  $('look-stg').onclick=e=>{ e.preventDefault(); lookStage=(lookStage+1)%STG.length; e.target.textContent=STG[lookStage].n; makerUI(); };
  $('tg-sfx').onclick=e=>{ e.preventDefault(); pref.sfx=!pref.sfx; save(); sfxBtnSync(); sfx('good'); };
  $('btn-sfx').onclick=()=>{ pref.sfx=!pref.sfx; save(); sfxBtnSync(); sfx('good'); };
  $('tg-font').onclick=e=>{ e.preventDefault(); pref.rd=!pref.rd; save(); applyFont(); };
  $('btn-scene').onclick=()=>{ pref.compact=!pref.compact; save(); $('scene-wrap').classList.toggle('compact',pref.compact); $('btn-scene').textContent=pref.compact?'▼':'▲'; sizeScene(); syncScene(); };
  $('btn-scene').textContent=pref.compact?'▼':'▲';
  document.addEventListener('click',e=>{ const el=e.target.closest&&e.target.closest('.btn,.hb,.mt,.mo,.yrbtn,.seg button,.abrow,.ach-cell,.yr-head'); if(!el||el.disabled)return; sfx(el.classList.contains('abrow')?'up':'click'); },true);
  window.addEventListener('resize',()=>{ sizeScene(); syncScene(); });
  try{ matchMedia(`(resolution: ${window.devicePixelRatio||1}dppx)`).addEventListener('change',applyFont); }catch(e){}
  install(); requestAnimationFrame(frame); }
return {init,reset,pips,drawFace,th,_bgm:BGM,fullFont,canvasFont:()=>'"Cubic11","Cubic11Full","Noto Sans TC","PingFang TC","Microsoft JhengHei",sans-serif',_sc:SC,_set:(e,g)=>{ending=e;grad=!!g;syncScene();},_paint:paintBg,_endScene:endScene};
})();
try{ PX.init(); }catch(e){ showFatal(e); }
</script>
</body>
</html>