@netless/appliance-plugin 1.1.43-beta.0 → 1.1.43-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/READMA.zh-CN.md +1 -1
  2. package/README.md +5 -1
  3. package/dist/appliance-plugin.js +1 -1
  4. package/dist/appliance-plugin.mjs +1 -1
  5. package/dist/{bridge-DcVN05tP.mjs → bridge-DzcPAEgn.mjs} +1 -1
  6. package/dist/{bridge-D68E09T9.js → bridge-iTPNL78o.js} +1 -1
  7. package/dist/bridge.js +1 -1
  8. package/dist/bridge.mjs +1 -1
  9. package/dist/core/enum.d.ts +3 -1
  10. package/dist/core/mainEngine.d.ts +8 -2
  11. package/dist/core/mainThread/subLocalThread.d.ts +6 -1
  12. package/dist/core/tools/pencilEraserBitMap.d.ts +6 -2
  13. package/dist/core/types.d.ts +2 -0
  14. package/dist/core/worker/fullWorkerLocal.d.ts +4 -1
  15. package/dist/fullWorker.js +89 -89
  16. package/dist/{index-BNHPCii1.mjs → index-14J65ewZ.mjs} +271 -241
  17. package/dist/index-B6nsfvHS.js +570 -0
  18. package/dist/index-B9E9m3wQ.js +1 -0
  19. package/dist/{index-B_vZ9d3x.mjs → index-BARnlEAY.mjs} +7772 -7621
  20. package/dist/{index-CWDWQZBs.mjs → index-BGKGGHj6.mjs} +271 -241
  21. package/dist/index-Bgw8Yl5s.js +570 -0
  22. package/dist/{index-DiLPVPwQ.js → index-Bp0tojzJ.js} +1 -1
  23. package/dist/{index-GZUDLXJC.js → index-C-LIZHUj.js} +1 -1
  24. package/dist/{index-K_0NX6pD.mjs → index-D2r_A0b8.mjs} +1 -1
  25. package/dist/index-DVTWLAHF.js +1 -0
  26. package/dist/{index-CV8YaU3F.mjs → index-DWS4kyH2.mjs} +1 -1
  27. package/dist/{index-NG5kKK1W.mjs → index-DkMJ7xR-.mjs} +9004 -8853
  28. package/dist/plugin/bitmapEraserOptions.d.ts +0 -2
  29. package/dist/plugin/types.d.ts +0 -4
  30. package/dist/subWorker.js +85 -85
  31. package/package.json +1 -1
  32. package/dist/index-C2AHqjj8.js +0 -570
  33. package/dist/index-DChI1--R.js +0 -1
  34. package/dist/index-DFo0Gmfx.js +0 -570
  35. package/dist/index-GBYM7kT5.js +0 -1
package/READMA.zh-CN.md CHANGED
@@ -912,7 +912,7 @@ const plugin = await ApplianceSinglePlugin.getInstance(room, {
912
912
  });
913
913
  ```
914
914
 
915
- 不需要配置 `fullLayerDoingMask`。该旧字段仅保留兼容读取,无论传入 `true` 还是 `false`,当前实现都统一使用 FullLayer Doing Mask。`disableEraseImage` 不影响 Bitmap Eraser 对 Image 的直接擦除。
915
+ `fullLayerDoingMask` 已移除;旧调用方即使传入也会被忽略,所有 Bitmap Eraser 事务统一使用 FullLayer Doing Mask。`fullLayerDoingMaskMaxInputPoints` 默认 500,可由客户配置。`disableEraseImage` 不影响 Bitmap Eraser 对 Image 的直接擦除。
916
916
 
917
917
  ### 前端调试
918
918
 
package/README.md CHANGED
@@ -959,7 +959,11 @@ const plugin = await ApplianceSinglePlugin.getInstance(room, {
959
959
  });
960
960
  ```
961
961
 
