nebula-notebook 0.1.1 → 0.2.0

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 (78) hide show
  1. package/README.md +90 -11
  2. package/dist/assets/errorwidget-C4r2j2DQ.js +5 -0
  3. package/dist/assets/fa-brands-400-CEJbCg16.woff +0 -0
  4. package/dist/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  5. package/dist/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  6. package/dist/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  7. package/dist/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  8. package/dist/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  9. package/dist/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  10. package/dist/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  11. package/dist/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  12. package/dist/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  13. package/dist/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  14. package/dist/assets/fa-solid-900-B6Axprfb.eot +0 -0
  15. package/dist/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  16. package/dist/assets/fa-solid-900-DOXgCApm.woff +0 -0
  17. package/dist/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  18. package/dist/assets/index-7-YBurka.js +716 -0
  19. package/dist/assets/index-BtWv4MIT.css +7 -0
  20. package/dist/assets/index-CFBUnxSZ.css +32 -0
  21. package/dist/assets/index-CsHoPQy-.js +1 -0
  22. package/dist/assets/index-D5w21_Z8.js +81 -0
  23. package/dist/assets/index-Day3QcNs.js +1 -0
  24. package/dist/assets/services-shim-D6p_A67v.js +33 -0
  25. package/dist/assets/viewlist-uomDf7I7.js +1 -0
  26. package/dist/assets/widgets-X7J3NxEn.css +1 -0
  27. package/dist/index.html +2 -2
  28. package/node-server/dist/cluster/client-registration.js +3 -0
  29. package/node-server/dist/cluster/kernel-proxy.js +24 -9
  30. package/node-server/dist/cluster/server-registry.d.ts +8 -0
  31. package/node-server/dist/cluster/server-registry.js +31 -7
  32. package/node-server/dist/fs/fs-service.d.ts +55 -7
  33. package/node-server/dist/fs/fs-service.js +489 -80
  34. package/node-server/dist/fs/notebook-formats/percent.d.ts +25 -0
  35. package/node-server/dist/fs/notebook-formats/percent.js +286 -0
  36. package/node-server/dist/fs/notebook-formats/qmd.d.ts +29 -0
  37. package/node-server/dist/fs/notebook-formats/qmd.js +307 -0
  38. package/node-server/dist/fs/notebook-formats/registry.d.ts +12 -0
  39. package/node-server/dist/fs/notebook-formats/registry.js +77 -0
  40. package/node-server/dist/fs/notebook-formats/types.d.ts +37 -0
  41. package/node-server/dist/fs/notebook-formats/types.js +13 -0
  42. package/node-server/dist/idle-exit.d.ts +52 -0
  43. package/node-server/dist/idle-exit.js +83 -0
  44. package/node-server/dist/index.js +129 -6
  45. package/node-server/dist/kernel/kernel-service.d.ts +113 -2
  46. package/node-server/dist/kernel/kernel-service.js +762 -60
  47. package/node-server/dist/notebook/headless-handler.d.ts +2 -0
  48. package/node-server/dist/notebook/headless-handler.js +70 -24
  49. package/node-server/dist/notebook/operation-router.js +7 -2
  50. package/node-server/dist/notebook/undoRedoManager.d.ts +4 -1
  51. package/node-server/dist/notebook/undoRedoManager.js +10 -2
  52. package/node-server/dist/output/display-data.js +2 -0
  53. package/node-server/dist/routes/cluster.js +2 -2
  54. package/node-server/dist/routes/compute.d.ts +8 -0
  55. package/node-server/dist/routes/compute.js +136 -0
  56. package/node-server/dist/routes/fs.js +2 -2
  57. package/node-server/dist/routes/kernel.js +111 -1
  58. package/node-server/dist/routes/notebook.js +29 -1
  59. package/node-server/dist/scheduler/allocation-service.d.ts +43 -0
  60. package/node-server/dist/scheduler/allocation-service.js +169 -0
  61. package/node-server/dist/scheduler/job-template.d.ts +30 -0
  62. package/node-server/dist/scheduler/job-template.js +85 -0
  63. package/node-server/dist/scheduler/mock-scheduler.d.ts +30 -0
  64. package/node-server/dist/scheduler/mock-scheduler.js +121 -0
  65. package/node-server/dist/scheduler/slurm-scheduler.d.ts +31 -0
  66. package/node-server/dist/scheduler/slurm-scheduler.js +393 -0
  67. package/node-server/dist/scheduler/types.d.ts +117 -0
  68. package/node-server/dist/scheduler/types.js +8 -0
  69. package/node-server/dist/scheduler/util.d.ts +7 -0
  70. package/node-server/dist/scheduler/util.js +20 -0
  71. package/node-server/dist/terminal/pty-manager.js +8 -0
  72. package/node-server/dist/terminal/server.js +43 -2
  73. package/node-server/dist/update-check.d.ts +20 -0
  74. package/node-server/dist/update-check.js +114 -0
  75. package/node-server/package.json +1 -0
  76. package/package.json +2 -1
  77. package/dist/assets/index-BvrHu37J.js +0 -648
  78. package/dist/assets/index-Dfj_xsKU.css +0 -32
