@markw65/monkeyc-optimizer 1.1.73 → 1.1.74

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable changes to the "monkeyc-optimizer" package will be documented in this file.
4
4
 
5
+ ### 1.1.74
6
+
7
+ - Add refs from drawable-ids to the corresponding drawable (Fixes prettier-extension-monkeyc#20)
8
+ - Fix handling of 'identifier' params in resource files (Fixes prettier-extension-monkeyc#21)
9
+ - Fix a bug filtering out generated files on Windows (Fixes #45)
10
+
5
11
  ### 1.1.73
6
12
 
7
13
  - Fix an issue formatting body-less class/module/program nodes.
package/build/api.cjs CHANGED
@@ -18,50 +18,50 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var api_exports = {};
20
20
  __export(api_exports, {
21
- checkCompilerVersion: () => import_chunk_XNAPUWVE.checkCompilerVersion,
22
- collectNamespaces: () => import_chunk_XNAPUWVE.collectNamespaces,
23
- createDocumentationMap: () => import_chunk_XNAPUWVE.createDocumentationMap,
24
- diagnostic: () => import_chunk_XNAPUWVE.diagnostic,
25
- diagnosticHelper: () => import_chunk_XNAPUWVE.diagnosticHelper,
26
- findNamesInScope: () => import_chunk_XNAPUWVE.findNamesInScope,
27
- findUsingForNode: () => import_chunk_XNAPUWVE.findUsingForNode,
28
- formatAst: () => import_chunk_XNAPUWVE.formatAst,
29
- formatAstLongLines: () => import_chunk_XNAPUWVE.formatAstLongLines,
30
- formatScopedName: () => import_chunk_XNAPUWVE.formatScopedName,
31
- getApiFunctionInfo: () => import_chunk_XNAPUWVE.getApiFunctionInfo,
32
- getApiMapping: () => import_chunk_XNAPUWVE.getApiMapping,
33
- getSuperClasses: () => import_chunk_XNAPUWVE.getSuperClasses,
34
- handleImportUsing: () => import_chunk_XNAPUWVE.handleImportUsing,
21
+ checkCompilerVersion: () => import_chunk_7OAMZRC7.checkCompilerVersion,
22
+ collectNamespaces: () => import_chunk_7OAMZRC7.collectNamespaces,
23
+ createDocumentationMap: () => import_chunk_7OAMZRC7.createDocumentationMap,
24
+ diagnostic: () => import_chunk_7OAMZRC7.diagnostic,
25
+ diagnosticHelper: () => import_chunk_7OAMZRC7.diagnosticHelper,
26
+ findNamesInScope: () => import_chunk_7OAMZRC7.findNamesInScope,
27
+ findUsingForNode: () => import_chunk_7OAMZRC7.findUsingForNode,
28
+ formatAst: () => import_chunk_7OAMZRC7.formatAst,
29
+ formatAstLongLines: () => import_chunk_7OAMZRC7.formatAstLongLines,
30
+ formatScopedName: () => import_chunk_7OAMZRC7.formatScopedName,
31
+ getApiFunctionInfo: () => import_chunk_7OAMZRC7.getApiFunctionInfo,
32
+ getApiMapping: () => import_chunk_7OAMZRC7.getApiMapping,
33
+ getSuperClasses: () => import_chunk_7OAMZRC7.getSuperClasses,
34
+ handleImportUsing: () => import_chunk_7OAMZRC7.handleImportUsing,
35
35
  hasProperty: () => import_chunk_JDC43A3I.hasProperty,
36
- isClassVariable: () => import_chunk_XNAPUWVE.isClassVariable,
37
- isLocal: () => import_chunk_XNAPUWVE.isLocal,
38
- isLookupCandidate: () => import_chunk_XNAPUWVE.isLookupCandidate,
39
- isStateNode: () => import_chunk_XNAPUWVE.isStateNode,
40
- lookupByFullName: () => import_chunk_XNAPUWVE.lookupByFullName,
41
- lookupNext: () => import_chunk_XNAPUWVE.lookupNext,
42
- lookupResultContains: () => import_chunk_XNAPUWVE.lookupResultContains,
43
- lookupWithType: () => import_chunk_XNAPUWVE.lookupWithType,
44
- makeToyboxLink: () => import_chunk_XNAPUWVE.makeToyboxLink,
45
- mapVarDeclsByType: () => import_chunk_XNAPUWVE.mapVarDeclsByType,
46
- markInvokeClassMethod: () => import_chunk_XNAPUWVE.markInvokeClassMethod,
47
- parseSdkVersion: () => import_chunk_XNAPUWVE.parseSdkVersion,
48
- popRootNode: () => import_chunk_XNAPUWVE.popRootNode,
49
- pushRootNode: () => import_chunk_XNAPUWVE.pushRootNode,
50
- resolveDiagnostics: () => import_chunk_XNAPUWVE.resolveDiagnostics,
51
- resolveDiagnosticsMap: () => import_chunk_XNAPUWVE.resolveDiagnosticsMap,
52
- sameLookupResult: () => import_chunk_XNAPUWVE.sameLookupResult,
36
+ isClassVariable: () => import_chunk_7OAMZRC7.isClassVariable,
37
+ isLocal: () => import_chunk_7OAMZRC7.isLocal,
38
+ isLookupCandidate: () => import_chunk_7OAMZRC7.isLookupCandidate,
39
+ isStateNode: () => import_chunk_7OAMZRC7.isStateNode,
40
+ lookupByFullName: () => import_chunk_7OAMZRC7.lookupByFullName,
41
+ lookupNext: () => import_chunk_7OAMZRC7.lookupNext,
42
+ lookupResultContains: () => import_chunk_7OAMZRC7.lookupResultContains,
43
+ lookupWithType: () => import_chunk_7OAMZRC7.lookupWithType,
44
+ makeToyboxLink: () => import_chunk_7OAMZRC7.makeToyboxLink,
45
+ mapVarDeclsByType: () => import_chunk_7OAMZRC7.mapVarDeclsByType,
46
+ markInvokeClassMethod: () => import_chunk_7OAMZRC7.markInvokeClassMethod,
47
+ parseSdkVersion: () => import_chunk_7OAMZRC7.parseSdkVersion,
48
+ popRootNode: () => import_chunk_7OAMZRC7.popRootNode,
49
+ pushRootNode: () => import_chunk_7OAMZRC7.pushRootNode,
50
+ resolveDiagnostics: () => import_chunk_7OAMZRC7.resolveDiagnostics,
51
+ resolveDiagnosticsMap: () => import_chunk_7OAMZRC7.resolveDiagnosticsMap,
52
+ sameLookupResult: () => import_chunk_7OAMZRC7.sameLookupResult,
53
53
  traverseAst: () => import_chunk_JDC43A3I.traverseAst,
54
- variableDeclarationName: () => import_chunk_XNAPUWVE.variableDeclarationName,
55
- visitReferences: () => import_chunk_XNAPUWVE.visitReferences,
56
- visit_resources: () => import_chunk_XNAPUWVE.visit_resources,
57
- visitorNode: () => import_chunk_XNAPUWVE.visitorNode
54
+ variableDeclarationName: () => import_chunk_7OAMZRC7.variableDeclarationName,
55
+ visitReferences: () => import_chunk_7OAMZRC7.visitReferences,
56
+ visit_resources: () => import_chunk_7OAMZRC7.visit_resources,
57
+ visitorNode: () => import_chunk_7OAMZRC7.visitorNode
58
58
  });
59
59
  module.exports = __toCommonJS(api_exports);
60
- var import_chunk_XNAPUWVE = require("./chunk-XNAPUWVE.cjs");
60
+ var import_chunk_7OAMZRC7 = require("./chunk-7OAMZRC7.cjs");
61
61
  var import_chunk_NHZRKHZO = require("./chunk-NHZRKHZO.cjs");
62
62
  var import_chunk_JDC43A3I = require("./chunk-JDC43A3I.cjs");
63
63
  var import_chunk_ABYVSU2C = require("./chunk-ABYVSU2C.cjs");
64
- (0, import_chunk_XNAPUWVE.init_api)();
64
+ (0, import_chunk_7OAMZRC7.init_api)();
65
65
  // Annotate the CommonJS export names for ESM import in node:
66
66
  0 && (module.exports = {
67
67
  checkCompilerVersion,
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_XNAPUWVE_exports = {};
30
- __export(chunk_XNAPUWVE_exports, {
29
+ var chunk_7OAMZRC7_exports = {};
30
+ __export(chunk_7OAMZRC7_exports, {
31
31
  EnumTagsConst: () => EnumTagsConst,
32
32
  LastTypeTag: () => LastTypeTag,
33
33
  ObjectLikeTagsConst: () => ObjectLikeTagsConst,
@@ -138,7 +138,7 @@ __export(chunk_XNAPUWVE_exports, {
138
138
  visitorNode: () => visitorNode,
139
139
  xml_util_exports: () => xml_util_exports
140
140
  });
141
- module.exports = __toCommonJS(chunk_XNAPUWVE_exports);
141
+ module.exports = __toCommonJS(chunk_7OAMZRC7_exports);
142
142
  var import_chunk_NHZRKHZO = require("./chunk-NHZRKHZO.cjs");
143
143
  var import_chunk_JDC43A3I = require("./chunk-JDC43A3I.cjs");
144
144
  var import_chunk_ABYVSU2C = require("./chunk-ABYVSU2C.cjs");
@@ -18263,7 +18263,7 @@ function visit_resource_refs(state, doc, e, barrelNames) {
18263
18263
  }
18264
18264
  }
18265
18265
  }
18266
- if ((0, import_chunk_JDC43A3I.hasProperty)(skip, name) || /^\d+(\.\d+)?%?$/.test(name)) {
18266
+ if (skip === true || (0, import_chunk_JDC43A3I.hasProperty)(skip, name) || /^\d+(\.\d+)?%?$/.test(name)) {
18267
18267
  return;
18268
18268
  }
18269
18269
  if (/^([-\w_$]+\s*\.\s*)*[-\w_$]+$/.test(name)) {
@@ -18357,6 +18357,13 @@ function visit_resource_refs(state, doc, e, barrelNames) {
18357
18357
  case "drawable":
18358
18358
  if (id === "class") {
18359
18359
  parseArg(dotted, l);
18360
+ } else if (id === "id" && !element.attr.class) {
18361
+ if (/^\w+$/.test(dotted)) {
18362
+ const base = (0, import_chunk_JDC43A3I.makeScopedName)(`Rez.Drawables`);
18363
+ const idLoc = (0, import_chunk_JDC43A3I.adjustLoc)(l, 0, 0);
18364
+ const id2 = (0, import_chunk_JDC43A3I.makeIdentifier)(dotted, idLoc);
18365
+ result.push((0, import_chunk_JDC43A3I.makeMemberExpression)((0, import_chunk_JDC43A3I.withLoc)(base, id2, false), id2));
18366
+ }
18360
18367
  }
18361
18368
  return;
18362
18369
  case "shape":
@@ -18615,7 +18622,8 @@ var init_resources = (0, import_chunk_ABYVSU2C.__esm)({
18615
18622
  foreground: {},
18616
18623
  background: {},
18617
18624
  font: {},
18618
- justification: {}
18625
+ justification: {},
18626
+ identifier: true
18619
18627
  };
18620
18628
  }
18621
18629
  });
@@ -29969,7 +29977,7 @@ async function filesFromPaths(workspace, buildDir, inPaths, extension) {
29969
29977
  (pattern) => (0, import_chunk_NHZRKHZO.globa)(pattern, { cwd: workspace, mark: true }).then(
29970
29978
  (paths2) => paths2.map((p) => ({
29971
29979
  path: p,
29972
- filter: filter && /^\*\*[\\/]\*.mc$/i.test(path4.relative(workspace, pattern))
29980
+ filter: filter && /^\*\*[\\/]\*\.mc$/i.test(path4.relative(workspace, pattern))
29973
29981
  }))
29974
29982
  )
29975
29983
  ) || []
@@ -29987,11 +29995,12 @@ async function filesFromPaths(workspace, buildDir, inPaths, extension) {
29987
29995
  ) : result
29988
29996
  )
29989
29997
  );
29998
+ const buildDirNormalized = buildDir.replace(/\\/g, "/");
29990
29999
  return {
29991
30000
  files: files.flat().filter(
29992
- (file) => file.path.endsWith(extension) && (!file.filter || !file.path.startsWith(buildDir))
30001
+ (file) => file.path.endsWith(extension) && (!file.filter || !file.path.startsWith(buildDirNormalized))
29993
30002
  ).map(({ path: path7 }) => path7),
29994
- paths: paths.map(({ path: path7 }) => path7)
30003
+ paths: paths.filter(({ path: path7 }) => path7.endsWith("/")).map(({ path: path7 }) => path7)
29995
30004
  };
29996
30005
  }
29997
30006
  async function fileInfoFromConfig(workspace, buildDir, output, buildConfig, extraExcludes, barrel) {
@@ -30121,7 +30130,7 @@ async function generateOneConfig(buildConfig, manifestXML, dependencyFiles, conf
30121
30130
  const opt_time = await (0, import_chunk_NHZRKHZO.first_modified)(
30122
30131
  Object.values(fnMap).map((v) => v.output)
30123
30132
  );
30124
- if (source_time < opt_time && 1722003035546 < opt_time) {
30133
+ if (source_time < opt_time && 1723999677373 < opt_time) {
30125
30134
  return {
30126
30135
  hasTests,
30127
30136
  diagnostics: prevDiagnostics,
@@ -30159,7 +30168,7 @@ async function generateOneConfig(buildConfig, manifestXML, dependencyFiles, conf
30159
30168
  hasTests: hasTests2,
30160
30169
  diagnostics,
30161
30170
  sdkVersion,
30162
- optimizerVersion: "1.1.73",
30171
+ optimizerVersion: "1.1.74",
30163
30172
  ...Object.fromEntries(
30164
30173
  configOptionsToCheck.map((option) => [option, config[option]])
30165
30174
  )
@@ -18,30 +18,30 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var optimizer_exports = {};
20
20
  __export(optimizer_exports, {
21
- StateNodeAttributes: () => import_chunk_XNAPUWVE.StateNodeAttributes,
22
- buildConfigDescription: () => import_chunk_XNAPUWVE.buildConfigDescription,
23
- buildOptimizedProject: () => import_chunk_XNAPUWVE.buildOptimizedProject,
21
+ StateNodeAttributes: () => import_chunk_7OAMZRC7.StateNodeAttributes,
22
+ buildConfigDescription: () => import_chunk_7OAMZRC7.buildConfigDescription,
23
+ buildOptimizedProject: () => import_chunk_7OAMZRC7.buildOptimizedProject,
24
24
  copyRecursiveAsNeeded: () => import_chunk_NHZRKHZO.copyRecursiveAsNeeded,
25
- defaultConfig: () => import_chunk_XNAPUWVE.defaultConfig,
26
- display: () => import_chunk_XNAPUWVE.display,
27
- generateOneConfig: () => import_chunk_XNAPUWVE.generateOneConfig,
28
- generateOptimizedProject: () => import_chunk_XNAPUWVE.generateOptimizedProject,
29
- getConfig: () => import_chunk_XNAPUWVE.getConfig,
30
- getFnMapAnalysis: () => import_chunk_XNAPUWVE.getFnMapAnalysis,
31
- getProjectAnalysis: () => import_chunk_XNAPUWVE.getProjectAnalysis,
32
- get_jungle: () => import_chunk_XNAPUWVE.get_jungle,
33
- isErrorWithLocation: () => import_chunk_XNAPUWVE.isErrorWithLocation,
34
- launchSimulator: () => import_chunk_XNAPUWVE.launchSimulator,
35
- manifestProducts: () => import_chunk_XNAPUWVE.manifestProducts,
36
- mctree: () => import_chunk_XNAPUWVE.mctree,
37
- simulateProgram: () => import_chunk_XNAPUWVE.simulateProgram
25
+ defaultConfig: () => import_chunk_7OAMZRC7.defaultConfig,
26
+ display: () => import_chunk_7OAMZRC7.display,
27
+ generateOneConfig: () => import_chunk_7OAMZRC7.generateOneConfig,
28
+ generateOptimizedProject: () => import_chunk_7OAMZRC7.generateOptimizedProject,
29
+ getConfig: () => import_chunk_7OAMZRC7.getConfig,
30
+ getFnMapAnalysis: () => import_chunk_7OAMZRC7.getFnMapAnalysis,
31
+ getProjectAnalysis: () => import_chunk_7OAMZRC7.getProjectAnalysis,
32
+ get_jungle: () => import_chunk_7OAMZRC7.get_jungle,
33
+ isErrorWithLocation: () => import_chunk_7OAMZRC7.isErrorWithLocation,
34
+ launchSimulator: () => import_chunk_7OAMZRC7.launchSimulator,
35
+ manifestProducts: () => import_chunk_7OAMZRC7.manifestProducts,
36
+ mctree: () => import_chunk_7OAMZRC7.mctree,
37
+ simulateProgram: () => import_chunk_7OAMZRC7.simulateProgram
38
38
  });
39
39
  module.exports = __toCommonJS(optimizer_exports);
40
- var import_chunk_XNAPUWVE = require("./chunk-XNAPUWVE.cjs");
40
+ var import_chunk_7OAMZRC7 = require("./chunk-7OAMZRC7.cjs");
41
41
  var import_chunk_NHZRKHZO = require("./chunk-NHZRKHZO.cjs");
42
42
  var import_chunk_JDC43A3I = require("./chunk-JDC43A3I.cjs");
43
43
  var import_chunk_ABYVSU2C = require("./chunk-ABYVSU2C.cjs");
44
- (0, import_chunk_XNAPUWVE.init_optimizer)();
44
+ (0, import_chunk_7OAMZRC7.init_optimizer)();
45
45
  // Annotate the CommonJS export names for ESM import in node:
46
46
  0 && (module.exports = {
47
47
  StateNodeAttributes,
@@ -18,25 +18,25 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var sdk_util_exports = {};
20
20
  __export(sdk_util_exports, {
21
- SectionKinds: () => import_chunk_XNAPUWVE.SectionKinds,
22
- appSupport: () => import_chunk_XNAPUWVE.appSupport,
23
- connectiq: () => import_chunk_XNAPUWVE.connectiq,
24
- getDeviceInfo: () => import_chunk_XNAPUWVE.getDeviceInfo,
25
- getFunctionDocumentation: () => import_chunk_XNAPUWVE.getFunctionDocumentation,
26
- getLanguages: () => import_chunk_XNAPUWVE.getLanguages,
27
- getSdkPath: () => import_chunk_XNAPUWVE.getSdkPath,
28
- isWin: () => import_chunk_XNAPUWVE.isWin,
29
- optimizeProgram: () => import_chunk_XNAPUWVE.optimizeProgram,
30
- readPrg: () => import_chunk_XNAPUWVE.readPrg,
31
- readPrgWithOffsets: () => import_chunk_XNAPUWVE.readPrgWithOffsets,
32
- xmlUtil: () => import_chunk_XNAPUWVE.xml_util_exports
21
+ SectionKinds: () => import_chunk_7OAMZRC7.SectionKinds,
22
+ appSupport: () => import_chunk_7OAMZRC7.appSupport,
23
+ connectiq: () => import_chunk_7OAMZRC7.connectiq,
24
+ getDeviceInfo: () => import_chunk_7OAMZRC7.getDeviceInfo,
25
+ getFunctionDocumentation: () => import_chunk_7OAMZRC7.getFunctionDocumentation,
26
+ getLanguages: () => import_chunk_7OAMZRC7.getLanguages,
27
+ getSdkPath: () => import_chunk_7OAMZRC7.getSdkPath,
28
+ isWin: () => import_chunk_7OAMZRC7.isWin,
29
+ optimizeProgram: () => import_chunk_7OAMZRC7.optimizeProgram,
30
+ readPrg: () => import_chunk_7OAMZRC7.readPrg,
31
+ readPrgWithOffsets: () => import_chunk_7OAMZRC7.readPrgWithOffsets,
32
+ xmlUtil: () => import_chunk_7OAMZRC7.xml_util_exports
33
33
  });
34
34
  module.exports = __toCommonJS(sdk_util_exports);
35
- var import_chunk_XNAPUWVE = require("./chunk-XNAPUWVE.cjs");
35
+ var import_chunk_7OAMZRC7 = require("./chunk-7OAMZRC7.cjs");
36
36
  var import_chunk_NHZRKHZO = require("./chunk-NHZRKHZO.cjs");
37
37
  var import_chunk_JDC43A3I = require("./chunk-JDC43A3I.cjs");
38
38
  var import_chunk_ABYVSU2C = require("./chunk-ABYVSU2C.cjs");
39
- (0, import_chunk_XNAPUWVE.init_sdk_util)();
39
+ (0, import_chunk_7OAMZRC7.init_sdk_util)();
40
40
  // Annotate the CommonJS export names for ESM import in node:
41
41
  0 && (module.exports = {
42
42
  SectionKinds,
@@ -21,17 +21,17 @@ __export(worker_thread_exports, {
21
21
  default: () => worker_thread_default
22
22
  });
23
23
  module.exports = __toCommonJS(worker_thread_exports);
24
- var import_chunk_XNAPUWVE = require("./chunk-XNAPUWVE.cjs");
24
+ var import_chunk_7OAMZRC7 = require("./chunk-7OAMZRC7.cjs");
25
25
  var import_chunk_NHZRKHZO = require("./chunk-NHZRKHZO.cjs");
26
26
  var import_chunk_JDC43A3I = require("./chunk-JDC43A3I.cjs");
27
27
  var import_chunk_ABYVSU2C = require("./chunk-ABYVSU2C.cjs");
28
28
  var import_node_worker_threads = require("node:worker_threads");
29
29
  var require_worker_thread = (0, import_chunk_ABYVSU2C.__commonJS)({
30
30
  "src/worker-thread.ts"() {
31
- (0, import_chunk_XNAPUWVE.init_worker_task)();
31
+ (0, import_chunk_7OAMZRC7.init_worker_task)();
32
32
  if (import_node_worker_threads.parentPort) {
33
33
  import_node_worker_threads.parentPort.on("message", async (task) => {
34
- return import_node_worker_threads.parentPort.postMessage(await (0, import_chunk_XNAPUWVE.performTask)(task));
34
+ return import_node_worker_threads.parentPort.postMessage(await (0, import_chunk_7OAMZRC7.performTask)(task));
35
35
  });
36
36
  }
37
37
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@markw65/monkeyc-optimizer",
3
3
  "type": "commonjs",
4
- "version": "1.1.73",
4
+ "version": "1.1.74",
5
5
  "description": "Source to source optimizer for Garmin Monkey C code",
6
6
  "main": "build/optimizer.cjs",
7
7
  "types": "build/src/optimizer.d.ts",
@@ -35,7 +35,7 @@
35
35
  "test-post-only": "node test/test.js --showInfo --typeCheckLevel Strict --skipOptimization --postOptimize --run-tests --product=fenix5 --product=fr235 --jungle ./test/OptimizerTests/monkey.jungle",
36
36
  "test-garmin-opt": "node test/test.js --typeCheckLevel Strict --skipOptimization --garminOptLevel=2 --run-tests --product=fenix5 --product=fr235 --jungle ./test/OptimizerTests/monkey.jungle",
37
37
  "test-personality": "node test/test-personality.js",
38
- "test-analysis": "node test/test.js --showInfo --typeCheckLevel Strict --product=fr955 --sourceFile 'test/analysis/*.mc'",
38
+ "test-analysis": "node test/test.js --showInfo --typeCheckLevel Strict --product=fr955 --sourceFile \"test/analysis/*.mc\"",
39
39
  "test-tiny": "node test/test-tiny.js",
40
40
  "eslint": "npx eslint ."
41
41
  },