vitest-pool-assemblyscript 0.7.0 → 0.9.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 (93) hide show
  1. package/README.md +10 -13
  2. package/assembly/compare.ts +469 -76
  3. package/assembly/expect.ts +160 -67
  4. package/assembly/index.ts +0 -10
  5. package/assembly/utils.ts +168 -0
  6. package/dist/{addon-interface-_pNXcbib.mjs → addon-interface-CYFXMbK7.mjs} +4 -3
  7. package/dist/addon-interface-CYFXMbK7.mjs.map +1 -0
  8. package/dist/{ast-visitor-C5gQqWD2.mjs → ast-visitor-CWEOd3UH.mjs} +15 -2
  9. package/dist/ast-visitor-CWEOd3UH.mjs.map +1 -0
  10. package/dist/{compile-runner-DOMhsLQE.mjs → compile-runner-BGQhBkBo.mjs} +8 -7
  11. package/dist/compile-runner-BGQhBkBo.mjs.map +1 -0
  12. package/dist/compiler/transforms/deep-equals.d.mts +14 -0
  13. package/dist/compiler/transforms/deep-equals.d.mts.map +1 -0
  14. package/dist/compiler/transforms/deep-equals.mjs +245 -0
  15. package/dist/compiler/transforms/deep-equals.mjs.map +1 -0
  16. package/dist/compiler/transforms/strip-inline.mjs +2 -2
  17. package/dist/{compiler-CIXpfKq0.mjs → compiler-hUlDr5vL.mjs} +14 -6
  18. package/dist/compiler-hUlDr5vL.mjs.map +1 -0
  19. package/dist/config/index-v3.d.mts +33 -3
  20. package/dist/config/index-v3.d.mts.map +1 -1
  21. package/dist/config/index-v3.mjs.map +1 -1
  22. package/dist/config/index.d.mts +29 -4
  23. package/dist/config/index.d.mts.map +1 -0
  24. package/dist/config/index.mjs +6 -6
  25. package/dist/{constants-DuBLuMjt.mjs → constants-DbxJ3hzg.mjs} +10 -97
  26. package/dist/constants-DbxJ3hzg.mjs.map +1 -0
  27. package/dist/coverage-provider/index.mjs +30 -10
  28. package/dist/coverage-provider/index.mjs.map +1 -1
  29. package/dist/{debug-Cm1VFmaz.mjs → debug-DtRAL4rM.mjs} +38 -4
  30. package/dist/debug-DtRAL4rM.mjs.map +1 -0
  31. package/dist/{feature-check-ELxw_Mji.mjs → feature-check-Bje3ntpV.mjs} +2 -2
  32. package/dist/{feature-check-ELxw_Mji.mjs.map → feature-check-Bje3ntpV.mjs.map} +1 -1
  33. package/dist/index-internal.d.mts +1 -1
  34. package/dist/index-internal.d.mts.map +1 -1
  35. package/dist/index-internal.mjs +4 -4
  36. package/dist/index-v3.d.mts.map +1 -1
  37. package/dist/index-v3.mjs +8 -7
  38. package/dist/index-v3.mjs.map +1 -1
  39. package/dist/index.d.mts +1 -2
  40. package/dist/index.mjs +6 -6
  41. package/dist/{load-user-imports-B3Iy_K8k.mjs → load-user-imports-Bx5ZlhSm.mjs} +9 -9
  42. package/dist/load-user-imports-Bx5ZlhSm.mjs.map +1 -0
  43. package/dist/{pool-runner-init-BDQtAGwQ.mjs → pool-runner-init-BqkwQ2tk.mjs} +7 -7
  44. package/dist/pool-runner-init-BqkwQ2tk.mjs.map +1 -0
  45. package/dist/{pool-runner-init-CvnB0-iN.d.mts → pool-runner-init-CNpRdA5u.d.mts} +2 -2
  46. package/dist/pool-runner-init-CNpRdA5u.d.mts.map +1 -0
  47. package/dist/pool-thread/compile-worker-thread.d.mts +1 -1
  48. package/dist/pool-thread/compile-worker-thread.d.mts.map +1 -1
  49. package/dist/pool-thread/compile-worker-thread.mjs +10 -13
  50. package/dist/pool-thread/compile-worker-thread.mjs.map +1 -1
  51. package/dist/pool-thread/test-worker-thread.d.mts +1 -1
  52. package/dist/pool-thread/test-worker-thread.d.mts.map +1 -1
  53. package/dist/pool-thread/test-worker-thread.mjs +8 -11
  54. package/dist/pool-thread/test-worker-thread.mjs.map +1 -1
  55. package/dist/pool-thread/v3-tinypool-thread.d.mts +1 -1
  56. package/dist/pool-thread/v3-tinypool-thread.d.mts.map +1 -1
  57. package/dist/pool-thread/v3-tinypool-thread.mjs +12 -18
  58. package/dist/pool-thread/v3-tinypool-thread.mjs.map +1 -1
  59. package/dist/{resolve-config-DhZ4lOSK.mjs → resolve-config-s9gSJSMc.mjs} +14 -5
  60. package/dist/resolve-config-s9gSJSMc.mjs.map +1 -0
  61. package/dist/{test-runner-C4I9VknR.mjs → test-runner-BGqc9uCK.mjs} +4 -4
  62. package/dist/{test-runner-C4I9VknR.mjs.map → test-runner-BGqc9uCK.mjs.map} +1 -1
  63. package/dist/{types-D0nprJo1.d.mts → types-DHVk5iAx.d.mts} +17 -11
  64. package/dist/types-DHVk5iAx.d.mts.map +1 -0
  65. package/dist/vitest-file-tasks-D8sOClGX.mjs +149 -0
  66. package/dist/vitest-file-tasks-D8sOClGX.mjs.map +1 -0
  67. package/dist/{vitest-tasks--ow4pacR.mjs → vitest-tasks-BZ24sghI.mjs} +6 -4
  68. package/dist/vitest-tasks-BZ24sghI.mjs.map +1 -0
  69. package/package.json +11 -14
  70. package/prebuilds/darwin-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
  71. package/prebuilds/darwin-x64/vitest-pool-assemblyscript.glibc.node +0 -0
  72. package/prebuilds/linux-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
  73. package/prebuilds/linux-x64/vitest-pool-assemblyscript.glibc.node +0 -0
  74. package/prebuilds/linux-x64/vitest-pool-assemblyscript.musl.node +0 -0
  75. package/prebuilds/win32-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
  76. package/prebuilds/win32-x64/vitest-pool-assemblyscript.glibc.node +0 -0
  77. package/src/instrumentation/native/addon.cpp +29 -3
  78. package/dist/addon-interface-_pNXcbib.mjs.map +0 -1
  79. package/dist/ast-visitor-C5gQqWD2.mjs.map +0 -1
  80. package/dist/compile-runner-DOMhsLQE.mjs.map +0 -1
  81. package/dist/compiler-CIXpfKq0.mjs.map +0 -1
  82. package/dist/constants-DuBLuMjt.mjs.map +0 -1
  83. package/dist/custom-provider-options-YTk1m7At.d.mts +0 -26
  84. package/dist/custom-provider-options-YTk1m7At.d.mts.map +0 -1
  85. package/dist/debug-Cm1VFmaz.mjs.map +0 -1
  86. package/dist/load-user-imports-B3Iy_K8k.mjs.map +0 -1
  87. package/dist/pool-runner-init-BDQtAGwQ.mjs.map +0 -1
  88. package/dist/pool-runner-init-CvnB0-iN.d.mts.map +0 -1
  89. package/dist/resolve-config-DhZ4lOSK.mjs.map +0 -1
  90. package/dist/types-D0nprJo1.d.mts.map +0 -1
  91. package/dist/vitest-file-tasks-Bn9CrWt_.mjs +0 -61
  92. package/dist/vitest-file-tasks-Bn9CrWt_.mjs.map +0 -1
  93. package/dist/vitest-tasks--ow4pacR.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"vitest-tasks--ow4pacR.mjs","names":[],"sources":["../src/wasm-executor/source-maps.ts","../src/util/vitest-tasks.ts"],"sourcesContent":["/**\n * Source Map Utilities\n *\n * Maps WASM errors to AssemblyScript source locations using V8 stack traces + source maps.\n *\n * Approach: V8's Error.prepareStackTrace provides WAT (WebAssembly Text) line:column positions,\n * which can be mapped to AS source using the source maps generated by AS compiler.\n */\n\nimport { type RawSourceMap, SourceMapConsumer } from 'source-map';\n\nimport { debug } from '../util/debug.js';\nimport type { WebAssemblyCallSite } from '../types/types.js';\nimport { createPoolErrorFromAnyError } from '../util/pool-errors.js';\nimport { POOL_ERROR_NAMES } from '../types/constants.js';\n\nexport function parseSourceMap(sourceMap: string): RawSourceMap {\n // Remove sourceRoot if present to prevent source-map library from prepending it to paths\n // AS compiler sets sourceRoot: \"./output\" which would make paths like \"output/tests/...\"\n // instead of \"tests/...\" - these paths don't exist and won't be found by Vitest\n try {\n const sourceMapObj: RawSourceMap = JSON.parse(sourceMap);\n delete sourceMapObj.sourceRoot;\n return sourceMapObj;\n }\n catch (err) {\n throw createPoolErrorFromAnyError(\n `parseSourceMap error`,\n POOL_ERROR_NAMES.PoolError,\n err\n )\n }\n}\n\n/**\n * Extract structured call stack from V8 using Error.prepareStackTrace\n *\n * V8 provides a special API to access structured stack traces with line:column info.\n * This gives us WAT text positions which can be mapped to AS source via source maps.\n *\n * @param capturedError - Error object to extract stack from\n * @returns Array of V8 CallSite objects\n */\nexport function extractCallStack(capturedError: Error): NodeJS.CallSite[] {\n let stackTrace: NodeJS.CallSite[] = [];\n\n const originalPrepareStackTrace = Error.prepareStackTrace;\n Error.prepareStackTrace = (_err: Error, structuredStackTrace: NodeJS.CallSite[]) => {\n stackTrace = structuredStackTrace;\n return ''; // Return empty string to avoid modifying error.stack\n };\n\n // Access error.stack to trigger prepareStackTrace (result unused, just triggers callback)\n capturedError.stack;\n\n // Restore original\n Error.prepareStackTrace = originalPrepareStackTrace;\n\n return stackTrace;\n}\n\n/**\n * Create WebAssembly call site with source mapping\n *\n * Takes a V8 CallSite and maps it to AS source location if possible.\n *\n * @param callSite - V8 CallSite object from Error.prepareStackTrace\n * @param sourceMapJson - Source map consumer initialized with WASM source map\n * @returns Mapped call site or null if not a WASM call site\n */\nexport function createWebAssemblyCallSite(\n callSite: NodeJS.CallSite,\n sourceMapConsumer: SourceMapConsumer,\n loggingPrefix: string,\n): WebAssemblyCallSite | null {\n const fileName = callSite.getFileName();\n\n // Only process WASM call sites\n if (!fileName || !fileName.startsWith('wasm://')) {\n return null;\n }\n\n const watLine = callSite.getLineNumber();\n const watColumn = callSite.getColumnNumber();\n const functionName = callSite.getFunctionName() || 'wasm-function[unknown]';\n const debugString = `function: \"${functionName}\" | wasm: ${fileName}:${watLine}:${watColumn}`;\n\n // Try to map to source\n if (watLine && watColumn) {\n const original = sourceMapConsumer.originalPositionFor({\n line: watLine,\n column: watColumn\n });\n \n if (!original.source || original.line === null || original.column === null) {\n debug(`${loggingPrefix} - Failed to source-map stack location: ${debugString}`);\n return null;\n }\n\n debug(`${loggingPrefix} - Source-mapped stack location: ${debugString} → ${original.source}:${original.line}:${original.column}`);\n \n const callSite: WebAssemblyCallSite = {\n functionName,\n location: {\n filePath: original.source,\n line: original.line,\n column: original.column\n }\n };\n\n return callSite;\n }\n\n debug(`${loggingPrefix} - Failed to source-map stack-location: ${debugString}`);\n\n // Fallback to WAT position\n return {\n functionName,\n location: {\n filePath: fileName,\n line: watLine || -1,\n column: watColumn || -1\n }\n };\n}\n","import type { File, RunMode, Suite, Task, Test } from '@vitest/runner/types';\n\nimport type {\n AssemblyScriptCoveragePayload,\n AssemblyScriptSuiteTaskMeta,\n AssemblyScriptTestError,\n AssemblyScriptTestOptions,\n AssemblyScriptTestTaskMeta,\n FailedAssertion,\n VitestVersion,\n WASMExecutorPerfTimings\n} from '../types/types.js';\nimport { TEST_ERROR_NAMES } from '../types/constants.js';\nimport { debug } from './debug.js';\nimport { createTestExpectedToFailError, createTestTimeoutError } from './pool-errors.js';\nimport { extractCallStack } from '../wasm-executor/source-maps.js';\n\n// ============================================================================\n// Util\n// ============================================================================\n\nfunction positiveSum<T>(items: T[], getSummableValue: (_next: T) => number | undefined): number {\n return items.reduce((total, next) => {\n return total + Math.max(getSummableValue(next) || 0, 0)\n }, 0);\n}\n\nfunction hasNonFileParentSuite(suite: Suite): boolean {\n return !!suite.suite?.id && suite.suite.id !== suite.file.id;\n}\n\nfunction getSuiteHierarchyName(suite: Suite): string {\n let name = suite.name;\n let currentSuite = suite;\n \n while (hasNonFileParentSuite(currentSuite)) {\n name = `${currentSuite.suite!.name} > ${name}`;\n currentSuite = currentSuite.suite!;\n }\n \n return name;\n}\n\nexport function isSuiteOwnFile(suite: Suite): boolean {\n return suite.file.id === suite.id;\n}\n\nexport function getTaskLogLabel(base: string, task: Task): string {\n if (task.type === 'suite') {\n return isSuiteOwnFile(task) ?\n `${base}`\n : `${base} - \"${getSuiteHierarchyName(task)}\"`;\n } else {\n return `${base} - \"${getSuiteHierarchyName(task.suite!)} > ${task.name}\"`;\n }\n}\n\nexport function getTaskLogPrefix(logModule: string, base: string, task: Task): string {\n return `[${logModule}] ${getTaskLogLabel(base, task)}`;\n}\n\nexport function createAfterSuiteRunMeta(\n coverage: AssemblyScriptCoveragePayload,\n testFiles: string[],\n projectName: string = '',\n vitestVersion: VitestVersion = 'v4',\n): any {\n const base = { coverage, testFiles, projectName };\n\n if (vitestVersion) {\n return { ...base, transformMode: 'ssr' as const };\n } else {\n return { ...base, environment: 'node' as const };\n }\n}\n\n// ============================================================================\n// Task Creation\n// ============================================================================\n\nexport function getInitialTaskMode(options: AssemblyScriptTestOptions): RunMode {\n if (options.skip) {\n return 'skip';\n } else if (options.only) {\n return 'only';\n } else {\n return 'run';\n }\n}\n\nexport function getInitialTestTaskMeta(\n fnIndex: number,\n parentAfterAddingTask: Suite,\n): AssemblyScriptTestTaskMeta {\n return {\n fnIndex,\n idxInParentTasks: parentAfterAddingTask.tasks.length - 1,\n assertionsPassedCount: 0,\n assertionsFailed: [],\n resultFinal: false,\n };\n}\n\nexport function getInitialSuiteTaskMeta(\n parentAfterAddingTask: Suite,\n mergedOptions: AssemblyScriptTestOptions,\n): AssemblyScriptSuiteTaskMeta {\n return {\n idxInParentTasks: parentAfterAddingTask.tasks.length - 1,\n defaultTestOptions: mergedOptions,\n suitePreparedSent: false,\n resultFinal: false,\n };\n}\n\n\nfunction createTaskName(names: readonly (string | undefined)[], separator: string = ' > '): string {\n return names.filter(name => name !== undefined).join(separator);\n}\n\nexport function createTestTask(\n name: string,\n fnIndex: number,\n file: File,\n parent: Suite,\n mergedOptions: AssemblyScriptTestOptions,\n vitestVersion: VitestVersion = 'v4',\n): Test {\n const test: Test = {\n type: 'test',\n name,\n fullName: createTaskName([\n parent?.fullName ?? file?.fullName,\n name,\n ]),\n fullTestName: createTaskName([parent?.fullTestName, name]),\n id: '',\n file,\n suite: parent,\n context: {} as any,\n annotations: [],\n artifacts: [],\n meta: {},\n mode: getInitialTaskMode(mergedOptions),\n timeout: mergedOptions.timeout,\n retry: mergedOptions.retry,\n fails: mergedOptions.fails,\n };\n\n if (vitestVersion === 'v3') {\n // @ts-ignore\n delete test.fullName;\n // @ts-ignore\n delete test.fullTestName;\n // @ts-ignore\n delete test.artifacts;\n }\n\n parent.tasks.push(test);\n\n // use custom TaskMeta to capture fnIndex, parent task index, etc\n test.meta = getInitialTestTaskMeta(fnIndex, parent);\n\n return test;\n}\n\nexport function createSuiteTask(\n name: string,\n file: File,\n parent: Suite,\n mergedOptions: AssemblyScriptTestOptions,\n vitestVersion: VitestVersion = 'v4',\n): Suite {\n // const suiteIsFile = parent.file.id === parent.id;\n // const prefix = suiteIsFile ? parent.name : `${file.filepath}_${parent.name}`;\n const suite: Suite = {\n type: 'suite',\n name,\n fullName: createTaskName([\n parent?.fullName ?? file?.fullName,\n name,\n ]),\n fullTestName: createTaskName([parent?.fullTestName, name]),\n id: '',\n file,\n suite: parent,\n meta: {},\n tasks: [],\n mode: getInitialTaskMode(mergedOptions),\n };\n\n if (vitestVersion === 'v3') {\n // @ts-ignore\n delete suite.fullName;\n // @ts-ignore\n delete suite.fullTestName;\n }\n\n parent.tasks.push(suite);\n\n // use custom TaskMeta to capture parent task index and default options\n suite.meta = getInitialSuiteTaskMeta(parent, mergedOptions);\n\n return suite;\n}\n\n\n// ============================================================================\n// Dispatch Helpers\n// ============================================================================\n\nexport function getRunnableTasks(suite: Suite): Task[] {\n return suite.tasks.filter(t => t.mode === 'queued' || t.mode === 'run');\n}\n\n\n// ============================================================================\n// Result Handling Helpers\n// ============================================================================\n\nexport function shouldRetryTask(task: Task): boolean {\n return task.result?.state === 'fail'\n && task.retry !== undefined\n && task.retry > 0\n && (\n task.result.retryCount === undefined\n || task.result.retryCount === 0\n || (task.result.retryCount < task.retry)\n );\n}\n\n/**\n * Invert result if test configured as 'fails'.\n */\nexport function checkFailsAndInvertResult(test: Test, logPrefix: string): void {\n if (test.fails) {\n if (test.result?.state === 'pass') {\n test.result.state = 'fail';\n\n debug(`${logPrefix} - Has 'fails' option set - inverted \"pass\" to \"fail\"`);\n\n const err = createTestExpectedToFailError(test);\n if (test.result.errors) {\n test.result.errors.push(err);\n } else {\n test.result.errors = [err];\n }\n } else if (test.result?.state === 'fail') {\n test.result.state = 'pass';\n test.result.errors = [];\n\n debug(`${logPrefix} - Has 'fails' option set - inverted \"fail\" to \"pass\"`);\n }\n }\n}\n\nexport function setTestResultForTestPrepare(test: Test, startTime: number): void {\n test.result = {\n state: 'run',\n startTime,\n retryCount: 0\n };\n};\n\nexport function updateTestResultAfterRun(test: Test, testTimings?: WASMExecutorPerfTimings): void {\n // while failed tests are actively set to failed, a passed test\n // will still be in the prepared result state (run), so set it to pass\n if (test.result?.state === 'run') {\n test.result.state = 'pass';\n }\n \n if (test.result && testTimings) {\n // accumulate duration for any retries that may be done\n test.result.duration = (test.result.duration ?? 0) + (testTimings.execEnd - testTimings.execStart);\n }\n}\n\nexport function flagTestTerminated(test: Test): void {\n (test.meta as AssemblyScriptTestTaskMeta).lastTimeoutTerminationTime = Date.now();\n}\n\nexport function flagTestFinalized(test: Test): void {\n (test.meta as AssemblyScriptTestTaskMeta).resultFinal = true;\n}\n\nexport function failTest(\n test: Test,\n errorMessage: string,\n capturedError: Error,\n logPrefix: string,\n): void {\n if (test.result) {\n test.result.state = 'fail';\n } else {\n test.result = { state: 'fail' };\n }\n\n const testError: AssemblyScriptTestError = {\n name: TEST_ERROR_NAMES.WASMRuntimeError,\n message: errorMessage\n };\n\n const meta = test.meta as AssemblyScriptTestTaskMeta;\n \n // determine if this was an assertion failure\n if (meta.assertionsFailed?.length > 0) {\n testError.name = TEST_ERROR_NAMES.AssertionError;\n\n const assertion: FailedAssertion = meta.assertionsFailed[meta.assertionsFailed.length - 1]!;\n\n // set actual and expected values as strings, if provided\n if (assertion.valuesProvided) {\n meta.lastErrorValuesProvided = true;\n testError.expected = assertion.expected !== undefined ? String(assertion.expected) : undefined;\n testError.actual = assertion.actual !== undefined ? String(assertion.actual) : undefined;\n }\n }\n \n // Set error to report to vitest on the test meta.\n // Stack gets updated when executor enhances/source-maps the error, post-abort\n meta.lastError = testError;\n\n // Create error to capture V8 stack trace and extract V8 call stack before throwing.\n // This gives us WAT line:column positions that can be mapped to AS source\n meta.lastErrorRawCallStack = extractCallStack(capturedError);\n\n debug(`${logPrefix} - Captured raw V8 call stack with ${meta.lastErrorRawCallStack.length} frames`);\n}\n\nexport function failTestWithTimeoutError (test: Test, startTime: number, duration: number): void {\n const timeoutErr = createTestTimeoutError(test);\n\n if (test.result) {\n test.result.state = 'fail';\n test.result.startTime = startTime;\n \n // accumulate duration for any retries that may be done\n test.result.duration = (test.result.duration ?? 0) + duration;\n\n if (test.result.errors) {\n test.result.errors.push(timeoutErr)\n } else {\n test.result.errors = [timeoutErr];\n }\n } else {\n test.result = {\n state: 'fail',\n startTime,\n duration,\n errors: [timeoutErr],\n retryCount: 0,\n };\n }\n}\n\nexport function setSuitePrepareResult(suite: Suite): void {\n if (suite.mode === 'skip') {\n suite.result = {\n state: 'skip',\n duration: 0,\n };\n } else {\n suite.result = {\n state: 'run',\n startTime: Date.now(),\n };\n }\n}\n\nexport function updateSuiteFinishedResult(suite: Suite, logPrefix: string): void {\n if (suite.mode === 'skip') {\n suite.result = {\n state: 'skip',\n duration: 0,\n };\n } else {\n // update suite final result based on sub-task results\n const hasFailures = suite.tasks.some(({ result }) => result?.state === 'fail' );\n \n if (suite.result) {\n suite.result.duration = positiveSum(suite.tasks, t => t.result?.duration);\n suite.result.state = hasFailures ? 'fail' : 'pass';\n \n debug(`${logPrefix} - Set suite result: \"${suite.result.state}\" (hasFailures: ${hasFailures})`);\n }\n }\n}\n\nexport function finalizeSuiteResult(suite: Suite): void {\n (suite.meta as AssemblyScriptSuiteTaskMeta).resultFinal = true;\n}\n\nexport function resetTestForRetry(test: Test, startTime: number): void {\n if (test.result) {\n test.result!.state = 'run';\n test.result!.startTime = startTime;\n }\n\n const meta = test.meta as AssemblyScriptTestTaskMeta;\n\n // clear any custom metadata associated with the immediate last run\n meta.assertionsPassedCount = 0;\n meta.assertionsFailed = [];\n delete meta.lastError;\n delete meta.lastErrorValuesProvided;\n delete meta.lastErrorRawCallStack;\n delete meta.lastTimeoutTerminationTime;\n delete meta.coverageData;\n}\n\n\n"],"mappings":"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"}