962
- Do not configure `fullLayerDoingMask`. The legacy field is accepted only for compatibility; both `true` and `false` now use the single FullLayer Doing Mask path. `disableEraseImage` does not prevent the Bitmap Eraser from directly erasing Image appliances.
962
+ Do not configure `fullLayerDoingMask`; it has been removed and is ignored if supplied by a
963
+ legacy caller. All Bitmap Eraser transactions use the single FullLayer Doing Mask path.
964
+ `fullLayerDoingMaskMaxInputPoints` defaults to 500 and
965
+ can be configured per customer. `disableEraseImage` does not prevent the Bitmap Eraser from
966
+ directly erasing Image appliances.
963
967
 
964
968
  ### Front-end Debugging
965
969
  During the integration process, if you want to understand and track the internal status of the plugin, you can view internal data through the following console commands.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-DFo0Gmfx.js");exports.ActiveContainerType=e.ActiveContainerType;exports.ApplianceMultiPlugin=e.ApplianceMultiPlugin;exports.ApplianceNames=e.ApplianceNames;exports.AppliancePluginCursorNames=e.AppliancePluginCursorNames;exports.ApplianceSigleWrapper=e.ApplianceSigleWrapper;exports.ApplianceSinglePlugin=e.ApplianceSinglePlugin;exports.Camera_Ack_Slow_Timeout=e.Camera_Ack_Slow_Timeout;exports.Camera_Transport_Fallback_Timeout=e.Camera_Transport_Fallback_Timeout;exports.Camera_Update_Business_Timeout=e.Camera_Update_Business_Timeout;exports.Cursor_Hover_Id=e.Cursor_Hover_Id;exports.ECanvasShowType=e.ECanvasShowType;exports.EDataType=e.EDataType;exports.EForceStopReason=e.EForceStopReason;exports.EImageType=e.EImageType;exports.EMatrixrRelationType=e.EMatrixrRelationType;exports.EOperationType=e.EOperationType;exports.EPostMessageType=e.EPostMessageType;exports.ERenderFilterType=e.ERenderFilterType;exports.ESVGType=e.ESVGType;exports.EScaleType=e.EScaleType;exports.EStrokeType=e.EStrokeType;exports.EToolsKey=e.EToolsKey;exports.ElayerType=e.ElayerType;exports.EmitEventType=e.EmitEventType;exports.EventMessageType=e.EventMessageType;exports.EventWorkState=e.EventWorkState;exports.EvevtWorkState=e.EventWorkState;exports.FontFaceFallbackBlacklistLevel=e.FontFaceFallbackBlacklistLevel;exports.InternalMsgEmitterType=e.InternalMsgEmitterType;exports.Main_View_Id=e.Main_View_Id;exports.Plugin=e.Plugin;exports.Renderer_Business_Default_Timeout=e.Renderer_Business_Default_Timeout;exports.ShapeType=e.ShapeType;exports.Task_Time_Interval=e.Task_Time_Interval;exports.WorkerCanvasContextBlacklistLevel=e.WorkerCanvasContextBlacklistLevel;exports.WorkerMaskTextureFormatBlacklistLevel=e.WorkerMaskTextureFormatBlacklistLevel;exports.WorkerMaskTextureUploadBlacklistLevel=e.WorkerMaskTextureUploadBlacklistLevel;exports.WorkerRenderModeBlacklistLevel=e.WorkerRenderModeBlacklistLevel;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-Bgw8Yl5s.js");exports.ActiveContainerType=e.ActiveContainerType;exports.ApplianceMultiPlugin=e.ApplianceMultiPlugin;exports.ApplianceNames=e.ApplianceNames;exports.AppliancePluginCursorNames=e.AppliancePluginCursorNames;exports.ApplianceSigleWrapper=e.ApplianceSigleWrapper;exports.ApplianceSinglePlugin=e.ApplianceSinglePlugin;exports.Camera_Ack_Slow_Timeout=e.Camera_Ack_Slow_Timeout;exports.Camera_Transport_Fallback_Timeout=e.Camera_Transport_Fallback_Timeout;exports.Camera_Update_Business_Timeout=e.Camera_Update_Business_Timeout;exports.Cursor_Hover_Id=e.Cursor_Hover_Id;exports.ECanvasShowType=e.ECanvasShowType;exports.EDataType=e.EDataType;exports.EForceStopReason=e.EForceStopReason;exports.EImageType=e.EImageType;exports.EMatrixrRelationType=e.EMatrixrRelationType;exports.EOperationType=e.EOperationType;exports.EPostMessageType=e.EPostMessageType;exports.ERenderFilterType=e.ERenderFilterType;exports.ESVGType=e.ESVGType;exports.EScaleType=e.EScaleType;exports.EStrokeType=e.EStrokeType;exports.EToolsKey=e.EToolsKey;exports.ElayerType=e.ElayerType;exports.EmitEventType=e.EmitEventType;exports.EventMessageType=e.EventMessageType;exports.EventWorkState=e.EventWorkState;exports.EvevtWorkState=e.EventWorkState;exports.FontFaceFallbackBlacklistLevel=e.FontFaceFallbackBlacklistLevel;exports.InternalMsgEmitterType=e.InternalMsgEmitterType;exports.Main_View_Id=e.Main_View_Id;exports.Plugin=e.Plugin;exports.Renderer_Business_Default_Timeout=e.Renderer_Business_Default_Timeout;exports.ShapeType=e.ShapeType;exports.Task_Time_Interval=e.Task_Time_Interval;exports.WorkerCanvasContextBlacklistLevel=e.WorkerCanvasContextBlacklistLevel;exports.WorkerMaskTextureFormatBlacklistLevel=e.WorkerMaskTextureFormatBlacklistLevel;exports.WorkerMaskTextureUploadBlacklistLevel=e.WorkerMaskTextureUploadBlacklistLevel;exports.WorkerRenderModeBlacklistLevel=e.WorkerRenderModeBlacklistLevel;