@@ -0,0 +1 @@
1
+ class c{constructor(e,s,h){this.initialize(e,s,h)}initialize(e,s,h){this._handler_context=h||this,this._models=[],this.views=[],this._create_view=e,this._remove_view=s||function(t){t.remove()}}update(e,s,h,t){const v=h||this._remove_view,n=s||this._create_view;t=t||this._handler_context;let i=0;for(;i<e.length&&!(i>=this._models.length||e[i]!==this._models[i]);i++);const r=i,o=this.views.splice(r,this.views.length-r);for(let l=0;l<o.length;l++)o[l].then(function(_){v.call(t,_)});for(;i<e.length;i++)this.views.push(Promise.resolve(n.call(t,e[i],i)));return this._models=e.slice(),Promise.all(this.views)}remove(){return Promise.all(this.views).then(e=>{e.forEach(s=>this._remove_view.call(this._handler_context,s)),this.views=[],this._models=[]})}dispose(){this.views=null,this._models=null}}export{c as V};
@@ -0,0 +1 @@
1
+ :root{--md-red-50: #ffebee;--md-red-100: #ffcdd2;--md-red-200: #ef9a9a;--md-red-300: #e57373;--md-red-400: #ef5350;--md-red-500: #f44336;--md-red-600: #e53935;--md-red-700: #d32f2f;--md-red-800: #c62828;--md-red-900: #b71c1c;--md-red-A100: #ff8a80;--md-red-A200: #ff5252;--md-red-A400: #ff1744;--md-red-A700: #d50000;--md-pink-50: #fce4ec;--md-pink-100: #f8bbd0;--md-pink-200: #f48fb1;--md-pink-300: #f06292;--md-pink-400: #ec407a;--md-pink-500: #e91e63;--md-pink-600: #d81b60;--md-pink-700: #c2185b;--md-pink-800: #ad1457;--md-pink-900: #880e4f;--md-pink-A100: #ff80ab;--md-pink-A200: #ff4081;--md-pink-A400: #f50057;--md-pink-A700: #c51162;--md-purple-50: #f3e5f5;--md-purple-100: #e1bee7;--md-purple-200: #ce93d8;--md-purple-300: #ba68c8;--md-purple-400: #ab47bc;--md-purple-500: #9c27b0;--md-purple-600: #8e24aa;--md-purple-700: #7b1fa2;--md-purple-800: #6a1b9a;--md-purple-900: #4a148c;--md-purple-A100: #ea80fc;--md-purple-A200: #e040fb;--md-purple-A400: #d500f9;--md-purple-A700: #aa00ff;--md-deep-purple-50: #ede7f6;--md-deep-purple-100: #d1c4e9;--md-deep-purple-200: #b39ddb;--md-deep-purple-300: #9575cd;--md-deep-purple-400: #7e57c2;--md-deep-purple-500: #673ab7;--md-deep-purple-600: #5e35b1;--md-deep-purple-700: #512da8;--md-deep-purple-800: #4527a0;--md-deep-purple-900: #311b92;--md-deep-purple-A100: #b388ff;--md-deep-purple-A200: #7c4dff;--md-deep-purple-A400: #651fff;--md-deep-purple-A700: #6200ea;--md-indigo-50: #e8eaf6;--md-indigo-100: #c5cae9;--md-indigo-200: #9fa8da;--md-indigo-300: #7986cb;--md-indigo-400: #5c6bc0;--md-indigo-500: #3f51b5;--md-indigo-600: #3949ab;--md-indigo-700: #303f9f;--md-indigo-800: #283593;--md-indigo-900: #1a237e;--md-indigo-A100: #8c9eff;--md-indigo-A200: #536dfe;--md-indigo-A400: #3d5afe;--md-indigo-A700: #304ffe;--md-blue-50: #e3f2fd;--md-blue-100: #bbdefb;--md-blue-200: #90caf9;--md-blue-300: #64b5f6;--md-blue-400: #42a5f5;--md-blue-500: #2196f3;--md-blue-600: #1e88e5;--md-blue-700: #1976d2;--md-blue-800: #1565c0;--md-blue-900: #0d47a1;--md-blue-A100: #82b1ff;--md-blue-A200: #448aff;--md-blue-A400: #2979ff;--md-blue-A700: #2962ff;--md-light-blue-50: #e1f5fe;--md-light-blue-100: #b3e5fc;--md-light-blue-200: #81d4fa;--md-light-blue-300: #4fc3f7;--md-light-blue-400: #29b6f6;--md-light-blue-500: #03a9f4;--md-light-blue-600: #039be5;--md-light-blue-700: #0288d1;--md-light-blue-800: #0277bd;--md-light-blue-900: #01579b;--md-light-blue-A100: #80d8ff;--md-light-blue-A200: #40c4ff;--md-light-blue-A400: #00b0ff;--md-light-blue-A700: #0091ea;--md-cyan-50: #e0f7fa;--md-cyan-100: #b2ebf2;--md-cyan-200: #80deea;--md-cyan-300: #4dd0e1;--md-cyan-400: #26c6da;--md-cyan-500: #00bcd4;--md-cyan-600: #00acc1;--md-cyan-700: #0097a7;--md-cyan-800: #00838f;--md-cyan-900: #006064;--md-cyan-A100: #84ffff;--md-cyan-A200: #18ffff;--md-cyan-A400: #00e5ff;--md-cyan-A700: #00b8d4;--md-teal-50: #e0f2f1;--md-teal-100: #b2dfdb;--md-teal-200: #80cbc4;--md-teal-300: #4db6ac;--md-teal-400: #26a69a;--md-teal-500: #009688;--md-teal-600: #00897b;--md-teal-700: #00796b;--md-teal-800: #00695c;--md-teal-900: #004d40;--md-teal-A100: #a7ffeb;--md-teal-A200: #64ffda;--md-teal-A400: #1de9b6;--md-teal-A700: #00bfa5;--md-green-50: #e8f5e9;--md-green-100: #c8e6c9;--md-green-200: #a5d6a7;--md-green-300: #81c784;--md-green-400: #66bb6a;--md-green-500: #4caf50;--md-green-600: #43a047;--md-green-700: #388e3c;--md-green-800: #2e7d32;--md-green-900: #1b5e20;--md-green-A100: #b9f6ca;--md-green-A200: #69f0ae;--md-green-A400: #00e676;--md-green-A700: #00c853;--md-light-green-50: #f1f8e9;--md-light-green-100: #dcedc8;--md-light-green-200: #c5e1a5;--md-light-green-300: #aed581;--md-light-green-400: #9ccc65;--md-light-green-500: #8bc34a;--md-light-green-600: #7cb342;--md-light-green-700: #689f38;--md-light-green-800: #558b2f;--md-light-green-900: #33691e;--md-light-green-A100: #ccff90;--md-light-green-A200: #b2ff59;--md-light-green-A400: #76ff03;--md-light-green-A700: #64dd17;--md-lime-50: #f9fbe7;--md-lime-100: #f0f4c3;--md-lime-200: #e6ee9c;--md-lime-300: #dce775;--md-lime-400: #d4e157;--md-lime-500: #cddc39;--md-lime-600: #c0ca33;--md-lime-700: #afb42b;--md-lime-800: #9e9d24;--md-lime-900: #827717;--md-lime-A100: #f4ff81;--md-lime-A200: #eeff41;--md-lime-A400: #c6ff00;--md-lime-A700: #aeea00;--md-yellow-50: #fffde7;--md-yellow-100: #fff9c4;--md-yellow-200: #fff59d;--md-yellow-300: #fff176;--md-yellow-400: #ffee58;--md-yellow-500: #ffeb3b;--md-yellow-600: #fdd835;--md-yellow-700: #fbc02d;--md-yellow-800: #f9a825;--md-yellow-900: #f57f17;--md-yellow-A100: #ffff8d;--md-yellow-A200: #ffff00;--md-yellow-A400: #ffea00;--md-yellow-A700: #ffd600;--md-amber-50: #fff8e1;--md-amber-100: #ffecb3;--md-amber-200: #ffe082;--md-amber-300: #ffd54f;--md-amber-400: #ffca28;--md-amber-500: #ffc107;--md-amber-600: #ffb300;--md-amber-700: #ffa000;--md-amber-800: #ff8f00;--md-amber-900: #ff6f00;--md-amber-A100: #ffe57f;--md-amber-A200: #ffd740;--md-amber-A400: #ffc400;--md-amber-A700: #ffab00;--md-orange-50: #fff3e0;--md-orange-100: #ffe0b2;--md-orange-200: #ffcc80;--md-orange-300: #ffb74d;--md-orange-400: #ffa726;--md-orange-500: #ff9800;--md-orange-600: #fb8c00;--md-orange-700: #f57c00;--md-orange-800: #ef6c00;--md-orange-900: #e65100;--md-orange-A100: #ffd180;--md-orange-A200: #ffab40;--md-orange-A400: #ff9100;--md-orange-A700: #ff6d00;--md-deep-orange-50: #fbe9e7;--md-deep-orange-100: #ffccbc;--md-deep-orange-200: #ffab91;--md-deep-orange-300: #ff8a65;--md-deep-orange-400: #ff7043;--md-deep-orange-500: #ff5722;--md-deep-orange-600: #f4511e;--md-deep-orange-700: #e64a19;--md-deep-orange-800: #d84315;--md-deep-orange-900: #bf360c;--md-deep-orange-A100: #ff9e80;--md-deep-orange-A200: #ff6e40;--md-deep-orange-A400: #ff3d00;--md-deep-orange-A700: #dd2c00;--md-brown-50: #efebe9;--md-brown-100: #d7ccc8;--md-brown-200: #bcaaa4;--md-brown-300: #a1887f;--md-brown-400: #8d6e63;--md-brown-500: #795548;--md-brown-600: #6d4c41;--md-brown-700: #5d4037;--md-brown-800: #4e342e;--md-brown-900: #3e2723;--md-grey-50: #fafafa;--md-grey-100: #f5f5f5;--md-grey-200: #eeeeee;--md-grey-300: #e0e0e0;--md-grey-400: #bdbdbd;--md-grey-500: #9e9e9e;--md-grey-600: #757575;--md-grey-700: #616161;--md-grey-800: #424242;--md-grey-900: #212121;--md-blue-grey-50: #eceff1;--md-blue-grey-100: #cfd8dc;--md-blue-grey-200: #b0bec5;--md-blue-grey-300: #90a4ae;--md-blue-grey-400: #78909c;--md-blue-grey-500: #607d8b;--md-blue-grey-600: #546e7a;--md-blue-grey-700: #455a64;--md-blue-grey-800: #37474f;--md-blue-grey-900: #263238}:root{--jp-icon-search: none;--jp-ui-select-caret: none}:root{--jp-border-width: 1px;--jp-border-color0: var(--md-grey-700);--jp-border-color1: var(--md-grey-500);--jp-border-color2: var(--md-grey-300);--jp-border-color3: var(--md-grey-100);--jp-ui-icon-font-size: 14px;--jp-ui-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;--jp-ui-font-color0: rgba(0, 0, 0, 1);--jp-ui-font-color1: rgba(0, 0, 0, .8);--jp-ui-font-color2: rgba(0, 0, 0, .5);--jp-ui-font-color3: rgba(0, 0, 0, .3);--jp-ui-inverse-font-color0: rgba(255, 255, 255, 1);--jp-ui-inverse-font-color1: rgba(255, 255, 255, 1);--jp-ui-inverse-font-color2: rgba(255, 255, 255, .7);--jp-ui-inverse-font-color3: rgba(255, 255, 255, .5);--jp-content-font-size: 13px;--jp-content-line-height: 1.5;--jp-content-font-color0: black;--jp-content-font-color1: black;--jp-content-font-color2: var(--md-grey-700);--jp-content-font-color3: var(--md-grey-500);--jp-ui-font-scale-factor: 1.2;--jp-ui-font-size0: calc( var(--jp-ui-font-size1) / var(--jp-ui-font-scale-factor) );--jp-ui-font-size1: 13px;--jp-ui-font-size2: calc( var(--jp-ui-font-size1) * var(--jp-ui-font-scale-factor) );--jp-ui-font-size3: calc( var(--jp-ui-font-size2) * var(--jp-ui-font-scale-factor) );--jp-code-font-size: 13px;--jp-code-line-height: 1.307;--jp-code-padding: 5px;--jp-code-font-family: monospace;--jp-layout-color0: white;--jp-layout-color1: white;--jp-layout-color2: var(--md-grey-200);--jp-layout-color3: var(--md-grey-400);--jp-brand-color0: var(--md-blue-700);--jp-brand-color1: var(--md-blue-500);--jp-brand-color2: var(--md-blue-300);--jp-brand-color3: var(--md-blue-100);--jp-accent-color0: var(--md-green-700);--jp-accent-color1: var(--md-green-500);--jp-accent-color2: var(--md-green-300);--jp-accent-color3: var(--md-green-100);--jp-warn-color0: var(--md-orange-700);--jp-warn-color1: var(--md-orange-500);--jp-warn-color2: var(--md-orange-300);--jp-warn-color3: var(--md-orange-100);--jp-error-color0: var(--md-red-700);--jp-error-color1: var(--md-red-500);--jp-error-color2: var(--md-red-300);--jp-error-color3: var(--md-red-100);--jp-success-color0: var(--md-green-700);--jp-success-color1: var(--md-green-500);--jp-success-color2: var(--md-green-300);--jp-success-color3: var(--md-green-100);--jp-info-color0: var(--md-cyan-700);--jp-info-color1: var(--md-cyan-500);--jp-info-color2: var(--md-cyan-300);--jp-info-color3: var(--md-cyan-100);--jp-cell-padding: 5px;--jp-cell-editor-background: #f7f7f7;--jp-cell-editor-border-color: #cfcfcf;--jp-cell-editor-background-edit: var(--jp-ui-layout-color1);--jp-cell-editor-border-color-edit: var(--jp-brand-color1);--jp-cell-prompt-width: 100px;--jp-cell-prompt-font-family: "Roboto Mono", monospace;--jp-cell-prompt-letter-spacing: 0px;--jp-cell-prompt-opacity: 1;--jp-cell-prompt-opacity-not-active: .4;--jp-cell-prompt-font-color-not-active: var(--md-grey-700);--jp-cell-inprompt-font-color: #307fc1;--jp-cell-outprompt-font-color: #bf5b3d;--jp-notebook-padding: 10px;--jp-notebook-scroll-padding: 100px;--jp-console-background: var(--md-grey-100);--jp-toolbar-border-color: var(--md-grey-400);--jp-toolbar-micro-height: 8px;--jp-toolbar-background: var(--jp-layout-color0);--jp-toolbar-box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, .24);--jp-toolbar-header-margin: 4px 4px 0px 4px;--jp-toolbar-active-background: var(--md-grey-300)}.jupyter-widgets.widget-tab>.p-TabBar,.jupyter-widgets.jupyter-widget-tab>.p-TabBar,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar{display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jupyter-widgets.widget-tab>.p-TabBar[data-orientation=horizontal],.jupyter-widgets.jupyter-widget-tab>.p-TabBar[data-orientation=horizontal],.jupyter-widgets.jupyter-widget-tab>.lm-TabBar[data-orientation=horizontal]{flex-direction:row}.jupyter-widgets.widget-tab>.p-TabBar[data-orientation=vertical],.jupyter-widgets.jupyter-widget-tab>.p-TabBar[data-orientation=vertical],.jupyter-widgets.jupyter-widget-tab>.lm-TabBar[data-orientation=vertical]{flex-direction:column}.jupyter-widgets.widget-tab>.p-TabBar>.p-TabBar-content,.jupyter-widgets.jupyter-widget-tab>.p-TabBar>.p-TabBar-content,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar>.lm-TabBar-content{margin:0;padding:0;display:flex;flex:1 1 auto;list-style-type:none}.jupyter-widgets.widget-tab>.p-TabBar[data-orientation=horizontal]>.p-TabBar-content,.jupyter-widgets.jupyter-widget-tab>.p-TabBar[data-orientation=horizontal]>.p-TabBar-content,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar[data-orientation=horizontal]>.lm-TabBar-content{flex-direction:row}.jupyter-widgets.widget-tab>.p-TabBar[data-orientation=vertical]>.p-TabBar-content,.jupyter-widgets.jupyter-widget-tab>.p-TabBar[data-orientation=vertical]>.p-TabBar-content,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar[data-orientation=vertical]>.lm-TabBar-content{flex-direction:column}.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tab,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tab,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tab{display:flex;flex-direction:row;box-sizing:border-box;overflow:hidden}.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tabIcon,.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tabCloseIcon,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tabIcon,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tabCloseIcon,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tabIcon,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tabCloseIcon{flex:0 0 auto}.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tabLabel,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tabLabel,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tabLabel{flex:1 1 auto;overflow:hidden;white-space:nowrap}.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tab.p-mod-hidden,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tab.p-mod-hidden,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tab.lm-mod-hidden{display:none!important}.jupyter-widgets.widget-tab>.p-TabBar.p-mod-dragging .p-TabBar-tab,.jupyter-widgets.jupyter-widget-tab>.p-TabBar.p-mod-dragging .p-TabBar-tab,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar.lm-mod-dragging .lm-TabBar-tab{position:relative}.jupyter-widgets.widget-tab>.p-TabBar.p-mod-dragging[data-orientation=horizontal] .p-TabBar-tab,.jupyter-widgets.jupyter-widget-tab>.p-TabBar.p-mod-dragging[data-orientation=horizontal] .p-TabBar-tab,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar.lm-mod-dragging[data-orientation=horizontal] .lm-TabBar-tab{left:0;transition:left .15s ease}.jupyter-widgets.widget-tab>.p-TabBar.p-mod-dragging[data-orientation=vertical] .p-TabBar-tab,.jupyter-widgets.jupyter-widget-tab>.p-TabBar.p-mod-dragging[data-orientation=vertical] .p-TabBar-tab,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar.lm-mod-dragging[data-orientation=vertical] .lm-TabBar-tab{top:0;transition:top .15s ease}.jupyter-widgets.widget-tab>.p-TabBar.p-mod-dragging .p-TabBar-tab.p-mod-dragging,.jupyter-widgets.jupyter-widget-tab>.p-TabBar.p-mod-dragging .p-TabBar-tab.p-mod-dragging,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar.lm-mod-dragging .lm-TabBar-tab.lm-mod-dragging{transition:none}.widget-slider .noUi-target,.jupyter-widget-slider .noUi-target,.widget-slider .noUi-target *,.jupyter-widget-slider .noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.widget-slider .noUi-target,.jupyter-widget-slider .noUi-target{position:relative}.widget-slider .noUi-base,.jupyter-widget-slider .noUi-base,.widget-slider .noUi-connects,.jupyter-widget-slider .noUi-connects{width:100%;height:100%;position:relative;z-index:1}.widget-slider .noUi-connects,.jupyter-widget-slider .noUi-connects{overflow:hidden;z-index:0}.widget-slider .noUi-connect,.jupyter-widget-slider .noUi-connect,.widget-slider .noUi-origin,.jupyter-widget-slider .noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.widget-slider .noUi-connect,.jupyter-widget-slider .noUi-connect{height:100%;width:100%}.widget-slider .noUi-origin,.jupyter-widget-slider .noUi-origin{height:10%;width:10%}.widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-origin,.jupyter-widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.widget-slider .noUi-vertical .noUi-origin,.jupyter-widget-slider .noUi-vertical .noUi-origin{width:0}.widget-slider .noUi-horizontal .noUi-origin,.jupyter-widget-slider .noUi-horizontal .noUi-origin{height:0}.widget-slider .noUi-handle,.jupyter-widget-slider .noUi-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.widget-slider .noUi-touch-area,.jupyter-widget-slider .noUi-touch-area{height:100%;width:100%}.widget-slider .noUi-state-tap .noUi-connect,.jupyter-widget-slider .noUi-state-tap .noUi-connect,.widget-slider .noUi-state-tap .noUi-origin,.jupyter-widget-slider .noUi-state-tap .noUi-origin{-webkit-transition:transform .3s;transition:transform .3s}.widget-slider .noUi-state-drag *,.jupyter-widget-slider .noUi-state-drag *{cursor:inherit!important}.widget-slider .noUi-horizontal,.jupyter-widget-slider .noUi-horizontal{height:18px}.widget-slider .noUi-horizontal .noUi-handle,.jupyter-widget-slider .noUi-horizontal .noUi-handle{width:34px;height:28px;right:-17px;top:-6px}.widget-slider .noUi-vertical,.jupyter-widget-slider .noUi-vertical{width:18px}.widget-slider .noUi-vertical .noUi-handle,.jupyter-widget-slider .noUi-vertical .noUi-handle{width:28px;height:34px;right:-6px;top:-17px}.widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-handle,.jupyter-widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.widget-slider .noUi-target,.jupyter-widget-slider .noUi-target{background:#fafafa;border-radius:4px;border:1px solid #D3D3D3;box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #bbb}.widget-slider .noUi-connects,.jupyter-widget-slider .noUi-connects{border-radius:3px}.widget-slider .noUi-connect,.jupyter-widget-slider .noUi-connect{background:#3fb8af}.widget-slider .noUi-draggable,.jupyter-widget-slider .noUi-draggable{cursor:ew-resize}.widget-slider .noUi-vertical .noUi-draggable,.jupyter-widget-slider .noUi-vertical .noUi-draggable{cursor:ns-resize}.widget-slider .noUi-handle,.jupyter-widget-slider .noUi-handle{border:1px solid #D9D9D9;border-radius:3px;background:#fff;cursor:default;box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ebebeb,0 3px 6px -3px #bbb}.widget-slider .noUi-active,.jupyter-widget-slider .noUi-active{box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb}.widget-slider .noUi-handle:before,.jupyter-widget-slider .noUi-handle:before,.widget-slider .noUi-handle:after,.jupyter-widget-slider .noUi-handle:after{content:"";display:block;position:absolute;height:14px;width:1px;background:#e8e7e6;left:14px;top:6px}.widget-slider .noUi-handle:after,.jupyter-widget-slider .noUi-handle:after{left:17px}.widget-slider .noUi-vertical .noUi-handle:before,.jupyter-widget-slider .noUi-vertical .noUi-handle:before,.widget-slider .noUi-vertical .noUi-handle:after,.jupyter-widget-slider .noUi-vertical .noUi-handle:after{width:14px;height:1px;left:6px;top:14px}.widget-slider .noUi-vertical .noUi-handle:after,.jupyter-widget-slider .noUi-vertical .noUi-handle:after{top:17px}.widget-slider [disabled] .noUi-connect,.jupyter-widget-slider [disabled] .noUi-connect{background:#b8b8b8}.widget-slider [disabled].noUi-target,.jupyter-widget-slider [disabled].noUi-target,.widget-slider [disabled].noUi-handle,.jupyter-widget-slider [disabled].noUi-handle,.widget-slider [disabled] .noUi-handle,.jupyter-widget-slider [disabled] .noUi-handle{cursor:not-allowed}.widget-slider .noUi-pips,.jupyter-widget-slider .noUi-pips,.widget-slider .noUi-pips *,.jupyter-widget-slider .noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.widget-slider .noUi-pips,.jupyter-widget-slider .noUi-pips{position:absolute;color:#999}.widget-slider .noUi-value,.jupyter-widget-slider .noUi-value{position:absolute;white-space:nowrap;text-align:center}.widget-slider .noUi-value-sub,.jupyter-widget-slider .noUi-value-sub{color:#ccc;font-size:10px}.widget-slider .noUi-marker,.jupyter-widget-slider .noUi-marker{position:absolute;background:#ccc}.widget-slider .noUi-marker-sub,.jupyter-widget-slider .noUi-marker-sub,.widget-slider .noUi-marker-large,.jupyter-widget-slider .noUi-marker-large{background:#aaa}.widget-slider .noUi-pips-horizontal,.jupyter-widget-slider .noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.widget-slider .noUi-value-horizontal,.jupyter-widget-slider .noUi-value-horizontal{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.noUi-rtl .widget-slider .noUi-value-horizontal,.noUi-rtl .jupyter-widget-slider .noUi-value-horizontal{-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.widget-slider .noUi-marker-horizontal.noUi-marker,.jupyter-widget-slider .noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.widget-slider .noUi-marker-horizontal.noUi-marker-sub,.jupyter-widget-slider .noUi-marker-horizontal.noUi-marker-sub{height:10px}.widget-slider .noUi-marker-horizontal.noUi-marker-large,.jupyter-widget-slider .noUi-marker-horizontal.noUi-marker-large{height:15px}.widget-slider .noUi-pips-vertical,.jupyter-widget-slider .noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.widget-slider .noUi-value-vertical,.jupyter-widget-slider .noUi-value-vertical{-webkit-transform:translate(0,-50%);transform:translateY(-50%);padding-left:25px}.noUi-rtl .widget-slider .noUi-value-vertical,.noUi-rtl .jupyter-widget-slider .noUi-value-vertical{-webkit-transform:translate(0,50%);transform:translateY(50%)}.widget-slider .noUi-marker-vertical.noUi-marker,.jupyter-widget-slider .noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.widget-slider .noUi-marker-vertical.noUi-marker-sub,.jupyter-widget-slider .noUi-marker-vertical.noUi-marker-sub{width:10px}.widget-slider .noUi-marker-vertical.noUi-marker-large,.jupyter-widget-slider .noUi-marker-vertical.noUi-marker-large{width:15px}.widget-slider .noUi-tooltip,.jupyter-widget-slider .noUi-tooltip{display:block;position:absolute;border:1px solid #D9D9D9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.widget-slider .noUi-horizontal .noUi-tooltip,.jupyter-widget-slider .noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%);left:50%;bottom:120%}.widget-slider .noUi-vertical .noUi-tooltip,.jupyter-widget-slider .noUi-vertical .noUi-tooltip{-webkit-transform:translate(0,-50%);transform:translateY(-50%);top:50%;right:120%}.widget-slider .noUi-horizontal .noUi-origin>.noUi-tooltip,.jupyter-widget-slider .noUi-horizontal .noUi-origin>.noUi-tooltip{-webkit-transform:translate(50%,0);transform:translate(50%);left:auto;bottom:10px}.widget-slider .noUi-vertical .noUi-origin>.noUi-tooltip,.jupyter-widget-slider .noUi-vertical .noUi-origin>.noUi-tooltip{-webkit-transform:translate(0,-18px);transform:translateY(-18px);top:auto;right:28px}.widget-slider .noUi-connect,.jupyter-widget-slider .noUi-connect{background:#2196f3}.widget-slider .noUi-horizontal,.jupyter-widget-slider .noUi-horizontal{height:var(--jp-widgets-slider-track-thickness)}.widget-slider .noUi-vertical,.jupyter-widget-slider .noUi-vertical{width:var(--jp-widgets-slider-track-thickness);height:100%}.widget-slider .noUi-horizontal .noUi-handle,.jupyter-widget-slider .noUi-horizontal .noUi-handle{width:var(--jp-widgets-slider-handle-size);height:var(--jp-widgets-slider-handle-size);border-radius:50%;top:calc((var(--jp-widgets-slider-track-thickness) - var(--jp-widgets-slider-handle-size)) / 2);right:calc(var(--jp-widgets-slider-handle-size) / -2)}.widget-slider .noUi-vertical .noUi-handle,.jupyter-widget-slider .noUi-vertical .noUi-handle{height:var(--jp-widgets-slider-handle-size);width:var(--jp-widgets-slider-handle-size);border-radius:50%;right:calc((var(--jp-widgets-slider-handle-size) - var(--jp-widgets-slider-track-thickness)) / -2);top:calc(var(--jp-widgets-slider-handle-size) / -2)}.widget-slider .noUi-handle:after,.jupyter-widget-slider .noUi-handle:after{content:none}.widget-slider .noUi-handle:before,.jupyter-widget-slider .noUi-handle:before{content:none}.widget-slider .noUi-target,.jupyter-widget-slider .noUi-target{background:#fafafa;border-radius:4px;border:1px}.widget-slider .ui-slider,.jupyter-widget-slider .ui-slider{border:var(--jp-widgets-slider-border-width) solid var(--jp-layout-color3);background:var(--jp-layout-color3);box-sizing:border-box;position:relative;border-radius:0}.widget-slider .noUi-handle,.jupyter-widget-slider .noUi-handle{width:var(--jp-widgets-slider-handle-size);border:1px solid #d9d9d9;border-radius:3px;background:#fff;cursor:default;box-shadow:none;outline:none}.widget-slider .noUi-target:not([disabled]) .noUi-handle:hover,.jupyter-widget-slider .noUi-target:not([disabled]) .noUi-handle:hover,.widget-slider .noUi-target:not([disabled]) .noUi-handle:focus,.jupyter-widget-slider .noUi-target:not([disabled]) .noUi-handle:focus{background-color:var(--jp-widgets-slider-active-handle-color);border:var(--jp-widgets-slider-border-width) solid var(--jp-widgets-slider-active-handle-color)}.widget-slider [disabled].noUi-target,.jupyter-widget-slider [disabled].noUi-target{opacity:.35}.widget-slider .noUi-connects,.jupyter-widget-slider .noUi-connects{overflow:visible;z-index:0;background:var(--jp-layout-color3)}.widget-slider .noUi-vertical .noUi-connect,.jupyter-widget-slider .noUi-vertical .noUi-connect{width:calc(100% + 2px);right:-1px}.widget-slider .noUi-horizontal .noUi-connect,.jupyter-widget-slider .noUi-horizontal .noUi-connect{height:calc(100% + 2px);top:-1px}:root{--jp-widgets-color: var(--jp-content-font-color1);--jp-widgets-label-color: var(--jp-widgets-color);--jp-widgets-readout-color: var(--jp-widgets-color);--jp-widgets-font-size: var(--jp-ui-font-size1);--jp-widgets-margin: 2px;--jp-widgets-inline-height: 28px;--jp-widgets-inline-width: 300px;--jp-widgets-inline-width-short: calc( var(--jp-widgets-inline-width) / 2 - var(--jp-widgets-margin) );--jp-widgets-inline-width-tiny: calc( var(--jp-widgets-inline-width-short) / 2 - var(--jp-widgets-margin) );--jp-widgets-inline-margin: 4px;--jp-widgets-inline-label-width: 80px;--jp-widgets-border-width: var(--jp-border-width);--jp-widgets-vertical-height: 200px;--jp-widgets-horizontal-tab-height: 24px;--jp-widgets-horizontal-tab-width: 144px;--jp-widgets-horizontal-tab-top-border: 2px;--jp-widgets-progress-thickness: 20px;--jp-widgets-container-padding: 15px;--jp-widgets-input-padding: 4px;--jp-widgets-radio-item-height-adjustment: 8px;--jp-widgets-radio-item-height: calc( var(--jp-widgets-inline-height) - var(--jp-widgets-radio-item-height-adjustment) );--jp-widgets-slider-track-thickness: 4px;--jp-widgets-slider-border-width: var(--jp-widgets-border-width);--jp-widgets-slider-handle-size: 16px;--jp-widgets-slider-handle-border-color: var(--jp-border-color1);--jp-widgets-slider-handle-background-color: var(--jp-layout-color1);--jp-widgets-slider-active-handle-color: var(--jp-brand-color1);--jp-widgets-menu-item-height: 24px;--jp-widgets-dropdown-arrow: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAxOCAxOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTggMTg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDpub25lO30KPC9zdHlsZT4KPHBhdGggZD0iTTUuMiw1LjlMOSw5LjdsMy44LTMuOGwxLjIsMS4ybC00LjksNWwtNC45LTVMNS4yLDUuOXoiLz4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTAtMC42aDE4djE4SDBWLTAuNnoiLz4KPC9zdmc+Cg);--jp-widgets-input-color: var(--jp-ui-font-color1);--jp-widgets-input-background-color: var(--jp-layout-color1);--jp-widgets-input-border-color: var(--jp-border-color1);--jp-widgets-input-focus-border-color: var(--jp-brand-color2);--jp-widgets-input-border-width: var(--jp-widgets-border-width);--jp-widgets-disabled-opacity: .6;--md-shadow-key-umbra-opacity: .2;--md-shadow-key-penumbra-opacity: .14;--md-shadow-ambient-shadow-opacity: .12}.jupyter-widgets{margin:var(--jp-widgets-margin);box-sizing:border-box;color:var(--jp-widgets-color);overflow:visible}.jp-Output-result>.jupyter-widgets{margin-left:0;margin-right:0}.widget-inline-hbox,.jupyter-widget-inline-hbox{box-sizing:border-box;display:flex;flex-direction:row;align-items:baseline}.widget-inline-vbox,.jupyter-widget-inline-vbox{box-sizing:border-box;display:flex;flex-direction:column;align-items:center}.widget-box,.jupyter-widget-box{box-sizing:border-box;display:flex;margin:0;overflow:auto}.widget-gridbox,.jupyter-widget-gridbox{box-sizing:border-box;display:grid;margin:0;overflow:auto}.widget-hbox,.jupyter-widget-hbox{flex-direction:row}.widget-vbox,.jupyter-widget-vbox{flex-direction:column}.jupyter-widget-tagsinput{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;overflow:auto;cursor:text}.jupyter-widget-tag{padding:0 10px;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;font-size:var(--jp-widgets-font-size);height:calc(var(--jp-widgets-inline-height) - 2px);border:0px solid;line-height:calc(var(--jp-widgets-inline-height) - 2px);box-shadow:none;color:var(--jp-ui-font-color1);background-color:var(--jp-layout-color2);border-color:var(--jp-border-color2);border:none;-webkit-user-select:none;user-select:none;cursor:grab;transition:margin-left .2s;margin:1px}.jupyter-widget-tag.mod-active{box-shadow:0 4px 5px rgba(0,0,0,var(--md-shadow-key-penumbra-opacity)),0 1px 10px rgba(0,0,0,var(--md-shadow-ambient-shadow-opacity)),0 2px 4px -1px rgba(0,0,0,var(--md-shadow-key-umbra-opacity));color:var(--jp-ui-font-color1);background-color:var(--jp-layout-color3)}.jupyter-widget-colortag{color:var(--jp-inverse-ui-font-color1)}.jupyter-widget-colortag.mod-active{color:var(--jp-inverse-ui-font-color0)}.jupyter-widget-taginput{color:var(--jp-ui-font-color0);background-color:var(--jp-layout-color0);cursor:text;text-align:left}.jupyter-widget-taginput:focus{outline:none}.jupyter-widget-tag-close{margin-left:var(--jp-widgets-inline-margin);padding:2px 0 2px 2px}.jupyter-widget-tag-close:hover{cursor:pointer}.jupyter-widget-tag.mod-primary{color:var(--jp-inverse-ui-font-color1);background-color:var(--jp-brand-color1)}.jupyter-widget-tag.mod-primary.mod-active{color:var(--jp-inverse-ui-font-color0);background-color:var(--jp-brand-color0)}.jupyter-widget-tag.mod-success{color:var(--jp-inverse-ui-font-color1);background-color:var(--jp-success-color1)}.jupyter-widget-tag.mod-success.mod-active{color:var(--jp-inverse-ui-font-color0);background-color:var(--jp-success-color0)}.jupyter-widget-tag.mod-info{color:var(--jp-inverse-ui-font-color1);background-color:var(--jp-info-color1)}.jupyter-widget-tag.mod-info.mod-active{color:var(--jp-inverse-ui-font-color0);background-color:var(--jp-info-color0)}.jupyter-widget-tag.mod-warning{color:var(--jp-inverse-ui-font-color1);background-color:var(--jp-warn-color1)}.jupyter-widget-tag.mod-warning.mod-active{color:var(--jp-inverse-ui-font-color0);background-color:var(--jp-warn-color0)}.jupyter-widget-tag.mod-danger{color:var(--jp-inverse-ui-font-color1);background-color:var(--jp-error-color1)}.jupyter-widget-tag.mod-danger.mod-active{color:var(--jp-inverse-ui-font-color0);background-color:var(--jp-error-color0)}.jupyter-button{padding:0 10px;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;font-size:var(--jp-widgets-font-size);cursor:pointer;height:var(--jp-widgets-inline-height);border:0px solid;line-height:var(--jp-widgets-inline-height);box-shadow:none;color:var(--jp-ui-font-color1);background-color:var(--jp-layout-color2);border-color:var(--jp-border-color2);border:none;-webkit-user-select:none;user-select:none}.jupyter-button i.fa{margin-right:var(--jp-widgets-inline-margin);pointer-events:none}.jupyter-button:empty:before{content:"​"}.jupyter-widgets.jupyter-button:disabled{opacity:var(--jp-widgets-disabled-opacity)}.jupyter-button i.fa.center{margin-right:0}.jupyter-button:hover:enabled,.jupyter-button:focus:enabled{box-shadow:0 2px 2px rgba(0,0,0,var(--md-shadow-key-penumbra-opacity)),0 3px 1px -2px rgba(0,0,0,var(--md-shadow-key-umbra-opacity)),0 1px 5px rgba(0,0,0,var(--md-shadow-ambient-shadow-opacity))}.jupyter-button:active,.jupyter-button.mod-active{box-shadow:0 4px 5px rgba(0,0,0,var(--md-shadow-key-penumbra-opacity)),0 1px 10px rgba(0,0,0,var(--md-shadow-ambient-shadow-opacity)),0 2px 4px -1px rgba(0,0,0,var(--md-shadow-key-umbra-opacity));color:var(--jp-ui-font-color1);background-color:var(--jp-layout-color3)}.jupyter-button:focus:enabled{outline:1px solid var(--jp-widgets-input-focus-border-color)}.jupyter-button.mod-primary{color:var(--jp-ui-inverse-font-color1);background-color:var(--jp-brand-color1)}.jupyter-button.mod-primary.mod-active,.jupyter-button.mod-primary:active{color:var(--jp-ui-inverse-font-color0);background-color:var(--jp-brand-color0)}.jupyter-button.mod-success{color:var(--jp-ui-inverse-font-color1);background-color:var(--jp-success-color1)}.jupyter-button.mod-success.mod-active,.jupyter-button.mod-success:active{color:var(--jp-ui-inverse-font-color0);background-color:var(--jp-success-color0)}.jupyter-button.mod-info{color:var(--jp-ui-inverse-font-color1);background-color:var(--jp-info-color1)}.jupyter-button.mod-info.mod-active,.jupyter-button.mod-info:active{color:var(--jp-ui-inverse-font-color0);background-color:var(--jp-info-color0)}.jupyter-button.mod-warning{color:var(--jp-ui-inverse-font-color1);background-color:var(--jp-warn-color1)}.jupyter-button.mod-warning.mod-active,.jupyter-button.mod-warning:active{color:var(--jp-ui-inverse-font-color0);background-color:var(--jp-warn-color0)}.jupyter-button.mod-danger{color:var(--jp-ui-inverse-font-color1);background-color:var(--jp-error-color1)}.jupyter-button.mod-danger.mod-active,.jupyter-button.mod-danger:active{color:var(--jp-ui-inverse-font-color0);background-color:var(--jp-error-color0)}.widget-button,.widget-toggle-button,.widget-upload,.jupyter-widget-button,.jupyter-widget-toggle-button,.jupyter-widget-upload{width:var(--jp-widgets-inline-width-short)}.jupyter-widgets label{margin-bottom:initial}.widget-label-basic,.jupyter-widget-label-basic,.widget-label,.jupyter-widget-label{color:var(--jp-widgets-label-color);font-size:var(--jp-widgets-font-size);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:var(--jp-widgets-inline-height)}.widget-inline-hbox .widget-label,.jupyter-widget-inline-hbox .jupyter-widget-label{color:var(--jp-widgets-label-color);text-align:right;margin-right:calc(var(--jp-widgets-inline-margin) * 2);width:var(--jp-widgets-inline-label-width);flex-shrink:0}.widget-inline-vbox .widget-label,.jupyter-widget-inline-vbox .jupyter-widget-label{color:var(--jp-widgets-label-color);text-align:center;line-height:var(--jp-widgets-inline-height)}.widget-readout,.jupyter-widget-readout{color:var(--jp-widgets-readout-color);font-size:var(--jp-widgets-font-size);height:var(--jp-widgets-inline-height);line-height:var(--jp-widgets-inline-height);overflow:hidden;white-space:nowrap;text-align:center}.widget-readout.overflow,.jupyter-widget-readout.overflow{-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.2),0 3px 1px -2px rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);-moz-box-shadow:0 2px 2px 0 rgba(0,0,0,.2),0 3px 1px -2px rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 2px 2px #0003,0 3px 1px -2px #00000024,0 1px 5px #0000001f}.widget-inline-hbox .widget-readout,.jupyter-widget-inline-hbox .jupyter-widget-readout{text-align:center;max-width:var(--jp-widgets-inline-width-short);min-width:var(--jp-widgets-inline-width-tiny);margin-left:var(--jp-widgets-inline-margin)}.widget-inline-vbox .widget-readout,.jupyter-widget-inline-vbox .jupyter-widget-readout{margin-top:var(--jp-widgets-inline-margin);width:inherit}.widget-checkbox,.jupyter-widget-checkbox{width:var(--jp-widgets-inline-width);height:var(--jp-widgets-inline-height);line-height:var(--jp-widgets-inline-height)}.widget-checkbox input[type=checkbox],.jupyter-widget-checkbox input[type=checkbox]{margin:0px calc(var(--jp-widgets-inline-margin) * 2) 0px 0px;line-height:var(--jp-widgets-inline-height);font-size:large;flex-grow:1;flex-shrink:0;align-self:center}.widget-valid,.jupyter-widget-valid{height:var(--jp-widgets-inline-height);line-height:var(--jp-widgets-inline-height);width:var(--jp-widgets-inline-width-short);font-size:var(--jp-widgets-font-size)}.widget-valid i,.jupyter-widget-valid i{line-height:var(--jp-widgets-inline-height);margin-right:var(--jp-widgets-inline-margin);margin-left:var(--jp-widgets-inline-margin)}.widget-valid.mod-valid i,.jupyter-widget-valid.mod-valid i{color:green}.widget-valid.mod-invalid i,.jupyter-widget-valid.mod-invalid i{color:red}.widget-valid.mod-valid .widget-valid-readout,.jupyter-widget-valid.mod-valid .jupyter-widget-valid-readout{display:none}.widget-textarea,.widget-text,.jupyter-widget-textarea,.jupyter-widget-text{width:var(--jp-widgets-inline-width)}.widget-text input[type=text],.widget-text input[type=number],.widget-text input[type=password],.jupyter-widget-text input[type=text],.jupyter-widget-text input[type=number],.jupyter-widget-text input[type=password]{height:var(--jp-widgets-inline-height)}.widget-text input[type=text]:disabled,.widget-text input[type=number]:disabled,.widget-text input[type=password]:disabled,.widget-textarea textarea:disabled,.jupyter-widget-text input[type=text]:disabled,.jupyter-widget-text input[type=number]:disabled,.jupyter-widget-text input[type=password]:disabled,.jupyter-widget-textarea textarea:disabled{opacity:var(--jp-widgets-disabled-opacity)}.widget-text input[type=text],.widget-text input[type=number],.widget-text input[type=password],.widget-textarea textarea,.jupyter-widget-text input[type=text],.jupyter-widget-text input[type=number],.jupyter-widget-text input[type=password],.jupyter-widget-textarea textarea{box-sizing:border-box;border:var(--jp-widgets-input-border-width) solid var(--jp-widgets-input-border-color);background-color:var(--jp-widgets-input-background-color);color:var(--jp-widgets-input-color);font-size:var(--jp-widgets-font-size);flex-grow:1;min-width:0;flex-shrink:1;outline:none!important}.widget-text input[type=text],.widget-text input[type=password],.widget-textarea textarea,.jupyter-widget-text input[type=text],.jupyter-widget-text input[type=password],.jupyter-widget-textarea textarea{padding:var(--jp-widgets-input-padding) calc(var(--jp-widgets-input-padding) * 2)}.widget-text input[type=number],.jupyter-widget-text input[type=number]{padding:var(--jp-widgets-input-padding) 0 var(--jp-widgets-input-padding) calc(var(--jp-widgets-input-padding) * 2)}.widget-textarea textarea,.jupyter-widget-textarea textarea{height:inherit;width:inherit}.widget-text input:focus,.widget-textarea textarea:focus,.jupyter-widget-text input:focus,.jupyter-widget-textarea textarea:focus{border-color:var(--jp-widgets-input-focus-border-color)}.widget-hslider,.jupyter-widget-hslider{width:var(--jp-widgets-inline-width);height:var(--jp-widgets-inline-height);line-height:var(--jp-widgets-inline-height);align-items:center}.widgets-slider .slider-container,.jupyter-widgets-slider .slider-container{overflow:visible}.widget-hslider .slider-container,.jupyter-widget-hslider .slider-container{margin-left:calc(var(--jp-widgets-slider-handle-size) / 2 - 2 * var(--jp-widgets-slider-border-width));margin-right:calc(var(--jp-widgets-slider-handle-size) / 2 - 2 * var(--jp-widgets-slider-border-width));flex:1 1 var(--jp-widgets-inline-width-short)}.widget-vbox .widget-label,.jupyter-widget-vbox .jupyter-widget-label{height:var(--jp-widgets-inline-height);line-height:var(--jp-widgets-inline-height)}.widget-vslider,.jupyter-widget-vslider{height:var(--jp-widgets-vertical-height);width:var(--jp-widgets-inline-width-tiny)}.widget-vslider .slider-container,.jupyter-widget-vslider .slider-container{flex:1 1 var(--jp-widgets-inline-width-short);margin-left:auto;margin-right:auto;margin-bottom:calc(var(--jp-widgets-slider-handle-size) / 2 - 2 * var(--jp-widgets-slider-border-width));margin-top:calc(var(--jp-widgets-slider-handle-size) / 2 - 2 * var(--jp-widgets-slider-border-width));display:flex;flex-direction:column}.progress-bar{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.progress-bar{height:var(--jp-widgets-inline-height)}.progress-bar{background-color:var(--jp-brand-color1)}.progress-bar-success{background-color:var(--jp-success-color1)}.progress-bar-info{background-color:var(--jp-info-color1)}.progress-bar-warning{background-color:var(--jp-warn-color1)}.progress-bar-danger{background-color:var(--jp-error-color1)}.progress{background-color:var(--jp-layout-color2);border:none;box-shadow:none}.widget-hprogress,.jupyter-widget-hprogress{height:var(--jp-widgets-inline-height);line-height:var(--jp-widgets-inline-height);width:var(--jp-widgets-inline-width);align-items:center}.widget-hprogress .progress,.jupyter-widget-hprogress .progress{flex-grow:1;margin-top:var(--jp-widgets-input-padding);margin-bottom:var(--jp-widgets-input-padding);align-self:stretch;height:initial}.widget-vprogress,.jupyter-widget-vprogress{height:var(--jp-widgets-vertical-height);width:var(--jp-widgets-inline-width-tiny)}.widget-vprogress .progress,.jupyter-widget-vprogress .progress{flex-grow:1;width:var(--jp-widgets-progress-thickness);margin-left:auto;margin-right:auto;margin-bottom:0}.widget-dropdown,.jupyter-widget-dropdown{height:var(--jp-widgets-inline-height);width:var(--jp-widgets-inline-width);line-height:var(--jp-widgets-inline-height)}.widget-dropdown>select,.jupyter-widget-dropdown>select{padding-right:20px;border:var(--jp-widgets-input-border-width) solid var(--jp-widgets-input-border-color);border-radius:0;height:inherit;flex:1 1 var(--jp-widgets-inline-width-short);min-width:0;box-sizing:border-box;outline:none!important;box-shadow:none;background-color:var(--jp-widgets-input-background-color);color:var(--jp-widgets-input-color);font-size:var(--jp-widgets-font-size);vertical-align:top;padding-left:calc(var(--jp-widgets-input-padding) * 2);appearance:none;-webkit-appearance:none;-moz-appearance:none;background-repeat:no-repeat;background-size:20px;background-position:right center;background-image:var(--jp-widgets-dropdown-arrow)}.widget-dropdown>select:focus,.jupyter-widget-dropdown>select:focus{border-color:var(--jp-widgets-input-focus-border-color)}.widget-dropdown>select:disabled,.jupyter-widget-dropdown>select:disabled{opacity:var(--jp-widgets-disabled-opacity)}.widget-dropdown>select:-moz-focusring,.jupyter-widget-dropdown>select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}.widget-select,.jupyter-widget-select{width:var(--jp-widgets-inline-width);line-height:var(--jp-widgets-inline-height);align-items:flex-start}.widget-select>select,.jupyter-widget-select>select{border:var(--jp-widgets-input-border-width) solid var(--jp-widgets-input-border-color);background-color:var(--jp-widgets-input-background-color);color:var(--jp-widgets-input-color);font-size:var(--jp-widgets-font-size);flex:1 1 var(--jp-widgets-inline-width-short);outline:none!important;overflow:auto;height:inherit;padding-top:5px}.widget-select>select:focus,.jupyter-widget-select>select:focus{border-color:var(--jp-widgets-input-focus-border-color)}.wiget-select>select>option,.jupyter-wiget-select>select>option{padding-left:var(--jp-widgets-input-padding);line-height:var(--jp-widgets-inline-height);padding-top:calc(var(--jp-widgets-inline-height) - var(--jp-widgets-font-size) / 2);padding-bottom:calc(var(--jp-widgets-inline-height) - var(--jp-widgets-font-size) / 2)}.widget-toggle-buttons,.jupyter-widget-toggle-buttons{line-height:var(--jp-widgets-inline-height)}.widget-toggle-buttons .widget-toggle-button,.jupyter-widget-toggle-buttons .jupyter-widget-toggle-button{margin-left:var(--jp-widgets-margin);margin-right:var(--jp-widgets-margin)}.widget-toggle-buttons .jupyter-button:disabled,.jupyter-widget-toggle-buttons .jupyter-button:disabled{opacity:var(--jp-widgets-disabled-opacity)}.widget-radio,.jupyter-widget-radio{width:var(--jp-widgets-inline-width);line-height:var(--jp-widgets-inline-height)}.widget-radio-box,.jupyter-widget-radio-box{display:flex;flex-direction:column;align-items:stretch;box-sizing:border-box;flex-grow:1;margin-bottom:var(--jp-widgets-radio-item-height-adjustment)}.widget-radio-box-vertical,.jupyter-widget-radio-box-vertical{flex-direction:column}.widget-radio-box-horizontal,.jupyter-widget-radio-box-horizontal{flex-direction:row}.widget-radio-box label,.jupyter-widget-radio-box label{height:var(--jp-widgets-radio-item-height);line-height:var(--jp-widgets-radio-item-height);font-size:var(--jp-widgets-font-size)}.widget-radio-box-horizontal label,.jupyter-widget-radio-box-horizontal label{margin:0 calc(var(--jp-widgets-input-padding) * 2) 0 0}.widget-radio-box input,.jupyter-widget-radio-box input{height:var(--jp-widgets-radio-item-height);line-height:var(--jp-widgets-radio-item-height);margin:0 calc(var(--jp-widgets-input-padding) * 2) 0 1px;float:left}.widget-colorpicker,.jupyter-widget-colorpicker{width:var(--jp-widgets-inline-width);height:var(--jp-widgets-inline-height);line-height:var(--jp-widgets-inline-height)}.widget-colorpicker>.widget-colorpicker-input,.jupyter-widget-colorpicker>.jupyter-widget-colorpicker-input{flex-grow:1;flex-shrink:1;min-width:var(--jp-widgets-inline-width-tiny)}.widget-colorpicker input[type=color],.jupyter-widget-colorpicker input[type=color]{width:var(--jp-widgets-inline-height);height:var(--jp-widgets-inline-height);padding:0 2px;background:var(--jp-widgets-input-background-color);color:var(--jp-widgets-input-color);border:var(--jp-widgets-input-border-width) solid var(--jp-widgets-input-border-color);border-left:none;flex-grow:0;flex-shrink:0;box-sizing:border-box;align-self:stretch;outline:none!important}.widget-colorpicker.concise input[type=color],.jupyter-widget-colorpicker.concise input[type=color]{border-left:var(--jp-widgets-input-border-width) solid var(--jp-widgets-input-border-color)}.widget-colorpicker input[type=color]:focus,.widget-colorpicker input[type=text]:focus,.jupyter-widget-colorpicker input[type=color]:focus,.jupyter-widget-colorpicker input[type=text]:focus{border-color:var(--jp-widgets-input-focus-border-color)}.widget-colorpicker input[type=text],.jupyter-widget-colorpicker input[type=text]{flex-grow:1;outline:none!important;height:var(--jp-widgets-inline-height);line-height:var(--jp-widgets-inline-height);background:var(--jp-widgets-input-background-color);color:var(--jp-widgets-input-color);border:var(--jp-widgets-input-border-width) solid var(--jp-widgets-input-border-color);font-size:var(--jp-widgets-font-size);padding:var(--jp-widgets-input-padding) calc(var(--jp-widgets-input-padding) * 2);min-width:0;flex-shrink:1;box-sizing:border-box}.widget-colorpicker input[type=text]:disabled,.jupyter-widget-colorpicker input[type=text]:disabled{opacity:var(--jp-widgets-disabled-opacity)}.widget-datepicker,.jupyter-widget-datepicker{width:var(--jp-widgets-inline-width);height:var(--jp-widgets-inline-height);line-height:var(--jp-widgets-inline-height)}.widget-datepicker input[type=date],.jupyter-widget-datepicker input[type=date]{flex-grow:1;flex-shrink:1;min-width:0;outline:none!important;height:var(--jp-widgets-inline-height);border:var(--jp-widgets-input-border-width) solid var(--jp-widgets-input-border-color);background-color:var(--jp-widgets-input-background-color);color:var(--jp-widgets-input-color);font-size:var(--jp-widgets-font-size);padding:var(--jp-widgets-input-padding) calc(var(--jp-widgets-input-padding) * 2);box-sizing:border-box}.widget-datepicker input[type=date]:focus,.jupyter-widget-datepicker input[type=date]:focus{border-color:var(--jp-widgets-input-focus-border-color)}.widget-datepicker input[type=date]:invalid,.jupyter-widget-datepicker input[type=date]:invalid{border-color:var(--jp-warn-color1)}.widget-datepicker input[type=date]:disabled,.jupyter-widget-datepicker input[type=date]:disabled{opacity:var(--jp-widgets-disabled-opacity)}.widget-play,.jupyter-widget-play{width:var(--jp-widgets-inline-width-short);display:flex;align-items:stretch}.widget-play .jupyter-button,.jupyter-widget-play .jupyter-button{flex-grow:1;height:auto}.widget-play .jupyter-button:disabled,.jupyter-widget-play .jupyter-button:disabled{opacity:var(--jp-widgets-disabled-opacity)}.jupyter-widgets.widget-tab,.jupyter-widgets.jupyter-widget-tab{display:flex;flex-direction:column}.jupyter-widgets.widget-tab>.p-TabBar,.jupyter-widgets.jupyter-widget-tab>.p-TabBar,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar{overflow-x:visible;overflow-y:visible}.jupyter-widgets.widget-tab>.p-TabBar>.p-TabBar-content,.jupyter-widgets.jupyter-widget-tab>.p-TabBar>.p-TabBar-content,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar>.lm-TabBar-content{align-items:flex-end;min-width:0;min-height:0}.jupyter-widgets.widget-tab>.widget-tab-contents,.jupyter-widgets.jupyter-widget-tab>.widget-tab-contents{width:100%;box-sizing:border-box;margin:0;background:var(--jp-layout-color1);color:var(--jp-ui-font-color1);border:var(--jp-border-width) solid var(--jp-border-color1);padding:var(--jp-widgets-container-padding);flex-grow:1;overflow:auto}.jupyter-widgets.widget-tab>.p-TabBar,.jupyter-widgets.jupyter-widget-tab>.p-TabBar,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar{font:var(--jp-widgets-font-size) Helvetica,Arial,sans-serif;min-height:calc(var(--jp-widgets-horizontal-tab-height) + var(--jp-border-width))}.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tab,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tab,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tab{flex:0 1 var(--jp-widgets-horizontal-tab-width);min-width:35px;min-height:calc(var(--jp-widgets-horizontal-tab-height) + var(--jp-border-width));line-height:var(--jp-widgets-horizontal-tab-height);margin-left:calc(-1 * var(--jp-border-width));padding:0 10px;background:var(--jp-layout-color2);color:var(--jp-ui-font-color2);border:var(--jp-border-width) solid var(--jp-border-color1);border-bottom:none;position:relative}.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tab.p-mod-current,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tab.p-mod-current,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tab.lm-mod-current{color:var(--jp-ui-font-color0);background:var(--jp-layout-color1);min-height:calc(var(--jp-widgets-horizontal-tab-height) + 2 * var(--jp-border-width));transform:translateY(var(--jp-border-width));overflow:visible}.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tab.p-mod-current:before,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tab.p-mod-current:before,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tab.lm-mod-current:before{position:absolute;top:calc(-1 * var(--jp-border-width));left:calc(-1 * var(--jp-border-width));content:"";height:var(--jp-widgets-horizontal-tab-top-border);width:calc(100% + 2 * var(--jp-border-width));background:var(--jp-brand-color1)}.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tab:first-child,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tab:first-child,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tab:first-child{margin-left:0}.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tab:hover:not(.p-mod-current),.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tab:hover:not(.p-mod-current),.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tab:hover:not(.lm-mod-current){background:var(--jp-layout-color1);color:var(--jp-ui-font-color1)}.jupyter-widgets.widget-tab>.p-TabBar .p-mod-closable>.p-TabBar-tabCloseIcon,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-mod-closable>.p-TabBar-tabCloseIcon,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-mod-closable>.lm-TabBar-tabCloseIcon{margin-left:4px}.jupyter-widgets.widget-tab>.p-TabBar .p-mod-closable>.p-TabBar-tabCloseIcon:before,.jupyter-widgets.jupyter-widget-widget-tab>.p-TabBar .p-mod-closable>.p-TabBar-tabCloseIcon:before,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-mod-closable>.lm-TabBar-tabCloseIcon:before{font-family:FontAwesome;content:""}.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tabIcon,.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tabLabel,.jupyter-widgets.widget-tab>.p-TabBar .p-TabBar-tabCloseIcon,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tabIcon,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tabLabel,.jupyter-widgets.jupyter-widget-tab>.p-TabBar .p-TabBar-tabCloseIcon,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tabIcon,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tabLabel,.jupyter-widgets.jupyter-widget-tab>.lm-TabBar .lm-TabBar-tabCloseIcon{line-height:var(--jp-widgets-horizontal-tab-height)}.jupyter-widget-Collapse{display:flex;flex-direction:column;align-items:stretch}.jupyter-widget-Collapse-header{padding:var(--jp-widgets-input-padding);cursor:pointer;color:var(--jp-ui-font-color2);background-color:var(--jp-layout-color2);border:var(--jp-widgets-border-width) solid var(--jp-border-color1);padding:calc(var(--jp-widgets-container-padding) * 2 / 3) var(--jp-widgets-container-padding);font-weight:700}.jupyter-widget-Collapse-header:hover{background-color:var(--jp-layout-color1);color:var(--jp-ui-font-color1)}.jupyter-widget-Collapse-open>.jupyter-widget-Collapse-header{background-color:var(--jp-layout-color1);color:var(--jp-ui-font-color0);cursor:default;border-bottom:none}.jupyter-widget-Collapse-contents{padding:var(--jp-widgets-container-padding);background-color:var(--jp-layout-color1);color:var(--jp-ui-font-color1);border-left:var(--jp-widgets-border-width) solid var(--jp-border-color1);border-right:var(--jp-widgets-border-width) solid var(--jp-border-color1);border-bottom:var(--jp-widgets-border-width) solid var(--jp-border-color1);overflow:auto}.jupyter-widget-Accordion{display:flex;flex-direction:column;align-items:stretch}.jupyter-widget-Accordion .jupyter-widget-Collapse{margin-bottom:0}.jupyter-widget-Accordion .jupyter-widget-Collapse+.jupyter-widget-Collapse{margin-top:4px}.widget-html,.widget-htmlmath,.jupyter-widget-html,.jupyter-widget-htmlmath{font-size:var(--jp-widgets-font-size)}.widget-html>.widget-html-content,.widget-htmlmath>.widget-html-content,.jupyter-widget-html>.jupyter-widget-html-content,.jupyter-widget-htmlmath>.jupyter-widget-html-content{align-self:stretch;flex-grow:1;flex-shrink:1;line-height:var(--jp-widgets-inline-height);position:relative}.widget-image,.jupyter-widget-image{max-width:100%;height:auto}
package/dist/index.html CHANGED
@@ -64,8 +64,8 @@
64
64
  }
