From 0b7f3da76da5263547d095b2a94cd1b9b62ecefd Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Wed, 7 Jul 2021 19:12:36 +0200 Subject: [PATCH 01/14] Update SDK to 6.0 Preview 5 Part of https://github.com/dotnet/runtime/issues/55281 --- global.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index ca21d08dc3bb1..2eff2e9c4910d 100644 --- a/global.json +++ b/global.json @@ -1,11 +1,11 @@ { "sdk": { - "version": "6.0.100-preview.4.21255.9", + "version": "6.0.100-preview.5.21302.13", "allowPrerelease": true, "rollForward": "major" }, "tools": { - "dotnet": "6.0.100-preview.4.21255.9" + "dotnet": "6.0.100-preview.5.21302.13" }, "native-tools": { "cmake": "3.16.4", From 10486e4cfcc46e44fbc62ee5d9135c104819a37b Mon Sep 17 00:00:00 2001 From: Juan Sebastian Hoyos Ayala Date: Thu, 15 Jul 2021 16:01:06 -0700 Subject: [PATCH 02/14] Enable COM support to work around missing symbols in tests --- eng/testing/linker/project.csproj.template | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/testing/linker/project.csproj.template b/eng/testing/linker/project.csproj.template index 38c6d68f901ab..d54d7ece8fc6a 100644 --- a/eng/testing/linker/project.csproj.template +++ b/eng/testing/linker/project.csproj.template @@ -14,6 +14,7 @@ {TargetingPackDir} {NetCoreAppMaximumVersion} {MicrosoftNETCoreAppVersion} + true <_ExtraTrimmerArgs>{ExtraTrimmerArgs} $(_ExtraTrimmerArgs) From 177bd3209fc0c7bc5b065b78b6d5cc461cb836a0 Mon Sep 17 00:00:00 2001 From: Santiago Fernandez Madero Date: Fri, 16 Jul 2021 12:14:49 -0700 Subject: [PATCH 03/14] Update eng/testing/linker/project.csproj.template --- eng/testing/linker/project.csproj.template | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/testing/linker/project.csproj.template b/eng/testing/linker/project.csproj.template index d54d7ece8fc6a..2f7fb1829bd8a 100644 --- a/eng/testing/linker/project.csproj.template +++ b/eng/testing/linker/project.csproj.template @@ -14,6 +14,7 @@ {TargetingPackDir} {NetCoreAppMaximumVersion} {MicrosoftNETCoreAppVersion} + true <_ExtraTrimmerArgs>{ExtraTrimmerArgs} $(_ExtraTrimmerArgs) From 23651a472ac67da7eb8f90b61b8f0e8778cc93cb Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Fri, 16 Jul 2021 15:15:23 -0500 Subject: [PATCH 04/14] Disable the workload targets --- eng/pipelines/runtime-linker-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/pipelines/runtime-linker-tests.yml b/eng/pipelines/runtime-linker-tests.yml index 836b54c849ab5..f56adf66de428 100644 --- a/eng/pipelines/runtime-linker-tests.yml +++ b/eng/pipelines/runtime-linker-tests.yml @@ -75,7 +75,7 @@ jobs: testGroup: innerloop timeoutInMinutes: 120 nameSuffix: Runtime_Release - buildArgs: -s mono+libs -c $(_BuildConfig) -p:WasmBuildNative=false + buildArgs: -s mono+libs -c $(_BuildConfig) -p:WasmBuildNative=false -p:UsingBrowserRuntimeWorkload=false extraStepsTemplate: /eng/pipelines/libraries/execute-trimming-tests-steps.yml extraStepsParameters: - extraTestArgs: '/p:WasmBuildNative=false' + extraTestArgs: '/p:WasmBuildNative=false /p:UsingBrowserRuntimeWorkload=false' From d4a4d99be845a66431cc7307e52aee91e74fda03 Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Fri, 16 Jul 2021 20:05:26 -0400 Subject: [PATCH 05/14] Disable workloads for wasm builds For in-tree builds, and tests we don't want to use workloads from dotnet being used to build these. For the projects being built on the build machine, we can disable them via `Directory.Build.props`, and wasm's InTree/LocalBuild props. But for projects that get built on helix, eg. the runtime tests, we are setting the property values as environment variables. --- Directory.Build.props | 2 ++ src/mono/wasm/build/WasmApp.InTree.props | 3 +++ src/mono/wasm/build/WasmApp.LocalBuild.props | 2 ++ src/tests/Common/helixpublishwitharcade.proj | 5 +++++ 4 files changed, 12 insertions(+) diff --git a/Directory.Build.props b/Directory.Build.props index 541ad0417e40d..c01f8a104f739 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -7,6 +7,8 @@ For offline builds we still set OfficialBuildId but we need to build all the packages for a single leg only, so we also take DotNetBuildFromSource into account. --> true + false + false diff --git a/src/mono/wasm/build/WasmApp.InTree.props b/src/mono/wasm/build/WasmApp.InTree.props index e5968f1320a94..a2b54342ffb54 100644 --- a/src/mono/wasm/build/WasmApp.InTree.props +++ b/src/mono/wasm/build/WasmApp.InTree.props @@ -3,6 +3,9 @@ + false + false + AnyCPU false $(NetCoreAppToolCurrent) diff --git a/src/mono/wasm/build/WasmApp.LocalBuild.props b/src/mono/wasm/build/WasmApp.LocalBuild.props index 01003f59172fa..7876035caac7a 100644 --- a/src/mono/wasm/build/WasmApp.LocalBuild.props +++ b/src/mono/wasm/build/WasmApp.LocalBuild.props @@ -23,6 +23,8 @@ <_NetCoreAppToolCurrent>net6.0 + false + false diff --git a/src/tests/Common/helixpublishwitharcade.proj b/src/tests/Common/helixpublishwitharcade.proj index b98bd8e8289b1..5cc2b9e2c694b 100644 --- a/src/tests/Common/helixpublishwitharcade.proj +++ b/src/tests/Common/helixpublishwitharcade.proj @@ -266,6 +266,9 @@ + + + @@ -286,6 +289,8 @@ + + From 807c255b2ca01c567dc3cdf062ff101c3b2c263b Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Sun, 18 Jul 2021 19:23:38 -0400 Subject: [PATCH 06/14] Fix setting envvars for disabling workloads --- .../Wasm.Build.Tests/data/Local.Directory.Build.props | 4 ++++ src/tests/Common/helixpublishwitharcade.proj | 5 ----- src/tests/Directory.Build.props | 5 +++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/data/Local.Directory.Build.props b/src/tests/BuildWasmApps/Wasm.Build.Tests/data/Local.Directory.Build.props index 1a9c112e747d9..b6301695571fe 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/data/Local.Directory.Build.props +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/data/Local.Directory.Build.props @@ -1,5 +1,9 @@ + + false + false + <_WasmTargetsDir Condition="'$(RuntimeSrcDir)' != ''">$(RuntimeSrcDir)\src\mono\wasm\build\ <_WasmTargetsDir Condition="'$(WasmBuildSupportDir)' != ''">$(WasmBuildSupportDir)\wasm\ $(WasmBuildSupportDir)\emsdk\ diff --git a/src/tests/Common/helixpublishwitharcade.proj b/src/tests/Common/helixpublishwitharcade.proj index 5cc2b9e2c694b..b98bd8e8289b1 100644 --- a/src/tests/Common/helixpublishwitharcade.proj +++ b/src/tests/Common/helixpublishwitharcade.proj @@ -266,9 +266,6 @@ - - - @@ -289,8 +286,6 @@ - - diff --git a/src/tests/Directory.Build.props b/src/tests/Directory.Build.props index f00de4d102e50..02d51b1015d84 100644 --- a/src/tests/Directory.Build.props +++ b/src/tests/Directory.Build.props @@ -149,4 +149,9 @@ as we do with many of the package versions above --> 2.1.0-preview3-26416-01 + + + + + From d0d93fb4f6e7f805dcecb437e1abdf7a441e70e5 Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Mon, 19 Jul 2021 01:19:49 -0400 Subject: [PATCH 07/14] Another attempt to fix wasm tests In preview5, the workload manifest overrides `$(UsingBrowserRuntimeWorkload)` setting, so pass it on the command line. ``xml true $(WasmNativeWorkload) ``` --- .../BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs | 4 ++++ src/tests/Common/CLRTest.Execute.Bash.targets | 2 +- src/tests/Directory.Build.props | 7 +++---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs index a8f67d09eb689..13b45a42b7345 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs @@ -95,6 +95,10 @@ public BuildEnvironment() DefaultBuildArgs = $" /p:RuntimeSrcDir={solutionRoot.FullName} /p:RuntimeConfig={s_runtimeConfig} /p:EMSDK_PATH={emsdkPath} "; } + // needed to disable workloads on p5 + // Later previews can be disabled by setting the properties in a Directory.Build.props + DefaultBuildArgs += " /p:UsingBrowserRuntimeWorkload=false /p:WasmNativeWorkload=false"; + IsWorkload = false; DotNet = "dotnet"; EnvVars = new Dictionary() diff --git a/src/tests/Common/CLRTest.Execute.Bash.targets b/src/tests/Common/CLRTest.Execute.Bash.targets index d44f83d429204..7031b45d72e95 100644 --- a/src/tests/Common/CLRTest.Execute.Bash.targets +++ b/src/tests/Common/CLRTest.Execute.Bash.targets @@ -275,7 +275,7 @@ else __Command+=" dotnet" fi -$__Command msbuild $CORE_ROOT/wasm-test-runner/WasmTestRunner.proj /p:NetCoreAppCurrent=$(NetCoreAppCurrent) /p:TestAssemblyFileName=$(MsBuildProjectName).dll /p:TestBinDir=`pwd` || exit $? +$__Command msbuild $CORE_ROOT/wasm-test-runner/WasmTestRunner.proj /p:NetCoreAppCurrent=$(NetCoreAppCurrent) /p:TestAssemblyFileName=$(MsBuildProjectName).dll /p:TestBinDir=`pwd` $(CLRTestMSBuildArgs) || exit $? ]]> diff --git a/src/tests/Directory.Build.props b/src/tests/Directory.Build.props index 02d51b1015d84..cea19c6a785ac 100644 --- a/src/tests/Directory.Build.props +++ b/src/tests/Directory.Build.props @@ -150,8 +150,7 @@ 2.1.0-preview3-26416-01 - - - - + + /p:UsingBrowserRuntimeWorkload=false /p:WasmNativeWorkload=false + From 077b5008829b788d7f7671788d91839066455fa1 Mon Sep 17 00:00:00 2001 From: vitek-karas Date: Mon, 19 Jul 2021 06:33:51 -0700 Subject: [PATCH 08/14] Fix host tests after upgrade to P5 In P5 we don't generate .runtimeconfig.dev.json anymore. Some tests started to fail because they relied on the .runtime.dev.json to include local nuget cache in the probing paths. I changed one of those tests to force-generate .runtimeconfig.dev.json as for the tested scenario it seems to make sense. For the other test I modified it to copy the necessary dependency into the right location instead. --- .../TestProjects/LightupClient/LightupClient.csproj | 1 + .../tests/HostActivation.Tests/PortableAppActivation.cs | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/installer/tests/Assets/TestProjects/LightupClient/LightupClient.csproj b/src/installer/tests/Assets/TestProjects/LightupClient/LightupClient.csproj index f413febe3ff59..06ac4b1d7256b 100644 --- a/src/installer/tests/Assets/TestProjects/LightupClient/LightupClient.csproj +++ b/src/installer/tests/Assets/TestProjects/LightupClient/LightupClient.csproj @@ -4,6 +4,7 @@ $(NetCoreAppCurrent) Exe $(MNAVersion) + true diff --git a/src/installer/tests/HostActivation.Tests/PortableAppActivation.cs b/src/installer/tests/HostActivation.Tests/PortableAppActivation.cs index a2a0d963e1f09..fa3e03bd97201 100644 --- a/src/installer/tests/HostActivation.Tests/PortableAppActivation.cs +++ b/src/installer/tests/HostActivation.Tests/PortableAppActivation.cs @@ -162,7 +162,15 @@ public void Muxer_Exec_activation_of_Build_Output_Portable_DLL_with_DepsJson_Rem var fixture = sharedTestState.PortableAppFixture_Built .Copy(); + // Move the .deps.json to a subdirectory, note that in this case we have to move all of the app's dependencies + // along with it - in this case Newtonsoft.Json.dll + // For framework dependent apps (dotnet build produces those) the probing directories are: + // - The directory where the .deps.json is + // - Any framework directory var depsJson = MoveDepsJsonToSubdirectory(fixture); + File.Move( + Path.Combine(Path.GetDirectoryName(fixture.TestProject.AppDll), "Newtonsoft.Json.dll"), + Path.Combine(Path.GetDirectoryName(depsJson), "Newtonsoft.Json.dll")); var dotnet = fixture.BuiltDotnet; var appDll = fixture.TestProject.AppDll; From 699085f08bf8ad3aeb850b4e4e914cdda5118a14 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Mon, 19 Jul 2021 12:10:47 -0500 Subject: [PATCH 09/14] Fix up reflection to private FileStatus field --- .../Microsoft.NET.HostModel.AppHost.Tests/AppHostUpdateTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/installer/tests/Microsoft.NET.HostModel.Tests/Microsoft.NET.HostModel.AppHost.Tests/AppHostUpdateTests.cs b/src/installer/tests/Microsoft.NET.HostModel.Tests/Microsoft.NET.HostModel.AppHost.Tests/AppHostUpdateTests.cs index 3aa8886babe37..e3dc7a14a2ee8 100644 --- a/src/installer/tests/Microsoft.NET.HostModel.Tests/Microsoft.NET.HostModel.AppHost.Tests/AppHostUpdateTests.cs +++ b/src/installer/tests/Microsoft.NET.HostModel.Tests/Microsoft.NET.HostModel.AppHost.Tests/AppHostUpdateTests.cs @@ -400,7 +400,7 @@ static CoreFxFileStatusProvider() try { s_fileSystem_fileStatusField = typeof(FileSystemInfo).GetField("_fileStatus", BindingFlags.NonPublic | BindingFlags.Instance); - s_fileStatus_fileStatusField = s_fileSystem_fileStatusField.FieldType.GetField("_fileStatus", BindingFlags.NonPublic | BindingFlags.Instance); + s_fileStatus_fileStatusField = s_fileSystem_fileStatusField.FieldType.GetField("_fileCache", BindingFlags.NonPublic | BindingFlags.Instance); s_fileStatusModeField = s_fileStatus_fileStatusField.FieldType.GetField("Mode", BindingFlags.NonPublic | BindingFlags.Instance); } catch (Exception ex) From f18f795755b47802ed5632dd02e5525aa900cd3a Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Mon, 19 Jul 2021 13:18:56 -0400 Subject: [PATCH 10/14] Disable workload resolver for wasm.build.tests, EMSDK run --- src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs index 13b45a42b7345..0ee9669128ad4 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs @@ -97,7 +97,7 @@ public BuildEnvironment() // needed to disable workloads on p5 // Later previews can be disabled by setting the properties in a Directory.Build.props - DefaultBuildArgs += " /p:UsingBrowserRuntimeWorkload=false /p:WasmNativeWorkload=false"; + DefaultBuildArgs += " /p:MSBuildEnableWorkloadResolver=false"; IsWorkload = false; DotNet = "dotnet"; From 06ff07caafbc01b36d8288731425b9c220541e60 Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Mon, 19 Jul 2021 16:33:39 -0400 Subject: [PATCH 11/14] Disable workloads for wasm with MSBuildEnableWorkloadResolver=false everywhere --- Directory.Build.props | 2 -- src/mono/wasm/build/WasmApp.InTree.props | 3 --- src/mono/wasm/build/WasmApp.LocalBuild.props | 3 +-- .../Wasm.Build.Tests/data/Local.Directory.Build.props | 5 ++--- src/tests/Directory.Build.props | 2 +- 5 files changed, 4 insertions(+), 11 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 863f42055775b..6cab9bcee3058 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -7,8 +7,6 @@ For offline builds we still set OfficialBuildId but we need to build all the packages for a single leg only, so we also take DotNetBuildFromSource into account. --> true - false - false diff --git a/src/mono/wasm/build/WasmApp.InTree.props b/src/mono/wasm/build/WasmApp.InTree.props index a2b54342ffb54..e5968f1320a94 100644 --- a/src/mono/wasm/build/WasmApp.InTree.props +++ b/src/mono/wasm/build/WasmApp.InTree.props @@ -3,9 +3,6 @@ - false - false - AnyCPU false $(NetCoreAppToolCurrent) diff --git a/src/mono/wasm/build/WasmApp.LocalBuild.props b/src/mono/wasm/build/WasmApp.LocalBuild.props index 11585eb1640e9..ea87a8bb8ec0e 100644 --- a/src/mono/wasm/build/WasmApp.LocalBuild.props +++ b/src/mono/wasm/build/WasmApp.LocalBuild.props @@ -23,8 +23,7 @@ <_NetCoreAppToolCurrent>net6.0 - false - false + false diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/data/Local.Directory.Build.props b/src/tests/BuildWasmApps/Wasm.Build.Tests/data/Local.Directory.Build.props index b6301695571fe..3282feb5b3553 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/data/Local.Directory.Build.props +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/data/Local.Directory.Build.props @@ -1,8 +1,7 @@ - - false - false + + false <_WasmTargetsDir Condition="'$(RuntimeSrcDir)' != ''">$(RuntimeSrcDir)\src\mono\wasm\build\ <_WasmTargetsDir Condition="'$(WasmBuildSupportDir)' != ''">$(WasmBuildSupportDir)\wasm\ diff --git a/src/tests/Directory.Build.props b/src/tests/Directory.Build.props index cea19c6a785ac..6841b4938e70b 100644 --- a/src/tests/Directory.Build.props +++ b/src/tests/Directory.Build.props @@ -151,6 +151,6 @@ - /p:UsingBrowserRuntimeWorkload=false /p:WasmNativeWorkload=false + /p:MSBuildEnableWorkloadResolver=false From 066c97b903124653496dc8bfd0be15f583ef017f Mon Sep 17 00:00:00 2001 From: Anirudh Agnihotry Date: Wed, 21 Jul 2021 09:50:18 -0700 Subject: [PATCH 12/14] remove linker workaround --- eng/testing/linker/project.csproj.template | 2 -- 1 file changed, 2 deletions(-) diff --git a/eng/testing/linker/project.csproj.template b/eng/testing/linker/project.csproj.template index 6cf49c81986b8..e1ba296072c8d 100644 --- a/eng/testing/linker/project.csproj.template +++ b/eng/testing/linker/project.csproj.template @@ -15,8 +15,6 @@ {TargetingPackDir} {NetCoreAppMaximumVersion} {MicrosoftNETCoreAppVersion} - - true <_ExtraTrimmerArgs>{ExtraTrimmerArgs} $(_ExtraTrimmerArgs) From 43011fd471972426c30afd6ae3c4d4c834e155e7 Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Wed, 21 Jul 2021 16:50:02 -0400 Subject: [PATCH 13/14] [wasm] Remove args unnecessary for disabling workloads --- eng/pipelines/runtime-linker-tests.yml | 4 ++-- src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/eng/pipelines/runtime-linker-tests.yml b/eng/pipelines/runtime-linker-tests.yml index f56adf66de428..836b54c849ab5 100644 --- a/eng/pipelines/runtime-linker-tests.yml +++ b/eng/pipelines/runtime-linker-tests.yml @@ -75,7 +75,7 @@ jobs: testGroup: innerloop timeoutInMinutes: 120 nameSuffix: Runtime_Release - buildArgs: -s mono+libs -c $(_BuildConfig) -p:WasmBuildNative=false -p:UsingBrowserRuntimeWorkload=false + buildArgs: -s mono+libs -c $(_BuildConfig) -p:WasmBuildNative=false extraStepsTemplate: /eng/pipelines/libraries/execute-trimming-tests-steps.yml extraStepsParameters: - extraTestArgs: '/p:WasmBuildNative=false /p:UsingBrowserRuntimeWorkload=false' + extraTestArgs: '/p:WasmBuildNative=false' diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs index 0ee9669128ad4..2212d57b2377e 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildEnvironment.cs @@ -95,8 +95,7 @@ public BuildEnvironment() DefaultBuildArgs = $" /p:RuntimeSrcDir={solutionRoot.FullName} /p:RuntimeConfig={s_runtimeConfig} /p:EMSDK_PATH={emsdkPath} "; } - // needed to disable workloads on p5 - // Later previews can be disabled by setting the properties in a Directory.Build.props + // for EMSDK runs, we don't want to get the dependencies from workloads DefaultBuildArgs += " /p:MSBuildEnableWorkloadResolver=false"; IsWorkload = false; From e14a2a7c2bf012ffcc37760ce7ea41d421ec8ba9 Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Wed, 21 Jul 2021 18:50:52 -0400 Subject: [PATCH 14/14] Pass MSBuildEnableWorkloadResolver property to individual trimming projects --- eng/testing/linker/trimmingTests.targets | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/testing/linker/trimmingTests.targets b/eng/testing/linker/trimmingTests.targets index 649ad3e25bf2d..e31fc4e0acdbb 100644 --- a/eng/testing/linker/trimmingTests.targets +++ b/eng/testing/linker/trimmingTests.targets @@ -42,6 +42,7 @@ %(Identity) +