import { V266_LEASE_DOCUMENT_HTML } from './v266-lease-document.js';


var DEFAULT_LESSOR_COMPANIES = [
	{
		id: 'jx', shortName: '嘉兴羚牛', enabled: true,
		legalName: '浙江羚牛氢能科技有限公司',
		creditCode: '91330481MA2JXXXXX',
		address: '浙江省嘉兴市平湖市乍浦镇杭州湾大道1号',
		contact: '法务部', phone: '0573-88888888', email: 'legal@lingniu-jx.com',
		accountName: '浙江羚牛氢能科技有限公司',
		bankName: '招商银行嘉兴分行',
		bankAccount: '120924165110301',
		hotline: '400-021-1773'
	},
	{
		id: 'sh', shortName: '上海羚牛', enabled: true,
		legalName: '羚牛氢能科技（上海）有限公司',
		creditCode: '91310115MA1HXXXXX',
		address: '上海市浦东新区张江高科技园区科苑路88号',
		contact: '法务部', phone: '021-88888888', email: 'legal@lingniu-sh.com',
		accountName: '羚牛氢能科技（上海）有限公司',
		bankName: '招商银行上海张江支行',
		bankAccount: '120924165110401',
		hotline: '400-021-1773'
	},
	{
		id: 'gd', shortName: '广东羚牛', enabled: true,
		legalName: '羚牛氢能科技（广东）有限公司',
		creditCode: '91440101MA5CXXXXX',
		address: '广东省广州市黄埔区科学城开源大道11号',
		contact: '法务部', phone: '020-88888888', email: 'legal@lingniu-gd.com',
		accountName: '羚牛氢能科技（广东）有限公司',
		bankName: '招商银行广州萝岗支行',
		bankAccount: '120924165110201',
		hotline: '400-021-1773'
	}
];
var LESSOR_TEMPLATE_VARS = [
	{ key: 'lessorName', label: '甲方全称' },
	{ key: 'lessorAddress', label: '甲方地址' },
	{ key: 'lessorContact', label: '甲方联系人' },
	{ key: 'lessorPhone', label: '甲方电话' },
	{ key: 'lessorEmail', label: '甲方邮箱' },
	{ key: 'lessorAccountName', label: '收款户名' },
	{ key: 'lessorBankName', label: '开户行' },
	{ key: 'lessorBankAccount', label: '银行账号' }
];
var CONTRACT_TEMPLATE_VAR_GROUPS = [
	{
		title: '甲方签约主体',
		desc: '创建合同时按所选签约公司自动替换',
		vars: LESSOR_TEMPLATE_VARS
	},
	{
		title: '合同通用',
		desc: '创建合同时由系统或客服填写',
		vars: [
			{ key: 'contractCode', label: '合同编号' },
			{ key: 'customerName', label: '乙方公司全称' },
			{ key: 'creditCode', label: '乙方统一社会信用代码' },
			{ key: 'customerAddress', label: '乙方地址' },
			{ key: 'customerContact', label: '乙方联系人' },
			{ key: 'customerPhone', label: '乙方联系电话' },
			{ key: 'signDateYear', label: '签订年份' },
			{ key: 'signDateMonth', label: '签订月份' },
			{ key: 'signDateDay', label: '签订日期' }
		]
	}
];
var DEFAULT_LESSOR_HOTLINE = '400-021-1773';
if (typeof window !== 'undefined') {
	if (!window.ONEOS_LESSOR_COMPANIES || !window.ONEOS_LESSOR_COMPANIES.length) {
		window.ONEOS_LESSOR_COMPANIES = DEFAULT_LESSOR_COMPANIES;
	}
	window.ONEOS_LESSOR_TEMPLATE_VARS = LESSOR_TEMPLATE_VARS;
	window.ONEOS_CONTRACT_TEMPLATE_VAR_GROUPS = CONTRACT_TEMPLATE_VAR_GROUPS;
	window.ONEOS_CONTRACT_CLAUSE_MARKERS = {
		lockSelector: '.ct-inline-lock[data-inline-lock="1"]',
		riskRedlineSelector: '.ct-risk-redline[data-risk-redline="1"]',
		nonstdTriggerAttr: 'data-nonstd-trigger',
		nonstdApprovalType: '非标准合同审批'
	};
}

// 【重要】必须使用 const Component 作为组件变量名
// ONE-OS 合同模板管理（法务人员维护 Word 版合同基础模板）
// 设计规范：docs/ONE-OS-DESIGN-SPEC.md · 样式：web端/styles/contract-template.css