65
65
  }
66
66
  </script>
67
- <script type="module" crossorigin src="/assets/index-BvrHu37J.js"></script>
68
- <link rel="stylesheet" crossorigin href="/assets/index-Dfj_xsKU.css">
67
+ <script type="module" crossorigin src="/assets/index-7-YBurka.js"></script>
68
+ <link rel="stylesheet" crossorigin href="/assets/index-CFBUnxSZ.css">
69
69
  </head>
70
70
  <body class="bg-slate-50 text-slate-900 antialiased">
71
71
  <div id="root"></div>
@@ -63,12 +63,14 @@ class ClientRegistration {
63
63
  const localHost = process.env.NEBULA_HOST || os.hostname();
64
64
  const serverName = process.env.NEBULA_SERVER_NAME || os.hostname();
65
65
  const secret = process.env.NEBULA_CLUSTER_SECRET;
66
+ const allocationToken = process.env.NEBULA_ALLOCATION_TOKEN;
66
67
  this.config = {
67
68
  mainServerUrl: mainServerUrl.replace(/\/$/, ''), // Remove trailing slash
68
69
  localHost,
69
70
  localPort,
70
71
  serverName,
71
72
  secret,
73
+ allocationToken,
72
74
  };
73
75
  // Set local server ID
74
76
  const serverId = `${localHost}:${localPort}`;
@@ -101,6 +103,7 @@ class ClientRegistration {
101
103
  name: this.config.serverName,
102
104
  secret: this.config.secret,
103
105
  resources, // Include resources in registration
106
+ allocationToken: this.config.allocationToken,
104
107
  }),
