lavavu 1.8.74__cp312-cp312-macosx_11_0_arm64.whl → 1.8.76__cp312-cp312-macosx_11_0_arm64.whl

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.
lavavu/LavaVuPython.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # This file was automatically generated by SWIG (https://www.swig.org).
2
- # Version 4.1.0
2
+ # Version 4.2.0
3
3
  #
4
4
  # Do not make changes to this file unless you know what you are doing - modify
5
5
  # the SWIG interface file instead.
Binary file
lavavu/control.py CHANGED
@@ -220,6 +220,13 @@ def _connectcode(target):
220
220
  else:
221
221
  return ""
222
222
 
223
+ def _emscriptencode(menu=False, lighttheme=True):
224
+ """
225
+ Returns WebGL base code for an interactive visualisation window
226
+ """
227
+ jslibs = [[], ['emscripten.js', 'LavaVu.js']]
228
+ return _webglcode('', ['emscripten.css'], jslibs, menu=menu, lighttheme=lighttheme)
229
+
223
230
  def _getcss(files=["styles.css"]):
224
231
  #Load stylesheets to inline tag
225
232
  return _filestohtml(files, tag="style")
lavavu/convert.py CHANGED
@@ -110,10 +110,10 @@ def points_to_volume_histogram(verts, weights, res=8, normed=True, clamp=None, b
110
110
 
111
111
  #H, edges = numpy.histogramdd(verts, bins=RES)
112
112
  if boundingbox is None:
113
- H, edges = numpy.histogramdd(verts, weights=weights, bins=RES, normed=normed) #density=True for newer numpy
113
+ H, edges = numpy.histogramdd(verts, weights=weights, bins=RES, density=normed) #density=True for newer numpy
114
114
  else:
115
115
  rg = ((vmin[0], vmax[0]), (vmin[1], vmax[1]), (vmin[2], vmax[2])) #provide bounding box as range
116
- H, edges = numpy.histogramdd(verts, weights=weights, bins=RES, range=rg, normed=normed) #density=True for newer numpy
116
+ H, edges = numpy.histogramdd(verts, weights=weights, bins=RES, range=rg, density=normed) #density=True for newer numpy
117
117
 
118
118
  #Reverse ordering X,Y,Z to Z,Y,X for volume data
119
119
  values = H.transpose()
lavavu/html/drawbox.js CHANGED
@@ -190,6 +190,14 @@ function canvasBoxMouseMove(event, mouse) {
190
190
 
191
191
  mouse.element.viewer.draw();
192
192
 
193
+ //Instant updates
194
+ if (mouse.element.viewer.alwaysdraw) {
195
+ if (mouse.element.viewer.rotating)
196
+ mouse.element.viewer.command('' + mouse.element.viewer.getRotationString());
197
+ else
198
+ mouse.element.viewer.command('' + mouse.element.viewer.getTranslationString());
199
+ }
200
+
193
201
  return false;
194
202
  }
195
203
 
@@ -422,6 +430,7 @@ function BoxViewer(canvas) {
422
430
 
423
431
  //Non-persistant settings
424
432
  this.mode = 'Rotate';
433
+ this.alwaysdraw = false;
425
434
  if (!this.gl) return;
426
435
 
427
436
  //Create the renderers
@@ -67,7 +67,7 @@ var Module = {
67
67
  },
68
68
  locateFile: function(path, prefix) {
69
69
  // Source from github by default
70
- if (path.endsWith("LavaVu.wasm") || path.endsWith("LavaVu.data")) return "https://cdn.jsdelivr.net/gh/lavavu/lavavu.github.io@LAVAVU_VERSION/" + path;
70
+ //if (path.endsWith("LavaVu.wasm") || path.endsWith("LavaVu.data")) return "https://cdn.jsdelivr.net/gh/lavavu/lavavu.github.io@LAVAVU_VERSION/" + path;
71
71
  // otherwise, use the default, the prefix (JS file's dir) + the path
72
72
  return prefix + path;
73
73
  },
lavavu/html/menu.js CHANGED
@@ -320,6 +320,7 @@ function createMenu(viewer, onchange, webglmode, global) {
320
320
  gui.add({"Export GLDB" : function() {window.commands.push('export');}}, 'Export GLDB');
321
321
  } else if (viewer.canvas) {
322
322
  //Server render
323
+ gui.add(viewer, "alwaysdraw");
323
324
  var url = viewer.canvas.imgtarget.baseurl;
324
325
  if (url)
325
326
  gui.add({"Popup Viewer" : function() {window.open(url, "LavaVu", "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=1024,height=768");}}, 'Popup Viewer');
lavavu/html/webview.html CHANGED
@@ -27,7 +27,7 @@
27
27
 
28
28
  <input id="fileinput" type="file" style="visibility:hidden" onchange="useFileInput(this)" />
29
29
 
30
- <script async src="https://cdn.jsdelivr.net/gh/lavavu/lavavu.github.io@1.8.74/LavaVu-amalgamated.min.js"></script>
30
+ <script async src="https://cdn.jsdelivr.net/gh/lavavu/lavavu.github.io@1.8.76/LavaVu-amalgamated.min.js"></script>
31
31
  <!--script src="dat.gui.min.js"></script>
32
32
  <script src="OK-min.js"></script>
33
33
 
lavavu/lavavu.py CHANGED
@@ -166,6 +166,37 @@ def _convert(data, dtype=None):
166
166
 
167
167
  return data
168
168
 
169
+ def is_documented_by(original):
170
+ def wrapper(target):
171
+ target.__doc__ = original.__doc__
172
+ return target
173
+ return wrapper
174
+
175
+ def _brightness_contrast_saturation(target, brightness=0.5, contrast=0.5, saturation=0.5):
176
+ """
177
+ Set brightness, contrast and saturation in the range [0,1]
178
+ Zero is minimum level
179
+ 0.5 is default, normal setting
180
+ 1 is maximum level
181
+
182
+ Parameters
183
+ ----------
184
+ brightness : float
185
+ Brightness level from 0 to 1, converts to lavavu brightness in range [-1,1]
186
+ 0 is full black, 0.5 is normal and 1.0 is full white
187
+ contrast : float
188
+ Contrast level from 0 to 1, converts to lavavu contrast in range [0,2]
189
+ 0 is grey, 0.5 is normal and 1.0 is maximum contrast
190
+ saturation : float
191
+ Saturation level from 0 to 1, converts to lavavu saturation in range [0,2]
192
+ 0 is greyscale, 0.5 is normal and 1.0 is maximum over-saturation
193
+ """
194
+ #Brightness in shader is [-1,1] where 0 is default
195
+ target["brightness"] = brightness * 2.0 - 1.0
196
+ #Contrast and saturation range from [0,2] where 1 is default
197
+ target["contrast"] = contrast * 2.0
198
+ target["saturation"] = saturation * 2.0
199
+
169
200
  def grid2d(corners=((0.,1.), (1.,0.)), dims=[2,2]):
170
201
  """
171
202
  Generate a 2d grid of vertices
@@ -1102,7 +1133,7 @@ class Object(dict):
1102
1133
 
1103
1134
  self._loadScalar(data, LavaVuPython.lucLuminanceData, width, height, depth)
1104
1135
 
1105
- def texture(self, data=None, flip=True, filter=2, bgr=False):
1136
+ def texture(self, data=None, flip=True, filter=2, bgr=False, label=""):
1106
1137
  """
1107
1138
  Load or clear texture data for object
1108
1139
 
@@ -1116,6 +1147,10 @@ class Object(dict):
1116
1147
  either (height, width, channels) for RGB(A) image
1117
1148
  or (height, width) for single channel grayscale image
1118
1149
  Pass a string to load a texture from given filename
1150
+ label : string
1151
+ Optional label to load a custom texture by name of uniform used
1152
+ If provided, will attempt to find the texture by this label and replace its data
1153
+ If not provided, will use the default/primary texture for the object
1119
1154
  flip : boolean
1120
1155
  flip the texture vertically after loading
1121
1156
  (default is enabled as usually required for OpenGL but can be disabled)
@@ -1129,7 +1164,7 @@ class Object(dict):
1129
1164
  self.parent.app.clearTexture(self.ref)
1130
1165
  return
1131
1166
  if isinstance(data, str):
1132
- self.parent.app.setTexture(self.ref, data, flip, filter, bgr)
1167
+ self.parent.app.setTexture(self.ref, data, flip, filter, bgr, label)
1133
1168
  return
1134
1169
 
1135
1170
  data = _convert(data)
@@ -1145,9 +1180,9 @@ class Object(dict):
1145
1180
  if data.dtype == numpy.float32:
1146
1181
  data = _convert(data, numpy.uint8)
1147
1182
  if data.dtype == numpy.uint32:
1148
- self.parent.app.textureUInt(self.ref, data.ravel(), width, height, channels, flip, filter, bgr)
1183
+ self.parent.app.textureUInt(self.ref, data.ravel(), width, height, channels, flip, filter, bgr, label)
1149
1184
  elif data.dtype == numpy.uint8:
1150
- self.parent.app.textureUChar(self.ref, data.ravel(), width, height, channels, flip, filter, bgr)
1185
+ self.parent.app.textureUChar(self.ref, data.ravel(), width, height, channels, flip, filter, bgr, label)
1151
1186
 
1152
1187
  def labels(self, data):
1153
1188
  """
@@ -1593,6 +1628,10 @@ class Object(dict):
1593
1628
  """
1594
1629
  self.parent.export_mesh(filepath, [self], rgba)
1595
1630
 
1631
+ @is_documented_by(_brightness_contrast_saturation)
1632
+ def brightness_contrast_saturation(self, brightness=0, contrast=0, saturation=0):
1633
+ return _brightness_contrast_saturation(self)
1634
+
1596
1635
  #Wrapper dict+list of objects
1597
1636
  class _Objects(dict):
1598
1637
  """
@@ -1901,7 +1940,7 @@ class ColourMap(dict):
1901
1940
  Convert to greyscale
1902
1941
  """
1903
1942
  if data is not None:
1904
- if isinstance(data, str) and re.match('^[\w_]+$', data) is not None:
1943
+ if isinstance(data, str) and re.match(r'^[\w_]+$', data) is not None:
1905
1944
  #Single word of alphanumeric characters, if not a built-in map, try matplotlib
1906
1945
  if data not in self.parent.defaultcolourmaps():
1907
1946
  newdata = matplotlib_colourmap(data)
@@ -3899,6 +3938,7 @@ class Viewer(dict):
3899
3938
  if not is_notebook():
3900
3939
  #Open the file in a new browser window
3901
3940
  import webbrowser
3941
+ #TODO: this url doesn't work
3902
3942
  webbrowser.open("/webview.html", new=1, autoraise=True)
3903
3943
  else:
3904
3944
  from IPython.display import display,HTML,IFrame
@@ -3916,6 +3956,26 @@ class Viewer(dict):
3916
3956
  </div>""".format(resolution[0], resolution[1], url)
3917
3957
  display(HTML(html))
3918
3958
 
3959
+ """
3960
+ #EXPERIMENTAL EMSCRIPTEN INLINE VERSION
3961
+ html = control._emscriptencode(menu)
3962
+ ID = str(len(self.webglviews))
3963
+ template = control.emscripten_inline
3964
+ #template = template.replace('---ID---', ID)
3965
+ #template = template.replace('---INIT---', 'initPage(\'{0}\', {1});'.format(ID, "true" if menu else "false"))
3966
+ #template = template.replace('---CONTENT---', control.hiddenhtml)
3967
+ #template = template.replace('---WIDTH---', str(resolution[0]))
3968
+ #template = template.replace('---HEIGHT---', str(resolution[1]))
3969
+ html = template.replace('---SCRIPTS---', html)
3970
+ self.webglviews.append(ID)
3971
+
3972
+ #Display inline in cell
3973
+ #from IPython.display import IFrame
3974
+ #display(IFrame(filename, width=resolution[0], height=resolution[1]))
3975
+ from IPython.display import display,HTML
3976
+ display(HTML(html))
3977
+ """
3978
+
3919
3979
  def webgl(self, filename=None, resolution=(640,480), browser=False, menu=True, **kwargs):
3920
3980
  """
3921
3981
  Create a WebGL page with a 3D interactive view of the active model
@@ -4631,6 +4691,59 @@ class Viewer(dict):
4631
4691
  self.render()
4632
4692
  convert.export_any(filepath, objects)
4633
4693
 
4694
+ @is_documented_by(_brightness_contrast_saturation)
4695
+ def brightness_contrast_saturation(self, brightness=0, contrast=0, saturation=0):
4696
+ return _brightness_contrast_saturation(self, brightness, contrast, saturation)
4697
+
4698
+ def set_properties(self, objects=None, **kwargs):
4699
+ """
4700
+ Set properties on viewer or on a set of objects by name
4701
+
4702
+ Parameters
4703
+ ----------
4704
+ objects : list
4705
+ List of objects or object names, if not provided the properties will be applied globally to the Viewer itself
4706
+ **kwargs :
4707
+ key=value property names and values to set
4708
+ """
4709
+ if objects is None:
4710
+ for key in kwargs:
4711
+ self[key] = kwargs[key]
4712
+ else:
4713
+ for o in objects:
4714
+ if isinstance(o, str):
4715
+ obj = self.objects[o]
4716
+ else:
4717
+ obj = o
4718
+ for key in kwargs:
4719
+ obj[key] = kwargs[key]
4720
+
4721
+ def set_uniforms(self, objects=None, **kwargs):
4722
+ """
4723
+ Set uniform variables on a set of objects by name or all objects
4724
+ Uniforms are parameters sent directly to the shader program and can have any
4725
+ valid GLSL variable name, it just needs to match the declaration in the shader
4726
+
4727
+ Parameters
4728
+ ----------
4729
+ objects : list
4730
+ List of objects or object names, if not provided the full object list will be iterated
4731
+ **kwargs :
4732
+ key=value uniform names and values to set
4733
+ """
4734
+ if objects == None: objects = self.objects.list
4735
+ if not isinstance(objects, list):
4736
+ objects = [objects]
4737
+ for o in objects:
4738
+ if isinstance(o, str):
4739
+ obj = self.objects[o]
4740
+ else:
4741
+ obj = o
4742
+ uniforms = obj['uniforms']
4743
+ for key in kwargs:
4744
+ uniforms[key] = kwargs[key]
4745
+ obj['uniforms'] = uniforms
4746
+
4634
4747
  #Wrapper for list of geomdata objects
4635
4748
  class Geometry(list):
4636
4749
  """
@@ -5257,7 +5370,7 @@ class Video(object):
5257
5370
  def __exit__(self, exc_type, exc_value, exc_traceback):
5258
5371
  self.stop()
5259
5372
  if exc_value == None:
5260
- print('Recording complete, filename: ', self.filename)
5373
+ #print('Recording complete, filename: ', self.filename)
5261
5374
  self.play()
5262
5375
  else:
5263
5376
  print('Recording failed: ', exc_value)
lavavu/vutils.py CHANGED
@@ -81,15 +81,10 @@ def download(url, filename=None, overwrite=False, quiet=False):
81
81
  filename : str
82
82
  Actual filename written to local filesystem
83
83
  """
84
- #Python 3 moved modules
85
- try:
86
- from urllib.request import urlopen, URLError, HTTPError, Request
87
- from urllib.parse import urlparse
88
- from urllib.parse import quote
89
- except ImportError:
90
- from urllib2 import urlopen, URLError, HTTPError, Request
91
- from urllib import quote
92
- from urlparse import urlparse
84
+ from urllib.request import urlopen, URLError, HTTPError, Request
85
+ from urllib.parse import urlparse
86
+ from urllib.parse import quote
87
+ import http.client
93
88
 
94
89
  if filename is None:
95
90
  filename = url[url.rfind("/")+1:]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lavavu
3
- Version: 1.8.74
3
+ Version: 1.8.76
4
4
  Summary: Python interface to LavaVu OpenGL 3D scientific visualisation utilities
5
5
  Author-email: Owen Kaluza <owen@kaluza.id.au>
6
6
  License: ### Licensing
@@ -212,7 +212,7 @@ Classifier: Framework :: IPython
212
212
  Requires-Python: >=3.5
213
213
  Description-Content-Type: text/markdown
214
214
  License-File: LICENSE.md
215
- Requires-Dist: numpy >=1.18
215
+ Requires-Dist: numpy>=1.18
216
216
  Requires-Dist: aiohttp
217
217
  Requires-Dist: jupyter-server-proxy
218
218
 
@@ -221,7 +221,7 @@ Requires-Dist: jupyter-server-proxy
221
221
  [![Build Status](https://github.com/lavavu/LavaVu/workflows/Test/badge.svg)](https://github.com/lavavu/LavaVu/actions?query=workflow:Test)
222
222
  [![Deploy Status](https://github.com/lavavu/LavaVu/workflows/Deploy/badge.svg?branch=1.7.3)](https://github.com/lavavu/LavaVu/actions?query=workflow:Deploy)
223
223
  [![DOI](https://zenodo.org/badge/45163055.svg)](https://zenodo.org/badge/latestdoi/45163055)
224
- [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/lavavu/LavaVu/1.8.74)
224
+ [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/lavavu/LavaVu/1.8.76)
225
225
 
226
226
  A scientific visualisation tool with a python interface for fast and flexible visual analysis.
227
227
 
@@ -1,13 +1,13 @@
1
- lavavu/lavavu.py,sha256=j710i05alXW92-C73OUb_SEZP19IoKB-NAz40Mf-ss8,201005
2
- lavavu/vutils.py,sha256=L5TpyGlRHThhGChzaKhB70NQd75o3ctyKhSqZTsxceg,5624
1
+ lavavu/lavavu.py,sha256=_6kKbk3KXUTDWYoSCkcnYLKOQPRkZteDepBApKepPUs,205612
2
+ lavavu/vutils.py,sha256=6Vm_xl1bp9mWlfk7jgLDwbRw-tdE_oxin77YkLel3_4,5437
3
3
  lavavu/dict.json,sha256=Zb1QnJOsx2DK3M1tRSXRUQ5PjEpOo3SMM3tTNHIKMPs,52722
4
4
  lavavu/server.py,sha256=L-_yPCbNfwYxJCPjDQtr_lxPnDp4oMNVFyxXhBERYrQ,12468
5
5
  lavavu/points.py,sha256=jRRtA6CrcA46Y2jUJmkxnIiVoMC5a14xEd_ojhmjhz4,5871
6
- lavavu/_LavaVuPython.cpython-312-darwin.so,sha256=E8gn2GS_T8id5IK3x8pjgtjsxqMfNfaxZzIzlcsiN9c,3792464
7
- lavavu/LavaVuPython.py,sha256=Ki8G9XYHkyfqmxG6BohDWomvSn5eJwG9cHqGzEhZDDs,33131
6
+ lavavu/_LavaVuPython.cpython-312-darwin.so,sha256=uMsu6lwfDOt4ia1t-drh8PNHr-lAVAVixSDmXJxSw2w,3840880
7
+ lavavu/LavaVuPython.py,sha256=ZdBJROEPysd_N_Od88PEO8Y1fjCOd05_vP6YBnJymN0,33131
8
8
  lavavu/tracers.py,sha256=0dB6v9Jg5G-IeZxiVFvbPoTycGvyAQBtgyEAZUmq4XU,4257
9
- lavavu/convert.py,sha256=JT73q32YMchuSIkoH_A0cTUVwfns8fWLGjyWp2A5i5M,35514
10
- lavavu/control.py,sha256=MWoYWBhqJbq_1GArE79SQAcZ1rINlvl0bx5nV5XTf8U,65568
9
+ lavavu/convert.py,sha256=tbYRjLE2l1hI4d6tsW41Lia1JXmrWSc0-JAYCiMrjys,35516
10
+ lavavu/control.py,sha256=eNocZPc-2Dz-nSty_KRz_9RzLvbU0clJGuAV3qnzxbU,65841
11
11
  lavavu/__init__.py,sha256=JroZQiUbuVN7ifixk2zNDGlyLGaM8bqfRbw4D_F9qIQ,191
12
12
  lavavu/amalgamate.py,sha256=Xloq1IZ4VUvYiROzQtwKcQIWC65c7EZrdiGVhZdolL8,586
13
13
  lavavu/aserver.py,sha256=SfFvLeDTcx1XtS8fY_HIrDmh3q9HicCBRSAriY5yyOE,12003
@@ -26,12 +26,12 @@ lavavu/html/server.js,sha256=b5eNlWWbiEk90n3WARJ1Mh7lmfHM0pOtZfrrmM-wfyc,7099
26
26
  lavavu/html/dat.gui.min.js,sha256=S4_QjoXe4IOpU0f0Sj5jEQLTWPoX9uRl1ohB91jyhuw,56992
27
27
  lavavu/html/OK-min.js,sha256=-4Gc1-dWfxP_w6r9ZOHa8u-X2BlGUoSQbX68lwCxQ3E,39115
28
28
  lavavu/html/emscripten.css,sha256=wkaIJhXaxuMchinQX9Z8c12cJomyvFQMeIZ62WGQEPQ,1813
29
- lavavu/html/drawbox.js,sha256=oaB6bokR4uA2mT9IDLZR7n6P-eDQ86auGbRQHWX423M,34280
30
- lavavu/html/webview.html,sha256=f0WSNwiUOTanA_FHqZixSuydfGYby2UD942nedv2_Vo,1522
31
- lavavu/html/emscripten-template.js,sha256=8OBEPzJYW00-b2d-BUQetFIivIO8PD_ktiCXd_GAEHQ,6133
29
+ lavavu/html/drawbox.js,sha256=SJxFSmWd7QVFI5__66hFkKzLKeqg1JPcx-gJuqdMkXw,34590
30
+ lavavu/html/webview.html,sha256=vD2cFL5mpl1TLA_-Ys6_yiOt8snXxu5YrGfDiVAmRoI,1522
31
+ lavavu/html/emscripten-template.js,sha256=h63mzl3Lv7aQT1wMOiOucPOvHTJjpKkzsL-SFVYaZlA,6135
32
32
  lavavu/html/draw.js,sha256=57LlHlYRh0IvWVwzGDnF6PaCxYLzokpokLNCuZlG1ds,84108
33
33
  lavavu/html/dat-gui-light-theme.css,sha256=uPhvJs-1IAsdxudItyOw8lZy8Hrih0zmFM1u-xRwZ-M,1142
34
- lavavu/html/menu.js,sha256=Kep88q4kEPXUfoa4xEEOLWieFph8pFnp1UR92d7VRiA,21466
34
+ lavavu/html/menu.js,sha256=WCli3UYcQ7frjNq0aAXNALu33iNiN8lpTYwKZ7pUcn4,21501
35
35
  lavavu/html/baseviewer.js,sha256=u3UhC1At6rMBKmcQ7d2DXTRxQ20wsQkc4lqA-7sL7i4,9567
36
36
  lavavu/shaders/volumeShader.frag,sha256=CIFSfwI8xVZ0ALme2QPMcXWl5yB55WCGnfJZ1Led6TU,16120
37
37
  lavavu/shaders/pointShader.vert,sha256=rnEa8PfIK3kFtFg04Ataf10aWsjEkh1URY2ipV1xTMY,1235
@@ -45,9 +45,9 @@ lavavu/shaders/fontShader.vert,sha256=yCBmRugaPUeUQUdIh62-AK_5KELiJqVS2M82iyIqPw
45
45
  lavavu/shaders/pointShader.frag,sha256=T1PA9Z6FiE66rS2sAmmFIbYM2VqEkLBycxV-sx3nACY,3384
46
46
  lavavu/shaders/volumeShader.vert,sha256=uGdQjGqi7V5kE6V7nxymfugtU4cbf6u570xBy13RgmY,78
47
47
  lavavu/shaders/default.frag,sha256=xCkYz8QriRlnAr-NtenZSIWI_liSxv9jz3Lp5immK9k,258
48
- lavavu-1.8.74.dist-info/LICENSE.md,sha256=EhfNgC6BYh5gDEaq4tcrN3S0wbO4CtJO46botJnCF8c,8603
49
- lavavu-1.8.74.dist-info/RECORD,,
50
- lavavu-1.8.74.dist-info/WHEEL,sha256=HnaoENn6Qm4iEXnBLTInwHfMXWh8BGFQKdBGriofhz4,109
51
- lavavu-1.8.74.dist-info/entry_points.txt,sha256=LC2qXR6EMe45Cb7zGAF99R9HFrAECP6Qkp_YuG6HZB0,44
52
- lavavu-1.8.74.dist-info/top_level.txt,sha256=JptS0k1nlBumjLs_0hITr3_XUJhxqvKBXD2jGho3E3A,7
53
- lavavu-1.8.74.dist-info/METADATA,sha256=KBDh8ndRnRNa9f90EFhmqkshLuJitRahywEwJdcwpzg,18238
48
+ lavavu-1.8.76.dist-info/LICENSE.md,sha256=EhfNgC6BYh5gDEaq4tcrN3S0wbO4CtJO46botJnCF8c,8603
49
+ lavavu-1.8.76.dist-info/RECORD,,
50
+ lavavu-1.8.76.dist-info/WHEEL,sha256=a49DngoqagUUlcaS-2XVqRCxwXxmdMxhw30J7454hso,109
51
+ lavavu-1.8.76.dist-info/entry_points.txt,sha256=LC2qXR6EMe45Cb7zGAF99R9HFrAECP6Qkp_YuG6HZB0,44
52
+ lavavu-1.8.76.dist-info/top_level.txt,sha256=JptS0k1nlBumjLs_0hITr3_XUJhxqvKBXD2jGho3E3A,7
53
+ lavavu-1.8.76.dist-info/METADATA,sha256=_Q3RNrqe4mm_Qb3CM15xfNkX9b7Wq0ORAlIYrUdry-k,18237
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.1.1)
2
+ Generator: setuptools (74.0.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp312-cp312-macosx_11_0_arm64
5
5