const Component = function () {
	var ONEOS_ANT_TABLE_GLOBAL_FIX = [
		'.ant-table-container .ant-table-header { margin-bottom: 0 !important; }',
		'.ant-table-container .ant-table-body { margin-top: 0 !important; }',
		'.ant-table-container .ant-table-body > table, .ant-table-content table { margin-top: 0 !important; }',
		'.ant-table-tbody > tr.ant-table-measure-row, .ant-table-tbody > tr.ant-table-measure-row > td, .ant-table-tbody > tr.ant-table-measure-row > th { display: none !important; height: 0 !important; max-height: 0 !important; min-height: 0 !important; padding: 0 !important; margin: 0 !important; border: none !important; line-height: 0 !important; font-size: 0 !important; overflow: hidden !important; visibility: hidden !important; pointer-events: none !important; }'
	];

	var useState = React.useState;
	var useMemo = React.useMemo;
	var useRef = React.useRef;
	var useEffect = React.useEffect;
	var antd = window.antd;
	var App = antd.App;
	var Card = antd.Card;
	var Table = antd.Table;
	var Button = antd.Button;
	var Tabs = antd.Tabs;
	var Select = antd.Select;
	var Input = antd.Input;
	var Space = antd.Space;
	var Tag = antd.Tag;
	var Modal = antd.Modal;
	var Row = antd.Row;
	var Col = antd.Col;
	var Upload = antd.Upload;
	var Tooltip = antd.Tooltip;
	var Popover = antd.Popover;
	var Divider = antd.Divider;
	var Dropdown = antd.Dropdown;
	var message = antd.message;

	var FONT_SIZE_OPTIONS = [
		{ value: '12px', label: '12px' },
		{ value: '14px', label: '14px' },
		{ value: '16px', label: '16px' },
		{ value: '18px', label: '18px' },
		{ value: '20px', label: '20px' },
		{ value: '24px', label: '24px' },
		{ value: '28px', label: '28px' },
		{ value: '32px', label: '32px' }
	];

	var FONT_FAMILY_OPTIONS = [
		{ value: 'Microsoft YaHei', label: '微软雅黑' },
		{ value: 'SimSun', label: '宋体' },
		{ value: 'SimHei', label: '黑体' },
		{ value: 'KaiTi', label: '楷体' },
		{ value: 'FangSong', label: '仿宋' },
		{ value: 'Arial', label: 'Arial' },
		{ value: 'Times New Roman', label: 'Times' }
	];

	var COLOR_OPTIONS = [
		{ value: '#000000', label: '■ 黑' },
		{ value: '#dc2626', label: '■ 红' },
		{ value: '#2563eb', label: '■ 蓝' },
		{ value: '#16a34a', label: '■ 绿' },
		{ value: '#ca8a04', label: '■ 金' },
		{ value: '#64748b', label: '■ 灰' }
	];

	var BG_COLOR_OPTIONS = [
		{ value: '#fef08a', label: '■ 黄' },
		{ value: '#bbf7d0', label: '■ 绿' },
		{ value: '#bfdbfe', label: '■ 蓝' },
		{ value: '#fecaca', label: '■ 红' },
		{ value: '#f1f5f9', label: '■ 灰' },
		{ value: '#ffffff', label: '■ 无' }
	];

	var LINE_HEIGHT_OPTIONS = [
		{ value: '1', label: '1.0 倍' },
		{ value: '1.25', label: '1.25 倍' },
		{ value: '1.5', label: '1.5 倍' },
		{ value: '1.75', label: '1.75 倍' },
		{ value: '2', label: '2.0 倍' },
		{ value: '2.5', label: '2.5 倍' }
	];

	var PARAGRAPH_STYLE_OPTIONS = [
		{ value: 'p', label: '正文' },
		{ value: 'h1', label: '标题 1' },
		{ value: 'h2', label: '标题 2' },
		{ value: 'h3', label: '标题 3' },
		{ value: 'h4', label: '标题 4' },
		{ value: 'blockquote', label: '引用块' },
		{ value: 'pre', label: '预格式/代码' }
	];

	var SPECIAL_CHAR_ITEMS = [
		{ key: 'sq', label: '方框 □', char: '□' },
		{ key: 'ck', label: '对勾 √', char: '√' },
		{ key: 'cc', label: '版权 ©', char: '©' },
		{ key: 'reg', label: '注册 ®', char: '®' },
		{ key: 'yen', label: '人民币 ¥', char: '¥' },
		{ key: 'deg', label: '度数 °', char: '°' },
		{ key: 'mul', label: '乘号 ×', char: '×' },
		{ key: 'div', label: '除号 ÷', char: '÷' },
		{ key: 'ell', label: '省略号 …', char: '…' },
		{ key: 'dash', label: '破折号 —', char: '—' },
		{ key: 'middot', label: '间隔号 ·', char: '·' }
	];

	var TABLE_PRESET_ITEMS = [
		{ key: '2x2', label: '2 × 2', rows: 2, cols: 2 },
		{ key: '3x3', label: '3 × 3', rows: 3, cols: 3 },
		{ key: '4x4', label: '4 × 4', rows: 4, cols: 4 },
		{ key: '5x4', label: '5 × 4', rows: 5, cols: 4 },
		{ key: '6x5', label: '6 × 5', rows: 6, cols: 5 }
	];

	var LETTER_SPACING_OPTIONS = [
		{ value: 'normal', label: '默认间距' },
		{ value: '1px', label: '1px' },
		{ value: '2px', label: '2px' },
		{ value: '4px', label: '4px' }
	];

	function rteSvg(children, extraClass) {
		return React.createElement('svg', {
			className: 'ct-rte-svg' + (extraClass ? ' ' + extraClass : ''),
			width: 16, height: 16, viewBox: '0 0 24 24',
			fill: 'none', stroke: 'currentColor', strokeWidth: 1.75,
			strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': true
		}, children);
	}

	function previewPagerSvg(children) {
		return React.createElement('svg', {
			className: 'ct-preview-pager__icon-svg',
			width: 20, height: 20, viewBox: '0 0 24 24',
			fill: 'none', stroke: 'currentColor', strokeWidth: 2,
			strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': true
		}, children);
	}

	function previewPagerIcon(name) {
		if (name === 'zoomOut') {
			return previewPagerSvg(React.createElement('path', { d: 'M5 12h14' }));
		}
		if (name === 'zoomIn') {
			return previewPagerSvg([
				React.createElement('path', { key: 'v', d: 'M12 5v14' }),
				React.createElement('path', { key: 'h', d: 'M5 12h14' })
			]);
		}
		return null;
	}

	function rteLetterIcon(letter, barColor, extraClass) {
		return React.createElement('span', { className: 'ct-rte-letter' + (extraClass ? ' ' + extraClass : '') },
			letter,
			barColor !== false ? React.createElement('span', {
				className: 'ct-rte-letter__bar',
				style: barColor ? { background: barColor } : null
			}) : null
		);
	}

	function rteIcon(name) {
		var map = {
			bold: rteLetterIcon('B', false),
			italic: rteLetterIcon('I', false, 'is-italic'),
			underline: rteLetterIcon('U', '#ef4444'),
			fontColor: rteLetterIcon('A', '#ef4444'),
			highlight: React.createElement('span', { className: 'ct-rte-letter ct-rte-letter--highlight' }, 'A'),
			eraser: rteSvg([
				React.createElement('path', { key: 'p', d: 'M20 20H8L4 16l8-8 8 8-4 4z' }),
				React.createElement('path', { key: 'p2', d: 'M12 6l6 6' })
			]),
			image: rteSvg([
				React.createElement('rect', { key: 'r', x: '3', y: '5', width: '18', height: '14', rx: '2' }),
				React.createElement('circle', { key: 'c', cx: '9', cy: '10', r: '1.5', fill: 'currentColor', stroke: 'none' }),
				React.createElement('path', { key: 'p', d: 'M21 16l-5-5L5 19' })
			]),
			link: rteSvg([
				React.createElement('path', { key: 'p', d: 'M10 14a4 4 0 0 1 0-5.5L12 6a4 4 0 0 1 5.5 0' }),
				React.createElement('path', { key: 'p2', d: 'M14 10a4 4 0 0 1 0 5.5L12 18a4 4 0 0 1-5.5 0' })
			]),
			table: rteSvg([
				React.createElement('rect', { key: 'r', x: '3', y: '5', width: '18', height: '14', rx: '1' }),
				React.createElement('path', { key: 'p', d: 'M3 10h18M3 14h18M9 5v14M15 5v14' })
			]),
			bulb: rteSvg([
				React.createElement('path', { key: 'p', d: 'M9 18h6M10 22h4' }),
				React.createElement('path', { key: 'p2', d: 'M12 2a6 6 0 0 0-3 11v1h6v-1a6 6 0 0 0-3-11z' })
			]),
			undo: rteSvg(React.createElement('path', { d: 'M9 7H5v4M5 11a7 7 0 1 0 1.5 4.5' })),
			redo: rteSvg(React.createElement('path', { d: 'M15 7h4v4M19 11a7 7 0 1 1-1.5 4.5' })),
			more: rteSvg([
				React.createElement('circle', { key: 'c1', cx: '6', cy: '12', r: '1.25', fill: 'currentColor', stroke: 'none' }),
				React.createElement('circle', { key: 'c2', cx: '12', cy: '12', r: '1.25', fill: 'currentColor', stroke: 'none' }),
				React.createElement('circle', { key: 'c3', cx: '18', cy: '12', r: '1.25', fill: 'currentColor', stroke: 'none' })
			]),
			alignLeft: rteSvg([
				React.createElement('path', { key: 'p', d: 'M4 6h16M4 10h10M4 14h16M4 18h8' })
			]),
			alignCenter: rteSvg([
				React.createElement('path', { key: 'p', d: 'M4 6h16M7 10h10M5 14h14M8 18h8' })
			]),
			alignRight: rteSvg([
				React.createElement('path', { key: 'p', d: 'M4 6h16M10 10h10M4 14h16M12 18h8' })
			]),
			alignJustify: rteSvg([
				React.createElement('path', { key: 'p', d: 'M4 6h16M4 10h16M4 14h16M4 18h16' })
			]),
			lineHeight: rteSvg([
				React.createElement('path', { key: 'p', d: 'M4 7h12M4 12h12M4 17h12' }),
				React.createElement('path', { key: 'p2', d: 'M20 7v10M18 9l2-2 2 2M18 15l2 2 2-2' })
			]),
			letterSpacing: rteSvg([
				React.createElement('path', { key: 'p', d: 'M6 8v8M18 8v8M9 12h6' }),
				React.createElement('path', { key: 'p2', d: 'M4 12h2M18 12h2' })
			]),
			outdent: rteSvg([
				React.createElement('path', { key: 'p', d: 'M4 6h16M4 10h10M4 14h16M4 18h8' }),
				React.createElement('path', { key: 'p2', d: 'M20 8l-3 4 3 4' })
			]),
			indent: rteSvg([
				React.createElement('path', { key: 'p', d: 'M4 6h16M10 10h10M4 14h16M8 18h12' }),
				React.createElement('path', { key: 'p2', d: 'M4 8l3 4-3 4' })
			]),
			listBullet: rteSvg([
				React.createElement('circle', { key: 'c1', cx: '5', cy: '7', r: '1', fill: 'currentColor', stroke: 'none' }),
				React.createElement('circle', { key: 'c2', cx: '5', cy: '12', r: '1', fill: 'currentColor', stroke: 'none' }),
				React.createElement('circle', { key: 'c3', cx: '5', cy: '17', r: '1', fill: 'currentColor', stroke: 'none' }),
				React.createElement('path', { key: 'p', d: 'M9 7h11M9 12h11M9 17h11' })
			]),
			listOrdered: rteSvg([
				React.createElement('path', { key: 'p', d: 'M9 7h11M9 12h11M9 17h11' }),
				React.createElement('path', { key: 'n1', d: 'M4 7h1v3H4V7z', fill: 'currentColor', stroke: 'none' }),
				React.createElement('path', { key: 'n2', d: 'M4 11h2v1H4v2h2', fill: 'none' }),
				React.createElement('path', { key: 'n3', d: 'M4 16h2c0 1-1 1.5-2 2', fill: 'none' })
			]),
			script: rteSvg([
				React.createElement('path', { key: 'p', d: 'M8 6h8M6 18l4-8h4l-2 8' }),
				React.createElement('path', { key: 'p2', d: 'M16 6v4' })
			]),
			chevron: rteSvg(React.createElement('path', { d: 'M8 10l4 4 4-4' }), 'ct-rte-svg--chevron'),
			pageBreak: rteSvg([
				React.createElement('rect', { key: 't', x: '5', y: '3', width: '14', height: '7', rx: '1' }),
				React.createElement('rect', { key: 'b', x: '5', y: '14', width: '14', height: '7', rx: '1' }),
				React.createElement('path', { key: 'd', d: 'M8 12h8', strokeDasharray: '2 2' })
			])
		};
		return map[name] || null;
	}

	function isHtmlContent(text) {
		return /<[a-z][\s\S]*>/i.test(String(text || ''));
	}

	function toEditorHtml(content) {
		if (!content) return '';
		if (isHtmlContent(content)) return String(content);
		return String(content)
			.replace(/&/g, '&amp;')
			.replace(/</g, '&lt;')
			.replace(/>/g, '&gt;')
			.replace(/\n/g, '<br>');
	}

	function htmlToPlainText(html) {
		if (!html) return '';
		if (!isHtmlContent(html)) return String(html);
		var div = document.createElement('div');
		div.innerHTML = html;
		return (div.textContent || div.innerText || '').trim();
	}

	function mergeBlocksToDocument(blocks) {
		var list = blocks || [];
		if (!list.length) return '';
		if (list.length === 1) {
			var single = String(list[0].content || '');
			return isHtmlContent(single) ? single : toEditorHtml(single);
		}
		return list.map(function (b) { return toEditorHtml(b.content); }).join('');
	}

	function documentToBlocks(html) {
		if (!html) return [];
		var div = document.createElement('div');
		div.innerHTML = html;
		var sections = div.querySelectorAll('.ct-section');
		if (!sections.length) {
			return [{ id: 'doc', title: '合同全文', content: html, locked: false }];
		}
		var blocks = [];
		sections.forEach(function (sec, idx) {
			var clone = sec.cloneNode(true);
			var labelClone = clone.querySelector('.ct-section-label');
			if (labelClone) labelClone.parentNode.removeChild(labelClone);
			blocks.push({
				id: sec.getAttribute('data-section-id') || ('s' + idx),
				title: sec.getAttribute('data-section-title') || ('模块' + (idx + 1)),
				locked: sec.getAttribute('data-section-locked') === '1',
				content: clone.innerHTML
			});
		});
		return blocks;
	}

	function countLockRegions(source) {
		var html = typeof source === 'string' ? source : mergeBlocksToDocument(source);
		var div = document.createElement('div');
		div.innerHTML = html;
		return div.querySelectorAll('.ct-inline-lock[data-inline-lock="1"]').length;
	}

	function countRiskRedlineRegions(source) {
		var html = typeof source === 'string' ? source : mergeBlocksToDocument(source);
		var div = document.createElement('div');
		div.innerHTML = html;
		return div.querySelectorAll('.ct-risk-redline[data-risk-redline="1"]').length;
	}

	function stripRiskRedlinePreviewFooters(html) {
		if (!html || typeof document === 'undefined') return String(html || '');
		var div = document.createElement('div');
		div.innerHTML = html;
		div.querySelectorAll('.ct-risk-redline__footer').forEach(function (el) {
			el.parentNode.removeChild(el);
		});
		return div.innerHTML;
	}

	function stripEmptyRiskRedlines(html) {
		if (!html || typeof document === 'undefined') return String(html || '');
		var div = document.createElement('div');
		div.innerHTML = html;
		div.querySelectorAll('.ct-risk-redline[data-risk-redline="1"]').forEach(function (el) {
			var inner = String(el.innerHTML || '')
				.replace(/<br\s*\/?>/gi, '')
				.replace(/&nbsp;/gi, '')
				.replace(/\u200b/g, '')
				.trim();
			var text = String(el.textContent || '').replace(/\s/g, '').trim();
			if (!inner && !text) {
				var parent = el.parentNode;
				if (parent) parent.removeChild(el);
				if (parent && parent.nodeName === 'P') {
					var pText = String(parent.textContent || '').replace(/\s/g, '').trim();
					var pHtml = String(parent.innerHTML || '')
						.replace(/<br\s*\/?>/gi, '')
						.replace(/&nbsp;/gi, '')
						.trim();
					if (!pText && !pHtml) parent.parentNode.removeChild(parent);
				}
			}
		});
		return div.innerHTML;
	}

	function prepareWordHtml(html) {
		var content = String(html || '');
		if (!content) return '';
		if (isWordFormattedDoc(content)) {
			content = ensureV266WordStyles(content);
			content = fixWordPreviewHtml(content);
			content = stripEmptyRiskRedlines(content);
			content = stripRiskRedlinePreviewFooters(content);
		}
		return content;
	}

	function preparePreviewHtml(html) {
		return prepareWordHtml(html);
	}

	function prepareEditorHtml(html) {
		return prepareWordHtml(html);
	}

	function ensureV266WordStyles(html) {
		var content = String(html || '');
		if (!isWordFormattedDoc(content) || typeof document === 'undefined') return content;

		var cssText = '';
		var match = content.match(/<style[^>]*>([\s\S]*?)<\/style>/i);
		if (match) {
			cssText = match[1];
			content = content.replace(/<style[^>]*>[\s\S]*?<\/style>/i, '');
		} else if (typeof V266_LEASE_DOCUMENT_HTML !== 'undefined' && V266_LEASE_DOCUMENT_HTML) {
			var fullMatch = V266_LEASE_DOCUMENT_HTML.match(/<style[^>]*>([\s\S]*?)<\/style>/i);
			if (fullMatch) cssText = fullMatch[1];
		}
		if (!cssText) return content;

		var styleEl = document.getElementById('ct-v266-word-styles');
		if (!styleEl) {
			styleEl = document.createElement('style');
			styleEl.id = 'ct-v266-word-styles';
			document.head.appendChild(styleEl);
		}
		if (styleEl.textContent !== cssText) styleEl.textContent = cssText;

		if (content.indexOf('ct-word-doc--v266') < 0) {
			content = '<div class="ct-word-doc ct-word-doc--v266">' + content + '</div>';
		}
		return content;
	}

	function isMonolithicWordDocument(html) {
		var source = String(html || '');
		if (!isWordFormattedDoc(source)) return false;
		var sections = splitHtmlIntoSections(source);
		return DOCUMENT_SECTION_TABS.slice(1).some(function (tab) {
			return !!(sections[tab.key] && String(sections[tab.key]).trim());
		});
	}

	function extractSectionFromWordHtml(html, sectionKey) {
		var source = String(html || '').trim();
		if (!source || !isWordFormattedDoc(source)) return source;
		if (!isMonolithicWordDocument(source)) return source;
		var sections = splitHtmlIntoSections(source);
		return sections[sectionKey] || source;
	}

	function getDocumentTitle(html) {
		var div = document.createElement('div');
		div.innerHTML = html || '';
		var h1 = div.querySelector('h1');
		if (h1) return htmlToPlainText(h1.innerHTML) || '合同预览';
		var wordTitle = div.querySelector('.ct-word-title');
		if (wordTitle) return htmlToPlainText(wordTitle.innerHTML) || '合同预览';
		return htmlToPlainText(div.innerHTML).split('\n')[0].trim() || '合同预览';
	}

	function hasPreviewContent(html) {
		var source = String(html || '').trim();
		if (!source) return false;
		if (typeof document === 'undefined') {
			return !!source.replace(/<[^>]+>/g, '').replace(/&nbsp;/gi, ' ').trim();
		}
		var div = document.createElement('div');
		div.innerHTML = source;
		var text = (div.textContent || div.innerText || '').replace(/\s+/g, '');
		if (text) return true;
		return !!div.querySelector('table, img, svg, .ct-word-doc, hr');
	}

	function renderPreviewEmptyState() {
		return React.createElement('div', { className: 'ct-preview-empty', role: 'status' },
			React.createElement('p', { className: 'ct-preview-empty__text' }, '请先导入Word文件或编辑内容进行预览')
		);
	}

	function buildTableHtml(rows, cols) {
		var r = rows || 3;
		var c = cols || 3;
		var html = '<table class="ct-doc-table"><tbody>';
		for (var i = 0; i < r; i++) {
			html += '<tr>';
			for (var j = 0; j < c; j++) html += '<td>&nbsp;</td>';
			html += '</tr>';
		}
		return html + '</tbody></table><p><br></p>';
	}

	var CATEGORY_OPTIONS = [
		{ value: 'lease', label: '商用车租赁合同', desc: '商用车租赁标准合同' }
	];

	var DOCUMENT_SECTION_TABS = [
		{ key: 'main', label: '合同主体' },
		{ key: 'lease_order', label: '租赁订单', markers: ['<b>1：租赁订单 </b>', '附件 1：租赁订单', '附件1：租赁订单', '附件 1：', '附件1：', '附件 1', '附件1'] },
		{ key: 'vehicle_cost', label: '车辆产生的费用', markers: ['附件2:车辆产生的费用', '附件2：车辆产生的费用', '附件2:', '附件2：', '附件2'] },
		{ key: 'safety_notice', label: '安全责任告知书', markers: ['附件3:安全责任告知书', '附件3：安全责任告知书', '附件3:', '附件3：', '附件3'] },
		{ key: 'dynamic_supervision', label: '重型普通货运车辆租赁动态监管责任告知与确认书', markers: ['附件4：重型普通货运车辆租赁动态监管责任告知与确认书', '附件4:'] },
		{ key: 'safety_commitment', label: '安全责任承诺书', markers: ['<b>附件5：</b>', '<b>安全责任承诺书</b></p><p class="ct-word-body">为严格落实', '附件5：', '附件5:'] },
		{ key: 'vehicle_spec', label: '车辆使用规范和驾驶员要求', markers: ['<b>附件6：车辆使用规范和驾驶员要求</b>', '附件6：车辆使用规范和驾驶员要求', '附件6:'] },
		{ key: 'authorization', label: '授权委托书', markers: ['font: 28.0px Times; color: #000000"><b>授权委托书</b>', '<b>授权委托书</b></p><p class="ct-word-body">致：', '<b>授权委托书</b><b></b></p><p class="ct-word-body">致：'] },
		{ key: 'safety_agreement', label: '安全责任协议', markers: ['data-risk-redline="1"><b>安全责任协议</b></span></p>', '<b>安全责任协议</b></p><p class="ct-word-body"><br></p><p class="ct-word-body"><b>甲方（出租方）：</b>', '<b>安全责任协议</b></p><p class="ct-word-body"><br></p>'] }
	];
	var SECTION_VISIBLE_TAB_COUNT = 4;

	function escapeAttr(value) {
		return String(value || '').replace(/&/g, '&amp;').replace(/"/g, '&quot;');
	}

	function findFirstMarker(source, markers) {
		var text = String(source || '');
		var best = -1;
		(markers || []).forEach(function (marker) {
			var idx = text.indexOf(marker);
			if (idx >= 0 && (best < 0 || idx < best)) best = idx;
		});
		return best;
	}

	function emptySectionMap() {
		var map = {};
		DOCUMENT_SECTION_TABS.forEach(function (tab) { map[tab.key] = ''; });
		return map;
	}

	function splitMonolithicHtml(html) {
		var source = String(html || '');
		var result = emptySectionMap();
		if (!source.trim()) return result;
		var splitPoints = [];
		DOCUMENT_SECTION_TABS.slice(1).forEach(function (tab) {
			var idx = findFirstMarker(source, tab.markers || [tab.label]);
			if (idx >= 0) splitPoints.push({ key: tab.key, index: idx });
		});
		splitPoints.sort(function (a, b) { return a.index - b.index; });
		var deduped = [];
		splitPoints.forEach(function (point) {
			if (!deduped.length || deduped[deduped.length - 1].index !== point.index) deduped.push(point);
		});
		result.main = deduped.length ? source.slice(0, deduped[0].index) : source;
		for (var i = 0; i < deduped.length; i++) {
			var start = deduped[i].index;
			var end = i + 1 < deduped.length ? deduped[i + 1].index : source.length;
			result[deduped[i].key] = source.slice(start, end);
		}
		return result;
	}

	function splitHtmlIntoSections(html) {
		var source = String(html || '');
		if (!source.trim()) return emptySectionMap();
		if (typeof document === 'undefined') return splitMonolithicHtml(source);
		var div = document.createElement('div');
		div.innerHTML = source;
		var sections = div.querySelectorAll('.ct-section');
		if (!sections.length) return splitMonolithicHtml(source);
		var map = emptySectionMap();
		sections.forEach(function (sec) {
			var id = sec.getAttribute('data-section-id');
			if (!id || !map.hasOwnProperty(id)) return;
			var clone = sec.cloneNode(true);
			var labelClone = clone.querySelector('.ct-section-label');
			if (labelClone) labelClone.parentNode.removeChild(labelClone);
			map[id] = clone.innerHTML;
		});
		return map;
	}

	function mergeSectionsToDocument(sectionMap) {
		return DOCUMENT_SECTION_TABS.map(function (tab) {
			var content = (sectionMap && sectionMap[tab.key]) ? String(sectionMap[tab.key]) : '';
			if (!content.trim()) return '';
			return '<section class="ct-section" data-section-id="' + tab.key + '" data-section-title="' + escapeAttr(tab.label) + '">' + content + '</section>';
		}).join('');
	}

	function getSectionTabLabel(key) {
		var tab = DOCUMENT_SECTION_TABS.find(function (item) { return item.key === key; });
		return tab ? tab.label : key;
	}

	var VEHICLE_BRAND_MODEL_CATALOG = [
		{ brand: '现代', models: ['帕力安牌4.5吨冷链车', '18吨氢燃料电池车', '9.6米厢式货车'] },
		{ brand: '苏龙', models: ['9.6米氢燃料电池车'] },
		{ brand: '飞驰', models: ['集卡头', '半挂车'] },
		{ brand: '跃进', models: ['4.2米冷链车'] },
		{ brand: '宇通', models: ['氢燃料电池客车'] }
	];

	function sectionAllowsVehicleBinding(sectionKey) {
		return !!sectionKey && sectionKey !== 'main';
	}

	function vehicleBindingKey(binding) {
		return String(binding.brand || '') + '|' + String(binding.model || '');
	}

	function parseVehicleBindingKey(key) {
		var parts = String(key || '').split('|');
		return { brand: parts[0] || '', model: parts[1] || '' };
	}

	function vehicleMatchesBindings(brand, model, bindings) {
		var list = bindings || [];
		if (!list.length) return true;
		return list.some(function (item) {
			return item.brand === brand && item.model === model;
		});
	}

	function formatVehicleBindings(bindings) {
		var list = bindings || [];
		if (!list.length) return '全部车型';
		return list.map(function (item) {
			return item.brand + ' · ' + item.model;
		}).join('；');
	}

	function formatPersonDisplayName(value) {
		var text = String(value || '').trim();
		if (!text) return '—';
		var dashIndex = text.indexOf('-');
		if (dashIndex >= 0 && dashIndex < text.length - 1) {
			return text.slice(dashIndex + 1).trim() || text;
		}
		return text;
	}

	function createEmptyListFilter() {
		return { keyword: '', status: '', defaultScope: '', vehicleBrand: '', vehicleModel: '' };
	}

	function hasActiveListFilters(filters) {
		if (!filters) return false;
		return !!(filters.keyword || filters.status || filters.defaultScope || filters.vehicleBrand || filters.vehicleModel);
	}

	function recordMatchesVehicleFilter(record, brand, model) {
		if (!brand && !model) return true;
		var bindings = record.vehicleBindings || [];
		if (!bindings.length) return true;
		if (brand && model) {
			return vehicleMatchesBindings(brand, model, bindings);
		}
		if (brand) {
			return bindings.some(function (item) { return item.brand === brand; });
		}
		return true;
	}

	function matchesListFilters(record, filters, sectionKey) {
		if (!filters) return true;
		var keyword = String(filters.keyword || '').trim().toLowerCase();
		if (keyword) {
			var vehicleText = formatVehicleBindings(record.vehicleBindings || []);
			var haystack = [
				record.versionName,
				record.versionNo,
				record.remark,
				record.creator,
				record.updater,
				vehicleText
			].join(' ').toLowerCase();
			if (haystack.indexOf(keyword) < 0) return false;
		}
		if (filters.status && record.status !== filters.status) return false;
		if (filters.defaultScope === 'only' && !record.isDefault) return false;
		if (filters.defaultScope === 'exclude' && record.isDefault) return false;
		if (sectionAllowsVehicleBinding(sectionKey)) {
			if (!recordMatchesVehicleFilter(record, filters.vehicleBrand, filters.vehicleModel)) return false;
		}
		return true;
	}

	function getLeaseDocumentSectionMap() {
		if (typeof V266_LEASE_DOCUMENT_HTML !== 'undefined' && V266_LEASE_DOCUMENT_HTML) {
			return splitMonolithicHtml(V266_LEASE_DOCUMENT_HTML);
		}
		return emptySectionMap();
	}

	function createSectionTemplate(params) {
		return Object.assign({
			category: 'lease',
			sectionKey: 'main',
			contentHtml: '',
			vehicleBindings: [],
			remark: '',
			isDefault: false,
			status: 'draft',
			versionNo: null
		}, params);
	}

	function buildInitialSectionTemplates() {
		var v266 = getLeaseDocumentSectionMap();
		var model18t = [{ brand: '现代', model: '18吨氢燃料电池车' }];
		var model45t = [{ brand: '现代', model: '帕力安牌4.5吨冷链车' }];
		var model96 = [{ brand: '苏龙', model: '9.6米氢燃料电池车' }];
		return [
			createSectionTemplate({
				id: 'st-main-1', sectionKey: 'main', versionNo: 'v1.00', versionName: '现代18吨车型-数智中心版',
				status: 'published', isDefault: true, contentHtml: v266.main || '',
				creator: '法务-王静', createTime: '2026-05-25 09:13', updater: '法务-王静', updateTime: '2026-05-25 09:13',
				remark: 'V26.6 现代18吨数智中心版标准合同；创建合同时将始终包含'
			}),
			createSectionTemplate({
				id: 'st-main-2', sectionKey: 'main', versionNo: 'v1.01', versionName: '2026年标准商用车租赁合同',
				status: 'published', contentHtml: v266.main || '',
				creator: '法务-王静', createTime: '2026-03-15 14:30', updater: '法务-王静', updateTime: '2026-03-15 14:30',
				remark: '通用主体条款'
			}),
			createSectionTemplate({
				id: 'st-main-3', sectionKey: 'main', versionNo: null, versionName: '2026年二季度草案',
				status: 'draft', contentHtml: v266.main || '',
				creator: '法务-李明', createTime: '2026-06-01 09:15', updater: '法务-李明', updateTime: '2026-06-01 09:15',
				remark: '待法务审核发布'
			}),
			createSectionTemplate({
				id: 'st-lo-1', sectionKey: 'lease_order', versionNo: 'v1.00', versionName: '通用租赁订单',
				status: 'published', isDefault: true, vehicleBindings: [], contentHtml: v266.lease_order || '',
				creator: '法务-王静', createTime: '2026-05-20 10:00', updater: '法务-王静', updateTime: '2026-05-20 10:00',
				remark: '适用全部车型'
			}),
			createSectionTemplate({
				id: 'st-lo-2', sectionKey: 'lease_order', versionNo: 'v1.01', versionName: '现代18吨专项租赁订单',
				status: 'published', vehicleBindings: model18t, contentHtml: v266.lease_order || '',
				creator: '法务-李明', createTime: '2026-05-22 11:30', updater: '法务-李明', updateTime: '2026-05-22 11:30',
				remark: '仅现代18吨车型使用'
			}),
			createSectionTemplate({
				id: 'st-vc-1', sectionKey: 'vehicle_cost', versionNo: 'v1.00', versionName: '车辆费用标准（通用）',
				status: 'published', isDefault: true, vehicleBindings: [], contentHtml: v266.vehicle_cost || '',
				creator: '法务-王静', createTime: '2026-05-18 09:00', updater: '法务-王静', updateTime: '2026-05-18 09:00',
				remark: ''
			}),
			createSectionTemplate({
				id: 'st-sn-1', sectionKey: 'safety_notice', versionNo: 'v1.00', versionName: '安全责任告知书',
				status: 'published', isDefault: true, vehicleBindings: [], contentHtml: v266.safety_notice || '',
				creator: '法务-王静', createTime: '2026-05-10 14:00', updater: '法务-王静', updateTime: '2026-05-10 14:00',
				remark: ''
			}),
			createSectionTemplate({
				id: 'st-ds-1', sectionKey: 'dynamic_supervision', versionNo: 'v1.00', versionName: '动态监管责任告知（9.6米）',
				status: 'published', isDefault: true, vehicleBindings: model96, contentHtml: v266.dynamic_supervision || '',
				creator: '法务-王静', createTime: '2026-05-12 16:00', updater: '法务-王静', updateTime: '2026-05-12 16:00',
				remark: '仅苏龙9.6米车型'
			}),
			createSectionTemplate({
				id: 'st-vs-1', sectionKey: 'vehicle_spec', versionNo: 'v1.00', versionName: '车辆使用规范（现代冷链）',
				status: 'published', isDefault: true, vehicleBindings: model45t, contentHtml: v266.vehicle_spec || '',
				creator: '法务-李明', createTime: '2026-05-14 10:30', updater: '法务-李明', updateTime: '2026-05-14 10:30',
				remark: '4.5吨冷链专项操作规范'
			}),
			createSectionTemplate({
				id: 'st-sc-1', sectionKey: 'safety_commitment', versionNo: 'v1.00', versionName: '安全责任承诺书',
				status: 'published', isDefault: true, vehicleBindings: [], contentHtml: v266.safety_commitment || '',
				creator: '法务-王静', createTime: '2026-05-11 09:30', updater: '法务-王静', updateTime: '2026-05-11 09:30',
				remark: ''
			}),
			createSectionTemplate({
				id: 'st-auth-1', sectionKey: 'authorization', versionNo: 'v1.00', versionName: '授权委托书',
				status: 'published', isDefault: true, vehicleBindings: [], contentHtml: v266.authorization || '',
				creator: '法务-王静', createTime: '2026-05-09 15:00', updater: '法务-王静', updateTime: '2026-05-09 15:00',
				remark: ''
			}),
			createSectionTemplate({
				id: 'st-sa-1', sectionKey: 'safety_agreement', versionNo: 'v1.00', versionName: '安全责任协议',
				status: 'published', isDefault: true, vehicleBindings: [], contentHtml: v266.safety_agreement || '',
				creator: '法务-王静', createTime: '2026-05-08 11:00', updater: '法务-王静', updateTime: '2026-05-08 11:00',
				remark: ''
			})
		];
	}

	function resolveRecordContentHtml(record) {
		if (!record) return '';
		if (record.contentHtml) return record.contentHtml;
		if (record.blocks && record.blocks.length) {
			var html = mergeBlocksToDocument(record.blocks);
			var sections = splitHtmlIntoSections(html);
			return sections[record.sectionKey || 'main'] || html;
		}
		return '';
	}

	function getDefaultSectionVersion(sectionKey, list) {
		var source = list || templates;
		var published = source.filter(function (item) {
			return item.sectionKey === sectionKey && item.status === 'published';
		});
		var def = published.find(function (item) { return item.isDefault; });
		return def || published[0] || null;
	}

	function resolveApplicableSectionKeys(brand, model, list) {
		var source = list || templates;
		return DOCUMENT_SECTION_TABS.map(function (tab) { return tab.key; }).filter(function (sectionKey) {
			if (sectionKey === 'main') return !!getDefaultSectionVersion(sectionKey, source);
			var version = getDefaultSectionVersion(sectionKey, source);
			if (!version) return false;
			return vehicleMatchesBindings(brand, model, version.vehicleBindings);
		});
	}

	function v266LeaseBlocks() {
		if (typeof V266_LEASE_DOCUMENT_HTML !== 'undefined' && V266_LEASE_DOCUMENT_HTML) {
			return [{ id: 'doc', title: '合同全文', locked: false, content: V266_LEASE_DOCUMENT_HTML }];
		}
		return [
			{ id: 'b1', title: '合同标题', locked: true, content: "商用车租赁合同" },
			{ id: 'b2', title: '合同编号', locked: true, content: "合同编号：【LNZLHT {{contractCode}} 】" },
			{ id: 'b3', title: '甲方（出租方）', locked: true, content: "甲方（出租方）：{{lessorName}}                 （盖章）\n地址：{{lessorAddress}}\n联系人：{{lessorContact}}\n联系电话：{{lessorPhone}}" },
			{ id: 'b4', title: '乙方（承租方）', locked: false, content: "乙方（承租方）：{{customerName}}                                （盖章）\n统一社会信用代码：{{creditCode}}\n地址：{{customerAddress}}\n联系人：{{customerContact}}\n联系电话：{{customerPhone}}" },
			{ id: 'b5', title: '正文部分', locked: false, content: "<p><strong>（正文部分）</strong></p><p>本合同经双方平等自愿协商，根据《中华人民共和国民法典》及相关法规，就甲方向乙方提供氢燃料电池车租赁服务之事宜，达成如下一致条款，以资共同遵守。</p><p><strong>第一条 租赁标的、服务内容、租期、里程</strong></p><p>租赁标的：租赁车辆信息及租金价格、保证金标准详见《租赁订单》（附件1）。</p><p style=\"margin-left:12px\">1.2 服务内容：甲方根据乙方的需求，为乙方提供符合约定的商用车供乙方合法使用，并提供有偿非车辆质量问题导致的车辆故障、事故救援服务。</p><p style=\"margin-left:12px\">1.3 租期：以双方签订的《租赁订单》（附件1）为准。约定的租期届满，若双方对租赁订单的内容没有变更，且任何一方未提出终止合同的，租赁期限顺延，顺延的期限与本次租赁订单的期限相同。若租赁订单内容有变更，双方签署新的《租赁订单》，租金价格、租期等相关内容，以新的《租赁订单》为准，《租赁订单》未约定的内容，仍以本合同的约定为准。</p><p style=\"margin-left:12px\">1.4 里程：乙方承诺按如下约定完成公里数（请在方框里用“√”进行选择。）</p><p style=\"margin-left:12px\">1.4.1 Ρ每月完成【   】公里；</p><p style=\"margin-left:12px\">1.4.2 ≤每季度完成【   】公里。</p><p>若乙方未完成本合同中约定的里程，甲方有权将车辆强制收回，甲方不承担违约责任。</p>" },
			{ id: 'b6', title: '租金、费用及支付', locked: false, content: "<p><strong>第二条 租金、费用及支付</strong></p><p style=\"margin-left:12px\">2.1 租金的结算及支付</p><p style=\"margin-left:12px\">2.1.1 租金、服务费先付后用，每【 】个自然月为一个付款周期，每个付款周期末月的25日向甲方支付下个周期的租金和服务费，如25日为节假日的，付款日顺延至节假日后的第一个工作日。</p><p style=\"margin-left:12px\">2.1.2 保证金和首期租金及服务费支付：①提车日为当月15日前（含15日）的，于提车前2日内支付保证金和当月剩余天数租金及服务费，当月25日支付下个付款周期的租金及服务费；②提车日为当月15日后的，于提车前2日内支付保证金和当月实际剩余天数和下个付款周期的租金及服务费。</p><p style=\"margin-left:12px\">2.1.3 提车或还车当月的租金及服务费，以当月实际租赁天数按比例计算，计算公式如下：【（月租金+月服务费）/30】*当月实际租赁天数支付（金额取数按四舍五入取整到单位“元”）。</p><p style=\"margin-left:12px\">2.1.4 租赁期间非因车辆自身质量原因造成的租赁车辆无法上路、无法使用等情况的，乙方仍应按本合同约定支付租金及服务费。包括本条2.3.1中约定的其他费用。</p><p style=\"margin-left:12px\">2.1.5租金减免条件：</p><p style=\"margin-left:12px\">2.1.5.1基础减免：当月行驶里程达到6000公里及以上的，次月可享受2000元/辆的租金减免，当月行驶里程未达6000公里的，次月不享受租金减免。</p><p style=\"margin-left:12px\">2.1.5.2里程补足与累计：次月行驶里程可用于补足上月（截至2026年5月31日之前的月份）未达6000公里的差额部分，补足后可补享上月对应的租金减免，当月行驶里程超过6000公里的部分，可累计计入次月里程。</p><p style=\"margin-left:12px\">2.1.5.3连续周期减免：若连续两个月累计行驶里程达到12000公里，该两个月均能享受租金减免。</p><p style=\"margin-left:12px\">2.1.5.4持续达标减免：若租赁期间每月行驶里程均满6000公里，可每月享受次月2000元/辆的租金减免（若租期为1年，第12个月里程达标对应的减免，在第13个月租金结算时执行）。</p><p>本租金减免政策有效期至2026年12月31日止。</p><p style=\"margin-left:12px\">2.2 氢气费（含加氢相关服务费）</p><p style=\"margin-left:12px\">2.2.1 氢气原则上由乙方自行解决。如需甲方安排加氢的，先款后货、全额预付款支付及结算。乙方提前预估当月用气总量并计算氢气费用后将氢气预付款【    】元提前【   】个工作日内转账给甲方，甲方在收到乙方预付款后安排加氢。乙方预付款不足【   】元时，乙方接到甲方通知后2个工作日内支付预付款；否则，甲方有权不予安排车辆加氢气，由此造成的一切损失由乙方承担，给甲方造成损失的，乙方还应承担赔偿责任。</p><p style=\"margin-left:12px\">2.2.3每月25日核对上月25日至本月24日的用气对账单，有异议2个工作日内提出，双方重新核对账单，账单核对无误后，对核对无误的账单书面确认。</p><p style=\"margin-left:12px\">2.2.4 氢气价格按市场价随行就市调整。</p><p style=\"margin-left:12px\">2.2.5 乙方还车时车里剩余氢气量若低于交车时的氢气量，则按照【    】元/公斤向甲方支付氢气费，若高于交车时的氢气量，乙方同意甲方不向乙方返还氢气费。</p><p style=\"margin-left:12px\">2.2.6 租赁车辆充电产生的电费及与充电相关的费用由乙方承担。租赁车辆原则上优先选择甲方经营的充电桩充电，若选择甲方经营的充电桩充电，费用结算方式为现结。</p><p style=\"margin-left:12px\">2.3 其他费用</p><p style=\"margin-left:12px\">2.3.1 租赁期间车辆产生的其他费用，包括但不限于非质量问题产生的车辆维修费、保养费、违章费用、施救费、证照补办费用、改装费、违约金、能耗费、路桥费及乙方要求增加购买其他保险的费用等，均由乙方全额另行承担。</p><p style=\"margin-left:12px\">2.4 垫付费用：本合同中若甲方垫付费用的，乙方应在甲方通知后【3】个工作日内一次性足额支付给甲方。</p><p style=\"margin-left:12px\">2.5 甲方收款账户</p><p style=\"margin-left:12px\">2.5.1乙方应将上述租金、服务费、保证金、氢气费及其他费用统一汇入甲方如下指定账户，否则视为未支付：</p><p>户 名：【羚牛氢能科技（广东）有限公司  】</p><p>开户行：【招商银行广州萝岗支行 】</p><p>账 号：【120924165110201 】</p><p style=\"margin-left:12px\">2.5.2 本合同所涉及的所有费用均通过银行转账的方式支付至甲方上述指定账户。甲方不会以任何方式允许甲方人员通过个人账户收取本合同所涉及的各项费用，若甲方人员要求将本合同项下产生的各项费用汇至其个人账户或其他账户，乙方可拨打甲方24小时服务热线：400-021-1773。</p><p style=\"margin-left:12px\">2.5.3 乙方将本合同所涉及的费用汇入甲方指定上述收款账户之外的任何账户导致的损失，由乙方自行承担，同时乙方仍须按本合同约定向甲方支付各项费用。</p><p style=\"margin-left:12px\">2.6 发票</p><p style=\"margin-left:12px\">2.6.1 乙方开票信息如下：</p><p>企业名称：</p><p>开户银行：</p><p>银行账号：</p><p>纳税人识别号：</p><p>企业地址：</p><p>企业电话：</p><p style=\"margin-left:12px\">2.6.2甲方收到乙方支付的租金和服务费后分别开具等额的增值税发票。若乙方变更开票信息，乙方需在付款周期15日前书面告知甲方，否则所产生的损失由乙方承担。若国家发布新的税收政策导致税率变化，甲方按最新政策开具发票，乙方支付的总价款不变。</p><p style=\"margin-left:12px\">2.6.3 甲方除开具租金和服务费发票外，本合同中的其他费用，甲方不向乙方开具对应的服务费发票。</p><p style=\"margin-left:12px\">2.7 乙方款项抵扣</p><p>乙方应及时足额地支付租赁费、服务费、保证金以及其他应当由乙方承担的各项费用；乙方存在任何应付未付费用时，甲方有权从保证金、应返还乙方的保险理赔款以及乙方在甲方处的其他款项中先行抵扣，不足部分，乙方应及时补足。</p><p style=\"margin-left:12px\">2.8 碳资产</p><p>本合同约定仅限于车辆使用，该车辆所产生的碳资产数据权益和碳资产收益归甲方所有，本合同报价不含减碳、碳资产管理费用等。</p>" },
			{ id: 'b7', title: '交车与车辆管理', locked: false, content: "<p><strong>第三条 交车与还车</strong></p><p style=\"margin-left:12px\">3.1 本合同签署前，乙方需提供如下有效证据资料：包括但不限于营业执照、法定代表人身份证复印件、驾驶员驾驶证、驾驶员从业资格证等。复印件留存甲方，原件查验后退回。</p><p style=\"margin-left:12px\">3.2 租赁车辆交付时，乙方应对租赁车辆状况及附属设施、有效证件标志进行现场检验，确认无误后应在《交接车验收清单》上签字/盖章确认。提车后，非车辆质量问题产生的一切风险由乙方承担。</p><p style=\"margin-left:12px\">3.3 还车时，乙方负责将租赁车辆归还至甲方指定的还车地点。 乙方还车时，应携带提车时签订的《交接车验收清单》，经甲方检查车辆确认无误后，双方签署《交接车验收清单》，确认还车。</p><p style=\"margin-left:12px\">3.4 返还车辆除正常使用耗损外，车辆信息与《交接车验收清单》保持一致，无任何毁损，证照齐全，无未处理交通违章、交通事故等不存在未决纠纷争议可能影响甲方利益情形。否则，甲方有权拒绝接收车辆，乙方应在限期内整改，整改期内日租金按两倍日租金标准继续计算，直至车辆符合交还标准；如乙方拒绝或超过十五天仍未完成整改的，甲方有权强制收回车辆并送至修理厂进行修复或调整，因此产生的运输费、修理费等费用以及处理交通违章、事故等发生的一切费用，均由乙方全额承担。</p><p><strong>第四条 车辆的风险与管理</strong></p><p style=\"margin-left:12px\">4.1 车辆自交付乙方之时起，车辆发生损毁、灭失、被盗、遗失等风险的，由乙方承担。乙方应赔偿甲方全部损失，但该损失是因车辆自身质量问题导致的除外。租赁期间，因租赁车辆引发的甲方、乙方、乙方聘用人员或第三者损失的，乙方应承担全额赔偿责任。</p><p style=\"margin-left:12px\">4.2 车辆自交付乙方之时起，乙方负责车辆相关安全保管义务和日常管理，乙方应在本合同约定的使用区域内使用车辆，使用车辆时应符合国家、地方的相关法律法规、规章制度，遵守交通规则，禁止超速、超载，禁止装载易燃易爆、易腐蚀等危险物品及在车中留下刺激性气味的物品。</p><p style=\"margin-left:12px\">4.3 租赁期间，乙方装载4.2条中禁止装载的物品，或车辆发生交通事故或其他安全、意外事故，造成甲方、乙方、第三方财产损失或人身损害、车辆损失、设备损失，或导致包括但不限于有关部门的罚金或罚分、行政处罚等一切责任的，均由乙方承担全部责任。给甲方造成的损失或者导致甲方承担责任的，乙方除承担本条前述的全部责任外，还须承担甲方的间接损失、可得利益等。如导致甲方赔偿的，甲方有权向乙方追偿。</p><p style=\"margin-left:12px\">4.4 租赁车辆的车身外观、车身广告等权益由甲方享有，未经甲方书面同意，乙方不得擅自更改车身外观，增加车身广告等。否则必须恢复车辆原状，若未恢复的，根据实际发生的费用向甲方支付修复费用，此费用甲方有权从保证金中直接扣除，不足部分，另行向甲方支付。</p><p style=\"margin-left:12px\">4.5 无论乙方自身运营或聘用他人运营标的车辆，乙方承诺自身或聘用第三人具备运营车辆的全部证照，乙方对聘用人员证照负有审核义务，证照包括但不限于营业执照、组织机构代码、车辆驾驶人员驾驶证、身份证、道路运输许可证（如进行营运的）、运输人员从业资格证等，乙方对证照的真实性、有效性以及完整性负责，并就该第三人驾驶或使用标的车辆的行为所产生的一切法律责任承担无限连带责任，如导致甲方赔偿的，甲方有权向乙方追偿。在签订合同时，乙方应向甲方出示原件并提供全部证照复印件备案，如驾驶人员发生变更的，乙方应在变更前将全部证照提供给甲方备案。</p><p style=\"margin-left:12px\">4.6 未经甲方书面同意，乙方不得将租赁车辆以转让、出借、转租、合租等任何方式许可任何第三方使用，不得设立任何形式抵押、留置、质押等权利负担，不得擅自改装（安装）车辆或拆除车辆设施、设备、标记、广告等，不得拆卸、更换车辆零部件，不得将车辆的行驶证件及相关手续、车辆号牌以任何方式许可第三方使用。</p><p><strong>第五条 车辆的维修、保养</strong></p><p style=\"margin-left:12px\">5.1 租赁期间，乙方应按照驾驶技术规范及该车使用说明书等规定的要求使用、保养车辆，坚持“三检三查”制，确保车辆技术状况符合规范和要求。甲方有权对车辆的技术状况进行定期或不定期的检查，并根据检查情况要求乙方修复。</p><p style=\"margin-left:12px\">5.2 乙方应每天对刹车油、防冻液、刹车片、轮胎、轮胎气压、灯光等做常规检查，如发现问题，应及时到甲方指定的维修站进行维修，并及时向甲方报备维修情况。</p><p style=\"margin-left:12px\">5.3 租赁期间，租赁车辆损坏的，乙方应在甲方指定维修站对车辆进行维修、保养，将车辆修复至符合有关技术规范标准的状态，费用由乙方全额承担，并在3日内通知甲方，将维修、保养相关单据的原件交回甲方留存。如需在指定维修站以外维修、保养车辆的，应征得甲方书面同意，否则属于乙方违约，乙方应按2000元/次的标准向甲方支付违约金。</p><p style=\"margin-left:12px\">5.4 租赁期间，乙方应负责保管车辆及GPS等设施设备，进行定期或不定期的检修、检测，确保其性能可靠、使用正常。如造成车辆及设施设备损坏、过度磨损或遗失、损毁、失效的，由乙方负责照价赔偿甲方。</p><p style=\"margin-left:12px\">5.5 乙方另行购买甲方维保服务的，甲方所提供维保服务仅限车辆日常的技术指导、使用培训、易损件的维修更换服务，不含车辆维修等其他服务。</p><p style=\"margin-left:12px\">5.6 非因车辆自身质量问题产生的车辆维修费用及拖车费由乙方全额承担。费用以维修站的价格为准。</p><p style=\"margin-left:12px\">5.7 因发生车辆故障、交通事故等情形，甲乙双方对是否属于车辆质量缺陷导致、车损价值等无法达成一致意见的，双方可委托共同认可的第三方机构进行评估、鉴定。鉴定、评估前费用由双方共同平均分担，评估后鉴定结果属于甲方全部或部分责任的，鉴定、评估费由甲方全部或部分承担，甲方应向乙方支付乙方承担的全部或部分鉴定、评估费；不属于甲方责任或属于甲方部分责任的，鉴定、评估费由乙方全部或部分承担，乙方应向甲方支付甲方先行承担的全部或部分鉴定费、评估费。乙方未响应甲方办理评估、鉴定委托事宜通知的，甲方可单方委托第三方机构进行评估鉴定。</p><p><strong>第六条 保险、事故、动态违规及违章处理</strong></p><p style=\"margin-left:12px\">6.1 甲方负责的保险</p><p style=\"margin-left:12px\">6.1.1 若租金中已含租赁车辆的交强险及商业险（包括三者险、车损险）保险费用，乙方对甲方所投保险险种及保额没有异议。如乙方要求增加险种或提高保险额度的，乙方应在租金标准外另行向甲方支付保险费用，由甲方负责向甲方合作的保险服务商购买保险。</p><p style=\"margin-left:12px\">6.1.2 若租金中不包含租赁车辆的交强险或商业险保险费用，乙方需按照甲方要求的保险险种委托甲方代为购买，乙方应另行向甲方支付保险费用。若标的车辆保险费用已经由甲方先行购买的，乙方应将相应保险费用支付给甲方。如遇租期内续保，乙方应在甲方通知后【3】个工作日内将相应保险费用支付给甲方。</p><p style=\"margin-left:12px\">6.2 乙方负责的保险</p><p style=\"margin-left:12px\">6.2.1 汽车车上人员责任保险（驾驶员、车上其他人员）由乙方购买：乙方应为使用该车辆的驾驶员及车上其他人员购买责任保险，租赁期内所发生的与乙方驾驶员及车上其他人员相关的一切财产、人身损失等由乙方承担，若给甲方造成损失的，乙方需向甲方承担赔偿责任。</p><p style=\"margin-left:12px\">6.2.2 货物保险：乙方应自行购买货物运输相关保险，并自行承担所有管货责任。租赁期内，无论何种原因导致乙方货物毁损、灭失、污染、变质、损耗、短少等异常情况，甲方均免责。乙方投保时，亦应向保险人要求豁免甲方责任，即使货物异常是由于甲方车辆问题所致，甲方亦不承担任何赔偿责任。</p><p style=\"margin-left:12px\">6.3 事故报告</p><p style=\"margin-left:12px\">6.3.1在租赁期内，车辆发生安全事故的，乙方应在1小时内如实报告公安交通管理机关、甲方和甲方安全部及保险公司，并配合甲方处理，且到甲方指定的维修站进行维修，若乙方隐瞒事故真实情况、虚构事故情况等或未在甲方指定维修站进行维修的，需向甲方承担3000元/次/辆违约金。当需要办理保险理赔事项时，乙方应协助甲方办理保险理赔手续，因协助办理所产生的费用由乙方承担，若不配合甲方处理安全事故或者不协助办理保险理赔事项的，须向甲方承担500元/次/辆违约金。本条项下全部应付违约金，统一并入下一租金付款周期同步结算。</p><p style=\"margin-left:12px\">6.3.2 如乙方怠于履行本合同约定义务导致无法办理保险理赔或保险公司拒赔、免赔的，全部损失和法律责任由乙方承担，造成甲方或第三方损失的，乙方应予以赔偿。</p><p style=\"margin-left:12px\">6.4 出险</p><p style=\"margin-left:12px\">6.4.1 租赁期间，如车辆发生安全事故造成损失超出保险公司赔付金额的，超出部分的损失由乙方全额承担。</p><p style=\"margin-left:12px\">6.4.2 租赁期间，租赁车辆出险并办理保险理赔的，乙方应每次向甲方支付保险上浮费，18吨车型主责及以上责任为3000元/次/辆，其他责任为2000元/次/辆（驾驶员无责除外）。如乙方自车辆出险之日起 5个工作日内未向甲方支付上述保险上浮费，则甲方有权直接从车损险理赔款项中扣除对应的保险上浮费，若车损险理赔款项不足以覆盖乙方应向甲方支付的保险上浮费，差额部分乙方须于下一租金支付周期内，连同当期租金及其他应付费用一并结清。</p><p style=\"margin-left:12px\">6.4.3 乙方出险进保，应征得甲方书面同意。如事故损失总金额不满足甲方进保理赔标准的（2000元里面不允许进保，），由乙方向甲方报备后自行到甲方指定维修站维修并由乙方自行承担相应费用，无需办理保险理赔手续。如乙方在未征得甲方书面同意前提下向保险公司报案赔付的，须向甲方承担2000元/次/辆违约金，同时，甲方不向乙方支付任何保险理赔款，若保险理赔款直接打入乙方账户的，乙方需将保险理赔款返还给甲方。</p><p style=\"margin-left:12px\">6.4.4 保险上浮费和超出保险公司赔偿的部分，甲方有权从保险理赔款中先行抵扣，如保险理赔款有剩余且应支付给乙方的，在乙方不存在到期应付未付款项时，甲方在收到理赔款后 15个工作日内无息支付给乙方，如保险理赔款直接赔付给第三方的，则乙方应在甲方通知后3个工作日内支付给甲方，且甲方有权从保证金中直接抵扣。</p><p style=\"margin-left:12px\">6.4.5 单车事故进保审批​</p><p style=\"margin-left:12px\">6.4.5.1 租赁期间，因乙方违反限高、限速、限重等交通管理规定或操作规范导致的单车事故，原则上不予办理保险理赔，相关车辆维修、施救等全部费用由乙方自行承担。​</p><p style=\"margin-left:12px\">6.4.5.2 若乙方因特殊情况申请对本条 6.4.5.1 约定的单车事故进行保险理赔（以下简称 “进保申请”），需向甲方提交书面申请，并附事故现场照片、交警部门出具的事故认定书（如有）、车辆损失评估报告等相关证明材料。​</p><p style=\"margin-left:12px\">6.4.5.3 甲方收到乙方进保申请后，由甲方在收到材料后【5】个工作日内完成审批并出具意见。</p><p style=\"margin-left:12px\">6.4.5.4 仅甲方审批通过，甲方才协助办理理赔，未经审批擅自进保的，乙方支付【2000】元/次辆违约金，且承担全部保险费用及理赔损失。​</p><p style=\"margin-left:12px\">6.4.5.5 经甲方审批通过的进保，乙方仍需按 6.4.2 条支付保险上浮费，甲方可根据情况要求乙方额外承担评估费、手续费等。</p><p style=\"margin-left:12px\">6.5 安全教育</p><p style=\"margin-left:12px\">6.5.1 乙方发生交通事故或者安全事故的，甲方有权对乙方及乙方驾驶员进行教育培训。</p><p style=\"margin-left:12px\">6.5.2 在租赁期内，若乙方发生一般有责事故及以上事故，乙方必须做到：①查清事故原因；②严肃处理事故责任者；③对车辆事故的驾驶员进行教育培训；④落实防范措施。若甲方做过安全教育培训的，还需向甲方提供安全教育会议内容、安全教育签到表、现场至少三张照片。若乙方未做到前述事项的，须向甲方承担1000元违约金。</p><p style=\"margin-left:12px\">6.5.3若乙方发生三次或者三次以上（含三次）以及一个星期连续发生两次及两次以上（含两次）安全事故或者交通事故的，甲方有权对乙方及乙方驾驶员进行安全教育培训，乙方必须参加甲方组织的教育培训活动，乙方接到甲方教育培训未按时参加的，需向甲方承担1000元违约金。如乙方经甲方约谈教育后仍发生事故，视为乙方严重违约，甲方有权单方面无条件强制收回租赁车辆，无需承担任何违约责任。收车过程中产生的拖车费、保管费、运输费、场地占用费等一切相关费用，均由乙方承担；同时，因乙方前述违约行为造成甲方全部损失（含但不限于行政罚款、赔付款项、律师费、诉讼费、保全费、差旅费等），均由乙方全额承担，甲方有权从保证金中直接抵扣，保证金不足以清偿的，甲方有权向乙方继续追偿剩余款项。</p><p style=\"margin-left:12px\">6.5.4动态监控违规管理：</p><p style=\"margin-left:12px\">6.5.4.1一般违规：租赁期限内，因驾驶员违规行为产生属实动态监控预警风险的，乙方按以下标准承担违约金：首次50元/次，第二次100元/次，第三次及以上违规500元/次，乙方应当在甲方通知违规之日起1个自然日内支付给甲方，逾期未支付的，乙方须在次月车辆租金结算时一并向甲方支付。乙方更换新驾驶员须提前向甲方书面报备，人员更换后违规次数将重新计算。</p><p style=\"margin-left:12px\">6.5.4.2 严重违规处置及车辆收回：租赁期限内，车辆因违规导致动态监控风险属实，连续2个月被交管部门通报的，甲方有权要求乙方在第2个自然月底起将车辆停运1个月，停运期间正常计收租金。为避免车辆营运证连续3个月通报导致被注销，乙方须严格遵照甲方停运要求执行，乙方拒不配合停运的，视为严重违约，甲方有权单方无条件强制收回租赁车辆，无需承担任何违约及赔偿责任。若因乙方拒不配合收车、违规持续营运造成车辆营运证被注销的，乙方须全额承担营运证注销后6个月内全部车辆租金。车辆强制收回过程中产生的拖车费、停放保管费、转运费、场地使用费等全部费用均由乙方承担。因乙方前述违约行为给甲方造成的全部损失（含但不限于行政罚款、赔偿金、律师费、诉讼费、保全费、差旅费等），均由乙方全额承担，甲方有权从车辆保证金中直接抵扣，保证金不足以清偿的，甲方有权就剩余差额向乙方另行追偿。</p><p style=\"margin-left:12px\">6.6 违章处理</p><p style=\"margin-left:12px\">6.6.1车辆发生违法违规的，乙方应及时处理车辆违章并承担处理费用（违章，最晚应在甲方通知后15个自然日内处理完毕）。乙方超过15天未处理的，甲方有权代办处理，并向乙方发送强办告知函，明确强办时间、强办费用，强办处理的收费标准以附件2的约定为准。同时，甲方有权按一条违章信息1200元的标准（广东区域内为2000元/条），向乙方收取违约金；违约金金额不足以覆盖甲方损失时，乙方还应承担赔偿责任。</p><p style=\"margin-left:12px\">6.6.2在处理违章过程中，乙方必须遵循如下驾驶证使用限制：车辆租赁期限6个月以下的（含6个月），仅限于一本驾驶证处理违章，租赁期限超过6个月的，仅限于两本驾驶证处理违章，乙方处理违章超过前述限制的，须向甲方承担 5000元/ 次/辆的违约金。租赁满一个记分周期可使用三本驾驶证。</p><p style=\"margin-left:12px\">6.7 年检年审配合</p><p style=\"margin-left:12px\">6.7.1甲方负责办理车辆年检年审等相关证照手续，乙方应积极配合，在甲方通知的时间内将车辆开到指定地点。乙方完全明白且理解，车辆的年检年审等检验检测工作，是车辆依法、安全运营的基本保障，如乙方未能在甲方通知时间内将车辆开到甲方指定地点，属于乙方严重违约行为，不论最终是否顺利完成相关检验检测手续，乙方均应向甲方支付2000元/次的违约金。</p><p style=\"margin-left:12px\">6.7.2车辆年审过程中发现有未处理违章罚分、罚款等，经甲方以口头、电话、短信、微信及其他方式等前述任一方式告知乙方后，乙方在【3】个工作日内仍未履行的，甲方有偿代办处理，代办处理费用同6.6.1条规定。</p><p style=\"margin-left:12px\">6.7.3 乙方应按有关规定使用车辆，不得私自改装车辆，如需改装应经甲方同意，保证车辆在年检时符合要求，如年检不合格，乙方应自费维修整改，经维修整改后仍不合格的，乙方应赔偿甲方重新购买同款同型车辆及设施设备的全部费用。如乙方未经甲方同意，私自拆卸、改装车辆核心零部件，视为乙方严重违约，由此产生的一切责任和后果均由乙方承担；如因此造成车辆严重安全隐患，乙方须根据甲方要求，按照该车辆购买价（以发票金额为准）的两倍购买该改装车辆。</p><p style=\"margin-left:12px\">6.7.4 租赁期间，车辆相关证照遗失、被盗、毁损的，甲方可以协助补办，乙方应承担补办证照发生的费用（包括但不限于差旅费、工本费、官费等）；具体费用标准以附件2约定的为准。在证照办理期间，租赁费用不停止计费。</p><p><strong>第七条 调换车辆和备用车辆服务标准</strong></p><p style=\"margin-left:12px\">7.1 甲方有权根据实际运营情况，对已经出租给乙方的车辆进行调换，但调换车辆应是同类型车辆，并提前15天通知乙方，若乙方不同意，甲方有权强制收车，终止与乙方的合作，本合同即终止，双方均不承担违约责任。</p><p style=\"margin-left:12px\">7.2 在租赁期内，如非因车辆自身质量问题导致维修的，维修期间，乙方可向甲方申请备用车辆，在征得甲方同意后，交付备用车辆供乙方使用，乙方应按照交付车辆类型对应的租金标准另行向甲方支付租金、保险费等租赁费用。</p><p style=\"margin-left:12px\">7.3 调换车辆和备用车辆交还车流程参照本合同相应条款的约定。</p>" },
			{ id: 'b8', title: '违约责任', locked: true, content: "<p><strong>第八条 违约责任</strong></p><p style=\"margin-left:12px\">8.1如乙方违反本合同项下任何约定（含保证人违约），视为乙方违约，乙方应当按照现行法律法规及本合同约定向甲方承担违约责任，且甲方有权采取如下一种或者多种救济措施以维护其权利：</p><p style=\"margin-left:12px\">8.1.1要求乙方在5日内补正或采取补救措施，未在5日内整改补正的，甲方有权书面通知乙方单方终止本合同或终止所涉车辆租赁关系。</p><p style=\"margin-left:12px\">8.1.2要求乙方赔偿甲方的经济损失。乙方致使甲方承担任何费用、责任或者遭受任何损失的，乙方应就前述任何费用、责任或者损失向甲方进行赔偿，这些费用、损失包括甲方向第三方支付的或导致第三方遭受的赔偿金、违约金等费用及损失。</p><p style=\"margin-left:12px\">8.1.3要求乙方承担因乙方行为导致甲方进行各类诉讼或者仲裁而产生的费用，包括但不限于诉讼费、律师费、保全费、公证费、鉴定费、人员工资、差旅费等，且这些费用不应包含在本合同约定的违约金中。</p><p style=\"margin-left:12px\">8.2 乙方同意并确认，如乙方违反本合同项下任何一项约定、任何承诺和保证，除本合同另有特别约定外，乙方应按5000元/次的标准向甲方支付违约金。致使甲方承担任何费用、责任或者遭受损失的，乙方应就上述任何费用、责任或者损失（包括但不限于因违约而支付或损失的利息以及律师费）向甲方另行赔偿。</p><p style=\"margin-left:12px\">8.3 本合同履行期内，乙方逾期支付租赁费、保证金以及应支付的其他任何费用的，每逾期一日，应向甲方支付应付款项千分之三的违约金，且甲方有权锁车再进行协商处理；超过当期结算日期3天仍未支付相关费用，甲方有权提前终止本合同并强制收回车辆。</p><p style=\"margin-left:12px\">8.4 乙方根据法律及本合同约定应向甲方支付费用、赔偿损失或承担其他法律责任，在乙方未能全面履行时，甲方可从保证金中直接进行等额抵扣，不足部分仍由乙方承担，且乙方应在甲方书面通知后3个工作日内补足保证金至本合同约定数额，否则，每逾期1日，乙方每日按照应付未付保证金金额的千分之三向甲方支付违约金。</p><p style=\"margin-left:12px\">8.5 在租赁期内，乙方使用标的车辆超载、超速或有其他违反交通规范行为但未造成损失的，法律责任由乙方承担，甲方给予乙方警告处理，后续若拒不纠正再次发生的，乙方应向甲方支付2000元/次违约金，达到提前终止合同条件的，甲方有权提前终止合同并强制收回车辆。</p><p style=\"margin-left:12px\">8.6 若因乙方未按1.4条完成里程，造成甲方或车辆厂商不能或未能足额申领国家、地方补贴的，差额部分由乙方负责赔偿给甲方或车辆厂商，导致甲方赔偿的，甲方有权向乙方追偿。</p><p style=\"margin-left:12px\">8.7 乙方按照本合同约定向甲方支付违约金的，如同一违约情形下违约金约定不一致的，以约定较高标准的违约金为准，如同一违约情形下设定不同类型违约金的，违约金应累计计算，如违约金不足以弥补甲方损失的，乙方另行向甲方补足。</p>" },
			{ id: 'b9', title: '合同终止及其他', locked: true, content: "<p><strong>第九条 合同终止、解除</strong></p><p style=\"margin-left:12px\">9.1 因不可抗力或行业主管部门的要求，致使本合同无法继续履行的，甲乙双方均有权提前终止本合同，双方均不承担违约责任，在乙方向甲方结清全部费用后，双方无任何争议，甲方将剩余保证金及租金无息退还乙方。</p><p style=\"margin-left:12px\">9.2 因甲方经营状况发生重大变化，致使甲方不能继续从事车辆租赁服务的，甲乙双方均有权提前终止本合同，且双方均不承担违约责任，在乙方归还甲方车辆，向甲方结清全部费用后，甲方应将剩余保证金及租金无息退还乙方。</p><p style=\"margin-left:12px\">9.3 经甲乙双方协商一致，本合同可以解除或提前终止。</p><p style=\"margin-left:12px\">9.4 在租赁期限内，因乙方行为导致甲方解除或提前终止本合同的，或乙方出现下列情形之一的，甲方有权立即解除或提前终止本合同并强制收回车辆，且乙方应向甲方支付违约金，违约金标准为租赁当年月平均租金总价标准的2倍：</p><p style=\"margin-left:12px\">9.4.1利用标的车辆从事违法犯罪活动的，或因涉嫌违法犯罪被采取强制措施或受到行政处罚的；</p><p style=\"margin-left:12px\">9.4.2 未按期支付本合同项下的相应费用超过3个工作日的，经甲方催告后仍不支付的；</p><p style=\"margin-left:12px\">9.4.3涉酒涉毒驾车、交通事故逃逸、不及时抢救伤员保护现场、谎报或瞒报交通事故的；</p><p style=\"margin-left:12px\">9.4.4 擅自将标的车辆转让、转租、转包，或设置抵押、留置、质押等负担，或恶意更换车辆零部件或拆撤、损毁、涂抹车辆设施、设备、标记、广告等的；</p><p style=\"margin-left:12px\">9.4.5 标的车辆技术状况经甲方累计3次检查不合格，或经甲方检查不合格要求乙方修复，乙方在3日内拒不修复的；</p><p style=\"margin-left:12px\">9.4.6 向甲方提供虚假证件或资料的；</p><p style=\"margin-left:12px\">9.4.7 发生3次有责交通事故或单次有重大、特大交通事故的；</p><p style=\"margin-left:12px\">9.4.8甲方通知乙方协助办理标的车辆年检手续，乙方不按甲方的要求履行协助义务，导致标的车辆无法年检或年检不合格的；</p><p style=\"margin-left:12px\">9.4.9利用标的车辆进行相关法律法规明令禁止的行为，或其他严重影响甲方权益或可能导致甲方损失的行为；</p><p style=\"margin-left:12px\">9.4.10 乙方有违反本合同约定导致甲方解除或提前终止本合同的其他情形的。</p><p style=\"margin-left:12px\">9.5 租赁期限届满前，乙方提前退租的，则属于乙方严重违约，乙方应按租赁当年月平均租金总价标准的2倍向甲方支付租金补贴，租金补贴甲方有权从乙方保证金中直接抵扣。</p><p style=\"margin-left:12px\">9.6 甲方提前解除本合同的，应提前15天书面通知乙方，乙方如有异议的，乙方应在通知送达之日起15日内书面回复，但不影响甲方解除合同的效力。</p><p style=\"margin-left:12px\">9.7 本合同中的合同解除、业务终止之标准：甲乙双方在《交接车验收清单》上签字，退车手续办理完毕，乙方处理完所有违章，扣除各种乙方应承担的费用，甲方无息退还保证金。</p><p style=\"margin-left:12px\">9.8 乙方若需要办理ETC，由乙方自行办理。合同解除、业务终止后，乙方须先自行注销ETC，再办理退车手续，否则向甲方支付2000元/卡退卡费。</p><p><strong>第十条  其他</strong></p><p style=\"margin-left:12px\">10.1 关于送达：任何与本合同有关的由一方发送给其他方的通知或其他通讯往来（“通知”）应采用书面形式，按照下列通讯地址或通讯号码或电子邮箱送达被通知人均构成有效通知，包括但不限于法院、仲裁机构的法律文书及双方的来往函件等。</p><p>甲方：羚牛氢能科技（广东）有限公司</p><p>通讯地址：</p><p>联系人姓名及电话：</p><p>邮箱：</p><p>乙 方 ：</p><p>通讯地址：</p><p>联系人姓名及电话：</p><p>邮箱：</p><p style=\"margin-left:12px\">10.2 任何一方上述的通讯地址或通知方式发生变化（“变动方”），变动方应当在该变更发生后的七（7）日内通知其他方。变动方因上述地址不明确或未按约定及时通知，导致法院、仲裁机构的法律文书或任一方文件无法送达的，文件退回之日即视为送达之日。甲乙双方确认，前述送达方式适用于各个司法阶段，包括但不限于一审、二审、再审、执行以及督促程序。</p><p style=\"margin-left:12px\">10.3 本合同中约定的违约责任、赔偿责任条款以及乙方义务，甲方于订立合同时已提请乙方注意并按乙方要求对该条款予以说明，乙方已充分了解并自愿订立且不再提出违约金、赔偿金过高和义务过多的请求。</p><p style=\"margin-left:12px\">10.4 本合同未尽事宜可另行签订补充合同，补充合同与本合同具有同等效力。</p><p style=\"margin-left:12px\">10.5 甲、乙双方因履行本合同发生争议，可协商解决，协商不成提起诉讼的，甲乙双方一致同意由合同签订地（浙江省嘉兴市平湖市乍浦镇）人民法院管辖。</p><p style=\"margin-left:12px\">10.6 本合同一式两份，甲方持一份，乙方持一份，在甲方盖章，乙方签字（自然人）或盖章后生效，若有保证人，保证人签署本合同及附件《保证人的保证责任》后，对保证人生效。</p><p style=\"margin-left:12px\">10.7  本合同所有附件、附表、车辆交接单均是本合同的有效组成部分，与本合同具有同等的法律效力。本合同包括但不限于以下附件：</p><p><strong>附件1《租赁订单》、附件2《车辆产生的费用》、附件3《安全责任告知书》、附件4《重型普通货运车辆租赁动态监管责任告知与确认书》、附件5《安全责任承诺书》、附件6《车辆使用规范和驾驶员要求》《授权委托书》《安全责任协议》及其他。</strong></p><p>（以下无正文）</p>" },
			{ id: 'b10', title: '签章页', locked: true, content: "甲方（盖章）：____________    乙方（盖章）：____________\n签订日期：{{signDateYear}} 年 {{signDateMonth}} 月 {{signDateDay}} 日\n\n（以下无正文）\n\n本合同所有附件、附表、车辆交接单均是本合同的有效组成部分，与本合同具有同等的法律效力。本合同包括但不限于以下附件：\n附件1《租赁订单》、附件2《车辆产生的费用》、附件3《安全责任告知书》、附件4《重型普通货运车辆租赁动态监管责任告知与确认书》、附件5《安全责任承诺书》、附件6《车辆使用规范和驾驶员要求》《授权委托书》《安全责任协议》及其他。" },
			{ id: 'b11', title: '附件1 租赁订单', locked: false, content: "<p><strong>附件 1：租赁订单                               订单编号（LNZLHT           ）</strong></p><p>甲方(出租方): 羚牛氢能科技（广东）有限公司</p><p>乙方(承租方):</p><p>本订单租赁车辆总计  辆，合同租金及服务费含税总价为：￥             元，保证金总计需缴纳￥      元（若开具保证金收据的，退车时应提交保证金收据原件方可退还保证金），首期租金及服务费含税需支付￥         元。租赁车辆含保险总计   辆，每辆保险险种包含  三者责任险【   】万元、车损  ，含通行证总计   张。</p><p>一、租赁车辆信息</p><p>品牌</p><p>车型</p><p>车牌号</p><p>租金及服务费</p><p>小计</p><p>（元/ 月/辆，含税）</p><p>价格及服务内容</p><p>保证金</p><p>（元/辆）</p><p>车辆租赁期限</p><p>\u0007\u0007\u0007车辆租金</p><p>（元/月/辆，含税）\u0007服务费</p><p>（含税）\u0007服务内容\u0007\u0007\u0007\u0007 \u0007 \u0007 \u0007 \u0007 \u0007 \u0007 \u0007 \u0007\u0007 \u0007 \u0007 \u0007 \u0007\u0007 \u0007\u0007  \u0007\u0007</p><p>车牌号在签约时无法确定的，以实际交付的车牌号为准，若后续需要更换车辆的，均以《交接车验收清单》为准。</p><p>二、其他约定：</p><p>1.车辆交付（交还）地点：        。车辆交付时间：车辆交付时间：     年  月  日（以实际交付的时间为准）。</p><p>2.租赁车辆仅限     行政区域范围内使用，超出前述约定区域范围使用租赁车辆应事先征得甲方书面同意并办理相关手续。</p><p>3.甲乙双方协商一致增加租赁车辆的，双方另行制作《租赁订单》，经甲方盖章，乙方签字/盖章后生效。</p><p>4 、甲乙双方均认可并接受双方签订的《商用车租赁合同》（合同编号                ）全部内容，本租赁订单列明的条款的，按本租赁订单执行，本租赁订单未列明的条款，均按照《商用车租赁合同》执行。</p><p>5.甲方有权对租赁车辆进行调换，但应提前15天通知乙方，乙方必须配合。还车、调换车辆时车辆外观、驾驶室、车厢必须保持干净整洁，否则收取清洗费，车身原车广告未经甲方同意不得撕毁、损坏、涂抹，否则承担车辆的修复费。本条中的清洗费，500元/辆，车身修复费，5000元/辆，甲方有权在保证金直接扣除。</p><p>6.租赁期内车辆产生的能耗费、停车费等用车费用由乙方承担。</p><p>7.本《租赁订单》一式两份，甲方执一份，乙方执一份，在甲方盖章，乙方签字（自然人）或盖章后生效。保证人签字（自然人）或盖章后，对保证人生效。</p><p>甲方（签章）：</p><p>乙方（签字/盖章）：</p><p>授权代表：</p><p>授权代表：</p><p>签订日期：</p><p>年    月    日</p><p>签订日期：   年   月   日</p>" },
			{ id: 'b12', title: '附件2 车辆产生的费用', locked: false, content: "<p><strong>附件2:车辆产生的费用</strong></p><p>一、车辆维保、易损件、车辆轮胎、蓄电池及送车上门和上门收车费用：</p><p>维保服务</p><p>易损件</p><p>轮胎及蓄电池</p><p>自行承担车辆维保所发生的所有费用</p><p>自费承担</p><p>型号:11.00R20 18PR ，自费承担，还车时轮胎每磨损1mm，乙方需向甲方支付【110 】元/毫米的折旧费（计费公式：（交车时轮胎厚度-还车时轮胎厚度）*【mm 】，如乙方在租赁期内更换过轮胎，计算费用为负值的，乙方无需支付费用，甲方也不做任何补偿。）蓄电池，自费承担，每块电池【1200 】元/2年，按照实际租赁时间折算费用。</p><p>特别说明：1、轮胎、门把手、刹车片等易损件正常磨损达到需更换时客户负责更换，配件、维修工时费乙方自理；2、乙方充分知晓和同意，如果承租的甲方车辆并非全新车辆，或面临车辆租赁后标的车辆配件即过保的情形；3、如乙方未根据下表维护保养标准执行车辆维护工作，造成车辆脱保的，由此给甲方产生的不利影响、额外义务负担、费用损失等均由乙方自行承担。</p><p>送车上门，上门收车：从出发往返1公里以内免费；往返1公里以上，按8元/公里收费；人工费以实际维修项目算。拖车费：起步价【400】元+【 5】元/公里/空车，起步价【400】元+【15】元/公里/重车；基础服务费为【100 】元/辆/次。材料费以维修站的价格为准，最终以甲方确定的价格为准。</p><p>二、保养和修复：不论乙方租赁车辆期限长短,乙方确认并同意均按照下述规则维护保养和修复标准执行， 产生的费用按维修站的价格计算，若维修站未确定价格的，参考下表价格执行，最终以甲方确定的价格为准：1、底盘保养</p><p>序号\u0007区分\u0007保养项目\u0007周期/万KM\u0007型号\u0007数量\u0007单价\u0007次数\u0007总价\u0007公里要求（万公里）\u0007\u00071\u0007配件\u0007驱动电机、电池冷却液\u000724个月/20万公里\u0007重负荷有机乙二醇型冷却液\u000736L\u0007143\u00072\u0007286\u000720\u0007\u00072\u0007工时\u0007\u0007\u0007\u0007\u000750\u00071\u000750\u0007\u0007\u00073\u0007配件\u0007转向器\u00076个月/10万公里\u00078 号液力传动液）及滤芯\u00071.7L\u000725\u00071.7\u000742.5\u000710\u0007\u00074\u0007工时\u0007\u0007\u0007\u0007\u000750\u00071\u000750\u0007\u0007\u00075\u0007配件\u0007新能源法士特、绿控\u000712个月/5万公里\u0007GL-5\\\\85W\u00077L\u000725\u00077\u0007175\u00075\u0007\u00076\u0007工时\u0007\u0007\u0007\u0007\u000750\u00071\u000750\u0007\u0007\u00077\u0007配件\u0007油润滑的中</p><p>后桥\u000712个月/10万公里\u0007GL-5\\\\80W-90\u00079L\u000729.7\u00079\u0007267.3\u000710\u0007\u00078\u0007工时\u0007\u0007\u0007\u0007\u000750\u00071\u000750\u0007\u0007\u00079\u0007配件\u0007脂润滑的轮边\u00072个月/1.5万公里\u00073#锂脂\u00073KG\u000720\u00073\u000760\u00071.5\u0007\u000710\u0007工时\u0007\u0007\u0007\u0007\u000775\u00071\u000775\u0007\u0007\u000711\u0007配件\u0007驾驶室举升器\u00076个月/5万公里\u000710 号航空液压油\u00071L\u000730\u00071\u000730\u00075\u0007\u000712\u0007工时\u0007\u0007\u0007\u0007\u000750\u00071\u000750\u0007\u0007\u000713\u0007配件\u0007空气干燥器\u000712个月/10万公里\u0007科诺尔、威伯科\u00071个\u0007184\u00071\u0007184\u000710\u0007\u000714\u0007工时\u0007\u0007\u0007\u0007\u000730\u00071\u000730\u0007\u0007\u000715\u0007配件\u0007空气滤清器\u000712个月/4万公里\u0007空气滤芯\u00071个\u0007150\u00071\u0007150\u00074\u0007\u000716\u0007工时\u0007\u0007\u0007\u0007\u000730\u00071\u000730\u0007\u0007\u000717\u0007配件\u0007各类球头\u00072个月/1万公里\u00072号锂基脂\u0007\u000775\u00071\u000775\u00071\u0007\u0007合计</p><p>2.燃料电池保养项目</p><p>序号\u0007保养配件\u0007周期/万KM\u0007次数\u0007量\u0007单价（元，未税）\u0007工时【90】元/时\u0007公里要求（万公里）\u0007\u00071\u0007空滤\u00072\u00077\u0007/\u00071099 \u000745\u00072\u0007\u00072\u0007离子过滤器\u0007首次1万KM，之后每次间隔3万KM\u00074\u0007/\u0007969.57\u000790\u0007首次1万，后每次间隔3万\u0007\u00073\u0007冷却液\u00078万KM\u00071\u000740L\u00071664.845 \u0007   180\u00078\u0007\u0007三、证照及违章处理等收费标准：如甲方代为处理，乙方应向甲方支付的代处理费计费结构为：（基础费用）+（服务费收费标准），具体如下表：</p><p>项目</p><p>基础费用</p><p>服务费收费基础</p><p>服务费/元</p><p>补办行驶证</p><p>以实际收费为准</p><p>每台车每次</p><p>200</p><p>补办牌照</p><p>以实际收费为准</p><p>每台车每次</p><p>300</p><p>补办营运证</p><p>以实际收费为准</p><p>每台车每次</p><p>300</p><p>补办加氢证</p><p>以实际收费为准</p><p>每台车每次</p><p>300</p><p>处理违章（罚款）</p><p>实际罚款为准</p><p>每台车每条</p><p>100</p><p>处理违章（罚分）</p><p>实际罚分为准</p><p>每台车每条</p><p>100</p><p>借用备用钥匙</p><p>送上门，20公里内100元，每超1公里3元每公里，过桥过路费额外收取</p><p>每台车每次</p><p>100</p><p>补配钥匙</p><p>实际补配价格</p><p>每台车每次</p><p>400</p>" },
			{ id: 'b13', title: '附件3至6 安全与规范', locked: false, content: "<p><strong>附件3:安全责任告知书</strong></p><p>一、各车辆使用人责任主体:</p><p>1.各租赁客户合作伙伴、挂靠我司车辆的用户，当您使用我司车辆期间必须承担安全责任，责任主体是:车辆使用人(公司或个人)，挂靠车辆使用人(公司或个人)。</p><p>2.根据《中华人民共和国民法典》第一千二百零九条，因租赁、借用等情形机动车所有人、管理人与使用人不是同一人时，发生交通事故等造成损害，属于该机动车一方责任的，由机动车承租人和使用人承担该赔偿责任。</p><p>3.租赁车辆、挂靠车辆使用人，平时要做好出车检查，制订车辆日常检查记录表，对于:氢系统、电池、灯光、轮胎、车辆外观、随车配置物品等做好日常检查并记录，如有异常必须及时处理，车辆合格满足出车条件以后才能出车，并且必须保持车辆定位系统在线。</p><p>4.车辆、挂靠车辆使用人，要做好我司车辆的安全、事故台账，出事故必须登记在台账中，并且开展四不放过教育:①事故原因没有查清不放过，②事故责任者没有严肃处理不放过，③全体司机及车队管理人员没受到教育不放过，④防范措施没有落实不放过。</p><p>开展教育必须有现场多张照片，所有司机及车队管理人员在教育签到表上签字，照片及签到表原件留档，我司安全部备查。</p><p>二、车辆使用安全注意事项:</p><p>1.所有驾驶员要有从业资格证，9.6米厢车与4.2米冷藏车，必须出示本人资格证，登记后才可以提车。</p><p>2.注意车辆高度，苏龙、柳汽乘龙等9.6米车高4米。跃进、现代冷链4.2米车高3.38米。现代普货车高3.28米。集卡飞驰车头3.9米，挂车装载平箱4.2米左右。驾驶员一定要注意车厢高度，当心限高杆、桥梁、树枝等物。</p><p>3.因为是氢用车，车内不得吸烟，车周边10米以内不得吸烟，车辆远离烟火（周边10米以上），不得将车停放在高压电线下。</p><p>4.进入加氢站，必须无烟火，关闭总电源后加氢。服从加氢站管理，如：静电接地，不超过35Mpa压力等等。</p><p>5.车辆遇到氢气泄漏，不严重移至空旷处，关闭总电源！车辆旁边不得有闲杂人等，远离明火，联系运维人员：江浙沪沈帅15021428914；新疆赵波18639103977；广东王河北13928468652；集卡车李泽琦13383480807；北京及其他地方赵小峰18868302409。</p><p>6.系统漏气并着火，火焰未烧至其他管路和车身；处理方式：立即熄火，关闭电源，马上灭火，立即打上述专业人员电话，在他们指导下灭火，以防电池等爆炸。如果火势大、控制难、立即拨打   119，人员撤离至安全区域。</p><p>7.供氢系统漏气着火，或电池着火，火焰烧至其他管路或车身；处理方式：立即拨打119，人员撤离至安全区域。</p><p>8.车辆每日检查：轮胎完好、气压标准、灯光设施齐全、车辆不带病上路。</p><p>9.雨雾天气，降低速度。注意能见度，与前车保持足够安全距离。</p><p>10.行驶中电池高温冒烟，马上靠边，断开高压系统，马上联系运维。</p><p>11.车辆发生火情立即停车，用灭火器降温灭火，关闭电源，火势大要保证人身安全，离开车辆打119报警。</p><p>12.氢能车辆禁止电焊，周围不许任何焊接，此类维修通知专业人员来修理。</p><p>13.出交通事故，第一时间打安全经理王屹青电话：18116198188，告知实际情况，加此电话微信，拍现场照片:整体事故场景、我方车牌、对方车牌、我方及对方车辆受损部位。并发定位，安全经理会指导处理事故。</p><p>贵方上述安全告知已收到并熟悉，我方（被告知人）郑重承诺：无条件遵守上述安全操作事项。若因我方（被告知人）原因导致发生安全事故，我方（被告知人）自行承担一切法律责任。</p><p>我方已清楚地了解附件 1《租赁订单》、附件2《车辆产生的费用》、附件3《安全责任告知书》和所有内容及车辆租用相关要求，在此向出租人郑重承诺：保证遵守《商用车租赁合同》及附件文件所有约定。</p><p>确认方（签字/盖章）：</p><p>确认时间：  年  月  日</p><p><strong>附件4：重型普通货运车辆租赁动态监管责任告知与确认书</strong></p><p>甲方（出租方）：羚牛氢能科技（广东）有限公司</p><p>乙方（承租方）：</p><p>为严格落实《中华人民共和国道路交通安全法》《道路货物运输及站场管理规定》等相关法律法规及行业监管要求，规范重型普通货运车辆租赁期间的安全运营行为，强化驾驶员安全管控，防范道路交通安全风险，保障租赁车辆、人员及公共安全，现就甲方租赁给乙方车辆的动态监管违规行为及处置事宜，正式告知如下：</p><p>甲方将对租赁车辆实施24小时动态监管，重点监测驾驶员存在的超速行驶、超时驾驶（持续时间≥4小时）、接打手持电话、操作手机、抽烟、生理疲劳驾驶、未按规定系安全带、偏离驾驶位、佩戴红外阻断型墨镜遮挡视线、动态监控设备被遮挡或失效、双手脱离方向盘、不目视前方行驶、实线变道、前向碰撞、车道偏离、前向车距过近等各类违反道路交通安全法律法规及双方签订的《商用车租赁合同》约定的违规行为。本确认书所载违规行为的认定，以甲方提供的、由车辆合法装载的动态监控设备所记录的数据、影像为准。若乙方对相关数据、影像记录的违规事实有异议，应在收到甲方通知后48小时内书面提出，并提出理由。乙方驾驶员的上述违规行为，不仅会给乙方自身运营带来重大安全隐患与法律责任风险，还将对甲方造成合规、运营等多方面的不利影响及实际损失，具体如下：</p><p>一、合规经营风险：</p><p>甲方作为重型普通货运车辆出租主体，依法承担租赁车辆的动态监管主体责任，若乙方驾驶员的违规行为被交通运输、公安交管等监管部门查处，甲方将面临行政处罚、行业资质核查、信用评级下调等合规风险，情节严重的，将直接影响甲方道路运输相关业务的正常开展。若租赁车辆因乙方原因（包含但不限于乙方驾驶员屡次、严重违规或乙方安全管理缺失）导致租赁车辆被交通主管部门依法做出撤销/吊销/注销其道路运输证，导致车辆无法运营，相关损失由乙方承担。</p><p>二、运营资源消耗：</p><p>针对乙方驾驶员的违规行为，甲方需额外投入大量人力、物力开展违规核实、沟通对接、整改监督等工作，占用甲方动态监管、车辆维护、客户服务等核心运营资源，大幅降低整体租赁业务运营效率，严重影响甲方对其他合规客户的服务质量，造成甲方运营成本增加。</p><p>针对监测发现的驾驶员违规行为，结合上述违规行为对甲方造成的各类影响与损失，甲方将采取分级处置措施，具体如下：</p><p>（1）一般违规：租赁期限内，因驾驶员违规行为产生属实动态监控预警风险的，乙方按以下标准承担违约金：首次50元/次，第二次100元/次，第三次及以上违规500元/次，乙方应当在甲方通知违规之日起1个自然日内支付给甲方，逾期未支付的，乙方须在次月车辆租金结算时一并向甲方支付。乙方更换新驾驶员须提前向甲方书面报备，人员更换后违规次数将重新计算。</p><p>（2）严重违规处置及车辆收回：租赁期限内，车辆因违规导致动态监控风险属实，连续2个月被交管部门通报的，甲方有权要求乙方在第2个自然月底起将车辆停运1个月，停运期间正常计收租金。为避免车辆营运证连续3个月通报导致被注销，乙方须严格遵照甲方停运要求执行，乙方拒不配合停运的，视为严重违约，甲方有权单方无条件强制收回租赁车辆，无需承担任何违约及赔偿责任。若因乙方拒不配合收车、违规持续营运造成车辆营运证被注销的，乙方须全额承担营运证注销后6个月内全部车辆租金。车辆强制收回过程中产生的拖车费、停放保管费、转运费、场地使用费等全部费用均由乙方承担。因乙方前述违约行为给甲方造成的全部损失（含但不限于行政罚款、赔偿金、律师费、诉讼费、保全费、差旅费等），均由乙方全额承担，甲方有权从车辆保证金中直接抵扣，保证金不足以清偿的，甲方有权就剩余差额向乙方另行追偿。</p><p>乙方需高度重视租赁车辆驾驶员的安全管控工作，切实履行承租方安全管理主体责任，加强对驾驶员的日常安全教育、培训及常态化管理，严格落实本确认书约定的分级处置措施，积极配合甲方的动态监管工作，及时整改各类违规行为。甲方将定期向乙方反馈车辆动态监管情况，对乙方未按本确认书要求落实处置措施、整改不到位或者拒不配合监管的行为，甲方将严格按照法律法规及双方签订的《租赁合同》约定处理。</p><p>本确认书自甲乙双方签字或盖章后生效，本确认书作为《商用车租赁合同》的附件，与《商用车租赁合同》具有同等法律效力。本确认书未尽事宜，按照双方签订的《商用车租赁合同》相关约定执行；若本确认书内容与相关法律法规冲突，按法律法规规定执行。</p><p>乙方确认：已认真阅读并充分全面理解本确认书全部内容，自愿严格遵照本确认书约定及相关法律法规要求执行，并承担因违反确认书约定及相关规定产生的全部责任。</p><p>（以下无正文）</p><p>甲方（盖章）：                                    乙方（签字/盖章）：</p><p>授权代表（签字）：                                授权代表（签字）：</p><p>日期：        年     月    日                    日期：         年      月     日</p><p><strong>附件5：</strong></p><p>安全责任承诺书</p><p>为严格落实《道路运输车辆动态监督管理办法》《广东省道路运输条例》及粤标动态监控管理要求，防范因超速、疲劳驾驶、接打电话、抽烟、遮挡摄像头、屏蔽设备、离线等违规行为被交通运输主管部门连续通报，避免因此导致车辆被责令停运、营运证被暂扣或注销等严重后果，并就车辆粤标动态监控相关安全责任，作出如下郑重承诺：</p><p>1.严格遵守《道路运输车辆动态监督管理办法》《广东省道路运输车辆智能监管系统应用管理办法》等国家及地方性法规，并已阅读、理解且承诺遵守贵公司提供的《粤标动态监控专项安全管理方案》（下称“管理方案”）相关规定，服从贵公司依据该方案及相关法规实施的动态监控管理。</p><p>2.负责督促我司承租司机规范驾驶，杜绝疲劳驾驶、超速、分心驾驶等违规行为，严禁破坏、屏蔽、断电、拆机等影响粤标监控设备正常运行的行为。</p><p>3.及时接收贵公司反馈的车辆违规信息，严格按照要求落实整改，配合贵公司开展司机安全教育、车辆停运等处置措施。</p><p>4.若因我司及我司承租司机违规行为，导致车辆被交管、运政部门通报、处罚或贵公司遭受其他损失的，我方同意承担由此产生的全部直接经济损失，包括但不限于政府部门处以的罚款、贵公司为处理此事支出的合理费用（如差旅费、律师费）以及车辆被责令停运期间的租金损失（按《商用车租赁合同》（下称“主合同”）约定标准计算）。</p><p>5.我司知悉，若因连续违规被主管部门通报3次及以上，导致贵公司营运证被暂扣或注销等严重后果的，自愿承担全部赔偿责任（包括但不限于车辆价值贬损、营运损失等）。同时，贵公司有权单方解除《商用车租赁合同》，且有权在5年内拒绝与我司及关联方开展任何商业合作。</p><p>6.本承诺书自签订之日起生效，有效期至《商用车租赁合同》约定租赁期满之日止。</p><p>7.本承诺书作为《商用车租赁合同》的有效附件，与主合同具有同等法律效力。如本承诺书内容与主合同内容约定不一致，则以更严格约束我司义务的条款为准。</p><p>（以下无正文）</p><p>承诺客户（盖章）：__________</p><p>法定代表人/授权代表人（签字）：__________</p><p>签订日期：    年   月   日</p><p><strong>附件6：车辆使用规范和驾驶员要求</strong></p><p>一、车辆使用规范</p><p>启动前</p><p>的操作</p><p>1.确认电源总开关处于开启状态。</p><p>2.检查储氢瓶的气密性，是否变形。</p><p>3.确认驻车制动操纵手柄处于驻车状态，确认变速操纵杆处于空挡位置。</p><p>4.车辆起步前，观察仪表有无异常显示和报警：剩余氢气量(SOC)不低于10%或者氢气压力不低于3.5兆帕,且动力电池电压显示不低于520V，低压蓄电池显示于22V以上，原地转动方向盘检查转向泵工作是否正常若仪表有指示灯亮起或声音报警，应停车检查。</p><p>5.系好安全带，检查安全措施。</p><p>车辆起步</p><p>1.先将钥匙转动至“ACC”位置，踩住刹车再继续转动至“START”，停留3秒。</p><p>2.仪表盘会显示READY等字样。</p><p>3.在观察电机运转正常，各仪表、指示灯、无警报灯正常的情况下方可起步。</p><p>4.仪表显示“ready”，踩下制动踏板，挂前进挡时，换挡杆切换至“D”，挂倒挡时，换挡杆切换至“R”。</p><p>5.放下驻车制动操作手柄，缓慢踩踏加速踏板，电机启动，车辆开始行驶。</p><p>停车动作</p><p>1.应先放松加速踏板，降低车速。</p><p>2.必须在车辆完全停稳后踩住刹车才能换入倒档，否则传动系统将受到损坏。</p><p>3.怠速运转夏天5分钟、冬天10分钟时间，关闭电源，停车时长超过2小时需要关闭总电源。</p><p>4.关闭用氢系统开关。</p><p>起步</p><p>注意事项</p><p>1.观察左右反光镜，注意车辆行人。</p><p>2.两次起动车辆的间隔时间不少于30秒。</p><p>3.驾驶室倾翻起来的情况下，禁止启动电机。（一体式车头除外）</p><p>4.严禁不松手刹的情况下强行行驶。</p><p>5.起步和行车途中手刹处于施加状态电机功率将会降低50%。</p><p>汽车行驶</p><p>注意事项</p><p>1.汽车行驶中，注意使电机冷却液温度保持在正常状态。</p><p>2.严禁行驶途中关闭氢能源开关。到加氢站加氢时，提前5分钟关闭用氢开关。</p><p>3.行驶中注意观察电池电量（SOC），如果低于设定值50%以下，停车检查是否打开用氢开关，再报售后维修。</p><p>4.遇水后请注意特别驾驶，制动器受潮会暂时降低制动力。并缓慢通过。</p><p>5.车辆倒车速度不超过15公里/时。</p><p>6.紧急刹车制动距离较长且急速刹车时车辆会向左倾斜，应注意车速（最佳车速在40—50），且必要时预见性减速。</p><p>7.长时间或下雨天停车要关闭整车总闸，避免损耗低压电或线路故障。</p><p>8.行车途中若听见不正常的声音或嗅到不正常的味道应及时停车找出原因。</p><p>9.所有高压电源均由点火开关控制，驾驶员离开车辆时必须关掉点火开关，取走钥匙。</p><p>10驾驶过程中严禁吸烟（包括但不限于驾驶室、密封空间、距离车辆【10】米范围内）。</p><p>11.注意观察冷机的温度是否在正常范围之内。</p><p>加氢流程</p><p>提前5分钟关闭用氢开关—车辆停在指定位置--人员离开到安全位置等待--加氢进行--加氢完毕关闭加氢口--纯电启动驶离加氢站--打开用氢开关。</p><p>加氢注意事项</p><p>1.氢的剩余量不能低于SOC10%。气压不能低于3.5兆帕。</p><p>2.加氢时严禁在加氢站点燃明火，或者吸烟。</p><p>3.要在听从加氢站工作人员的指导下开到指定位置，关闭电源，停车，由工作人员代驾。</p><p>4.禁止个人加氢，避免储氢瓶氢气泄漏，加氢需到加氢站。</p><p>5.不要携带手机、打火机、MP3等易引起爆炸、自燃的物品进入氢化工作区域。</p><p>6.在加氢站附近，拿工具、零件时应轻拿轻放，不得发生刚性撞击产生火花。</p><p>特别注意</p><p>1.不能急加速，匀速行驶。</p><p>2.车辆停车后，要等空压机吹扫结束再关闭电源（建议停车前10分钟关闭EV开关）。</p><p>3.电池电量不可低于25%。低于25%时，整车报警，低于15%时，整车无法上高压，将无法启动，应提前外接充电或开启混动模式充电。</p><p>4.氢气余量不可低于10%。</p><p>5.当车辆soc电量低于50%且未充电，则要确认是否在用氢状态，或靠边确认故障。</p><p>6.仪表台中部“EV”按钮为运行模式切换，按下后车辆由混合动力转换为纯动，再按则转换回混合动力，正常无需对此按钮进行操作。</p><p>7.加氢时关闭EV开关，使用电动进站加氢，离开加氢站再启动氢（EV开关）。</p><p>8.车辆为自动换挡，正常行驶中无需换挡操作，且车辆为电驱动系统，滑行时不须切换为空挡，切换空挡会导致车辆失去油门响应；如需换挡时，应踩刹车进行换挡，切换挡位时须先切换为空挡，并在空挡停留0.5s～1s。</p><p>9.开车前检查水箱防冻液是否缺失，过久未使用车辆需更换防冻液。</p><p>10.不要随意开启氢罐两侧的门，更不能随意关闭氢管路的阀门。</p><p>11.不要频繁关闭开启氢开关，停车20分钟左右的不需关闭。</p><p>12.非紧急情况下禁止碰高压急停开关，紧急情况下使用（如事故，涉水，起火）。</p><p>13.不能用水枪冲洗橙色线路，避免进水报绝缘和漏电。</p><p>14.车辆为电动车辆，因此涉水高度最高为300mm，如积水超过500mm严禁通行，且通过积水路段时应注意减速慢行。</p><p>15.停机注意：首先关闭所有用电设备(如空调）钥匙关一档（待燃料电池完全停止工作—再可关二档—最后方可关闭总电源开关）包括重新启动按以上要求操作。</p><p>二、车辆操作提醒</p><p>（一）安全/充电事项</p><p>1.高压安全：高压橙色线束及其连接件，不能随意触碰，有高压触电风险。</p><p>2.氢气安全：若有泄漏，立即现场隔离。 严禁人、车入内。供氢系统发生火灾：若条件允许，车辆移动空旷区域，人员撤离；若条件允许，可用淋水对氢瓶降温。</p><p>3.充电事项：充电时，需选择电压大于500V及辅助电压为24V的充电桩。尽量避免人为使用EV模式驾驶，减少充电次数。</p><p>3.加氢事项：行车前，合理规划路线，关注氢剩余量，及时补充。</p><p>4.氢堆功率待机条件：混动模式下氢堆功率输出条件</p><p>SOC在85%以上时氢堆自动进入待机状态，直到SOC低于65%时自动开始启动；然后电池开始充电直到SOC在85%以上又进入待机状态，依次循环。</p><p>注意：氢堆待机时，如果驾驶员要求功率大于电池放电功率限制值，氢堆也会自动启动输出功率。</p><p>5.功率限制</p><p>限制条件</p><p>限制措施</p><p>限制现象</p><p>纯EV模式</p><p>SOC≤30%</p><p>输出功率限制</p><p>空调停止使用，电池电量报警灯点亮/SOC进度条显示黄色</p><p>SOC≤20%</p><p>车辆限速≤52km/h/电池低电量警告灯+闪烁/SOC进度条显示红色</p><p>SOC≤10%</p><p>车辆限速≤17km/h/电池低电量警告灯+闪烁/整车故障灯点亮/SOC进度条显示红色，车辆限输出扭矩</p><p>（二）主要故障灯处理</p><p>1.氢燃料电池冷却液报警指示灯：停车检查，检查燃料电池冷却液液面状态，联系羚牛运维服务人员检查冷却液是否泄漏或其他原因。</p><p>2.氢燃料电池堆报警灯：氢燃料电池控制系统某个运行数据异常，切换E V模式、联系羚牛运维服务人员处理。</p><p>3.氢气泄漏报警灯：立即切换为EV模式，立即寻找远离火源空旷通风区域停车，关闭低压电源总开关，联系羚牛运维服务人员处理。</p><p>4.供氢系统报警灯：车辆可能会出现限制功率输出；切换EV模式、联系羚牛运维服务人员处理。</p><p>5.按指示灯颜色判断:绿灯正常运行-黄灯检查警告-红灯停车检查。</p><p>（三）驾驶模式切换-混动/EV模式</p><p>EV模式：按下EV开关键，仪表指示灯亮，车辆执行EV纯电模式运行。</p><p>混动模式：EV开关键关闭下，车辆启动，系统默认为混动模式。</p><p>注意：为延长动力电池寿命，纯EV模式仅允许在紧急情况下使用，严禁长期使用； EV模式可以在任何条件下切换到混动模式；混动模式只能在停车后才可切换为EV模式。</p><p>（四）能量回收功能</p><p>1.开启方法：拨杆在最上位置时为1档，拨动开关到最下位置时为2档。 (车辆默认挡位为1档）</p><p>2.启用条件：SOC&lt;95%、车速＞15Km/h、未踩加速踏板。</p><p>3.解除条件：踩下加速踏板或 SOC＞90%或车速＜15Km/h。</p><p>4.当道路平坦需长距离滑行或坡度较大需要较大制动力时，下拨能量回收开关到2档。</p><p>注意：合理使用能量回收，能有效减少制动系统磨损和降低氢耗；能量回收不能代替行车制动。</p><p>（五）ECO模式</p><p>开启方法：按下ECO模式开关，仪表ECO指示灯点亮，车辆进入节能模式运行；否则为正常运行模式。</p><p>注意：重载时使用正常模式（ECO未开启）；道路平坦，空车或者轻载时，打开ECO开关，使用</p><p>节能模式；合理使用能量回收和ECO功能，可以提高续航里程。</p><p>（六）车辆停放</p><p>车辆停车后，将钥匙置于OFF档，等待3分钟，待氢堆完成自洁后夏天5分钟和冬天10分钟，再关闭低压电源总开关；停车区尽量选择空旷非封闭空间且应远离火源；为保护低压蓄电池性能，长时间停车（超过2个小时），强烈建议关闭低压电源总开关。</p><p>（七）提升续航驾驶</p><p>1.不要急加、减速：急加、减速能量损耗大，严重降低续航。</p><p>2.经济车速40-70KM/H：车速保持在此阶段匀速行驶 ，能有效地提高车辆续航里程。</p><p>3.能量回收和ECO模式使用：能量回收模式可回收多余动能提高续航，合理使用ECO模式，降低动力输出提高续航。</p><p>注意：合理使用空调，避免夏季过冷,冬季过热,导致能耗增加。</p><p>（八）AVAS-低速报警</p><p>1.开启条件：根据车速自动激活；D挡时：车速在1-20km/h时，发出“嗡嗡”报警声，车速高于20km/h时，报警自动取消;R档时，发出倒车音提示音。</p><p>2.作用：车辆启动行驶时，车辆噪声较小，为确保行车安全，强烈建议开启低速报警功能，提醒行人注意安全。</p><p>（九）定速巡航</p><p>1. 开启方法：按下定速巡航开关按键，通过方向盘设定速度。</p><p>2.启用条件：车辆无故障、40km/h≤车速≤90km/h。</p><p>3.解除条件：关闭巡航开关、踩下制动踏板、车速&gt;90km/h、车速&lt;40km/h。</p><p>注意：用定速巡航开关以外的方式解除定速巡航，巡航控制系统仍处于待命状态。 按下“SET/-”时，车辆会自动恢复到最近设定的巡航速度。</p><p>（十）故障处理流程</p><p>1.若车辆出现故障时，请及时联系羚牛运维服务人员。</p><p>2.若车辆故障时，为快速及有效地判断故障原因，请驾驶员记录以下信息，反馈给现代商用车服务人员。需提供车辆信息如下：车辆铭牌、故障码内容照片、仪表整体显示照片。</p><p>3.故障现象描述：车辆在行驶过程中或启动时，仪表显示故障灯，车辆有什么故障现象；车辆在使用过程中，车辆什么功能无法使用；尽可能拍摄故障时照片或视频，便于快速故障原因判断；</p><p>（十一）参数/故障查询方法：</p><p>1.车辆运行参数查询：按下方向盘上“菜单键”，进入“设置”界面，按“选择键”选择“信息栏目”项后，再按“确认键”，可读取相关系统信息。</p><p>2.车辆故障内容查询：按下方向盘“菜单键”，进入“故障诊断”界面，按“选择键”选择“故障内容”项后，再按“确认键”，可读取故障码内容。</p><p>三、驾驶员安全管理要求：</p><p>1.乙方驾驶员必须遵守《中华人民共和国道路交通安全法》《中华人民共和国道路运输条例》及有关交通安全管理的规章规则，安全驾车，并应遵守其他相关的规章制度。</p><p>2. 乙方与驾驶员须签订聘书，聘用条件为：</p><p>⑴须持有合法的驾驶执照，对于租赁车辆的同车型实际驾龄必须超过2年；</p><p>⑵年龄不超过55周岁；</p><p>⑶取得道路运输管理部门颁发的从业资格证；</p><p>⑷经乙方组织对其进行面试、理论和机械常识考核、道路驾驶技术测试合格。</p><p>3.驾驶员的管理、宣传、教育。</p><p>（1）驾驶员应爱惜甲方车辆，平时要注意车辆的保养，经常检查车辆的主要机件。每月至少用半天时间对自己所开车辆进行检修，确保车辆，以保持车辆的清洁。驾驶员发现车辆有故障时要立即检修。不会检修的，应立即报告管理人员，并提出具体的维修意见（包括维修项目和大致需要的经费等）。未经批准，不许私自将车辆送厂维修；</p><p>（2）驾驶员对自己所开车辆的各种证件的有效性应经常检查，出车时一定保证证件齐全。连续行车里程超过四小时的，须配备两名驾驶员，每位驾驶员连续驾驶时间不得超过四小时；</p><p>（3）乙方应对本单位每位驾驶员进行岗前安全教育培训、考核，考核不合格的，不得上车驾驶。并保存驾驶员安全培训记录；</p><p>（4）对违章次数多、出险率高、发生交通事故的驾驶员进行再教育培训或依据公司制度进行惩罚。</p><p>4.承租人在收到违章信息通知后，从通知日期后15天内处理完毕，防止积累。（北京要求10个工作日内处理）。</p><p>5.承租人如果发生违章，将会收到短信，微信或者书面形式通知，并会有出租人或售后人员致电确认。</p><p>6.如若自身不便处理违章，请在发生违章之日起  10日内  联系出租人或售后人员并说明情况，由出租人代为处理，产生的一切费用由客户自行承担。在收到以下违章信息的情况下，必须在得到通知后的10天内必须处理完毕：</p><p>（1）单辆车累计扣分6分以上或罚款800元以上；</p><p>（2）单辆车未处理违章3条以上；</p><p>（3）因年审要求，在注册日期当月最后截止日期前10个工作日处理掉所有违章。不处理的，出租方将安排代为加急处理，产生的费用由承租方承担。</p><p>7.如收到违章信息超出规定时间拒不处理的，出租人将预警发函或进行远程控制（如锁车）措施处理。</p><p>8.对半年内单辆车出现违章超过10次（北京在季度内单辆车不能超过两次违章，并且不能出现一次扣6分的违章）、发生交通事故负有责任4次以上或者重大交通事故一次的情况下，出租人将会做出以下应对方案：</p><p>（1）承租人必须更换司机；</p><p>（2）拒不整改配合，则视承租人为违约做收车处理。</p><p>9.欢迎您对我们的服务进行监督并提出宝贵意见。我公司的监督投诉电话:【 400-021-1773】。</p><p>接收方（签字/盖章）：</p><p>时间：  年  月  日</p><p>授权委托书</p><p>致：羚牛氢能科技（广东）有限公司</p><p>兹委托受托人1 姓名【FORMTEXT     】联系方式【FORMTEXT     】证件号码【FORMTEXT          】代表委托人处理委托人与FORMTEXT              办理Ρ签署《商用车租赁合同》（合同编号：FORMTEXT              ）及前述合同相关包括但不限于《租赁订单》等合同附件、Ρ提车、Ρ退车、Ρ更换车、≤ FORMTEXT        事宜，授权期限自本授权委托书签署之日起至《商用车租赁合同》终止之日止。</p><p>兹委托受托人2 姓名【FORMTEXT     】联系方式【FORMTEXT         】证件号码【  FORMTEXT          】代表委托人处理委托人与FORMTEXT              办理≤签署《商用车租赁合同》（合同编号：FORMTEXT              ）及前述合同相关包括但不限于《租赁订单》等合同附件、≤提车、≤退车、≤更换车、≤ 合同抬头变更事宜，授权期限自本授权委托书签署之日起至《商用车租赁合同》终止之日止。</p><p>上列受托人的代理权限为特别授权，即受托人有权代委托人签署《商用车租赁合同》及前述合同相关包括但不限于《租赁订单》等合同附件、有权代为履行前述合同及附件内容、有权代为签收、确认前述合同及其附件相关通知、函件、诉讼文件等。委托人对上列受托人在授权范围内的行为承担全部法律责任。</p><p>本授权委托书手填部分有效，委托人特此声明及确认。</p><p>委托人（签字/盖章）：</p><p>年     月   日</p><p>安全责任协议</p><p>甲方（出租方）：</p><p>经办人：</p><p>联系电话：</p><p>乙方（承租方）：</p><p>统一社会信用代码/身份证号：</p><p>通信地址：</p><p>经办人：</p><p>联系电话：</p><p>为明确双方车辆租赁期间安全管理责任，保障运输作业安全，依据相关法律法规，在已签订《车辆租赁合同》同时，签订本协议，约定租赁车辆安全运营及管理责任。</p><p>一、协议目的</p><p style=\"margin-left:12px\">1.1本协议明确双方合作期间安全责任，确保企业主体责任履行，保障人员、车辆和货物安全，避免事故发生。</p><p style=\"margin-left:12px\">1.2本协议有效期与《车辆租赁合同》合同期限保持一致，租赁期间内乙方承担全部车辆相关的安全责任。</p><p>二、安全责任划分</p><p style=\"margin-left:12px\">2.1车辆交接时，乙方确认车辆状态，在交接单签字即视为认可车辆状况，甲方完成合格交付。自交付之日起，车辆运营安全责任及维修保养责任转移至乙方。</p><p>三、乙方安全承诺</p><p>乙方结合车辆安全和加氢安全实际，就安全生产做出承诺并制定规程、制度、预案等。</p><p style=\"margin-left:12px\">3.1安全管理制度</p><p style=\"margin-left:12px\">3.1.1乙方建立健全本单位安全生产责任制，成立安全生产管理机构、依据规定配备专职或兼职安全管理人员，明确各部门、各岗位安全职责。</p><p style=\"margin-left:12px\">3.1.2乙方制定本单位生产安全事故隐患排查治理制度，明确各层级隐患排查职责，及时消除安全隐患。</p><p style=\"margin-left:12px\">3.1.3乙方制定本单位交通事故应急救援预案，明确应急组织机构及职责，确定应急处置流程、储备相应应急物资。</p><p style=\"margin-left:12px\">3.1.4乙方制定本单位驾驶员安全培训制度，落实驾驶员岗前安全培训、考核工作，并保存驾驶员培训记录。</p><p style=\"margin-left:12px\">3.1.5乙方制定并落实安全生产、交通运输等法律规定的其他安全管理制度。</p><p style=\"margin-left:12px\">3.1.6乙方负责按照甲方的要求提供企业营业执照及必要资质、运营证件及个人驾驶证、身份证供甲方审查核验。</p><p style=\"margin-left:12px\">3.1.7甲方有权对每一位租赁车辆的驾驶员证件信息、有效期资质进行审核。</p><p style=\"margin-left:12px\">3.2 事故隐患排查治理</p><p style=\"margin-left:12px\">3.2.1乙方每月至少进行一次全面安全检查，重点检查安全管理制度是否完善，是否定期组织召开安全会议，是否对每位驾驶员开展岗前安全培训，是否定期开展隐患排查及隐患限期整改落实，是否至少每半年开展一次应急演练等安全事项。发现存在安全隐患立即通知整改，并立即抓好落实，及时消除。</p><p style=\"margin-left:12px\">3.2.2乙方做好出车前、停车后的准备、检查工作，确保行车安全，发现隐患要及时修复后方可出车。</p><p style=\"margin-left:12px\">3.2.3乙方装货时严查超载和擅自装载危险品，确认无误后方可出车。</p><p style=\"margin-left:12px\">3.2.4乙方不定期检查车辆的安全装置、灯光信号、证件。</p><p style=\"margin-left:12px\">3.2.5乙方检查驾驶员是否带病、疲劳、酒后驾驶，是否违反安全驾驶操作规程。</p><p style=\"margin-left:12px\">3.2.6乙方建立驾驶员安全考核奖惩制度，针对违章次数多、出险率较高的司机进行再教育或依制度进行处罚。</p><p style=\"margin-left:12px\">3.3 驾驶员管理</p><p style=\"margin-left:12px\">3.3.1乙方驾驶员必须遵守《中华人民共和国道路交通法》《中华人民共和国道路运输条例》及有关交通安全管理的规章规则，安全驾车，并应遵守其他相关的规章制度。</p><p style=\"margin-left:12px\">3.3.2 乙方与驾驶员签订聘书，聘用条件为：</p><p>（1）驾驶员须持有合法驾照；</p><p>（2）年龄不超过60周岁；</p><p>（3）驾驶4.5T以上车型须有从业资格证，且经乙方面试、理论和机械常识考核、道路驾驶技术测试合格。</p><p style=\"margin-left:12px\">3.3.3乙方应对驾驶员进行岗前及定期安全教育培训、考核，考核不及格的，不得上车驾驶，保存培训材料，对违章次数多、出险率高或发生交通事故的驾驶员进行再教育或依据公司制度进行处罚。</p><p style=\"margin-left:12px\">3.3.4 乙方应当对驾驶员进行安全生产教育和培训，保证驾驶员具备必要的安全生产知识，熟悉道路交通安全规章规则，掌握行车安全操作技能，了解事故应急处理措施，知悉自身在交通安全方面的权利和义务。未经安全教育和培训合格的驾驶员，乙方不得让其上岗作业。</p><p style=\"margin-left:12px\">3.3.5 乙方必须依法参加工伤保险，为驾驶员缴纳保险费。</p><p style=\"margin-left:12px\">3.4车辆安全管理要求</p><p style=\"margin-left:12px\">3.4.1车辆发生故障必须及时修复，特别是危及行车安全的重大隐患，如制动、转向、轮胎、灯光装置等。严禁车辆带病出场。</p><p style=\"margin-left:12px\">3.4.2严禁超员、超载行驶，严禁客货混装，严禁超速行驶。</p><p style=\"margin-left:12px\">3.4.3车辆在运行途中，驾驶员应主动做好车辆的自检自查，发现问题及时解决。</p><p style=\"margin-left:12px\">3.4.4车辆周围10米内严禁抽烟，严禁明火。进入加氢站加氢时按操作流程执行。</p><p style=\"margin-left:12px\">3.4.5车辆必须按规定位置停放，严禁停放在密封场所、低洼积水区域。车辆停放不得占据消防通道或妨碍消防通道畅通，不得将车辆停放在有人员居住的建筑物内，不得将车辆停放在可能造成人员伤亡的坡道路段，应确保车辆与爆破、吊装、起重、动火、高温等危险作业场所保持足够的安全距离。乙方违反本条事项要求所造成的人员伤亡、财产损失，均由乙方自行承担。</p><p style=\"margin-left:12px\">3.5车辆技术管理要求</p><p style=\"margin-left:12px\">3.5.1乙方应根据甲方保养要求及时对车辆组织保养维修，并及时将保养维修、车辆肇事情况通知甲方。</p><p style=\"margin-left:12px\">3.5.2车辆重要部位改动或加装部件，乙方应征得甲方同意并报甲方登记备案。</p><p style=\"margin-left:12px\">3.5.3甲方运维部管理人员检查车辆上路行驶情况时，在告知其身份后，司机必须停车配合，如发现车辆状况不佳或违反甲方安全管理规定的，甲方管理人员有对车辆进行停驶、回场检查的权利。</p><p style=\"margin-left:12px\">3.5.4 乙方要配合甲方对车辆进行年审、二级维护、检测、事故违章处理等工作。</p><p style=\"margin-left:12px\">3.6突发事件应急处置</p><p>为减少、避免事故的发生，把事故的损失降到最低程度，乙方及乙方驾驶员应做到：</p><p style=\"margin-left:12px\">3.6.1交通事故</p><p>驾驶员在车辆运行中发生交通事故时，停车后马上下车关闭车辆总电源，查看事故情况及是否有人员受伤，并将事故碰撞现场进行拍照留存，在车辆后方100米处放置警示标志。</p><p>发生交通事故，当事人应立即进行自救，并报警。电话： 122（交警）、119（消防）、120（急救），应简明讲清事故地点、伤亡、损失等情况，以及事故对周围环境的危害程度，保护现场，抢救伤员，保护货物财产并上报公司领导及甲方管理部门。</p><p>事故如果导致氢气压力异常和氢气管路有“嗤嗤声”等异常现象，发现车辆有漏气情况时，驾驶员要第一时间通知公司领导或甲方相关人员告知事故情况，甲方安排专业售后人员进行应急处理。</p><p>远离人群，事故车的处理地点应尽量避免在人口密集区，如只能在原地进行处理，应在周围设置提示牌。</p><p>安全撤离，当车辆发生明火现象时，驾驶人员应停车并关闭车辆总电源，并采取紧急灭火措施，灭火器应使用二氧化碳灭火器，对着火点进行喷射。如遇到无法扑灭时，立即疏散周围人员及车辆并撤离到安全地带拨打119报警，等待救援。</p><p style=\"margin-left:12px\">3.6.2车辆氢气泄漏</p><p>（1）驾驶员在车辆运行中发现氢气泄漏报警情况时，应就近安全区域停车。</p><p>（2）停车后马上关闭车辆总电源、在车辆后方100米处放置警示标志，并疏散周围人员车辆。</p><p>（3）驾驶员将情况通知公司领导或甲方相关人员告知，甲方安排专业售后人员进行应急处理。</p><p style=\"margin-left:12px\">3.6.3车辆运行中发生整车故障</p><p>驾驶员驾驶车辆行驶中发生整车故障报警情况时，应在安全地带停车。</p><p>停车后关闭车辆总电源，并电话联系甲方，甲方收到信息后安排售后人员电话指导驾驶员进行处理。如电话无法处理时，安排厂家前往现场进行处理或拖至服务站处理。</p><p style=\"margin-left:12px\">3.6.4火灾事故</p><p>（1）发生车辆火灾事故或出现火险苗头时,驾驶员应立即熄火有条件地迅速将车转移至安全地点，切断电源，关闭气阀。</p><p>（2）使用二氧化碳灭火器对着火点进行喷射。</p><p>（3）火灾现场在进行初期扑救的同时或发现火势较大，估计自身无法扑灭的，并撤离到安全地带，疏散周围人员及车辆。迅速拨打火警电话报警，并通知公司领导及甲方管理部门。</p><p>（4）如有受伤人员，必须首先将伤员抢救出来，及时送往附近医院进行救治。</p><p>（5）公安消防人员到达现场后，应急救援人员应服从专业消防人员的指挥，在消防人员的统一组织下，积极参加火灾事故的救援工作。</p><p style=\"margin-left:12px\">3.7 禁止第三方使用</p><p style=\"margin-left:12px\">3.7.1 严格禁止乙方擅自将甲方车辆转租、分租、出借或以联营、合作、借用等形式变相交由第三方使用。如有违反，甲方有权立即解除合同、收回车辆，并要求乙方支付相当于三个月租金的违约金，且不影响其他损失赔偿权利。</p><p>四、甲方安全管理责任和权利</p><p style=\"margin-left:12px\">4.1 甲方有权审查乙方拟租赁车型是否在乙方经营许可范围之内，审查所交车型是否与乙方提车人驾驶证准驾车型匹配，驾驶证、从业资格证是否在有效期内。</p><p style=\"margin-left:12px\">4.2甲方负责按照《车辆可交付标准》对乙方拟租赁车辆进行整备，确保车辆性能完好、安全附件齐备。</p><p style=\"margin-left:12px\">4.3甲方负责指引乙方按照“交车单”内容项进行实物及车况确认，无误后甲乙双方在交车单上签字。</p><p style=\"margin-left:12px\">4.4甲方负责通知乙方所承租车辆的保养、年审、违法处理等信息。</p><p style=\"margin-left:12px\">4.5乙方在履行安全管理责任时，若需要甲方协助的，甲方在自身能力范围内且在不影响自身正常运营的情况下，对乙方提供必要的技术指导和信息支持等协助。</p><p style=\"margin-left:12px\">4.6乙方承诺自愿按照“乙方安全承诺”的规范内容进行操作，对于违反“乙方安全承诺”内容的操作行为，乙方应向甲方支付相当于三个月租金的违约金；若该违约金不足以弥补甲方损失的，乙方还应赔偿甲方因此遭受的全部损失。</p><p style=\"margin-left:12px\">4.7 尽管有上述规定，甲方是否行使甲方的安全管理责任和权利以及如何行使甲方的安全管理责任和权利，无论如何均不影响乙方根据本协议及“乙方安全承诺”履行其安全管理责任，也不减免或减轻其任何安全管理责任。</p><p>五、其他</p><p style=\"margin-left:12px\">5.1 本协议的任何变更或补充需经双方书面协商一致，并签订相关协议变更或补充文件。</p><p style=\"margin-left:12px\">5.2 本协议为《车辆租赁合同》的附件，本协议未约定的，以《车辆租赁合同》约定为准；若本协议约定与《车辆租赁合同》约定不一致的，以本协议约定为准。</p><p style=\"margin-left:12px\">5.3 本协议经双方签字（盖章）之日起生效，一式两份，甲乙双方各执一份，具有同等法律效力。</p><p>甲方（签章）：</p><p>乙方（签字/盖章）：</p><p>授权代表：</p><p>授权代表：</p><p>签订日期：</p><p>年    月    日</p><p>签订日期：   年   月   日</p><p>附：承租方（乙方）营业执照、法定代表人身份证复印件（若有授权书，需附被授权人身份证复印件）、道路运输经营许可证等。</p>" },
		];
	}

	function defaultLeaseBlocks() {
		return v266LeaseBlocks();
	}
	function defaultPurchaseBlocks() {
		return [
			{ id: 'p1', title: '合同标题', content: '车辆采购合同', locked: true },
			{ id: 'p2', title: '合同编号', content: '合同编号：{{contractCode}}', locked: true },
			{ id: 'p3', title: '买方信息', content: '买方：浙江羚牛氢能科技有限公司\n地址：浙江省嘉兴市南湖区科技大道 1 号', locked: true },
			{ id: 'p4', title: '卖方信息', content: '卖方：{{supplierName}}\n统一社会信用代码：{{supplierCreditCode}}', locked: false },
			{ id: 'p5', title: '采购标的', content: '一、采购标的\n车辆型号：{{vehicleModel}}\n数量：{{quantity}} 台\n单价：¥{{unitPrice}}', locked: false },
			{ id: 'p6', title: '交付条款', content: '二、交付\n交付地点：{{deliveryPlace}}\n交付日期：{{deliveryDate}}', locked: false },
			{ id: 'p7', title: '付款方式', content: '三、付款方式\n{{paymentTerms}}', locked: true },
			{ id: 'p8', title: '签章页', content: '买方（盖章）：____________    卖方（盖章）：____________', locked: true }
		];
	}

	function defaultServiceBlocks() {
		return [
			{ id: 's1', title: '合同标题', content: '氢能车辆运维服务合同', locked: true },
			{ id: 's2', title: '合同编号', content: '合同编号：{{contractCode}}', locked: true },
			{ id: 's3', title: '委托方', content: '委托方（甲方）：{{customerName}}', locked: false },
			{ id: 's4', title: '服务方', content: '服务方（乙方）：浙江羚牛氢能科技有限公司', locked: true },
			{ id: 's5', title: '服务内容', content: '一、服务内容\n包括但不限于车辆日常运维、故障响应、定期巡检等。', locked: false },
			{ id: 's6', title: '服务期限', content: '二、服务期限\n自 {{serviceStart}} 至 {{serviceEnd}}', locked: false },
			{ id: 's7', title: '服务费用', content: '三、服务费用\n服务费合计：¥{{serviceFee}}', locked: false },
			{ id: 's8', title: '违约责任', content: '四、违约责任\n（标准条款，锁定不可修改）', locked: true }
		];
	}

	function getDefaultBlocksForCategory(category) {
		if (category === 'purchase') return defaultPurchaseBlocks();
		if (category === 'service') return defaultServiceBlocks();
		return defaultLeaseBlocks();
	}

	function mockWordBlocks(fileName, category) {
		var cat = category || 'lease';
		var name = fileName || 'Word';
		if (cat === 'lease' && (/\.docx?$/i.test(name) || /V26\.[56]|现代18吨|数智中心版|商用车租赁合同/i.test(name))) {
			return JSON.parse(JSON.stringify(v266LeaseBlocks()));
		}
		var base = getDefaultBlocksForCategory(cat);
		base[0].content = base[0].content + '（导入自 ' + name + '）';
		return base;
	}

	var templatesState = useState(buildInitialSectionTemplates);
	var templates = templatesState[0];
	var setTemplates = templatesState[1];

	var categoryFilterState = useState('lease');
	var categoryFilter = categoryFilterState[0];
	var setCategoryFilter = categoryFilterState[1];

	var pageViewState = useState('list');
	var pageView = pageViewState[0];
	var setPageView = pageViewState[1];

	var editorModeState = useState('create');
	var editorMode = editorModeState[0];
	var setEditorMode = editorModeState[1];

	var editingRecordState = useState(null);
	var editingRecord = editingRecordState[0];
	var setEditingRecord = editingRecordState[1];

	var lastImportFileNameState = useState('');
	var importChangedInSessionState = useState(false);
	var formBlocksState = useState([]);
	var formDocumentHtmlState = useState('');

	var deleteModalState = useState(false);
	var deleteTargetState = useState(null);
	var defaultConfirmModalState = useState(false);
	var defaultConfirmTargetState = useState(null);
	var editorSyncKeyState = useState(0);
	var editorInsertHandlerRef = useRef(null);
	var registerEditorInsertRef = useRef(function (fn) { editorInsertHandlerRef.current = fn; });
	var placeholderPopoverOpenState = useState(false);
	var previewLessorIdState = useState('gd');
	var previewLessorId = previewLessorIdState[0];

	var sectionContentsState = useState(function () { return emptySectionMap(); });
	var sectionContents = sectionContentsState[0];
	var setSectionContents = sectionContentsState[1];
	var activeSectionKeyState = useState('main');
	var activeSectionKey = activeSectionKeyState[0];
	var setActiveSectionKey = activeSectionKeyState[1];
	var sectionMoreOpenState = useState(false);
	var sectionMoreSearchState = useState('');
	var editorSectionKeyState = useState(null);
	var editorSectionKey = editorSectionKeyState[0];
	var setEditorSectionKey = editorSectionKeyState[1];
	var formVehicleBindingsState = useState([]);
	var formVehicleBindings = formVehicleBindingsState[0];
	var setFormVehicleBindings = formVehicleBindingsState[1];
	var vehicleBindingBrandState = useState('现代');
	var vehicleBindingModelState = useState('');
	var listFilterDraftState = useState(createEmptyListFilter);
	var listFilterDraft = listFilterDraftState[0];
	var setListFilterDraft = listFilterDraftState[1];
	var listFilterAppliedState = useState(createEmptyListFilter);
	var listFilterApplied = listFilterAppliedState[0];
	var setListFilterApplied = listFilterAppliedState[1];
	var editorScrollElRef = useRef(null);
	var previewScrollElRef = useRef(null);
	var scrollSyncLockRef = useRef(false);
	var workspaceZoomState = useState(100);
	var workspaceZoom = workspaceZoomState[0];
	var setWorkspaceZoom = workspaceZoomState[1];

	function attachWorkspaceScrollSync(el) {
		if (!el || el.dataset.ctScrollSyncBound === '1') return;
		el.dataset.ctScrollSyncBound = '1';
		el.addEventListener('scroll', function () {
			if (scrollSyncLockRef.current) return;
			var editorEl = editorScrollElRef.current;
			var previewEl = previewScrollElRef.current;
			if (!editorEl || !previewEl) return;
			if (el !== editorEl && el !== previewEl) return;
			scrollSyncLockRef.current = true;
			var to = el === editorEl ? previewEl : editorEl;
			var fromMax = el.scrollHeight - el.clientHeight;
			var toMax = to.scrollHeight - to.clientHeight;
			if (fromMax > 0 && toMax > 0) {
				to.scrollTop = (el.scrollTop / fromMax) * toMax;
			}
			requestAnimationFrame(function () { scrollSyncLockRef.current = false; });
		}, { passive: true });
	}

	function registerEditorScrollContainer(el) {
		editorScrollElRef.current = el || null;
		if (el) attachWorkspaceScrollSync(el);
	}

	function registerPreviewScrollContainer(el) {
		previewScrollElRef.current = el || null;
		if (el) attachWorkspaceScrollSync(el);
	}


	var CURRENT_USER = '法务-当前用户';

	var pageStyle = ONEOS_ANT_TABLE_GLOBAL_FIX.concat([
		'.vm-page.ct-page,.ct-page{color:var(--ln-body)}' +
		'.ct-page *{box-sizing:border-box}' +
		'.ct-modal-form-label{display:block;margin-bottom:6px;font-size:12px;font-weight:500;color:#64748B}' +
		'.ct-rich-toolbar{background:#FAFBFC;border:1px solid #E2E8F0;border-bottom:none;border-radius:8px 8px 0 0;padding:6px 10px 4px;flex-shrink:0}' +
		'.ct-rich-toolbar__row{display:flex;align-items:center;flex-wrap:nowrap;gap:4px;min-height:36px;padding:3px 0;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:#CBD5E1 transparent}' +
		'.ct-rich-toolbar__row::-webkit-scrollbar{height:4px}' +
		'.ct-rich-toolbar__row::-webkit-scrollbar-thumb{background:#CBD5E1;border-radius:999px}' +
		'.ct-rich-toolbar__row+.ct-rich-toolbar__row{border-top:1px solid #E2E8F0;margin-top:4px;padding-top:6px}' +
		'.ct-rich-toolbar__tail{display:inline-flex;align-items:center;gap:4px;margin-left:auto;flex-shrink:0;padding-left:8px}' +
		'.ct-rte-sep{width:1px;height:18px;background:#E8E8E8;margin:0 5px;flex-shrink:0}' +
		'.ct-rte-btn{display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:28px;border:none;background:transparent;border-radius:4px;color:#595959;cursor:pointer;padding:0 4px;transition:background .15s,color .15s;flex-shrink:0;font:inherit}' +
		'.ct-rte-btn:hover{background:#F5F5F5;color:#262626}' +
		'.ct-rte-btn.is-active{background:var(--ln-primary-soft);color:var(--ln-primary-focus)}' +
		'.ct-rte-btn:disabled{opacity:.35;cursor:not-allowed}' +
		'.ct-rte-btn:focus-visible{outline:none;box-shadow:inset 0 0 0 1px var(--vm-focus-border-color)}' +
		'.ct-rte-btn--dropdown{gap:2px;padding:0 4px 0 6px}' +
		'.ct-rte-letter{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;font-size:13px;font-weight:600;line-height:1;min-width:14px;font-family:"Inter, "PingFang SC", "Microsoft YaHei"",sans-serif}' +
		'.ct-rte-letter.is-italic{font-style:italic;font-weight:500}' +
		'.ct-rte-letter__bar{display:block;width:14px;height:2px;margin-top:1px;border-radius:1px;background:#595959}' +
		'.ct-rte-letter--highlight{background:#FEF08A;border-radius:2px;padding:0 2px}' +
		'.ct-rte-svg{display:block;flex-shrink:0}' +
		'.ct-rte-svg--chevron{width:10px;height:10px;opacity:.45;margin-left:-2px}' +
		'.ct-rte-align-group{display:inline-flex;align-items:center;background:#FAFAFA;border-radius:4px;padding:2px;gap:1px;flex-shrink:0}' +
		'.ct-rte-align-group .ct-rte-btn{min-width:26px;height:26px}' +
		'.ct-rte-select.ant-select{font-size:13px;color:#262626;flex-shrink:0}' +
		'.ct-rte-select .ant-select-selector{background:transparent!important;border:none!important;box-shadow:none!important;padding:0 18px 0 6px!important;height:28px!important;min-height:28px!important}' +
		'.ct-rte-select .ant-select-selection-item,.ct-rte-select .ant-select-selection-placeholder{line-height:28px!important;font-size:13px;color:#262626}' +
		'.ct-rte-select .ant-select-arrow{color:#8C8C8C;right:4px}' +
		'.ct-rte-select--size{width:68px}' +
		'.ct-rte-select--font{width:108px}' +
		'.ct-rte-dropdown-wrap{display:inline-flex;align-items:center}' +
		'.ct-rich-toolbar .ant-btn:focus-visible,.ct-page .ant-btn:focus-visible{outline:none;box-shadow:inset 0 0 0 1px var(--vm-focus-border-color)}' +
		'@media(max-width:992px){.ct-editor-panel,.ct-preview-panel{max-height:none}.ct-rich-editor{min-height:320px;max-height:420px}}' +
		'@media(prefers-reduced-motion:reduce){.ct-rich-toolbar .ant-btn{transition:none}}' +
		'.ct-preview-doc{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:32px 40px;min-height:520px;box-shadow:0 2px 12px rgba(15,23,42,0.06);font-size:14px;line-height:1.85;color:#1e293b}' +
		'.ct-preview-doc h1{text-align:center;font-size:20px;font-weight:700;margin:0 0 24px;color:#0f172a}' +
		'.ct-preview-section{margin-bottom:18px;word-break:break-word}' +
		'.ct-preview-section__body{line-height:1.85}' +
		'.ct-preview-section__body p{margin:0 0 10px}' +
		'.ct-preview-section__body strong{font-weight:700;color:#0f172a}' +
		'.ct-preview-section__body em{font-style:italic}' +
		'.ct-preview-section__body img{max-width:100%;height:auto;margin:10px 0;border-radius:4px;display:block}' +
		'.ct-preview-doc table.ct-doc-table,.ct-rich-editor table.ct-doc-table{width:100%;border-collapse:collapse;margin:12px 0;font-size:13px}' +
		'.ct-preview-doc table.ct-doc-table td,.ct-preview-doc table.ct-doc-table th,.ct-rich-editor table.ct-doc-table td,.ct-rich-editor table.ct-doc-table th{border:1px solid #cbd5e1;padding:6px 10px;min-width:48px;vertical-align:top}' +
		'.ct-preview-doc table.ct-doc-table th,.ct-rich-editor table.ct-doc-table th{background:#f1f5f9;font-weight:600}' +
		'.ct-preview-doc h2,.ct-rich-editor h2{font-size:18px;font-weight:700;margin:16px 0 10px}' +
		'.ct-preview-doc h3,.ct-rich-editor h3{font-size:16px;font-weight:600;margin:14px 0 8px}' +
		'.ct-preview-doc ul,.ct-preview-doc ol,.ct-rich-editor ul,.ct-rich-editor ol{margin:8px 0;padding-left:24px}' +
		'.ct-preview-doc blockquote,.ct-rich-editor blockquote{margin:10px 0;padding:8px 14px;border-left:3px solid #cbd5e1;background:#f8fafc;color:#475569}' +
		'.ct-preview-doc a,.ct-rich-editor a{color:var(--ln-link);text-decoration:underline}' +
		'.ct-inline-lock{background:#fef3c7;border-bottom:1px dashed #f59e0b;padding:0 2px;border-radius:2px}' +
		'.ct-preview-doc .ct-inline-lock{background:#f8fafc;border-left:2px solid #94a3b8;padding:2px 4px}' +
		'.ct-rich-editor .ct-risk-redline,.ct-preview-doc .ct-risk-redline,.ct-preview-page__body .ct-risk-redline,.ct-word-doc .ct-risk-redline{background:rgba(254,226,226,0.4);border:1px dashed #f87171;border-radius:3px;padding:0 2px;box-decoration-break:clone;-webkit-box-decoration-break:clone}' +
		'.ct-rte-btn--text{width:auto;padding:0 10px;font-size:12px;font-weight:600;color:#dc2626;border:1px solid #fecaca;background:#fef2f2;border-radius:4px;min-width:auto;height:28px;gap:4px}' +
		'.ct-rte-btn--text:hover{background:#fee2e2;border-color:#fca5a5;color:#b91c1c}' +
		'.ct-rte-btn--text.is-muted{color:#64748B;border-color:#E2E8F0;background:#F8FAFC;font-weight:500}' +
		'.ct-rte-btn--text.is-muted:hover{background:#F1F5F9;color:#475569}' +
		'.ct-rte-btn--text.is-compact{height:26px;min-height:26px;padding:0 6px;font-size:11px;font-weight:600;white-space:nowrap}' +
		'.ct-rich-wrap{margin-top:0;display:flex;flex-direction:column;flex:1;min-height:0;height:100%}' +
		'.ct-rich-editor{flex:1;min-height:0;overflow-y:auto;padding:16px 20px;border:1px solid #e2e8f0;border-top:none;border-radius:0 0 8px 8px;background:#fff;font-size:14px;line-height:1.75;outline:none;word-break:break-word}' +
		'.ct-rich-editor--word{font-size:unset;line-height:unset;color:unset;padding:20px 24px;overflow-x:auto;overflow-y:auto;max-height:none;word-break:normal}' +
		'.ct-rich-wrap--word-a4 .ct-editor-a4-shell{position:relative;flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}' +
		'.ct-rich-wrap--word-a4 .ct-editor-a4-scroll{flex:1;min-height:0;overflow:auto;background:#b8b8b8;padding:16px 12px}' +
		'.ct-word-a4-pages{display:flex;flex-direction:column;align-items:center;gap:20px;width:100%;box-sizing:border-box;padding:4px 5px 12px}' +
		'.ct-word-a4-page{width:210mm;max-width:calc(100% - 10px);min-height:297mm;padding:25.4mm 31.8mm;box-sizing:border-box;background:#fff;border:1px solid #d9d9d9;box-shadow:0 2px 12px rgba(0,0,0,.12);position:relative;flex-shrink:0;margin-inline:0}' +
		'.ct-word-a4-page.is-active{box-shadow:0 0 0 2px var(--ln-primary),0 2px 12px rgba(0,0,0,.12)}' +
		'.ct-word-a4-page.is-loading{min-height:120px;display:flex;align-items:center;justify-content:center;color:#94A3B8;font-size:13px;width:210mm;padding:24px}' +
		'.ct-word-a4-page__body{width:100%;min-height:calc(297mm - 50.8mm);outline:none;word-break:break-word;border:none;border-radius:0;padding:0;overflow:visible;max-height:none}' +
		'.ct-word-a4-page__body:focus{box-shadow:none}' +
		'.ct-word-a4-page__footer{position:absolute;bottom:10mm;left:0;right:0;text-align:center;font-size:9pt;color:#999;font-family:FangSong,STFangsong,"仿宋",SimSun,"宋体",serif;pointer-events:none}' +
		'.ct-rich-editor.ct-rich-editor--a4{width:210mm;max-width:100%;min-height:297mm;margin:0 auto;padding:25.4mm 31.8mm;box-sizing:border-box;background:#fff;background-image:repeating-linear-gradient(to bottom,#fff 0,#fff calc(297mm - 1px),#e2e8f0 calc(297mm - 1px),#e2e8f0 297mm);background-size:100% 297mm;border:1px solid #d9d9d9;box-shadow:0 2px 12px rgba(0,0,0,.12);overflow-x:auto;overflow-y:visible;padding-bottom:25.4mm}' +
		'.ct-rich-editor--word .ct-word-doc--v266{display:block;width:100%;min-width:0;padding:0!important;font-size:unset;line-height:unset;color:#000;font-family:Times,"Times New Roman",FangSong,STFangsong,"仿宋",SimSun,"宋体",serif;letter-spacing:normal}' +
		'.ct-rich-editor--word .ct-word-doc--v266 p,.ct-rich-editor--word .ct-word-doc--v266 span,.ct-rich-editor--word .ct-word-doc--v266 td,.ct-rich-editor--word .ct-word-doc--v266 th{font-family:inherit}' +
		'.ct-rich-editor--word .ct-word-doc--v266 table.ct-word-table,.ct-rich-editor--word .ct-word-doc--v266 table.ct-doc-table{max-width:none;width:100%;table-layout:auto}' +
		'.ct-rich-editor--word .ct-word-doc--v266 style{display:none!important}' +
		'.ct-rich-editor:focus{border-color:var(--ln-primary);box-shadow:inset 0 0 0 1px var(--ln-primary)}' +
		'.ct-rich-editor.is-readonly{background:#f8fafc;color:#475569;cursor:default}' +
		'.ct-rich-editor img{max-width:100%;height:auto;margin:8px 0;border-radius:4px;display:block}' +
		'.ct-rich-wrap.is-fullscreen{position:fixed;inset:0;z-index:1100;background:#fff;padding:12px;display:flex;flex-direction:column}' +
		'.ct-rich-wrap.is-fullscreen .ct-rich-editor{max-height:none;min-height:0;flex:1}' +
		'.ct-rich-wrap.is-fullscreen .ct-rich-toolbar{border-radius:8px}' +
		'.ct-rich-source{width:100%;flex:1;min-height:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;line-height:1.6;padding:14px 16px;border:1px solid #E2E8F0;border-top:none;border-radius:0 0 8px 8px;resize:none;outline:none;overflow-y:auto}' +
		'.ct-rich-source:focus{border-color:var(--ln-primary);box-shadow:inset 0 0 0 1px var(--ln-primary)}' +
		'.ct-page-break{display:block;height:0;border:none;border-top:2px dashed #CBD5E1;margin:24px 0;page-break-after:always}' +
		'.ct-preview-doc .ct-page-break{border-top-color:#94A3B8}' +
		'.ct-preview-doc.ct-word-doc,.ct-preview-doc .ct-word-doc{font-family:FangSong,STFangsong,"仿宋",SimSun,"宋体",serif;font-size:10.5pt;line-height:1.5;color:#000;letter-spacing:0}' +
		'.ct-preview-doc.ct-word-doc{padding:48px 56px 56px}' +
		'.ct-word-doc p{margin:0 0 4px}' +
		'.ct-word-title{text-align:center;font-size:18pt;font-weight:700;margin:0 0 10px!important;line-height:1.4}' +
		'.ct-word-contract-no{text-align:right;margin:0 0 14px!important;padding-right:1em;font-size:10.5pt}' +
		'.ct-word-party-line{margin:0!important;line-height:1.8;font-size:10.5pt}' +
		'.ct-word-body{text-align:justify;text-justify:inter-ideograph;margin:0 0 4px!important}' +
		'.ct-word-clause-indent,.ct-word-clause-indent2{text-align:justify;text-justify:inter-ideograph;text-indent:2em;margin:0 0 4px!important}' +
		'.ct-word-clause-title{text-align:justify;text-justify:inter-ideograph;margin:6px 0 4px!important;font-weight:700}' +
		'.ct-word-table{width:100%;border-collapse:collapse;margin:6px 0 12px;table-layout:fixed}' +
		'.ct-word-table .ct-word-party-left,.ct-word-table .ct-word-party-right{width:50%;border:none!important;padding:2px 6px;vertical-align:top}' +
		'.ct-word-table .ct-word-party-left{padding-right:12px}' +
		'.ct-word-table .ct-word-party-right{padding-left:12px}' +
		'.ct-word-table .ct-word-td{border:1px solid #bfbfbf;padding:4px 6px;vertical-align:top;font-size:10.5pt}' +
		'.ct-word-table .ct-word-td.ct-word-td-full,.ct-word-table td[colspan]{width:100%}' +
		'.ct-word-table .ct-word-td p{margin:0!important}' +
		'.ct-preview-doc.ct-word-doc b,.ct-preview-doc.ct-word-doc strong{font-weight:700}' +
		'.ct-preview-doc.ct-word-doc .ct-preview-section__body{line-height:1.5}' +
		'.ct-preview-doc.ct-word-paginated{padding:0!important;background:transparent!important;border:none!important;box-shadow:none!important;min-height:0!important;display:flex;flex-direction:column;flex:1;height:100%}' +
		'.ct-editor-workspace .ct-rich-toolbar,.ct-editor-workspace .ct-preview-toolbar{height:99px;min-height:99px;max-height:99px;overflow:hidden}' +
		'.ct-editor-workspace .ct-rich-toolbar__row,.ct-editor-workspace .ct-preview-toolbar__row{min-height:42px;height:42px;padding-top:0;padding-bottom:0;align-items:center}' +
		'.ct-editor-workspace .ct-rich-toolbar__row+.ct-rich-toolbar__row,.ct-editor-workspace .ct-preview-toolbar__row+.ct-preview-toolbar__row{margin-top:4px;padding-top:0;border-top:1px solid #E2E8F0}' +
		'.ct-editor-workspace .ct-preview-toolbar .ct-preview-pager__icon-btn{min-width:32px;min-height:32px;width:32px;height:32px}' +
		'.ct-preview-toolbar{display:flex;flex-direction:column;align-items:stretch;background:#FAFBFC;border:1px solid #E2E8F0;border-bottom:none;border-radius:8px 8px 0 0;padding:6px 10px 4px;flex-shrink:0;box-sizing:border-box}' +
		'.ct-preview-toolbar__row{display:flex;align-items:center;justify-content:center;flex-wrap:nowrap;gap:4px;min-height:36px;padding:3px 0;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:#CBD5E1 transparent}' +
		'.ct-preview-toolbar__row+.ct-preview-toolbar__row{border-top:1px solid #E2E8F0;margin-top:4px;padding-top:6px}' +
		'.ct-preview-toolbar__row.ct-preview-pager{gap:12px;flex-wrap:wrap}' +
		'.ct-preview-toolbar .ct-preview-pager{position:static;top:auto;z-index:auto;width:100%;max-width:100%;margin:0;padding:0;background:transparent;border:none;border-radius:0;box-shadow:none;align-self:stretch}' +
		'.ct-preview-body-shell{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}' +
		'.ct-editor-workspace .ct-editor-a4-scroll,.ct-editor-workspace .ct-preview-pages-wrap{flex:1;min-height:0;overflow:auto;padding:16px 12px;scrollbar-width:thin;scrollbar-color:#CBD5E1 transparent}' +
		'.ct-preview-pager-shell{position:relative;display:flex;flex-direction:column;flex:1;min-height:0;width:100%}' +
		'.ct-preview-pager{position:sticky;top:8px;z-index:20;display:flex;align-items:center;justify-content:center;gap:12px;margin:0 auto 0;padding:8px 12px;flex-wrap:wrap;background:#fff;border:1px solid #E2E8F0;border-radius:8px;box-shadow:0 4px 16px rgba(15,23,42,.12);align-self:center;width:calc(100% - 16px);max-width:100%;flex-shrink:0}' +
		'.ct-preview-pager__group{display:flex;align-items:center;gap:8px;flex-wrap:wrap}' +
		'.ct-preview-pager__group-label{font-size:12px;font-weight:500;color:#64748B;white-space:nowrap}' +
		'.ct-preview-pager__group-body{display:flex;align-items:center;gap:6px;flex-wrap:wrap}' +
		'.ct-preview-pager__btn{min-height:32px!important;height:32px!important;padding:0 10px!important;font-size:13px!important}' +
		'.ct-preview-pager__icon-btn{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;width:44px;height:44px;padding:0;border:none;border-radius:6px;background:transparent;color:#64748B;cursor:pointer;transition:background .15s,color .15s,box-shadow .15s;flex-shrink:0}' +
		'.ct-preview-pager__icon-btn:hover:not(:disabled){background:#F1F5F9;color:#0F172A}' +
		'.ct-preview-pager__icon-btn:disabled{opacity:.45;cursor:not-allowed}' +
		'.ct-preview-pager__icon-btn:focus-visible{outline:none;box-shadow:inset 0 0 0 1px #32a06e}' +
		'.ct-preview-pager__icon-btn .ct-preview-pager__icon-svg{width:20px;height:20px;display:block;flex-shrink:0}' +
		'.ct-preview-pager__page{display:inline-flex;align-items:center;justify-content:center;min-width:72px;padding:4px 10px;font-size:13px;font-weight:500;color:#334155;background:#F8FAFC;border:1px solid #E2E8F0;border-radius:6px;font-variant-numeric:tabular-nums}' +
		'.ct-preview-pager__page-current{color:#0F172A;font-weight:600}' +
		'.ct-preview-pager__divider{width:1px;align-self:stretch;min-height:28px;background:#E2E8F0;flex-shrink:0}' +
		'.ct-preview-pager__segmented{display:inline-flex;padding:2px;background:#F1F5F9;border:1px solid #E2E8F0;border-radius:8px;gap:2px}' +
		'.ct-preview-pager__segment{min-height:32px;min-width:44px;padding:0 12px;border:none;border-radius:6px;background:transparent;color:#64748B;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s,color .15s,box-shadow .15s}' +
		'.ct-preview-pager__segment:hover{color:#334155;background:rgba(255,255,255,.6)}' +
		'.ct-preview-pager__segment.is-active{background:#fff;color:#2b9260;box-shadow:0 1px 2px rgba(15,23,42,.08)}' +
		'.ct-preview-pager__segment:focus-visible{outline:none;box-shadow:inset 0 0 0 1px #32a06e}' +
		'.ct-preview-zoom-select{min-width:88px}' +
		'.ct-preview-zoom-select .ant-select-selector{min-height:32px!important;height:32px!important}' +
		'.ct-preview-pages-wrap{overflow:auto;width:100%;flex:1;min-height:0}' +
		'.ct-preview-pages{display:flex;flex-direction:column;align-items:center;gap:20px;width:100%;box-sizing:border-box;padding:4px 5px 12px}' +
		'.ct-preview-page{width:210mm;max-width:calc(100% - 10px);min-height:297mm;padding:25.4mm 31.8mm;box-sizing:border-box;background:#fff;border:1px solid #d9d9d9;box-shadow:0 2px 12px rgba(0,0,0,0.12);position:relative;flex-shrink:0;margin-inline:0}' +
		'.ct-preview-page__body{width:100%;overflow:hidden;word-break:break-word}' +
		'.ct-preview-page__footer{position:absolute;bottom:10mm;left:0;right:0;text-align:center;font-size:9pt;color:#999;font-family:FangSong,STFangsong,"仿宋",SimSun,"宋体",serif}' +
		'.ct-preview-page.is-loading{min-height:120px;display:flex;align-items:center;justify-content:center;color:#94A3B8;font-size:13px;width:210mm}' +
		'.ct-preview-panel--word{background:#b8b8b8;padding:0}' +
		'.ct-rich-editor .ct-word-doc:not(.ct-word-doc--v266),.ct-rich-editor .ct-word-doc:not(.ct-word-doc--v266){font-family:FangSong,STFangsong,"仿宋",SimSun,"宋体",serif;font-size:10.5pt;line-height:1.5;color:#000}' +
		'.ct-rich-editor .ct-word-title{text-align:center;font-size:18pt;font-weight:700}' +
		'.ct-rich-editor .ct-word-contract-no{text-align:right;padding-right:1em}' +
		'.ct-rich-editor .ct-word-clause-indent,.ct-rich-editor .ct-word-clause-indent2{text-indent:2em;text-align:justify}' +
		'.ct-rich-editor .ct-word-table{width:100%;border-collapse:collapse;margin:6px 0}' +
		'.ct-rich-editor .ct-word-table .ct-word-party-left,.ct-rich-editor .ct-word-table .ct-word-party-right{width:50%;border:none!important;vertical-align:top}' +
		'.ct-rich-editor .ct-word-table .ct-word-td{border:1px solid #bfbfbf;padding:4px 6px;vertical-align:top}' +
		'.ct-word-doc--v266,.ct-word-doc--v266 .ct-preview-page__body{font-family:Times,"Times New Roman",FangSong,STFangsong,"仿宋",SimSun,"宋体",serif}' +
		'.ct-preview-doc .ct-word-doc--v266{padding:0!important;font-size:unset;line-height:unset;color:#000}' +
		'.ct-rich-editor .ct-word-doc--v266{padding:0!important;font-size:unset;line-height:unset;color:#000}' +
		'.ct-preview-doc .ct-word-doc--v266 .ct-word-title,.ct-rich-editor .ct-word-doc--v266 .ct-word-title{text-align:center;font-size:18pt;font-weight:700}' +
		'.ct-preview-doc .ct-word-doc--v266 .ct-word-contract-no,.ct-rich-editor .ct-word-doc--v266 .ct-word-contract-no{text-align:right;padding-right:1em}' +
		'.ct-preview-doc .ct-word-doc--v266 table.ct-word-table,.ct-rich-editor .ct-word-doc--v266 table.ct-word-table{border-collapse:collapse;width:100%}' +
		'.ct-preview-doc .ct-word-doc--v266 .ct-risk-redline,.ct-rich-editor .ct-word-doc--v266 .ct-risk-redline{color:inherit}' +
		'.ct-placeholder-card{width:320px;max-height:420px;overflow:auto}' +
		'.ct-placeholder-card__head{margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid #E2E8F0}' +
		'.ct-placeholder-card__title{font-size:13px;font-weight:600;color:#334155;margin:0 0 4px}' +
		'.ct-placeholder-card__desc{font-size:12px;color:#64748B;margin:0;line-height:1.5}' +
		'.ct-placeholder-card__group{margin-bottom:12px}' +
		'.ct-placeholder-card__group:last-child{margin-bottom:0}' +
		'.ct-placeholder-card__group-title{font-size:12px;font-weight:600;color:#475569;margin:0 0 6px}' +
		'.ct-placeholder-card__group-desc{font-size:11px;color:#94A3B8;margin:0 0 8px;line-height:1.45}' +
		'.ct-placeholder-card__item{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border:1px solid #E2E8F0;border-radius:8px;background:#fff;cursor:pointer;transition:background .15s,border-color .15s,box-shadow .15s;margin-bottom:6px}' +
		'.ct-placeholder-card__item:last-child{margin-bottom:0}' +
		'.ct-placeholder-card__item:hover{background:#F8FAFC;border-color:#CBD5E1;box-shadow:0 1px 4px rgba(15,23,42,.06)}' +
		'.ct-placeholder-card__item-main{min-width:0;flex:1}' +
		'.ct-placeholder-card__item-label{font-size:12px;color:#334155;font-weight:500}' +
		'.ct-placeholder-card__item-token{font-size:11px;color:#64748B;font-family:ui-monospace,Menlo,monospace;margin-top:2px;word-break:break-all}' +
		'.ct-placeholder-card__item-actions{display:flex;gap:4px;flex-shrink:0}' +
		'.ct-placeholder-card__action{font-size:11px;color:#64748B;padding:2px 6px;border-radius:4px;border:1px solid #E2E8F0;background:#F8FAFC;cursor:pointer}' +
		'.ct-placeholder-card__action:hover{color:var(--ln-primary);border-color:var(--ln-hairline-strong);background:var(--ln-primary-soft)}' +
		'.ct-editor-page{display:flex;flex-direction:column;flex:1;min-height:0;height:100%}'
	]).join('\n');

	function statusTag(status) {
		if (status === 'published') return React.createElement(Tag, { color: 'success' }, '已发布');
		if (status === 'draft') return React.createElement(Tag, { color: 'processing' }, '草稿');
		return React.createElement(Tag, null, '已归档');
	}

	function loadDocumentFromBlocks(blocks) {
		var html = mergeBlocksToDocument(blocks);
		formDocumentHtmlState[1](html);
		formBlocksState[1](blocks);
		setSectionContents(splitHtmlIntoSections(html));
		setActiveSectionKey('main');
	}

	function getActiveSectionHtml() {
		return (sectionContents && sectionContents[activeSectionKey]) ? sectionContents[activeSectionKey] : '';
	}

	function syncActiveSectionHtml(html) {
		var next = Object.assign({}, sectionContents || emptySectionMap());
		next[activeSectionKey] = html;
		setSectionContents(next);
		var merged = mergeSectionsToDocument(next);
		formDocumentHtmlState[1](merged);
		formBlocksState[1](documentToBlocks(merged));
	}

	function parseVersionNo(versionNo) {
		var m = String(versionNo || '').match(/^[vV](\d+)\.(\d{1,2})$/);
		if (!m) return null;
		return { major: parseInt(m[1], 10), minor: parseInt(m[2], 10) };
	}

	function formatVersionNo(major, minor) {
		return 'v' + major + '.' + String(minor).padStart(2, '0');
	}

	function formatNowTime() {
		return '2026-06-09 ' + new Date().toTimeString().slice(0, 5);
	}

	function generateNextVersionNo(sectionKey) {
		var list = templates.filter(function (t) {
			return t.sectionKey === sectionKey && t.status === 'published' && t.versionNo;
		});
		var maxMajor = 0;
		var maxMinor = -1;
		list.forEach(function (t) {
			var parsed = parseVersionNo(t.versionNo);
			if (!parsed) return;
			if (parsed.major > maxMajor || (parsed.major === maxMajor && parsed.minor > maxMinor)) {
				maxMajor = parsed.major;
				maxMinor = parsed.minor;
			}
		});
		if (maxMinor < 0) return 'v1.00';
		if (maxMinor >= 99) return formatVersionNo(maxMajor + 1, 0);
		return formatVersionNo(maxMajor, maxMinor + 1);
	}

	function stripFileExtension(name) {
		return String(name || '').replace(/\.[^.]+$/, '');
	}

	function buildAutoVersionName(sectionKey, versionNo, importFileName) {
		var imported = stripFileExtension(importFileName);
		if (imported) return imported;
		var sectionLabel = getSectionTabLabel(sectionKey);
		if (!versionNo) return sectionLabel + ' 草稿';
		return sectionLabel + ' ' + versionNo;
	}

	function buildSectionTemplateItem(sectionKey, publish, contentHtml, vehicleBindings, importName, editing) {
		var now = formatNowTime();
		var bindings = sectionAllowsVehicleBinding(sectionKey)
			? JSON.parse(JSON.stringify(vehicleBindings || []))
			: [];
		if (publish) {
			var versionNo = generateNextVersionNo(sectionKey);
			return {
				id: 'st-' + Date.now(),
				sectionKey: sectionKey,
				category: categoryFilter,
				versionNo: versionNo,
				versionName: buildAutoVersionName(sectionKey, versionNo, importName),
				status: 'published',
				isDefault: false,
				contentHtml: contentHtml,
				vehicleBindings: bindings,
				creator: CURRENT_USER,
				createTime: now,
				updater: CURRENT_USER,
				updateTime: now,
				remark: editing && editing.remark ? editing.remark : ''
			};
		}
		return {
			id: 'st-' + Date.now(),
			sectionKey: sectionKey,
			category: categoryFilter,
			versionNo: null,
			versionName: buildAutoVersionName(sectionKey, null, importName),
			status: 'draft',
			isDefault: false,
			contentHtml: contentHtml,
			vehicleBindings: bindings,
			creator: CURRENT_USER,
			createTime: now,
			updater: CURRENT_USER,
			updateTime: now,
			remark: ''
		};
	}

	function openCreate() {
		var sectionKey = activeSectionKey;
		setEditorMode('create');
		setEditingRecord(null);
		setEditorSectionKey(sectionKey);
		lastImportFileNameState[1]('');
		importChangedInSessionState[1](false);
		formDocumentHtmlState[1]('');
		formBlocksState[1]([]);
		setFormVehicleBindings([]);
		vehicleBindingBrandState[1]('现代');
		vehicleBindingModelState[1]('');
		setSectionContents(emptySectionMap());
		editorSyncKeyState[1](function (v) { return v + 1; });
		setPageView('editor');
	}

	function openEdit(record) {
		var sectionKey = record.sectionKey || 'main';
		setEditorMode('edit');
		setEditingRecord(record);
		setEditorSectionKey(sectionKey);
		setActiveSectionKey(sectionKey);
		lastImportFileNameState[1]('');
		importChangedInSessionState[1](false);
		var html = resolveRecordContentHtml(record);
		formDocumentHtmlState[1](html);
		formBlocksState[1]([{ id: 'section-' + sectionKey, title: getSectionTabLabel(sectionKey), content: html, locked: false }]);
		setFormVehicleBindings(JSON.parse(JSON.stringify(record.vehicleBindings || [])));
		vehicleBindingBrandState[1]((record.vehicleBindings && record.vehicleBindings[0]) ? record.vehicleBindings[0].brand : '现代');
		vehicleBindingModelState[1]('');
		editorSyncKeyState[1](function (v) { return v + 1; });
		setPageView('editor');
	}

	function handleImportWord(file) {
		var name = file && file.name ? file.name : 'Word';
		var sectionKey = editorSectionKey || activeSectionKey || 'main';
		lastImportFileNameState[1](name);
		importChangedInSessionState[1](true);
		var blocks = mockWordBlocks(name, categoryFilter);
		var fullHtml = mergeBlocksToDocument(blocks);
		formDocumentHtmlState[1](fullHtml);
		formBlocksState[1]([{ id: 'section-' + sectionKey, title: getSectionTabLabel(sectionKey), content: fullHtml, locked: false }]);
		editorSyncKeyState[1](function (v) { return v + 1; });
		message.success('已导入 Word 合同全文，可在编辑区查看完整内容与原版式');
		return false;
	}

	function syncSectionEditorHtml(html) {
		formDocumentHtmlState[1](html);
	}

	function syncDocumentHtml(html) {
		formDocumentHtmlState[1](html);
		formBlocksState[1](documentToBlocks(html));
		setSectionContents(splitHtmlIntoSections(html));
	}

	function handleSaveTemplate(publish) {
		var sectionKey = editorSectionKey || activeSectionKey || 'main';
		var contentHtml = extractSectionFromWordHtml((formDocumentHtmlState[0] || '').trim(), sectionKey);
		if (!contentHtml) {
			message.warning('请先编辑「' + getSectionTabLabel(sectionKey) + '」内容，或导入 Word 模板');
			return;
		}
		var now = formatNowTime();
		var importName = lastImportFileNameState[0] || '';
		var bindings = sectionAllowsVehicleBinding(sectionKey)
			? JSON.parse(JSON.stringify(formVehicleBindings || []))
			: [];

		if (editorMode === 'create') {
			var created = buildSectionTemplateItem(sectionKey, publish, contentHtml, bindings, importName, null);
			setTemplates(function (prev) { return prev.concat([created]); });
			message.success(publish ? ('已发布，版本号 ' + created.versionNo) : '草稿已保存（未生成版本号）');
		} else if (editingRecord) {
			if (publish) {
				if (editingRecord.status === 'published') {
					var nextVersion = buildSectionTemplateItem(sectionKey, true, contentHtml, bindings, importName || editingRecord.versionName, editingRecord);
					setTemplates(function (prev) { return prev.concat([nextVersion]); });
					message.success('已发布新版本 ' + nextVersion.versionNo + '，原版本保留可回滚');
				} else {
					var publishVersionNo = generateNextVersionNo(sectionKey);
					setTemplates(function (prev) {
						return prev.map(function (t) {
							if (t.id !== editingRecord.id) return t;
							return Object.assign({}, t, {
								versionNo: publishVersionNo,
								versionName: buildAutoVersionName(sectionKey, publishVersionNo, importName || t.versionName),
								status: 'published',
								contentHtml: contentHtml,
								vehicleBindings: bindings,
								updater: CURRENT_USER,
								updateTime: now
							});
						});
					});
					message.success('已发布，版本号 ' + publishVersionNo);
				}
			} else {
				setTemplates(function (prev) {
					return prev.map(function (t) {
						if (t.id !== editingRecord.id) return t;
						var patch = {
							contentHtml: contentHtml,
							vehicleBindings: bindings,
							updater: CURRENT_USER,
							updateTime: now,
							status: 'draft',
							versionNo: null
						};
						if (importName) {
							patch.versionName = buildAutoVersionName(sectionKey, null, importName);
						}
						return Object.assign({}, t, patch);
					});
				});
				message.success('草稿已保存（未生成版本号）');
			}
		}
		backToList();
	}

	function backToList() {
		setPageView('list');
		setEditorSectionKey(null);
		placeholderPopoverOpenState[1](false);
		editorInsertHandlerRef.current = null;
	}

	function confirmSetDefault(record) {
		if (record.status !== 'published') {
			message.warning('仅已发布版本可设为标准模板');
			return;
		}
		defaultConfirmTargetState[1](record);
		defaultConfirmModalState[1](true);
	}

	function handleSetDefault() {
		var record = defaultConfirmTargetState[0];
		if (!record) return;
		setTemplates(function (prev) {
			return prev.map(function (t) {
				if (t.sectionKey !== record.sectionKey) return t;
				return Object.assign({}, t, { isDefault: t.id === record.id });
			});
		});
		defaultConfirmModalState[1](false);
		defaultConfirmTargetState[1](null);
		message.success('已设为标准模板：' + record.versionNo);
	}

	function confirmDelete(record) {
		if (record.isDefault) {
			message.warning('当前为标准模板，无法删除。请先切换其他版本为标准模板。');
			return;
		}
		deleteTargetState[1](record);
		deleteModalState[1](true);
	}

	function handleDelete() {
		var target = deleteTargetState[0];
		if (!target) return;
		if (target.isDefault) {
			message.warning('标准模板无法删除');
			return;
		}
		setTemplates(function (prev) { return prev.filter(function (t) { return t.id !== target.id; }); });
		deleteModalState[1](false);
		deleteTargetState[1](null);
		message.success('已删除模板版本');
	}

	function isWordFormattedDoc(html) {
		var source = String(html || '');
		return /ct-word-doc|ct-word-title|ct-word-doc--v266/.test(source)
			|| /class=\"p\d+\"/.test(source)
			|| /font:\s*\d+(?:\.\d+)?px\s+Times/i.test(source);
	}

	function getLessorCompanies() {
		if (typeof window !== 'undefined' && window.ONEOS_LESSOR_COMPANIES && window.ONEOS_LESSOR_COMPANIES.length) {
			return window.ONEOS_LESSOR_COMPANIES;
		}
		return DEFAULT_LESSOR_COMPANIES;
	}

	function getLessorCompanyById(id) {
		var list = getLessorCompanies();
		return list.find(function (c) { return c.id === id; }) || list.find(function (c) { return c.enabled; }) || list[0] || null;
	}

	function buildLessorVars(company) {
		if (!company) return {};
		return {
			lessorName: company.legalName || '',
			lessorShortName: company.shortName || '',
			lessorAddress: company.address || '',
			lessorContact: company.contact || '',
			lessorPhone: company.phone || '',
			lessorEmail: company.email || '',
			lessorAccountName: company.accountName || company.legalName || '',
			lessorBankName: company.bankName || '',
			lessorBankAccount: company.bankAccount || '',
			lessorHotline: DEFAULT_LESSOR_HOTLINE,
			lessorCreditCode: company.creditCode || ''
		};
	}

	function applyTemplateVars(html, vars) {
		var out = String(html || '');
		Object.keys(vars || {}).forEach(function (key) {
			var val = vars[key] != null ? String(vars[key]) : '';
			out = out.split('{{' + key + '}}').join(val);
		});
		return out;
	}

	function fixWordPreviewHtml(html) {
		if (!html || typeof document === 'undefined') return String(html || '');
		var div = document.createElement('div');
		var cleaned = String(html)
			.replace(/<\/p><td[^>]*>[\s\S]*?<\/tr><\/tbody><\/table>/g, function (frag) {
				return frag.indexOf('<table') >= 0 ? frag : '</p>';
			});
		div.innerHTML = cleaned;
		div.querySelectorAll('table.ct-word-table').forEach(function (table) {
			var maxCols = 0;
			table.querySelectorAll('tr').forEach(function (tr) {
				var cols = 0;
				tr.querySelectorAll('td, th').forEach(function (td) {
					cols += parseInt(td.getAttribute('colspan') || '1', 10);
				});
				if (cols > maxCols) maxCols = cols;
			});
			if (maxCols <= 1) return;
			table.querySelectorAll('tr').forEach(function (tr) {
				var tds = tr.querySelectorAll('td, th');
				var cols = 0;
				tds.forEach(function (td) { cols += parseInt(td.getAttribute('colspan') || '1', 10); });
				if (tds.length === 1 && cols === 1) {
					tds[0].setAttribute('colspan', String(maxCols));
					tds[0].classList.add('ct-word-td-full');
				}
			});
		});
		return div.innerHTML;
	}

	function mergePaginatedEditorHtml(chunks, sourceHtml) {
		var inner = chunks.filter(function (c) { return c != null; }).join('');
		var source = String(sourceHtml || '');
		if (source.indexOf('ct-word-doc--v266') >= 0 || inner.indexOf('ct-word-doc--v266') >= 0) {
			if (inner.indexOf('ct-word-doc--v266') >= 0) return inner;
			return '<div class="ct-word-doc ct-word-doc--v266">' + inner + '</div>';
		}
		if (source.indexOf('ct-word-doc') >= 0 && inner.indexOf('ct-word-doc') < 0) {
			return '<div class="ct-word-doc">' + inner + '</div>';
		}
		return inner || source;
	}

	function isPageBreakNode(node) {
		if (!node || node.nodeType !== 1) return false;
		if (node.nodeName === 'HR' && (
			(node.classList && node.classList.contains('ct-page-break')) ||
			node.getAttribute('data-page-break')
		)) return true;
		return false;
	}

	function paginateWordHtml(html) {
		var MM = 96 / 25.4;
		var contentH = Math.floor((297 - 25.4 * 2) * MM);
		var contentW = Math.floor((210 - 31.8 * 2) * MM);
		var fixed = prepareWordHtml(html);
		if (isWordFormattedDoc(html)) ensureV266WordStyles(html);
		var sandbox = document.createElement('div');
		sandbox.style.cssText = 'position:fixed;left:-20000px;top:0;visibility:hidden;pointer-events:none;';
		document.body.appendChild(sandbox);

		var measure = document.createElement('div');
		measure.className = 'ct-word-doc ct-word-doc--v266 ct-word-measure';
		measure.style.width = contentW + 'px';
		measure.style.boxSizing = 'border-box';
		measure.innerHTML = fixed;
		sandbox.appendChild(measure);

		var root = measure.querySelector('.ct-word-doc') || measure;
		var nodes = [];
		root.childNodes.forEach(function (n) {
			if (n.nodeType === 1) nodes.push(n);
			else if (n.nodeType === 3 && String(n.textContent || '').trim()) {
				var p = document.createElement('p');
				p.className = 'ct-word-body';
				p.textContent = n.textContent;
				nodes.push(p);
			}
		});

		var pageMeasure = document.createElement('div');
		pageMeasure.className = 'ct-word-doc ct-word-doc--v266 ct-word-measure';
		pageMeasure.style.width = contentW + 'px';
		pageMeasure.style.boxSizing = 'border-box';
		sandbox.appendChild(pageMeasure);

		var pages = [];
		nodes.forEach(function (node) {
			if (isPageBreakNode(node)) {
				if (pageMeasure.innerHTML.trim()) pages.push(pageMeasure.innerHTML);
				pageMeasure.innerHTML = '';
				return;
			}
			var clone = node.cloneNode(true);
			pageMeasure.appendChild(clone);
			if (pageMeasure.scrollHeight > contentH + 4) {
				pageMeasure.removeChild(clone);
				if (pageMeasure.innerHTML.trim()) pages.push(pageMeasure.innerHTML);
				pageMeasure.innerHTML = '';
				pageMeasure.appendChild(clone);
				if (pageMeasure.scrollHeight > contentH + 4) {
					pages.push(pageMeasure.innerHTML);
					pageMeasure.innerHTML = '';
				}
			}
		});
		if (pageMeasure.innerHTML.trim()) pages.push(pageMeasure.innerHTML);
		if (!pages.length) pages.push(fixed);

		document.body.removeChild(sandbox);
		return pages;
	}

	function WordPaginatedPreview(props) {
		var html = props.html || '';
		var onScrollContainerMount = props.onScrollContainerMount;
		var previewZoom = props.zoom != null ? props.zoom : 100;
		var setPreviewZoom = props.onZoomChange || function () {};
		var PREVIEW_ZOOM_STEPS = [50, 75, 90, 100, 110, 125, 150, 175, 200];
		var viewModeState = useState('scroll');
		var pagesState = useState([]);
		var pageIdxState = useState(0);
		var viewMode = viewModeState[0];
		var setViewMode = viewModeState[1];
		var pages = pagesState[0];
		var pageIdx = pageIdxState[0];
		var setPageIdx = pageIdxState[1];

		function stepPreviewZoom(direction) {
			setPreviewZoom(function (current) {
				var idx = PREVIEW_ZOOM_STEPS.indexOf(current);
				if (idx < 0) {
					if (direction > 0) {
						return PREVIEW_ZOOM_STEPS.find(function (value) { return value > current; }) || PREVIEW_ZOOM_STEPS[PREVIEW_ZOOM_STEPS.length - 1];
					}
					var reversed = PREVIEW_ZOOM_STEPS.slice().reverse();
					return reversed.find(function (value) { return value < current; }) || PREVIEW_ZOOM_STEPS[0];
				}
				var nextIdx = idx + direction;
				if (nextIdx < 0) return PREVIEW_ZOOM_STEPS[0];
				if (nextIdx >= PREVIEW_ZOOM_STEPS.length) return PREVIEW_ZOOM_STEPS[PREVIEW_ZOOM_STEPS.length - 1];
				return PREVIEW_ZOOM_STEPS[nextIdx];
			});
		}

		function createPreviewPagerBtn(label, opts) {
			return React.createElement(Button, Object.assign({
				size: 'small',
				className: 'vm-btn vm-btn-secondary ct-preview-pager__btn'
			}, opts), label);
		}

		function createPreviewZoomIconBtn(title, iconName, opts) {
			return React.createElement(Tooltip, { title: title, key: title },
				React.createElement('button', {
					type: 'button',
					className: 'ct-preview-pager__icon-btn',
					'aria-label': title,
					disabled: !!opts.disabled,
					onClick: opts.onClick
				}, previewPagerIcon(iconName))
			);
		}

		function wrapPreviewPages(content) {
			return React.createElement('div', {
				className: 'ct-preview-pages-wrap',
				ref: function (el) {
					if (onScrollContainerMount) onScrollContainerMount(el);
				}
			},
				React.createElement('div', {
					className: 'ct-preview-pages',
					style: { zoom: previewZoom / 100 }
				}, content)
			);
		}

		useEffect(function () {
			if (!html) {
				pagesState[1]([]);
				return;
			}
			var timer = window.setTimeout(function () {
				pagesState[1](paginateWordHtml(html));
				pageIdxState[1](0);
			}, 0);
			return function () { window.clearTimeout(timer); };
		}, [html]);

		if (!html || !String(html).trim()) {
			return null;
		}

		if (!pages.length) {
			return React.createElement('div', { className: 'ct-preview-pages' },
				React.createElement('div', { className: 'ct-preview-page is-loading' }, 'Word 分页排版计算中…')
			);
		}

		var previewToolbar = React.createElement('div', { className: 'ct-preview-toolbar' },
			React.createElement('div', { className: 'ct-preview-toolbar__row ct-preview-toolbar__row--primary', role: 'toolbar', 'aria-label': '预览缩放' },
				React.createElement('div', { className: 'ct-preview-pager__group', role: 'group', 'aria-label': '缩放' },
					React.createElement('div', { className: 'ct-preview-pager__group-body' },
						createPreviewZoomIconBtn('缩小', 'zoomOut', {
							disabled: previewZoom <= PREVIEW_ZOOM_STEPS[0],
							onClick: function () { stepPreviewZoom(-1); }
						}),
						React.createElement(Select, {
							className: 'ct-preview-zoom-select vm-focus-border',
							size: 'small',
							value: previewZoom,
							onChange: setPreviewZoom,
							'aria-label': '预览缩放比例',
							options: PREVIEW_ZOOM_STEPS.map(function (value) {
								return { value: value, label: value + '%' };
							})
						}),
						createPreviewZoomIconBtn('放大', 'zoomIn', {
							disabled: previewZoom >= PREVIEW_ZOOM_STEPS[PREVIEW_ZOOM_STEPS.length - 1],
							onClick: function () { stepPreviewZoom(1); }
						})
					)
				)
			),
			React.createElement('div', {
				className: 'ct-preview-toolbar__row ct-preview-toolbar__row--secondary ct-preview-pager',
				role: 'toolbar',
				'aria-label': '合同预览工具栏'
			},
				React.createElement('div', { className: 'ct-preview-pager__group', role: 'group', 'aria-label': '翻页' },
					React.createElement('span', { className: 'ct-preview-pager__group-label' }, '翻页'),
					React.createElement('div', { className: 'ct-preview-pager__group-body' },
						createPreviewPagerBtn('上一页', {
							disabled: pageIdx <= 0,
							onClick: function () { setPageIdx(Math.max(0, pageIdx - 1)); }
						}),
						React.createElement('span', { className: 'ct-preview-pager__page', 'aria-live': 'polite' },
							React.createElement('span', { className: 'ct-preview-pager__page-current' }, pageIdx + 1),
							' / ',
							React.createElement('span', { className: 'ct-preview-pager__page-total' }, pages.length)
						),
						createPreviewPagerBtn('下一页', {
							disabled: pageIdx >= pages.length - 1,
							onClick: function () { setPageIdx(Math.min(pages.length - 1, pageIdx + 1)); }
						})
					)
				),
				React.createElement('span', { className: 'ct-preview-pager__divider', 'aria-hidden': 'true' }),
				React.createElement('div', { className: 'ct-preview-pager__group ct-preview-pager__group--view', role: 'group', 'aria-label': '视图' },
					React.createElement('span', { className: 'ct-preview-pager__group-label' }, '视图'),
					React.createElement('div', { className: 'ct-preview-pager__segmented', role: 'group', 'aria-label': '预览视图模式' },
						React.createElement('button', {
							type: 'button',
							className: 'ct-preview-pager__segment' + (viewMode === 'scroll' ? ' is-active' : ''),
							'aria-pressed': viewMode === 'scroll',
							onClick: function () { setViewMode('scroll'); }
						}, '连续预览'),
						React.createElement('button', {
							type: 'button',
							className: 'ct-preview-pager__segment' + (viewMode === 'single' ? ' is-active' : ''),
							'aria-pressed': viewMode === 'single',
							onClick: function () { setViewMode('single'); }
						}, '单页预览')
					)
				)
			)
		);

		function wrapPreviewShell(toolbarEl, pagesContent) {
			return React.createElement(React.Fragment, null,
				toolbarEl,
				React.createElement('div', { className: 'ct-preview-body-shell' }, wrapPreviewPages(pagesContent))
			);
		}

		if (viewMode === 'single') {
			return wrapPreviewShell(
				previewToolbar,
				React.createElement('div', { className: 'ct-preview-page', key: pageIdx },
					React.createElement('div', {
						className: 'ct-preview-page__body ct-word-doc',
						dangerouslySetInnerHTML: { __html: pages[pageIdx] }
					}),
					React.createElement('div', { className: 'ct-preview-page__footer' }, '— ', pageIdx + 1, ' —')
				)
			);
		}

		return wrapPreviewShell(
			previewToolbar,
			pages.map(function (pageHtml, i) {
				return React.createElement('div', { className: 'ct-preview-page', key: 'p-' + i },
					React.createElement('div', {
						className: 'ct-preview-page__body ct-word-doc',
						dangerouslySetInnerHTML: { __html: pageHtml }
					}),
					React.createElement('div', { className: 'ct-preview-page__footer' }, '— ', i + 1, ' —')
				);
			})
		);
	}

	function renderPreview(html, previewVars) {
		if (!hasPreviewContent(html)) return renderPreviewEmptyState();
		var raw = html || formDocumentHtmlState[0] || '';
		var content = previewVars ? applyTemplateVars(raw, previewVars) : raw;
		var displayHtml = preparePreviewHtml(content);
		var wordDoc = isWordFormattedDoc(content);
		if (wordDoc) {
			return React.createElement('div', { className: 'ct-preview-doc ct-word-doc ct-word-paginated' },
				React.createElement(WordPaginatedPreview, {
					html: content,
					zoom: workspaceZoom,
					onZoomChange: setWorkspaceZoom,
					onScrollContainerMount: registerPreviewScrollContainer
				})
			);
		}
		var previewClass = 'ct-preview-doc';
		return React.createElement('div', { className: previewClass },
			React.createElement('h1', null, getDocumentTitle(content)),
			React.createElement('div', {
				className: 'ct-preview-section__body',
				dangerouslySetInnerHTML: { __html: displayHtml }
			})
		);
	}

	function UnifiedContractEditor(props) {
		var html = props.html;
		var onChange = props.onChange;
		var syncKey = props.syncKey;
		var onRegisterInsert = props.onRegisterInsert;
		var onScrollContainerMount = props.onScrollContainerMount;
		var workspaceZoom = props.workspaceZoom != null ? props.workspaceZoom : 100;
		var editorRef = useRef(null);
		var sourceTextareaRef = useRef(null);
		var lockIdRef = useRef(1);
		var riskIdRef = useRef(1);
		var fullscreenState = useState(false);
		var isFullscreen = fullscreenState[0];
		var setFullscreen = fullscreenState[1];
		var sourceModeState = useState(false);
		var isSourceMode = sourceModeState[0];
		var setSourceMode = sourceModeState[1];
		var isSourceModeRef = useRef(isSourceMode);
		isSourceModeRef.current = isSourceMode;
		var sourceDraftState = useState('');
		var findModalState = useState(false);
		var findTextState = useState('');
		var replaceTextState = useState('');
		var fmtState = useState({ bold: false, italic: false, underline: false, align: 'left' });
		var fontSizePickState = useState('14px');
		var editorPagesState = useState([]);
		var editorPageIdxState = useState(0);
		var editorScrollRef = useRef(null);
		var pageBodyRefs = useRef([]);
		var pageShellRefs = useRef([]);
		var editorPagesRef = useRef([]);
		var pagesVersionRef = useRef(0);
		var pageBodyRefCallbacksRef = useRef({});

		function clearPageBodyRefCallbacks() {
			pageBodyRefCallbacksRef.current = {};
		}

		function getPageBodyRef(index) {
			if (!pageBodyRefCallbacksRef.current[index]) {
				pageBodyRefCallbacksRef.current[index] = function (el) {
					pageBodyRefs.current[index] = el;
					if (!el) return;
					var chunk = editorPagesRef.current[index];
					var token = pagesVersionRef.current + ':' + index;
					if (chunk != null && el.dataset.ctHydrateToken !== token) {
						el.innerHTML = chunk;
						el.dataset.ctHydrateToken = token;
					}
					if (!editorRef.current && index === 0) editorRef.current = el;
				};
			}
			return pageBodyRefCallbacksRef.current[index];
		}

		useEffect(function () {
			if (isWordFormattedDoc(html)) {
				clearPageBodyRefCallbacks();
				pageBodyRefs.current = [];
				pageShellRefs.current = [];
				editorRef.current = null;
				pagesVersionRef.current += 1;
				var prepared = prepareEditorHtml(html || '');
				var pages = paginateWordHtml(prepared);
				editorPagesRef.current = pages;
				editorPagesState[1](pages);
				editorPageIdxState[1](0);
				return;
			}
			editorPagesRef.current = [];
			editorPagesState[1]([]);
			var el = editorRef.current;
			if (!el) return;
			el.innerHTML = prepareEditorHtml(html) || '';
		}, [syncKey]);

		function handlePageBodyBlur(e) {
			var related = e.relatedTarget;
			if (related && related.closest) {
				if (related.closest('.ct-word-a4-page__body')) return;
				if (related.closest('.ct-rich-toolbar')) return;
			}
			syncHtml({ repaginateNow: true });
		}

		function insertAtCursor(text) {
			var token = String(text || '');
			if (!token) return;
			if (isSourceModeRef.current) {
				var ta = sourceTextareaRef.current;
				if (!ta) return;
				var start = ta.selectionStart != null ? ta.selectionStart : ta.value.length;
				var end = ta.selectionEnd != null ? ta.selectionEnd : start;
				var next = ta.value.slice(0, start) + token + ta.value.slice(end);
				sourceDraftState[1](next);
				onChange(next);
				requestAnimationFrame(function () {
					ta.focus();
					var pos = start + token.length;
					ta.setSelectionRange(pos, pos);
				});
				return;
			}
			var el = editorRef.current;
			if (!el) return;
			el.focus();
			try { document.execCommand('insertText', false, token); } catch (e) {
				try { document.execCommand('insertHTML', false, token); } catch (e2) { /* noop */ }
			}
			syncHtml();
		}

		useEffect(function () {
			if (!onRegisterInsert) return;
			onRegisterInsert(insertAtCursor);
			return function () { onRegisterInsert(null); };
		}, [onRegisterInsert]);

		useEffect(function () {
			function refreshFmt() {
				try {
					var align = 'left';
					if (document.queryCommandState('justifyCenter')) align = 'center';
					else if (document.queryCommandState('justifyRight')) align = 'right';
					else if (document.queryCommandState('justifyFull')) align = 'justify';
					fmtState[1]({
						bold: document.queryCommandState('bold'),
						italic: document.queryCommandState('italic'),
						underline: document.queryCommandState('underline'),
						align: align
					});
				} catch (e) { /* noop */ }
			}
			document.addEventListener('selectionchange', refreshFmt);
			return function () { document.removeEventListener('selectionchange', refreshFmt); };
		}, []);

		function syncHtml(opts) {
			opts = opts || {};
			if (isWordFormattedDoc(html) && pageBodyRefs.current.length) {
				var chunks = pageBodyRefs.current.map(function (pageEl) {
					return pageEl ? pageEl.innerHTML : '';
				});
				var merged = mergePaginatedEditorHtml(chunks, html);
				onChange(merged);
				if (opts.repaginateNow) {
					repaginateEditorPages(merged, editorPageIdxState[0]);
				}
				return;
			}
			var el = editorRef.current;
			if (!el) return;
			onChange(el.innerHTML);
		}

		function scrollToEditorPage(idx) {
			var pages = editorPagesState[0];
			if (!pages.length) return;
			var next = Math.max(0, Math.min(idx, pages.length - 1));
			editorPageIdxState[1](next);
			requestAnimationFrame(function () {
				var scrollEl = editorScrollRef.current;
				var pageEl = pageShellRefs.current[next];
				if (scrollEl && pageEl) {
					scrollEl.scrollTo({ top: Math.max(0, pageEl.offsetTop - 12), behavior: 'smooth' });
				}
				var body = pageBodyRefs.current[next];
				if (body) editorRef.current = body;
			});
		}

		function repaginateEditorPages(mergedHtml, preferredPageIdx) {
			var pages = paginateWordHtml(mergedHtml);
			pagesVersionRef.current += 1;
			editorPagesRef.current = pages;
			editorPagesState[1](pages);
			var nextIdx = preferredPageIdx != null ? preferredPageIdx : editorPageIdxState[0];
			nextIdx = Math.max(0, Math.min(nextIdx, Math.max(pages.length - 1, 0)));
			editorPageIdxState[1](nextIdx);
			requestAnimationFrame(function () {
				pages.forEach(function (chunk, i) {
					var el = pageBodyRefs.current[i];
					if (el) {
						el.innerHTML = chunk;
						el.dataset.ctHydrateToken = pagesVersionRef.current + ':' + i;
					}
				});
				if (pages.length) scrollToEditorPage(nextIdx);
			});
		}

		function insertWordPageBreak() {
			var el = editorRef.current;
			if (!el) {
				message.info('请先将光标置于编辑区');
				return;
			}
			el.focus();
			try {
				document.execCommand('insertHTML', false, '<hr class="ct-page-break" data-page-break="1" contenteditable="false" />');
			} catch (e) { /* noop */ }
			var chunks = pageBodyRefs.current.map(function (pageEl) { return pageEl ? pageEl.innerHTML : ''; });
			var merged = mergePaginatedEditorHtml(chunks, html);
			onChange(merged);
			repaginateEditorPages(merged, editorPageIdxState[0] + 1);
			message.success('已插入分页符，后续内容将显示在下一页');
		}

		function runCmd(cmd, val) {
			var el = editorRef.current;
			if (!el) return;
			el.focus();
			try { document.execCommand(cmd, false, val != null ? val : null); } catch (e) { /* noop */ }
			syncHtml();
		}

		function rteSep(key) {
			return React.createElement('span', { key: key || 'sep', className: 'ct-rte-sep' });
		}

		function rteBtn(title, icon, action, opts) {
			opts = opts || {};
			var btn = React.createElement('button', {
				type: 'button',
				title: opts.wrap ? title : undefined,
				className: 'ct-rte-btn' + (opts.active ? ' is-active' : '') + (opts.dropdown ? ' ct-rte-btn--dropdown' : ''),
				disabled: !!opts.disabled,
				onMouseDown: function (e) {
					if (!opts.dropdown) e.preventDefault();
					if (!opts.disabled && action) action(e);
				}
			}, icon, opts.dropdown ? rteIcon('chevron') : null);
			if (opts.wrap) return React.createElement('span', { key: opts.key || title, className: 'ct-rte-dropdown-wrap' }, btn);
			return React.createElement(Tooltip, { key: opts.key || title, title: title }, btn);
		}

		function rteDropdown(menu, title, icon, key) {
			return React.createElement(Dropdown, { key: key, menu: menu, trigger: ['click'] },
				rteBtn(title, icon, null, { key: key + '-btn', dropdown: true, wrap: true })
			);
		}

		function rteColorMenu(options, cmd) {
			return {
				items: options.map(function (opt) {
					return {
						key: opt.value,
						label: React.createElement('span', { style: { display: 'inline-flex', alignItems: 'center', gap: 8 } },
							React.createElement('span', {
								style: {
									width: 12, height: 12, borderRadius: 2,
									background: opt.value, border: '1px solid #E2E8F0', display: 'inline-block'
								}
							}),
							opt.label
						),
						onClick: function () { runCmd(cmd, opt.value); }
					};
				})
			};
		}

		function applyFontSize(size) {
			if (!size) return;
			fontSizePickState[1](size);
			var el = editorRef.current;
			if (!el) return;
			el.focus();
			var sel = window.getSelection();
			if (!sel || sel.rangeCount === 0 || sel.isCollapsed) {
				runCmd('fontSize', '4');
				syncHtml();
				return;
			}
			document.execCommand('insertHTML', false, '<span style="font-size:' + size + '">' + sel.toString() + '</span>');
			syncHtml();
		}

		function applyLetterSpacing(spacing) {
			if (!spacing) return;
			var el = editorRef.current;
			if (!el) return;
			el.focus();
			var sel = window.getSelection();
			if (!sel || sel.rangeCount === 0 || sel.isCollapsed) return;
			document.execCommand('insertHTML', false, '<span style="letter-spacing:' + spacing + '">' + sel.toString() + '</span>');
			syncHtml();
		}

		function applyFontFamily(font) {
			if (!font) return;
			runCmd('fontName', font);
		}

		function applyHeading(tag) {
			if (!tag) return;
			runCmd('formatBlock', '<' + tag + '>');
		}

		function insertTable(rows, cols) {
			var el = editorRef.current;
			if (!el) return;
			el.focus();
			document.execCommand('insertHTML', false, buildTableHtml(rows, cols));
			syncHtml();
		}

		function insertLink() {
			var url = window.prompt('请输入链接地址', 'https://');
			if (!url) return;
			runCmd('createLink', url);
		}

		function doClipboard(cmd) {
			var el = editorRef.current;
			if (!el) return;
			el.focus();
			if (cmd === 'paste') {
				if (navigator.clipboard && navigator.clipboard.readText) {
					navigator.clipboard.readText().then(function (text) {
						document.execCommand('insertText', false, text);
						syncHtml();
					}).catch(function () {
						message.info('请使用 Ctrl+V 粘贴，或在浏览器中授予剪贴板权限');
					});
					return;
				}
				message.info('请使用 Ctrl+V 粘贴');
				return;
			}
			try { document.execCommand(cmd); syncHtml(); } catch (e) { message.info('请使用快捷键 Ctrl+' + (cmd === 'copy' ? 'C' : 'X')); }
		}

		function applyLineHeight(lh) {
			if (!lh) return;
			var el = editorRef.current;
			if (!el) return;
			el.focus();
			var sel = window.getSelection();
			if (!sel || sel.rangeCount === 0) return;
			var block = sel.getRangeAt(0).commonAncestorContainer;
			if (block.nodeType === 3) block = block.parentNode;
			while (block && block !== el && !/^(P|DIV|H1|H2|H3|H4|BLOCKQUOTE|LI|TD|TH)$/.test(block.nodeName)) block = block.parentNode;
			if (block && block !== el) block.style.lineHeight = lh;
			else document.execCommand('insertHTML', false, '<p style="line-height:' + lh + '"><br></p>');
			syncHtml();
		}

		function applyFirstLineIndent(indent) {
			var el = editorRef.current;
			if (!el) return;
			el.focus();
			var sel = window.getSelection();
			if (!sel || sel.rangeCount === 0) return;
			var block = sel.getRangeAt(0).commonAncestorContainer;
			if (block.nodeType === 3) block = block.parentNode;
			while (block && block !== el && !/^(P|DIV|H1|H2|H3|H4)$/.test(block.nodeName)) block = block.parentNode;
			if (block && block !== el) {
				block.style.textIndent = indent;
				syncHtml();
			}
		}

		function insertPageBreak() {
			if (isWordFormattedDoc(html) && pageBodyRefs.current.length) {
				insertWordPageBreak();
				return;
			}
			runCmd('insertHTML', false, '<hr class="ct-page-break" data-page-break="1" contenteditable="false" />');
		}

		function insertDate() {
			var d = new Date();
			var s = d.getFullYear() + '年' + (d.getMonth() + 1) + '月' + d.getDate() + '日';
			runCmd('insertText', false, s);
		}

		function insertSpecialChar(ch) {
			runCmd('insertText', false, ch);
		}

		function getActiveTableCell() {
			var sel = window.getSelection();
			var node = sel && sel.anchorNode;
			if (!node) return null;
			if (node.nodeType === 3) node = node.parentNode;
			return node && node.closest ? node.closest('td, th') : null;
		}

		function getActiveTable() {
			var cell = getActiveTableCell();
			if (!cell) return null;
			var table = cell.parentNode;
			while (table && table.nodeName !== 'TABLE') table = table.parentNode;
			return table;
		}

		function tableOp(op) {
			var cell = getActiveTableCell();
			var table = getActiveTable();
			if (!cell || !table) {
				message.info('请将光标置于表格单元格内');
				return;
			}
			var row = cell.parentNode;
			var colIdx = cell.cellIndex;
			if (op === 'addRowAbove' || op === 'addRowBelow') {
				var newRow = row.cloneNode(true);
				Array.prototype.forEach.call(newRow.cells, function (c) { c.innerHTML = '&nbsp;'; });
				if (op === 'addRowAbove') row.parentNode.insertBefore(newRow, row);
				else row.parentNode.insertBefore(newRow, row.nextSibling);
			} else if (op === 'addColLeft' || op === 'addColRight') {
				var insertIdx = op === 'addColLeft' ? colIdx : colIdx + 1;
				Array.prototype.forEach.call(table.rows, function (r) {
					var td = document.createElement(r.cells[0] && r.cells[0].nodeName === 'TH' ? 'th' : 'td');
					td.innerHTML = '&nbsp;';
					if (insertIdx >= r.cells.length) r.appendChild(td);
					else r.insertBefore(td, r.cells[insertIdx]);
				});
			} else if (op === 'deleteTable') {
				table.parentNode.removeChild(table);
			}
			syncHtml();
		}

		function findNext() {
			var kw = (findTextState[0] || '').trim();
			if (!kw) { message.info('请输入查找内容'); return; }
			var found = window.find(kw, false, false, true, false, true, false);
			if (!found) message.info('未找到更多匹配项');
		}

		function replaceInDoc(all) {
			var findStr = (findTextState[0] || '').trim();
			var replStr = replaceTextState[0] || '';
			if (!findStr) { message.info('请输入查找内容'); return; }
			var el = editorRef.current;
			if (!el) return;
			var count = 0;
			var walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null);
			var nodes = [];
			while (walker.nextNode()) nodes.push(walker.currentNode);
			for (var ni = 0; ni < nodes.length; ni++) {
				var textNode = nodes[ni];
				var val = textNode.nodeValue;
				if (val.indexOf(findStr) < 0) continue;
				if (all) {
					var parts = val.split(findStr);
					count += parts.length - 1;
					textNode.nodeValue = parts.join(replStr);
				} else {
					textNode.nodeValue = val.replace(findStr, replStr);
					count = 1;
					break;
				}
			}
			if (count > 0) {
				syncHtml();
				message.success(all ? ('已替换 ' + count + ' 处') : '已替换 1 处');
			} else message.info('未找到匹配内容');
		}

		function toggleSourceMode() {
			if (!isSourceMode) {
				sourceDraftState[1](editorRef.current ? editorRef.current.innerHTML : html);
				setSourceMode(true);
			} else {
				onChange(sourceDraftState[0]);
				setSourceMode(false);
				setTimeout(function () {
					var el = editorRef.current;
					if (el) el.innerHTML = sourceDraftState[0];
				}, 0);
			}
		}

		function printDoc() {
			var content = isSourceMode ? sourceDraftState[0] : (editorRef.current ? editorRef.current.innerHTML : html);
			var w = window.open('', '_blank');
			if (!w) { message.warning('请允许弹出窗口后重试'); return; }
			w.document.write('<html><head><meta charset="utf-8"><title>合同打印预览</title><style>body{font-family:"SimSun",serif;padding:40px;line-height:1.85;font-size:14px;color:#1e293b}table{border-collapse:collapse;width:100%}td,th{border:1px solid #cbd5e1;padding:6px 10px}</style></head><body>');
			w.document.write(content);
			w.document.write('</body></html>');
			w.document.close();
			w.focus();
			w.print();
		}

		function handleInsertImage(file) {
			var el = editorRef.current;
			if (!el) return false;
			if (!file || !file.type || file.type.indexOf('image') !== 0) {
				message.warning('请上传图片文件');
				return false;
			}
			var reader = new FileReader();
			reader.onload = function (ev) {
				el.focus();
				document.execCommand('insertHTML', false, '<p><img src="' + ev.target.result + '" alt="合同插图" style="max-width:100%" /></p>');
				syncHtml();
			};
			reader.readAsDataURL(file);
			return false;
		}

		function wrapSelectionAsLock() {
			var el = editorRef.current;
			if (!el) return;
			var sel = window.getSelection();
			if (!sel || sel.rangeCount === 0 || sel.isCollapsed) {
				message.info('请先选中要锁定的内容');
				return;
			}
			var range = sel.getRangeAt(0);
			if (!el.contains(range.commonAncestorContainer)) return;
			var lockId = 'lk' + (lockIdRef.current++);
			var span = document.createElement('span');
			span.className = 'ct-inline-lock';
			span.setAttribute('data-inline-lock', '1');
			span.setAttribute('data-lock-id', lockId);
			span.setAttribute('title', '内容锁定区');
			try {
				range.surroundContents(span);
			} catch (err) {
				document.execCommand('insertHTML', false, '<span class="ct-inline-lock" data-inline-lock="1" data-lock-id="' + lockId + '" title="内容锁定区">' + sel.toString() + '</span>');
			}
			syncHtml();
			message.success('已设为内容锁定区');
		}

		function unwrapSelectionLock() {
			var el = editorRef.current;
			if (!el) return;
			var sel = window.getSelection();
			var node = sel && sel.anchorNode;
			var lockEl = null;
			if (node) {
				if (node.nodeType === 3) node = node.parentNode;
				if (node && node.closest) lockEl = node.closest('.ct-inline-lock');
			}
			if (!lockEl) {
				message.info('请将光标置于锁定内容内再解锁');
				return;
			}
			var parent = lockEl.parentNode;
			while (lockEl.firstChild) parent.insertBefore(lockEl.firstChild, lockEl);
			parent.removeChild(lockEl);
			syncHtml();
			message.success('已解除内容锁定');
		}

		function getRiskWrapBlock(el, sel) {
			var node = sel && sel.anchorNode;
			if (!node) return null;
			if (node.nodeType === 3) node = node.parentNode;
			while (node && node !== el) {
				if (node.nodeType === 1 && /^(P|DIV|LI|H[1-6]|TD)$/i.test(node.tagName)) return node;
				node = node.parentNode;
			}
			return null;
		}

		function wrapBlockAsRiskRedline(block) {
			if (!block || block.closest('.ct-risk-redline')) {
				message.info('该段落已是风控红线条款');
				return;
			}
			var wrapper = document.createElement('div');
			wrapper.className = 'ct-risk-redline';
			wrapper.setAttribute('data-risk-redline', '1');
			wrapper.setAttribute('data-risk-id', 'rk' + (riskIdRef.current++));
			wrapper.setAttribute('data-nonstd-trigger', '1');
			wrapper.setAttribute('title', '风控红线条款：创建合同时修改将触发非标审批');
			block.parentNode.insertBefore(wrapper, block);
			wrapper.appendChild(block);
			syncHtml();
			message.success('已设为风控红线条款');
		}

		function wrapSelectionAsRiskRedline() {
			var el = editorRef.current;
			if (!el) return;
			var sel = window.getSelection();
			if (!sel || sel.rangeCount === 0) {
				message.info('请先选中段落或条款内容');
				return;
			}
			var range = sel.getRangeAt(0);
			if (!el.contains(range.commonAncestorContainer)) return;
			if (sel.isCollapsed || !String(sel.toString() || '').trim()) {
				var block = getRiskWrapBlock(el, sel);
				if (block) {
					wrapBlockAsRiskRedline(block);
					return;
				}
				message.info('请先选中段落或条款内容');
				return;
			}
			if (sel.anchorNode && sel.anchorNode.parentNode && sel.anchorNode.parentNode.closest &&
				sel.anchorNode.parentNode.closest('.ct-risk-redline')) {
				message.info('选中内容已在风控红线条款内');
				return;
			}
			var riskId = 'rk' + (riskIdRef.current++);
			var span = document.createElement('span');
			span.className = 'ct-risk-redline';
			span.setAttribute('data-risk-redline', '1');
			span.setAttribute('data-risk-id', riskId);
			span.setAttribute('data-nonstd-trigger', '1');
			span.setAttribute('title', '风控红线条款：创建合同时修改将触发非标审批');
			try {
				range.surroundContents(span);
			} catch (err) {
				document.execCommand('insertHTML', false,
					'<span class="ct-risk-redline" data-risk-redline="1" data-risk-id="' + riskId +
					'" data-nonstd-trigger="1" title="风控红线条款：创建合同时修改将触发非标审批">' +
					sel.toString() + '</span>');
			}
			syncHtml();
			message.success('已设为风控红线条款');
		}

		function unwrapSelectionRiskRedline() {
			var el = editorRef.current;
			if (!el) return;
			var sel = window.getSelection();
			var node = sel && sel.anchorNode;
			var riskEl = null;
			if (node) {
				if (node.nodeType === 3) node = node.parentNode;
				if (node && node.closest) riskEl = node.closest('.ct-risk-redline');
			}
			if (!riskEl) {
				message.info('请将光标置于风控红线条款内再取消');
				return;
			}
			var footer = riskEl.querySelector('.ct-risk-redline__footer');
			if (footer) footer.parentNode.removeChild(footer);
			var parent = riskEl.parentNode;
			while (riskEl.firstChild) parent.insertBefore(riskEl.firstChild, riskEl);
			parent.removeChild(riskEl);
			syncHtml();
			message.success('已取消风控红线条款标记');
		}

		function rteTextBtn(label, title, action, opts) {
			opts = opts || {};
			return React.createElement(Tooltip, { key: opts.key || label, title: title },
				React.createElement('button', {
					type: 'button',
					className: 'ct-rte-btn ct-rte-btn--text'
						+ (opts.muted ? ' is-muted' : '')
						+ (opts.compact ? ' is-compact' : ''),
					onMouseDown: function (e) {
						e.preventDefault();
						if (action) action(e);
					}
				}, label)
			);
		}

		var fmt = fmtState[0];

		var tableMenuItems = TABLE_PRESET_ITEMS.map(function (item) {
			return { key: item.key, label: item.label, onClick: function () { insertTable(item.rows, item.cols); } };
		});

		var specialCharMenuItems = SPECIAL_CHAR_ITEMS.map(function (item) {
			return { key: item.key, label: item.label, onClick: function () { insertSpecialChar(item.char); } };
		});

		var lineHeightMenuItems = LINE_HEIGHT_OPTIONS.map(function (item) {
			return { key: item.value, label: item.label, onClick: function () { applyLineHeight(item.value); } };
		});

		var letterSpacingMenuItems = LETTER_SPACING_OPTIONS.map(function (item) {
			return { key: item.value, label: item.label, onClick: function () { applyLetterSpacing(item.value); } };
		});

		var scriptMenuItems = [
			{ key: 'sup', label: '上标', onClick: function () { runCmd('superscript'); } },
			{ key: 'sub', label: '下标', onClick: function () { runCmd('subscript'); } }
		];

		var moreMenuItems = [
			{ type: 'group', label: '编辑', children: [
				{ key: 'find', label: '查找替换', onClick: function () { findModalState[1](true); } },
				{ key: 'cut', label: '剪切', onClick: function () { doClipboard('cut'); } },
				{ key: 'copy', label: '复制', onClick: function () { doClipboard('copy'); } },
				{ key: 'paste', label: '粘贴', onClick: function () { doClipboard('paste'); } },
				{ key: 'selectAll', label: '全选', onClick: function () { runCmd('selectAll'); } }
			] },
			{ type: 'group', label: '段落', children: [
				{ key: 'heading', label: '段落样式', children: PARAGRAPH_STYLE_OPTIONS.map(function (p) {
					return { key: 'h-' + p.value, label: p.label, onClick: function () { applyHeading(p.value); } };
				}) },
				{ key: 'strike', label: '删除线', onClick: function () { runCmd('strikeThrough'); } },
				{ key: 'unlink', label: '取消链接', onClick: function () { runCmd('unlink'); } },
				{ key: 'indent2', label: '首行缩进 2 字符', onClick: function () { applyFirstLineIndent('2em'); } },
				{ key: 'indent0', label: '取消首行缩进', onClick: function () { applyFirstLineIndent('0'); } },
				{ key: 'hr', label: '分隔线', onClick: function () { runCmd('insertHorizontalRule'); } },
				{ key: 'pagebreak', label: '分页符', onClick: insertPageBreak },
				{ key: 'date', label: '插入日期', onClick: insertDate }
			] },
			{ type: 'group', label: '表格', children: [
				{ key: 'rowUp', label: '上方插入行', onClick: function () { tableOp('addRowAbove'); } },
				{ key: 'rowDn', label: '下方插入行', onClick: function () { tableOp('addRowBelow'); } },
				{ key: 'colL', label: '左侧插入列', onClick: function () { tableOp('addColLeft'); } },
				{ key: 'colR', label: '右侧插入列', onClick: function () { tableOp('addColRight'); } },
				{ key: 'delTbl', label: '删除表格', onClick: function () { tableOp('deleteTable'); } }
			] },
			{ type: 'group', label: '合同', children: [
				{ key: 'lock', label: '锁定选中内容', onClick: wrapSelectionAsLock },
				{ key: 'unlock', label: '解除锁定', onClick: unwrapSelectionLock },
				{ key: 'risk', label: '设为风控红线条款', onClick: wrapSelectionAsRiskRedline },
				{ key: 'unrisk', label: '取消风控红线条款', onClick: unwrapSelectionRiskRedline }
			] },
			{ type: 'group', label: '视图', children: [
				{ key: 'fullscreen', label: isFullscreen ? '退出全屏' : '全屏编辑', onClick: function () { setFullscreen(!isFullscreen); } },
				{ key: 'source', label: isSourceMode ? '返回可视化' : 'HTML 源码', onClick: toggleSourceMode },
				{ key: 'print', label: '打印预览', onClick: printDoc }
			] }
		];

		var isWordEditor = isWordFormattedDoc(html);
		var editorPages = editorPagesState[0];
		var editorPageIdx = editorPageIdxState[0];

		var row1 = React.createElement('div', { className: 'ct-rich-toolbar__row ct-rich-toolbar__row--primary' },
			React.createElement(Select, {
				key: 'fs', className: 'ct-rte-select ct-rte-select--size', size: 'small',
				value: fontSizePickState[0], options: FONT_SIZE_OPTIONS,
				onChange: applyFontSize
			}),
			rteSep('s1'),
			rteBtn('粗体 Ctrl+B', rteIcon('bold'), function () { runCmd('bold'); }, { key: 'bold', active: fmt.bold }),
			rteBtn('斜体 Ctrl+I', rteIcon('italic'), function () { runCmd('italic'); }, { key: 'italic', active: fmt.italic }),
			rteBtn('下划线 Ctrl+U', rteIcon('underline'), function () { runCmd('underline'); }, { key: 'underline', active: fmt.underline }),
			rteDropdown(rteColorMenu(COLOR_OPTIONS, 'foreColor'), '字体颜色', rteIcon('fontColor'), 'fg'),
			rteDropdown(rteColorMenu(BG_COLOR_OPTIONS, 'hiliteColor'), '背景色', rteIcon('highlight'), 'bg'),
			rteDropdown({ items: letterSpacingMenuItems }, '字符间距', rteIcon('letterSpacing'), 'lsp'),
			rteSep('s2'),
			React.createElement('div', { key: 'align', className: 'ct-rte-align-group' },
				rteBtn('左对齐', rteIcon('alignLeft'), function () { runCmd('justifyLeft'); }, { key: 'al', active: fmt.align === 'left' }),
				rteBtn('居中', rteIcon('alignCenter'), function () { runCmd('justifyCenter'); }, { key: 'ac', active: fmt.align === 'center' }),
				rteBtn('右对齐', rteIcon('alignRight'), function () { runCmd('justifyRight'); }, { key: 'ar', active: fmt.align === 'right' }),
				rteBtn('两端对齐', rteIcon('alignJustify'), function () { runCmd('justifyFull'); }, { key: 'aj', active: fmt.align === 'justify' })
			),
			rteDropdown({ items: lineHeightMenuItems }, '行距', rteIcon('lineHeight'), 'lh'),
			rteBtn('减少缩进', rteIcon('outdent'), function () { runCmd('outdent'); }, { key: 'outdent' }),
			isWordEditor && editorPages.length > 0 ? rteSep('s-pb') : null,
			isWordEditor && editorPages.length > 0
				? rteBtn('插入分页符，将光标后的内容移至下一页', rteIcon('pageBreak'), insertWordPageBreak, { key: 'page-break' })
				: null,
			rteSep('s-risk'),
			rteTextBtn('红线', '设为风控红线条款（选中段落或文字后点击；创建合同时修改将触发非标审批）', wrapSelectionAsRiskRedline, { key: 'risk-redline', compact: true }),
			rteTextBtn('取消', '取消风控红线条款标记', unwrapSelectionRiskRedline, { key: 'unrisk-redline', muted: true, compact: true })
		);

		var row2 = React.createElement('div', { className: 'ct-rich-toolbar__row ct-rich-toolbar__row--secondary' },
			React.createElement(Select, {
				key: 'font', className: 'ct-rte-select ct-rte-select--font', size: 'small',
				placeholder: '默认字体', options: FONT_FAMILY_OPTIONS,
				onChange: applyFontFamily, allowClear: true
			}),
			rteSep('s3'),
			rteBtn('清除格式', rteIcon('eraser'), function () { runCmd('removeFormat'); }, { key: 'eraser' }),
			React.createElement(Upload, { key: 'img', showUploadList: false, accept: 'image/*', beforeUpload: handleInsertImage },
				rteBtn('插入图片', rteIcon('image'), null, { key: 'imgBtn', wrap: true })
			),
			rteDropdown({ items: scriptMenuItems }, '上标/下标', rteIcon('script'), 'script'),
			rteBtn('无序列表', rteIcon('listBullet'), function () { runCmd('insertUnorderedList'); }, { key: 'ul' }),
			rteBtn('有序列表', rteIcon('listOrdered'), function () { runCmd('insertOrderedList'); }, { key: 'ol' }),
			rteBtn('增加缩进', rteIcon('indent'), function () { runCmd('indent'); }, { key: 'indent' }),
			rteDropdown({ items: tableMenuItems }, '插入表格', rteIcon('table'), 'tbl'),
			rteDropdown({ items: specialCharMenuItems }, '特殊字符', rteIcon('bulb'), 'spec'),
			rteBtn('插入链接', rteIcon('link'), insertLink, { key: 'link' }),
			rteSep('s4'),
			rteBtn('撤销 Ctrl+Z', rteIcon('undo'), function () { runCmd('undo'); }, { key: 'undo' }),
			rteBtn('重做 Ctrl+Y', rteIcon('redo'), function () { runCmd('redo'); }, { key: 'redo' }),
			rteSep('s5'),
			React.createElement('div', { key: 'tail', className: 'ct-rich-toolbar__tail' },
				rteDropdown({ items: moreMenuItems }, '更多功能', rteIcon('more'), 'more')
			)
		);

		return React.createElement('div', { className: 'ct-rich-wrap' + (isFullscreen ? ' is-fullscreen' : '') + (isWordEditor ? ' ct-rich-wrap--word-a4' : '') },
			React.createElement('div', { className: 'ct-rich-toolbar' }, row1, row2),
			isSourceMode
				? React.createElement('textarea', {
					ref: sourceTextareaRef,
					className: 'ct-rich-source',
					value: sourceDraftState[0],
					onChange: function (e) {
						sourceDraftState[1](e.target.value);
						onChange(e.target.value);
					}
				})
				: isWordEditor
					? React.createElement('div', { className: 'ct-editor-a4-shell' },
						React.createElement('div', {
							ref: function (el) {
								editorScrollRef.current = el;
								if (onScrollContainerMount) onScrollContainerMount(el);
							},
							className: 'ct-editor-a4-scroll'
						},
							editorPages.length
								? React.createElement('div', {
									className: 'ct-word-a4-pages',
									style: { zoom: workspaceZoom / 100 }
								},
									editorPages.map(function (pageHtml, i) {
										return React.createElement('div', {
											key: 'wep-' + syncKey + '-' + i,
											className: 'ct-word-a4-page' + (editorPageIdx === i ? ' is-active' : ''),
											ref: function (el) { pageShellRefs.current[i] = el; }
										},
											React.createElement('div', {
												className: 'ct-word-a4-page__body ct-word-doc ct-rich-editor ct-rich-editor--word',
												contentEditable: true,
												suppressContentEditableWarning: true,
												onInput: syncHtml,
												onBlur: handlePageBodyBlur,
												onFocus: function (e) {
													editorRef.current = e.currentTarget;
													if (editorPageIdxState[0] !== i) editorPageIdxState[1](i);
												},
												ref: getPageBodyRef(i)
											}),
											React.createElement('div', { className: 'ct-word-a4-page__footer' }, '— ', i + 1, ' —')
										);
									})
								)
								: React.createElement('div', { className: 'ct-word-a4-page is-loading' }, 'Word 分页排版计算中…')
						)
					)
					: React.createElement('div', {
						ref: function (el) {
							editorRef.current = el;
							if (onScrollContainerMount) onScrollContainerMount(el);
						},
						className: 'ct-rich-editor',
						contentEditable: true,
						suppressContentEditableWarning: true,
						onInput: syncHtml,
						onBlur: syncHtml
					}),
			React.createElement(Modal, {
				title: '查找与替换',
				open: findModalState[0],
				onCancel: function () { findModalState[1](false); },
				footer: React.createElement(Space, null,
					React.createElement(Button, { onClick: findNext }, '查找下一处'),
					React.createElement(Button, { onClick: function () { replaceInDoc(false); } }, '替换'),
					React.createElement(Button, { type: 'primary', onClick: function () { replaceInDoc(true); } }, '全部替换'),
					React.createElement(Button, { onClick: function () { findModalState[1](false); } }, '关闭')
				)
			},
				React.createElement('div', { style: { marginBottom: 12 } },
					React.createElement('label', { className: 'ct-modal-form-label' }, '查找内容'),
					React.createElement(Input, {
						value: findTextState[0],
						onChange: function (e) { findTextState[1](e.target.value); },
						placeholder: '输入要查找的文字',
						allowClear: true
					})
				),
				React.createElement('div', null,
					React.createElement('label', { className: 'ct-modal-form-label' }, '替换为'),
					React.createElement(Input, {
						value: replaceTextState[0],
						onChange: function (e) { replaceTextState[1](e.target.value); },
						placeholder: '留空则删除匹配文字',
						allowClear: true
					})
				)
			)
		);
	}

	function renderUnifiedEditor() {
		var sectionKey = editorSectionKey || activeSectionKey;
		var html = editorSectionKey ? (formDocumentHtmlState[0] || '') : getActiveSectionHtml();
		var onChange = editorSectionKey ? syncSectionEditorHtml : syncActiveSectionHtml;
		return React.createElement(UnifiedContractEditor, {
			key: 'unified-editor-' + editorSyncKeyState[0] + '-' + sectionKey,
			html: html,
			syncKey: editorSyncKeyState[0],
			onChange: onChange,
			onRegisterInsert: registerEditorInsertRef.current,
			onScrollContainerMount: registerEditorScrollContainer,
			workspaceZoom: workspaceZoom
		});
	}

	function resetListFilters() {
		var empty = createEmptyListFilter();
		setListFilterDraft(empty);
		setListFilterApplied(empty);
	}

	function applyListFilters() {
		setListFilterApplied(Object.assign({}, listFilterDraft));
	}

	function updateListFilterDraft(field, value) {
		setListFilterDraft(function (prev) {
			var next = Object.assign({}, prev);
			next[field] = value;
			if (field === 'vehicleBrand') next.vehicleModel = '';
			return next;
		});
	}

	function switchSectionTab(nextKey) {
		if (!nextKey || nextKey === activeSectionKey) return;
		setActiveSectionKey(nextKey);
		resetListFilters();
		editorSyncKeyState[1](function (v) { return v + 1; });
	}

	function renderSectionTabsEllipsisIcon() {
		return React.createElement('svg', {
			className: 'ct-section-tab__ellipsis-icon',
			width: 16,
			height: 16,
			viewBox: '0 0 16 16',
			'aria-hidden': true,
			focusable: 'false'
		},
			React.createElement('circle', { cx: 3, cy: 8, r: 1.25, fill: 'currentColor' }),
			React.createElement('circle', { cx: 8, cy: 8, r: 1.25, fill: 'currentColor' }),
			React.createElement('circle', { cx: 13, cy: 8, r: 1.25, fill: 'currentColor' })
		);
	}

	function renderSectionTabsMorePanel() {
		var query = String(sectionMoreSearchState[0] || '').trim().toLowerCase();
		var filtered = DOCUMENT_SECTION_TABS.filter(function (tab) {
			if (!query) return true;
			return String(tab.label || '').toLowerCase().indexOf(query) >= 0;
		});
		return React.createElement('div', { className: 'ct-section-tabs-more' },
			React.createElement('p', { className: 'ct-section-tabs-more__title' }, '模板类型'),
			React.createElement(Input, {
				className: 'ct-section-tabs-more__search',
				placeholder: '请输入内容',
				value: sectionMoreSearchState[0],
				onChange: function (e) { sectionMoreSearchState[1](e.target.value); },
				allowClear: true,
				'aria-label': '搜索模板类型'
			}),
			React.createElement('div', { className: 'ct-section-tabs-more__list', role: 'tablist', 'aria-label': '全部模板类型' },
				filtered.length
					? filtered.map(function (tab) {
						return React.createElement('button', {
							key: tab.key,
							type: 'button',
							role: 'tab',
							className: 'ct-section-tabs-more__item' + (activeSectionKey === tab.key ? ' is-active' : ''),
							'aria-selected': activeSectionKey === tab.key,
							onClick: function () {
								switchSectionTab(tab.key);
								sectionMoreOpenState[1](false);
								sectionMoreSearchState[1]('');
							}
						}, tab.label);
					})
					: React.createElement('p', { className: 'ct-section-tabs-more__empty' }, '无匹配模板类型')
			)
		);
	}

	function renderSectionTabs() {
		var visibleTabs = DOCUMENT_SECTION_TABS.slice(0, SECTION_VISIBLE_TAB_COUNT);
		var overflowTabs = DOCUMENT_SECTION_TABS.slice(SECTION_VISIBLE_TAB_COUNT);
		var overflowActive = overflowTabs.some(function (tab) { return tab.key === activeSectionKey; });
		var activeOverflowLabel = overflowActive ? getSectionTabLabel(activeSectionKey) : '';
		return React.createElement('div', { className: 'ct-section-tabs', role: 'tablist', 'aria-label': '合同章节' },
			visibleTabs.map(function (tab) {
				return React.createElement('button', {
					key: tab.key,
					type: 'button',
					role: 'tab',
					className: 'ct-section-tab' + (activeSectionKey === tab.key ? ' is-active' : ''),
					'aria-selected': activeSectionKey === tab.key,
					onClick: function () { switchSectionTab(tab.key); }
				}, tab.label);
			}),
			overflowTabs.length
				? React.createElement(Popover, {
					trigger: 'click',
					placement: 'bottomRight',
					open: sectionMoreOpenState[0],
					onOpenChange: function (open) {
						sectionMoreOpenState[1](open);
						if (!open) sectionMoreSearchState[1]('');
					},
					content: renderSectionTabsMorePanel(),
					overlayClassName: 'ct-section-tabs-more-popover',
					arrow: false
				},
					React.createElement('button', {
						type: 'button',
						role: 'tab',
						className: 'ct-section-tab ct-section-tab--more' + (overflowActive ? ' is-active' : ''),
						'aria-selected': overflowActive,
						'aria-haspopup': 'dialog',
						'aria-expanded': sectionMoreOpenState[0],
						'aria-label': overflowActive ? ('更多章节，当前：' + activeOverflowLabel) : '更多章节',
						title: overflowActive ? activeOverflowLabel : '展开更多章节'
					}, renderSectionTabsEllipsisIcon())
				)
				: null
		);
	}

	function copyTemplatePlaceholder(key) {
		var token = '{{' + key + '}}';
		if (typeof navigator !== 'undefined' && navigator.clipboard && navigator.clipboard.writeText) {
			navigator.clipboard.writeText(token).then(function () {
				message.success('已复制 ' + token);
			}).catch(function () {
				message.info(token);
			});
			return;
		}
		message.info(token);
	}

	function insertTemplatePlaceholder(key) {
		var token = '{{' + key + '}}';
		var insertFn = editorInsertHandlerRef.current;
		if (!insertFn) {
			message.warning('请先在编辑区点击定位光标');
			return;
		}
		insertFn(token);
		message.success('已插入 ' + token);
	}

	function renderTemplatePlaceholderCard() {
		return React.createElement('div', { className: 'ct-placeholder-card' },
			React.createElement('div', { className: 'ct-placeholder-card__head' },
				React.createElement('p', { className: 'ct-placeholder-card__title' }, '模板占位符')
			),
			CONTRACT_TEMPLATE_VAR_GROUPS.map(function (group) {
				return React.createElement('div', { key: group.title, className: 'ct-placeholder-card__group' },
					React.createElement('p', { className: 'ct-placeholder-card__group-title' }, group.title),
					React.createElement('p', { className: 'ct-placeholder-card__group-desc' }, group.desc),
					group.vars.map(function (v) {
						var token = '{{' + v.key + '}}';
						return React.createElement('div', {
							key: v.key,
							className: 'ct-placeholder-card__item',
							role: 'button',
							tabIndex: 0,
							onClick: function () { insertTemplatePlaceholder(v.key); },
							onKeyDown: function (e) {
								if (e.key === 'Enter' || e.key === ' ') {
									e.preventDefault();
									insertTemplatePlaceholder(v.key);
								}
							}
						},
							React.createElement('div', { className: 'ct-placeholder-card__item-main' },
								React.createElement('div', { className: 'ct-placeholder-card__item-label' }, v.label),
								React.createElement('div', { className: 'ct-placeholder-card__item-token' }, token)
							),
							React.createElement('div', { className: 'ct-placeholder-card__item-actions' },
								React.createElement('span', {
									className: 'ct-placeholder-card__action',
									role: 'button',
									tabIndex: 0,
									onClick: function (e) { e.stopPropagation(); copyTemplatePlaceholder(v.key); },
									onKeyDown: function (e) {
										if (e.key === 'Enter' || e.key === ' ') {
											e.preventDefault();
											e.stopPropagation();
											copyTemplatePlaceholder(v.key);
										}
									}
								}, '复制')
							)
						);
					})
				);
			})
		);
	}

	function getVehicleModelOptions(brand) {
		var entry = VEHICLE_BRAND_MODEL_CATALOG.find(function (item) { return item.brand === brand; });
		return entry ? entry.models.slice() : [];
	}

	function getVehiclePreviewOptions() {
		var options = [];
		VEHICLE_BRAND_MODEL_CATALOG.forEach(function (item) {
			item.models.forEach(function (model) {
				options.push({
					value: vehicleBindingKey({ brand: item.brand, model: model }),
					label: item.brand + ' · ' + model
				});
			});
		});
		return options;
	}

	function addVehicleBinding() {
		var brand = vehicleBindingBrandState[0];
		var model = vehicleBindingModelState[0];
		if (!brand || !model) {
			message.warning('请选择品牌和型号');
			return;
		}
		var key = vehicleBindingKey({ brand: brand, model: model });
		var exists = (formVehicleBindings || []).some(function (item) {
			return vehicleBindingKey(item) === key;
		});
		if (exists) {
			message.info('该车型已添加');
			return;
		}
		setFormVehicleBindings(function (prev) {
			return (prev || []).concat([{ brand: brand, model: model }]);
		});
	}

	function removeVehicleBinding(index) {
		setFormVehicleBindings(function (prev) {
			return (prev || []).filter(function (_, idx) { return idx !== index; });
		});
	}

	function renderVehicleBindingEditor() {
		var sectionKey = editorSectionKey || activeSectionKey;
		if (!sectionAllowsVehicleBinding(sectionKey)) return null;
		var brand = vehicleBindingBrandState[0];
		var models = getVehicleModelOptions(brand);
		return React.createElement('section', { className: 'ct-vehicle-binding-card vm-filter-card', 'aria-label': '适用车型' },
			React.createElement('div', { className: 'ct-vehicle-binding-card__head' },
				React.createElement('h3', { className: 'ct-vehicle-binding-card__title' }, '适用车型'),
				React.createElement('p', { className: 'ct-vehicle-binding-card__desc' }, '不绑定则适用于全部车型；绑定后仅在创建合同时匹配到对应品牌、型号的车辆才纳入该条款。')
			),
			React.createElement('div', { className: 'ct-vehicle-binding-card__form' },
				React.createElement(Select, {
					className: 'ct-vehicle-binding-brand',
					value: brand,
					onChange: function (value) {
						vehicleBindingBrandState[1](value);
						vehicleBindingModelState[1]('');
					},
					options: VEHICLE_BRAND_MODEL_CATALOG.map(function (item) {
						return { value: item.brand, label: item.brand };
					})
				}),
				React.createElement(Select, {
					className: 'ct-vehicle-binding-model',
					value: vehicleBindingModelState[0] || undefined,
					placeholder: '选择型号',
					onChange: vehicleBindingModelState[1],
					options: models.map(function (model) {
						return { value: model, label: model };
					})
				}),
				React.createElement(Button, { onClick: addVehicleBinding }, '添加车型')
			),
			(formVehicleBindings && formVehicleBindings.length)
				? React.createElement('div', { className: 'ct-vehicle-binding-tags' },
					formVehicleBindings.map(function (item, index) {
						return React.createElement(Tag, {
							key: vehicleBindingKey(item) + '-' + index,
							closable: true,
							onClose: function (e) {
								if (e && e.preventDefault) e.preventDefault();
								removeVehicleBinding(index);
							}
						}, item.brand + ' · ' + item.model);
					})
				)
				: React.createElement('p', { className: 'ct-vehicle-binding-empty' }, '当前未绑定车型，表示全部车型适用')
		);
	}

	function getListColumns() {
		var cols = [
			{ title: '合同名称', dataIndex: 'versionName', key: 'versionName', width: 240, render: function (v, r) {
				return React.createElement('div', { className: 'ct-contract-name-cell' },
					React.createElement('span', { className: 'ct-contract-name-cell__name', title: v || '' }, v || '—'),
					r.isDefault ? React.createElement(Tag, { color: 'gold' }, '标准合同') : null
				);
			} },
			{ title: '状态', dataIndex: 'status', key: 'status', width: 88, align: 'center', render: statusTag }
		];
		if (sectionAllowsVehicleBinding(activeSectionKey)) {
			cols.push({
				title: '适用车型', dataIndex: 'vehicleBindings', key: 'vehicleBindings', width: 220, ellipsis: true,
				render: function (_, record) {
					return React.createElement('span', { className: 'ct-vehicle-bindings-cell' }, formatVehicleBindings(record.vehicleBindings));
				}
			});
		}
		cols = cols.concat([
			{ title: '创建时间', dataIndex: 'createTime', key: 'createTime', width: 150 },
			{ title: '创建人', dataIndex: 'creator', key: 'creator', width: 110, render: formatPersonDisplayName },
			{ title: '最后更新时间', dataIndex: 'updateTime', key: 'updateTime', width: 150 },
			{ title: '更新人', dataIndex: 'updater', key: 'updater', width: 110, render: formatPersonDisplayName },
			{ title: '备注', dataIndex: 'remark', key: 'remark', ellipsis: true },
			{
				title: '操作', key: 'action', width: 240, fixed: 'right',
				render: function (_, record) {
					return React.createElement(Space, { size: 4, wrap: true },
						React.createElement(Button, { type: 'link', size: 'small', className: 'ct-action-btn', onClick: function () { openEdit(record); } }, '编辑'),
						record.status === 'published' && !record.isDefault
							? React.createElement(Button, { type: 'link', size: 'small', className: 'ct-action-btn', onClick: function () { confirmSetDefault(record); } }, '设为标准模板')
							: null,
						record.isDefault
							? React.createElement(Tooltip, { title: '标准模板不可删除' },
								React.createElement(Button, { type: 'link', size: 'small', className: 'ct-action-btn', disabled: true, danger: true }, '删除')
							)
							: React.createElement(Button, { type: 'link', size: 'small', className: 'ct-action-btn', danger: true, onClick: function () { confirmDelete(record); } }, '删除')
					);
				}
			}
		]);
		return cols;
	}

	var lessorCompanies = getLessorCompanies();
	var previewLessorCompany = getLessorCompanyById(previewLessorId);
	var previewTemplateVars = Object.assign(
		{ customerName: '【承租方公司名称】', contractCode: '20260001' },
		buildLessorVars(previewLessorCompany)
	);

	function getListBySection(sectionKey) {
		return templates.filter(function (r) {
			return r.sectionKey === sectionKey
				&& r.category === categoryFilter
				&& matchesListFilters(r, listFilterApplied, sectionKey);
		}).sort(function (a, b) {
			if (a.isDefault !== b.isDefault) return a.isDefault ? -1 : 1;
			return String(b.updateTime).localeCompare(String(a.updateTime));
		});
	}

	function renderListFilterPanel() {
		var sectionKey = activeSectionKey;
		var showVehicle = sectionAllowsVehicleBinding(sectionKey);
		var modelOptions = listFilterDraft.vehicleBrand ? getVehicleModelOptions(listFilterDraft.vehicleBrand) : [];
		var fields = [
			React.createElement('label', { key: 'keyword', className: 'vm-filter-field' },
				React.createElement('span', null, '合同名称'),
				React.createElement(Input, {
					className: 'vm-input',
					placeholder: '请输入合同名称',
					value: listFilterDraft.keyword,
					allowClear: true,
					onChange: function (e) { updateListFilterDraft('keyword', e.target.value); },
					onPressEnter: applyListFilters,
					'aria-label': '合同名称'
				})
			),
			React.createElement('label', { key: 'status', className: 'vm-filter-field' },
				React.createElement('span', null, '状态'),
				React.createElement(Select, {
					className: 'ct-list-filter-select',
					value: listFilterDraft.status || undefined,
					placeholder: '全部',
					allowClear: true,
					onChange: function (v) { updateListFilterDraft('status', v || ''); },
					options: [
						{ value: 'published', label: '已发布' },
						{ value: 'draft', label: '草稿' }
					]
				})
			),
			React.createElement('label', { key: 'defaultScope', className: 'vm-filter-field' },
				React.createElement('span', null, '标准模板'),
				React.createElement(Select, {
					className: 'ct-list-filter-select',
					value: listFilterDraft.defaultScope || undefined,
					placeholder: '全部',
					allowClear: true,
					onChange: function (v) { updateListFilterDraft('defaultScope', v || ''); },
					options: [
						{ value: 'only', label: '仅标准模板' },
						{ value: 'exclude', label: '非标准模板' }
					]
				})
			)
		];
		if (showVehicle) {
			fields.push(
				React.createElement('label', { key: 'vehicleBrand', className: 'vm-filter-field' },
					React.createElement('span', null, '适用品牌'),
					React.createElement(Select, {
						className: 'ct-list-filter-select',
						value: listFilterDraft.vehicleBrand || undefined,
						placeholder: '全部品牌',
						allowClear: true,
						onChange: function (v) { updateListFilterDraft('vehicleBrand', v || ''); },
						options: VEHICLE_BRAND_MODEL_CATALOG.map(function (item) {
							return { value: item.brand, label: item.brand };
						})
					})
				),
				React.createElement('label', { key: 'vehicleModel', className: 'vm-filter-field' },
					React.createElement('span', null, '适用型号'),
					React.createElement(Select, {
						className: 'ct-list-filter-select',
						value: listFilterDraft.vehicleModel || undefined,
						placeholder: listFilterDraft.vehicleBrand ? '全部型号' : '请先选择品牌',
						allowClear: true,
						disabled: !listFilterDraft.vehicleBrand,
						onChange: function (v) { updateListFilterDraft('vehicleModel', v || ''); },
						options: modelOptions.map(function (model) {
							return { value: model, label: model };
						})
					})
				)
			);
		}
		return React.createElement('section', { className: 'vm-filter-card', 'aria-label': '筛选条件' },
			React.createElement('header', { className: 'vm-filter-header' },
				React.createElement('h2', { className: 'vm-filter-title' }, '筛选条件')
			),
			React.createElement('div', { className: 'vm-filter-grid' }, fields),
			React.createElement('div', { className: 'vm-filter-actions' },
				React.createElement(Button, { className: 'vm-btn vm-btn-ghost', onClick: resetListFilters }, '重置'),
				React.createElement(Button, { type: 'primary', className: 'ct-btn-cta', onClick: applyListFilters }, '查询')
			)
		);
	}

	function renderTabTable(sectionKey) {
		var list = getListBySection(sectionKey);
		var sectionLabel = getSectionTabLabel(sectionKey);
		var emptyText = hasActiveListFilters(listFilterApplied)
			? '未找到符合条件的版本，请调整筛选条件'
			: '「' + sectionLabel + '」暂无模板版本，点击「新增」创建';
		return React.createElement(Table, {
			className: 'ct-data-table',
			rowKey: 'id',
			columns: getListColumns(),
			dataSource: list,
			size: 'small',
			bordered: false,
			rowClassName: function () { return 'ct-row-hover'; },
			pagination: { pageSize: 10, showTotal: function (t) { return '共 ' + t + ' 条'; }, showSizeChanger: false },
			scroll: { x: 1280 },
			locale: { emptyText: emptyText }
		});
	}

	function renderEditorWorkspace() {
		var sectionKey = editorSectionKey || activeSectionKey;
		var activeSectionHtml = editorSectionKey ? (formDocumentHtmlState[0] || '') : getActiveSectionHtml();
		var hasContent = hasPreviewContent(activeSectionHtml);
		var previewPanelClass = 'ct-preview-panel'
			+ (!hasContent ? ' ct-preview-panel--empty' : '')
			+ (hasContent && isWordFormattedDoc(activeSectionHtml) ? ' ct-preview-panel--word' : '');
		return React.createElement('div', { className: 'ct-editor-workspace' },
			React.createElement(Row, { gutter: [16, 16] },
				React.createElement(Col, { xs: 24, lg: 12 },
					React.createElement('section', { className: 'ct-editor-column-card', 'aria-label': '编辑区' },
						React.createElement('div', { className: 'ct-panel-head' },
							React.createElement('div', { className: 'ct-panel-head__title' }, '编辑区',
								React.createElement('span', { className: 'ct-panel-head__badge' }, getSectionTabLabel(sectionKey))
							),
							React.createElement('div', { className: 'ct-panel-head__actions' },
								React.createElement(Popover, {
									content: renderTemplatePlaceholderCard(),
									title: null,
									trigger: 'click',
									placement: 'bottomRight',
									open: placeholderPopoverOpenState[0],
									onOpenChange: placeholderPopoverOpenState[1],
									overlayInnerStyle: { padding: '12px 14px' }
								},
									React.createElement(Button, {
										className: 'vm-btn ct-placeholder-trigger' + (placeholderPopoverOpenState[0] ? ' vm-btn-primary ct-btn-cta' : ' vm-btn-secondary'),
										type: placeholderPopoverOpenState[0] ? 'primary' : 'default'
									}, '{ } 模板占位符')
								),
								React.createElement(Upload, {
									accept: '.doc,.docx',
									showUploadList: false,
									beforeUpload: handleImportWord
								}, React.createElement(Button, {
									className: 'vm-btn ' + (!hasContent && editorMode === 'create' ? 'vm-btn-primary ct-btn-cta' : 'vm-btn-secondary'),
									type: !hasContent && editorMode === 'create' ? 'primary' : 'default'
								}, '导入 Word 模板'))
							)
						),
						React.createElement('div', { key: 'editor-panel-' + editorSyncKeyState[0], className: 'ct-editor-panel' }, renderUnifiedEditor())
					)
				),
				React.createElement(Col, { xs: 24, lg: 12 },
					React.createElement('section', { className: 'ct-editor-column-card ct-editor-column-card--preview', 'aria-label': '实时预览' },
						React.createElement('div', { className: 'ct-panel-head' },
							React.createElement('div', { className: 'ct-panel-head__title' }, '实时预览',
								React.createElement('span', { className: 'ct-panel-head__badge' },
									'锁定 ' + countLockRegions(activeSectionHtml) + ' 处 · 风控红线 ' + countRiskRedlineRegions(activeSectionHtml) + ' 处'
								)
							),
							React.createElement('div', { className: 'ct-panel-head__actions ct-panel-head__actions--placeholder', 'aria-hidden': 'true' })
						),
						React.createElement('div', { className: previewPanelClass },
							hasContent
								? renderPreview(activeSectionHtml, previewTemplateVars)
								: renderPreviewEmptyState()
						)
					)
				)
			)
		);
	}

	function renderEditorPage() {
		return React.createElement('div', { className: 'ct-editor-page' },
			React.createElement('div', { className: 'ct-editor-page__topbar vm-detail-topbar' },
				React.createElement(Button, { className: 'ct-editor-page__back-btn vm-btn vm-btn-back', onClick: backToList }, '← 返回列表'),
				React.createElement('div', { className: 'ct-editor-page__topbar-actions' },
					React.createElement(Button, {
						className: 'vm-btn vm-btn-secondary',
						onClick: function () { handleSaveTemplate(false); }
					}, '保存'),
					React.createElement(Button, {
						type: 'primary',
						className: 'vm-btn vm-btn-primary ct-btn-cta',
						onClick: function () { handleSaveTemplate(true); }
					}, '保存并发布')
				)
			),
			renderVehicleBindingEditor(),
			React.createElement('div', { className: 'ct-editor-page__body' }, renderEditorWorkspace())
		);
	}

	function renderListPage() {
		return React.createElement(React.Fragment, null,
			renderListFilterPanel(),
			React.createElement('section', { className: 'vm-table-section' },
				React.createElement('div', { className: 'vm-table-toolbar' },
					React.createElement('div', { className: 'vm-table-actions' },
						React.createElement(Button, { type: 'primary', className: 'ct-btn-cta', onClick: openCreate }, '新增')
					)
				),
				React.createElement('div', { className: 'vm-table-card ct-list-table-card' },
					renderTabTable(activeSectionKey)
				)
			)
		);
	}

	return React.createElement(App, null,
		React.createElement('style', null, pageStyle),
		React.createElement('div', { className: 'vm-page ct-page' + (pageView === 'editor' ? ' ct-editor-shell' : '') },
			pageView === 'editor' ? renderEditorPage() : renderListPage(),

			React.createElement(Modal, {
				wrapClassName: 'ct-modal-wrap',
				title: '确认设为标准模板',
				open: defaultConfirmModalState[0],
				onOk: handleSetDefault,
				onCancel: function () { defaultConfirmModalState[1](false); defaultConfirmTargetState[1](null); },
				okText: '确认设置',
				cancelText: '取消'
			}, defaultConfirmTargetState[0]
				? React.createElement('div', { style: { lineHeight: 1.6 } },
					'同一类型合同同时只能有一个标准模板。设为标准模板后，客服草拟新合同时将默认使用此版本。',
					React.createElement('div', { style: { marginTop: 12, fontSize: 13, color: '#64748B' } },
						'将「', defaultConfirmTargetState[0].versionNo, ' · ', defaultConfirmTargetState[0].versionName, '」设为本分类标准模板'
					)
				)
				: null),

			React.createElement(Modal, {
				wrapClassName: 'ct-modal-wrap',
				title: '确认删除',
				open: deleteModalState[0],
				onOk: handleDelete,
				onCancel: function () { deleteModalState[1](false); deleteTargetState[1](null); },
				okText: '删除',
				okButtonProps: { danger: true }
			}, deleteTargetState[0]
				? React.createElement('div', null, '确定删除版本「', deleteTargetState[0].versionNo, ' · ', deleteTargetState[0].versionName, '」？删除后不可恢复。')
				: null
			),

		)
	);
};

export default Component;