105
108
  });
106
109
  if (!response.ok) {
@@ -291,6 +291,28 @@ function createWebSocketProxy(sessionId, clientWs) {
291
291
  const remoteWs = new ws_1.WebSocket(wsUrl, {
292
292
  headers: getClusterHeaders(),
293
293
  });
294
+ // The client (UI) sends its messages as soon as *its* socket is open — which
295
+ // is before this remote socket finishes connecting. Those early messages
296
+ // (notably the one-time `sync_outputs` that subscribes to the kernel's output
297
+ // stream, and the first `execute`) would otherwise be silently dropped,
298
+ // leaving the cell running with no output. Buffer them and flush on open.
299
+ const pending = [];
300
+ const sendToRemote = (data, isBinary) => {
301
+ if (remoteWs.readyState === ws_1.WebSocket.OPEN) {
302
+ remoteWs.send(isBinary ? data : (typeof data === 'string' ? data : data.toString()));
303
+ }
304
+ else {
305
+ pending.push({ data, isBinary });
306
+ }
307
+ };
308
+ remoteWs.on('open', () => {
309
+ for (const { data, isBinary } of pending) {
310
+ if (remoteWs.readyState === ws_1.WebSocket.OPEN) {
311
+ remoteWs.send(isBinary ? data : (typeof data === 'string' ? data : data.toString()));
312
+ }
313
+ }
314
+ pending.length = 0;
315
+ });
294
316
  // Forward messages from remote to client
295
317
  remoteWs.on('message', (data, isBinary) => {
296
318
  if (clientWs.readyState !== ws_1.WebSocket.OPEN) {
@@ -302,16 +324,9 @@ function createWebSocketProxy(sessionId, clientWs) {
302
324
  }
303
325
  clientWs.send(typeof data === 'string' ? data : data.toString());
304
326
  });
305
- // Forward messages from client to remote
327
+ // Forward messages from client to remote (buffered until remote is open)
306
328
  clientWs.on('message', (data, isBinary) => {
307
- if (remoteWs.readyState !== ws_1.WebSocket.OPEN) {
308
- return;
309
- }
310
- if (isBinary) {
311
- remoteWs.send(data);
312
- return;
313
- }
314
- remoteWs.send(typeof data === 'string' ? data : data.toString());
329
+ sendToRemote(data, isBinary);
315
330
  });
316
331
  // Handle remote close
317
332
  remoteWs.on('close', () => {
@@ -17,6 +17,8 @@ export interface PeerServer {
17
17
  status: 'online' | 'offline' | 'unknown';
18
18
  kernelspecs?: string[];
19
19
  resources?: ServerResources;
20
+ allocationToken?: string;
21
+ allocationId?: string;
20
22
  }
21
23
  export interface RegisterRequest {
22
24
  host: string;
@@ -24,6 +26,7 @@ export interface RegisterRequest {
24
26
  name?: string;
25
27
  secret?: string;
26
28
  resources?: ServerResources;
29
+ allocationToken?: string;
27
30
  }
28
31
  declare class ServerRegistry {
29
32
  private servers;
@@ -72,6 +75,11 @@ declare class ServerRegistry {
72
75
  * Get all registered peer servers
73
76
  */
74
77
  getAllServers(): PeerServer[];
78
+ /**
79
+ * Find a registered server by its scheduler allocation token.
80
+ * Used by the allocation service to correlate a job's registration.
81
+ */
82
+ getServerByAllocationToken(token: string): PeerServer | undefined;
75
83
  /**
76
84
  * Get all online peer servers
77
85
  */
@@ -9,7 +9,8 @@
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.serverRegistry = void 0;
11
11
  const cluster_secret_1 = require("./cluster-secret");
12
- const HEARTBEAT_TIMEOUT_MS = 90_000; // 90 seconds (3 missed heartbeats at 30s interval)
12
+ const HEARTBEAT_TIMEOUT_MS = 90_000; // 90s (3 missed heartbeats at 30s interval) -> mark offline
13
+ const OFFLINE_REAP_MS = 180_000; // 3 min without a heartbeat -> remove from the list entirely
13
14
  const CLEANUP_INTERVAL_MS = 30_000; // Check for stale servers every 30s
14
15
  class ServerRegistry {
15
16
  servers = new Map();
@@ -88,6 +89,9 @@ class ServerRegistry {
88
89
  if (request.resources) {
89
90
  existing.resources = request.resources;
90
91
  }
92
+ if (request.allocationToken) {
93
+ existing.allocationToken = request.allocationToken;
94
+ }
91
95
  console.log(`[ServerRegistry] Updated registration for ${serverId}`);
92
96
  return { success: true, serverId };
93
97
  }
@@ -102,6 +106,7 @@ class ServerRegistry {
102
106
  lastHeartbeat: now,
103
107
  status: 'online',
104
108
  resources: request.resources,
109
+ allocationToken: request.allocationToken,
105
110
  };
106
111
  this.servers.set(serverId, server);
107
112
  console.log(`[ServerRegistry] Registered new server: ${serverId} (${request.name || 'unnamed'})`);
@@ -144,6 +149,19 @@ class ServerRegistry {
144
149
  getAllServers() {
145
150
  return Array.from(this.servers.values());
146
151
  }
152
+ /**
153
+ * Find a registered server by its scheduler allocation token.
154
+ * Used by the allocation service to correlate a job's registration.
155
+ */
156
+ getServerByAllocationToken(token) {
157
+ if (!token)
158
+ return undefined;
159
+ for (const server of this.servers.values()) {
160
+ if (server.allocationToken === token)
161
+ return server;
162
+ }
163
+ return undefined;
164
+ }
147
165
  /**
148
166
  * Get all online peer servers
149
167
  */
@@ -155,12 +173,18 @@ class ServerRegistry {
155
173
  */
156
174
  checkServerHealth() {
157
175
  const now = Date.now();
158
- for (const server of this.servers.values()) {
159
- if (now - server.lastHeartbeat > HEARTBEAT_TIMEOUT_MS) {
160
- if (server.status === 'online') {
161
- console.log(`[ServerRegistry] Server ${server.id} marked offline (heartbeat timeout)`);
162
- server.status = 'offline';
163
- }
176
+ for (const [id, server] of this.servers) {
177
+ const stale = now - server.lastHeartbeat;
178
+ // Reap long-gone servers so dead compute allocations / peers don't linger
179
+ // in the list forever. A recovered server just re-registers and reappears.
180
+ if (stale > OFFLINE_REAP_MS) {
181
+ this.servers.delete(id);
182
+ console.log(`[ServerRegistry] Server ${id} removed (offline for ${Math.round(stale / 1000)}s)`);
183
+ continue;
184
+ }
185
+ if (stale > HEARTBEAT_TIMEOUT_MS && server.status === 'online') {
186
+ console.log(`[ServerRegistry] Server ${server.id} marked offline (heartbeat timeout)`);
187
+ server.status = 'offline';
164
188
  }
165
189
  }
166
190
  }
@@ -41,6 +41,12 @@ export declare class FilesystemService {
41
41
  */
42
42
  private atomicWriteFileSync;
43
43
  private writeJsonAtomicSync;
44
+ /**
45
+ * Async variant of atomicWriteFileSync (write temp, fsync, rename, fsync dir).
46
+ * Used on hot notebook-save paths so large writes never block the event loop.
47
+ */
48
+ private atomicWriteFile;
49
+ private writeJsonAtomic;
44
50
  /**
45
51
  * Format file size for display
46
52
  */
@@ -64,7 +70,7 @@ export declare class FilesystemService {
64
70
  /**
65
71
  * Get file modification time
66
72
  */
67
- getFileMtime(filePath: string): MtimeResponse;
73
+ getFileMtime(filePath: string): Promise<MtimeResponse>;
68
74
  /**
69
75
  * List contents of a directory
70
76
  */
@@ -72,7 +78,7 @@ export declare class FilesystemService {
72
78
  /**
73
79
  * Read a file's contents
74
80
  */
75
- readFile(filePath: string): ReadFileResponse;
81
+ readFile(filePath: string): Promise<ReadFileResponse>;
76
82
  /**
77
83
  * Write content to a file
78
84
  */
@@ -87,6 +93,16 @@ export declare class FilesystemService {
87
93
  * Get the history file path for a notebook
88
94
  */
89
95
  private getHistoryPath;
96
+ /**
97
+ * Last-Nebula-save record for text-format notebooks: the canonical cell
98
+ * state (id/type/content) as of the last save THROUGH Nebula. At history
99
+ * load, divergence between this record and the file means the notebook was
100
+ * edited externally (vim, git checkout, ...) — the difference is
101
+ * reconciled into history as a synthesized external-edit operation so
102
+ * undo/redo stays infinite across external edits.
103
+ */
104
+ private getLastSavePath;
105
+ private writeTextNotebookLastSave;
90
106
  /**
91
107
  * Get the session state file path for a notebook
92
108
  */
@@ -147,9 +163,19 @@ export declare class FilesystemService {
147
163
  */
148
164
  private convertOutputsToJupyter;
149
165
  /**
150
- * Read a notebook and convert to internal cell format
166
+ * Read a notebook and convert to internal cell format (async; hot path for
167
+ * notebook load — large .ipynb reads must not block the event loop)
168
+ */
169
+ getNotebookCells(notebookPath: string): Promise<NotebookCellsResponse>;
170
+ /**
171
+ * Sync variant of getNotebookCells. Kept for cold callers that need a
172
+ * synchronous read (headless cache warm-up, initial-history bootstrap).
173
+ */
174
+ getNotebookCellsSync(notebookPath: string): NotebookCellsResponse;
175
+ /**
176
+ * Convert raw notebook file content to the internal cell format (CPU only).
151
177
  */
152
- getNotebookCells(notebookPath: string): NotebookCellsResponse;
178
+ private buildNotebookCellsResponse;
153
179
  /**
154
180
  * Read a notebook and convert to internal cell format, resolving default kernel if needed
155
181
  */
@@ -157,12 +183,17 @@ export declare class FilesystemService {
157
183
  /**
158
184
  * Save cells to a notebook file
159
185
  */
160
- saveNotebookCells(notebookPath: string, cells: NebulaCell[], kernelName?: string, notebookMetadata?: Record<string, unknown>): SaveNotebookResult;
186
+ saveNotebookCells(notebookPath: string, cells: NebulaCell[], kernelName?: string, notebookMetadata?: Record<string, unknown>): Promise<SaveNotebookResult>;
161
187
  /**
162
188
  * Save notebook cells and history in a single crash-safe commit.
163
189
  * Uses a small journal + atomic writes to avoid partial files.
164
190
  */
165
191
  saveNotebookBundle(notebookPath: string, cells: NebulaCell[], kernelName?: string, history?: unknown[], session?: Record<string, unknown>, notebookMetadata?: Record<string, unknown>): Promise<SaveNotebookResult>;
192
+ /**
193
+ * Save cells to a text-format notebook (.py percent / .qmd).
194
+ * Outputs and execution counts are never serialized — by format design.
195
+ */
196
+ private saveTextNotebookCells;
166
197
  /**
167
198
  * Get notebook-level metadata
168
199
  */
@@ -185,6 +216,7 @@ export declare class FilesystemService {
185
216
  success: boolean;
186
217
  error?: string;
187
218
  status?: AgentPermissionSnapshot;
219
+ mtime?: number;
188
220
  }>;
189
221
  /**
190
222
  * Derive agent permission status from persisted notebook metadata.
@@ -203,9 +235,25 @@ export declare class FilesystemService {
203
235
  */
204
236
  saveHistory(notebookPath: string, history: unknown[]): Promise<boolean>;
205
237
  /**
206
- * Load operation history for a notebook
238
+ * Load operation history for a notebook (async; history files can be many MB)
239
+ */
240
+ loadHistory(notebookPath: string): Promise<unknown[]>;
241
+ /**
242
+ * Sync variant of loadHistory. Kept for cold callers that need a
243
+ * synchronous read (headless undo/redo state bootstrap).
244
+ */
245
+ loadHistorySync(notebookPath: string): unknown[];
246
+ /**
247
+ * Compare the file's current cells against the last-Nebula-save record.
248
+ * On divergence, append ONE synthesized batch operation describing the
249
+ * external edit (updateContent / insertCell / deleteCell, source
250
+ * 'external') — both undo systems replay these, so a single undo step
251
+ * reverts the external edit and redo reapplies it. Falls back to a plain
252
+ * snapshot entry if synthesis fails (undo then bottoms out there instead
253
+ * of corrupting).
207
254
  */
208
- loadHistory(notebookPath: string): unknown[];
255
+ private reconcileExternalTextEdits;
256
+ private synthesizeExternalEditOps;
209
257
  /**
210
258
  * Save session state for a notebook
211
259
  */