@@ -1,4 +1,4 @@
1
- import { Y as s, Z as t, _ as r, $ as l, a0 as i, a1 as p, a2 as o, a3 as n, a4 as T, C as E, s as c, b as k, a5 as y, H as _, K as u, a6 as m, a as v, a7 as g, d as S, a8 as d, a9 as C, c as M, aa as A, E as B, ab as F, e as W, e as x, ac as I, ad as L, y as P, ae as R, af as b, ag as f, T as h, ah as w, ai as D, aj as H, ak as K } from "./index-NG5kKK1W.mjs";
1
+ import { Y as s, Z as t, _ as r, $ as l, a0 as i, a1 as p, a2 as o, a3 as n, a4 as T, C as E, s as c, b as k, a5 as y, H as _, K as u, a6 as m, a as v, a7 as g, d as S, a8 as d, a9 as C, c as M, aa as A, E as B, ab as F, e as W, e as x, ac as I, ad as L, y as P, ae as R, af as b, ag as f, T as h, ah as w, ai as D, aj as H, ak as K } from "./index-DkMJ7xR-.mjs";
2
2
  export {
3
3
  s as ActiveContainerType,
4
4
  t as ApplianceMultiPlugin,
@@ -54,7 +54,7 @@ class g {
54
54
  }
55
55
  }
56
56
  async function d(i) {
57
- return c(i), import("./index-B_vZ9d3x.mjs").then((t) => t.Z);
57
+ return c(i), import("./index-BARnlEAY.mjs").then((t) => t.Z);
58
58
  }
