kernel-checkpoint 0.1.2__tar.gz → 0.1.4__tar.gz

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 (52) hide show
  1. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/PKG-INFO +1 -1
  2. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/jupyter-notebook-image/Dockerfile +1 -1
  3. kernel_checkpoint-0.1.4/kernel_checkpoint/__init__.py +94 -0
  4. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/kernel_checkpoint/_version.py +1 -1
  5. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/kernel_checkpoint/handlers.py +3 -3
  6. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/kernel_checkpoint/labextension/build_log.json +1 -1
  7. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/kernel_checkpoint/labextension/package.json +2 -2
  8. kernel_checkpoint-0.1.2/kernel_checkpoint/labextension/static/lib_index_js.2c713e3ab2e5b31ee0e1.js → kernel_checkpoint-0.1.4/kernel_checkpoint/labextension/static/lib_index_js.bcb2d92b281a36765a67.js +12 -6
  9. kernel_checkpoint-0.1.4/kernel_checkpoint/labextension/static/lib_index_js.bcb2d92b281a36765a67.js.map +1 -0
  10. kernel_checkpoint-0.1.2/kernel_checkpoint/labextension/static/remoteEntry.0ec66dead21656df694e.js → kernel_checkpoint-0.1.4/kernel_checkpoint/labextension/static/remoteEntry.ff55aa1cac6b05f762e9.js +3 -3
  11. kernel_checkpoint-0.1.2/kernel_checkpoint/labextension/static/remoteEntry.0ec66dead21656df694e.js.map → kernel_checkpoint-0.1.4/kernel_checkpoint/labextension/static/remoteEntry.ff55aa1cac6b05f762e9.js.map +1 -1
  12. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/package.json +1 -1
  13. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/src/checkpoint-panel.tsx +6 -1
  14. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/src/index.ts +3 -2
  15. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/src/types.ts +1 -1
  16. kernel_checkpoint-0.1.2/kernel_checkpoint/__init__.py +0 -23
  17. kernel_checkpoint-0.1.2/kernel_checkpoint/labextension/static/lib_index_js.2c713e3ab2e5b31ee0e1.js.map +0 -1
  18. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/.copier-answers.yml +0 -0
  19. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/.gitignore +0 -0
  20. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/.prettierignore +0 -0
  21. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/.yarnrc.yml +0 -0
  22. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/4 +0 -0
  23. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/=4 +0 -0
  24. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/CHANGELOG.md +0 -0
  25. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/LICENSE +0 -0
  26. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/README.md +0 -0
  27. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/RELEASE.md +0 -0
  28. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/babel.config.js +0 -0
  29. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/cursor_jupyterlab_extension_for_checkpo.md +0 -0
  30. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/install.json +0 -0
  31. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/jest.config.js +0 -0
  32. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/jupyter-config/jupyter_server_config.d/kernel_checkpoint.json +0 -0
  33. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/kernel_checkpoint/Untitled.ipynb +0 -0
  34. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/kernel_checkpoint/labextension/static/style.js +0 -0
  35. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/kernel_checkpoint/labextension/static/style_index_js.c3e72438ed03e9dee0fc.js +0 -0
  36. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/kernel_checkpoint/labextension/static/style_index_js.c3e72438ed03e9dee0fc.js.map +0 -0
  37. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/pyproject.toml +0 -0
  38. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/setup.py +0 -0
  39. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/src/__tests__/kernel_checkpoint.spec.ts +0 -0
  40. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/src/api.ts +0 -0
  41. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/style/base.css +0 -0
  42. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/style/index.css +0 -0
  43. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/style/index.js +0 -0
  44. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/tsconfig.json +0 -0
  45. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/tsconfig.test.json +0 -0
  46. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/ui-tests/README.md +0 -0
  47. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/ui-tests/jupyter_server_test_config.py +0 -0
  48. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/ui-tests/package.json +0 -0
  49. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/ui-tests/playwright.config.js +0 -0
  50. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/ui-tests/tests/kernel_checkpoint.spec.ts +0 -0
  51. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/ui-tests/yarn.lock +0 -0
  52. {kernel_checkpoint-0.1.2 → kernel_checkpoint-0.1.4}/yarn.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kernel_checkpoint
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: An extension for saving and restoring kernel pod state with jupyter enterprise gateway
5
5
  Project-URL: Homepage, https://github.com/lehuannhatrang/kernel-checkpoint-extension.git
6
6
  Project-URL: Bug Tracker, https://github.com/lehuannhatrang/kernel-checkpoint-extension.git/issues
@@ -4,6 +4,6 @@ USER root
4
4
 
5
5
  RUN pip install --upgrade pip
6
6
 
7
- RUN pip install --no-cache-dir kernel-checkpoint
7
+ RUN pip install --no-cache-dir kernel-checkpoint==0.1.3
8
8
 
9
9
  USER jovyan
@@ -0,0 +1,94 @@
1
+ try:
2
+ from ._version import __version__
3
+ except ImportError:
4
+ import warnings
5
+ warnings.warn("Importing 'kernel_checkpoint' outside a proper installation.")
6
+ __version__ = "dev"
7
+
8
+
9
+ def _jupyter_labextension_paths():
10
+ return [{
11
+ "src": "labextension",
12
+ "dest": "kernel-checkpoint"
13
+ }]
14
+
15
+
16
+ def _jupyter_server_extension_points():
17
+ return [{"module": "kernel_checkpoint"}]
18
+
19
+
20
+ def _load_jupyter_server_extension(server_app):
21
+ from .handlers import setup_handlers
22
+ setup_handlers(server_app.web_app)
23
+ _patch_kernel_handler_for_env_passthrough(server_app)
24
+ server_app.log.info("kernel_checkpoint server extension loaded")
25
+
26
+
27
+ def _patch_kernel_handler_for_env_passthrough(server_app):
28
+ """
29
+ Monkey-patch ``MainKernelHandler.post`` so that an ``env`` dict in the
30
+ request body is forwarded to ``KernelManager.start_kernel``.
31
+
32
+ The stock Jupyter Server handler silently drops ``env`` from the POST
33
+ payload. Enterprise Gateway (and other provisioners) need it to receive
34
+ ``KERNEL_CHECKPOINT_NAME`` during a checkpoint-restore flow.
35
+
36
+ Requests that do **not** carry ``env`` are delegated to the original,
37
+ unmodified handler so every other kernel-start path stays untouched.
38
+ """
39
+ from jupyter_server.services.kernels.handlers import MainKernelHandler
40
+ from jupyter_server.utils import url_path_join
41
+ from jupyter_core.utils import ensure_async
42
+ from tornado import web
43
+
44
+ original_post = MainKernelHandler.post
45
+
46
+ async def _patched_post(self):
47
+ model = self.get_json_body()
48
+
49
+ if not model or "env" not in model:
50
+ return await original_post(self)
51
+
52
+ km = self.kernel_manager
53
+ model.setdefault("name", km.default_kernel_name)
54
+
55
+ env = model["env"]
56
+ self.log.info(
57
+ "kernel_checkpoint: starting kernel with env keys: %s",
58
+ list(env.keys()),
59
+ )
60
+
61
+ try:
62
+ kernel_id = await ensure_async(
63
+ km.start_kernel(
64
+ path=model.get("path"),
65
+ kernel_name=model["name"],
66
+ env=env,
67
+ )
68
+ )
69
+ result = await ensure_async(km.kernel_model(kernel_id))
70
+ location = url_path_join(
71
+ self.base_url, "api", "kernels", str(kernel_id)
72
+ )
73
+ self.set_header("Location", location)
74
+ self.set_status(201)
75
+ self.finish(result)
76
+ except Exception as e:
77
+ self.log.error(
78
+ "kernel_checkpoint: env-passthrough kernel start failed: %s", e
79
+ )
80
+ raise web.HTTPError(500, str(e))
81
+
82
+ MainKernelHandler.post = _patched_post
83
+
84
+ try:
85
+ server_app.config.GatewayClient.client_envs = [
86
+ "KERNEL_CHECKPOINT_NAME",
87
+ "KERNEL_CHECKPOINT_FILE_PATH",
88
+ ]
89
+ except Exception:
90
+ pass
91
+
92
+ server_app.log.info(
93
+ "kernel_checkpoint: patched MainKernelHandler.post for env passthrough"
94
+ )
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '0.1.2'
4
+ __version__ = VERSION = '0.1.4'
@@ -75,7 +75,7 @@ class CheckpointListCreateHandler(APIHandler):
75
75
 
76
76
 
77
77
  class CheckpointDetailHandler(APIHandler):
78
- """Handles get / delete / patch for a single checkpoint."""
78
+ """Handles get / delete / put for a single checkpoint."""
79
79
 
80
80
  @web.authenticated
81
81
  async def get(self, namespace, name):
@@ -113,7 +113,7 @@ class CheckpointDetailHandler(APIHandler):
113
113
  raise web.HTTPError(502, f"Failed to reach checkpoint API: {e}")
114
114
 
115
115
  @web.authenticated
116
- async def patch(self, namespace, name):
116
+ async def put(self, namespace, name):
117
117
  api_url = _get_api_url()
118
118
  if not api_url:
119
119
  raise web.HTTPError(500, "CHECKPOINT_API_URL not configured")
@@ -123,7 +123,7 @@ class CheckpointDetailHandler(APIHandler):
123
123
  url = f"{api_url}/api/v1/checkpoints/{namespace}/{name}"
124
124
  req = httpclient.HTTPRequest(
125
125
  url=url,
126
- method="PATCH",
126
+ method="PUT",
127
127
  headers={"Content-Type": "application/json"},
128
128
  body=json.dumps(body),
129
129
  )
@@ -700,7 +700,7 @@
700
700
  "singleton": true
701
701
  },
702
702
  "kernel-checkpoint": {
703
- "version": "0.1.1",
703
+ "version": "0.1.2",
704
704
  "singleton": true,
705
705
  "import": "/home/ubuntu/projects/kernel-checkpoint-extension/lib/index.js"
706
706
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kernel-checkpoint",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "An extension for saving and restoring kernel pod state with jupyter enterprise gateway",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -114,7 +114,7 @@
114
114
  },
115
115
  "outputDir": "kernel_checkpoint/labextension",
116
116
  "_build": {
117
- "load": "static/remoteEntry.0ec66dead21656df694e.js",
117
+ "load": "static/remoteEntry.ff55aa1cac6b05f762e9.js",
118
118
  "extension": "./extension",
119
119
  "style": "./style"
120
120
  }
@@ -231,12 +231,17 @@ function CheckpointPanel(props) {
231
231
  }
232
232
  };
