EXACT_TRANSLATIONS: dict[str, str] = {
    '                            // 只布局 SDK 注入的 view，跳过 RN 的 ReactXxx（它们由 Yoga 自己布局）': '                            // 只布局 SDK 注入的 view，跳过 RN 的 ReactXxx（它们由 Yoga 自己布局）',
    '                        // native 列表多广告：adId 顶层透出，JS 按 placementID+adId 分流到对应 cell': '                        // native 列表多广告：adId 顶层透出，JS 按 placementID+adId 分流到对应 cell',
    '                        // 不检查全部 asset——media/mainImage 据 offer 二选一，空的会塌成 0 高（collapsed），': '                        // 不检查全部 asset——media/mainImage 据 offer 二选一，空的会塌成 0 高（collapsed），',
    '                        // 模板：把 host 撑到 SDK view 高度（host=ReactViewGroup，否则塌掉看不全）': '                        // 模板：把 host 撑到 SDK view 高度（host=ReactViewGroup，否则塌掉看不全）',
    '                        // 等「关键素材」有尺寸再重建：标题/icon 必有内容，它们有尺寸即说明 RN 布局完成。': '                        // 等「关键素材」有尺寸再重建：标题/icon 必有内容，它们有尺寸即说明 RN 布局完成。',
    '                        // 若要求它们也>0 则 allSized 永远 false → 必超时强搬 → 那刻别的 asset 没好 → 空白。': '                        // 若要求它们也>0 则 allSized 永远 false → 必超时强搬 → 那刻别的 asset 没好 → 空白。',
    '                // JS 没传色、measure 又只量到默认半透明黑/0 时兜底白字，保证按钮文字清晰。': '                // JS 没传色、measure 又只量到默认半透明黑/0 时兜底白字，保证按钮文字清晰。',
    '                // RN AssetView 已隐藏，CTA 背景全靠 measure 还原（CompositeBackgroundDrawable 已能读色）。': '                // RN AssetView 已隐藏，CTA 背景全靠 measure 还原（CompositeBackgroundDrawable 已能读色）。',
    '                // newText 已套 measure 到的背景(box.hasBg→RN backgroundColor)+ padding + 文字色。': '                // newText 已套 measure 到的背景(box.hasBg→RN backgroundColor)+ padding + 文字色。',
    '                // 关闭按钮走 setCloseView + DislikeListener，不加入 clickViewList': '                // 关闭按钮走 setCloseView + DislikeListener，不加入 clickViewList',
    '            // JS 传来的 style.color 优先于 measure 量到的色。': '            // JS 传来的 style.color 优先于 measure 量到的色。',
    '            // JS 侧也会据 getNativeAd 的 isExpress 隐藏 AssetView。': '            // JS 侧也会据 getNativeAd 的 isExpress 隐藏 AssetView。',
    '            // JS 点移除经桥在 RN bridge 线程调到这里，故强制 post 主线程，避免 "wrong thread" 崩。': '            // JS 点移除经桥在 RN bridge 线程调到这里，故强制 post 主线程，避免 "wrong thread" 崩。',
    '            // ad.destory() 会触发 GDT 内部 ExoPlayer.stop —— 必须主线程（media3 线程检查）。': '            // ad.destory() 会触发 GDT 内部 ExoPlayer.stop —— 必须主线程（media3 线程检查）。',
    '            // adId = 跨桥 NativeAd 对象引用，JS 透传、用户无感': '            // adId = 跨桥 NativeAd 对象引用，JS 透传、用户无感',
    '            // 关闭按钮只走 setCloseView，不进 clickViewList': '            // 关闭按钮只走 setCloseView，不进 clickViewList',
    '            // 可选尺寸 dp→px': '            // 可选尺寸 dp→px',
    '            // 回传 offer 类型：express(模板) → JS 隐藏 AssetView 让 SDK 画模板；否则自渲染走 AssetView': '            // 回传 offer 类型：express(模板) → JS 隐藏 AssetView 让 SDK 画模板；否则自渲染走 AssetView',
    '            // 复杂嵌套参数：ReadableMap → JSON 字符串 → BridgeJsonMapUtil（复用既有 JSON 解析）': '            // 复杂嵌套参数：ReadableMap → JSON 字符串 → BridgeJsonMapUtil（复用既有 JSON 解析）',
    '            // 桥还没建好（JS bundle 未加载完）或已销毁；丢弃事件而不是 crash。': '            // 桥还没建好（JS bundle 未加载完）或已销毁；丢弃事件而不是 crash。',
    '            // 这个位 auction 返回的是模板 offer → 转模板路径（SDK 画模板），忽略 AssetView。': '            // 这个位 auction 返回的是模板 offer → 转模板路径（SDK 画模板），忽略 AssetView。',
    '            return; // 已渲染过，避免重复 renderAdContainer': '            return; // 已渲染过，避免重复 renderAdContainer',
    '        //   → ATSendSignalManager 垫片': '        //   → ATSendSignalManager 垫片',
    '        //   → sink (本实例) → RCTCallableJSModules → JS': '        //   → sink (本实例) → RCTCallableJSModules → JS',
    '        // AnyThink AD_WIDTH/AD_HEIGHT 要 px；JS props 是 dp → 乘 density 转 px（否则创意偏小）': '        // AnyThink AD_WIDTH/AD_HEIGHT 要 px；JS props 是 dp → 乘 density 转 px（否则创意偏小）',
    '        // AssetView 嵌套层级不定（孙/曾孙），无法按 tag 精确跳过；改为 selfRenderActive：': '        // AssetView 嵌套层级不定（孙/曾孙），无法按 tag 精确跳过；改为 selfRenderActive：',
    '        // CALayer 渲染不受 bounds 限制（子 view 仍能画出来），但 hit-test 会被 pointInside 截断在 0×0，': '        // CALayer 渲染不受 bounds 限制（子 view 仍能画出来），但 hit-test 会被 pointInside 截断在 0×0，',
    '        // CENTER_CROP 填满不变形（否则方图拉伸/留边露底色）': '        // CENTER_CROP 填满不变形（否则方图拉伸/留边露底色）',
    '        // CSSBackgroundDrawable（带 getColor()）。前者直接取，后者反射 getColor()，让开发者写在 AssetView': '        // CSSBackgroundDrawable（带 getColor()）。前者直接取，后者反射 getColor()，让开发者写在 AssetView',
    '        // OnPreDraw 等到关键素材有尺寸（或超时 ~30 帧）再执行 doRebuildAndRegister。': '        // OnPreDraw 等到关键素材有尺寸（或超时 ~30 帧）再执行 doRebuildAndRegister。',
    '        // SDK mediaView（视频/大图 surface）也是可点区域': '        // SDK mediaView（视频/大图 surface）也是可点区域',
    '        // SDK 在 rendererWithConfiguration: 内部会把 selfRenderView.frame 重置回 0×0,': '        // SDK 在 rendererWithConfiguration: 内部会把 selfRenderView.frame 重置回 0×0,',
    '        // Self-render下：RN AssetView 嵌套层级不定（孙/曾孙）无法按 tag 跳过；重建层又被 renderAdContainer': '        // Self-render下：RN AssetView 嵌套层级不定（孙/曾孙）无法按 tag 跳过；重建层又被 renderAdContainer',
    '        // Self-render素材（title/desc/cta/iconUrl/mainImageUrl/starRating/advertiser/isMediaViewAvailable）→ JS AssetView 填值': '        // Self-render素材（title/desc/cta/iconUrl/mainImageUrl/starRating/advertiser/isMediaViewAvailable）→ JS AssetView 填值',
    '        // Self-render（方案 B：SDK 模板）：用 SDK 自带 ATNativeSelfRenderView，子 view 默认布局由这里硬编码。': '        // Self-render（方案 B：SDK 模板）：用 SDK 自带 ATNativeSelfRenderView，子 view 默认布局由这里硬编码。',
    '        // Template (Express)：SDK 自己出整张视图': '        // Template (Express)：SDK 自己出整张视图',
    '        // adId 就绪后绑定容器到对应那条 + 模板(express) 自动渲染': '        // adId 就绪后绑定容器到对应那条 + 模板(express) 自动渲染',
    '        // container.drawChild 只画 native 重建层、跳过所有 RN 子树（setVisibility 会被 Fabric 覆写，不可用）。': '        // container.drawChild 只画 native 重建层、跳过所有 RN 子树（setVisibility 会被 Fabric 覆写，不可用）。',
    '        // e_cpm 的价格/币种用 at_policyString 兼容 NSNumber/NSString（Flutter 传数字时为 NSNumber）': '        // e_cpm 的价格/币种用 at_policyString 兼容 NSNumber/NSString（Flutter 传数字时为 NSNumber）',
    '        // iOS 自渲染 viewTag 绑定待后续对齐 Android；旧架构命令接口先预留。': '        // iOS 自渲染 viewTag 绑定待后续对齐 Android；旧架构命令接口先预留。',
    '        // init 完成经 InitCallName 事件回传 JS（点亮上行事件通道；P1-F06）': '        // init 完成经 InitCallName 事件回传 JS（点亮上行事件通道；P1-F06）',
    '        // localExtra 经 setLocalExtra 设置，load 只解析 atAdRequest': '        // localExtra 经 setLocalExtra 设置，load 只解析 atAdRequest',
    '        // localExtra（user_id/userData 等）现经 setLocalExtra 设置，load 只解析 atAdRequest': '        // localExtra（user_id/userData 等）现经 setLocalExtra 设置，load 只解析 atAdRequest',
    '        // media 后 addView 会盖住先放的 close；关闭按钮必须在最上层才能点到': '        // media 后 addView 会盖住先放的 close；关闭按钮必须在最上层才能点到',
    '        // mediaView 类型不 setXxxView（SDK view 由 getAdMediaView 提供并 addView），仅作 clickView': '        // mediaView 类型不 setXxxView（SDK view 由 getAdMediaView 提供并 addView），仅作 clickView',
    '        // media：SDK 原生 view 直接放进重建层对应位置（视频/大图 surface）': '        // media：SDK 原生 view 直接放进重建层对应位置（视频/大图 surface）',
    '        // media：SDK 原生 view，交给 rebuilder 放进 nativeRoot（不再塞 RN holder——模型 A 全用重建层）。': '        // media：SDK 原生 view，交给 rebuilder 放进 nativeRoot（不再塞 RN holder——模型 A 全用重建层）。',
    '        // offer 类型：express(模板) → JS 隐藏 AssetView 让 SDK 画模板': '        // offer 类型：express(模板) → JS 隐藏 AssetView 让 SDK 画模板',
    '        // onDrop 可能在 Fabric mounting 线程，故强制主线程拆子 view，避免 "Player accessed on wrong thread" 崩。': '        // onDrop 可能在 Fabric mounting 线程，故强制主线程拆子 view，避免 "Player accessed on wrong thread" 崩。',
    '        // removeAllViews 触发 GDT media 的 TextureView.onSurfaceTextureDestroyed → ExoPlayer 要主线程访问；': '        // removeAllViews 触发 GDT media 的 TextureView.onSurfaceTextureDestroyed → ExoPlayer 要主线程访问；',
    '        // removeView 触碰 view 层级，必须主线程（JS 经桥可能在 RN bridge 线程调到这）。': '        // removeView 触碰 view 层级，必须主线程（JS 经桥可能在 RN bridge 线程调到这）。',
    '        // removeView/destroy 触碰 view 层级，必须主线程，否则 "Only the original thread..." 崩。': '        // removeView/destroy 触碰 view 层级，必须主线程，否则 "Only the original thread..." 崩。',
    '        // renderAdContainer（render→prepare 顺序，每 offer 一次）让 GDT 等独占容器 ADN 注册成功。': '        // renderAdContainer（render→prepare 顺序，每 offer 一次）让 GDT 等独占容器 ADN 注册成功。',
    '        // settings.atAdRequest 解析（与三类一致）；当前最小化：直接 makeAdRequest': '        // settings.atAdRequest 解析（与三类一致）；当前最小化：直接 makeAdRequest',
    '        // 上的 backgroundColor 能被还原（如 CTA 蓝底）。': '        // 上的 backgroundColor 能被还原（如 CTA 蓝底）。',
    '        // 仅在 adId 已绑定时销毁本视图那一条。空 adId（cell 在 adId prop 到达前就被 drop）不销毁——': '        // 仅在 adId 已绑定时销毁本视图那一条。空 adId（cell 在 adId prop 到达前就被 drop）不销毁——',
    '        // 兜底：offer 可能因 JS 回调与 Fabric layout 时序差而尚未就绪。': '        // 兜底：offer 可能因 JS 回调与 Fabric layout 时序差而尚未就绪。',
    '        // 兜底：直接 getColor()': '        // 兜底：直接 getColor()',
    '        // 即 AssetView 树根），保留 native 子（GDT NativeAdContainer / 重建层）继续画 → RN 不可见、重建层可见。': '        // 即 AssetView 树根），保留 native 子（GDT NativeAdContainer / 重建层）继续画 → RN 不可见、重建层可见。',
    '        // 否则 helper.destroy("") 会回退 mLastAdId，误杀最近一条正在显示的广告。': '        // 否则 helper.destroy("") 会回退 mLastAdId，误杀最近一条正在显示的广告。',
    '        // 命令式 load 已完成：Show 时只走 onBannerLoaded → attach': '        // 命令式 load 已完成：Show 时只走 onBannerLoaded → attach',
    '        // 回读 SDK 的 flag，证明确实写进了 SDKContext': '        // 回读 SDK 的 flag，证明确实写进了 SDKContext',
    '        // 子 view 上的 tap 永远不 fire。layoutSubviews 也会兜底（见 -syncLayout）。': '        // 子 view 上的 tap 永远不 fire。layoutSubviews 也会兜底（见 -syncLayout）。',
    '        // 守卫：OnPreDraw 异步触发，cell 可能已滚出/onDrop（destroy 清了 mNativeAds、container 解绑）。': '        // 守卫：OnPreDraw 异步触发，cell 可能已滚出/onDrop（destroy 清了 mNativeAds、container 解绑）。',
    '        // 安排 500ms 后重试一次；attached 守卫保证幂等，不会二次 attach。': '        // 安排 500ms 后重试一次；attached 守卫保证幂等，不会二次 attach。',
    '        // 容器自身加入（整块可点，兜底曝光区域）': '        // 容器自身加入（整块可点，兜底曝光区域）',
    '        // 导致子 view 上 SDK 注册的 tap recognizer 永远收不到 touch——广告"能看见但点不动"。': '        // 导致子 view 上 SDK 注册的 tap recognizer 永远收不到 touch——广告"能看见但点不动"。',
    '        // 开发框架标识：上报 os_fw=5（React Native）': '        // 开发框架标识：上报 os_fw=5（React Native）',
    '        // 必须 render 之后再补一次（且子 view layout 也要重 apply）——否则 hit-test 在 0×0 被截断，': '        // 必须 render 之后再补一次（且子 view layout 也要重 apply）——否则 hit-test 在 0×0 被截断，',
    '        // 必须给 selfRenderView 自己也设 frame。UIView 默认 frame=0×0；': '        // 必须给 selfRenderView 自己也设 frame。UIView 默认 frame=0×0；',
    '        // 把 selfRenderView 持有为 ivar：单次 attach 由 self.attached 守卫保证只 alloc 一次；': '        // 把 selfRenderView 持有为 ivar：单次 attach 由 self.attached 守卫保证只 alloc 一次；',
    '        // 把自己注册成 EventEmitter 的下行通道。Delegate 调': '        // 把自己注册成 EventEmitter 的下行通道。Delegate 调',
    '        // 按 adId debounce（多 cell 并发渲染各自独立，不互相取消）': '        // 按 adId debounce（多 cell 并发渲染各自独立，不互相取消）',
    '        // 日志双开：先开桥层 MsgTools（确保下面这行可见），再开 SDK 网络日志': '        // 日志双开：先开桥层 MsgTools（确保下面这行可见），再开 SDK 网络日志',
    '        // 显式把 Fabric ComponentView 注册到工厂（RN 0.85 不走 dlsym，详见顶部注释）。': '        // 显式把 Fabric ComponentView 注册到工厂（RN 0.85 不走 dlsym，详见顶部注释）。',
    '        // 格式：placementID + "#" + 自增序号，简单可读、无冲突。': '        // 格式：placementID + "#" + 自增序号，简单可读、无冲突。',
    '        // 模型 A：等 RN AssetView 都布局完（有尺寸）再 native 重建，避免 measure 量到 0 漏素材。': '        // 模型 A：等 RN AssetView 都布局完（有尺寸）再 native 重建，避免 measure 量到 0 漏素材。',
    '        // 此时 adId 不在缓存 或 container 已换绑别的 adId，则放弃重建，避免用废弃对象 renderAdContainer/prepare。': '        // 此时 adId 不在缓存 或 container 已换绑别的 adId，则放弃重建，避免用废弃对象 renderAdContainer/prepare。',
    '        // 生成跨桥对象引用 adId（= 安卓 NativeAd 对象引用的等价替代）。': '        // 生成跨桥对象引用 adId（= 安卓 NativeAd 对象引用的等价替代）。',
    '        // 移除上一次的重建层（重渲染/换 offer 时，否则多套素材叠加重影）。': '        // 移除上一次的重建层（重渲染/换 offer 时，否则多套素材叠加重影）。',
    '        // 背景色：RN 的 backgroundColor 在新旧架构渲染成 ColorDrawable 或 ReactViewBackgroundDrawable/': '        // 背景色：RN 的 backgroundColor 在新旧架构渲染成 ColorDrawable 或 ReactViewBackgroundDrawable/',
    '        // 跨 destroy 后再 attach（ivar 已清回 nil）时才会重新 alloc。': '        // 跨 destroy 后再 attach（ivar 已清回 nil）时才会重新 alloc。',
    '        // 这两次 (void)Cls() 同时起到强引用作用，防 ATRNBannerView.o / ATRNNativeAdView.o 被 dead-strip。': '        // 这两次 (void)Cls() 同时起到强引用作用，防 ATRNBannerView.o / ATRNNativeAdView.o 被 dead-strip。',
    '        // 重建层在 RN 容器内需强制 measure/layout 才可见（跳过 RN 子节点的工具）。': '        // 重建层在 RN 容器内需强制 measure/layout 才可见（跳过 RN 子节点的工具）。',
    '        // 重挂进 GDT 容器（不再是直接子）。故按 class 区分：跳过 RN 渲染的直接子（com.facebook.react.*，': '        // 重挂进 GDT 容器（不再是直接子）。故按 class 区分：跳过 RN 渲染的直接子（com.facebook.react.*，',
    '        // 隐藏 RN 渲染的 AssetView（已被 native 重建层顶替），否则两套并存、布局变动时错位 → 重影。': '        // 隐藏 RN 渲染的 AssetView（已被 native 重建层顶替），否则两套并存、布局变动时错位 → 重影。',
    '        _nativeExpressMap[placementID] = @(NO);   // 自渲染': '        _nativeExpressMap[placementID] = @(NO);   // 自渲染',
    '        _nativeExpressMap[placementID] = @(YES);  // 模板（Express）': '        _nativeExpressMap[placementID] = @(YES);  // 模板（Express）',
    '        final NativeAd mNativeAd = ad; // 下方沿用原变量名': '        final NativeAd mNativeAd = ad; // 下方沿用原变量名',
    '        root.setTag(REBUILD_ROOT_TAG); // 标记重建层，重渲染时据此移除旧的，防重叠重影': '        root.setTag(REBUILD_ROOT_TAG); // 标记重建层，重渲染时据此移除旧的，防重叠重影',
    '     *                    false（media）：直接用 host 宽高 EXACTLY 铺满。': '     *                    false（media）：直接用 host 宽高 EXACTLY 铺满。',
    '     *  - ColorDrawable：旧/简单情况，直接 getColor。': '     *  - ColorDrawable：旧/简单情况，直接 getColor。',
    '     *  - CompositeBackgroundDrawable（RN 0.85 Fabric 复合背景）：纯色在内部 background:BackgroundDrawable 的 backgroundColor。': '     *  - CompositeBackgroundDrawable（RN 0.85 Fabric 复合背景）：纯色在内部 background:BackgroundDrawable 的 backgroundColor。',
    '     *  - 其它带 getColor() 的：反射兜底。': '     *  - 其它带 getColor() 的：反射兜底。',
    '     * @deprecated 自渲染绑定改由 Fabric command（updateAssetView/renderNativeAd）驱动，': '     * @deprecated 自渲染绑定改由 Fabric command（updateAssetView/renderNativeAd）驱动，',
    '     * @param assetTags   react tag → 类型名（title/desc/cta/appIcon/mainImage/mediaView/dislike）': '     * @param assetTags   react tag → 类型名（title/desc/cta/appIcon/mainImage/mediaView/dislike）',
    '     * @param assetTags  react tag → 类型名（Const.Native.* 值：title/desc/cta/appIcon/mainImage/mediaView...）': '     * @param assetTags  react tag → 类型名（Const.Native.* 值：title/desc/cta/appIcon/mainImage/mediaView...）',
    '     * @param assetTags JS 注册的 {react tag → 类型}': '     * @param assetTags JS 注册的 {react tag → 类型}',
    '     * @param callName     8 个固定 callName 之一（Const.CallbackMethodCall.*）': '     * @param callName     8 个固定 callName 之一（Const.CallbackMethodCall.*）',
    '     * @param callbackName 具体回调名（Const.*Callback.*）': '     * @param callbackName 具体回调名（Const.*Callback.*）',
    '     * @param clickViewsOut 收集的可点 view（最终 setClickViewList）': '     * @param clickViewsOut 收集的可点 view（最终 setClickViewList）',
    '     * @param container   ATNativeContainer（measure 基准 + 文本样式来源）': '     * @param container   ATNativeContainer（measure 基准 + 文本样式来源）',
    '     * @param container  TUNativeAdView 容器（asset 子节点在其内，findViewById 取得到）': '     * @param container  TUNativeAdView 容器（asset 子节点在其内，findViewById 取得到）',
    '     * @param container ATNativeContainer（=TUNativeAdView 子类）': '     * @param container ATNativeContainer（=TUNativeAdView 子类）',
    '     * @param extra        附加布尔字段（isDeeplinkSuccess / isTimeout）；可空': '     * @param extra        附加布尔字段（isDeeplinkSuccess / isTimeout）；可空',
    '     * @param extraDic     展平的 TUAdInfo（Map）；可空': '     * @param extraDic     展平的 TUAdInfo（Map）；可空',
    '     * @param host        监听 + 提供尺寸的容器': '     * @param host        监听 + 提供尺寸的容器',
    '     * @param info        待填充的 prepareInfo（setXxxView）': '     * @param info        待填充的 prepareInfo（setXxxView）',
    '     * @param material    SDK 素材（文本/图 url 来源）': '     * @param material    SDK 素材（文本/图 url 来源）',
    '     * @param mediaView   SDK getAdMediaView 结果（可空；视频/大图 surface）': '     * @param mediaView   SDK getAdMediaView 结果（可空；视频/大图 surface）',
    '     * @param mediaView  SDK 的 getAdMediaView() 结果（已被 addView 进 mediaView 占位的，加入 clickViewList）；可空': '     * @param mediaView  SDK 的 getAdMediaView() 结果（已被 addView 进 mediaView 占位的，加入 clickViewList）；可空',
    '     * @param placementId  广告位 ID；Init 类可为空串': '     * @param placementId  广告位 ID；Init 类可为空串',
    '     * @param requestMessage AdError 全文；成功时传 null（emit 时补 ""）': '     * @param requestMessage AdError 全文；成功时传 null（emit 时补 ""）',
    '     * @param wrapHeight  true（模板）：用 host 宽 EXACTLY + 高 UNSPECIFIED 量 SDK view 自然高，并把 host 撑到该高度；': '     * @param wrapHeight  true（模板）：用 host 宽 EXACTLY + 高 UNSPECIFIED 量 SDK view 自然高，并把 host 撑到该高度；',
    '     * @return native 根 FrameLayout（绝对定位子 view），供 renderAdContainer 用': '     * @return native 根 FrameLayout（绝对定位子 view），供 renderAdContainer 用',
    '     * RN 背景在不同版本/架构是不同 drawable：': '     * RN 背景在不同版本/架构是不同 drawable：',
    '     * SDK 注入的 view（模板 view / media surface）在 Fabric 容器内不被 Yoga 布局 → 0 尺寸。': '     * SDK 注入的 view（模板 view / media surface）在 Fabric 容器内不被 Yoga 布局 → 0 尺寸。',
    '     * mNativeAd.prepare 注册点击/曝光。RN view 由 RN 自己布局，不 re-parent → 无 relayout 需求。': '     * mNativeAd.prepare 注册点击/曝光。RN view 由 RN 自己布局，不 re-parent → 无 relayout 需求。',
    '     * mediaView 是 SDK 原生 view（不能序列化），仅回传 isMediaViewAvailable 标志，真 view 在 renderNativeAd 时 addView。': '     * mediaView 是 SDK 原生 view（不能序列化），仅回传 isMediaViewAvailable 标志，真 view 在 renderNativeAd 时 addView。',
    '     * name 可能带 JS 侧解析好的文字色后缀 "type|c=<int>"：拆出干净类型存 assetTags（两种绑定路径都按它比对），': '     * name 可能带 JS 侧解析好的文字色后缀 "type|c=<int>"：拆出干净类型存 assetTags（两种绑定路径都按它比对），',
    '     * {@code TUSDK.setDeviceInformationData} 专用：RN {@code toHashMap()} 数字为 {@link Double}，': '     * {@code TUSDK.setDeviceInformationData} 专用：RN {@code toHashMap()} 数字为 {@link Double}，',
    '     * 不再走 prepareNativeAd bridge。保留空实现以兼容旧 spec 方法签名（L1 NativeAd.prepare 已弃用）。': '     * 不再走 prepareNativeAd bridge。保留空实现以兼容旧 spec 方法签名（L1 NativeAd.prepare 已弃用）。',
    '     * 仅 express 走（renderIfReady 或 renderSelfRender 转发）；自渲染走 doRenderSelfRender。': '     * 仅 express 走（renderIfReady 或 renderSelfRender 转发）；自渲染走 doRenderSelfRender。',
    '     * 供 {@link BridgeJsonMapUtil} 等解析。': '     * 供 {@link BridgeJsonMapUtil} 等解析。',
    '     * 发送一条回调到 JS。': '     * 发送一条回调到 JS。',
    '     * 取不到（圆角/渐变等复杂背景）返回 0（透明），由调用方决定兜底。': '     * 取不到（圆角/渐变等复杂背景）返回 0（透明），由调用方决定兜底。',
    '     * 在 host 的 OnPreDraw 里持续 ~30 帧用 host 尺寸 measure+layout 修正（让异步 surface 到位后也被布局）。': '     * 在 host 的 OnPreDraw 里持续 ~30 帧用 host 尺寸 measure+layout 修正（让异步 surface 到位后也被布局）。',
    '     * 嵌套对象为 {@link Map}，而 Core SDK 要求 {@link Integer}/{@link JSONObject}。': '     * 嵌套对象为 {@link Map}，而 Core SDK 要求 {@link Integer}/{@link JSONObject}。',
    '     * 把嵌套 {@code HashMap}/{@code ArrayList}（如 RN ReadableMap.toHashMap 的产物）序列化为 JSON，': '     * 把嵌套 {@code HashMap}/{@code ArrayList}（如 RN ReadableMap.toHashMap 的产物）序列化为 JSON，',
    '     * 模板 view 是 SDK 注入，Fabric 容器不会布局它 → 渲染后强制 measure+layout 铺满容器修正（同模板黑块的修法）。': '     * 模板 view 是 SDK 注入，Fabric 容器不会布局它 → 渲染后强制 measure+layout 铺满容器修正（同模板黑块的修法）。',
    '     * 模板(express) 独立路径（attach 时调）：开发者已 load+getNativeAd 且是 express 时，SDK 自动渲染模板进容器。': '     * 模板(express) 独立路径（attach 时调）：开发者已 load+getNativeAd 且是 express 时，SDK 自动渲染模板进容器。',
    '     * 模板(express) 独立路径：SDK 用 renderAdContainer 把平台模板渲染进容器，再 prepare。': '     * 模板(express) 独立路径：SDK 用 renderAdContainer 把平台模板渲染进容器，再 prepare。',
    '     * 流程：findViewById(各 asset tag) → setXxxView + 收 clickViewList；getAdMediaView addView 进 mediaView 占位；': '     * 流程：findViewById(各 asset tag) → setXxxView + 收 clickViewList；getAdMediaView addView 进 mediaView 占位；',
    '     * 由 RN 的 AssetView 组件（&lt;Text&gt;/&lt;Image&gt;）自渲染填值。key 用 Const.Native.*。': '     * 由 RN 的 AssetView 组件（&lt;Text&gt;/&lt;Image&gt;）自渲染填值。key 用 Const.Native.*。',
    '     * 自渲染素材回传：从 NativeAd.getAdMaterial() 取素材字段打包给 JS，': '     * 自渲染素材回传：从 NativeAd.getAdMaterial() 取素材字段打包给 JS，',
    '     * 自渲染绑定（JS 的 renderNativeAd command 触发，debounce 50ms 防多次抖动）。': '     * 自渲染绑定（JS 的 renderNativeAd command 触发，debounce 50ms 防多次抖动）。',
    '     * 自渲染（非 express）不走这里——由 JS 的 updateAssetView/renderNativeAd command → renderSelfRender 驱动。': '     * 自渲染（非 express）不走这里——由 JS 的 updateAssetView/renderNativeAd command → renderSelfRender 驱动。',
    '     * 读 RN AssetView 的背景色（让开发者写在 AssetView 上的 backgroundColor 被 native 重建还原，如 CTA 蓝底）。': '     * 读 RN AssetView 的背景色（让开发者写在 AssetView 上的 backgroundColor 被 native 重建还原，如 CTA 蓝底）。',
    '     * 重建素材。container 内已有 RN 渲染的 AssetView（findViewById 可取）。': '     * 重建素材。container 内已有 RN 渲染的 AssetView（findViewById 可取）。',
    '     * 颜色另存 assetColors 供自渲染重建用 */': '     * 颜色另存 assetColors 供自渲染重建用 */',
    '    // ATNativeUIComponent.attachIfNeeded 是真正消费 offer 并渲染的唯一入口。': '    // ATNativeUIComponent.attachIfNeeded 是真正消费 offer 并渲染的唯一入口。',
    '    // NativeEventEmitter 要求；事件由 ATReactNativeEventEmitter 主动 emit，无需在此记录': '    // NativeEventEmitter 要求；事件由 ATReactNativeEventEmitter 主动 emit，无需在此记录',
    '    // SDK 在 renderer 内部会用 adView.bounds 计算子视图布局；若此时 bounds=0×0，': '    // SDK 在 renderer 内部会用 adView.bounds 计算子视图布局；若此时 bounds=0×0，',
    '    // SDK 的 didShowNativeAdInAdView/didClickNativeAdInAdView 等回调才有接收方，否则全丢。': '    // SDK 的 didShowNativeAdInAdView/didClickNativeAdInAdView 等回调才有接收方，否则全丢。',
    '    // SDK 看到 ADFrame=0×0 时不会触发 didShowNativeAdInAdView:（认为广告不可见）。': '    // SDK 看到 ADFrame=0×0 时不会触发 didShowNativeAdInAdView:（认为广告不可见）。',
    '    // adId 自增计数器（主线程访问，无需加锁）': '    // adId 自增计数器（主线程访问，无需加锁）',
    '    // getATNativeADConfiguration 内部用 extraDic 解析宽高，传空 dict 会得到 ADFrame=0×0。': '    // getATNativeADConfiguration 内部用 extraDic 解析宽高，传空 dict 会得到 ADFrame=0×0。',
    '    // hostView 还没 layout 时不要 attach（SDK 渲染拿 size=0 会出问题）。': '    // hostView 还没 layout 时不要 attach（SDK 渲染拿 size=0 会出问题）。',
    '    // iOS SDK 暂无与 Android setRiskFilterNetworkFirmIdList 等价的公开 API': '    // iOS SDK 暂无与 Android setRiskFilterNetworkFirmIdList 等价的公开 API',
    '    // loadNativeAd 时记录每个 placement 的广告类型（YES=Express模板，NO=自渲染）。': '    // loadNativeAd 时记录每个 placement 的广告类型（YES=Express模板，NO=自渲染）。',
    '    // selfRenderView 作为 adView 子树会随 adView 释放，这里显式清 ivar 让下次 attach 重新 alloc': '    // selfRenderView 作为 adView 子树会随 adView 释放，这里显式清 ivar 让下次 attach 重新 alloc',
    '    // 不共用同一实例会导致 UIComponent 走 attachIfNeeded 时 config.delegate=nil → 展示/点击回调丢失。': '    // 不共用同一实例会导致 UIComponent 走 attachIfNeeded 时 config.delegate=nil → 展示/点击回调丢失。',
    '    // 与 ATPlatformBannerManager / Flutter ATFBannerPlatformView 一致：retrieve + addSubview': '    // 与 ATPlatformBannerManager / Flutter ATFBannerPlatformView 一致：retrieve + addSubview',
    '    // 与 RN 端约定数字映射：0=Unknown, 1=Personalized, 2=Nonpersonalized': '    // 与 RN 端约定数字映射：0=Unknown, 1=Personalized, 2=Nonpersonalized',
    '    // 供 getNativeAdMaterial 查表返回 isExpress，而不需要消费 ATAdManager 的 offer pool。': '    // 供 getNativeAdMaterial 查表返回 isExpress，而不需要消费 ATAdManager 的 offer pool。',
    '    // 关键：用 ATNativeManager 的 instance method 拿 config——它内部 config.delegate=self（ATNativeManager 单例），': '    // 关键：用 ATNativeManager 的 instance method 拿 config——它内部 config.delegate=self（ATNativeManager 单例），',
    '    // 参考 Flutter ATFAdManger+NativeAd.m：默认 YES（自渲染 ATNativeManager）；': '    // 参考 Flutter ATFAdManger+NativeAd.m：默认 YES（自渲染 ATNativeManager）；',
    '    // 可通过以下代码设置穿山甲平台的插屏图片广告的尺寸': '    // 可通过以下代码设置穿山甲平台的插屏图片广告的尺寸',
    '    // 和展示 delegate（ATNativeADConfiguration.delegate）的角色。': '    // 和展示 delegate（ATNativeADConfiguration.delegate）的角色。',
    '    // 子视图全挤到 (0,0)，模板内容不可见（或被裁剪成 0 面积）。': '    // 子视图全挤到 (0,0)，模板内容不可见（或被裁剪成 0 面积）。',
    '    // 必须在 rendererWithConfiguration: 之前先设好 frame：': '    // 必须在 rendererWithConfiguration: 之前先设好 frame：',
    '    // 新架构推荐：通过 callableJSModules 调 JS 端 RCTDeviceEventEmitter.emit': '    // 新架构推荐：通过 callableJSModules 调 JS 端 RCTDeviceEventEmitter.emit',
    '    // 旧架构不同 RN 版本可能下发 String 命令名或 int id，两个重载都实现，统一分发。': '    // 旧架构不同 RN 版本可能下发 String 命令名或 int id，两个重载都实现，统一分发。',
    '    // 旧架构命令名→id 注册（JS codegenNativeCommands fallback 走 UIManager.dispatchViewManagerCommand）': '    // 旧架构命令名→id 注册（JS codegenNativeCommands fallback 走 UIManager.dispatchViewManagerCommand）',
    '    // 显式传 isNativeShowType=NO 才走模板（ATPlatformNativeManager）。': '    // 显式传 isNativeShowType=NO 才走模板（ATPlatformNativeManager）。',
    '    // 查 _nativeExpressMap 返回 isExpress，不调 getNativeAdOfferWithPlacementID（会消费 offer pool）。': '    // 查 _nativeExpressMap 返回 isExpress，不调 getNativeAdOfferWithPlacementID（会消费 offer pool）。',
    '    // 此处用反射方式调用，发布时可以不用导入AnyThinkDebuggerUISDK库': '    // 此处用反射方式调用，发布时可以不用导入AnyThinkDebuggerUISDK库',
    '    // 注入 context：Manager 取 Context/Activity，EventEmitter 取 RCTDeviceEventEmitter': '    // 注入 context：Manager 取 Context/Activity，EventEmitter 取 RCTDeviceEventEmitter',
    '    // 激励视频当做插屏使用（调用Sigmob的激励视频API）': '    // 激励视频当做插屏使用（调用Sigmob的激励视频API）',
    '    // 用 sharedManager 共享同一实例——它同时承担 SDK 加载 delegate（loadADWithPlacementID:delegate:）': '    // 用 sharedManager 共享同一实例——它同时承担 SDK 加载 delegate（loadADWithPlacementID:delegate:）',
    '    // 直接调 [ATNativeTool getATNativeADConfiguration:] 拿到的 config.delegate=nil。': '    // 直接调 [ATNativeTool getATNativeADConfiguration:] 拿到的 config.delegate=nil。',
    '    // 等 layoutSubviews 触发时再 attach（attached 守卫保证幂等）。': '    // 等 layoutSubviews 触发时再 attach（attached 守卫保证幂等）。',
    '    // 这里用 hostView 的实际 bounds 覆盖，确保 SDK 知道正确的渲染尺寸。': '    // 这里用 hostView 的实际 bounds 覆盖，确保 SDK 知道正确的渲染尺寸。',
    '    // 降级：旧架构 / bridge 还在的情况': '    // 降级：旧架构 / bridge 还在的情况',
    '    // 🔴 线程命门：原生回调可能在子线程，必须切回主线程': '    // 🔴 线程命门：原生回调可能在子线程，必须切回主线程',
    '    /// TODO: 将解析后的策略应用到各已接入的广告源 CustomController（iOS adapters）。': '    /// TODO: 将解析后的策略应用到各已接入的广告源 CustomController（iOS adapters）。',
    '    ATNativeManager *_nativeMgr;           // 自渲染（self-render）': '    ATNativeManager *_nativeMgr;           // 自渲染（self-render）',
    '    ATPlatformNativeManager *_platformNativeMgr;  // 模板（Express）；按 settings.isNativeShowType=NO 分发': '    ATPlatformNativeManager *_platformNativeMgr;  // 模板（Express）；按 settings.isNativeShowType=NO 分发',
    ' *     两次 SDK 加载），导致广告渲染重复 / 失序。': ' *     两次 SDK 加载），导致广告渲染重复 / 失序。',
    ' *    并 addSubview 到外部传入的 hostView（不走 ATBannerAdManager.showBanner）；': ' *    并 addSubview 到外部传入的 hostView（不走 ATBannerAdManager.showBanner）；',
    ' *   - JS 端流程 `await native.getNativeAd()` 已经保证 mount ComponentView 时缓存里有 offer。': ' *   - JS 端流程 `await native.getNativeAd()` 已经保证 mount ComponentView 时缓存里有 offer。',
    ' *   - layoutSubviews 再次触发 attachIfNeeded（attached 守卫保证幂等）。': ' *   - layoutSubviews 再次触发 attachIfNeeded（attached 守卫保证幂等）。',
    ' *   - updateProps 第一次调 attachIfNeeded 时，hostView 可能还未 layout（bounds=0），跳过；': ' *   - updateProps 第一次调 attachIfNeeded 时，hostView 可能还未 layout（bounds=0），跳过；',
    ' *   - 如果 ComponentView 也调 loadAd，会跟 JS 端 ATNative 的加载流程冲突（两套 delegate、': ' *   - 如果 ComponentView 也调 loadAd，会跟 JS 端 ATNative 的加载流程冲突（两套 delegate、',
    ' *   1. attachIfNeeded 调 [ATAdManager getNativeAdOfferWithPlacementID:] 拿缓存 offer': ' *   1. attachIfNeeded 调 [ATAdManager getNativeAdOfferWithPlacementID:] 拿缓存 offer',
    ' *   2. 构造 ATNativeADView 渲染（仅模板 Express；自渲染待 viewTag binding）': ' *   2. 构造 ATNativeADView 渲染（仅模板 Express；自渲染待 viewTag binding）',
    ' *   3. addSubview 到 hostView': ' *   3. addSubview 到 hostView',
    ' *   再交 {@link BridgeJsonMapUtil}.*FromJson 复用既有 JSON 解析逻辑。': ' *   再交 {@link BridgeJsonMapUtil}.*FromJson 复用既有 JSON 解析逻辑。',
    ' *  - delegate 的 onBannerLoaded callback 触发后，调 retrieveBannerViewForPlacementID:config: 拿 ATBannerView': ' *  - delegate 的 onBannerLoaded callback 触发后，调 retrieveBannerViewForPlacementID:config: 拿 ATBannerView',
    ' *  - 事件驱动，无 polling。': ' *  - 事件驱动，无 polling。',
    ' *  - 命令式 load（ATBannerAdManager）仅负责预加载；Show 挂载 Fabric 时若已 ready，同样经 onBannerLoaded 触发 attach；': ' *  - 命令式 load（ATBannerAdManager）仅负责预加载；Show 挂载 Fabric 时若已 ready，同样经 onBannerLoaded 触发 attach；',
    ' *  - 持有 ATBannerDelegate 实例（不复用 ATPlatformBannerManager 的）；': ' *  - 持有 ATBannerDelegate 实例（不复用 ATPlatformBannerManager 的）；',
    ' *  - 调 SDK 加载 banner（[ATAdManager loadADWithPlacementID:extra:delegate:]）；': ' *  - 调 SDK 加载 banner（[ATAdManager loadADWithPlacementID:extra:delegate:]）；',
    ' *  十六进制字符串转颜色': ' *  十六进制字符串转颜色',
    ' * **不负责加载**——加载由 JS 端 `ATNative.makeAdRequest()` 触发（走 Bridge.loadNativeAd': ' * **不负责加载**——加载由 JS 端 `ATNative.makeAdRequest()` 触发（走 Bridge.loadNativeAd',
    ' * - init 系列          → ATInitManager 类方法': ' * - init 系列          → ATInitManager 类方法',
    ' * - 复杂嵌套参数（filterSpec/atAdRequest/sharedPlacementConfig）：先转 JSON 字符串，': ' * - 复杂嵌套参数（filterSpec/atAdRequest/sharedPlacementConfig）：先转 JSON 字符串，',
    ' * - 激励 / 插屏 / 开屏 / Banner / Native → 经 Bridge 内 lazy ivar 持单例 Manager，转发实例方法': ' * - 激励 / 插屏 / 开屏 / Banner / Native → 经 Bridge 内 lazy ivar 持单例 Manager，转发实例方法',
    ' * - 简单参数（customMap/extraDic）：ReadableMap 直接转 HashMap，不经 BridgeJsonMapUtil。': ' * - 简单参数（customMap/extraDic）：ReadableMap 直接转 HashMap，不经 BridgeJsonMapUtil。',
    ' * Banner Fabric ViewManager（新架构壳）：implements codegen Interface，props 转发共享 Impl。': ' * Banner Fabric ViewManager（新架构壳）：implements codegen Interface，props 转发共享 Impl。',
    ' * Banner UIComponent 中间层（参照 AppLovinMAXAdViewUIComponent 设计）。': ' * Banner UIComponent 中间层（参照 AppLovinMAXAdViewUIComponent 设计）。',
    ' * Banner ViewManager 的架构无关业务（共享 Impl）：创建容器 / props 暂存 / 延迟 attach / 销毁。': ' * Banner ViewManager 的架构无关业务（共享 Impl）：创建容器 / props 暂存 / 延迟 attach / 销毁。',
    ' * Banner ViewManager（旧架构壳）：@ReactProp ×5 转发共享 Impl（无 command）。': ' * Banner ViewManager（旧架构壳）：@ReactProp ×5 转发共享 Impl（无 command）。',
    ' * Banner 命令式路由。一 placementId 一 {@link ATBannerHelper}（池化）；': ' * Banner 命令式路由。一 placementId 一 {@link ATBannerHelper}（池化）；',
    ' * Banner 容器（共享，新旧架构通用）：RN 不会给"原生侧 addView 的子 view"做 measure/layout，': ' * Banner 容器（共享，新旧架构通用）：RN 不会给"原生侧 addView 的子 view"做 measure/layout，',
    ' * Bridge 自己不直接发事件，仅在每个 spec 方法第一行打印 `iOS: <method> <args>` 日志。': ' * Bridge 自己不直接发事件，仅在每个 spec 方法第一行打印 `iOS: <method> <args>` 日志。',
    ' * EventEmitter 通过 sink 转发到 RCTDeviceEventEmitter，': ' * EventEmitter 通过 sink 转发到 RCTDeviceEventEmitter，',
    ' * Fabric ViewManager 与命令式共用同一 Helper（getOrCreateHelperForView）。': ' * Fabric ViewManager 与命令式共用同一 Helper（getOrCreateHelperForView）。',
    ' * Fabric ViewManager 与命令式桥共用同一 Helper（getOrCreateHelperForView）。': ' * Fabric ViewManager 与命令式桥共用同一 Helper（getOrCreateHelperForView）。',
    ' * Init / Core 路由。': ' * Init / Core 路由。',
    ' * JS 透传，用户无感。素材/渲染/绑定/事件/生命周期/销毁均按 adId 定位到具体那条。': ' * JS 透传，用户无感。素材/渲染/绑定/事件/生命周期/销毁均按 adId 定位到具体那条。',
    ' * JSON / 数组工具（从通用工具移植，仅保留与桥接无 UI/Core 依赖的部分）。': ' * JSON / 数组工具（从通用工具移植，仅保留与桥接无 UI/Core 依赖的部分）。',
    ' * JSON key 与 iOS / Unity / anythink 分支对齐，便于跨品牌 API 一致。': ' * JSON key 与 iOS / Unity / anythink 分支对齐，便于跨品牌 API 一致。',
    ' * Listener 回调统一经 {@link ATReactNativeEventEmitter} 转发 InterstitialCall。': ' * Listener 回调统一经 {@link ATReactNativeEventEmitter} 转发 InterstitialCall。',
    ' * Listener 回调统一经 {@link ATReactNativeEventEmitter} 转发 RewardedVideoCall。': ' * Listener 回调统一经 {@link ATReactNativeEventEmitter} 转发 RewardedVideoCall。',
    ' * Listener 经 {@link ATReactNativeEventEmitter} 转发 SplashCall；show 渲染进桥内容器（高度可配），dismiss 移除防泄漏。': ' * Listener 经 {@link ATReactNativeEventEmitter} 转发 SplashCall；show 渲染进桥内容器（高度可配），dismiss 移除防泄漏。',
    ' * Native Fabric ViewManager（新架构壳）：implements codegen Interface + Delegate；': ' * Native Fabric ViewManager（新架构壳）：implements codegen Interface + Delegate；',
    ' * Native ViewManager 的架构无关业务（共享 Impl）+ 2 个 command（updateAssetView / renderNativeAd）。': ' * Native ViewManager 的架构无关业务（共享 Impl）+ 2 个 command（updateAssetView / renderNativeAd）。',
    ' * Native ViewManager（旧架构壳）：@ReactProp ×6 + getCommandsMap + 手写 receiveCommand（String/int 双重载）': ' * Native ViewManager（旧架构壳）：@ReactProp ×6 + getCommandsMap + 手写 receiveCommand（String/int 双重载）',
    ' * Native → JS 唯一事件通道。': ' * Native → JS 唯一事件通道。',
    ' * Native → JS 唯一事件通道（对应 Flutter `ATSendSignalManager` / Android `ATReactNativeEventEmitter`）。': ' * Native → JS 唯一事件通道（对应 Flutter `ATSendSignalManager` / Android `ATReactNativeEventEmitter`）。',
    ' * Native 命令式路由。一 placementId 一 {@link ATNativeHelper}（池化）；': ' * Native 命令式路由。一 placementId 一 {@link ATNativeHelper}（池化）；',
    ' * Native 容器（共享，新旧架构通用）= SDK 埋点容器 TUNativeAdView 子类。': ' * Native 容器（共享，新旧架构通用）= SDK 埋点容器 TUNativeAdView 子类。',
    ' * Native（模板/Express）UIComponent 中间层（参照 AppLovinMAXAdViewUIComponent 设计）。': ' * Native（模板/Express）UIComponent 中间层（参照 AppLovinMAXAdViewUIComponent 设计）。',
    ' * RN asset 子节点（Text/Image）天然渲染在其内；持 asset tag↔类型注册表 + 关联 Helper + 绑定的 adId。': ' * RN asset 子节点（Text/Image）天然渲染在其内；持 asset tag↔类型注册表 + 关联 Helper + 绑定的 adId。',
    ' * RN 插件入口': ' * RN 插件入口',
    ' * RN→iOS 桥入口（双架构：旧架构 RCTBridgeModule + 新架构 TurboModule Spec）。': ' * RN→iOS 桥入口（双架构：旧架构 RCTBridgeModule + 新架构 TurboModule Spec）。',
    ' * TAG 固定 `ATRNBridge`；随 init 时与 SDK 日志双开（见 ATInitManager）。': ' * TAG 固定 `ATRNBridge`；随 init 时与 SDK 日志双开（见 ATInitManager）。',
    ' * TopOn/AnyThink RN 桥的 TurboModule 入口。': ' * TopOn/AnyThink RN 桥的 TurboModule 入口。',
    ' * UIComponent 只负责"消费已加载的广告"：': ' * UIComponent 只负责"消费已加载的广告"：',
    ' * `[SendEventManager sendMethod:arguments:result:]`（ATSendSignalManager 垫片）': ' * `[SendEventManager sendMethod:arguments:result:]`（ATSendSignalManager 垫片）',
    ' * adId = 跨桥的 NativeAd 对象引用：fetchNativeAd 从缓存池弹一条时分配（placementId#序号），': ' * adId = 跨桥的 NativeAd 对象引用：fetchNativeAd 从缓存池弹一条时分配（placementId#序号），',
    ' * callbackName 经唯一通道转发，与手动加载完全一致。': ' * callbackName 经唯一通道转发，与手动加载完全一致。',
    ' * load 失败/超时经事件回传；未 init / 无 Activity 才 reject。show 容器高度可配（heightRatio/heightPx）。': ' * load 失败/超时经事件回传；未 init / 无 Activity 才 reject。show 容器高度可配（heightRatio/heightPx）。',
    ' * load/show 失败经事件回传；未 init / 无 Activity 才 reject。': ' * load/show 失败经事件回传；未 init / 无 Activity 才 reject。',
    ' * native `container.findViewById(tag)`（Fabric 下 view.id==react tag）取到 RN 渲染好的 view，': ' * native `container.findViewById(tag)`（Fabric 下 view.id==react tag）取到 RN 渲染好的 view，',
    ' * newarch（codegen Interface）与 oldarch（@ReactProp + 手写 receiveCommand）两个壳都转发到此。': ' * newarch（codegen Interface）与 oldarch（@ReactProp + 手写 receiveCommand）两个壳都转发到此。',
    ' * newarch（codegen Interface）与 oldarch（@ReactProp）两个壳都转发到此，业务零分叉。': ' * newarch（codegen Interface）与 oldarch（@ReactProp）两个壳都转发到此，业务零分叉。',
    ' * props / 2 command（updateAssetView / renderNativeAd）转发共享 Impl。': ' * props / 2 command（updateAssetView / renderNativeAd）转发共享 Impl。',
    ' * thinkup（海外 TPN）分支：仅应用 Core 层 {@link TUUserDeviceInfo}，不绑定国内网盟 CustomController。': ' * thinkup（海外 TPN）分支：仅应用 Core 层 {@link TUUserDeviceInfo}，不绑定国内网盟 CustomController。',
    ' * → ATNativeManager.loadNativeWith），SDK 内部已经缓存好 offer。': ' * → ATNativeManager.loadNativeWith），SDK 内部已经缓存好 offer。',
    ' * 一 placementId 一 {@link ATInterstitialHelper}（池化）；load/show 失败经事件回传；未 init / 无 Activity 才 reject。': ' * 一 placementId 一 {@link ATInterstitialHelper}（池化）；load/show 失败经事件回传；未 init / 无 Activity 才 reject。',
    ' * 一 placementId 一 {@link ATRewardVideoHelper}（池化）。': ' * 一 placementId 一 {@link ATRewardVideoHelper}（池化）。',
    ' * 一个 placementId 的 Native Helper（支持列表多广告）。': ' * 一个 placementId 的 Native Helper（支持列表多广告）。',
    ' * 下行事件接收者协议。由 ATReactNativeBridge 实现，': ' * 下行事件接收者协议。由 ATReactNativeBridge 实现，',
    ' * 下行（JS→Native）数据格式工具。': ' * 下行（JS→Native）数据格式工具。',
    ' * 不写业务逻辑。回调统一经 {@link ATReactNativeEventEmitter}。': ' * 不写业务逻辑。回调统一经 {@link ATReactNativeEventEmitter}。',
    ' * 与 newarch 壳逐 prop 等价，仅 props 暴露方式不同（@ReactProp vs codegen Interface @Override）。': ' * 与 newarch 壳逐 prop 等价，仅 props 暴露方式不同（@ReactProp vs codegen Interface @Override）。',
    ' * 业务侧的 5 个 Delegate 通过 [SendEventManager sendMethod:arguments:result:]': ' * 业务侧的 5 个 Delegate 通过 [SendEventManager sendMethod:arguments:result:]',
    ' * 业务转发：': ' * 业务转发：',
    ' * 为什么不在这里 loadAd？': ' * 为什么不在这里 loadAd？',
    ' * 事件回到 JS（onAdLoaded / onAdFailed / 等）由各 Delegate 通过': ' * 事件回到 JS（onAdLoaded / onAdFailed / 等）由各 Delegate 通过',
    ' * 仅做转发，调用真实 `com.thinkup.core.api.TUSDK`。Context/Activity 桥内获取。': ' * 仅做转发，调用真实 `com.thinkup.core.api.TUSDK`。Context/Activity 桥内获取。',
    ' * 仅做转发：把 Codegen `NativeATBridgeSpec` 的方法路由到对应 *Manager。': ' * 仅做转发：把 Codegen `NativeATBridgeSpec` 的方法路由到对应 *Manager。',
    ' * 仅暴露方式不同：extends ReactContextBaseJavaModule + @ReactMethod（newarch 是 extends Spec + @Override）。': ' * 仅暴露方式不同：extends ReactContextBaseJavaModule + @ReactMethod（newarch 是 extends Spec + @Override）。',
    ' * 供 {@link BridgeJsonMapUtil} 与事件层复用。': ' * 供 {@link BridgeJsonMapUtil} 与事件层复用。',
    ' * 分发 updateAssetView / renderNativeAd，全部转发共享 Impl。与 newarch 壳逐项等价。': ' * 分发 updateAssetView / renderNativeAd，全部转发共享 Impl。与 newarch 壳逐项等价。',
    ' * 加载期回调走 TUNativeNetworkListener，展示期走 TUNativeEventExListener，统一 emit NativeCall（payload 带 adId）。': ' * 加载期回调走 TUNativeNetworkListener，展示期走 TUNativeEventExListener，统一 emit NativeCall（payload 带 adId）。',
    ' * 单 placementId 的 Banner Helper。': ' * 单 placementId 的 Banner Helper。',
    ' * 单 placementId 的开屏 Helper。': ' * 单 placementId 的开屏 Helper。',
    ' * 单 placementId 的插屏 Helper。': ' * 单 placementId 的插屏 Helper。',
    ' * 单 placementId 的激励视频 Helper。': ' * 单 placementId 的激励视频 Helper。',
    ' * 各 Helper init 时挂到对应 SDK 广告对象上。': ' * 各 Helper init 时挂到对应 SDK 广告对象上。',
    ' * 同步返回方法标 @ReactMethod(isBlockingSynchronousMethod = true)。': ' * 同步返回方法标 @ReactMethod(isBlockingSynchronousMethod = true)。',
    ' * 字段 public：供共享 Impl（com.anythink.reactnative.nativead.ATNativeAdViewManagerImpl）与 Helper 跨类访问。': ' * 字段 public：供共享 Impl（com.anythink.reactnative.nativead.ATNativeAdViewManagerImpl）与 Helper 跨类访问。',
    ' * 开屏路由。一 placementId 一 {@link ATSplashHelper}（池化）。': ' * 开屏路由。一 placementId 一 {@link ATSplashHelper}（池化）。',
    ' * 所有上行回调经此发出，按 8 个固定 callName + 统一 payload；**一律在主线程 emit**': ' * 所有上行回调经此发出，按 8 个固定 callName + 统一 payload；**一律在主线程 emit**',
    ' * 持 TUNative(加载器) + 多条 NativeAd（按 adId 索引，对齐安卓「单 TUNative + 多 NativeAd 对象」）。': ' * 持 TUNative(加载器) + 多条 NativeAd（按 adId 索引，对齐安卓「单 TUNative + 多 NativeAd 对象」）。',
    ' * 持原生 TUBannerView + Listener；回调经 {@link ATReactNativeEventEmitter} 转发 BannerCall。': ' * 持原生 TUBannerView + Listener；回调经 {@link ATReactNativeEventEmitter} 转发 BannerCall。',
    ' * 按类型 setXxxView + 全部收进 clickViewList → SDK 据此做点击/曝光（广告源 registerViewForInteraction）。': ' * 按类型 setXxxView + 全部收进 clickViewList → SDK 据此做点击/曝光（广告源 registerViewForInteraction）。',
    ' * 插屏 AutoLoad。callbackName 与手动一致。': ' * 插屏 AutoLoad。callbackName 与手动一致。',
    ' * 插屏路由。': ' * 插屏路由。',
    ' * 故 requestLayout 时强制 measure + layout 自己与子 view（banner 加载内容会触发 requestLayout）。': ' * 故 requestLayout 时强制 measure + layout 自己与子 view（banner 加载内容会触发 requestLayout）。',
    ' * 文本/图 url 来自 SDK material；位置/尺寸/样式 measure 自 RN AssetView（换算到 container 坐标系）。': ' * 文本/图 url 来自 SDK material；位置/尺寸/样式 measure 自 RN AssetView（换算到 container 坐标系）。',
    ' * 方法体完全相同（转发同一 *Manager 单例）。AI 逐方法语义翻译，校验靠 scripts/verify-arch-parity.mjs。': ' * 方法体完全相同（转发同一 *Manager 单例）。AI 逐方法语义翻译，校验靠 scripts/verify-arch-parity.mjs。',
    ' * 旧架构（Paper）桥入口 —— 与 newarch 的 {@link NativeATBridgeSpec} 壳逐方法等价，': ' * 旧架构（Paper）桥入口 —— 与 newarch 的 {@link NativeATBridgeSpec} 壳逐方法等价，',
    ' * 时机兜底：': ' * 时机兜底：',
    ' * 桥接层日志。': ' * 桥接层日志。',
    ' * 泛型用 FrameLayout（与两壳的 ViewManager 泛型一致；ATBannerContainer 是其子类）。': ' * 泛型用 FrameLayout（与两壳的 ViewManager 泛型一致；ATBannerContainer 是其子类）。',
    ' * 注册唯一的 TurboModule 入口 {@link ATReactNativeBridgeModule}。': ' * 注册唯一的 TurboModule 入口 {@link ATReactNativeBridgeModule}。',
    ' * 注：RN view 由 RN 自己布局，这里只注册引用、不 re-parent，故无任何 relayout 需求。': ' * 注：RN view 由 RN 自己布局，这里只注册引用、不 re-parent，故无任何 relayout 需求。',
    ' * 激励视频 AutoLoad。': ' * 激励视频 AutoLoad。',
    ' * 激励视频路由。': ' * 激励视频路由。',
    ' * 禁止第二套 EventBus。': ' * 禁止第二套 EventBus。',
    ' * 空 adId 回退到最近一条（mLastAdId），保证单广告/改造半态不崩。': ' * 空 adId 回退到最近一条（mLastAdId），保证单广告/改造半态不崩。',
    ' * 约定：RN 一律传结构化对象（Codegen → ReadableMap）。': ' * 约定：RN 一律传结构化对象（Codegen → ReadableMap）。',
    ' * 职责：': ' * 职责：',
    ' * 自渲染 native 重建（模型 A）：按 RN AssetView 的位置/尺寸/样式，用原生 view 重建一套素材，': ' * 自渲染 native 重建（模型 A）：按 RN AssetView 的位置/尺寸/样式，用原生 view 重建一套素材，',
    ' * 自渲染绑定：JS 经 command 注册的 asset {react tag → 类型}，': ' * 自渲染绑定：JS 经 command 注册的 asset {react tag → 类型}，',
    ' * 装进返回的 FrameLayout（不属于 RN 视图树）。供 ATNativeHelper 传给 SDK renderAdContainer，': ' * 装进返回的 FrameLayout（不属于 RN 视图树）。供 ATNativeHelper 传给 SDK renderAdContainer，',
    ' * 视图与命令式共享同一 Helper/TUBannerView（按 placementId 池化）。': ' * 视图与命令式共享同一 Helper/TUBannerView（按 placementId 池化）。',
    ' * 让 GDT 等需独占 NativeAdContainer 的 ADN 也能注册点击/曝光；快手等 ADN 同样适用。': ' * 让 GDT 等需独占 NativeAdContainer 的 ADN 也能注册点击/曝光；快手等 ADN 同样适用。',
    ' * 调用 JS 端 RCTDeviceEventEmitter.emit，由 NativeEventEmitter 订阅者收到。': ' * 调用 JS 端 RCTDeviceEventEmitter.emit，由 NativeEventEmitter 订阅者收到。',
    ' * 跨广告类型共享 Listener 工厂：Revenue / MultipleLoaded / AppDownload。': ' * 跨广告类型共享 Listener 工厂：Revenue / MultipleLoaded / AppDownload。',
    ' * 转发到 [ATReactNativeEventEmitter sharedInstance] → sink → callableJSModules；': ' * 转发到 [ATReactNativeEventEmitter sharedInstance] → sink → callableJSModules；',
    ' * 转给 sink（即 ATReactNativeBridge），最终通过 RCTCallableJSModules.invokeModule': ' * 转给 sink（即 ATReactNativeBridge），最终通过 RCTCallableJSModules.invokeModule',
    ' * 避免 EventEmitter.m 直接 import 含 C++ 的 RNATBridgeSpec.h。': ' * 避免 EventEmitter.m 直接 import 含 C++ 的 RNATBridgeSpec.h。',
    ' * （ATSendSignalManager 垫片）调到这里，再由本类按 8 callName + 统一 payload 结构': ' * （ATSendSignalManager 垫片）调到这里，再由本类按 8 callName + 统一 payload 结构',
    ' * （RN 的 JSI / 事件分发要求主线程；这是 iOS `dispatch_async(main)` 守护在 Android 的对应）。': ' * （RN 的 JSI / 事件分发要求主线程；这是 iOS `dispatch_async(main)` 守护在 Android 的对应）。',
    ' * 🔴 线程命门：原生回调可能在子线程，必须切回主线程再 emit（RN 0.85 严格主线程要求）。': ' * 🔴 线程命门：原生回调可能在子线程，必须切回主线程再 emit（RN 0.85 严格主线程要求）。',
    '//     Fabric runtime 找到，否则 JS 端 <ATBannerView>/<ATNativeADView> 会报 "Unimplemented component"。': '//     Fabric runtime 找到，否则 JS 端 <ATBannerView>/<ATNativeADView> 会报 "Unimplemented component"。',
    '//     不再像旧版那样用 dlsym 找 `<ComponentName>Cls`。': '//     不再像旧版那样用 dlsym 找 `<ComponentName>Cls`。',
    '//     强制链接器把 ATRNBannerView.o / ATRNNativeAdView.o 保留进 final binary。': '//     强制链接器把 ATRNBannerView.o / ATRNNativeAdView.o 保留进 final binary。',
    '//   - RN 0.85 的 RCTFabricComponentsProvider(name) 是个硬编码 map，**只查 RN 内置组件**；': '//   - RN 0.85 的 RCTFabricComponentsProvider(name) 是个硬编码 map，**只查 RN 内置组件**；',
    '//   - 同时仍要解决静态库 dead-strip 问题：在 init 里 (void) 一下两个 Cls() 函数，': '//   - 同时仍要解决静态库 dead-strip 问题：在 init 里 (void) 一下两个 Cls() 函数，',
    '//   - 第三方组件必须显式调用 [RCTComponentViewFactory registerComponentViewClass:] 才能被': '//   - 第三方组件必须显式调用 [RCTComponentViewFactory registerComponentViewClass:] 才能被',
    '// AnyThinkSDK 大量 API（GDPR consent dialog、Banner / Native view 操作、UI controller 取 root 等）': '// AnyThinkSDK 大量 API（GDPR consent dialog、Banner / Native view 操作、UI controller 取 root 等）',
    '// Fabric ComponentView 注册要点（RN 0.85，仅新架构）：': '// Fabric ComponentView 注册要点（RN 0.85，仅新架构）：',
    '// RCTBridgeModule 协议里 bridge / callableJSModules 是 @optional property，': '// RCTBridgeModule 协议里 bridge / callableJSModules 是 @optional property，',
    '// RN 0.85：RCTCallableJSModules 类和协议属性都声明在 RCTBridgeModule.h 内；': '// RN 0.85：RCTCallableJSModules 类和协议属性都声明在 RCTBridgeModule.h 内；',
    '// methodQueue 把所有 spec 方法调度切到主队列，避免单方法各自 dispatch_async 切线。': '// methodQueue 把所有 spec 方法调度切到主队列，避免单方法各自 dispatch_async 切线。',
    '// 不在 Bridge 暴露——但本入口仍提供 load/destroy/entryScenario 等命令式接口。': '// 不在 Bridge 暴露——但本入口仍提供 load/destroy/entryScenario 等命令式接口。',
    '// 命令式部分；嵌入式视图（show in rect / position / hide / afreshShow）走 Fabric ComponentView，': '// 命令式部分；嵌入式视图（show in rect / position / hide / afreshShow）走 Fabric ComponentView，',
    '// 命令式部分；自渲染 / Express 嵌入式视图走 Fabric ComponentView。': '// 命令式部分；自渲染 / Express 嵌入式视图走 Fabric ComponentView。',
    '// 强制主线程。requiresMainQueueSetup 让 RN 在主线程实例化模块；': '// 强制主线程。requiresMainQueueSetup 让 RN 在主线程实例化模块；',
    '// 必须显式 @synthesize 才能让 RN runtime 注入实例。': '// 必须显式 @synthesize 才能让 RN runtime 注入实例。',
    '// 注意移植坑：播放失败回调用 rewardedVideoDidFailToPlay（在 ATRewardVideoDelegate 内），勿照抄 FailToLoad。': '// 注意移植坑：播放失败回调用 rewardedVideoDidFailToPlay（在 ATRewardVideoDelegate 内），勿照抄 FailToLoad。',
    '// 注意：播放失败回调用 interstitialDidFailToPlayVideo（在 ATInterstitialDelegate 内）。': '// 注意：播放失败回调用 interstitialDidFailToPlayVideo（在 ATInterstitialDelegate 内）。',
    '// 该头通过 RNATBridgeSpec.h 已传递引入，下面只需 RCTEventDispatcher（fallback 用）。': '// 该头通过 RNATBridgeSpec.h 已传递引入，下面只需 RCTEventDispatcher（fallback 用）。',
    '///   bv.delegate / backgroundColor / presentingViewController；返回给容器作 subview。': '///   bv.delegate / backgroundColor / presentingViewController；返回给容器作 subview。',
    '///   中部：mainImage / mediaView（视频）': '///   中部：mainImage / mediaView（视频）',
    '///   底部：CTA 按钮（蓝底白字居中）': '///   底部：CTA 按钮（蓝底白字居中）',
    '///   顶部：icon(L) + title(R, 2 行)': '///   顶部：icon(L) + title(R, 2 行)',
    '///  展示GDPR+UMP二次确认界面（appId可空，兼容不带appId）': '///  展示GDPR+UMP二次确认界面（appId可空，兼容不带appId）',
    '///  展示GDPR+UMP二次确认界面（原生接口的appID可空，appId为空时传nil）': '///  展示GDPR+UMP二次确认界面（原生接口的appID可空，appId为空时传nil）',
    '///  展示GDPR+UMP授权界面（兼容不带appId的旧调用）': '///  展示GDPR+UMP授权界面（兼容不带appId的旧调用）',
    '///  展示GDPR+UMP授权界面（带appId；appId为空时走旧的无参接口，保持原有行为）': '///  展示GDPR+UMP授权界面（带appId；appId为空时走旧的无参接口，保持原有行为）',
    '///  展示场景开屏广告': '///  展示场景开屏广告',
    '///  展示场景插屏广告通过config': '///  展示场景插屏广告通过config',
    '///  展示场景激励视频广告': '///  展示场景激励视频广告',
    '///  展示开屏广告通过config': '///  展示开屏广告通过config',
    '///  展示激励视频广告通过config': '///  展示激励视频广告通过config',
    '///  检查是否为欧盟流量（appId可空，异步回调返回结果）': '///  检查是否为欧盟流量（appId可空，异步回调返回结果）',
    '///  检查是否为欧盟流量（带appId；appId为空时走旧的无参接口）': '///  检查是否为欧盟流量（带appId；appId为空时走旧的无参接口）',
    '///  注册瀑布流过滤器（filterJson 根键 groups；组内 AND、组间 OR）': '///  注册瀑布流过滤器（filterJson 根键 groups；组内 AND、组间 OR）',
    '///  注册瀑布流过滤器（filterJson 根键 groups；组内 AND、组间 OR；）': '///  注册瀑布流过滤器（filterJson 根键 groups；组内 AND、组间 OR；）',
    '///  移除指定广告位的过滤器': '///  移除指定广告位的过滤器',
    '///  获取当前广告位下所有可用广告的信息，v5.7.53及以上版本支持': '///  获取当前广告位下所有可用广告的信息，v5.7.53及以上版本支持',
    '///  设置共享广告位配置（参考 Unity ATUnityManager::setSharedPlacementConfig）': '///  设置共享广告位配置（参考 Unity ATUnityManager::setSharedPlacementConfig）',
    '///  设置广告源隐私合规策略': '///  设置广告源隐私合规策略',
    '///  设置广告源隐私合规策略（参考 Unity ATUnityManager::setAdSourcePrivacyPolicy，解析 policyJson 并打印）': '///  设置广告源隐私合规策略（参考 Unity ATUnityManager::setAdSourcePrivacyPolicy，解析 policyJson 并打印）',
    '/// App的自定义规则': '/// App的自定义规则',
    '/// Cache JS setLocalExtra，供 retrieve Banner 时使用': '/// Cache JS setLocalExtra，供 retrieve Banner 时使用',
    '/// Fabric ATNativeAdView → UIComponent（weak），关闭回调时定位并销毁。': '/// Fabric ATNativeAdView → UIComponent（weak），关闭回调时定位并销毁。',
    '/// Fabric 传入的请求尺寸（pt），load / attach 时使用': '/// Fabric 传入的请求尺寸（pt），load / attach 时使用',
    '/// Fabric 路径：UIComponent attach 时注册，关闭回调时按 adView 定位销毁。': '/// Fabric 路径：UIComponent attach 时注册，关闭回调时按 adView 定位销毁。',
    '/// Load succeeded回调（供 Fabric ComponentView 在 loaded 时 getOffer + 渲染 ATNativeADView + attach）': '/// Load succeeded回调（供 Fabric ComponentView 在 loaded 时 getOffer + 渲染 ATNativeADView + attach）',
    '/// Load succeeded回调（供 Fabric ComponentView 在 loaded 时 retrieve view + attach）': '/// Load succeeded回调（供 Fabric ComponentView 在 loaded 时 retrieve view + attach）',
    '/// Placement的自定义规则': '/// Placement的自定义规则',
    '/// Placement的自定义规则ID': '/// Placement的自定义规则ID',
    '/// Remove banner ad（仅从旧版 showBanner 容器移除，不释放 SDK 缓存）': '/// Remove banner ad（仅从旧版 showBanner 容器移除，不释放 SDK 缓存）',
    '/// SDK 在多个时机会把 selfRenderView.frame 抹回 0×0（rendererWithConfiguration: 至少一次，': '/// SDK 在多个时机会把 selfRenderView.frame 抹回 0×0（rendererWithConfiguration: 至少一次，',
    '/// Show native ad带showCustomExt': '/// Show native ad带showCustomExt',
    '/// `[SendEventManager sendMethod:arguments:result:]` 即可，内部转发到 ATReactNativeEventEmitter。': '/// `[SendEventManager sendMethod:arguments:result:]` 即可，内部转发到 ATReactNativeEventEmitter。',
    '/// attachBannerViewIfReady 会推迟到 layout 撑开后再 addSubview。': '/// attachBannerViewIfReady 会推迟到 layout 撑开后再 addSubview。',
    '/// hostView.bounds 为零或 offer 未就绪时安全跳过。': '/// hostView.bounds 为零或 offer 未就绪时安全跳过。',
    '/// iOS 无国内/海外 SDK 区分，固定返回 NO': '/// iOS 无国内/海外 SDK 区分，固定返回 NO',
    '/// setAdSourcePrivacyPolicy: 的 JSON key（与 Android AdSourcePrivacyPolicyStore.Keys、Unity 实现对齐）': '/// setAdSourcePrivacyPolicy: 的 JSON key（与 Android AdSourcePrivacyPolicyStore.Keys、Unity 实现对齐）',
    '/// 个性化广告（RN：0=PERSONALIZED，1=NONPERSONALIZED）': '/// 个性化广告（RN：0=PERSONALIZED，1=NONPERSONALIZED）',
    '/// 交叉推广排除已安装AppID的列表': '/// 交叉推广排除已安装AppID的列表',
    '/// 仅当缓存或 SDK 明确记录了与目标不一致的尺寸时才 reload': '/// 仅当缓存或 SDK 明确记录了与目标不一致的尺寸时才 reload',
    '/// 从 checkLoadStatus 的 user_load_extra_data.banner_ad_size 解析 SDK 实际 load 尺寸': '/// 从 checkLoadStatus 的 user_load_extra_data.banner_ad_size 解析 SDK 实际 load 尺寸',
    '/// 保持传给 SDK loadAD 的 extra 干净（与 Unity ATxxxWrapper::loadXxxWithPlacementID:customDataJSONString: 一致）。': '/// 保持传给 SDK loadAD 的 extra 干净（与 Unity ATxxxWrapper::loadXxxWithPlacementID:customDataJSONString: 一致）。',
    '/// 全 app 共用同一个 ATNativeManager 实例——它同时是 SDK 加载 delegate（loadADWithPlacementID:delegate:）': '/// 全 app 共用同一个 ATNativeManager 实例——它同时是 SDK 加载 delegate（loadADWithPlacementID:delegate:）',
    '/// 兼容 Flutter 旧 ATSendSignalManager 宏名。所有现存 Manager / Delegate 直接用': '/// 兼容 Flutter 旧 ATSendSignalManager 宏名。所有现存 Manager / Delegate 直接用',
    '/// 加载未完成时返回 NO（调用方应 polling 重试）；成功返回 YES 且 SDK view 已 addSubview 到 hostView。': '/// 加载未完成时返回 NO（调用方应 polling 重试）；成功返回 YES 且 SDK view 已 addSubview 到 hostView。',
    '/// 同步判断是否欧盟流量（= ATAPI inDataProtectionArea）': '/// 同步判断是否欧盟流量（= ATAPI inDataProtectionArea）',
    '/// 同步取已加载好的 SDK Banner UIView 加进 hostView。': '/// 同步取已加载好的 SDK Banner UIView 加进 hostView。',
    '/// 同步取已加载好的 SDK Native UIView 加进 hostView。': '/// 同步取已加载好的 SDK Native UIView 加进 hostView。',
    '/// 同步尝试把已加载好的 SDK Banner UIView 取出并加进 hostView。': '/// 同步尝试把已加载好的 SDK Banner UIView 取出并加进 hostView。',
    '/// 同步尝试把已加载好的 SDK Native ATNativeADView 取出并加进 hostView。': '/// 同步尝试把已加载好的 SDK Native ATNativeADView 取出并加进 hostView。',
    '/// 后续异步刷新可能再来）。这个方法统一把 selfRenderView + 各子 view 重新摆好。': '/// 后续异步刷新可能再来）。这个方法统一把 selfRenderView + 各子 view 重新摆好。',
    '/// 和展示 delegate（ATNativeADConfiguration.delegate）的接收方。UIComponent 必须用这个 sharedManager': '/// 和展示 delegate（ATNativeADConfiguration.delegate）的接收方。UIComponent 必须用这个 sharedManager',
    '/// 处理初始化SDK,flutter传过来的参数': '/// 处理初始化SDK,flutter传过来的参数',
    '/// 处理回调给flutter参数': '/// 处理回调给flutter参数',
    '/// 处理展示原始广告,flutter传过来的参数': '/// 处理展示原始广告,flutter传过来的参数',
    '/// 展示全自动加载插屏': '/// 展示全自动加载插屏',
    '/// 展示全自动加载插屏（showConfig）': '/// 展示全自动加载插屏（showConfig）',
    '/// 展示全自动加载插屏（仅 scenario）': '/// 展示全自动加载插屏（仅 scenario）',
    '/// 展示全自动加载激励视频广告（showConfig）': '/// 展示全自动加载激励视频广告（showConfig）',
    '/// 展示全自动加载激励视频广告（showConfig：scenario + showCustomExt）': '/// 展示全自动加载激励视频广告（showConfig：scenario + showCustomExt）',
    '/// 展示全自动加载激励视频广告（仅 scenario）': '/// 展示全自动加载激励视频广告（仅 scenario）',
    '/// 展示场景原生广告': '/// 展示场景原生广告',
    '/// 展示场景原生广告 带showCustomExt': '/// 展示场景原生广告 带showCustomExt',
    '/// 幂等：尝试从 SDK 缓存拿广告 offer 并渲染到 hostView。': '/// 幂等：尝试从 SDK 缓存拿广告 offer 并渲染到 hostView。',
    '/// 当前实现：模板（Express）模式直接渲染；自渲染模式记日志后返回 NO（待 selfRender 接 RN 元素 binding）。': '/// 当前实现：模板（Express）模式直接渲染；自渲染模式记日志后返回 NO（待 selfRender 接 RN 元素 binding）。',
    '/// 彻底销毁 placement：retrieve + destroyBanner + 清理缓存（对齐 Android helper.destroy）': '/// 彻底销毁 placement：retrieve + destroyBanner + 清理缓存（对齐 Android helper.destroy）',
    '/// 彻底销毁横幅广告（命令式 load / Fabric 展示共用）': '/// 彻底销毁横幅广告（命令式 load / Fabric 展示共用）',
    '/// 拿 config，否则 config.delegate=nil → 展示/点击/视频等回调全丢。': '/// 拿 config，否则 config.delegate=nil → 展示/点击/视频等回调全丢。',
    '/// 构造带 delegate=self 的 ATNativeADConfiguration（供 UIComponent 在 attachIfNeeded 里调用）。': '/// 构造带 delegate=self 的 ATNativeADConfiguration（供 UIComponent 在 attachIfNeeded 里调用）。',
    '/// 检查广告位的加载状态（实现模式照搬 ATRewardVideoManager.checkRewardedVideoLoadStatus:）': '/// 检查广告位的加载状态（实现模式照搬 ATRewardVideoManager.checkRewardedVideoLoadStatus:）',
    '/// 检查广告位的加载状态（对齐激励 ATRewardVideoManager.checkRewardedVideoLoadStatus:）': '/// 检查广告位的加载状态（对齐激励 ATRewardVideoManager.checkRewardedVideoLoadStatus:）',
    '/// 渲染路径与 Flutter `ATFBannerPlatformView.m` 一致：': '/// 渲染路径与 Flutter `ATFBannerPlatformView.m` 一致：',
    '/// 渲染路径参考 Flutter `ATFNativePlatformView.m`，简化版只处理模板（Express）；': '/// 渲染路径参考 Flutter `ATFNativePlatformView.m`，简化版只处理模板（Express）；',
    '/// 用位置和宽高属性来展示横幅场景广告': '/// 用位置和宽高属性来展示横幅场景广告',
    '/// 用位置和宽高属性来展示横幅广告': '/// 用位置和宽高属性来展示横幅广告',
    '/// 用户点关闭/dislike 后销毁，并阻止 layoutSubviews 再次 attach。': '/// 用户点关闭/dislike 后销毁，并阻止 layoutSubviews 再次 attach。',
    '/// 用预定义的位置来展示横幅场景广告': '/// 用预定义的位置来展示横幅场景广告',
    '/// 用预定义的位置来展示横幅广告': '/// 用预定义的位置来展示横幅广告',
    '/// 由 ATRNBannerView.layoutSubviews 兜底触发——SDK 已经 loaded 但 superview 还没撑开时，': '/// 由 ATRNBannerView.layoutSubviews 兜底触发——SDK 已经 loaded 但 superview 还没撑开时，',
    '/// 由 ATRNNativeAdView.layoutSubviews 调用，每次 layout 兜底把 selfRenderView 跟子 view frame 摆好。': '/// 由 ATRNNativeAdView.layoutSubviews 调用，每次 layout 兜底把 selfRenderView 跟子 view frame 摆好。',
    '/// 缓存 JS setShowConfig（scenarioId / showCustomExt），供 Fabric attach 时使用': '/// 缓存 JS setShowConfig（scenarioId / showCustomExt），供 Fabric attach 时使用',
    '/// 自渲染场景下，SDK 在 rendererWithConfiguration: 内部会把 selfRenderView.frame 重置回 0×0。': '/// 自渲染场景下，SDK 在 rendererWithConfiguration: 内部会把 selfRenderView.frame 重置回 0×0。',
    '/// 自渲染默认布局：参照常见 320x250 信息流模板——': '/// 自渲染默认布局：参照常见 320x250 信息流模板——',
    '/// 自渲染（self-render）模式涉及 RN 元素 viewTag → setTitleView 绑定，留待与 Android NativePrepareBinder 同模型时补齐。': '/// 自渲染（self-render）模式涉及 RN 元素 viewTag → setTitleView 绑定，留待与 Android NativePrepareBinder 同模型时补齐。',
    '/// 获取当前广告位下所有可用广告的信息': '/// 获取当前广告位下所有可用广告的信息',
    '/// 获取当前广告位下所有可用广告的信息 v5.7.53及以上版本支持': '/// 获取当前广告位下所有可用广告的信息 v5.7.53及以上版本支持',
    '/// 获取当前广告位下所有可用广告的信息（v5.7.53+ 支持）': '/// 获取当前广告位下所有可用广告的信息（v5.7.53+ 支持）',
    '/// 获取当前广告位下所有可用广告的信息，v5.7.53+ 支持': '/// 获取当前广告位下所有可用广告的信息，v5.7.53+ 支持',
    '/// 获取当前广告位下所有可用广告的信息，v5.7.53及以上版本支持': '/// 获取当前广告位下所有可用广告的信息，v5.7.53及以上版本支持',
    '/// 解析 RN 端 size 参数；无 size 时默认 320×50（标准 Banner），避免与 Fabric 展示尺寸不一致。': '/// 解析 RN 端 size 参数；无 size 时默认 320×50（标准 Banner），避免与 Fabric 展示尺寸不一致。',
    '/// 解析 adxBidFloorInfo / preLoadInfo 供后续扩展；处理完后从 dic 中移除 atAdRequest，': '/// 解析 adxBidFloorInfo / preLoadInfo 供后续扩展；处理完后从 dic 中移除 atAdRequest，',
    '/// 解析 extraDic 中的 atAdRequest 字段：若含 channelSource 则更新 SDK 全局配置，': '/// 解析 extraDic 中的 atAdRequest 字段：若含 channelSource 则更新 SDK 全局配置，',
    '/// 解析flutter端参数,获取bannerView的rect': '/// 解析flutter端参数,获取bannerView的rect',
    '/// 记录命令式 load 使用的尺寸，供 Fabric attach 时校验是否与 show 尺寸一致': '/// 记录命令式 load 使用的尺寸，供 Fabric attach 时校验是否与 show 尺寸一致',
    '/// 设置自动加载插屏广告回传参数，没传入extra内容可以用于清空': '/// 设置自动加载插屏广告回传参数，没传入extra内容可以用于清空',
    '/// 设置自动加载激励视频广告回传参数，没传入extra内容可以用于清空': '/// 设置自动加载激励视频广告回传参数，没传入extra内容可以用于清空',
    '/// 设置设备信息（best-effort 映射到 ATDeviceInfoConfig）': '/// 设置设备信息（best-effort 映射到 ATDeviceInfoConfig）',
    '/// 调用方：attachIfNeeded 内 render 之后；ATRNNativeAdView.layoutSubviews 兜底。': '/// 调用方：attachIfNeeded 内 render 之后；ATRNNativeAdView.layoutSubviews 兜底。',
    '/// 过滤广告源 / 平台（对齐 Android ATSDK filter 族，映射 iOS 等价 API）': '/// 过滤广告源 / 平台（对齐 Android ATSDK filter 族，映射 iOS 等价 API）',
    '/// 销毁 ATNativeADView（SDK destroyNative 反射调用）': '/// 销毁 ATNativeADView（SDK destroyNative 反射调用）',
    '/// 销毁原生广告（adId 空→整位销毁）': '/// 销毁原生广告（adId 空→整位销毁）',
    '@property (nonatomic, strong, nullable) ATNativeSelfRenderView *selfRenderView;  // 自渲染缓存，避免重复 alloc + 便于 destroy 时统一清理': '@property (nonatomic, strong, nullable) ATNativeSelfRenderView *selfRenderView;  // 自渲染缓存，避免重复 alloc + 便于 destroy 时统一清理',
}