59
59
  export {
60
60
  g as P,
@@ -1 +1 @@
1
- "use strict";var l=Object.defineProperty;var o=(i,e,t)=>e in i?l(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var n=(i,e,t)=>o(i,typeof e!="symbol"?e+"":e,t);let r;function c(i){r=i}function u(){if(!r)throw new Error("[@netless/appliance-plugin/bridge] white-web-sdk runtime has not been bound yet.");return r}class h{constructor(){n(this,"control");n(this,"_listeners",{})}_inject(e){this.control=e}_onEvent(e,t){this._listeners[e]&&this._listeners[e](...t)}callbacks(e,t){this._listeners[e]=t}removeCallback(e){delete this._listeners[e]}}class g{constructor(e){n(this,"control");n(this,"worker");n(this,"publicMsgEmitter");n(this,"plugins",new Map);const{control:t,publicMsgEmitter:s}=e;this.control=t,this.publicMsgEmitter=s,this.worker=t.worker}use(e){this.plugins.set(e.kind,e),e._inject(this.control),e.onCreate()}destroy(){this.plugins.forEach(e=>{this.plugins.delete(e.kind),e.onDestroy()})}dispatchPluginEvent(e,...t){this.plugins.forEach(s=>{s._onEvent(e,t)})}}async function a(i){return c(i),Promise.resolve().then(()=>require("./index-C2AHqjj8.js")).then(e=>e.index)}exports.Plugin=h;exports.PluginManager=g;exports.getWhiteWebSdkBridgeRuntime=u;exports.loadAppliancePluginBridge=a;
1
+ "use strict";var l=Object.defineProperty;var o=(i,e,t)=>e in i?l(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var n=(i,e,t)=>o(i,typeof e!="symbol"?e+"":e,t);let r;function c(i){r=i}function u(){if(!r)throw new Error("[@netless/appliance-plugin/bridge] white-web-sdk runtime has not been bound yet.");return r}class h{constructor(){n(this,"control");n(this,"_listeners",{})}_inject(e){this.control=e}_onEvent(e,t){this._listeners[e]&&this._listeners[e](...t)}callbacks(e,t){this._listeners[e]=t}removeCallback(e){delete this._listeners[e]}}class g{constructor(e){n(this,"control");n(this,"worker");n(this,"publicMsgEmitter");n(this,"plugins",new Map);const{control:t,publicMsgEmitter:s}=e;this.control=t,this.publicMsgEmitter=s,this.worker=t.worker}use(e){this.plugins.set(e.kind,e),e._inject(this.control),e.onCreate()}destroy(){this.plugins.forEach(e=>{this.plugins.delete(e.kind),e.onDestroy()})}dispatchPluginEvent(e,...t){this.plugins.forEach(s=>{s._onEvent(e,t)})}}async function a(i){return c(i),Promise.resolve().then(()=>require("./index-B6nsfvHS.js")).then(e=>e.index)}exports.Plugin=h;exports.PluginManager=g;exports.getWhiteWebSdkBridgeRuntime=u;exports.loadAppliancePluginBridge=a;
package/dist/bridge.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./bridge-D68E09T9.js");exports.Plugin=e.Plugin;exports.loadAppliancePluginBridge=e.loadAppliancePluginBridge;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./bridge-iTPNL78o.js");exports.Plugin=e.Plugin;exports.loadAppliancePluginBridge=e.loadAppliancePluginBridge;
package/dist/bridge.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as i, l as e } from "./bridge-DcVN05tP.mjs";
1
+ import { a as i, l as e } from "./bridge-DzcPAEgn.mjs";
2
2
  export {
3
3
  i as Plugin,
4
4
  e as loadAppliancePluginBridge
@@ -144,7 +144,9 @@ export declare enum EPostMessageType {
144
144
  /** 初始化 service snapshot 已完成 renderer 提交 */
145
145
  ServiceSyncCommit = 39,
146
146
  /** 取消尚未完成的字体加载请求,仅用于内部 Worker 协议 */
147
- CancelFontFace = 40
147
+ CancelFontFace = 40,
148
+ /** 中断尚未完成的 Bitmap Eraser 事务,仅用于内部 Worker 协议 */
149
+ CancelBitmapEraser = 41
148
150
  }
149
151
  export type ECanvasContextType = "webgl2" | "webgl" | "2d";
150
152
  export declare enum ECanvasShowType {
@@ -179,7 +179,6 @@ export declare class MasterControlForWorker extends MasterController {
179
179
  viewId: string;
180
180
  toolsType?: EToolsKey;
181
181
  opt?: BaseShapeOptions & {
182
- fullLayerDoingMask?: boolean;
183
182
  fullLayerDoingMaskMaxInputPoints?: number;
184
183
  };
185
184
  undoTickerId?: number;
@@ -430,7 +429,6 @@ export declare class MasterControlForWorker extends MasterController {
430
429
  viewId: string;
431
430
  toolsType?: EToolsKey;
432
431
  opt?: BaseShapeOptions & {
433
- fullLayerDoingMask?: boolean;
434
432
  fullLayerDoingMaskMaxInputPoints?: number;
435
433
  };
436
434
  undoTickerId?: number;
@@ -590,6 +588,14 @@ export declare class MasterControlForWorker extends MasterController {
590
588
  checkDrawingWork(vId: string): Promise<number[]>;
591
589
  cancelLocalWorks(viewId: string, syncStorage?: boolean, onlyWorkIds?: ReadonlySet<string>): void;
592
590
  timeoutLocalWorks(viewId: string, scenePath: string, reason: string, onlyWorkIds?: ReadonlySet<string>, error?: unknown): void;
591
+ /**
592
+ * Bitmap Done mutates the worker VNode/display tree before its Collector
593
+ * apply marker arrives. On a commit deadline, replay the captured
594
+ * before-images to both renderer and storage, then let the normal cancel
595
+ * path close the dynamic Undo scope. Compensation messages deliberately do
596
+ * not carry eraseTxnId, so the late Done tombstone cannot discard recovery.
597
+ */
598
+ private rollbackBitmapEraserTxn;
593
599
  private logLocalWorkBarrierError;
594
600
  removeDrawingWork(vId: string): void;
595
601
  removeNodes(viewId: string, removeIds: string[]): void;
@@ -1,4 +1,4 @@
1
- import { IActiveToolsDataType, IWorkerMessage, IMainMessage, IUpdateSelectorPropsType, IBatchMainMessage } from "../types";
1
+ import { IActiveToolsDataType, IWorkerMessage, IMainMessage, IUpdateSelectorPropsType, IBatchMainMessage, BaseNodeMapItem } from "../types";
2
2
  import type { BaseShapeTool, BaseShapeOptions, SelectorShape, ImageShape, ShapeToolsClass } from "../tools";
3
3
  import { MainThreadEngineImpl, ISubThreadInitOption } from "./base";
4
4
  import { VNodeManager } from "../vNodeManager";
@@ -16,6 +16,8 @@ export interface SubLocalThread {
16
16
  destroy(): void;
17
17
  clearAll(): void;
18
18
  clearWorkShapeNodeCache(workId: string): void;
19
+ abortBitmapEraser(workId: string): void;
20
+ publishBitmapEraserBeforeImages(workId: string, beforeImages: Map<string, BaseNodeMapItem>): void;
19
21
  setToolsOpt(opt: IActiveToolsDataType): void;
20
22
  getToolsOpt(): IActiveToolsDataType | undefined;
21
23
  createWorkShapeNode(opt: IActiveToolsDataType & {
@@ -109,6 +111,9 @@ export declare class SubLocalMainThreadImpl implements SubLocalThread {
109
111
  reRenderSelector(willSyncService?: boolean): Promise<void> | undefined;
110
112
  blurSelector(data?: IWorkerMessage): Promise<void>;
111
113
  clearWorkShapeNodeCache(workId: string): void;
114
+ /** Stop queued Bitmap Eraser work and restore Doing-time hidden nodes. */
115
+ abortBitmapEraser(workId: string): void;
116
+ publishBitmapEraserBeforeImages(workId: string, beforeImages: Map<string, BaseNodeMapItem>): void;
112
117
  private drawBitMapEraserFull;
113
118
  private drawPencilEraserFull;
114
119
  private drawEraser;
@@ -13,8 +13,6 @@ export interface SerializerEraserItem {
13
13
  export type SerializerEraserLines = Array<SerializerEraserItem>;
14
14
  export interface BitMapEraserOptions extends BaseShapeOptions {
15
15
  thickness: number;
16
- /** @deprecated Bitmap Eraser now always uses the FullLayer Doing mask. */
17
- fullLayerDoingMask?: boolean;
18
16
  maxImageWidth?: number;
19
17
  maxImageHeight?: number;
20
18
  removeOnDone?: boolean;
@@ -44,6 +42,8 @@ export declare class BitMapEraserShape extends BaseShapeTool {
44
42
  private readonly hiddenRenderNodes;
45
43
  private fullLayerPreviewGroup?;
46
44
  private disposeVNodeObserver?;
45
+ /** Transaction-scoped before-images survive until the Done ACK is applied. */
46
+ private readonly beforeImages;
47
47
  constructor(props: BaseShapeToolProps);
48
48
  /** Consume exactly one accepted input batch and publish one FullLayer preview. */
49
49
  combineConsume(_props: {
@@ -72,6 +72,7 @@ export declare class BitMapEraserShape extends BaseShapeTool {
72
72
  type: EPostMessageType;
73
73
  } | {
74
74
  rect: IRectType | undefined;
75
+ eraseTxnBeforeImages: Map<string, BaseNodeMapItem>;
75
76
  eraseTxnCommitStatus: "applied";
76
77
  workId: string;
77
78
  toolsType: EToolsKey;
@@ -84,6 +85,7 @@ export declare class BitMapEraserShape extends BaseShapeTool {
84
85
  ops: string;
85
86
  willUpdateNodes: Map<string, BaseNodeMapItem>;
86
87
  willDeleteNodes: Set<string>;
88
+ eraseTxnBeforeImages: Map<string, BaseNodeMapItem>;
87
89
  eraseTxnCommitStatus: "applied";
88
90
  workId: string;
89
91
  toolsType: EToolsKey;
@@ -92,6 +94,7 @@ export declare class BitMapEraserShape extends BaseShapeTool {
92
94
  rect: IRectType | undefined;
93
95
  willUpdateNodes: Map<string, BaseNodeMapItem>;
94
96
  willDeleteNodes: Set<string>;
97
+ eraseTxnBeforeImages: Map<string, BaseNodeMapItem>;
95
98
  eraseTxnRecoveryRequired: boolean;
96
99
  eraseTxnCommitStatus: "failed";
97
100
  workId: string;
@@ -120,6 +123,7 @@ export declare class BitMapEraserShape extends BaseShapeTool {
120
123
  private hideRenderNodesForId;
121
124
  private restoreNoLongerClearablePendingDeletes;
122
125
  private snapshotDoneCandidates;
126
+ private captureBeforeImage;
123
127
  private collectDoneVectorChanges;
124
128
  private normalizeClippedLine;
125
129
  private commitDoingFaces;
@@ -252,6 +252,8 @@ export interface IMainMessage extends INormalPushMsg {
252
252
  eraseTxnPhase?: "applied" | "failed";
253
253
  /** Internal Done result used to choose the terminal transaction marker. */
254
254
  eraseTxnCommitStatus?: "applied" | "failed";
255
+ /** Bitmap Eraser transaction before-images used for timeout compensation. */
256
+ eraseTxnBeforeImages?: Map<string, BaseNodeMapItem>;
255
257
  /** Internal renderer request business used to settle Snapshot waiters. */
256
258
  reportBusiness?: "snapshot" | "bounding-box";
257
259
  /** Structured renderer failure stage for request-scoped diagnostics. */
@@ -1,4 +1,4 @@
1
- import { IWorkerMessage, IMainMessage, IRectType, EToolsKey, IBatchMainMessage, EventWorkState, IUpdateSelectorPropsType } from "..";
1
+ import { IWorkerMessage, IMainMessage, IRectType, EToolsKey, IBatchMainMessage, EventWorkState, IUpdateSelectorPropsType, BaseNodeMapItem } from "..";
2
2
  import { BaseShapeOptions, SelectorShape } from "../tools";
3
3
  import { ISubWorkerInitOption, LocalWork } from "./base";
4
4
  import { ServiceWorkForFullWorker } from "./fullWorkerService";
@@ -15,6 +15,9 @@ export declare class LocalWorkForFullWorker extends LocalWork {
15
15
  private disposeVNodeRevisionObserver?;
16
16
  private bitmapEraserRenderQueue;
17
17
  private bitmapEraserRevalidationQueued;
18
+ /** Stop queued Bitmap Eraser work and restore Doing-time hidden nodes. */
19
+ abortBitmapEraser(workId: string): void;
20
+ publishBitmapEraserBeforeImages(workId: string, beforeImages: Map<string, BaseNodeMapItem>): void;
18
21
  protected drawWorkActiveId?: string;
19
22
  protected effectSelectNodeData: Set<IWorkerMessage>;
20
23
  constructor(opt: ISubWorkerInitOption);