233
233
  const handleRestore = async (checkpointName) => {
234
- var _a;
234
+ var _a, _b, _c, _d;
235
235
  setConfirmRestore(null);
236
236
  setRestoring(checkpointName);
237
237
  setFlash(null);
238
238
  try {
239
- await onRestore(checkpointName);
239
+ const detail = await _api__WEBPACK_IMPORTED_MODULE_1__.CheckpointAPI.getCheckpoint(namespace, checkpointName);
240
+ const filePath = (_c = (_b = (_a = detail.checkpointFiles) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.filePath) !== null && _c !== void 0 ? _c : '';
241
+ if (!filePath) {
242
+ throw new Error('No checkpoint file path available for this checkpoint');
243
+ }
244
+ await onRestore(checkpointName, filePath);
240
245
  setFlash({
241
246
  type: 'success',
242
247
  text: `Kernel restored from "${checkpointName}". The kernel is restarting.`
@@ -245,7 +250,7 @@ function CheckpointPanel(props) {
245
250
  catch (err) {
246
251
  setFlash({
247
252
  type: 'error',
248
- text: (_a = err.message) !== null && _a !== void 0 ? _a : 'Failed to restore checkpoint'
253
+ text: (_d = err.message) !== null && _d !== void 0 ? _d : 'Failed to restore checkpoint'
249
254
  });
250
255
  }
251
256
  finally {
@@ -446,7 +451,7 @@ const plugin = {
446
451
  }
447
452
  const kernelId = kernel.id;
448
453
  const kernelSpecName = kernel.name || 'python_kubernetes';
449
- const onRestore = async (checkpointName) => {
454
+ const onRestore = async (checkpointName, checkpointFilePath) => {
450
455
  const settings = _jupyterlab_services__WEBPACK_IMPORTED_MODULE_3__.ServerConnection.makeSettings();
451
456
  const kernelUrl = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__.URLExt.join(settings.baseUrl, 'api', 'kernels');
452
457
  const response = await _jupyterlab_services__WEBPACK_IMPORTED_MODULE_3__.ServerConnection.makeRequest(kernelUrl, {
@@ -455,7 +460,8 @@ const plugin = {
455
460
  body: JSON.stringify({
456
461
  name: kernelSpecName,
457
462
  env: {
458
- KERNEL_CHECKPOINT_NAME: checkpointName
463
+ KERNEL_CHECKPOINT_NAME: checkpointName,
464
+ KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath
459
465
  }
460
466
  })
461
467
  }, settings);
@@ -499,4 +505,4 @@ const plugin = {
499
505
  /***/ }
500
506
 
501
507
  }]);
502
- //# sourceMappingURL=lib_index_js.2c713e3ab2e5b31ee0e1.js.map
508
+ //# sourceMappingURL=lib_index_js.bcb2d92b281a36765a67.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib_index_js.bcb2d92b281a36765a67.js","mappings":";;;;;;;;;;;;;;;;;AAA+C;AACS;AAQxD,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAE1C,SAAS,WAAW,CAClB,QAAgB,EAChB,OAAoB,EAAE;IAEtB,MAAM,QAAQ,GAAG,kEAAgB,CAAC,YAAY,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,yDAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IACnE,OAAO,kEAAgB,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAS;IACzC,OAAO;QACL,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAI,QAAkB;IACjD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;QAAC,WAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAEM,IAAU,aAAa,CAkE7B;AAlED,WAAiB,aAAa;IACrB,KAAK,UAAU,SAAS;QAC7B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,cAAc,CAAoB,IAAI,CAAC,CAAC;IACjD,CAAC;IAHqB,uBAAS,YAG9B;IAEM,KAAK,UAAU,eAAe,CACnC,SAAiB;QAEjB,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,yBAAyB,kBAAkB,CAAC,SAAS,CAAC,EAAE,CACzD,CAAC;QACF,OAAO,cAAc,CAA0B,IAAI,CAAC,CAAC;IACvD,CAAC;IAPqB,6BAAe,kBAOpC;IAEM,KAAK,UAAU,aAAa,CACjC,SAAiB,EACjB,IAAY;QAEZ,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,eAAe,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAC3E,CAAC;QACF,OAAO,cAAc,CAAc,IAAI,CAAC,CAAC;IAC3C,CAAC;IARqB,2BAAa,gBAQlC;IAEM,KAAK,UAAU,gBAAgB,CACpC,OAAiC;QAEjC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,aAAa,EACb,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAC1B,CAAC;QACF,OAAO,cAAc,CAAc,IAAI,CAAC,CAAC;IAC3C,CAAC;IARqB,8BAAgB,mBAQrC;IAEM,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,IAAY;QAEZ,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,eAAe,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC1E,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9D,CAAC;YAAC,WAAM,CAAC;gBACP,iBAAiB;YACnB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAlBqB,8BAAgB,mBAkBrC;IAEM,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,IAAY,EACZ,IAAyB;QAEzB,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,eAAe,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC1E,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CACtB,CAAC;QACF,OAAO,cAAc,CAAc,IAAI,CAAC,CAAC;IAC3C,CAAC;IAVqB,8BAAgB,mBAUrC;AACH,CAAC,EAlEgB,aAAa,KAAb,aAAa,QAkE7B;;;;;;;;;;;;;;;;;;AC5G+D;AAE1B;AAEtC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,KAAK,EAAqB;IAClD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,qEAAM,SAAS,EAAE,qBAAqB,GAAG,EAAE,IAAG,OAAO,CAAQ,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;AACxC,CAAC;AAEM,SAAS,eAAe,CAAC,KAA4B;IAC1D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAEjD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,+CAAQ,CAAgB,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,+CAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,+CAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,+CAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,+CAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,+CAAQ,CAAqB,IAAI,CAAC,CAAC;IAEvE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,+CAAQ,CAAC,EAAE,CAAC,CAAC;IAEnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,+CAAQ,CAGxB,IAAI,CAAC,CAAC;IAEhB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IAE1E,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IAExE,MAAM,gBAAgB,GAAG,kDAAW,CAAC,KAAK,IAAI,EAAE;;QAC9C,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,+CAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC9D,cAAc,CAAC,YAAM,CAAC,KAAK,mCAAI,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC,SAAG,CAAC,OAAO,mCAAI,4BAA4B,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,gDAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,EAAE,CAAC;IACrB,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,gDAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,gBAAgB,EAAE,2BAA2B,GAAG,IAAI,CAAC,CAAC;QAC7E,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IAExE,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,+CAAa,CAAC,gBAAgB,CAAC;gBACnC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;gBACpB,SAAS;gBACT,QAAQ;gBACR,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;YACH,UAAU,CAAC,EAAE,CAAC,CAAC;YACf,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,kCAAkC,EAAE,CAAC,CAAC;YACxE,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAG,CAAC,OAAO,mCAAI,6BAA6B;aACnD,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;;QAC1C,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,+CAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACtD,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,IAAI,YAAY,EAAE,CAAC,CAAC;YACrE,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;gBAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,aAAa,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YACD,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAG,CAAC,OAAO,mCAAI,6BAA6B;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;;QAC9C,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,+CAAa,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAClE,aAAa,CAAC,MAAM,CAAC,CAAC;YACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAG,CAAC,OAAO,mCAAI,kCAAkC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,EAAE,cAAsB,EAAE,EAAE;;QACrD,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,YAAY,CAAC,cAAc,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,+CAAa,CAAC,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,wBAAM,CAAC,eAAe,0CAAG,CAAC,CAAC,0CAAE,QAAQ,mCAAI,EAAE,CAAC;YAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,SAAS,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YAC1C,QAAQ,CAAC;gBACP,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,yBAAyB,cAAc,8BAA8B;aAC5E,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAG,CAAC,OAAO,mCAAI,8BAA8B;aACpD,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACpC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,+CAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE;gBACvD,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;YACH,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,0BAA0B,OAAO,IAAI,EAAE,CAAC,CAAC;YAC3E,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAG,CAAC,OAAO,mCAAI,6BAA6B;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IAExE,OAAO,CACL,oEAAK,SAAS,EAAC,UAAU;QAEtB,KAAK,IAAI,CACR,oEAAK,SAAS,EAAE,qBAAqB,KAAK,CAAC,IAAI,EAAE;YAC/C,yEAAO,KAAK,CAAC,IAAI,CAAQ;YACzB,uEACE,SAAS,EAAC,gBAAgB,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAGtB,CACL,CACP;QAGD,oEAAK,SAAS,EAAC,mBAAmB,IAC/B,CAAC,cAAc,CAAC,CAAC,CAAC,CACjB,uEACE,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,wBAG/B,CACV,CAAC,CAAC,CAAC,CACF,oEAAK,SAAS,EAAC,gBAAgB;YAC7B,sEACE,SAAS,EAAC,UAAU,EACpB,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,6BAAwB,EACpC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAE,CAAC,CAAC,EAAE;oBACb,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;wBACtB,YAAY,EAAE,CAAC;oBACjB,CAAC;gBACH,CAAC,EACD,SAAS,QACT,QAAQ,EAAE,QAAQ,GAClB;YACF,uEACE,SAAS,EAAC,uBAAuB,EACjC,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EACrC,OAAO,EAAE,YAAY,IAEpB,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CACvB;YACT,uEACE,SAAS,EAAC,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE;oBACZ,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBACzB,UAAU,CAAC,EAAE,CAAC,CAAC;gBACjB,CAAC,aAGM,CACL,CACP,CACG;QAGN,oEAAK,SAAS,EAAC,SAAS,IACrB,OAAO,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACrC,oEAAK,SAAS,EAAC,gBAAgB,gCAA2B,CAC3D,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACV,oEAAK,SAAS,EAAC,qCAAqC,IAAE,KAAK,CAAO,CACnE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC7B,oEAAK,SAAS,EAAC,gBAAgB,+EAGzB,CACP,CAAC,CAAC,CAAC,CACF,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CACpB,oEAAK,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAC,SAAS;YAEpC,oEAAK,SAAS,EAAC,gBAAgB;gBAC7B,oEAAK,SAAS,EAAC,cAAc;oBAC1B,YAAY,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAC1B,oEAAK,SAAS,EAAC,gBAAgB;wBAC7B,sEACE,SAAS,EAAC,sBAAsB,EAChC,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,SAAS,EAAE,CAAC,CAAC,EAAE;gCACb,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;oCACtB,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gCACxB,CAAC;gCACD,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;oCACvB,eAAe,CAAC,IAAI,CAAC,CAAC;gCACxB,CAAC;4BACH,CAAC,EACD,SAAS,SACT;wBACF,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,SAG7B;wBACT,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,aAG7B,CACL,CACP,CAAC,CAAC,CAAC,CACF,qEAAM,SAAS,EAAC,cAAc,EAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAC1C,EAAE,CAAC,IAAI,CACH,CACR;oBACD,oEAAK,SAAS,EAAC,cAAc;wBAC3B,2DAAC,cAAc,IAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAI;wBACnC,qEAAM,SAAS,EAAC,cAAc,IAC3B,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,CACpB,CACH,CACF;gBAEN,oEAAK,SAAS,EAAC,iBAAiB;oBAC9B,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,IAEvC,cAAc,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CACzC;oBACT,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE;4BACZ,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;4BACzB,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;wBAC1B,CAAC,aAGM;oBACR,aAAa,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAC3B;wBACE,qEAAM,SAAS,EAAC,kBAAkB,cAAe;wBACjD,uEACE,SAAS,EAAC,gCAAgC,EAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,UAG7B;wBACT,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAG9B,CACR,CACJ,CAAC,CAAC,CAAC,CACF,uEACE,SAAS,EAAC,gCAAgC,EAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,aAGjC,CACV;oBACA,cAAc,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5B;wBACE,qEAAM,SAAS,EAAC,kBAAkB,eAAgB;wBAClD,uEACE,SAAS,EAAC,iCAAiC,EAC3C,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,UAG9B;wBACT,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAG/B,CACR,CACJ,CAAC,CAAC,CAAC,CACF,uEACE,SAAS,EAAC,iCAAiC,EAC3C,QAAQ,EACN,SAAS,KAAK,IAAI,IAAI,EAAE,CAAC,KAAK,KAAK,WAAW,EAEhD,KAAK,EACH,EAAE,CAAC,KAAK,KAAK,WAAW;4BACtB,CAAC,CAAC,yCAAyC;4BAC3C,CAAC,CAAC,8BAA8B,EAEpC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,IAAI,CAAC,IAExC,SAAS,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAC1C,CACV,CACG,CACF;YAGL,cAAc,KAAK,EAAE,CAAC,IAAI,IAAI,UAAU,IAAI,CAC3C,oEAAK,SAAS,EAAC,WAAW;gBACxB,oEAAK,SAAS,EAAC,eAAe;oBAC5B,qEAAM,SAAS,EAAC,iBAAiB,aAAc;oBAC/C,yEAAO,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAQ,CAC5C;gBACN,oEAAK,SAAS,EAAC,eAAe;oBAC5B,qEAAM,SAAS,EAAC,iBAAiB,cAAe;oBAChD,yEAAO,UAAU,CAAC,OAAO,CAAQ,CAC7B;gBACL,UAAU,CAAC,MAAM,IAAI,CACpB,oEAAK,SAAS,EAAC,eAAe;oBAC5B,qEAAM,SAAS,EAAC,iBAAiB,UAAW;oBAC5C,yEAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAQ,CACjC,CACP;gBACA,UAAU,CAAC,eAAe;oBACzB,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,CACvC,oEAAK,SAAS,EAAC,mBAAmB;oBAChC,qEAAM,SAAS,EAAC,iBAAiB,uBAE1B;oBACN,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACxC,oEAAK,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,gBAAgB;wBACrC,yEAAO,CAAC,CAAC,aAAa,CAAQ;wBAC9B,qEAAM,SAAS,EAAC,gBAAgB,IAC7B,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CACxB,CACH,CACP,CAAC,CACE,CACP;gBACF,UAAU,CAAC,WAAW;oBACrB,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CACnC,oEAAK,SAAS,EAAC,mBAAmB;oBAChC,qEAAM,SAAS,EAAC,iBAAiB,mBAAoB;oBACpD,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACtC,oEAAK,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,gBAAgB;wBACrC,qEAAM,SAAS,EAAC,sBAAsB,IACnC,GAAG,CAAC,SAAS,CACT;wBACP,qEAAM,SAAS,EAAC,gBAAgB,IAC7B,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CACrB,CACH,CACP,CAAC,CACE,CACP,CACC,CACP,CACG,CACP,CAAC,CACH,CACG,CAEF,CACP,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxbsE;AAMzC;AACiB;AACS;AAC9B;AAE2B;AACf;AAGtC;;;GAGG;AACH,MAAM,oBAAqB,SAAQ,6DAAW;IAG5C,YAAY,KAA4B;QACtC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;IAES,MAAM;QACd,OAAO,0DAAmB,CAAC,8DAAe,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;CACF;AAED,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAE5C,MAAM,MAAM,GAAgC;IAC1C,EAAE,EAAE,0BAA0B;IAC9B,WAAW,EACT,wFAAwF;IAC1F,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,CAAC,kEAAgB,CAAC;IAC5B,QAAQ,EAAE,CAAC,GAAoB,EAAE,eAAiC,EAAE,EAAE;QACpE,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QAEpE,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE;YAClC,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,2BAA2B;YACpC,OAAO,EAAE,KAAK,IAAI,EAAE;;gBAClB,MAAM,KAAK,GAAG,eAAe,CAAC,aAAa,CAAC;gBAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;gBACT,CAAC;gBAED,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;gBAC5C,MAAM,cAAc,CAAC,KAAK,CAAC;gBAE3B,IAAI,MAAM,CAAC;gBACX,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,+CAAa,CAAC,SAAS,EAAE,CAAC;gBAC3C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,gEAAU,CAAC;wBACf,KAAK,EAAE,qBAAqB;wBAC5B,IAAI,EAAE,4EAA4E;wBAClF,OAAO,EAAE,CAAC,wDAAM,CAAC,QAAQ,EAAE,CAAC;qBAC7B,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;oBACtB,MAAM,gEAAU,CAAC;wBACf,KAAK,EAAE,qBAAqB;wBAC5B,IAAI,EAAE,kGAAkG;wBACxG,OAAO,EAAE,CAAC,wDAAM,CAAC,QAAQ,EAAE,CAAC;qBAC7B,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,oBAAc,CAAC,OAAO,0CAAE,MAAM,CAAC;gBAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,gEAAU,CAAC;wBACf,KAAK,EAAE,WAAW;wBAClB,IAAI,EAAE,sDAAsD;wBAC5D,OAAO,EAAE,CAAC,wDAAM,CAAC,QAAQ,EAAE,CAAC;qBAC7B,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;gBAC3B,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,IAAI,mBAAmB,CAAC;gBAE1D,MAAM,SAAS,GAAG,KAAK,EAAE,cAAsB,EAAE,kBAA0B,EAAiB,EAAE;oBAC5F,MAAM,QAAQ,GAAG,kEAAgB,CAAC,YAAY,EAAE,CAAC;oBACjD,MAAM,SAAS,GAAG,yDAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;oBAElE,MAAM,QAAQ,GAAG,MAAM,kEAAgB,CAAC,WAAW,CACjD,SAAS,EACT;wBACE,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;wBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,IAAI,EAAE,cAAc;4BACpB,GAAG,EAAE;gCACH,sBAAsB,EAAE,cAAc;gCACtC,2BAA2B,EAAE,kBAAkB;6BAChD;yBACF,CAAC;qBACH,EACD,QAAQ,CACT,CAAC;oBAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;wBACtC,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAC;oBAClE,CAAC;oBAED,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACzC,MAAM,cAAc,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3D,CAAC,CAAC;gBAEF,MAAM,IAAI,GAAG,IAAI,oBAAoB,CAAC;oBACpC,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,QAAQ;oBACR,cAAc;oBACd,SAAS;iBACV,CAAC,CAAC;gBAEH,MAAM,gEAAU,CAAC;oBACf,KAAK,EAAE,oBAAoB;oBAC3B,IAAI;oBACJ,OAAO,EAAE,CAAC,wDAAM,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;iBACnD,CAAC,CAAC;gBAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;SACF,CAAC,CAAC;QAEH,oDAAoD;QACpD,eAAe,CAAC,WAAW,CAAC,OAAO,CACjC,CAAC,OAAyB,EAAE,KAAoB,EAAE,EAAE;YAClD,MAAM,MAAM,GAAG,IAAI,+DAAa,CAAC;gBAC/B,KAAK,EAAE,eAAe;gBACtB,OAAO,EAAE,gCAAgC;gBACzC,OAAO,EAAE,GAAG,EAAE;oBACZ,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACnC,CAAC;aACF,CAAC,CAAC;YACH,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC,CACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,iEAAe,MAAM,EAAC","sources":["webpack://kernel-checkpoint/./src/api.ts","webpack://kernel-checkpoint/./src/checkpoint-panel.tsx","webpack://kernel-checkpoint/./src/index.ts"],"sourcesContent":["import { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport {\n ICheckpointConfig,\n ICheckpointListResponse,\n ICheckpoint,\n ICreateCheckpointRequest\n} from './types';\n\nconst API_NAMESPACE = 'kernel-checkpoint';\n\nfunction makeRequest(\n endpoint: string,\n init: RequestInit = {}\n): Promise<Response> {\n const settings = ServerConnection.makeSettings();\n const url = URLExt.join(settings.baseUrl, API_NAMESPACE, endpoint);\n return ServerConnection.makeRequest(url, init, settings);\n}\n\nfunction jsonInit(method: string, data: any): RequestInit {\n return {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n };\n}\n\nasync function handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = response.statusText;\n try {\n const body = await response.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n return response.json();\n}\n\nexport namespace CheckpointAPI {\n export async function getConfig(): Promise<ICheckpointConfig> {\n const resp = await makeRequest('config');\n return handleResponse<ICheckpointConfig>(resp);\n }\n\n export async function listCheckpoints(\n namespace: string\n ): Promise<ICheckpointListResponse> {\n const resp = await makeRequest(\n `checkpoints?namespace=${encodeURIComponent(namespace)}`\n );\n return handleResponse<ICheckpointListResponse>(resp);\n }\n\n export async function getCheckpoint(\n namespace: string,\n name: string\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function createCheckpoint(\n request: ICreateCheckpointRequest\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n 'checkpoints',\n jsonInit('POST', request)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function deleteCheckpoint(\n namespace: string,\n name: string\n ): Promise<void> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n { method: 'DELETE' }\n );\n if (!resp.ok) {\n let detail = resp.statusText;\n try {\n const body = await resp.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n }\n\n export async function updateCheckpoint(\n namespace: string,\n name: string,\n data: Record<string, any>\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n jsonInit('PUT', data)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { ICheckpoint, ICheckpointPanelProps } from './types';\nimport { CheckpointAPI } from './api';\n\nconst CHECKPOINT_REFRESH_INTERVAL = 3;\n\nfunction mapPhaseDisplay(phase: string): string {\n return phase === 'Completed' ? 'Ready' : 'Pending';\n}\n\nfunction PhaseIndicator({ phase }: { phase: string }): JSX.Element {\n const display = mapPhaseDisplay(phase);\n const cls = display.toLowerCase().replace(/\\s+/g, '-');\n return <span className={`kc-phase kc-phase-${cls}`}>{display}</span>;\n}\n\nfunction formatDate(iso: string): string {\n return new Date(iso).toLocaleString();\n}\n\nexport function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {\n const { namespace, kernelId, onRestore } = props;\n\n const [checkpoints, setCheckpoints] = useState<ICheckpoint[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const [showCreateForm, setShowCreateForm] = useState(false);\n const [newName, setNewName] = useState('');\n const [creating, setCreating] = useState(false);\n\n const [restoring, setRestoring] = useState<string | null>(null);\n const [expandedDetail, setExpandedDetail] = useState<string | null>(null);\n const [detailData, setDetailData] = useState<ICheckpoint | null>(null);\n\n const [renamingName, setRenamingName] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState('');\n\n const [flash, setFlash] = useState<{\n type: 'success' | 'error';\n text: string;\n } | null>(null);\n\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [confirmRestore, setConfirmRestore] = useState<string | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* Data fetching */\n /* ------------------------------------------------------------------ */\n\n const fetchCheckpoints = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await CheckpointAPI.listCheckpoints(namespace);\n setCheckpoints(result.items ?? []);\n } catch (err: any) {\n setError(err.message ?? 'Failed to load checkpoints');\n } finally {\n setLoading(false);\n }\n }, [namespace]);\n\n useEffect(() => {\n fetchCheckpoints();\n }, [fetchCheckpoints]);\n\n useEffect(() => {\n const id = setInterval(fetchCheckpoints, CHECKPOINT_REFRESH_INTERVAL * 1000);\n return () => clearInterval(id);\n }, [fetchCheckpoints]);\n\n /* ------------------------------------------------------------------ */\n /* Actions */\n /* ------------------------------------------------------------------ */\n\n const handleCreate = async () => {\n if (!newName.trim()) {\n return;\n }\n setCreating(true);\n setFlash(null);\n try {\n await CheckpointAPI.createCheckpoint({\n name: newName.trim(),\n namespace,\n kernelId,\n buildImage: false\n });\n setNewName('');\n setShowCreateForm(false);\n setFlash({ type: 'success', text: 'Checkpoint created successfully.' });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to create checkpoint'\n });\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (name: string) => {\n setFlash(null);\n setConfirmDelete(null);\n try {\n await CheckpointAPI.deleteCheckpoint(namespace, name);\n setFlash({ type: 'success', text: `Checkpoint \"${name}\" deleted.` });\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n }\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to delete checkpoint'\n });\n }\n };\n\n const handleViewStatus = async (name: string) => {\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n return;\n }\n try {\n const detail = await CheckpointAPI.getCheckpoint(namespace, name);\n setDetailData(detail);\n setExpandedDetail(name);\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to get checkpoint details'\n });\n }\n };\n\n const handleRestore = async (checkpointName: string) => {\n setConfirmRestore(null);\n setRestoring(checkpointName);\n setFlash(null);\n try {\n const detail = await CheckpointAPI.getCheckpoint(namespace, checkpointName);\n const filePath = detail.checkpointFiles?.[0]?.filePath ?? '';\n if (!filePath) {\n throw new Error('No checkpoint file path available for this checkpoint');\n }\n await onRestore(checkpointName, filePath);\n setFlash({\n type: 'success',\n text: `Kernel restored from \"${checkpointName}\". The kernel is restarting.`\n });\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to restore checkpoint'\n });\n } finally {\n setRestoring(null);\n }\n };\n\n const handleRename = async (oldName: string) => {\n const trimmed = renameValue.trim();\n if (!trimmed || trimmed === oldName) {\n setRenamingName(null);\n return;\n }\n setFlash(null);\n try {\n await CheckpointAPI.updateCheckpoint(namespace, oldName, {\n name: trimmed\n });\n setRenamingName(null);\n setFlash({ type: 'success', text: `Checkpoint renamed to \"${trimmed}\".` });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to rename checkpoint'\n });\n }\n };\n\n /* ------------------------------------------------------------------ */\n /* Render */\n /* ------------------------------------------------------------------ */\n\n return (\n <div className=\"kc-panel\">\n {/* Flash message */}\n {flash && (\n <div className={`kc-flash kc-flash-${flash.type}`}>\n <span>{flash.text}</span>\n <button\n className=\"kc-flash-close\"\n onClick={() => setFlash(null)}\n >\n &times;\n </button>\n </div>\n )}\n\n {/* Create checkpoint */}\n <div className=\"kc-create-section\">\n {!showCreateForm ? (\n <button\n className=\"kc-btn kc-btn-primary\"\n onClick={() => setShowCreateForm(true)}\n >\n Save Kernel State\n </button>\n ) : (\n <div className=\"kc-create-form\">\n <input\n className=\"kc-input\"\n type=\"text\"\n placeholder=\"Enter checkpoint name…\"\n value={newName}\n onChange={e => setNewName(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleCreate();\n }\n }}\n autoFocus\n disabled={creating}\n />\n <button\n className=\"kc-btn kc-btn-primary\"\n disabled={creating || !newName.trim()}\n onClick={handleCreate}\n >\n {creating ? 'Saving…' : 'Save'}\n </button>\n <button\n className=\"kc-btn\"\n onClick={() => {\n setShowCreateForm(false);\n setNewName('');\n }}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n\n {/* Checkpoint list */}\n <div className=\"kc-list\">\n {loading && checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">Loading checkpoints…</div>\n ) : error ? (\n <div className=\"kc-placeholder kc-placeholder-error\">{error}</div>\n ) : checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">\n No checkpoints found. Click &ldquo;Save Kernel State&rdquo; to\n create one.\n </div>\n ) : (\n checkpoints.map(cp => (\n <div key={cp.name} className=\"kc-item\">\n {/* Header row */}\n <div className=\"kc-item-header\">\n <div className=\"kc-item-info\">\n {renamingName === cp.name ? (\n <div className=\"kc-rename-form\">\n <input\n className=\"kc-input kc-input-sm\"\n type=\"text\"\n value={renameValue}\n onChange={e => setRenameValue(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleRename(cp.name);\n }\n if (e.key === 'Escape') {\n setRenamingName(null);\n }\n }}\n autoFocus\n />\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleRename(cp.name)}\n >\n OK\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setRenamingName(null)}\n >\n Cancel\n </button>\n </div>\n ) : (\n <span className=\"kc-item-name\" title={cp.name}>\n {cp.name}\n </span>\n )}\n <div className=\"kc-item-meta\">\n <PhaseIndicator phase={cp.phase} />\n <span className=\"kc-item-date\">\n {formatDate(cp.createdAt)}\n </span>\n </div>\n </div>\n\n <div className=\"kc-item-actions\">\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleViewStatus(cp.name)}\n >\n {expandedDetail === cp.name ? 'Hide' : 'Details'}\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => {\n setRenamingName(cp.name);\n setRenameValue(cp.name);\n }}\n >\n Rename\n </button>\n {confirmDelete === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Delete?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => handleDelete(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmDelete(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => setConfirmDelete(cp.name)}\n >\n Delete\n </button>\n )}\n {confirmRestore === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Restore?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n onClick={() => handleRestore(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmRestore(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n disabled={\n restoring !== null || cp.phase !== 'Completed'\n }\n title={\n cp.phase !== 'Completed'\n ? 'Checkpoint must be completed to restore'\n : 'Restore from this checkpoint'\n }\n onClick={() => setConfirmRestore(cp.name)}\n >\n {restoring === cp.name ? 'Restoring…' : 'Restore'}\n </button>\n )}\n </div>\n </div>\n\n {/* Expanded detail */}\n {expandedDetail === cp.name && detailData && (\n <div className=\"kc-detail\">\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Status</span>\n <span>{mapPhaseDisplay(detailData.phase)}</span>\n </div>\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Message</span>\n <span>{detailData.message}</span>\n </div>\n {detailData.podRef && (\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Pod</span>\n <span>{detailData.podRef.name}</span>\n </div>\n )}\n {detailData.checkpointFiles &&\n detailData.checkpointFiles.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">\n Checkpoint Files\n </span>\n {detailData.checkpointFiles.map((f, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span>{f.containerName}</span>\n <span className=\"kc-detail-time\">\n {formatDate(f.checkpointTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n {detailData.builtImages &&\n detailData.builtImages.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">Built Images</span>\n {detailData.builtImages.map((img, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span className=\"kc-detail-image-name\">\n {img.imageName}\n </span>\n <span className=\"kc-detail-time\">\n {formatDate(img.buildTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n ))\n )}\n </div>\n\n </div>\n );\n}\n","import {\n JupyterFrontEnd,\n JupyterFrontEndPlugin\n} from '@jupyterlab/application';\nimport { INotebookTracker, NotebookPanel } from '@jupyterlab/notebook';\nimport {\n Dialog,\n ReactWidget,\n showDialog,\n ToolbarButton\n} from '@jupyterlab/apputils';\nimport { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport React from 'react';\n\nimport { CheckpointPanel } from './checkpoint-panel';\nimport { CheckpointAPI } from './api';\nimport { ICheckpointPanelProps } from './types';\n\n/**\n * ReactWidget wrapper that hosts the CheckpointPanel React tree inside a\n * JupyterLab Dialog body.\n */\nclass CheckpointDialogBody extends ReactWidget {\n private _props: ICheckpointPanelProps;\n\n constructor(props: ICheckpointPanelProps) {\n super();\n this._props = props;\n this.addClass('kc-dialog-body');\n }\n\n protected render(): React.ReactElement {\n return React.createElement(CheckpointPanel, this._props);\n }\n}\n\nconst COMMAND_ID = 'kernel-checkpoint:open';\n\nconst plugin: JupyterFrontEndPlugin<void> = {\n id: 'kernel-checkpoint:plugin',\n description:\n 'An extension for saving and restoring kernel pod state with jupyter enterprise gateway',\n autoStart: true,\n requires: [INotebookTracker],\n activate: (app: JupyterFrontEnd, notebookTracker: INotebookTracker) => {\n console.log('JupyterLab extension kernel-checkpoint is activated!');\n\n app.commands.addCommand(COMMAND_ID, {\n label: 'Saving Points',\n caption: 'Manage kernel checkpoints',\n execute: async () => {\n const panel = notebookTracker.currentWidget;\n if (!panel) {\n return;\n }\n\n const sessionContext = panel.sessionContext;\n await sessionContext.ready;\n\n let config;\n try {\n config = await CheckpointAPI.getConfig();\n } catch (err) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Failed to load checkpoint configuration. Ensure CHECKPOINT_API_URL is set.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n if (!config.namespace) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Namespace not configured. Set CHECKPOINT_NAMESPACE environment variable or deploy in Kubernetes.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernel = sessionContext.session?.kernel;\n if (!kernel) {\n await showDialog({\n title: 'No Kernel',\n body: 'No kernel is connected. Please start a kernel first.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernelId = kernel.id;\n const kernelSpecName = kernel.name || 'python_kubernetes';\n\n const onRestore = async (checkpointName: string, checkpointFilePath: string): Promise<void> => {\n const settings = ServerConnection.makeSettings();\n const kernelUrl = URLExt.join(settings.baseUrl, 'api', 'kernels');\n\n const response = await ServerConnection.makeRequest(\n kernelUrl,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: kernelSpecName,\n env: {\n KERNEL_CHECKPOINT_NAME: checkpointName,\n KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath\n }\n })\n },\n settings\n );\n\n if (!response.ok) {\n const errText = await response.text();\n throw new Error(`Failed to create restored kernel: ${errText}`);\n }\n\n const kernelData = await response.json();\n await sessionContext.changeKernel({ id: kernelData.id });\n };\n\n const body = new CheckpointDialogBody({\n namespace: config.namespace,\n kernelId,\n kernelSpecName,\n onRestore\n });\n\n await showDialog({\n title: 'Kernel Checkpoints',\n body,\n buttons: [Dialog.cancelButton({ label: 'Close' })]\n });\n\n body.dispose();\n }\n });\n\n // Inject a toolbar button into every notebook panel\n notebookTracker.widgetAdded.connect(\n (_sender: INotebookTracker, panel: NotebookPanel) => {\n const button = new ToolbarButton({\n label: 'Saving Points',\n tooltip: 'Open kernel checkpoint manager',\n onClick: () => {\n app.commands.execute(COMMAND_ID);\n }\n });\n panel.toolbar.insertItem(10, 'kernel-checkpoint', button);\n }\n );\n }\n};\n\nexport default plugin;\n"],"names":[],"sourceRoot":""}
@@ -130,7 +130,7 @@ __webpack_require__.d(exports, {
130
130
  /******/ // This function allow to reference async chunks
131
131
  /******/ __webpack_require__.u = (chunkId) => {
132
132
  /******/ // return url for filenames based on template
133
- /******/ return "" + chunkId + "." + {"lib_index_js":"2c713e3ab2e5b31ee0e1","style_index_js":"c3e72438ed03e9dee0fc"}[chunkId] + ".js";
133
+ /******/ return "" + chunkId + "." + {"lib_index_js":"bcb2d92b281a36765a67","style_index_js":"c3e72438ed03e9dee0fc"}[chunkId] + ".js";
134
134
  /******/ };
135
135
  /******/ })();
136
136
  /******/
@@ -248,7 +248,7 @@ __webpack_require__.d(exports, {
248
248
  /******/ var promises = [];
249
249
  /******/ switch(name) {
250
250
  /******/ case "default": {
251
- /******/ register("kernel-checkpoint", "0.1.1", () => (__webpack_require__.e("lib_index_js").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ "./lib/index.js"))))));
251
+ /******/ register("kernel-checkpoint", "0.1.2", () => (__webpack_require__.e("lib_index_js").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ "./lib/index.js"))))));
252
252
  /******/ }
253
253
  /******/ break;
254
254
  /******/ }
@@ -559,4 +559,4 @@ __webpack_require__.d(exports, {
559
559
  /******/
560
560
  /******/ })()
561
561
  ;
562
- //# sourceMappingURL=remoteEntry.0ec66dead21656df694e.js.map
562
+ //# sourceMappingURL=remoteEntry.ff55aa1cac6b05f762e9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"remoteEntry.0ec66dead21656df694e.js","mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC,E;;;;;;UCpCD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;;;;;WClCA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF,E;;;;;WCRA;WACA;WACA;WACA,8BAA8B,8EAA8E;WAC5G,E;;;;;WCJA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC,I;;;;;WCPD,wF;;;;;WCAA;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA,E;;;;;WCxCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,oJAAoJ;WACpJ;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,IAAI,aAAa;WACjB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,E;;;;;WC7CA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,kC;;;;;WClBA;WACA;WACA,WAAW,4BAA4B,iBAAiB,EAAE,qEAAqE;WAC/H;WACA;WACA;WACA,qCAAqC,aAAa,EAAE,wDAAwD,2BAA2B,4BAA4B,2BAA2B,+CAA+C,mCAAmC;WAChR;WACA;WACA;WACA,qBAAqB,8BAA8B,SAAS,sDAAsD,gBAAgB,eAAe,KAAK,6DAA6D,SAAS,SAAS,QAAQ,eAAe,KAAK,eAAe,qGAAqG,WAAW,aAAa;WAC7Y;WACA;WACA;WACA,gBAAgB,8BAA8B,qBAAqB,YAAY,sBAAsB,SAAS,iDAAiD,6FAA6F,WAAW,uBAAuB,2BAA2B,wBAAwB,KAAK,oCAAoC,oBAAoB,wBAAwB,oBAAoB,SAAS,KAAK,yBAAyB,KAAK,gCAAgC,yBAAyB,QAAQ,eAAe,KAAK,eAAe,4DAA4D;WACtoB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE,IAAI;WACN;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;;WAED;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM;WACN,KAAK,WAAW;WAChB;WACA,GAAG;WACH;WACA,C;;;;;WCzKA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA,iCAAiC;;WAEjC;WACA;WACA;WACA,KAAK;WACL,eAAe;WACf;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;WACA;WACA,4G;;;;;WCrFA,mC;;;;;UEAA;UACA;UACA;UACA","sources":["webpack://kernel-checkpoint/webpack/container-entry","webpack://kernel-checkpoint/webpack/bootstrap","webpack://kernel-checkpoint/webpack/runtime/compat get default export","webpack://kernel-checkpoint/webpack/runtime/define property getters","webpack://kernel-checkpoint/webpack/runtime/ensure chunk","webpack://kernel-checkpoint/webpack/runtime/get javascript chunk filename","webpack://kernel-checkpoint/webpack/runtime/global","webpack://kernel-checkpoint/webpack/runtime/hasOwnProperty shorthand","webpack://kernel-checkpoint/webpack/runtime/load script","webpack://kernel-checkpoint/webpack/runtime/make namespace object","webpack://kernel-checkpoint/webpack/runtime/sharing","webpack://kernel-checkpoint/webpack/runtime/publicPath","webpack://kernel-checkpoint/webpack/runtime/consumes","webpack://kernel-checkpoint/webpack/runtime/jsonp chunk loading","webpack://kernel-checkpoint/webpack/runtime/nonce","webpack://kernel-checkpoint/webpack/before-startup","webpack://kernel-checkpoint/webpack/startup","webpack://kernel-checkpoint/webpack/after-startup"],"sourcesContent":["var moduleMap = {\n\t\"./index\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./extension\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./style\": () => {\n\t\treturn __webpack_require__.e(\"style_index_js\").then(() => (() => ((__webpack_require__(/*! ./style/index.js */ \"./style/index.js\")))));\n\t}\n};\nvar get = (module, getScope) => {\n\t__webpack_require__.R = getScope;\n\tgetScope = (\n\t\t__webpack_require__.o(moduleMap, module)\n\t\t\t? moduleMap[module]()\n\t\t\t: Promise.resolve().then(() => {\n\t\t\t\tthrow new Error('Module \"' + module + '\" does not exist in container.');\n\t\t\t})\n\t);\n\t__webpack_require__.R = undefined;\n\treturn getScope;\n};\nvar init = (shareScope, initScope) => {\n\tif (!__webpack_require__.S) return;\n\tvar name = \"default\"\n\tvar oldScope = __webpack_require__.S[name];\n\tif(oldScope && oldScope !== shareScope) throw new Error(\"Container initialization failed as it has already been initialized with a different share scope\");\n\t__webpack_require__.S[name] = shareScope;\n\treturn __webpack_require__.I(name, initScope);\n};\n\n// This exports getters to disallow modifications\n__webpack_require__.d(exports, {\n\tget: () => (get),\n\tinit: () => (init)\n});","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// expose the module cache\n__webpack_require__.c = __webpack_module_cache__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"lib_index_js\":\"2c713e3ab2e5b31ee0e1\",\"style_index_js\":\"c3e72438ed03e9dee0fc\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"kernel-checkpoint:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.S = {};\nvar initPromises = {};\nvar initTokens = {};\n__webpack_require__.I = (name, initScope) => {\n\tif(!initScope) initScope = [];\n\t// handling circular init calls\n\tvar initToken = initTokens[name];\n\tif(!initToken) initToken = initTokens[name] = {};\n\tif(initScope.indexOf(initToken) >= 0) return;\n\tinitScope.push(initToken);\n\t// only runs once\n\tif(initPromises[name]) return initPromises[name];\n\t// creates a new share scope if needed\n\tif(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {};\n\t// runs all init snippets from all modules reachable\n\tvar scope = __webpack_require__.S[name];\n\tvar warn = (msg) => {\n\t\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n\t};\n\tvar uniqueName = \"kernel-checkpoint\";\n\tvar register = (name, version, factory, eager) => {\n\t\tvar versions = scope[name] = scope[name] || {};\n\t\tvar activeVersion = versions[version];\n\t\tif(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };\n\t};\n\tvar initExternal = (id) => {\n\t\tvar handleError = (err) => (warn(\"Initialization of sharing external failed: \" + err));\n\t\ttry {\n\t\t\tvar module = __webpack_require__(id);\n\t\t\tif(!module) return;\n\t\t\tvar initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope))\n\t\t\tif(module.then) return promises.push(module.then(initFn, handleError));\n\t\t\tvar initResult = initFn(module);\n\t\t\tif(initResult && initResult.then) return promises.push(initResult['catch'](handleError));\n\t\t} catch(err) { handleError(err); }\n\t}\n\tvar promises = [];\n\tswitch(name) {\n\t\tcase \"default\": {\n\t\t\tregister(\"kernel-checkpoint\", \"0.1.1\", () => (__webpack_require__.e(\"lib_index_js\").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\"))))));\n\t\t}\n\t\tbreak;\n\t}\n\tif(!promises.length) return initPromises[name] = 1;\n\treturn initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1));\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var parseVersion = (str) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar p=p=>{return p.split(\".\").map(p=>{return+p==p?+p:p})},n=/^([^-+]+)?(?:-([^+]+))?(?:\\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r;\n}\nvar versionLt = (a, b) => {\n\t// see webpack/lib/util/semver.js for original code\n\ta=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r<b.length&&\"u\"!=(typeof b[r])[0];var e=a[r],n=(typeof e)[0];if(r>=b.length)return\"u\"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return\"o\"==n&&\"n\"==f||(\"s\"==f||\"u\"==n);if(\"o\"!=n&&\"u\"!=n&&e!=t)return e<t;r++}\n}\nvar rangeToString = (range) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar r=range[0],n=\"\";if(1===range.length)return\"*\";if(r+.5){n+=0==r?\">=\":-1==r?\"<\":1==r?\"^\":2==r?\"~\":r>0?\"=\":\"!=\";for(var e=1,a=1;a<range.length;a++){e--,n+=\"u\"==(typeof(t=range[a]))[0]?\"-\":(e>0?\".\":\"\")+(e=2,t)}return n}var g=[];for(a=1;a<range.length;a++){var t=range[a];g.push(0===t?\"not(\"+o()+\")\":1===t?\"(\"+o()+\" || \"+o()+\")\":2===t?g.pop()+\" \"+g.pop():rangeToString(t))}return o();function o(){return g.pop().replace(/^\\((.+)\\)$/,\"$1\")}\n}\nvar satisfy = (range, version) => {\n\t// see webpack/lib/util/semver.js for original code\n\tif(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i<range.length?(typeof range[i])[0]:\"\";if(n>=version.length||\"o\"==(s=(typeof(f=version[n]))[0]))return!a||(\"u\"==g?i>e&&!r:\"\"==g!=r);if(\"u\"==s){if(!a||\"u\"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f<range[i])return!1;f!=range[i]&&(a=!1)}else if(\"s\"!=g&&\"n\"!=g){if(r||i<=e)return!1;a=!1,i--}else{if(i<=e||s<g!=r)return!1;a=!1}else\"s\"!=g&&\"n\"!=g&&(a=!1,i--)}}var t=[],o=t.pop.bind(t);for(n=1;n<range.length;n++){var u=range[n];t.push(1==u?o()|o():2==u?o()&o():u?satisfy(u,version):!o())}return!!o();\n}\nvar exists = (scope, key) => {\n\treturn scope && __webpack_require__.o(scope, key);\n}\nvar get = (entry) => {\n\tentry.loaded = 1;\n\treturn entry.get()\n};\nvar eagerOnly = (versions) => {\n\treturn Object.keys(versions).reduce((filtered, version) => {\n\t\t\tif (versions[version].eager) {\n\t\t\t\tfiltered[version] = versions[version];\n\t\t\t}\n\t\t\treturn filtered;\n\t}, {});\n};\nvar findLatestVersion = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key];\n};\nvar findSatisfyingVersion = (scope, key, requiredVersion, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\tif (!satisfy(requiredVersion, b)) return a;\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key]\n};\nvar findSingletonVersionKey = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\treturn Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || (!versions[a].loaded && versionLt(a, b)) ? b : a;\n\t}, 0);\n};\nvar getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => {\n\treturn \"Unsatisfied version \" + version + \" from \" + (version && scope[key][version].from) + \" of shared singleton module \" + key + \" (required \" + rangeToString(requiredVersion) + \")\"\n};\nvar getInvalidVersionMessage = (scope, scopeName, key, requiredVersion, eager) => {\n\tvar versions = scope[key];\n\treturn \"No satisfying version (\" + rangeToString(requiredVersion) + \")\" + (eager ? \" for eager consumption\" : \"\") + \" of shared module \" + key + \" found in shared scope \" + scopeName + \".\\n\" +\n\t\t\"Available versions: \" + Object.keys(versions).map((key) => {\n\t\treturn key + \" from \" + versions[key].from;\n\t}).join(\", \");\n};\nvar fail = (msg) => {\n\tthrow new Error(msg);\n}\nvar failAsNotExist = (scopeName, key) => {\n\treturn fail(\"Shared module \" + key + \" doesn't exist in shared scope \" + scopeName);\n}\nvar warn = /*#__PURE__*/ (msg) => {\n\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n};\nvar init = (fn) => (function(scopeName, key, eager, c, d) {\n\tvar promise = __webpack_require__.I(scopeName);\n\tif (promise && promise.then && !eager) {\n\t\treturn promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], key, false, c, d));\n\t}\n\treturn fn(scopeName, __webpack_require__.S[scopeName], key, eager, c, d);\n});\n\nvar useFallback = (scopeName, key, fallback) => {\n\treturn fallback ? fallback() : failAsNotExist(scopeName, key);\n}\nvar load = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\twarn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager))\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadStrictVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\tif (fallback) return fallback();\n\tfail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager));\n});\nvar loadSingleton = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\treturn get(scope[key][version]);\n});\nvar loadSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\twarn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar loadStrictSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\tfail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar installedModules = {};\nvar moduleToHandlerMapping = {\n\t\"webpack/sharing/consume/default/@jupyterlab/notebook\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/notebook\", false, [1,4,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/apputils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/apputils\", false, [1,4,4,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/coreutils\", false, [1,6,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/services\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/services\", false, [1,7,3,6])),\n\t\"webpack/sharing/consume/default/react\": () => (loadSingletonVersion(\"default\", \"react\", false, [1,18,2,0]))\n};\n// no consumes in initial chunks\nvar chunkMapping = {\n\t\"lib_index_js\": [\n\t\t\"webpack/sharing/consume/default/@jupyterlab/notebook\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/apputils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/services\",\n\t\t\"webpack/sharing/consume/default/react\"\n\t]\n};\nvar startedInstallModules = {};\n__webpack_require__.f.consumes = (chunkId, promises) => {\n\tif(__webpack_require__.o(chunkMapping, chunkId)) {\n\t\tchunkMapping[chunkId].forEach((id) => {\n\t\t\tif(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]);\n\t\t\tif(!startedInstallModules[id]) {\n\t\t\tvar onFactory = (factory) => {\n\t\t\t\tinstalledModules[id] = 0;\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tmodule.exports = factory();\n\t\t\t\t}\n\t\t\t};\n\t\t\tstartedInstallModules[id] = true;\n\t\t\tvar onError = (error) => {\n\t\t\t\tdelete installedModules[id];\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tvar promise = moduleToHandlerMapping[id]();\n\t\t\t\tif(promise.then) {\n\t\t\t\t\tpromises.push(installedModules[id] = promise.then(onFactory)['catch'](onError));\n\t\t\t\t} else onFactory(promise);\n\t\t\t} catch(e) { onError(e); }\n\t\t\t}\n\t\t});\n\t}\n}","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"kernel-checkpoint\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkkernel_checkpoint\"] = self[\"webpackChunkkernel_checkpoint\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","","// module cache are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(\"webpack/container/entry/kernel-checkpoint\");\n",""],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"remoteEntry.ff55aa1cac6b05f762e9.js","mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC,E;;;;;;UCpCD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;;;;;WClCA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF,E;;;;;WCRA;WACA;WACA;WACA,8BAA8B,8EAA8E;WAC5G,E;;;;;WCJA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC,I;;;;;WCPD,wF;;;;;WCAA;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA,E;;;;;WCxCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,oJAAoJ;WACpJ;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,IAAI,aAAa;WACjB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,E;;;;;WC7CA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,kC;;;;;WClBA;WACA;WACA,WAAW,4BAA4B,iBAAiB,EAAE,qEAAqE;WAC/H;WACA;WACA;WACA,qCAAqC,aAAa,EAAE,wDAAwD,2BAA2B,4BAA4B,2BAA2B,+CAA+C,mCAAmC;WAChR;WACA;WACA;WACA,qBAAqB,8BAA8B,SAAS,sDAAsD,gBAAgB,eAAe,KAAK,6DAA6D,SAAS,SAAS,QAAQ,eAAe,KAAK,eAAe,qGAAqG,WAAW,aAAa;WAC7Y;WACA;WACA;WACA,gBAAgB,8BAA8B,qBAAqB,YAAY,sBAAsB,SAAS,iDAAiD,6FAA6F,WAAW,uBAAuB,2BAA2B,wBAAwB,KAAK,oCAAoC,oBAAoB,wBAAwB,oBAAoB,SAAS,KAAK,yBAAyB,KAAK,gCAAgC,yBAAyB,QAAQ,eAAe,KAAK,eAAe,4DAA4D;WACtoB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE,IAAI;WACN;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;;WAED;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM;WACN,KAAK,WAAW;WAChB;WACA,GAAG;WACH;WACA,C;;;;;WCzKA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA,iCAAiC;;WAEjC;WACA;WACA;WACA,KAAK;WACL,eAAe;WACf;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;WACA;WACA,4G;;;;;WCrFA,mC;;;;;UEAA;UACA;UACA;UACA","sources":["webpack://kernel-checkpoint/webpack/container-entry","webpack://kernel-checkpoint/webpack/bootstrap","webpack://kernel-checkpoint/webpack/runtime/compat get default export","webpack://kernel-checkpoint/webpack/runtime/define property getters","webpack://kernel-checkpoint/webpack/runtime/ensure chunk","webpack://kernel-checkpoint/webpack/runtime/get javascript chunk filename","webpack://kernel-checkpoint/webpack/runtime/global","webpack://kernel-checkpoint/webpack/runtime/hasOwnProperty shorthand","webpack://kernel-checkpoint/webpack/runtime/load script","webpack://kernel-checkpoint/webpack/runtime/make namespace object","webpack://kernel-checkpoint/webpack/runtime/sharing","webpack://kernel-checkpoint/webpack/runtime/publicPath","webpack://kernel-checkpoint/webpack/runtime/consumes","webpack://kernel-checkpoint/webpack/runtime/jsonp chunk loading","webpack://kernel-checkpoint/webpack/runtime/nonce","webpack://kernel-checkpoint/webpack/before-startup","webpack://kernel-checkpoint/webpack/startup","webpack://kernel-checkpoint/webpack/after-startup"],"sourcesContent":["var moduleMap = {\n\t\"./index\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./extension\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./style\": () => {\n\t\treturn __webpack_require__.e(\"style_index_js\").then(() => (() => ((__webpack_require__(/*! ./style/index.js */ \"./style/index.js\")))));\n\t}\n};\nvar get = (module, getScope) => {\n\t__webpack_require__.R = getScope;\n\tgetScope = (\n\t\t__webpack_require__.o(moduleMap, module)\n\t\t\t? moduleMap[module]()\n\t\t\t: Promise.resolve().then(() => {\n\t\t\t\tthrow new Error('Module \"' + module + '\" does not exist in container.');\n\t\t\t})\n\t);\n\t__webpack_require__.R = undefined;\n\treturn getScope;\n};\nvar init = (shareScope, initScope) => {\n\tif (!__webpack_require__.S) return;\n\tvar name = \"default\"\n\tvar oldScope = __webpack_require__.S[name];\n\tif(oldScope && oldScope !== shareScope) throw new Error(\"Container initialization failed as it has already been initialized with a different share scope\");\n\t__webpack_require__.S[name] = shareScope;\n\treturn __webpack_require__.I(name, initScope);\n};\n\n// This exports getters to disallow modifications\n__webpack_require__.d(exports, {\n\tget: () => (get),\n\tinit: () => (init)\n});","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// expose the module cache\n__webpack_require__.c = __webpack_module_cache__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"lib_index_js\":\"bcb2d92b281a36765a67\",\"style_index_js\":\"c3e72438ed03e9dee0fc\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"kernel-checkpoint:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.S = {};\nvar initPromises = {};\nvar initTokens = {};\n__webpack_require__.I = (name, initScope) => {\n\tif(!initScope) initScope = [];\n\t// handling circular init calls\n\tvar initToken = initTokens[name];\n\tif(!initToken) initToken = initTokens[name] = {};\n\tif(initScope.indexOf(initToken) >= 0) return;\n\tinitScope.push(initToken);\n\t// only runs once\n\tif(initPromises[name]) return initPromises[name];\n\t// creates a new share scope if needed\n\tif(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {};\n\t// runs all init snippets from all modules reachable\n\tvar scope = __webpack_require__.S[name];\n\tvar warn = (msg) => {\n\t\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n\t};\n\tvar uniqueName = \"kernel-checkpoint\";\n\tvar register = (name, version, factory, eager) => {\n\t\tvar versions = scope[name] = scope[name] || {};\n\t\tvar activeVersion = versions[version];\n\t\tif(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };\n\t};\n\tvar initExternal = (id) => {\n\t\tvar handleError = (err) => (warn(\"Initialization of sharing external failed: \" + err));\n\t\ttry {\n\t\t\tvar module = __webpack_require__(id);\n\t\t\tif(!module) return;\n\t\t\tvar initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope))\n\t\t\tif(module.then) return promises.push(module.then(initFn, handleError));\n\t\t\tvar initResult = initFn(module);\n\t\t\tif(initResult && initResult.then) return promises.push(initResult['catch'](handleError));\n\t\t} catch(err) { handleError(err); }\n\t}\n\tvar promises = [];\n\tswitch(name) {\n\t\tcase \"default\": {\n\t\t\tregister(\"kernel-checkpoint\", \"0.1.2\", () => (__webpack_require__.e(\"lib_index_js\").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\"))))));\n\t\t}\n\t\tbreak;\n\t}\n\tif(!promises.length) return initPromises[name] = 1;\n\treturn initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1));\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var parseVersion = (str) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar p=p=>{return p.split(\".\").map(p=>{return+p==p?+p:p})},n=/^([^-+]+)?(?:-([^+]+))?(?:\\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r;\n}\nvar versionLt = (a, b) => {\n\t// see webpack/lib/util/semver.js for original code\n\ta=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r<b.length&&\"u\"!=(typeof b[r])[0];var e=a[r],n=(typeof e)[0];if(r>=b.length)return\"u\"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return\"o\"==n&&\"n\"==f||(\"s\"==f||\"u\"==n);if(\"o\"!=n&&\"u\"!=n&&e!=t)return e<t;r++}\n}\nvar rangeToString = (range) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar r=range[0],n=\"\";if(1===range.length)return\"*\";if(r+.5){n+=0==r?\">=\":-1==r?\"<\":1==r?\"^\":2==r?\"~\":r>0?\"=\":\"!=\";for(var e=1,a=1;a<range.length;a++){e--,n+=\"u\"==(typeof(t=range[a]))[0]?\"-\":(e>0?\".\":\"\")+(e=2,t)}return n}var g=[];for(a=1;a<range.length;a++){var t=range[a];g.push(0===t?\"not(\"+o()+\")\":1===t?\"(\"+o()+\" || \"+o()+\")\":2===t?g.pop()+\" \"+g.pop():rangeToString(t))}return o();function o(){return g.pop().replace(/^\\((.+)\\)$/,\"$1\")}\n}\nvar satisfy = (range, version) => {\n\t// see webpack/lib/util/semver.js for original code\n\tif(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i<range.length?(typeof range[i])[0]:\"\";if(n>=version.length||\"o\"==(s=(typeof(f=version[n]))[0]))return!a||(\"u\"==g?i>e&&!r:\"\"==g!=r);if(\"u\"==s){if(!a||\"u\"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f<range[i])return!1;f!=range[i]&&(a=!1)}else if(\"s\"!=g&&\"n\"!=g){if(r||i<=e)return!1;a=!1,i--}else{if(i<=e||s<g!=r)return!1;a=!1}else\"s\"!=g&&\"n\"!=g&&(a=!1,i--)}}var t=[],o=t.pop.bind(t);for(n=1;n<range.length;n++){var u=range[n];t.push(1==u?o()|o():2==u?o()&o():u?satisfy(u,version):!o())}return!!o();\n}\nvar exists = (scope, key) => {\n\treturn scope && __webpack_require__.o(scope, key);\n}\nvar get = (entry) => {\n\tentry.loaded = 1;\n\treturn entry.get()\n};\nvar eagerOnly = (versions) => {\n\treturn Object.keys(versions).reduce((filtered, version) => {\n\t\t\tif (versions[version].eager) {\n\t\t\t\tfiltered[version] = versions[version];\n\t\t\t}\n\t\t\treturn filtered;\n\t}, {});\n};\nvar findLatestVersion = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key];\n};\nvar findSatisfyingVersion = (scope, key, requiredVersion, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\tif (!satisfy(requiredVersion, b)) return a;\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key]\n};\nvar findSingletonVersionKey = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\treturn Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || (!versions[a].loaded && versionLt(a, b)) ? b : a;\n\t}, 0);\n};\nvar getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => {\n\treturn \"Unsatisfied version \" + version + \" from \" + (version && scope[key][version].from) + \" of shared singleton module \" + key + \" (required \" + rangeToString(requiredVersion) + \")\"\n};\nvar getInvalidVersionMessage = (scope, scopeName, key, requiredVersion, eager) => {\n\tvar versions = scope[key];\n\treturn \"No satisfying version (\" + rangeToString(requiredVersion) + \")\" + (eager ? \" for eager consumption\" : \"\") + \" of shared module \" + key + \" found in shared scope \" + scopeName + \".\\n\" +\n\t\t\"Available versions: \" + Object.keys(versions).map((key) => {\n\t\treturn key + \" from \" + versions[key].from;\n\t}).join(\", \");\n};\nvar fail = (msg) => {\n\tthrow new Error(msg);\n}\nvar failAsNotExist = (scopeName, key) => {\n\treturn fail(\"Shared module \" + key + \" doesn't exist in shared scope \" + scopeName);\n}\nvar warn = /*#__PURE__*/ (msg) => {\n\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n};\nvar init = (fn) => (function(scopeName, key, eager, c, d) {\n\tvar promise = __webpack_require__.I(scopeName);\n\tif (promise && promise.then && !eager) {\n\t\treturn promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], key, false, c, d));\n\t}\n\treturn fn(scopeName, __webpack_require__.S[scopeName], key, eager, c, d);\n});\n\nvar useFallback = (scopeName, key, fallback) => {\n\treturn fallback ? fallback() : failAsNotExist(scopeName, key);\n}\nvar load = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\twarn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager))\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadStrictVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\tif (fallback) return fallback();\n\tfail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager));\n});\nvar loadSingleton = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\treturn get(scope[key][version]);\n});\nvar loadSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\twarn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar loadStrictSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\tfail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar installedModules = {};\nvar moduleToHandlerMapping = {\n\t\"webpack/sharing/consume/default/@jupyterlab/notebook\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/notebook\", false, [1,4,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/apputils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/apputils\", false, [1,4,4,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/coreutils\", false, [1,6,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/services\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/services\", false, [1,7,3,6])),\n\t\"webpack/sharing/consume/default/react\": () => (loadSingletonVersion(\"default\", \"react\", false, [1,18,2,0]))\n};\n// no consumes in initial chunks\nvar chunkMapping = {\n\t\"lib_index_js\": [\n\t\t\"webpack/sharing/consume/default/@jupyterlab/notebook\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/apputils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/services\",\n\t\t\"webpack/sharing/consume/default/react\"\n\t]\n};\nvar startedInstallModules = {};\n__webpack_require__.f.consumes = (chunkId, promises) => {\n\tif(__webpack_require__.o(chunkMapping, chunkId)) {\n\t\tchunkMapping[chunkId].forEach((id) => {\n\t\t\tif(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]);\n\t\t\tif(!startedInstallModules[id]) {\n\t\t\tvar onFactory = (factory) => {\n\t\t\t\tinstalledModules[id] = 0;\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tmodule.exports = factory();\n\t\t\t\t}\n\t\t\t};\n\t\t\tstartedInstallModules[id] = true;\n\t\t\tvar onError = (error) => {\n\t\t\t\tdelete installedModules[id];\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tvar promise = moduleToHandlerMapping[id]();\n\t\t\t\tif(promise.then) {\n\t\t\t\t\tpromises.push(installedModules[id] = promise.then(onFactory)['catch'](onError));\n\t\t\t\t} else onFactory(promise);\n\t\t\t} catch(e) { onError(e); }\n\t\t\t}\n\t\t});\n\t}\n}","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"kernel-checkpoint\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkkernel_checkpoint\"] = self[\"webpackChunkkernel_checkpoint\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","","// module cache are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(\"webpack/container/entry/kernel-checkpoint\");\n",""],"names":[],"sourceRoot":""}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kernel-checkpoint",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "An extension for saving and restoring kernel pod state with jupyter enterprise gateway",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -143,7 +143,12 @@ export function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {
143
143
  setRestoring(checkpointName);
144
144
  setFlash(null);
145
145
  try {
146
- await onRestore(checkpointName);
146
+ const detail = await CheckpointAPI.getCheckpoint(namespace, checkpointName);
147
+ const filePath = detail.checkpointFiles?.[0]?.storagePath ?? '';
148
+ if (!filePath) {
149
+ throw new Error('No checkpoint file path available for this checkpoint');
150
+ }
151
+ await onRestore(checkpointName, filePath);
147
152
  setFlash({
148
153
  type: 'success',
149
154
  text: `Kernel restored from "${checkpointName}". The kernel is restarting.`
@@ -92,7 +92,7 @@ const plugin: JupyterFrontEndPlugin<void> = {
92
92
  const kernelId = kernel.id;
93
93
  const kernelSpecName = kernel.name || 'python_kubernetes';
94
94
 
95
- const onRestore = async (checkpointName: string): Promise<void> => {
95
+ const onRestore = async (checkpointName: string, checkpointFilePath: string): Promise<void> => {
96
96
  const settings = ServerConnection.makeSettings();
97
97
  const kernelUrl = URLExt.join(settings.baseUrl, 'api', 'kernels');
98
98
 
@@ -104,7 +104,8 @@ const plugin: JupyterFrontEndPlugin<void> = {
104
104
  body: JSON.stringify({
105
105
  name: kernelSpecName,
106
106
  env: {
107
- KERNEL_CHECKPOINT_NAME: checkpointName
107
+ KERNEL_CHECKPOINT_NAME: checkpointName,
108
+ KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath
108
109
  }
109
110
  })
110
111
  },
@@ -59,5 +59,5 @@ export interface ICheckpointPanelProps {
59
59
  namespace: string;
60
60
  kernelId: string;
61
61
  kernelSpecName: string;
62
- onRestore: (checkpointName: string) => Promise<void>;
62
+ onRestore: (checkpointName: string, checkpointFilePath: string) => Promise<void>;
63
63
  }
@@ -1,23 +0,0 @@
1
- try:
2
- from ._version import __version__
3
- except ImportError:
4
- import warnings
5
- warnings.warn("Importing 'kernel_checkpoint' outside a proper installation.")
6
- __version__ = "dev"
7
-
8
-
9
- def _jupyter_labextension_paths():
10
- return [{
11
- "src": "labextension",
12
- "dest": "kernel-checkpoint"
13
- }]
14
-
15
-
16
- def _jupyter_server_extension_points():
17
- return [{"module": "kernel_checkpoint"}]
18
-
19
-
20
- def _load_jupyter_server_extension(server_app):
21
- from .handlers import setup_handlers
22
- setup_handlers(server_app.web_app)
23
- server_app.log.info("kernel_checkpoint server extension loaded")
@@ -1 +0,0 @@
1
- {"version":3,"file":"lib_index_js.2c713e3ab2e5b31ee0e1.js","mappings":"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","sources":["webpack://kernel-checkpoint/./src/api.ts","webpack://kernel-checkpoint/./src/checkpoint-panel.tsx","webpack://kernel-checkpoint/./src/index.ts"],"sourcesContent":["import { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport {\n ICheckpointConfig,\n ICheckpointListResponse,\n ICheckpoint,\n ICreateCheckpointRequest\n} from './types';\n\nconst API_NAMESPACE = 'kernel-checkpoint';\n\nfunction makeRequest(\n endpoint: string,\n init: RequestInit = {}\n): Promise<Response> {\n const settings = ServerConnection.makeSettings();\n const url = URLExt.join(settings.baseUrl, API_NAMESPACE, endpoint);\n return ServerConnection.makeRequest(url, init, settings);\n}\n\nfunction jsonInit(method: string, data: any): RequestInit {\n return {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n };\n}\n\nasync function handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = response.statusText;\n try {\n const body = await response.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n return response.json();\n}\n\nexport namespace CheckpointAPI {\n export async function getConfig(): Promise<ICheckpointConfig> {\n const resp = await makeRequest('config');\n return handleResponse<ICheckpointConfig>(resp);\n }\n\n export async function listCheckpoints(\n namespace: string\n ): Promise<ICheckpointListResponse> {\n const resp = await makeRequest(\n `checkpoints?namespace=${encodeURIComponent(namespace)}`\n );\n return handleResponse<ICheckpointListResponse>(resp);\n }\n\n export async function getCheckpoint(\n namespace: string,\n name: string\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function createCheckpoint(\n request: ICreateCheckpointRequest\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n 'checkpoints',\n jsonInit('POST', request)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function deleteCheckpoint(\n namespace: string,\n name: string\n ): Promise<void> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n { method: 'DELETE' }\n );\n if (!resp.ok) {\n let detail = resp.statusText;\n try {\n const body = await resp.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n }\n\n export async function updateCheckpoint(\n namespace: string,\n name: string,\n data: Record<string, any>\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n jsonInit('PUT', data)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { ICheckpoint, ICheckpointPanelProps } from './types';\nimport { CheckpointAPI } from './api';\n\nconst CHECKPOINT_REFRESH_INTERVAL = 3;\n\nfunction mapPhaseDisplay(phase: string): string {\n return phase === 'Completed' ? 'Ready' : 'Pending';\n}\n\nfunction PhaseIndicator({ phase }: { phase: string }): JSX.Element {\n const display = mapPhaseDisplay(phase);\n const cls = display.toLowerCase().replace(/\\s+/g, '-');\n return <span className={`kc-phase kc-phase-${cls}`}>{display}</span>;\n}\n\nfunction formatDate(iso: string): string {\n return new Date(iso).toLocaleString();\n}\n\nexport function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {\n const { namespace, kernelId, onRestore } = props;\n\n const [checkpoints, setCheckpoints] = useState<ICheckpoint[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const [showCreateForm, setShowCreateForm] = useState(false);\n const [newName, setNewName] = useState('');\n const [creating, setCreating] = useState(false);\n\n const [restoring, setRestoring] = useState<string | null>(null);\n const [expandedDetail, setExpandedDetail] = useState<string | null>(null);\n const [detailData, setDetailData] = useState<ICheckpoint | null>(null);\n\n const [renamingName, setRenamingName] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState('');\n\n const [flash, setFlash] = useState<{\n type: 'success' | 'error';\n text: string;\n } | null>(null);\n\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [confirmRestore, setConfirmRestore] = useState<string | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* Data fetching */\n /* ------------------------------------------------------------------ */\n\n const fetchCheckpoints = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await CheckpointAPI.listCheckpoints(namespace);\n setCheckpoints(result.items ?? []);\n } catch (err: any) {\n setError(err.message ?? 'Failed to load checkpoints');\n } finally {\n setLoading(false);\n }\n }, [namespace]);\n\n useEffect(() => {\n fetchCheckpoints();\n }, [fetchCheckpoints]);\n\n useEffect(() => {\n const id = setInterval(fetchCheckpoints, CHECKPOINT_REFRESH_INTERVAL * 1000);\n return () => clearInterval(id);\n }, [fetchCheckpoints]);\n\n /* ------------------------------------------------------------------ */\n /* Actions */\n /* ------------------------------------------------------------------ */\n\n const handleCreate = async () => {\n if (!newName.trim()) {\n return;\n }\n setCreating(true);\n setFlash(null);\n try {\n await CheckpointAPI.createCheckpoint({\n name: newName.trim(),\n namespace,\n kernelId,\n buildImage: false\n });\n setNewName('');\n setShowCreateForm(false);\n setFlash({ type: 'success', text: 'Checkpoint created successfully.' });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to create checkpoint'\n });\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (name: string) => {\n setFlash(null);\n setConfirmDelete(null);\n try {\n await CheckpointAPI.deleteCheckpoint(namespace, name);\n setFlash({ type: 'success', text: `Checkpoint \"${name}\" deleted.` });\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n }\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to delete checkpoint'\n });\n }\n };\n\n const handleViewStatus = async (name: string) => {\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n return;\n }\n try {\n const detail = await CheckpointAPI.getCheckpoint(namespace, name);\n setDetailData(detail);\n setExpandedDetail(name);\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to get checkpoint details'\n });\n }\n };\n\n const handleRestore = async (checkpointName: string) => {\n setConfirmRestore(null);\n setRestoring(checkpointName);\n setFlash(null);\n try {\n await onRestore(checkpointName);\n setFlash({\n type: 'success',\n text: `Kernel restored from \"${checkpointName}\". The kernel is restarting.`\n });\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to restore checkpoint'\n });\n } finally {\n setRestoring(null);\n }\n };\n\n const handleRename = async (oldName: string) => {\n const trimmed = renameValue.trim();\n if (!trimmed || trimmed === oldName) {\n setRenamingName(null);\n return;\n }\n setFlash(null);\n try {\n await CheckpointAPI.updateCheckpoint(namespace, oldName, {\n name: trimmed\n });\n setRenamingName(null);\n setFlash({ type: 'success', text: `Checkpoint renamed to \"${trimmed}\".` });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to rename checkpoint'\n });\n }\n };\n\n /* ------------------------------------------------------------------ */\n /* Render */\n /* ------------------------------------------------------------------ */\n\n return (\n <div className=\"kc-panel\">\n {/* Flash message */}\n {flash && (\n <div className={`kc-flash kc-flash-${flash.type}`}>\n <span>{flash.text}</span>\n <button\n className=\"kc-flash-close\"\n onClick={() => setFlash(null)}\n >\n &times;\n </button>\n </div>\n )}\n\n {/* Create checkpoint */}\n <div className=\"kc-create-section\">\n {!showCreateForm ? (\n <button\n className=\"kc-btn kc-btn-primary\"\n onClick={() => setShowCreateForm(true)}\n >\n Save Kernel State\n </button>\n ) : (\n <div className=\"kc-create-form\">\n <input\n className=\"kc-input\"\n type=\"text\"\n placeholder=\"Enter checkpoint name…\"\n value={newName}\n onChange={e => setNewName(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleCreate();\n }\n }}\n autoFocus\n disabled={creating}\n />\n <button\n className=\"kc-btn kc-btn-primary\"\n disabled={creating || !newName.trim()}\n onClick={handleCreate}\n >\n {creating ? 'Saving…' : 'Save'}\n </button>\n <button\n className=\"kc-btn\"\n onClick={() => {\n setShowCreateForm(false);\n setNewName('');\n }}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n\n {/* Checkpoint list */}\n <div className=\"kc-list\">\n {loading && checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">Loading checkpoints…</div>\n ) : error ? (\n <div className=\"kc-placeholder kc-placeholder-error\">{error}</div>\n ) : checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">\n No checkpoints found. Click &ldquo;Save Kernel State&rdquo; to\n create one.\n </div>\n ) : (\n checkpoints.map(cp => (\n <div key={cp.name} className=\"kc-item\">\n {/* Header row */}\n <div className=\"kc-item-header\">\n <div className=\"kc-item-info\">\n {renamingName === cp.name ? (\n <div className=\"kc-rename-form\">\n <input\n className=\"kc-input kc-input-sm\"\n type=\"text\"\n value={renameValue}\n onChange={e => setRenameValue(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleRename(cp.name);\n }\n if (e.key === 'Escape') {\n setRenamingName(null);\n }\n }}\n autoFocus\n />\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleRename(cp.name)}\n >\n OK\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setRenamingName(null)}\n >\n Cancel\n </button>\n </div>\n ) : (\n <span className=\"kc-item-name\" title={cp.name}>\n {cp.name}\n </span>\n )}\n <div className=\"kc-item-meta\">\n <PhaseIndicator phase={cp.phase} />\n <span className=\"kc-item-date\">\n {formatDate(cp.createdAt)}\n </span>\n </div>\n </div>\n\n <div className=\"kc-item-actions\">\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleViewStatus(cp.name)}\n >\n {expandedDetail === cp.name ? 'Hide' : 'Details'}\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => {\n setRenamingName(cp.name);\n setRenameValue(cp.name);\n }}\n >\n Rename\n </button>\n {confirmDelete === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Delete?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => handleDelete(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmDelete(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => setConfirmDelete(cp.name)}\n >\n Delete\n </button>\n )}\n {confirmRestore === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Restore?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n onClick={() => handleRestore(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmRestore(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n disabled={\n restoring !== null || cp.phase !== 'Completed'\n }\n title={\n cp.phase !== 'Completed'\n ? 'Checkpoint must be completed to restore'\n : 'Restore from this checkpoint'\n }\n onClick={() => setConfirmRestore(cp.name)}\n >\n {restoring === cp.name ? 'Restoring…' : 'Restore'}\n </button>\n )}\n </div>\n </div>\n\n {/* Expanded detail */}\n {expandedDetail === cp.name && detailData && (\n <div className=\"kc-detail\">\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Status</span>\n <span>{mapPhaseDisplay(detailData.phase)}</span>\n </div>\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Message</span>\n <span>{detailData.message}</span>\n </div>\n {detailData.podRef && (\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Pod</span>\n <span>{detailData.podRef.name}</span>\n </div>\n )}\n {detailData.checkpointFiles &&\n detailData.checkpointFiles.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">\n Checkpoint Files\n </span>\n {detailData.checkpointFiles.map((f, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span>{f.containerName}</span>\n <span className=\"kc-detail-time\">\n {formatDate(f.checkpointTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n {detailData.builtImages &&\n detailData.builtImages.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">Built Images</span>\n {detailData.builtImages.map((img, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span className=\"kc-detail-image-name\">\n {img.imageName}\n </span>\n <span className=\"kc-detail-time\">\n {formatDate(img.buildTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n ))\n )}\n </div>\n\n </div>\n );\n}\n","import {\n JupyterFrontEnd,\n JupyterFrontEndPlugin\n} from '@jupyterlab/application';\nimport { INotebookTracker, NotebookPanel } from '@jupyterlab/notebook';\nimport {\n Dialog,\n ReactWidget,\n showDialog,\n ToolbarButton\n} from '@jupyterlab/apputils';\nimport { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport React from 'react';\n\nimport { CheckpointPanel } from './checkpoint-panel';\nimport { CheckpointAPI } from './api';\nimport { ICheckpointPanelProps } from './types';\n\n/**\n * ReactWidget wrapper that hosts the CheckpointPanel React tree inside a\n * JupyterLab Dialog body.\n */\nclass CheckpointDialogBody extends ReactWidget {\n private _props: ICheckpointPanelProps;\n\n constructor(props: ICheckpointPanelProps) {\n super();\n this._props = props;\n this.addClass('kc-dialog-body');\n }\n\n protected render(): React.ReactElement {\n return React.createElement(CheckpointPanel, this._props);\n }\n}\n\nconst COMMAND_ID = 'kernel-checkpoint:open';\n\nconst plugin: JupyterFrontEndPlugin<void> = {\n id: 'kernel-checkpoint:plugin',\n description:\n 'An extension for saving and restoring kernel pod state with jupyter enterprise gateway',\n autoStart: true,\n requires: [INotebookTracker],\n activate: (app: JupyterFrontEnd, notebookTracker: INotebookTracker) => {\n console.log('JupyterLab extension kernel-checkpoint is activated!');\n\n app.commands.addCommand(COMMAND_ID, {\n label: 'Saving Points',\n caption: 'Manage kernel checkpoints',\n execute: async () => {\n const panel = notebookTracker.currentWidget;\n if (!panel) {\n return;\n }\n\n const sessionContext = panel.sessionContext;\n await sessionContext.ready;\n\n let config;\n try {\n config = await CheckpointAPI.getConfig();\n } catch (err) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Failed to load checkpoint configuration. Ensure CHECKPOINT_API_URL is set.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n if (!config.namespace) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Namespace not configured. Set CHECKPOINT_NAMESPACE environment variable or deploy in Kubernetes.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernel = sessionContext.session?.kernel;\n if (!kernel) {\n await showDialog({\n title: 'No Kernel',\n body: 'No kernel is connected. Please start a kernel first.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernelId = kernel.id;\n const kernelSpecName = kernel.name || 'python_kubernetes';\n\n const onRestore = async (checkpointName: string): Promise<void> => {\n const settings = ServerConnection.makeSettings();\n const kernelUrl = URLExt.join(settings.baseUrl, 'api', 'kernels');\n\n const response = await ServerConnection.makeRequest(\n kernelUrl,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: kernelSpecName,\n env: {\n KERNEL_CHECKPOINT_NAME: checkpointName\n }\n })\n },\n settings\n );\n\n if (!response.ok) {\n const errText = await response.text();\n throw new Error(`Failed to create restored kernel: ${errText}`);\n }\n\n const kernelData = await response.json();\n await sessionContext.changeKernel({ id: kernelData.id });\n };\n\n const body = new CheckpointDialogBody({\n namespace: config.namespace,\n kernelId,\n kernelSpecName,\n onRestore\n });\n\n await showDialog({\n title: 'Kernel Checkpoints',\n body,\n buttons: [Dialog.cancelButton({ label: 'Close' })]\n });\n\n body.dispose();\n }\n });\n\n // Inject a toolbar button into every notebook panel\n notebookTracker.widgetAdded.connect(\n (_sender: INotebookTracker, panel: NotebookPanel) => {\n const button = new ToolbarButton({\n label: 'Saving Points',\n tooltip: 'Open kernel checkpoint manager',\n onClick: () => {\n app.commands.execute(COMMAND_ID);\n }\n });\n panel.toolbar.insertItem(10, 'kernel-checkpoint', button);\n }\n );\n }\n};\n\nexport default plugin;\n"],"names":[],"sourceRoot":""}
File without changes
File without changes