fmu-manipulation-toolbox 1.9rc8__py3-none-any.whl → 1.9rc10__py3-none-any.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.
@@ -1 +1 @@
1
- 'V1.9-rc8'
1
+ 'V1.9-rc10'
@@ -66,6 +66,7 @@ def fmutool(command_options: Sequence[str]):
66
66
  add_option('-only-parameters', action='append_const', dest='apply_on', const='parameter')
67
67
  add_option('-only-inputs', action='append_const', dest='apply_on', const='input')
68
68
  add_option('-only-outputs', action='append_const', dest='apply_on', const='output')
69
+ add_option('-only-locals', action='append_const', dest='apply_on', const='local')
69
70
  # Checker
70
71
  add_option('-summary', action='append_const', dest='operations_list', const=OperationSummary())
71
72
  add_option('-check', action='append_const', dest='operations_list', const=[checker() for checker in checker_list])
@@ -73,6 +73,9 @@ class Help:
73
73
  '-only-outputs': "apply operation only on ports with causality = 'output'. This "
74
74
  "option is available from version 1.3.",
75
75
 
76
+ '-only-locals': "apply operation only on ports with causality = 'local'. This "
77
+ "option is available from version 1.9.",
78
+
76
79
  '-summary': "display useful information regarding the FMU.",
77
80
 
78
81
  '-check': "performs some check of FMU and display Errors or Warnings. This is useful to avoid later "
@@ -112,6 +112,8 @@ class FMUError(Exception):
112
112
 
113
113
  class Manipulation:
114
114
  """Parse modelDescription.xml file and create a modified version"""
115
+ TAGS_MODEL_STRUCTURE = ("InitialUnknowns", "Derivatives", "Outputs")
116
+
115
117
  def __init__(self, operation, fmu):
116
118
  self.output_filename = tempfile.mktemp()
117
119
  self.out = None
@@ -120,7 +122,14 @@ class Manipulation:
120
122
  self.parser.StartElementHandler = self.start_element
121
123
  self.parser.EndElementHandler = self.end_element
122
124
  self.parser.CharacterDataHandler = self.char_data
125
+
126
+ # used for filter
123
127
  self.skip_until: Optional[str] = None
128
+
129
+ # used to remove empty sections
130
+ self.delayed_tag = None
131
+ self.delayed_tag_open = False
132
+
124
133
  self.operation.set_fmu(fmu)
125
134
  self.fmu = fmu
126
135
 
@@ -155,6 +164,7 @@ class Manipulation:
155
164
  def start_element(self, name, attrs):
156
165
  if self.skip_until:
157
166
  return
167
+
158
168
  try:
159
169
  if name == 'ScalarVariable': # FMI 2.0 only
160
170
  self.current_port = FMUPort()
@@ -176,7 +186,7 @@ class Manipulation:
176
186
  self.operation.fmi_attrs(attrs)
177
187
  elif name == 'Unknown': # FMI-2.0 only
178
188
  self.unknown_attrs(attrs)
179
- elif name == 'Output' or name == "ContinuousStateDerivative" or "InitialUnknown":
189
+ elif name == 'Output' or name == "ContinuousStateDerivative" or "InitialUnknown": # FMI-3.0 only
180
190
  self.handle_structure(attrs)
181
191
 
182
192
  except ManipulationSkipTag:
@@ -184,11 +194,19 @@ class Manipulation:
184
194
  return
185
195
 
186
196
  if self.current_port is None:
197
+ if self.delayed_tag and not self.delayed_tag_open:
198
+ print(f"<{self.delayed_tag}>", end='', file=self.out)
199
+ self.delayed_tag_open = True
200
+
187
201
  if attrs:
188
202
  attrs_list = [f'{key}="{self.escape(value)}"' for (key, value) in attrs.items()]
189
203
  print(f"<{name}", " ".join(attrs_list), ">", end='', file=self.out)
190
204
  else:
191
- print(f"<{name}>", end='', file=self.out)
205
+ if name in self.TAGS_MODEL_STRUCTURE:
206
+ self.delayed_tag = name
207
+ self.delayed_tag_open = False
208
+ else:
209
+ print(f"<{name}>", end='', file=self.out)
192
210
 
193
211
  def end_element(self, name):
194
212
  if self.skip_until:
@@ -205,7 +223,14 @@ class Manipulation:
205
223
  self.current_port = None
206
224
 
207
225
  elif self.current_port is None:
208
- print(f"</{name}>", end='', file=self.out)
226
+ if self.delayed_tag and name == self.delayed_tag:
227
+ if self.delayed_tag_open:
228
+ print(f"</{self.delayed_tag}>", end='', file=self.out)
229
+ else:
230
+ logger.debug(f"Remove tag <{self.delayed_tag}> from modelDescription.xml")
231
+ self.delayed_tag = None
232
+ else:
233
+ print(f"</{name}>", end='', file=self.out)
209
234
 
210
235
  def char_data(self, data):
211
236
  if not self.skip_until:
@@ -223,33 +248,71 @@ class Manipulation:
223
248
  self.port_translation.append(self.current_port_number)
224
249
 
225
250
  def unknown_attrs(self, attrs):
226
- index = int(attrs['index']) - 1
227
- new_index = self.port_translation[index]
228
- if new_index:
229
- attrs['index'] = self.port_translation[int(attrs['index']) - 1]
251
+ index = int(attrs['index'])
252
+ new_index = self.port_translation[index-1]
253
+ if new_index is not None:
254
+ attrs['index'] = str(new_index)
255
+ if attrs.get('dependencies', ""):
256
+ if 'dependenciesKind' in attrs:
257
+ new_dependencies = []
258
+ new_kinds = []
259
+ for dependency, kind in zip(attrs['dependencies'].split(' '), attrs['dependenciesKind'].split(' ')):
260
+ new_dependency = self.port_translation[int(dependency)-1]
261
+ if new_dependency is not None:
262
+ new_dependencies.append(str(new_dependency))
263
+ new_kinds.append(kind)
264
+ if new_dependencies:
265
+ attrs['dependencies'] = " ".join(new_dependencies)
266
+ attrs['dependenciesKind'] = " ".join(new_kinds)
267
+ else:
268
+ attrs.pop('dependencies')
269
+ attrs.pop('dependenciesKind')
270
+ else:
271
+ new_dependencies = []
272
+ for dependency in attrs['dependencies'].split(' '):
273
+ new_dependency = self.port_translation[int(dependency)-1]
274
+ if new_dependency is not None:
275
+ new_dependencies.append(str(new_dependency))
276
+ if new_dependencies:
277
+ attrs['dependencies'] = " ".join(new_dependencies)
278
+ else:
279
+ attrs.pop('dependencies')
230
280
  else:
231
- logger.warning(f"Removed port '{self.port_names_list[index]}' is involved in dependencies tree.")
281
+ logger.warning(f"Removed port '{self.port_names_list[index-1]}' is involved in dependencies tree.")
232
282
  raise ManipulationSkipTag
233
283
 
234
284
  def handle_structure(self, attrs):
235
285
  try:
236
286
  vr = attrs['valueReference']
237
287
  if vr in self.port_removed_vr:
288
+ logger.warning(f"Removed port vr={vr} is involved in dependencies tree.")
238
289
  raise ManipulationSkipTag
239
290
  except KeyError:
240
291
  return
241
292
 
242
- try:
243
- dependencies = attrs['dependencies']
244
- new_dependencies = []
245
- for dependency in dependencies.split(" "):
246
- if dependency in self.port_removed_vr:
247
- logger.warning(f"Removed port 'vr={dependency}' was involved in dependencies tree.")
293
+ if attrs.get('dependencies', ""):
294
+ if 'dependenciesKind' in attrs:
295
+ new_dependencies = []
296
+ new_kinds = []
297
+ for dependency, kind in zip(attrs['dependencies'].split(' '), attrs['dependenciesKind'].split(' ')):
298
+ if dependency not in self.port_removed_vr:
299
+ new_dependencies.append(dependency)
300
+ new_kinds.append(kind)
301
+ if new_dependencies:
302
+ attrs['dependencies'] = " ".join(new_dependencies)
303
+ attrs['dependenciesKind'] = " ".join(new_kinds)
248
304
  else:
249
- new_dependencies.append(dependency)
250
- attrs['dependencies'] = " ".join(new_dependencies)
251
- except KeyError:
252
- return
305
+ attrs.pop('dependencies')
306
+ attrs.pop('dependenciesKind')
307
+ else:
308
+ new_dependencies = []
309
+ for dependency in attrs['dependencies'].split(' '):
310
+ if dependency not in self.port_removed_vr:
311
+ new_dependencies.append(dependency)
312
+ if new_dependencies:
313
+ attrs['dependencies'] = " ".join(new_dependencies)
314
+ else:
315
+ attrs.pop('dependencies')
253
316
 
254
317
  def manipulate(self, descriptor_filename, apply_on=None):
255
318
  self.apply_on = apply_on
@@ -111,16 +111,10 @@ class FMUSplitter:
111
111
  fmu_file.writestr(file[len(directory):], data)
112
112
  logger.info(f"FMU Extraction of '{filename}'")
113
113
 
114
-
115
114
  class FMUSplitterDescription:
116
115
  def __init__(self, zip):
117
116
  self.zip = zip
118
- self.links: Dict[str, Dict[int, FMUSplitterLink]] = {
119
- "Real": {},
120
- "Integer": {},
121
- "Boolean": {},
122
- "String": {}
123
- }
117
+ self.links: Dict[str, Dict[int, FMUSplitterLink]] = dict((el, {}) for el in EmbeddedFMUPort.ALL_TYPES)
124
118
  self.vr_to_name: Dict[str, Dict[str, Dict[int, Dict[str, str]]]] = {} # name, fmi_type, vr <-> {name, causality}
125
119
  self.config: Dict[str, Any] = {
126
120
  "auto_input": False,
@@ -133,10 +127,11 @@ class FMUSplitterDescription:
133
127
 
134
128
  # used for modelDescription.xml parsing
135
129
  self.current_fmu_filename = None
130
+ self.current_fmi_version = None
136
131
  self.current_vr = None
137
132
  self.current_name = None
138
133
  self.current_causality = None
139
- self.supported_fmi_types: Tuple[str] = ()
134
+ self.supported_fmi_types: Tuple[str] = tuple()
140
135
 
141
136
  @staticmethod
142
137
  def get_line(file):
@@ -146,14 +141,23 @@ class FMUSplitterDescription:
146
141
  return line
147
142
  raise StopIteration
148
143
 
149
- def start_element(self, name, attrs):
150
- if name == "ScalarVariable":
144
+ def start_element(self, tag, attrs):
145
+ if tag == "fmiModelDescription":
146
+ self.current_fmi_version = attrs["fmiVersion"]
147
+ elif tag == "ScalarVariable":
151
148
  self.current_name = attrs["name"]
152
149
  self.current_vr = int(attrs["valueReference"])
153
150
  self.current_causality = attrs["causality"]
154
- elif name in self.vr_to_name[self.current_fmu_filename]:
155
- self.vr_to_name[self.current_fmu_filename][name][self.current_vr] = {"name": self.current_name,
156
- "causality": self.current_causality}
151
+ elif self.current_fmi_version == "2.0" and tag in EmbeddedFMUPort.FMI_TO_CONTAINER[2]:
152
+ fmi_type = EmbeddedFMUPort.FMI_TO_CONTAINER[2][tag]
153
+ self.vr_to_name[self.current_fmu_filename][fmi_type][self.current_vr] = {
154
+ "name": self.current_name,
155
+ "causality": self.current_causality}
156
+ elif self.current_fmi_version == "3.0" and tag in EmbeddedFMUPort.FMI_TO_CONTAINER[3]:
157
+ fmi_type = EmbeddedFMUPort.FMI_TO_CONTAINER[3][tag]
158
+ self.vr_to_name[self.current_fmu_filename][fmi_type][int(attrs["valueReference"])] = {
159
+ "name": attrs["name"],
160
+ "causality": attrs["causality"]}
157
161
  else:
158
162
  self.current_vr = None
159
163
  self.current_name = None
@@ -166,14 +170,10 @@ class FMUSplitterDescription:
166
170
  else:
167
171
  filename = f"{directory}/modelDescription.xml"
168
172
 
169
- self.vr_to_name[fmu_filename] = {
170
- "Real": {},
171
- "Integer": {},
172
- "Boolean": {},
173
- "String": {}
174
- }
173
+ self.vr_to_name[fmu_filename] = dict((el, {}) for el in EmbeddedFMUPort.ALL_TYPES)
175
174
  parser = xml.parsers.expat.ParserCreate()
176
175
  self.current_fmu_filename = fmu_filename
176
+ self.current_fmi_version = None
177
177
  self.current_vr = None
178
178
  self.current_name = None
179
179
  self.current_causality = None
@@ -266,14 +266,14 @@ class FMUSplitterDescription:
266
266
  def parse_txt_file(self, txt_filename: str):
267
267
  self.parse_model_description(str(Path(txt_filename).parent.parent), ".")
268
268
  logger.debug(f"Parsing container file '{txt_filename}'")
269
-
270
269
  with (self.zip.open(txt_filename) as file):
271
270
  self.parse_txt_file_header(file, txt_filename)
272
271
  self.parse_txt_file_ports(file)
273
272
 
274
273
  for fmu_filename in self.config["candidate_fmu"]:
275
274
  # Inputs per FMUs
276
- for fmi_type in ("Real", "Integer", "Boolean", "String"):
275
+
276
+ for fmi_type in self.supported_fmi_types:
277
277
  nb_input = int(self.get_line(file))
278
278
  for i in range(nb_input):
279
279
  local, vr = self.get_line(file).split(" ")
@@ -285,7 +285,7 @@ class FMUSplitterDescription:
285
285
  link.to_port.append(FMUSplitterPort(fmu_filename,
286
286
  self.vr_to_name[fmu_filename][fmi_type][int(vr)]["name"]))
287
287
 
288
- for fmi_type in ("Real", "Integer", "Boolean", "String"):
288
+ for fmi_type in self.supported_fmi_types:
289
289
  nb_start = int(self.get_line(file))
290
290
  for i in range(nb_start):
291
291
  tokens = self.get_line(file).split(" ")
@@ -299,7 +299,7 @@ class FMUSplitterDescription:
299
299
  self.config["start"] = [start_definition]
300
300
 
301
301
  # Output per FMUs
302
- for fmi_type in ("Real", "Integer", "Boolean", "String"):
302
+ for fmi_type in self.supported_fmi_types:
303
303
  nb_output = int(self.get_line(file))
304
304
 
305
305
  for i in range(nb_output):
@@ -311,6 +311,10 @@ class FMUSplitterDescription:
311
311
  self.links[fmi_type][local] = link
312
312
  link.from_port = FMUSplitterPort(fmu_filename,
313
313
  self.vr_to_name[fmu_filename][fmi_type][int(vr)]["name"])
314
+ #conversion
315
+ nb_conversion = int(self.get_line(file))
316
+ for i in range(nb_conversion):
317
+ self.get_line(file)
314
318
 
315
319
  logger.debug("End of parsing.")
316
320
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmu_manipulation_toolbox
3
- Version: 1.9rc8
3
+ Version: 1.9rc10
4
4
  Summary: FMU Manipulation Toolbox is a python application for modifying Functional Mock-up Units (FMUs) without recompilation or bundling them into FMU Containers
5
5
  Home-page: https://github.com/grouperenault/fmu_manipulation_toolbox/
6
6
  Author: Nicolas.LAURENT@Renault.com
@@ -1,20 +1,20 @@
1
1
  fmu_manipulation_toolbox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  fmu_manipulation_toolbox/__main__.py,sha256=FpG0ITBz5q-AvIbXplVh_1g1zla5souFGtpiDdECxEw,352
3
- fmu_manipulation_toolbox/__version__.py,sha256=i7MVU2dn03k8xxOBI-Wog94MgSsBs-uB_OCIZG--8v8,11
3
+ fmu_manipulation_toolbox/__version__.py,sha256=qsgfXycp13M4xRN0pMnvl2so7SqkBob6ChBzoU2KO50,12
4
4
  fmu_manipulation_toolbox/assembly.py,sha256=XQ_1sB6K1Dk2mnNe-E3_6Opoeub7F9Qaln0EUDzsop8,26553
5
5
  fmu_manipulation_toolbox/checker.py,sha256=jw1omfrMMIMHlIpHXpWBcQgIiS9hnHe5T9CZ5KlbVGs,2422
6
6
  fmu_manipulation_toolbox/container.py,sha256=Ed6JsWM2oMs-jyGyKmrHHebNuG4qwiGLYtx0BREIiBE,45710
7
7
  fmu_manipulation_toolbox/gui.py,sha256=ax-IbGO7GyBG0Mb5okN588CKQDfMxoF1uZtD1_CYnjc,29199
8
8
  fmu_manipulation_toolbox/gui_style.py,sha256=s6WdrnNd_lCMWhuBf5LKK8wrfLXCU7pFTLUfvqkJVno,6633
9
- fmu_manipulation_toolbox/help.py,sha256=aklKiLrsE0adSzQ5uoEB1sBDmI6s4l231gavu4XxxzA,5856
10
- fmu_manipulation_toolbox/operations.py,sha256=04fQYVDqqQD_BpK2DX7lMYt9GkQWxRQOfpg7YKXRI_Q,17466
9
+ fmu_manipulation_toolbox/help.py,sha256=j8xmnCrwQpaW-SZ8hSqA1dlTXgaqzQWc4Yr3RH_oqck,6012
10
+ fmu_manipulation_toolbox/operations.py,sha256=VQvFXRHF48e-ZLqoG8nbz61iB5lX6qAkqZHQ0m0lUPw,20577
11
11
  fmu_manipulation_toolbox/remoting.py,sha256=N25MDFkIcEWe9CIT1M4L9kea3j-8E7i2I1VOI6zIAdw,3876
12
- fmu_manipulation_toolbox/split.py,sha256=ONl1T37xJypF45GH3sZC6gKMSQ83xEl4xAWDSEOJsao,13571
12
+ fmu_manipulation_toolbox/split.py,sha256=yFaW6yhvFjOXpRynWzitR7o7uSrxb-RxeFzmQNxUFHI,14147
13
13
  fmu_manipulation_toolbox/version.py,sha256=OhBLkZ1-nhC77kyvffPNAf6m8OZe1bYTnNf_PWs1NvM,392
14
14
  fmu_manipulation_toolbox/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  fmu_manipulation_toolbox/cli/fmucontainer.py,sha256=6UaSSY6UGGlOfIh_CTG-Gk3ZPSd88Pi2cFCuzb87eks,4839
16
16
  fmu_manipulation_toolbox/cli/fmusplit.py,sha256=VMDYjmvIsjPHJINZaOt1Zy8D0so6d99285LbS8v-Tro,1734
17
- fmu_manipulation_toolbox/cli/fmutool.py,sha256=xvUSBNxoX605_JQJp4mTiGmHanj_NBoMUFb-SHdy1e4,6000
17
+ fmu_manipulation_toolbox/cli/fmutool.py,sha256=QRe6xQxQMD8FtEzoT5421Bq0YasgdIwOd9Too5TX5zg,6086
18
18
  fmu_manipulation_toolbox/cli/utils.py,sha256=gNhdlFYSSNSb0fovzS0crnxgmqqKXe0KtoZZFhRKhfg,1375
19
19
  fmu_manipulation_toolbox/resources/checkbox-checked-disabled.png,sha256=FWIuyrXlaNLLePHfXj7j9ca5rT8Hgr14KCe1EqTCZyk,2288
20
20
  fmu_manipulation_toolbox/resources/checkbox-checked-hover.png,sha256=KNlV-d_aJNTTvUVXKGT9DBY30sIs2LwocLJrFKNKv8k,2419
@@ -33,7 +33,7 @@ fmu_manipulation_toolbox/resources/icon_fmu.png,sha256=EuygB2xcoM2WAfKKdyKG_UvTL
33
33
  fmu_manipulation_toolbox/resources/license.txt,sha256=5ODuU8g8pIkK-NMWXu_rjZ6k7gM7b-N2rmg87-2Kmqw,1583
34
34
  fmu_manipulation_toolbox/resources/mask.png,sha256=px1U4hQGL0AmZ4BQPknOVREpMpTSejbah3ntkpqAzFA,3008
35
35
  fmu_manipulation_toolbox/resources/model.png,sha256=EAf_HnZJe8zYGZygerG1MMt2U-tMMZlifzXPj4_iORA,208788
36
- fmu_manipulation_toolbox/resources/darwin64/container.dylib,sha256=e75Qum_ccXXA-_hnu2rbyxUUWqtsbOzNXwyJ6GBcyfo,161560
36
+ fmu_manipulation_toolbox/resources/darwin64/container.dylib,sha256=Qr6zN0nLpe3PgpYk8rXvAS_1se9qyj_06cCd9443n08,161560
37
37
  fmu_manipulation_toolbox/resources/fmi-2.0/fmi2Annotation.xsd,sha256=OGfyJtaJntKypX5KDpuZ-nV1oYLZ6HV16pkpKOmYox4,2731
38
38
  fmu_manipulation_toolbox/resources/fmi-2.0/fmi2AttributeGroups.xsd,sha256=HwyV7LBse-PQSv4z1xjmtzPU3Hjnv4mluq9YdSBNHMQ,3704
39
39
  fmu_manipulation_toolbox/resources/fmi-2.0/fmi2ModelDescription.xsd,sha256=JM4j_9q-pc40XYHb28jfT3iV3aYM5JLqD5aRjO72K1E,18939
@@ -53,19 +53,19 @@ fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Type.xsd,sha256=TaHRoUBIFtmdEwBKB
53
53
  fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Unit.xsd,sha256=CK_F2t5LfyQ6eSNJ8soTFMVK9DU8vD2WiMi2MQvjB0g,3746
54
54
  fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Variable.xsd,sha256=3YU-3q1-c-namz7sMe5cxnmOVOJsRSmfWR02PKv3xaU,19171
55
55
  fmu_manipulation_toolbox/resources/fmi-3.0/fmi3VariableDependency.xsd,sha256=YQSBwXt4IsDlyegY8bX-qQHGSfE5TipTPfo2g2yqq1c,3082
56
- fmu_manipulation_toolbox/resources/linux32/client_sm.so,sha256=quoCvW_Azsj6Jaswa3oTPNvQRLIHCb0oipBWjJxzxvw,34756
56
+ fmu_manipulation_toolbox/resources/linux32/client_sm.so,sha256=TMVU2DhAnec90k0UvXkonybGGZlskonW-BIZ6qE9koM,34756
57
57
  fmu_manipulation_toolbox/resources/linux32/server_sm,sha256=gzKU0BTeaRkvhTMQtHHj3K8uYFyEdyGGn_mZy_jG9xo,21304
58
- fmu_manipulation_toolbox/resources/linux64/client_sm.so,sha256=88ajAAeS8KtcYoSQLL8Q_HaZhAwE4OKVa3SmnMvkeKo,32592
59
- fmu_manipulation_toolbox/resources/linux64/container.so,sha256=96It2AN-QU_3UZ8BHmovb4_JKyTSaKbwmRFD8Hb1nUA,135520
58
+ fmu_manipulation_toolbox/resources/linux64/client_sm.so,sha256=CSQBv69pCLIzTtwu9gGMepzGRUoBoUU-j-Vr1jAncjc,32592
59
+ fmu_manipulation_toolbox/resources/linux64/container.so,sha256=T_y9zagScUszMN12RJ4EERwCF2ssipD89ePdoWnZLmQ,135520
60
60
  fmu_manipulation_toolbox/resources/linux64/server_sm,sha256=MZn6vITN2qpBHYt_RaK2VnFFp00hk8fTALBHmXPtLwc,22608
61
- fmu_manipulation_toolbox/resources/win32/client_sm.dll,sha256=_G_0i3I1sXdGZ7dV2_2Yg__ZcWoAj5iJoTtvUjGfi2I,17920
62
- fmu_manipulation_toolbox/resources/win32/server_sm.exe,sha256=Nkmt5oxpnbMhB3H1lB4GZ8QFFNS7iw5YtM7dCbIY7ik,15360
63
- fmu_manipulation_toolbox/resources/win64/client_sm.dll,sha256=MgAemU9Eyj5A5cbRo2G2pi7O1mKvxab81tQ_t5odO3E,21504
64
- fmu_manipulation_toolbox/resources/win64/container.dll,sha256=-ER8WZXMCFB4ZpLxuo-iS-AV3Laga-6YDVqPfH1ZmTo,98816
65
- fmu_manipulation_toolbox/resources/win64/server_sm.exe,sha256=FeIZTOEKfS1jzvHW9C1beR127qW2FrSXN3bEZG97WmA,18432
66
- fmu_manipulation_toolbox-1.9rc8.dist-info/licenses/LICENSE.txt,sha256=c_862mzyk6ownO3Gt6cVs0-53IXLi_-ZEQFNDVabESw,1285
67
- fmu_manipulation_toolbox-1.9rc8.dist-info/METADATA,sha256=t0nOHfC7Cip_A5WSx-Tzx7idPJlsBTa5qgWebfvOJlg,1156
68
- fmu_manipulation_toolbox-1.9rc8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
69
- fmu_manipulation_toolbox-1.9rc8.dist-info/entry_points.txt,sha256=HjOZkflbI1IuSY8BpOZre20m24M4GDQGCJfPIa7NrlY,264
70
- fmu_manipulation_toolbox-1.9rc8.dist-info/top_level.txt,sha256=9D_h-5BMjSqf9z-XFkbJL_bMppR2XNYW3WNuPkXou0k,25
71
- fmu_manipulation_toolbox-1.9rc8.dist-info/RECORD,,
61
+ fmu_manipulation_toolbox/resources/win32/client_sm.dll,sha256=q7lMEHcmNgV3zsHzjGSMLnFO0KcolGSWTAr7WCb2EsI,17920
62
+ fmu_manipulation_toolbox/resources/win32/server_sm.exe,sha256=tNUKn-KrTQfiM-9_H-HDgovI_okt2lnnErt7Mw1ATYQ,15360
63
+ fmu_manipulation_toolbox/resources/win64/client_sm.dll,sha256=XTe0zd8CDxg3NmP2G91z2F6J3HfzEuRya-xAEEoV94g,21504
64
+ fmu_manipulation_toolbox/resources/win64/container.dll,sha256=aj9N02L8cysKZSR2RPvPKV5e9eMV2aHUz0-XNq6iKK8,98816
65
+ fmu_manipulation_toolbox/resources/win64/server_sm.exe,sha256=hLmKvTddvh8q0iIpySMAhAebv1LZkf53uMpKKIJn3Fs,18432
66
+ fmu_manipulation_toolbox-1.9rc10.dist-info/licenses/LICENSE.txt,sha256=c_862mzyk6ownO3Gt6cVs0-53IXLi_-ZEQFNDVabESw,1285
67
+ fmu_manipulation_toolbox-1.9rc10.dist-info/METADATA,sha256=QV7q42tQJ29jmn9Xz07jOg0gI_g_8LPqy5XYgMcSjb4,1157
68
+ fmu_manipulation_toolbox-1.9rc10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
69
+ fmu_manipulation_toolbox-1.9rc10.dist-info/entry_points.txt,sha256=HjOZkflbI1IuSY8BpOZre20m24M4GDQGCJfPIa7NrlY,264
70
+ fmu_manipulation_toolbox-1.9rc10.dist-info/top_level.txt,sha256=9D_h-5BMjSqf9z-XFkbJL_bMppR2XNYW3WNuPkXou0k,25
71
+ fmu_manipulation_toolbox-1.9rc10.dist-info/RECORD,,