diff --git a/.github/workflows/build-and-package-release.yml b/.github/workflows/build-and-package-release.yml index 76da4893c..8a64e1755 100644 --- a/.github/workflows/build-and-package-release.yml +++ b/.github/workflows/build-and-package-release.yml @@ -38,10 +38,10 @@ jobs: Write-Output "::set-output name=version::$version" - - name: Install .NET core + - name: Install .NET core 6.0 uses: actions/setup-dotnet@v1 with: - dotnet-version: '3.1.100' + dotnet-version: '6.0.x' - name: Install the build dependencies working-directory: src diff --git a/.github/workflows/build-test-inspect.yml b/.github/workflows/build-test-inspect.yml index 21fcefdca..78ed52259 100644 --- a/.github/workflows/build-test-inspect.yml +++ b/.github/workflows/build-test-inspect.yml @@ -4,11 +4,13 @@ on: pull_request: branches: - master + - MIHO/JoinMMV3RC02andDynMen_FQ1_Q1 types: [opened, synchronize, reopened, edited] push: branches: - master + - MIHO/JoinMMV3RC02andDynMen_FQ1_Q1 jobs: Build-test-inspect: @@ -23,10 +25,10 @@ jobs: run: | Write-Host "The repository is: ${env:REPOSITORY}" - - name: Install .NET core + - name: Install .NET core 6.0 uses: actions/setup-dotnet@v1 with: - dotnet-version: '3.1.x' + dotnet-version: '6.0.x' - name: Install tools for build-test-inspect working-directory: src diff --git a/.github/workflows/check-release.yml b/.github/workflows/check-release.yml index 9478873d3..e232887b9 100644 --- a/.github/workflows/check-release.yml +++ b/.github/workflows/check-release.yml @@ -4,11 +4,13 @@ on: pull_request: branches: - master + - MIHO/JoinMMV3RC02andDynMen_FQ1_Q1 types: [opened, synchronize, reopened, edited] push: branches: - master + - MIHO/JoinMMV3RC02andDynMen_FQ1_Q1 jobs: Check-release: @@ -23,10 +25,10 @@ jobs: $timestamp = [DateTime]::UtcNow.ToString("yyyy-MM-ddTHH-mm-ssZ") Write-Output "::set-output name=timestamp::$timestamp" - - name: Install .NET core + - name: Install .NET core 6.0 uses: actions/setup-dotnet@v1 with: - dotnet-version: '3.1.100' + dotnet-version: '6.0.x' - name: Install build dependencies working-directory: src diff --git a/.github/workflows/check-style.yml b/.github/workflows/check-style.yml index a26e59ceb..6e7809cf2 100644 --- a/.github/workflows/check-style.yml +++ b/.github/workflows/check-style.yml @@ -4,11 +4,13 @@ on: pull_request: branches: - master + - MIHO/JoinMMV3RC02andDynMen_FQ1_Q1 types: [opened, synchronize, reopened, edited] push: branches: - master + - MIHO/JoinMMV3RC02andDynMen_FQ1_Q1 jobs: Check-style: @@ -22,10 +24,10 @@ jobs: run: powershell .\CheckLicenses.ps1 if: always() - - name: Install .NET core + - name: Install .NET core 6.0 uses: actions/setup-dotnet@v1 with: - dotnet-version: '3.1.100' + dotnet-version: '6.0.x' if: always() - name: Install tools for style diff --git a/.github/workflows/generate-doc.yml b/.github/workflows/generate-doc.yml index c542a0d3c..698a4c737 100644 --- a/.github/workflows/generate-doc.yml +++ b/.github/workflows/generate-doc.yml @@ -11,10 +11,10 @@ jobs: steps: - uses: actions/checkout@master - - name: Install .NET core + - name: Install .NET core 6.0 uses: actions/setup-dotnet@v1 with: - dotnet-version: '3.1.100' + dotnet-version: '6.0.x' - name: Install docdev dependencies working-directory: src diff --git a/.gitignore b/.gitignore index e9db69a8c..7ecbcdd41 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ sample-aasx/ /src/BlazorUI/09_SchneiderElectric.aasx /.vs/aasx-package-explorer/v16/.suo /.vs/slnx.sqlite +/.vs/aasx-package-explorer/v17/.suo diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json deleted file mode 100644 index f8b488856..000000000 --- a/.vs/ProjectSettings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "CurrentProjectSetting": null -} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json deleted file mode 100644 index 98fdec240..000000000 --- a/.vs/VSWorkspaceState.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "ExpandedNodes": [ - "" - ], - "SelectedNode": "\\AasxPackageExplorer.sln", - "PreviewInSolutionExplorer": false -} \ No newline at end of file diff --git a/.vs/aasx-package-explorer/v17/.suo b/.vs/aasx-package-explorer/v17/.suo deleted file mode 100644 index d8e5edea7..000000000 Binary files a/.vs/aasx-package-explorer/v17/.suo and /dev/null differ diff --git a/LICENSE.txt b/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/.config/dotnet-tools.json b/src/.config/dotnet-tools.json index d9d768f58..d14c2d1af 100644 --- a/src/.config/dotnet-tools.json +++ b/src/.config/dotnet-tools.json @@ -3,37 +3,37 @@ "isRoot": true, "tools": { "dotnet-format": { - "version": "4.0.130203", + "version": "5.1.250801", "commands": [ "dotnet-format" ] }, "deadcsharp": { - "version": "1.0.0-beta5", + "version": "2.0.0", "commands": [ "dead-csharp" ] }, "bitesized": { - "version": "1.0.1", + "version": "2.0.0", "commands": [ "bite-sized" ] }, "doctestcsharp": { - "version": "1.1.0", + "version": "2.0.0", "commands": [ "doctest-csharp" ] }, "opinionatedcsharptodos": { - "version": "1.0.0-pre1", + "version": "2.0.0", "commands": [ "opinionated-csharp-todos" ] }, "jetbrains.resharper.globaltools": { - "version": "2021.3.4", + "version": "2022.3.2", "commands": [ "jb" ] diff --git a/src/AASXPackageExplorerSetup/LICENSE.txt b/src/AASXPackageExplorerSetup/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AASXPackageExplorerSetup/LICENSE.txt +++ b/src/AASXPackageExplorerSetup/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxAmlImExport/AasAmlMatcher.cs b/src/AasxAmlImExport/AasAmlMatcher.cs index b3286fa11..ccd5577fd 100644 --- a/src/AasxAmlImExport/AasAmlMatcher.cs +++ b/src/AasxAmlImExport/AasAmlMatcher.cs @@ -12,6 +12,7 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Linq; using System.Text; using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; using AdminShellNS; using Aml.Engine.CAEX; @@ -22,38 +23,38 @@ namespace AasxAmlImExport /// public class AasAmlMatcher { - private Dictionary aasToAml = - new Dictionary(); + private Dictionary aasToAml = + new Dictionary(); - private Dictionary amlToAas = - new Dictionary(); + private Dictionary amlToAas = + new Dictionary(); - public void AddMatch(AdminShell.Referable aasReferable, CAEXObject amlObject) + public void AddMatch(IReferable aasReferable, CAEXObject amlObject) { aasToAml.Add(aasReferable, amlObject); amlToAas.Add(amlObject, aasReferable); } - public ICollection GetAllAasReferables() + public ICollection GetAllAasReferables() { return aasToAml.Keys; } - public CAEXObject GetAmlObject(AdminShell.Referable aasReferable) + public CAEXObject GetAmlObject(IReferable aasReferable) { if (aasToAml.ContainsKey(aasReferable)) return aasToAml[aasReferable]; return null; } - public AdminShell.Referable GetAasObject(CAEXObject amlObject) + public IReferable GetAasObject(CAEXObject amlObject) { if (amlToAas.ContainsKey(amlObject)) return amlToAas[amlObject]; return null; } - public bool ContainsAasObject(AdminShell.Referable aasReferable) + public bool ContainsAasObject(IReferable aasReferable) { return aasToAml.ContainsKey(aasReferable); } diff --git a/src/AasxAmlImExport/AasxAmlImExport.csproj b/src/AasxAmlImExport/AasxAmlImExport.csproj index 3e1e82e90..1f200ad2f 100644 --- a/src/AasxAmlImExport/AasxAmlImExport.csproj +++ b/src/AasxAmlImExport/AasxAmlImExport.csproj @@ -1,8 +1,9 @@  - netstandard2.0 + net6.0 Library false + false @@ -12,9 +13,7 @@ - - - - + + diff --git a/src/AasxAmlImExport/AmlConst.cs b/src/AasxAmlImExport/AmlConst.cs index 0e91eb014..0d4339843 100644 --- a/src/AasxAmlImExport/AmlConst.cs +++ b/src/AasxAmlImExport/AmlConst.cs @@ -30,11 +30,11 @@ public static class Names public static class Attributes { - public static string Referable_IdShort = "AAS:Referable/idShort"; - public static string Referable_Category = "AAS:Referable/category"; - public static string Referable_Description = "AAS:Referable/description"; + public static string Referable_IdShort = "AAS:IReferable/idShort"; + public static string Referable_Category = "AAS:IReferable/category"; + public static string Referable_Description = "AAS:IReferable/description"; - public static string Asset_Kind = "AAS:Asset/kind"; + public static string Asset_Kind = "AAS:AssetInformation/kind"; public static string HasKind_Kind = "AAS:HasKind/kind"; public static string SemanticId = "AAS:HasSemantics/semanticId"; @@ -56,8 +56,8 @@ public static class Attributes public static string AAS_DerivedFrom = "AAS:AssetAdministrationShell/derivedFrom"; - public static string Asset_IdentificationModelRef = "AAS:Asset/assetIdentificationModel"; - public static string Asset_BillOfMaterialRef = "AAS:Asset/billOfMaterial"; + public static string Asset_IdentificationModelRef = "AAS:AssetInformation/assetIdentificationModel"; + public static string Asset_BillOfMaterialRef = "AAS:AssetInformation/billOfMaterial"; public static string SME_Property = "AAS:Property"; @@ -106,7 +106,7 @@ public static class Roles { public static string Qualifer = "AssetAdministrationShellRoleClassLib/Qualifier"; - public static string Asset = "AssetAdministrationShellRoleClassLib/Asset"; + public static string AssetInformation = "AssetAdministrationShellRoleClassLib/AssetInformation"; public static string View = "AssetAdministrationShellRoleClassLib/View"; public static string ContainedElementRef = "AssetAdministrationShellRoleClassLib/ContainedElementRef"; diff --git a/src/AasxAmlImExport/AmlExport.cs b/src/AasxAmlImExport/AmlExport.cs index 049e89db5..c8629213d 100644 --- a/src/AasxAmlImExport/AmlExport.cs +++ b/src/AasxAmlImExport/AmlExport.cs @@ -14,10 +14,12 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; using AasxIntegrationBase; using AdminShellNS; using Aml.Engine.AmlObjects; using Aml.Engine.CAEX; +using Extensions; namespace AasxAmlImExport { @@ -28,8 +30,8 @@ private class AmlInternalLinkEntity public string Name = "InternalLink"; public ExternalInterfaceType extIf = null; - public AdminShell.Referable sideA = null; - public AdminShell.Referable sideB = null; + public IReferable sideA = null; + public IReferable sideB = null; public string ifClassA = null; public string ifClassB = null; @@ -37,7 +39,7 @@ private class AmlInternalLinkEntity public Action lambdaForSideB = null; public AmlInternalLinkEntity( - ExternalInterfaceType extIf, AdminShell.Referable sideA, AdminShell.Referable sideB, + ExternalInterfaceType extIf, IReferable sideA, IReferable sideB, string ifClassA, string ifClassB, Action lambdaForSideB = null) { this.extIf = extIf; @@ -88,73 +90,73 @@ private static AttributeType AppendAttributeNameAndRole( return a; } - private static void SetIdentification(AttributeSequence aseq, AdminShell.Identification id) + private static void SetIdentification(AttributeSequence aseq, string id) { if (id == null) return; var a0 = AppendAttributeNameAndRole(aseq, "identification", AmlConst.Attributes.Identification); - AppendAttributeNameAndRole(a0.Attribute, "idType", AmlConst.Attributes.Identification_idType, id.idType); - AppendAttributeNameAndRole(a0.Attribute, "id", AmlConst.Attributes.Identification_id, id.id); + //AppendAttributeNameAndRole(a0.Attribute, "idType", AmlConst.Attributes.Identification_idType, id.Id); + AppendAttributeNameAndRole(a0.Attribute, "id", AmlConst.Attributes.Identification_id, id); } - private static void SetAdministration(AttributeSequence aseq, AdminShell.Administration adm) + private static void SetAdministration(AttributeSequence aseq, AdministrativeInformation adm) { if (adm == null) return; var a0 = AppendAttributeNameAndRole(aseq, "administration", AmlConst.Attributes.Administration); AppendAttributeNameAndRole( - a0.Attribute, "version", AmlConst.Attributes.Administration_Version, adm.version); + a0.Attribute, "version", AmlConst.Attributes.Administration_Version, adm.Version); AppendAttributeNameAndRole( - a0.Attribute, "revision", AmlConst.Attributes.Administration_Revision, adm.revision); + a0.Attribute, "revision", AmlConst.Attributes.Administration_Revision, adm.Revision); } private static void SetLangStr( - AttributeSequence aseq, List langString, string aname, string role) + AttributeSequence aseq, List langString, string aname, string role) { if (aseq == null || langString == null || langString.Count < 1) return; - var a0 = AppendAttributeNameAndRole(aseq, aname, role, langString[0].str); + var a0 = AppendAttributeNameAndRole(aseq, aname, role, langString[0].Text); foreach (var ls in langString) { - if (ls.lang.Trim().ToLower() == "default") + if (ls.Language.Trim().ToLower() == "default") continue; AppendAttributeNameAndRole( - a0.Attribute, AmlConst.Names.AmlLanguageHeader + ls.lang, role: null, val: ls.str); + a0.Attribute, AmlConst.Names.AmlLanguageHeader + ls.Language, role: null, val: ls.Text); } } - private static void SetReferable(AttributeSequence aseq, AdminShell.Referable rf) + private static void SetReferable(AttributeSequence aseq, IReferable rf) { if (aseq == null || rf == null) return; - if (rf.idShort != null) - AppendAttributeNameAndRole(aseq, "idShort", AmlConst.Attributes.Referable_IdShort, rf.idShort); - if (rf.category != null) - AppendAttributeNameAndRole(aseq, "category", AmlConst.Attributes.Referable_Category, rf.category); - SetLangStr(aseq, rf.description?.langString, "description", AmlConst.Attributes.Referable_Description); + if (rf.IdShort != null) + AppendAttributeNameAndRole(aseq, "idShort", AmlConst.Attributes.Referable_IdShort, rf.IdShort); + if (rf.Category != null) + AppendAttributeNameAndRole(aseq, "category", AmlConst.Attributes.Referable_Category, rf.Category); + SetLangStr(aseq, rf.Description, "description", AmlConst.Attributes.Referable_Description); } private static void SetAssetKind( - AttributeSequence aseq, AdminShell.AssetKind kind, string attributeRole = null) + AttributeSequence aseq, AssetKind kind, string attributeRole = null) { - if (aseq == null || kind == null || kind.kind == null) + if (aseq == null) return; if (attributeRole == null) attributeRole = AmlConst.Attributes.HasKind_Kind; - AppendAttributeNameAndRole(aseq, "kind", attributeRole, kind.kind); + AppendAttributeNameAndRole(aseq, "kind", attributeRole, Stringification.ToString(kind)); } private static void SetModelingKind( - AttributeSequence aseq, AdminShell.ModelingKind kind, string attributeRole = null) + AttributeSequence aseq, ModelingKind? kind, string attributeRole = null) { - if (aseq == null || kind == null || kind.kind == null) + if (aseq == null || !kind.HasValue) return; if (attributeRole == null) attributeRole = AmlConst.Attributes.HasKind_Kind; - AppendAttributeNameAndRole(aseq, "kind", attributeRole, kind.kind); + AppendAttributeNameAndRole(aseq, "kind", attributeRole, Stringification.ToString(kind)); } private static string ToAmlName(string input) @@ -170,22 +172,22 @@ private static string ToAmlName(string input) return clean; } - private static string ToAmlSemanticId(AdminShell.SemanticId semid) + private static string ToAmlSemanticId(Reference semid) { - if (semid == null || semid.IsEmpty) + if (semid == null || semid.IsEmpty()) return null; var semstr = ""; foreach (var k in semid.Keys) semstr += String.Format( - "({0})({1})[{2}]{3}", k.type, k.local ? "local" : "no-local", k.idType, k.value); + "({0})({1})", k.Type, k.Value); return semstr; } - private static string ToAmlReference(AdminShell.Reference refid) + private static string ToAmlReference(Reference refid) { - if (refid == null || refid.IsEmpty) + if (refid == null || refid.IsEmpty()) return null; var semstr = ""; @@ -194,34 +196,34 @@ private static string ToAmlReference(AdminShell.Reference refid) if (semstr != "") semstr += ","; semstr += String.Format( - "({0})({1})[{2}]{3}", k.type, k.local ? "local" : "no-local", k.idType, k.value); + "({0})({1})", k.Type, k.Value); } return semstr; } - private static void SetSemanticId(AttributeSequence aseq, AdminShell.SemanticId semid) + private static void SetSemanticId(AttributeSequence aseq, Reference semid) { - if (aseq == null || semid == null || semid.IsEmpty) + if (aseq == null || semid == null || semid.IsEmpty()) return; AppendAttributeNameAndRole(aseq, "semanticId", AmlConst.Attributes.SemanticId, ToAmlSemanticId(semid)); } - private static void SetHasDataSpecification(AttributeSequence aseq, AdminShell.HasDataSpecification ds) + private static void SetHasDataSpecification(AttributeSequence aseq, List ds) { - if (aseq == null || ds == null || ds.Count < 1) + if (aseq == null || ds == null || ds.Count < 1) return; foreach (var r in ds) AppendAttributeNameAndRole( aseq, "dataSpecification", AmlConst.Attributes.DataSpecificationRef, - ToAmlReference(r?.dataSpecification)); + ToAmlReference(r.DataSpecification)); } private static void SetQualifiers( InternalElementSequence parentIeSeq, AttributeSequence parentAttrSeq, - List qualifiers, bool parentAsInternalElements = false) + List qualifiers, bool parentAsInternalElements = false) { if ((parentIeSeq == null && parentAttrSeq == null) || qualifiers == null || qualifiers.Count < 1) return; @@ -229,11 +231,11 @@ private static void SetQualifiers( foreach (var q in qualifiers) { // aml-stlye name - var qid = AmlConst.Names.AmlQualifierHeader + (q.type?.Trim() ?? "qualifier"); - if (q.value != null) - qid += "=" + q.value.Trim(); - else if (q.valueId != null) - qid += "=" + ToAmlReference(q.valueId); + var qid = AmlConst.Names.AmlQualifierHeader + (q.Type?.Trim() ?? "qualifier"); + if (q.Value != null) + qid += "=" + q.Value.Trim(); + else if (q.ValueId != null) + qid += "=" + ToAmlReference(q.ValueId); AttributeSequence qas = null; @@ -241,7 +243,7 @@ private static void SetQualifiers( { // choose IE as well var qie = AppendIeNameAndRole( - parentIeSeq, name: q.type, altName: "Qualifier", role: AmlConst.Roles.Qualifer); + parentIeSeq, name: q.Type, altName: "Qualifier", role: AmlConst.Roles.Qualifer); qas = qie.Attribute; } else @@ -250,25 +252,25 @@ private static void SetQualifiers( qas = a.Attribute; } - if (q.semanticId != null) + if (q.SemanticId != null) AppendAttributeNameAndRole( - qas, "semanticId", AmlConst.Attributes.SemanticId, ToAmlSemanticId(q.semanticId)); - if (q.type != null) - AppendAttributeNameAndRole(qas, "type", AmlConst.Attributes.Qualifer_Type, q.type); - if (q.value != null) - AppendAttributeNameAndRole(qas, "value", AmlConst.Attributes.Qualifer_Value, q.value); - if (q.valueId != null) + qas, "semanticId", AmlConst.Attributes.SemanticId, ToAmlSemanticId(q.SemanticId)); + if (q.Type != null) + AppendAttributeNameAndRole(qas, "type", AmlConst.Attributes.Qualifer_Type, q.Type); + if (q.Value != null) + AppendAttributeNameAndRole(qas, "value", AmlConst.Attributes.Qualifer_Value, q.Value); + if (q.ValueId != null) AppendAttributeNameAndRole( - qas, "valueId", AmlConst.Attributes.Qualifer_ValueId, ToAmlReference(q.valueId)); + qas, "valueId", AmlConst.Attributes.Qualifer_ValueId, ToAmlReference(q.ValueId)); } } private static void ExportReferenceWithSme( - AdminShell.AdministrationShellEnv env, + AasCore.Aas3_0_RC02.Environment env, List internalLinksToCreate, InternalElementType ie, - AdminShell.Referable referable, - AdminShell.Reference refInReferable, + IReferable referable, + Reference refInReferable, string attrName, string roleName, string outgoingLinkName, @@ -302,7 +304,7 @@ private static void ExportReferenceWithSme( AppendAttributeNameAndRole(ie.Attribute, attrName, roleName, ToAmlReference(refInReferable)); } - // try find the referenced element as Referable in the AAS environment + // try find the referenced element as IReferable in the AAS environment var targetReferable = env.FindReferableByReference(refInReferable); if (targetReferable != null && internalLinksToCreate != null) { @@ -327,8 +329,8 @@ private static void ExportReferenceWithSme( private static void ExportListOfSme( AasAmlMatcher matcher, List internalLinksToCreate, - SystemUnitClassType parent, AdminShell.AdministrationShellEnv env, - List wrappers, bool tryUseCompactProperties = false, + SystemUnitClassType parent, AasCore.Aas3_0_RC02.Environment env, + List wrappers, bool tryUseCompactProperties = false, bool aasStyleAttributes = false, bool amlStyleAttributes = true) { if (parent == null || env == null || wrappers == null) @@ -337,13 +339,13 @@ private static void ExportListOfSme( foreach (var smw in wrappers) { // access - var sme = smw.submodelElement; - var smep = sme as AdminShell.Property; + var sme = smw; + var smep = sme as Property; if (sme == null) continue; // device if compact or not .. - if (tryUseCompactProperties && smep != null && smep.value != null && smep.valueId == null) + if (tryUseCompactProperties && smep != null && smep.Value != null && smep.ValueId == null) { // // Property as compact attribute @@ -351,22 +353,21 @@ private static void ExportListOfSme( // value itself as Property with idShort var a = AppendAttributeNameAndRole( - parent.Attribute, smep.idShort, AmlConst.Attributes.SME_Property, smep.value); + parent.Attribute, smep.IdShort, AmlConst.Attributes.SME_Property, smep.Value); // here is no equivalence to set a match!! (MIHO deleted the **to**do** here) // add some data underneath SetReferable(a.Attribute, sme); - SetModelingKind(a.Attribute, sme.kind); - SetSemanticId(a.Attribute, sme.semanticId); - SetHasDataSpecification(a.Attribute, sme.hasDataSpecification); + SetModelingKind(a.Attribute, sme.Kind); + SetSemanticId(a.Attribute, sme.SemanticId); + SetHasDataSpecification(a.Attribute, sme.EmbeddedDataSpecifications); // Property specific - if (smep.valueType != null) - a.AttributeDataType = "xs:" + smep.valueType.Trim(); + a.AttributeDataType = "xs:" + Stringification.ToString(smep.ValueType).Trim(); // Qualifiers - SetQualifiers(null, a.Attribute, sme.qualifiers, parentAsInternalElements: false); + SetQualifiers(null, a.Attribute, sme.Qualifiers, parentAsInternalElements: false); } else { @@ -375,75 +376,76 @@ private static void ExportListOfSme( // // make an InternalElement - var ie = AppendIeNameAndRole( - parent.InternalElement, name: sme.idShort, altName: sme.GetElementName(), - role: AmlConst.Roles.SubmodelElement_Header + sme.GetElementName()); + var ie = AppendIeNameAndRole( + //parent.InternalElement, name: sme.IdShort, altName: sme.GetElementName(), + parent.InternalElement, name: sme.IdShort, altName: sme.GetType().Name, + //role: AmlConst.Roles.SubmodelElement_Header + sme.GetElementName()); + role: AmlConst.Roles.SubmodelElement_Header + sme.GetType().Name); matcher.AddMatch(sme, ie); // set some data SetReferable(ie.Attribute, sme); - SetModelingKind(ie.Attribute, sme.kind); - SetSemanticId(ie.Attribute, sme.semanticId); - SetHasDataSpecification(ie.Attribute, sme.hasDataSpecification); + SetModelingKind(ie.Attribute, sme.Kind); + SetSemanticId(ie.Attribute, sme.SemanticId); + SetHasDataSpecification(ie.Attribute, sme.EmbeddedDataSpecifications); // depends on type if (smep != null) { - if (smep.value != null) + if (smep.Value != null) { var a = AppendAttributeNameAndRole( - ie.Attribute, "value", AmlConst.Attributes.Property_Value, smep.value); - if (smep.valueType != null) - a.AttributeDataType = "xs:" + smep.valueType.Trim(); + ie.Attribute, "value", AmlConst.Attributes.Property_Value, smep.Value); + a.AttributeDataType = "xs:" + Stringification.ToString(smep.ValueType).Trim(); } - if (smep.valueId != null) + if (smep.ValueId != null) AppendAttributeNameAndRole( ie.Attribute, "valueId", AmlConst.Attributes.Property_ValueId, - ToAmlReference(smep.valueId)); + ToAmlReference(smep.ValueId)); } switch (sme) { - case AdminShell.MultiLanguageProperty mlp: + case MultiLanguageProperty mlp: // value - if (mlp.value?.langString != null) + if (mlp.Value != null) { - SetLangStr(ie.Attribute, mlp.value.langString, "value", + SetLangStr(ie.Attribute, mlp.Value, "value", AmlConst.Attributes.MultiLanguageProperty_Value); } // value id - if (mlp.valueId != null) + if (mlp.ValueId != null) AppendAttributeNameAndRole( ie.Attribute, "valueId", AmlConst.Attributes.MultiLanguageProperty_ValueId, - ToAmlReference(mlp.valueId)); + ToAmlReference(mlp.ValueId)); break; - case AdminShell.Blob smeb: + case Blob smeb: // mime type - if (smeb.mimeType != null) + if (smeb.ContentType != null) AppendAttributeNameAndRole( - ie.Attribute, "mimeType", AmlConst.Attributes.Blob_MimeType, smeb.mimeType); + ie.Attribute, "mimeType", AmlConst.Attributes.Blob_MimeType, smeb.ContentType); // value - if (smeb.value != null) + if (smeb.Value != null) { var a = AppendAttributeNameAndRole( - ie.Attribute, "value", AmlConst.Attributes.Blob_Value, smeb.value); + ie.Attribute, "value", AmlConst.Attributes.Blob_Value, System.Text.Encoding.Default.GetString(smeb.Value)); a.AttributeDataType = "xs:string"; } break; - case AdminShell.File smef: + case File smef: if (aasStyleAttributes) { - if (smef.mimeType != null) + if (smef.ContentType != null) AppendAttributeNameAndRole( - ie.Attribute, "mimeType", AmlConst.Attributes.File_MimeType, smef.mimeType); - if (smef.value != null) + ie.Attribute, "mimeType", AmlConst.Attributes.File_MimeType, smef.ContentType); + if (smef.Value != null) { AppendAttributeNameAndRole( - ie.Attribute, "value", AmlConst.Attributes.File_Value, smef.value); + ie.Attribute, "value", AmlConst.Attributes.File_Value, smef.Value); } } @@ -453,55 +455,69 @@ private static void ExportListOfSme( if (extIf != null) { extIf.RefBaseClassPath = AmlConst.Interfaces.FileDataReference; - if (smef.mimeType != null) + if (smef.ContentType != null) AppendAttributeNameAndRole( - extIf.Attribute, "MIMEType", role: null, val: smef.mimeType, + extIf.Attribute, "MIMEType", role: null, val: smef.ContentType, attributeDataType: "xs:string"); - if (smef.value != null) + if (smef.Value != null) { AppendAttributeNameAndRole( - extIf.Attribute, "refURI", role: null, val: smef.value, + extIf.Attribute, "refURI", role: null, val: smef.Value, attributeDataType: "xs:anyURI"); } } } break; - case AdminShell.ReferenceElement smer: + case ReferenceElement smer: // value == a Reference ExportReferenceWithSme(env, internalLinksToCreate, ie, smer, - smer.value, "value", AmlConst.Attributes.ReferenceElement_Value, "value", + smer.Value, "value", AmlConst.Attributes.ReferenceElement_Value, "value", aasStyleAttributes, amlStyleAttributes); break; - case AdminShell.RelationshipElement smer: + case RelationshipElement smer: // first & second ExportReferenceWithSme(env, internalLinksToCreate, ie, smer, - smer.first, "first", AmlConst.Attributes.RelationshipElement_First, "first", + smer.First, "first", AmlConst.Attributes.RelationshipElement_First, "first", aasStyleAttributes, amlStyleAttributes); ExportReferenceWithSme(env, internalLinksToCreate, ie, smer, - smer.second, "second", AmlConst.Attributes.RelationshipElement_Second, "second", + smer.Second, "second", AmlConst.Attributes.RelationshipElement_Second, "second", aasStyleAttributes, amlStyleAttributes); // Recurse - if (sme is AdminShell.AnnotatedRelationshipElement anno) - ExportListOfSme(matcher, internalLinksToCreate, ie, env, anno.annotations); + if (sme is AnnotatedRelationshipElement anno) + { + var annotations = new List(anno.Annotations); + ExportListOfSme(matcher, internalLinksToCreate, ie, env, annotations); + } + break; - case AdminShell.SubmodelElementCollection smec: + case SubmodelElementCollection smec: + // recurse + //ordered and allowDuplicates removed from SMEColl in V3 + //AppendAttributeNameAndRole( + // ie.Attribute, "ordered", AmlConst.Attributes.SMEC_ordered, + // smec.Ordered ? "true" : "false", attributeDataType: "xs:boolean"); + //AppendAttributeNameAndRole( + // ie.Attribute, "allowDuplicates", AmlConst.Attributes.SMEC_allowDuplicates, + // smec.allowDuplicates ? "true" : "false", attributeDataType: "xs:boolean"); + + ExportListOfSme(matcher, internalLinksToCreate, ie, env, smec.Value); + break; + + case SubmodelElementList smel: // recurse AppendAttributeNameAndRole( ie.Attribute, "ordered", AmlConst.Attributes.SMEC_ordered, - smec.ordered ? "true" : "false", attributeDataType: "xs:boolean"); - AppendAttributeNameAndRole( - ie.Attribute, "allowDuplicates", AmlConst.Attributes.SMEC_allowDuplicates, - smec.allowDuplicates ? "true" : "false", attributeDataType: "xs:boolean"); + (bool)smel.OrderRelevant ? "true" : "false", attributeDataType: "xs:boolean"); - ExportListOfSme(matcher, internalLinksToCreate, ie, env, smec.value); + ExportListOfSme(matcher, internalLinksToCreate, ie, env, smel.Value); break; - case AdminShell.Operation op: + case Operation op: // over in, out for (int i = 0; i < 2; i++) { @@ -517,51 +533,65 @@ private static void ExportListOfSme( })[i]); // just a list of SMEs - var lop = new List(); - foreach (var oe in op[i]) - lop.Add(oe.value); + var lop = new List(); + foreach (var opVar in op.InputVariables) + { + lop.Add(opVar.Value); + } + + foreach (var opVar in op.OutputVariables) + { + lop.Add(opVar.Value); + } + + foreach (var opVar in op.InoutputVariables) + { + lop.Add(opVar.Value); + } ExportListOfSme(matcher, internalLinksToCreate, oie, env, lop); } break; - case AdminShell.Entity ent: + case Entity ent: // entityType AppendAttributeNameAndRole( ie.Attribute, "entityType", AmlConst.Attributes.Entity_entityType, - ent.entityType, attributeDataType: "xs:string"); + Stringification.ToString(ent.EntityType), attributeDataType: "xs:string"); // assetRef - ExportReferenceWithSme(env, internalLinksToCreate, ie, ent, - ent.assetRef, "asset", AmlConst.Attributes.Entity_asset, "asset", - aasStyleAttributes, amlStyleAttributes); + // TODO (jtikekar, 0000-00-00): SpecficAssetId + if (!ent.GlobalAssetId.IsEmpty()) + { + ExportReferenceWithSme(env, internalLinksToCreate, ie, ent, + ent.GlobalAssetId, "asset", AmlConst.Attributes.Entity_asset, "asset", + aasStyleAttributes, amlStyleAttributes); + } // Recurse - ExportListOfSme(matcher, internalLinksToCreate, ie, env, ent.statements); + ExportListOfSme(matcher, internalLinksToCreate, ie, env, ent.Statements); break; - case AdminShell.Range rng: + case AasCore.Aas3_0_RC02.Range rng: // min - if (rng.min != null) + if (rng.Min != null) { var a = AppendAttributeNameAndRole( - ie.Attribute, "min", AmlConst.Attributes.Range_Min, rng.min); - if (rng.valueType != null) - a.AttributeDataType = "xs:" + rng.valueType.Trim(); + ie.Attribute, "min", AmlConst.Attributes.Range_Min, rng.Min); + a.AttributeDataType = "xs:" + Stringification.ToString(rng.ValueType).Trim(); } // max - if (rng.max != null) + if (rng.Max != null) { var a = AppendAttributeNameAndRole( - ie.Attribute, "max", AmlConst.Attributes.Range_Max, rng.max); - if (rng.valueType != null) - a.AttributeDataType = "xs:" + rng.valueType.Trim(); + ie.Attribute, "max", AmlConst.Attributes.Range_Max, rng.Max); + a.AttributeDataType = "xs:" + Stringification.ToString(rng.ValueType).Trim(); } break; } // Qualifiers - SetQualifiers(ie.InternalElement, ie.Attribute, sme.qualifiers, parentAsInternalElements: false); + SetQualifiers(ie.InternalElement, ie.Attribute, sme.Qualifiers, parentAsInternalElements: false); } } } @@ -569,8 +599,8 @@ private static void ExportListOfSme( private static void ExportSubmodelIntoElement( AasAmlMatcher matcher, List internalLinksToCreate, SystemUnitClassType parent, - AdminShell.AdministrationShellEnv env, - AdminShell.Submodel sm, + AasCore.Aas3_0_RC02.Environment env, + Submodel sm, bool tryUseCompactProperties = false, bool exportShallow = false) { @@ -578,18 +608,18 @@ private static void ExportSubmodelIntoElement( return; // set some data - SetIdentification(parent.Attribute, sm.identification); - SetAdministration(parent.Attribute, sm.administration); + SetIdentification(parent.Attribute, sm.Id); + SetAdministration(parent.Attribute, sm.Administration); SetReferable(parent.Attribute, sm); - SetModelingKind(parent.Attribute, sm.kind); - SetSemanticId(parent.Attribute, sm.semanticId); - SetHasDataSpecification(parent.Attribute, sm.hasDataSpecification); - SetQualifiers(null, parent.Attribute, sm.qualifiers, parentAsInternalElements: false); + SetModelingKind(parent.Attribute, sm.Kind); + SetSemanticId(parent.Attribute, sm.SemanticId); + SetHasDataSpecification(parent.Attribute, sm.EmbeddedDataSpecifications); + SetQualifiers(null, parent.Attribute, sm.Qualifiers, parentAsInternalElements: false); // properties if (!exportShallow) ExportListOfSme( - matcher, internalLinksToCreate, parent, env, sm.submodelElements, tryUseCompactProperties); + matcher, internalLinksToCreate, parent, env, sm.SubmodelElements, tryUseCompactProperties); else { // add a small information @@ -600,8 +630,8 @@ private static void ExportSubmodelIntoElement( private static InternalElementType ExportSubmodel( AasAmlMatcher matcher, List internalLinksToCreate, InternalElementSequence ieseq, - AdminShell.AdministrationShellEnv env, - AdminShell.Submodel sm, + AasCore.Aas3_0_RC02.Environment env, + Submodel sm, bool tryUseCompactProperties = false, bool exportShallow = false) { @@ -609,7 +639,7 @@ private static InternalElementType ExportSubmodel( return null; // directly add internal element - var ie = AppendIeNameAndRole(ieseq, name: sm.idShort, altName: "Submodel", role: AmlConst.Roles.Submodel); + var ie = AppendIeNameAndRole(ieseq, name: sm.IdShort, altName: "Submodel", role: AmlConst.Roles.Submodel); ExportSubmodelIntoElement( @@ -620,83 +650,85 @@ private static InternalElementType ExportSubmodel( } private static void ExportAsset( - InternalElementSequence ieseq, AdminShell.AdministrationShellEnv env, AdminShell.Asset asset) + InternalElementSequence ieseq, AasCore.Aas3_0_RC02.Environment env, AssetInformation asset) { if (ieseq == null || env == null || asset == null) return; // directly add internal element - var ie = AppendIeNameAndRole(ieseq, name: asset.idShort, altName: "Asset", role: AmlConst.Roles.Asset); + var ie = AppendIeNameAndRole(ieseq, name: asset.GlobalAssetId.GetAsIdentifier(), altName: "AssetInformation", role: AmlConst.Roles.AssetInformation); // set some data - SetIdentification(ie.Attribute, asset.identification); - SetAdministration(ie.Attribute, asset.administration); - SetReferable(ie.Attribute, asset); - SetAssetKind(ie.Attribute, asset.kind, attributeRole: AmlConst.Attributes.Asset_Kind); - SetHasDataSpecification(ie.Attribute, asset.hasDataSpecification); + //SetIdentification(ie.Attribute, asset.identification); + // TODO (jtikekar, 0000-00-00): what about specific asset Ids + if (!asset.GlobalAssetId.IsEmpty()) + { + SetIdentification(ie.Attribute, asset.GlobalAssetId.GetAsIdentifier()); + } + //SetReferable(ie.Attribute, asset); // Asset is not referable anymore + SetAssetKind(ie.Attribute, asset.AssetKind, attributeRole: AmlConst.Attributes.Asset_Kind); // do some data directly - - if (asset.assetIdentificationModelRef != null) - AppendAttributeNameAndRole( - ie.Attribute, "assetIdentificationModelRef", AmlConst.Attributes.Asset_IdentificationModelRef, - ToAmlReference(asset.assetIdentificationModelRef)); - - if (asset.billOfMaterialRef != null) - AppendAttributeNameAndRole(ie.Attribute, "billOfMaterialRef", - AmlConst.Attributes.Asset_BillOfMaterialRef, ToAmlReference(asset.billOfMaterialRef)); + //No More assetIdentificationModelRef and BOM a part of Asset + //if (asset.assetIdentificationModelRef != null) + // AppendAttributeNameAndRole( + // ie.Attribute, "assetIdentificationModelRef", AmlConst.Attributes.Asset_IdentificationModelRef, + // ToAmlReference(asset.assetIdentificationModelRef)); + + //if (asset.billOfMaterialRef != null) + // AppendAttributeNameAndRole(ie.Attribute, "billOfMaterialRef", + // AmlConst.Attributes.Asset_BillOfMaterialRef, ToAmlReference(asset.billOfMaterialRef)); } - private static void ExportView( - AasAmlMatcher matcher, InternalElementSequence ieseq, AdminShell.AdministrationShellEnv env, - AdminShell.View view) - { - if (ieseq == null || env == null || view == null) - return; - - // directly add internal element - var ie = AppendIeNameAndRole(ieseq, name: view.idShort, altName: "View", role: AmlConst.Roles.View); - - // set some data - SetReferable(ie.Attribute, view); - SetSemanticId(ie.Attribute, view.semanticId); - SetHasDataSpecification(ie.Attribute, view.hasDataSpecification); - - // view references - // from the Meeting: Views sind Listen von "Mirror-Elementen", - // die auf die Properties.. (IEs) der AAS verweisen. - // Views hängen unter der jeweiligen AAS (Referable) - for (int i = 0; i < view.Count; i++) - { - // access contained element - var ce = view[i]; - if (ce == null) - continue; - - // find the referenced element - var targetReferable = env.FindReferableByReference(ce); - if (targetReferable == null) - continue; - - // rely on the "hope", that there is a match - var targetAml = matcher.GetAmlObject(targetReferable); - if (targetAml == null) - continue; - - // for the time being, make an IE - // Note: it is "forbidden" to set Roles for mirror elements - var iece = AppendIeNameAndRole( - ie.InternalElement, name: ce.ListOfValues("/"), altName: "Reference", - role: null); - - // just convert it to an mirror element - iece.RefBaseSystemUnitPath = "" + targetAml.ID; - } - } + //private static void ExportView( + // AasAmlMatcher matcher, InternalElementSequence ieseq, AasCore.Aas3_0_RC02.Environment env, View view) + //{ + // if (ieseq == null || env == null || view == null) + // return; + + // // directly add internal element + // var ie = AppendIeNameAndRole(ieseq, name: view.IdShort, altName: "View", role: AmlConst.Roles.View); + + // // set some data + // SetReferable(ie.Attribute, view); + // SetSemanticId(ie.Attribute, view.SemanticId); + // SetHasDataSpecification(ie.Attribute, view.hasDataSpecification); + + // // view references + // // from the Meeting: Views sind Listen von "Mirror-Elementen", + // // die auf die Properties.. (IEs) der AAS verweisen. + // // Views hängen unter der jeweiligen AAS (IReferable) + // for (int i = 0; i < view.Count; i++) + // { + // // access contained element + // var ce = view[i]; + // if (ce == null) + // continue; + + // // find the referenced element + // var targetReferable = env.FindReferableByReference(ce); + // if (targetReferable == null) + // continue; + + // // rely on the "hope", that there is a match + // var targetAml = matcher.GetAmlObject(targetReferable); + // if (targetAml == null) + // continue; + + // // for the time being, make an IE + // // Note: it is "forbidden" to set Roles for mirror elements + // var iece = AppendIeNameAndRole( + // ie.InternalElement, name: ce.ListOfValues("/"), altName: "Reference", + // role: null); + + // // just convert it to an mirror element + // iece.RefBaseSystemUnitPath = "" + targetAml.ID; + // } + //} private static void ExportAAS( AasAmlMatcher matcher, InstanceHierarchyType insthier, SystemUnitClassLibType suchier, - AdminShell.AdministrationShellEnv env, AdminShell.AdministrationShell aas, + AasCore.Aas3_0_RC02.Environment env, AssetAdministrationShell aas, bool tryUseCompactProperties = false) { // access @@ -713,21 +745,21 @@ private static void ExportAAS( // directly add internal element var aasIE = AppendIeNameAndRole( - insthier.InternalElement, name: aas.idShort, altName: "AAS", role: AmlConst.Roles.AAS); + insthier.InternalElement, name: aas.IdShort, altName: "AAS", role: AmlConst.Roles.AAS); // set some data - SetIdentification(aasIE.Attribute, aas.identification); - SetAdministration(aasIE.Attribute, aas.administration); + SetIdentification(aasIE.Attribute, aas.Id); + SetAdministration(aasIE.Attribute, aas.Administration); SetReferable(aasIE.Attribute, aas); - SetHasDataSpecification(aasIE.Attribute, aas.hasDataSpecification); + SetHasDataSpecification(aasIE.Attribute, aas.EmbeddedDataSpecifications); - if (aas.derivedFrom != null) + if (aas.DerivedFrom != null) AppendAttributeNameAndRole( aasIE.Attribute, "derivedFrom", AmlConst.Attributes.AAS_DerivedFrom, - ToAmlReference(aas.derivedFrom)); + ToAmlReference(aas.DerivedFrom)); // asset - var asset = env.FindAsset(aas.assetRef); + var asset = aas.AssetInformation; ExportAsset(aasIE.InternalElement, env, asset); // the AAS for Submodels of kind = Type willbe created on demand @@ -736,7 +768,7 @@ private static void ExportAAS( // // Submodels can be of kind Type/ Instance // - foreach (var smref in aas.submodelRefs) + foreach (var smref in aas.Submodels) { // ref -> Submodel var sm = env.FindSubmodel(smref); @@ -744,13 +776,13 @@ private static void ExportAAS( continue; // SM types go to system unit classes, instances goe to instance hierarchy - if (sm.kind != null && sm.kind.IsTemplate) + if (sm.Kind != null && sm.Kind == ModelingKind.Template) { // create AAS for SUCs on demand if (aasSUC == null) { // create parent - aasSUC = suchier.SystemUnitClass.Append(aas.idShort ?? "AAS_" + Guid.NewGuid().ToString()); + aasSUC = suchier.SystemUnitClass.Append(aas.IdShort ?? "AAS_" + Guid.NewGuid().ToString()); // role var rr = aasSUC.SupportedRoleClass.Append(); @@ -758,17 +790,17 @@ private static void ExportAAS( } // create a dedicated SUC for this - var smSUC = aasSUC.SystemUnitClass.Append(sm.idShort ?? "Submodel_" + Guid.NewGuid().ToString()); + var smSUC = aasSUC.SystemUnitClass.Append(sm.IdShort ?? "Submodel_" + Guid.NewGuid().ToString()); // role var rq = smSUC.SupportedRoleClass.Append(); rq.RefRoleClassPath = AmlConst.Roles.Submodel; // set same data data, in order to correlate, but not asset - SetIdentification(aasSUC.Attribute, aas.identification); - SetAdministration(aasSUC.Attribute, aas.administration); + SetIdentification(aasSUC.Attribute, aas.Id); + SetAdministration(aasSUC.Attribute, aas.Administration); SetReferable(aasSUC.Attribute, aas); - SetHasDataSpecification(aasSUC.Attribute, aas.hasDataSpecification); + SetHasDataSpecification(aasSUC.Attribute, aas.EmbeddedDataSpecifications); // use normal function to export Submodel data into the SUC element ExportSubmodelIntoElement(matcher, internalLinksToCreate, smSUC, env, sm, tryUseCompactProperties); @@ -801,7 +833,7 @@ private static void ExportAAS( // for the time being, make an IE // Note: it is "forbidden" to set Roles for mirror elements var ieSubDup = AppendIeNameAndRole( - aasIE.InternalElement, name: sm.idShort, altName: "Submodel", role: null); + aasIE.InternalElement, name: sm.IdShort, altName: "Submodel", role: null); // get AML entity of existing Submodel var targetAml = matcher.GetAmlObject(sm); @@ -816,14 +848,6 @@ private static void ExportAAS( } - // - // Views - // - - if (aas.views != null && aas.views.views != null) - foreach (var view in aas.views.views) - ExportView(matcher, aasIE.InternalElement, env, view); - // // Internal Links // @@ -835,7 +859,7 @@ private static void ExportAAS( /// If aseqInnner == null, "embeddedDataSpec"-approach will be used /// private static void SetAttributesForConceptDescription( - AttributeSequence aseqOuter, AttributeSequence aseqInner, AdminShell.ConceptDescription cd, + AttributeSequence aseqOuter, AttributeSequence aseqInner, ConceptDescription cd, ref string name) { // check @@ -846,28 +870,38 @@ private static void SetAttributesForConceptDescription( // as original attributes, as well) // the name will be set at the end name = "CD_" + Guid.NewGuid().ToString(); - if (cd.idShort.HasContent()) - name = cd.idShort; + if (cd.IdShort.HasContent()) + name = cd.IdShort; // set data for identifiable - SetIdentification(aseqOuter, cd.identification); - SetAdministration(aseqOuter, cd.administration); + SetIdentification(aseqOuter, cd.Id); + SetAdministration(aseqOuter, cd.Administration); SetReferable(aseqOuter, cd); // isCaseOf - foreach (var r in cd.IsCaseOf) - AppendAttributeNameAndRole(aseqOuter, "isCaseOf", AmlConst.Attributes.CD_IsCaseOf, ToAmlReference(r)); + if (cd.IsCaseOf != null) + foreach (var r in cd.IsCaseOf) + AppendAttributeNameAndRole(aseqOuter, "isCaseOf", AmlConst.Attributes.CD_IsCaseOf, ToAmlReference(r)); // which data spec as reference - if (cd.embeddedDataSpecification != null) - foreach (var eds in cd.embeddedDataSpecification) - if (eds.dataSpecification != null) + if (cd.EmbeddedDataSpecifications != null) + foreach (var eds in cd.EmbeddedDataSpecifications) + if (eds.DataSpecification != null) + AppendAttributeNameAndRole( + aseqOuter, "dataSpecification", AmlConst.Attributes.CD_DataSpecificationRef, + ToAmlReference(eds.DataSpecification)); + + //jtikekar:Added as üet DotAAS-1 + // TODO (MIHO, 2022-12-21): do not understand this duplication?! + if (cd.EmbeddedDataSpecifications != null) + foreach (var ds in cd.EmbeddedDataSpecifications) + if (ds != null) AppendAttributeNameAndRole( aseqOuter, "dataSpecification", AmlConst.Attributes.CD_DataSpecificationRef, - ToAmlReference(eds.dataSpecification)); + ToAmlReference(ds.DataSpecification)); // which data spec to take as source? - var source61360 = cd.embeddedDataSpecification?.IEC61360Content; + var source61360 = cd.EmbeddedDataSpecifications?.GetIEC61360Content(); // TODO (Michael Hoffmeister, 2020-08-01): If further data specifications exist (in future), add here // decide which approach to take (1 or 2 IE) @@ -876,7 +910,8 @@ private static void SetAttributesForConceptDescription( { // we will pack the attribute under an embedded data spec attribute branch // now, to the embedded data spec - if (cd.embeddedDataSpecification != null) + //if (cd.embeddedDataSpecification != null) + if (cd.EmbeddedDataSpecifications != null) { var eds = AppendAttributeNameAndRole( aseqOuter, "dataSpecification", AmlConst.Attributes.CD_EmbeddedDataSpecification); @@ -904,46 +939,47 @@ private static void SetAttributesForConceptDescription( if (source61360 != null && dest61360 != null) { // better name? - if (source61360.shortName != null && source61360.shortName.Count > 0) - name = source61360.shortName.GetDefaultStr(); + if (source61360.ShortName != null && source61360.ShortName.Count > 0) + name = source61360.ShortName.GetDefaultString(); // specific data SetLangStr( - dest61360, source61360.preferredName, "preferredName", + dest61360, source61360.PreferredName, "preferredName", AmlConst.Attributes.CD_DSC61360_PreferredName); SetLangStr( - dest61360, source61360.shortName, "shortName", + dest61360, source61360.ShortName, "shortName", AmlConst.Attributes.CD_DSC61360_ShortName); - if (source61360.unit != null) + if (source61360.Unit != null) AppendAttributeNameAndRole( - dest61360, "unit", AmlConst.Attributes.CD_DSC61360_Unit, source61360.unit); - if (source61360.unitId != null) + dest61360, "unit", AmlConst.Attributes.CD_DSC61360_Unit, source61360.Unit); + if (source61360.UnitId != null) AppendAttributeNameAndRole( dest61360, "unitId", AmlConst.Attributes.CD_DSC61360_UnitId, - ToAmlReference(AdminShell.Reference.CreateNew(source61360.unitId.Keys))); - if (source61360.valueFormat != null) + ToAmlReference(new Reference(ReferenceTypes.GlobalReference, source61360.UnitId.Keys))); + if (source61360.ValueFormat != null) AppendAttributeNameAndRole( dest61360, "valueFormat", AmlConst.Attributes.CD_DSC61360_ValueFormat, - source61360.valueFormat); - if (source61360.sourceOfDefinition != null) + source61360.ValueFormat); + if (source61360.SourceOfDefinition != null) AppendAttributeNameAndRole( dest61360, "sourceOfDefinition", AmlConst.Attributes.CD_DSC61360_SourceOfDefinition, - source61360.sourceOfDefinition); - if (source61360.symbol != null) + source61360.SourceOfDefinition); + if (source61360.Symbol != null) AppendAttributeNameAndRole( - dest61360, "symbol", AmlConst.Attributes.CD_DSC61360_Symbol, source61360.symbol); - if (source61360.dataType != null) + dest61360, "symbol", AmlConst.Attributes.CD_DSC61360_Symbol, source61360.Symbol); + if (source61360.DataType != null) AppendAttributeNameAndRole( - dest61360, "dataType", AmlConst.Attributes.CD_DSC61360_DataType, source61360.dataType); + dest61360, "dataType", AmlConst.Attributes.CD_DSC61360_DataType, + Stringification.ToString(source61360.DataType)); SetLangStr( - dest61360, source61360.definition, "definition", + dest61360, source61360.Definition, "definition", AmlConst.Attributes.CD_DSC61360_Definition); } } private static void ExportConceptDescriptionsWithExtraContentToIHT( - InstanceHierarchyType lib, AdminShell.AdministrationShellEnv env) + InstanceHierarchyType lib, AasCore.Aas3_0_RC02.Environment env) { // acceess if (lib == null || env == null) @@ -967,7 +1003,7 @@ private static void ExportConceptDescriptionsWithExtraContentToIHT( SetAttributesForConceptDescription(ieCD.Attribute, ieDSC.Attribute, cd, ref name); // set the final name - name += "_" + ToAmlName(cd.identification.ToString()); + name += "_" + ToAmlName(cd.Id); ieCD.Name = name; } } @@ -983,17 +1019,17 @@ private static void SetMatcherLinks(AasAmlMatcher matcher) // to a Submodel kind = Type with that ID foreach (var x in matcher.GetAllAasReferables()) { - if (x is AdminShell.Submodel smki) + if (x is Submodel smki) { - if (smki.kind != null && smki.kind.IsInstance && smki.semanticId != null) + if (smki.Kind != null && (smki.Kind == ModelingKind.Instance) && smki.SemanticId != null) { foreach (var y in matcher.GetAllAasReferables()) - if (y is AdminShell.Submodel smkt) + if (y is Submodel smkt) { - if (smkt.kind != null && smkt.kind.IsTemplate && - smki.semanticId.Matches( - AdminShell.Key.Submodel, true, smkt.identification.idType, - smkt.identification.id)) + if (smkt.Kind != null && smkt.Kind == ModelingKind.Template && + smki.SemanticId.Matches( + KeyTypes.Submodel, + smkt.Id)) { // we have a match: Submodel kind = Instance -> Submodel kind = Type var smki_aml = matcher.GetAmlObject(smki) as InternalElementType; @@ -1081,7 +1117,7 @@ public static bool ExportTo(AdminShellPackageEnv package, string amlfn, bool try var matcher = new AasAmlMatcher(); // over all AAS - foreach (var aas in package.AasEnv.AdministrationShells) + foreach (var aas in package.AasEnv.AssetAdministrationShells) { ExportAAS(matcher, insthier, suchier, package.AasEnv, aas, tryUseCompactProperties); } diff --git a/src/AasxAmlImExport/AmlImport.cs b/src/AasxAmlImExport/AmlImport.cs index f8cd7ff5c..05c0b22ef 100644 --- a/src/AasxAmlImExport/AmlImport.cs +++ b/src/AasxAmlImExport/AmlImport.cs @@ -13,10 +13,12 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; using AasxIntegrationBase; using AdminShellNS; +using Extensions; using Aml.Engine.CAEX; - +using Newtonsoft.Json.Linq; namespace AasxAmlImExport { @@ -66,13 +68,12 @@ public TargetIdAction(int targetId, Action action) private class IeViewAmlTarget { public InternalElementType Ie; - public AdminShell.View View; + //public View View; public CAEXObject AmlTarget; - public IeViewAmlTarget(InternalElementType ie, AdminShellV20.View view, CAEXObject amlTarget) + public IeViewAmlTarget(InternalElementType ie, CAEXObject amlTarget) { Ie = ie; - View = view; AmlTarget = amlTarget; } } @@ -102,7 +103,7 @@ public void Debug(int indentation, string msg, params object[] args) Console.WriteLine("{0}{1}", new String(' ', 2 * indentation), st); } - public AdminShell.Reference ParseAmlReference(string refstr) + public Reference ParseAmlReference(string refstr) { // trivial if (refstr == null) @@ -114,31 +115,33 @@ public AdminShell.Reference ParseAmlReference(string refstr) return null; // build a Reference - var res = new AdminShell.Reference(); + //var res = new Reference(); + var keyList = new List(); // over all entries foreach (var rs in refstrs) { - var m = Regex.Match(rs.Trim(), @"^\(([^)]+)\)\s*\(([^)]+)\)\s*\[(\w+)\](.*)$"); + var m = Regex.Match(rs.Trim(), @"^\(([^)]+)\)(.*)$"); if (!m.Success) // immediate fail or next try? return null; // get string data var ke = m.Groups[1].ToString(); - var local = m.Groups[2].ToString().Trim().ToLower(); - var idtype = m.Groups[3].ToString(); - var id = m.Groups[4].ToString(); + var id = m.Groups[2].ToString(); // verify: ke has to be in allowed range - if (!AdminShell.Key.IsInKeyElements(ke)) + var keyType = Stringification.KeyTypesFromString(ke); + if (keyType.HasValue) + { + // create key and make on refece + var k = new Key(keyType.Value, id); + keyList.Add(k); + } + else return null; - var islocal = local == "local"; - - // create key and make on refece - var k = new AdminShell.Key(ke, islocal, idtype, id); - res.Keys.Add(k); } + var res = new Reference(ReferenceTypes.ModelReference, keyList); return res; } @@ -248,7 +251,7 @@ public ExternalInterfaceType FindExternalInterfaceByNameAndBaseClassPath( return res; } - public AdminShell.ListOfLangStr TryParseListOfLangStrFromAttributes( + public List TryParseListOfLangStrFromAttributes( AttributeSequence aseq, string correspondingAttributePath) { if (aseq == null || correspondingAttributePath == null) @@ -258,7 +261,7 @@ public AdminShell.ListOfLangStr TryParseListOfLangStrFromAttributes( return null; // primary stuff - var res = new AdminShell.ListOfLangStr { new AdminShell.LangStr("Default", aroot.Value) }; + var res = new List { new LangString("Default", aroot.Value) }; // assume the language-specific attributes being directly sub-ordinated if (aroot.Attribute != null) @@ -266,30 +269,30 @@ public AdminShell.ListOfLangStr TryParseListOfLangStrFromAttributes( { var m = Regex.Match(a.Name.Trim(), @"([^=]+)\w*=(.*)$"); if (m.Success && m.Groups[1].ToString().ToLower() == "aml-lang") - res.Add(new AdminShell.LangStr(m.Groups[2].ToString(), a.Value)); + res.Add(new LangString(m.Groups[2].ToString(), a.Value)); } // end return res; } - public AdminShell.Description TryParseDescriptionFromAttributes( + public List TryParseDescriptionFromAttributes( AttributeSequence aseq, string correspondingAttributePath) { var ls = TryParseListOfLangStrFromAttributes(aseq, correspondingAttributePath); if (ls == null) return null; - var res = new AdminShell.Description() { langString = ls }; + var res = new List(ls); return res; } - public AdminShell.QualifierCollection TryParseQualifiersFromAttributes(AttributeSequence aseq) + public List TryParseQualifiersFromAttributes(AttributeSequence aseq) { if (aseq == null) return null; - AdminShell.QualifierCollection res = null; + List res = null; foreach (var a in aseq) if (CheckAttributeFoRefSemantic(a, AmlConst.Attributes.Qualifer)) { @@ -304,17 +307,16 @@ public AdminShell.QualifierCollection TryParseQualifiersFromAttributes(Attribute { // create - var q = new AdminShell.Qualifier() + var q = new Qualifier(qt, DataTypeDefXsd.String) { - type = qt, - value = qv, - semanticId = AdminShell.SemanticId.CreateFromKeys(ParseAmlReference(sid)?.Keys), - valueId = ParseAmlReference(qvid) + Value = qv, + SemanticId = new Reference(ReferenceTypes.ModelReference, ParseAmlReference(sid)?.Keys), + ValueId = ParseAmlReference(qvid) }; // add if (res == null) - res = new AdminShellV20.QualifierCollection(); + res = new List(); res.Add(q); } } @@ -322,12 +324,12 @@ public AdminShell.QualifierCollection TryParseQualifiersFromAttributes(Attribute return res; } - public AdminShell.HasDataSpecification TryParseDataSpecificationFromAttributes(AttributeSequence aseq) + public List TryParseDataSpecificationFromAttributes(AttributeSequence aseq) { if (aseq == null) return null; - AdminShell.HasDataSpecification res = null; + List res = null; foreach (var a in aseq) if (CheckAttributeFoRefSemantic(a, AmlConst.Attributes.DataSpecificationRef)) { @@ -335,8 +337,10 @@ public AdminShell.HasDataSpecification TryParseDataSpecificationFromAttributes(A if (r != null) { if (res == null) - res = new AdminShell.HasDataSpecification(); - res.Add(new AdminShell.EmbeddedDataSpecification(r)); + res = new List(); //default initilization + // TODO (jtikekar, 0000-00-00): Temporarily removed, cannot be added, as it may reflect in the other places, like AssetAdministrationShell does not contain EmbeddedDS + // res.Add(new EmbeddedDataSpecification(r)); + res.Add(r); } } @@ -356,20 +360,31 @@ public List TryParseListItemsFromAttributes( return list; } - private void AddToSubmodelOrSmec(AdminShell.Referable parent, AdminShell.SubmodelElement se) + private void AddToSubmodelOrSmec(IReferable parent, ISubmodelElement se) { - if (parent is AdminShell.IManageSubmodelElements imse) - imse.Add(se); + //if (parent is IManageSubmodelElements imse) + // imse.Add(se); + if (parent is Submodel submodel) + { + submodel.Add(se); + } + else if (parent is SubmodelElementCollection collection) + { + collection.Add(se); + } + else + { + Console.WriteLine("Unsupported parent"); + } } - private AdminShell.AdministrationShell TryParseAasFromIe(SystemUnitClassType ie) + private AssetAdministrationShell TryParseAasFromIe(SystemUnitClassType ie) { // begin new (temporary) object - var aas = new AdminShell.AdministrationShell(); + var aas = new AssetAdministrationShell("", new AssetInformation(AssetKind.Instance)); // gather important attributes var idShort = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Referable_IdShort); - var idType = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Identification_idType); var id = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Identification_id); var version = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.Administration_Version); @@ -381,22 +396,25 @@ private AdminShell.AdministrationShell TryParseAasFromIe(SystemUnitClassType ie) var derivedfrom = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.AAS_DerivedFrom); // we need to have some important information - if (idType != null && id != null) + if (id != null) { // set data - aas.idShort = ie.Name; + aas.IdShort = ie.Name; if (idShort != null) - aas.idShort = idShort; - aas.identification = new AdminShell.Identification(idType, id); + aas.IdShort = idShort; + aas.Id = id; if (version != null && revision != null) - aas.administration = new AdminShell.Administration(version, revision); - aas.category = cat; + aas.Administration = new AdministrativeInformation(version: version, revision: revision); + aas.Category = cat; if (desc != null) - aas.description = desc; + aas.Description = desc; if (ds != null) - aas.hasDataSpecification = ds; + aas.EmbeddedDataSpecifications = ds.Select((dsi) => new EmbeddedDataSpecification(dsi, null)).ToList(); if (derivedfrom != null) - aas.derivedFrom = new AdminShell.AssetAdministrationShellRef(ParseAmlReference(derivedfrom)); + { + var derivedFromRef = ParseAmlReference(derivedfrom); + aas.DerivedFrom = new Reference(derivedFromRef.Type, derivedFromRef.Keys); + } // result return aas; @@ -406,14 +424,13 @@ private AdminShell.AdministrationShell TryParseAasFromIe(SystemUnitClassType ie) return null; } - private AdminShell.Asset TryParseAssetFromIe(InternalElementType ie) + private AssetInformation TryParseAssetFromIe(InternalElementType ie) { // begin new (temporary) object - var asset = new AdminShell.Asset(); + var asset = new AssetInformation(AssetKind.Instance); // gather important attributes var idShort = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Referable_IdShort); - var idType = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Identification_idType); var id = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Identification_id); var version = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.Administration_Version); @@ -425,22 +442,26 @@ private AdminShell.Asset TryParseAssetFromIe(InternalElementType ie) var ds = TryParseDataSpecificationFromAttributes(ie.Attribute); // we need to have some important information - if (idType != null && id != null) + if (id != null) { // set data - asset.idShort = ie.Name; - if (idShort != null) - asset.idShort = idShort; - asset.identification = new AdminShell.Identification(idType, id); - if (version != null && revision != null) - asset.administration = new AdminShell.Administration(version, revision); - asset.category = cat; - if (desc != null) - asset.description = desc; + // TODO (jtikekar, 0000-00-00): Uncomment and Support + //asset.identification = new Identification(idType, id); + + //NO administrativeInformation, catagory or description in V3 AssetInformation + //if (version != null && revision != null) + // asset.administration = new Administration(version, revision); + //asset.Category = cat; + //if (desc != null) + // asset.Description = desc; + + asset.GlobalAssetId = ExtendReference.CreateFromKey(KeyTypes.GlobalReference, id); + if (kind != null) - asset.kind = new AdminShell.AssetKind(kind); - if (ds != null) - asset.hasDataSpecification = ds; + asset.AssetKind = (AssetKind)Stringification.AssetKindFromString(kind); + //No DataSpecification asset + //if (ds != null) + // asset.hasDataSpecification = ds; // result return asset; @@ -472,74 +493,73 @@ private InternalElementType FindInternalElementByID(string ID) return idDict[ID]; } - private AdminShell.View TryParseViewFromIe(InstanceHierarchyType insthier, InternalElementType ie) - { - // access - if (insthier == null || ie == null) - return null; - - // - // make up local data management - // - - // begin new (temporary) objects - var view = new AdminShell.View(); - - // gather important attributes - var idShort = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Referable_IdShort); - var cat = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Referable_Category); - var desc = TryParseDescriptionFromAttributes(ie.Attribute, AmlConst.Attributes.Referable_Description); - var ds = TryParseDataSpecificationFromAttributes(ie.Attribute); - var semid = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.SemanticId); - - // we need to have some important information - if (ie.Name != null) - { - // set data - view.idShort = ie.Name; - if (idShort != null) - view.idShort = idShort; - view.category = cat; - if (desc != null) - view.description = desc; - if (semid != null) - view.semanticId = AdminShell.SemanticId.CreateFromKeys(ParseAmlReference(semid)?.Keys); - if (ds != null) - view.hasDataSpecification = ds; - - // check for direct descendents to be "Mirror-Elements" - if (ie.InternalElement != null) - foreach (var mie in ie.InternalElement) - if (mie.RefBaseSystemUnitPath.HasContent()) - { - // candidate .. try identify target - var el = FindInternalElementByID(mie.RefBaseSystemUnitPath); - if (el != null) - { - // for the View's contain element references, all targets of the references - // shall exists. - // This is not already the case, therefore store the AML IE / View Information - // for later parsing - this.latePopoulationViews.Add(new IeViewAmlTarget(ie, view, el)); - } - } - - // result - return view; - } - else - // uups! - return null; - } - - private AdminShell.Submodel TryParseSubmodelFromIe(SystemUnitClassType ie) + //private View TryParseViewFromIe(InstanceHierarchyType insthier, InternalElementType ie) + //{ + // // access + // if (insthier == null || ie == null) + // return null; + + // // + // // make up local data management + // // + + // // begin new (temporary) objects + // var view = new View(); + + // // gather important attributes + // var idShort = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Referable_IdShort); + // var cat = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Referable_Category); + // var desc = TryParseDescriptionFromAttributes(ie.Attribute, AmlConst.Attributes.Referable_Description); + // var ds = TryParseDataSpecificationFromAttributes(ie.Attribute); + // var semid = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.SemanticId); + + // // we need to have some important information + // if (ie.Name != null) + // { + // // set data + // view.IdShort = ie.Name; + // if (idShort != null) + // view.IdShort = idShort; + // view.Category = cat; + // if (desc != null) + // view.Description = desc; + // if (semid != null) + // view.SemanticId = SemanticId.CreateFromKeys(ParseAmlReference(semid)?.Keys); + // if (ds != null) + // view.hasDataSpecification = ds; + + // // check for direct descendents to be "Mirror-Elements" + // if (ie.InternalElement != null) + // foreach (var mie in ie.InternalElement) + // if (mie.RefBaseSystemUnitPath.HasContent()) + // { + // // candidate .. try identify target + // var el = FindInternalElementByID(mie.RefBaseSystemUnitPath); + // if (el != null) + // { + // // for the View's contain element references, all targets of the references + // // shall exists. + // // This is not already the case, therefore store the AML IE / View Information + // // for later parsing + // this.latePopoulationViews.Add(new IeViewAmlTarget(ie, view, el)); + // } + // } + + // // result + // return view; + // } + // else + // // uups! + // return null; + //} + + private Submodel TryParseSubmodelFromIe(SystemUnitClassType ie) { // begin new (temporary) object - var sm = new AdminShell.Submodel(); + var sm = new Submodel(""); // gather important attributes var idShort = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Referable_IdShort); - var idType = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Identification_idType); var id = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Identification_id); var version = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.Administration_Version); @@ -553,26 +573,26 @@ private AdminShell.Submodel TryParseSubmodelFromIe(SystemUnitClassType ie) var ds = TryParseDataSpecificationFromAttributes(ie.Attribute); // we need to have some important information - if (idType != null && id != null) + if (id != null) { // set data - sm.idShort = ie.Name; + sm.IdShort = ie.Name; if (idShort != null) - sm.idShort = idShort; - sm.identification = new AdminShell.Identification(idType, id); + sm.IdShort = idShort; + sm.Id = id; if (version != null && revision != null) - sm.administration = new AdminShell.Administration(version, revision); - sm.category = cat; + sm.Administration = new AdministrativeInformation(version: version, revision: revision); + sm.Category = cat; if (desc != null) - sm.description = desc; + sm.Description = desc; if (semid != null) - sm.semanticId = AdminShell.SemanticId.CreateFromKeys(ParseAmlReference(semid)?.Keys); + sm.SemanticId = new Reference(ReferenceTypes.ModelReference, ParseAmlReference(semid)?.Keys); if (kind != null) - sm.kind = new AdminShell.ModelingKind(kind); + sm.Kind = Stringification.ModelingKindFromString(kind); if (qualifiers != null) - sm.qualifiers = qualifiers; + sm.Qualifiers = qualifiers; if (ds != null) - sm.hasDataSpecification = ds; + sm.EmbeddedDataSpecifications = ds.Select((dsi) => new EmbeddedDataSpecification(dsi, null)).ToList(); // result return sm; @@ -582,10 +602,10 @@ private AdminShell.Submodel TryParseSubmodelFromIe(SystemUnitClassType ie) return null; } - private AdminShell.SubmodelElementCollection TryParseSubmodelElementCollection(SystemUnitClassType ie) + private SubmodelElementCollection TryParseSubmodelElementCollection(SystemUnitClassType ie) { // begin new (temporary) object - var smec = new AdminShell.SubmodelElementCollection(); + var smec = new SubmodelElementCollection(); // gather important attributes var idShort = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Referable_IdShort); @@ -596,25 +616,25 @@ private AdminShell.SubmodelElementCollection TryParseSubmodelElementCollection(S var qualifiers = TryParseQualifiersFromAttributes(ie.Attribute); var ds = TryParseDataSpecificationFromAttributes(ie.Attribute); - // we need to have some important information (only Referable name, shoud be always there..) + // we need to have some important information (only IReferable name, shoud be always there..) if (ie.Name != null) { // set data - smec.idShort = ie.Name; + smec.IdShort = ie.Name; if (idShort != null) - smec.idShort = idShort; + smec.IdShort = idShort; if (semid != null) - smec.semanticId = AdminShell.SemanticId.CreateFromKeys(ParseAmlReference(semid)?.Keys); + smec.SemanticId = new Reference(ReferenceTypes.ModelReference, ParseAmlReference(semid)?.Keys); if (kind != null) - smec.kind = new AdminShell.ModelingKind(kind); + smec.Kind = Stringification.ModelingKindFromString(kind); if (desc != null) - smec.description = desc; + smec.Description = desc; if (cat != null) - smec.category = cat; + smec.Category = cat; if (qualifiers != null) - smec.qualifiers = qualifiers; + smec.Qualifiers = qualifiers; if (ds != null) - smec.hasDataSpecification = ds; + smec.EmbeddedDataSpecifications = ds.Select((dsi) => new EmbeddedDataSpecification(dsi, null)).ToList(); // result return smec; @@ -625,7 +645,7 @@ private AdminShell.SubmodelElementCollection TryParseSubmodelElementCollection(S } private void TryPopulateReferenceAttribute( - SystemUnitClassType ie, string ifName, string ifClassPath, AdminShell.SubmodelElement target, + SystemUnitClassType ie, string ifName, string ifClassPath, ISubmodelElement target, int targetId = 0) { // now used @@ -657,15 +677,15 @@ private void TryPopulateReferenceAttribute( if (aasref == null) return; // get a "real" reference of this - var theref = new AdminShell.Reference(); + var theref = new Reference(ReferenceTypes.ModelReference, new List()); aasref.CollectReferencesByParent(theref.Keys); // nooooooooooow, set this - if (targetId == 1 && target is AdminShell.ReferenceElement tre) - tre.value = theref; - if (targetId == 2 && target is AdminShell.RelationshipElement trse) - trse.first = theref; - if (targetId == 3 && target is AdminShell.RelationshipElement tre2) - tre2.second = theref; + if (targetId == 1 && target is ReferenceElement tre) + tre.Value = theref; + if (targetId == 2 && target is RelationshipElement trse) + trse.First = theref; + if (targetId == 3 && target is RelationshipElement tre2) + tre2.Second = theref; }) ); @@ -675,18 +695,18 @@ private void TryPopulateReferenceAttribute( ei.Attribute, AmlConst.Attributes.ReferenceElement_Value); if (value != null) { - if (targetId == 1 && target is AdminShell.ReferenceElement tre) - tre.value = ParseAmlReference(value); - if (targetId == 2 && target is AdminShell.RelationshipElement trse) - trse.first = ParseAmlReference(value); - if (targetId == 3 && target is AdminShell.RelationshipElement tre2) - tre2.second = ParseAmlReference(value); + if (targetId == 1 && target is ReferenceElement tre) + tre.Value = ParseAmlReference(value); + if (targetId == 2 && target is RelationshipElement trse) + trse.First = ParseAmlReference(value); + if (targetId == 3 && target is RelationshipElement tre2) + tre2.Second = ParseAmlReference(value); } } } - private AdminShell.SubmodelElement TryPopulateSubmodelElement( - SystemUnitClassType ie, AdminShell.SubmodelElement sme, bool aasStyleAttributes = false, + private ISubmodelElement TryPopulateSubmodelElement( + SystemUnitClassType ie, ISubmodelElement sme, bool aasStyleAttributes = false, bool amlStyleAttributes = true) { // access? @@ -705,38 +725,39 @@ private AdminShell.SubmodelElement TryPopulateSubmodelElement( if (ie.Name != null) { // set information - sme.idShort = ie.Name; + sme.IdShort = ie.Name; if (idShort != null) - sme.idShort = idShort; + sme.IdShort = idShort; if (semid != null) - sme.semanticId = AdminShell.SemanticId.CreateFromKeys(ParseAmlReference(semid)?.Keys); + sme.SemanticId = new Reference(ReferenceTypes.ModelReference, ParseAmlReference(semid)?.Keys); if (kind != null) - sme.kind = new AdminShell.ModelingKind(kind); + sme.Kind = Stringification.ModelingKindFromString(kind); if (desc != null) - sme.description = desc; + sme.Description = desc; if (cat != null) - sme.category = cat; + sme.Category = cat; if (qualifiers != null) - sme.qualifiers = qualifiers; + sme.Qualifiers = qualifiers; if (ds != null) - sme.hasDataSpecification = ds; + sme.EmbeddedDataSpecifications = ds.Select((dsi) => new EmbeddedDataSpecification(dsi, null)).ToList(); // and also special attributes for each adequate type - if (sme is AdminShell.Property p) + if (sme is Property p) { var value = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Property_Value); var valueAttr = FindAttributeByRefSemantic(ie.Attribute, AmlConst.Attributes.Property_Value); var valueId = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.Property_ValueId); - p.value = value; + p.Value = value; if (valueId != null) - p.valueId = ParseAmlReference(valueId); + p.ValueId = ParseAmlReference(valueId); if (valueAttr != null) - p.valueType = ParseAmlDataType(valueAttr.AttributeDataType); + p.ValueType = Stringification.DataTypeDefXsdFromString(ParseAmlDataType( + valueAttr.AttributeDataType)) ?? DataTypeDefXsd.String; } - if (sme is AdminShell.Range rng) + if (sme is AasCore.Aas3_0_RC02.Range rng) { var min = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Range_Min); var minAttr = FindAttributeByRefSemantic(ie.Attribute, AmlConst.Attributes.Range_Min); @@ -746,55 +767,57 @@ private AdminShell.SubmodelElement TryPopulateSubmodelElement( if (min != null) { - rng.min = min; + rng.Min = min; if (minAttr != null) - rng.valueType = ParseAmlDataType(minAttr.AttributeDataType); + rng.ValueType = Stringification.DataTypeDefXsdFromString(ParseAmlDataType(minAttr.AttributeDataType)) + ?? DataTypeDefXsd.String; } if (max != null) { - rng.max = max; + rng.Max = max; if (maxAttr != null) - rng.valueType = ParseAmlDataType(maxAttr.AttributeDataType); + rng.ValueType = Stringification.DataTypeDefXsdFromString(ParseAmlDataType(maxAttr.AttributeDataType)) + ?? DataTypeDefXsd.String; } } - if (sme is AdminShell.MultiLanguageProperty mlp) + if (sme is MultiLanguageProperty mlp) { var value = TryParseDescriptionFromAttributes( ie.Attribute, AmlConst.Attributes.MultiLanguageProperty_Value); var valueId = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.MultiLanguageProperty_ValueId); - if (value.langString != null) - mlp.value = new AdminShell.LangStringSet(value.langString); + if (value != null) + mlp.Value = value.Copy(); if (valueId != null) - mlp.valueId = ParseAmlReference(valueId); + mlp.ValueId = ParseAmlReference(valueId); } - if (sme is AdminShell.Blob smeb) + if (sme is Blob smeb) { var mimeType = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.Blob_MimeType); var value = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.Blob_Value); if (mimeType != null) - smeb.mimeType = mimeType; + smeb.ContentType = mimeType; if (value != null) - smeb.value = value; + smeb.Value = Encoding.Default.GetBytes(value); } - if (sme is AdminShell.File smef) + if (sme is File smef) { var mimeType = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.File_MimeType); var value = FindAttributeValueByRefSemantic(ie.Attribute, AmlConst.Attributes.File_Value); if (mimeType != null) - smef.mimeType = mimeType; + smef.ContentType = mimeType; if (value != null) - smef.value = value; + smef.Value = value; } - if (sme is AdminShell.ReferenceElement smer) + if (sme is ReferenceElement smer) { if (aasStyleAttributes) { @@ -802,7 +825,7 @@ private AdminShell.SubmodelElement TryPopulateSubmodelElement( var value = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.ReferenceElement_Value); if (value != null) - smer.value = ParseAmlReference(value); + smer.Value = ParseAmlReference(value); } if (amlStyleAttributes) @@ -814,7 +837,7 @@ private AdminShell.SubmodelElement TryPopulateSubmodelElement( } // will also include AnnotatedRelationship !! - if (sme is AdminShell.RelationshipElement smere) + if (sme is RelationshipElement smere) { if (aasStyleAttributes) { @@ -825,8 +848,8 @@ private AdminShell.SubmodelElement TryPopulateSubmodelElement( ie.Attribute, AmlConst.Attributes.RelationshipElement_Second); if (first != null && second != null) { - smere.first = ParseAmlReference(first); - smere.second = ParseAmlReference(second); + smere.First = ParseAmlReference(first); + smere.Second = ParseAmlReference(second); } } @@ -840,17 +863,20 @@ private AdminShell.SubmodelElement TryPopulateSubmodelElement( } } - if (sme is AdminShell.Entity ent) + if (sme is Entity ent) { var entityType = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.Entity_entityType); if (entityType != null) - ent.entityType = entityType; + ent.EntityType = (EntityType)Stringification.EntityTypeFromString(entityType); var assetRef = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.Entity_asset); if (assetRef != null) - ent.assetRef = new AdminShell.AssetRef(ParseAmlReference(assetRef)); + { + var reference = ParseAmlReference(assetRef); + ent.GlobalAssetId = new Reference(reference.Type, reference.Keys); + } } // ok @@ -861,35 +887,34 @@ private AdminShell.SubmodelElement TryPopulateSubmodelElement( return null; } - private AdminShell.ConceptDescription TryParseConceptDescription(AttributeSequence aseq) + private ConceptDescription TryParseConceptDescription(AttributeSequence aseq) { // begin new (temporary) object - var cd = new AdminShell.ConceptDescription(); + var cd = new ConceptDescription(""); // gather important attributes var idShort = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.Referable_IdShort); - var idType = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.Identification_idType); var id = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.Identification_id); var version = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.Administration_Version); var revision = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.Administration_Revision); var cat = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.Referable_Category); var desc = TryParseDescriptionFromAttributes(aseq, AmlConst.Attributes.Referable_Description); - // we need to have some important information (only Referable name, shoud be always there..) - if (idType != null && id != null) + // we need to have some important information (only IReferable name, shoud be always there..) + if (id != null) { // set normal data - cd.idShort = idShort; - cd.identification = new AdminShell.Identification(idType, id); + cd.IdShort = idShort; + cd.Id = id; if (version != null && revision != null) - cd.administration = new AdminShell.Administration(version, revision); + cd.Administration = new AdministrativeInformation(version: version, revision: revision); if (desc != null) - cd.description = desc; + cd.Description = desc; if (cat != null) - cd.category = cat; + cd.Category = cat; // special data - cd.IsCaseOf = TryParseListItemsFromAttributes( + cd.IsCaseOf = TryParseListItemsFromAttributes( aseq, AmlConst.Attributes.CD_IsCaseOf, (s) => { return ParseAmlReference(s); }); // result @@ -900,37 +925,37 @@ private AdminShell.ConceptDescription TryParseConceptDescription(AttributeSequen return null; } - private AdminShell.DataSpecificationIEC61360 TryParseDataSpecificationContentIEC61360( + private DataSpecificationIec61360 TryParseDataSpecificationContentIEC61360( AttributeSequence aseq) { // finally, create the entity - var ds = new AdminShell.DataSpecificationIEC61360(); + var ds = new DataSpecificationIec61360(null); // populate var pn = TryParseListOfLangStrFromAttributes(aseq, AmlConst.Attributes.CD_DSC61360_PreferredName); if (pn != null) - ds.preferredName = AdminShell.LangStringSetIEC61360.CreateFrom(pn); + ds.PreferredName = new List(pn); var sn = TryParseListOfLangStrFromAttributes(aseq, AmlConst.Attributes.CD_DSC61360_ShortName); if (sn != null) - ds.shortName = AdminShell.LangStringSetIEC61360.CreateFrom(sn); + ds.ShortName = new List(sn); - ds.unit = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.CD_DSC61360_Unit); + ds.Unit = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.CD_DSC61360_Unit); - ds.unitId = AdminShell.UnitId.CreateNew( - ParseAmlReference(FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.CD_DSC61360_UnitId))); + ds.UnitId = ParseAmlReference(FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.CD_DSC61360_UnitId))?.Copy(); - ds.valueFormat = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.CD_DSC61360_ValueFormat); + ds.ValueFormat = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.CD_DSC61360_ValueFormat); - ds.sourceOfDefinition = FindAttributeValueByRefSemantic( + ds.SourceOfDefinition = FindAttributeValueByRefSemantic( aseq, AmlConst.Attributes.CD_DSC61360_SourceOfDefinition); - ds.symbol = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.CD_DSC61360_Symbol); - ds.dataType = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.CD_DSC61360_DataType); + ds.Symbol = FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.CD_DSC61360_Symbol); + ds.DataType = Stringification.DataTypeIec61360FromString( + FindAttributeValueByRefSemantic(aseq, AmlConst.Attributes.CD_DSC61360_DataType) ?? "string"); var def = TryParseListOfLangStrFromAttributes(aseq, AmlConst.Attributes.CD_DSC61360_Definition); if (def != null) - ds.definition = AdminShell.LangStringSetIEC61360.CreateFrom(def); + ds.Definition = new List(def); // done, without further checks return ds; @@ -956,10 +981,10 @@ public string ParseAmlDataType(string dt) public void ParseInternalElementsForAasEntities( InstanceHierarchyType insthier, InternalElementSequence ieseq, - AdminShell.AdministrationShell currentAas = null, - AdminShell.Submodel currentSubmodel = null, - AdminShell.Referable currentSmeCollection = null, - AdminShell.Operation currentOperation = null, + AssetAdministrationShell currentAas = null, + Submodel currentSubmodel = null, + IReferable currentSmeCollection = null, + Operation currentOperation = null, int currentOperationDir = -1, int indentation = 0) { @@ -993,7 +1018,7 @@ public void ParseInternalElementsForAasEntities( Debug(indentation, " AAS with required attributes recognised. Starting new AAS.."); // make temporary object official - this.package.AasEnv.AdministrationShells.Add(aas); + this.package.AasEnv.AssetAdministrationShells.Add(aas); currentAas = aas; matcher.AddMatch(aas, ie); } @@ -1002,20 +1027,20 @@ public void ParseInternalElementsForAasEntities( } // - // Asset + // AssetInformation // - if (currentAas != null && CheckForRoleClassOrRoleRequirements(ie, AmlConst.Roles.Asset)) + if (currentAas != null && CheckForRoleClassOrRoleRequirements(ie, AmlConst.Roles.AssetInformation)) { // begin new (temporary) object var asset = TryParseAssetFromIe(ie); if (asset != null) { - Debug(indentation, " ASSET with required attributes recognised. Starting new Asset.."); + Debug(indentation, " ASSET with required attributes recognised. Starting new AssetInformation.."); // make temporary object official - this.package.AasEnv.Assets.Add(asset); - currentAas.assetRef = asset.GetAssetReference(); - matcher.AddMatch(asset, ie); + currentAas.AssetInformation = asset; + //matcher.AddMatch(asset, ie); + // TODO (jtikekar, 0000-00-00): AssetInformation is not Referable } else Debug(indentation, " ASSET with insufficient attributes. Skipping"); @@ -1024,21 +1049,22 @@ public void ParseInternalElementsForAasEntities( // // View // - if (currentAas != null && CheckForRoleClassOrRoleRequirements(ie, AmlConst.Roles.View)) - { - // begin new (temporary) object - var view = TryParseViewFromIe(insthier, ie); - if (view != null) - { - Debug(indentation, " VIEW with required attributes recognised. Collecting references.."); - - // make temporary object official - currentAas.AddView(view); - matcher.AddMatch(view, ie); - } - else - Debug(indentation, " VIEW with insufficient attributes. Skipping"); - } + //View removed from V3 + //if (currentAas != null && CheckForRoleClassOrRoleRequirements(ie, AmlConst.Roles.View)) + //{ + // // begin new (temporary) object + //var view = TryParseViewFromIe(insthier, ie); + // if (view != null) + // { + // Debug(indentation, " VIEW with required attributes recognised. Collecting references.."); + + // // make temporary object official + // currentAas.AddView(view); + // matcher.AddMatch(view, ie); + // } + // else + // Debug(indentation, " VIEW with insufficient attributes. Skipping"); + //} // // Submodel @@ -1047,7 +1073,7 @@ public void ParseInternalElementsForAasEntities( { // begin new (temporary) object var sm = TryParseSubmodelFromIe(ie); - if (sm != null && (sm.kind == null || sm.kind.IsInstance)) + if (sm != null && (sm.Kind == null || sm.Kind == ModelingKind.Instance)) { Debug( indentation, @@ -1056,8 +1082,8 @@ public void ParseInternalElementsForAasEntities( // there might be the case, that a submodel with the same identification is already // existing. // If so, that switch to it and ignore the newly parsed set of information - // (TODO: check, if to merge information?) - var existSm = this.package.AasEnv.FindSubmodel(sm.identification); + // TODO (who?, 0000-00-00): check, if to merge information? + var existSm = this.package.AasEnv.FindSubmodelById(sm.Id); if (existSm != null) sm = existSm; @@ -1068,9 +1094,13 @@ public void ParseInternalElementsForAasEntities( // this will be the parent for child elements // Remark: add only, if not a SM with the same ID is existing. This could have the // consequences that additional properties in the 2nd SM with the same SM get lost! - if (null == this.package.AasEnv.FindSubmodel(sm.identification)) + if (null == this.package.AasEnv.FindSubmodelById(sm.Id)) this.package.AasEnv.Submodels.Add(sm); - currentAas.AddSubmodelRef(sm.GetReference() as AdminShell.SubmodelRef); + if (currentAas.Submodels == null) + { + currentAas.Submodels = new List(); + } + currentAas.Submodels.Add(sm.GetReference()); currentSmeCollection = sm; } else @@ -1086,10 +1116,14 @@ public void ParseInternalElementsForAasEntities( if (targetSm != null && this.package != null && this.package.AasEnv != null) { // try use Identification to find existing Submodel - var existSm = package.AasEnv.FindSubmodel(targetSm.identification); + var existSm = package.AasEnv.FindSubmodelById(targetSm.Id); + if (currentAas.Submodels == null) + { + currentAas.Submodels = new List(); + } // if so, add a SubmodelRef - currentAas.AddSubmodelRef(existSm.GetReference() as AdminShell.SubmodelRef); + currentAas.Submodels.Add(existSm.GetReference()); } } @@ -1127,8 +1161,8 @@ public void ParseInternalElementsForAasEntities( CheckForRoleClassOrRoleRequirements(ie, AmlConst.Roles.SubmodelElement_Entity)) { // begin new (temporary) object - var ent = new AdminShell.Entity(); - ent = TryPopulateSubmodelElement(ie, ent) as AdminShell.Entity; + var ent = new Entity(EntityType.SelfManagedEntity); + ent = TryPopulateSubmodelElement(ie, ent) as Entity; if (ent != null) { Debug( @@ -1154,8 +1188,8 @@ public void ParseInternalElementsForAasEntities( CheckForRoleClassOrRoleRequirements(ie, AmlConst.Roles.SubmodelElement_AnnotatedRelationship)) { // begin new (temporary) object - var ent = new AdminShell.AnnotatedRelationshipElement(); - ent = TryPopulateSubmodelElement(ie, ent) as AdminShell.AnnotatedRelationshipElement; + var ent = new AnnotatedRelationshipElement(null, null); + ent = TryPopulateSubmodelElement(ie, ent) as AnnotatedRelationshipElement; if (ent != null) { Debug( @@ -1186,21 +1220,24 @@ public void ParseInternalElementsForAasEntities( // create a Property Debug(indentation, " found ATTR {0}. Adding as property.", a.Name); - var p = new AdminShell.Property() + var p = new Property(DataTypeDefXsd.String) { - idShort = a.Name, - value = a.Value, - valueType = ParseAmlDataType(a.AttributeDataType), - qualifiers = TryParseQualifiersFromAttributes(a.Attribute), - hasDataSpecification = TryParseDataSpecificationFromAttributes(ie.Attribute) + IdShort = a.Name, + Value = a.Value, + ValueType = (DataTypeDefXsd)Stringification.DataTypeDefXsdFromString(ParseAmlDataType(a.AttributeDataType)), + Qualifiers = TryParseQualifiersFromAttributes(a.Attribute), + EmbeddedDataSpecifications = TryParseDataSpecificationFromAttributes(ie.Attribute)? + .Select((dsi) => new EmbeddedDataSpecification(dsi, null)).ToList() }; // gather information var semid = FindAttributeValueByRefSemantic( a.Attribute, AmlConst.Attributes.SemanticId); + if (semid != null) - p.semanticId = AdminShell.SemanticId.CreateFromKeys( - ParseAmlReference(semid)?.Keys); + { + p.SemanticId = new Reference(ReferenceTypes.ModelReference, ParseAmlReference(semid)?.Keys); + } // add AddToSubmodelOrSmec(currentSmeCollection, p); @@ -1230,22 +1267,19 @@ public void ParseInternalElementsForAasEntities( // Note MIHO, 2020-10-18): I presume, that SMC shall be excluded from th search, hence // do another kind of comparison // reSharper disable once ForCanBeConvertedToForeach - for (int i = 0; i < AdminShell.SubmodelElementWrapper.AdequateElementNames.Length; i++) + foreach (AasSubmodelElements smeEnum in Enum.GetValues(typeof(AasSubmodelElements))) { - // access - var aen = AdminShell.SubmodelElementWrapper.AdequateElementNames[i]; - var ae = AdminShell.SubmodelElementWrapper.GetAdequateEnum(aen); - if (ae == AdminShell.SubmodelElementWrapper.AdequateElementEnum.Unknown - || ae == AdminShell.SubmodelElementWrapper.AdequateElementEnum.SubmodelElementCollection - || ae == AdminShell.SubmodelElementWrapper.AdequateElementEnum.Entity - || ae == - AdminShell.SubmodelElementWrapper.AdequateElementEnum.AnnotatedRelationshipElement) + if (smeEnum == AasSubmodelElements.SubmodelElement || smeEnum == AasSubmodelElements.SubmodelElementList || smeEnum == AasSubmodelElements.SubmodelElementCollection + || smeEnum == AasSubmodelElements.AnnotatedRelationshipElement || smeEnum == AasSubmodelElements.Entity) + { continue; + } - if (CheckForRoleClassOrRoleRequirements(ie, AmlConst.Roles.SubmodelElement_Header + aen)) + if (CheckForRoleClassOrRoleRequirements(ie, AmlConst.Roles.SubmodelElement_Header + smeEnum.ToString())) { // begin new (temporary) object - var sme = AdminShell.SubmodelElementWrapper.CreateAdequateType(ae); + //var sme = SubmodelElementWrapper.CreateAdequateType(ae); + var sme = AdminShellUtil.CreateSubmodelElementFromEnum(smeEnum); if (sme == null) continue; @@ -1265,9 +1299,9 @@ public void ParseInternalElementsForAasEntities( AddToSubmodelOrSmec(currentSmeCollection, sme); // need keep track of state - if (sme is AdminShell.Operation) + if (sme is Operation) { - currentOperation = sme as AdminShell.Operation; + currentOperation = sme as Operation; currentOperationDir = -1; } } @@ -1279,13 +1313,10 @@ public void ParseInternalElementsForAasEntities( "Adding to a pending OPERATION..", sme.GetType().ToString()); // add - var wrapper = new AdminShell.SubmodelElementWrapper(); - wrapper.submodelElement = sme; - var opv = new AdminShell.OperationVariable() - { - value = wrapper - }; - currentOperation[currentOperationDir].Add(opv); + ISubmodelElement wrapper = sme; + var opv = new OperationVariable(wrapper); + currentOperation.InputVariables.Add(opv); + //currentOperation[currentOperationDir].Add(opv); } } else @@ -1295,6 +1326,7 @@ public void ParseInternalElementsForAasEntities( } + // recurse into childs ParseInternalElementsForAasEntities( insthier, ie.InternalElement, currentAas, currentSubmodel, parentSmeCollection, @@ -1305,10 +1337,10 @@ public void ParseInternalElementsForAasEntities( public void ParseSystemUnits( CAEXSequenceOfCAEXObjects sucseq, - AdminShell.AdministrationShell currentAas = null, - AdminShell.Submodel currentSubmodel = null, - AdminShell.Referable currentSmeCollection = null, - AdminShell.Operation currentOperation = null, + AssetAdministrationShell currentAas = null, + Submodel currentSubmodel = null, + IReferable currentSmeCollection = null, + Operation currentOperation = null, int currentOperationDir = -1, int indentation = 0) { @@ -1332,13 +1364,13 @@ public void ParseSystemUnits( // AAS might already exist by parsing instance, therefore check for existance // If so, then switch to it and ignore the newly parsed set of information - // (TODO: check, if to merge information?) - var existAas = this.package.AasEnv.FindAAS(aas.identification); + // TODO (who?, 0000-00-00): check, if to merge information?) + var existAas = this.package.AasEnv.FindAasById(aas.Id); if (existAas != null) aas = existAas; else // add - this.package.AasEnv.AdministrationShells.Add(aas); + this.package.AasEnv.AssetAdministrationShells.Add(aas); // remember currentAas = aas; @@ -1354,7 +1386,7 @@ public void ParseSystemUnits( { // begin new (temporary) object var sm = TryParseSubmodelFromIe(suc); - if (sm != null && sm.kind != null && sm.kind.IsTemplate) + if (sm != null && sm.Kind != null && sm.Kind == ModelingKind.Template) { Debug( indentation, @@ -1362,8 +1394,8 @@ public void ParseSystemUnits( // there might be the case, that a submodel with the same identification already exists. // If so, that switch to it and ignore the newly parsed set of information - // (TODO: check, if to merge information?) - var existSm = this.package.AasEnv.FindSubmodel(sm.identification); + // TODO (who?, 0000-00-00): check, if to merge information?) + var existSm = this.package.AasEnv.FindSubmodelById(sm.Id); if (existSm != null) sm = existSm; @@ -1372,7 +1404,11 @@ public void ParseSystemUnits( // this will be the parent for child elements this.package.AasEnv.Submodels.Add(sm); - currentAas.AddSubmodelRef(sm.GetReference() as AdminShell.SubmodelRef); + if (currentAas.Submodels == null) + { + currentAas.Submodels = new List(); + } + currentAas.Submodels.Add(sm.GetReference()); currentSmeCollection = sm; } else @@ -1415,7 +1451,7 @@ public void ParseIEsForConceptDescriptions( if (cd != null) { // add - Debug(indentation, " .. added as {0}", cd.identification.ToString()); + Debug(indentation, " .. added as {0}", cd.Id); this.package.AasEnv.ConceptDescriptions.Add(cd); // look for direct descendants = Data Specifcations @@ -1429,25 +1465,21 @@ public void ParseIEsForConceptDescriptions( var ds61360 = TryParseDataSpecificationContentIEC61360(ie2.Attribute); if (ds61360 != null) { - // embedded data spec for the SDK - var eds = new AdminShell.EmbeddedDataSpecification(); - cd.IEC61360DataSpec = eds; - + //embedded data spec for the SDK /* TODO (Michael Hoffmeister, 2020-08-01): fill out eds.hasDataSpecification by using outer attributes */ + + var eds = ExtendEmbeddedDataSpecification.CreateIec61360WithContent(ds61360); + var hds = FindAttributeValueByRefSemantic( ie.Attribute, AmlConst.Attributes.CD_DataSpecificationRef); if (hds != null) - eds.dataSpecification = AdminShell.DataSpecificationRef.CreateNew( - ParseAmlReference(hds)); - - // make 61360 data - eds.dataSpecificationContent = new AdminShell.DataSpecificationContent() - { - dataSpecificationIEC61360 = ds61360 - }; + eds.DataSpecification = ParseAmlReference(hds).Copy(); + + cd.EmbeddedDataSpecifications = new List(); + cd.EmbeddedDataSpecifications.Add(eds); } } } @@ -1507,7 +1539,7 @@ public void LatePopulateViews() foreach (var ieViewAmlTarget in this.latePopoulationViews) { // access - if (ieViewAmlTarget.Ie == null || ieViewAmlTarget.View == null || ieViewAmlTarget.AmlTarget == null) + if (ieViewAmlTarget.Ie == null /*|| ieViewAmlTarget.View == null*/ || ieViewAmlTarget.AmlTarget == null) continue; // we need to identify the target with respect to the AAS @@ -1516,11 +1548,11 @@ public void LatePopulateViews() continue; // get a "real" reference of this - var theref = new AdminShell.Reference(); + var theref = new Reference(ReferenceTypes.ModelReference, new List()); aasTarget.CollectReferencesByParent(theref.Keys); // add - ieViewAmlTarget.View.AddContainedElement(theref); + //ieViewAmlTarget.View.AddContainedElement(theref); } } diff --git a/src/AasxAmlImExport/LICENSE.txt b/src/AasxAmlImExport/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxAmlImExport/LICENSE.txt +++ b/src/AasxAmlImExport/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxAmlImExport/Resources/AssetAdministrationShellLib.aml b/src/AasxAmlImExport/Resources/AssetAdministrationShellLib.aml index c9c73ded5..6f36021ac 100644 --- a/src/AasxAmlImExport/Resources/AssetAdministrationShellLib.aml +++ b/src/AasxAmlImExport/Resources/AssetAdministrationShellLib.aml @@ -13,7 +13,7 @@ 5.2.7.0 5.2.7.0 2019-11-12T09:42:53.6809451 - Application Recommendation Asset Administration Shell + Application Recommendation AssetInformation Administration Shell AR AAS @@ -66,13 +66,13 @@ - Interface Class Library according to Details of the Asset Administration Shell V2.0. + Interface Class Library according to Details of the AssetInformation Administration Shell V2.0. 1.0.0 A FileDataReference represents the address to a File. FileDataReference is derived from the AutomationML Interface Class ExternalDataReference that is defined in AutomationML BPR_005E_ExternalDataReference_v1.0.0_2:The interface class “ExternalDataReference” shall be used in order to reference external documents out of the scope of AutomationML. - Reference to any other referable element of the same of any other AAS or a reference to an external object or entity. For local references inside the same Asset Administration Shell an InternalLink between two objects with this interface "ReferableReference" shall be set. In this case the attribute value has to be empty. For references between different Asset Administration Shells or external objects or entities the attribute value shall be used and no InternalLink shall be set. + Reference to any other referable element of the same of any other AAS or a reference to an external object or entity. For local references inside the same AssetInformation Administration Shell an InternalLink between two objects with this interface "ReferableReference" shall be set. In this case the attribute value has to be empty. For references between different AssetInformation Administration Shells or external objects or entities the attribute value shall be used and no InternalLink shall be set. Reference to any other referable element of any other AAS or a reference to an external object or entity. Note: For references to any other referable element of the same AAS InternalLinks are used and this attribute value shall be empty. @@ -115,10 +115,10 @@ 1.0.0 - Role Class Library according to Details of the Asset Administration Shell V2.0. + Role Class Library according to Details of the AssetInformation Administration Shell V2.0. 1.0.0 - An Asset Administration Shell. + An AssetInformation Administration Shell. Identifying string of the element within its name space. Constraint AASd-001: In case of a referable element not being an identifiable element this id is mandatory and used for referring to the element in its name space. Constraint AASd-002: idShort shall only feature letters, digits, underscore ("_"); starting mandatory with a letter. Constraint AASd-003: idShort shall be matched case-insensitive. Note: In case of an identifiable element idShort is optional but recommended to be defined. It can be used for unique reference in its name space and thus allows better usability and a more performant implementation. In this case it is similar to the “BrowserPath” in OPC UA. @@ -173,13 +173,13 @@ - The derivedFrom attribute is used to establish a relationship between two Asset Administration Shells that are derived from each other. + The derivedFrom attribute is used to establish a relationship between two AssetInformation Administration Shells that are derived from each other. - - An Asset describes meta data of an asset that is represented by an AAS. The asset may either represent an asset type or an asset instance. The asset has a globally unique identifier plus – if needed – additional domain specific (proprietary) identifiers. + + An AssetInformation describes meta data of an asset that is represented by an AAS. The asset may either represent an asset type or an asset instance. The asset has a globally unique identifier plus – if needed – additional domain specific (proprietary) identifiers. Identifying string of the element within its name space. Constraint AASd-001: In case of a referable element not being an identifiable element this id is mandatory and used for referring to the element in its name space. Constraint AASd-002: idShort shall only feature letters, digits, underscore ("_"); starting mandatory with a letter. Constraint AASd-003: idShort shall be matched case-insensitive. Note: In case of an identifiable element idShort is optional but recommended to be defined. It can be used for unique reference in its name space and thus allows better usability and a more performant implementation. In this case it is similar to the “BrowserPath” in OPC UA. @@ -232,7 +232,7 @@ Kind of the element: either type or instance. Instance Instance - + Instance diff --git a/src/AasxAmlImExport/app.config b/src/AasxAmlImExport/app.config deleted file mode 100644 index e936cc132..000000000 --- a/src/AasxAmlImExport/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxAmlImExport/packages.config b/src/AasxAmlImExport/packages.config deleted file mode 100644 index 312963ccd..000000000 --- a/src/AasxAmlImExport/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/AasxBammRdfImExport/AasxBammRdfImExport.csproj b/src/AasxBammRdfImExport/AasxBammRdfImExport.csproj index d838d9f53..759824518 100644 --- a/src/AasxBammRdfImExport/AasxBammRdfImExport.csproj +++ b/src/AasxBammRdfImExport/AasxBammRdfImExport.csproj @@ -1,17 +1,19 @@ - + - netstandard2.0 + net6.0 Library false + false + - - - + + + diff --git a/src/AasxBammRdfImExport/BammRDFEntitites/Aspect.cs b/src/AasxBammRdfImExport/BammRDFEntitites/Aspect.cs index 3b1cf1ba3..307a2636c 100644 --- a/src/AasxBammRdfImExport/BammRDFEntitites/Aspect.cs +++ b/src/AasxBammRdfImExport/BammRDFEntitites/Aspect.cs @@ -20,7 +20,7 @@ internal class Aspect private string preferredName; private string description; private string language; - private List myList = new List(); + private List myList = new List(); @@ -28,6 +28,6 @@ internal class Aspect public string PreferredName { get => preferredName; set => preferredName = value; } public string Description { get => description; set => description = value; } public string Language { get => language; set => language = value; } - internal List MyList { get => myList; set => myList = value; } + internal List MyList { get => myList; set => myList = value; } } } diff --git a/src/AasxBammRdfImExport/BammRDFEntitites/Property.cs b/src/AasxBammRdfImExport/BammRDFEntitites/BammProperty.cs similarity index 97% rename from src/AasxBammRdfImExport/BammRDFEntitites/Property.cs rename to src/AasxBammRdfImExport/BammRDFEntitites/BammProperty.cs index ac99dbaae..a2667ac80 100644 --- a/src/AasxBammRdfImExport/BammRDFEntitites/Property.cs +++ b/src/AasxBammRdfImExport/BammRDFEntitites/BammProperty.cs @@ -16,7 +16,7 @@ This source code may use other Open Source software components (see LICENSE.txt) namespace AasxBammRdfImExport.RDFentities { - public class Property + public class BammProperty { private string name; private string preferredName; diff --git a/src/AasxBammRdfImExport/LICENSE.txt b/src/AasxBammRdfImExport/LICENSE.txt index 1f535ee2c..2e5ee87b9 100644 --- a/src/AasxBammRdfImExport/LICENSE.txt +++ b/src/AasxBammRdfImExport/LICENSE.txt @@ -1,8 +1,8 @@ -Copyright (c) 2018-2020 Festo AG & Co. KG +Copyright (c) 2018-2021 Festo AG & Co. KG , author: Michael Hoffmeister -Copyright (c) 2019-2020 PHOENIX CONTACT GmbH & Co. KG +Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG , author: Andreas Orzelski @@ -16,8 +16,10 @@ author: Marco Mendes Copyright (c) 2020 SICK AG -Copyright (c) 2021 Robert Bosch Manufacturing Solutions GmbH -author: Monisha Macharla Vasu +Copyright (c) 2021 KEB Automation KG + +Copyright (c) 2021 Lenze SE +author: Jonas Grote, Denis Göllner, Sebastian Bischof The AASX Package Explorer is licensed under the Apache License 2.0 (Apache-2.0, see below). @@ -89,7 +91,12 @@ The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license (MIT, see below). -The dotNetRDF is licensed under the MIT license (MIT, see below). +The Magick.NET library is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -281,7 +288,7 @@ With respect to cefSharp (https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) -Copyright ┬® The CefSharp Authors. All rights reserved. +Copyright © The CefSharp Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -644,7 +651,7 @@ With resepct to CountryFlag The Code Project Open License (CPOL) 1.02 -Copyright ┬® 2017 Meshack Musundi +Copyright © 2017 Meshack Musundi Preamble @@ -785,7 +792,7 @@ WORKS. Indemnity. You agree to defend, indemnify and hold harmless the Author and the Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneysÔÇÖ fees) +costs, and expenses (including reasonable legal or attorneys’ fees) resulting from or relating to any use of the Work by You. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, @@ -985,6 +992,7 @@ With resepect to OPC UA Example Code * The complete license agreement can be found here: * http://opcfoundation.org/License/MIT/1.00/ + With respect to OPC Foundation ============================== @@ -1029,6 +1037,7 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + With respect to Glob (https://www.nuget.org/packages/Glob/) =========================================================== (see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) @@ -1053,3 +1062,414 @@ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to Magick.NET +========================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxBammRdfImExport/RDFimport.cs b/src/AasxBammRdfImExport/RDFimport.cs index 863cb5887..8ab92e0fc 100644 --- a/src/AasxBammRdfImExport/RDFimport.cs +++ b/src/AasxBammRdfImExport/RDFimport.cs @@ -15,11 +15,12 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Linq; using System.Text; using AasxBammRdfImExport.RDFentities; -using AdminShellNS; using VDS.RDF; using VDS.RDF.Parsing; using VDS.RDF.Writing; -using static AdminShellNS.AdminShellV20; +using Aas = AasCore.Aas3_0_RC02; +using AdminShellNS; +using Extensions; namespace AasxBammRdfImExport { @@ -28,9 +29,9 @@ public static class BAMMRDFimport public static AdminShellNS.AdminShellPackageEnv thePackageEnv; - public static void ImportInto(string rdffn, AdminShell.AdministrationShellEnv env, AdminShell.Submodel sm, - AdminShell.SubmodelRef smref) - + public static void ImportInto( + string rdffn, Aas.Environment env, Aas.Submodel sm, + Aas.Reference smref) { thePackageEnv = new AdminShellNS.AdminShellPackageEnv(); List entity_subject = new List(); @@ -55,10 +56,10 @@ public static void ImportInto(string rdffn, AdminShell.AdministrationShellEnv en List properties_list = new List(); List properties_true_list = new List(); List property_set_list = new List(); - Entity entity = new Entity(); - SubmodelElementCollection set_property = new SubmodelElementCollection(); - SubmodelElementCollection et = new SubmodelElementCollection(); - SubmodelElementCollection entity_set = new SubmodelElementCollection(); + Aas.Entity entity = new Aas.Entity(Aas.EntityType.SelfManagedEntity); + Aas.SubmodelElementCollection set_property = new Aas.SubmodelElementCollection(); + Aas.SubmodelElementCollection et = new Aas.SubmodelElementCollection(); + Aas.SubmodelElementCollection entity_set = new Aas.SubmodelElementCollection(); // begin new (temporary) objects @@ -68,17 +69,15 @@ public static void ImportInto(string rdffn, AdminShell.AdministrationShellEnv en foreach (Triple t in g.Triples) { // Read the aspect name - entity.idShort = (t.Subject.ToString()); + entity.IdShort = (t.Subject.ToString()); if ((t.Object.ToString().Substring(t.Object.ToString().LastIndexOf("#") + 1)) == "Aspect") { obj_aspect.Name = (t.Subject.ToString().Substring(t.Subject.ToString().LastIndexOf("#") + 1)); - sm.idShort = obj_aspect.Name; + sm.IdShort = obj_aspect.Name; - var msemanticID = AdminShell.Key.CreateNew("GlobalReference", false, "IRI", t.Subject.ToString()); - AdminShellNS.AdminShellV20.SemanticId smid = - new AdminShellNS.AdminShellV20.SemanticId(msemanticID); - sm.semanticId = smid; + var msemanticID = ExtendReference.CreateFromKey(Aas.KeyTypes.GlobalReference, t.Subject.ToString()); + sm.SemanticId = msemanticID; thePackageEnv.AasEnv.Submodels.Add(sm); } } @@ -226,12 +225,10 @@ public static void ImportInto(string rdffn, AdminShell.AdministrationShellEnv en property_Name = (t.Object.ToString().Substring(t.Object.ToString().LastIndexOf("#") + 1)); Console.WriteLine(property_Name); } - AdminShell.Key msemanticID = AdminShell.Key.CreateNew( - "GlobalReference", false, "IRI", semantic); - set_property = AdminShell.SubmodelElementCollection.CreateNew( - property_Name, null, msemanticID); + var msemanticID = ExtendReference.CreateFromKey(Aas.KeyTypes.GlobalReference, semantic); + set_property = new Aas.SubmodelElementCollection( + idShort: property_Name, semanticId: msemanticID); sm.Add(set_property); - } } @@ -253,10 +250,9 @@ public static void ImportInto(string rdffn, AdminShell.AdministrationShellEnv en { string entity_set_idshort = (t.Object.ToString().Substring(t.Object.ToString().LastIndexOf("#") + 1)); - AdminShell.Key msemanticID = AdminShell.Key.CreateNew( - "GlobalReference", false, "IRI", semantic); - entity_set = AdminShell.SubmodelElementCollection.CreateNew( - entity_set_idshort, null, msemanticID); + var msemanticID = ExtendReference.CreateFromKey(Aas.KeyTypes.GlobalReference, semantic); + entity_set = new Aas.SubmodelElementCollection( + idShort: entity_set_idshort, semanticId: msemanticID); set_property.Add(entity_set); } @@ -378,26 +374,25 @@ public static void ImportInto(string rdffn, AdminShell.AdministrationShellEnv en } - using (var cd = AdminShell.ConceptDescription.CreateNew( - "" + property_Name, AdminShell.Identification.IRI, semantic)) { + var cd = new Aas.ConceptDescription(idShort: property_Name, id: semantic); env.ConceptDescriptions.Add(cd); cd.SetIEC61360Spec( preferredNames: new[] { "EN", property_PreferredName }, shortName: null, unit: null, - AdminShell.UnitId.CreateNew("GlobalReference", false, "IRI", unit_name), + unitId: ExtendReference.CreateFromKey(Aas.KeyTypes.GlobalReference, unit_name), valueFormat: null, dataType: "BOOLEAN", definition: new[] { "EN", property_Description } ); - AdminShell.Key msemanticID = AdminShell.Key.CreateNew("ConceptDescription", true, "IRI", semantic); - var mp = AdminShell.Property.CreateNew(property_Name, null, msemanticID); - mp.valueType = "string"; - mp.value = property_ExampleValue; + var msemanticID = ExtendReference.CreateFromKey(Aas.KeyTypes.ConceptDescription, semantic); + var mp = new Aas.Property( + Aas.DataTypeDefXsd.String, idShort: property_Name, semanticId: msemanticID); + mp.Value = property_ExampleValue; sm.Add(mp); } } @@ -407,16 +402,13 @@ public static void ImportInto(string rdffn, AdminShell.AdministrationShellEnv en foreach (var charc_prop in entity_property_char) { - AdminShell.Key msemanticID = AdminShell.Key.CreateNew("ConceptDescription", true, "IRI", smc_semantic); - et = AdminShell.SubmodelElementCollection.CreateNew(charc_prop, null, msemanticID); + var msemanticID = ExtendReference.CreateFromKey(Aas.KeyTypes.ConceptDescription, smc_semantic); + et = new Aas.SubmodelElementCollection(idShort: charc_prop, semanticId: msemanticID); sm.Add(et); } - - //SMC elements - foreach (string b in object_extract) { @@ -454,26 +446,24 @@ public static void ImportInto(string rdffn, AdminShell.AdministrationShellEnv en } } - using (var cd = AdminShell.ConceptDescription.CreateNew( - "" + name, AdminShell.Identification.IRI, semantic)) { + var cd = new Aas.ConceptDescription(idShort: "" + name, id: semantic); env.ConceptDescriptions.Add(cd); cd.SetIEC61360Spec( preferredNames: new[] { "EN", preferred_name }, shortName: null, unit: null, - AdminShell.UnitId.CreateNew("GlobalReference", false, "IRI", unit_name), + unitId: ExtendReference.CreateFromKey(Aas.KeyTypes.GlobalReference, unit_name), valueFormat: null, dataType: "BOOLEAN", definition: new[] { "EN", description } ); - - AdminShell.Key msemanticID = AdminShell.Key.CreateNew("ConceptDescription", true, "IRI", semantic); - var mp = AdminShell.Property.CreateNew(name, null, msemanticID); - mp.valueType = "string"; - mp.value = description; + var msemanticID = ExtendReference.CreateFromKey(Aas.KeyTypes.ConceptDescription, semantic); + var mp = new Aas.Property( + Aas.DataTypeDefXsd.String, idShort: name, semanticId: msemanticID); + mp.Value = description; et.Add(mp); } diff --git a/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj b/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj index 15fce9b90..d2095ce56 100644 --- a/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj +++ b/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj @@ -1,9 +1,10 @@  - net472 + net6.0-windows Library false 8 + false @@ -20,7 +21,7 @@ - - + + diff --git a/src/AasxCsharpLibrary.Tests/LICENSE.txt b/src/AasxCsharpLibrary.Tests/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxCsharpLibrary.Tests/LICENSE.txt +++ b/src/AasxCsharpLibrary.Tests/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxCsharpLibrary.Tests/app.config b/src/AasxCsharpLibrary.Tests/app.config deleted file mode 100644 index e936cc132..000000000 --- a/src/AasxCsharpLibrary.Tests/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/packages.config b/src/AasxCsharpLibrary.Tests/packages.config deleted file mode 100644 index 6e8e2e494..000000000 --- a/src/AasxCsharpLibrary.Tests/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs index bdf3ff31c..18999575b 100644 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs +++ b/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs @@ -32,7 +32,7 @@ namespace AasxCompatibilityModels // Utils // - public class AdminShellUtil + public class AdminShellUtilV10 { public static string EvalToNonNullString(string fmt, object o, string elseString = "") { @@ -1092,7 +1092,7 @@ public virtual string GetElementName() public string GetFriendlyName() { - return AdminShellUtil.FilterFriendlyName(this.idShort); + return AdminShellUtilV10.FilterFriendlyName(this.idShort); } public void CollectReferencesByParent(List refs) @@ -1171,8 +1171,8 @@ public void SetAdminstration(string version, string revision) public new string GetFriendlyName() { if (identification != null && identification.id != "") - return AdminShellUtil.FilterFriendlyName(this.identification.id); - return AdminShellUtil.FilterFriendlyName(this.idShort); + return AdminShellUtilV10.FilterFriendlyName(this.identification.id); + return AdminShellUtilV10.FilterFriendlyName(this.idShort); } } @@ -1291,7 +1291,7 @@ public override string GetElementName() public Tuple ToCaptionInfo() { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); if (administration != null) caption += "V" + administration.version + "." + administration.revision; @@ -1405,7 +1405,7 @@ public override string GetElementName() public Tuple ToCaptionInfo() { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", idShort, ""); + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); if (administration != null) caption += "V" + administration.version + "." + administration.revision; @@ -1540,7 +1540,7 @@ public override string GetElementName() public Tuple ToCaptionInfo() { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", idShort, ""); + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); var info = ""; if (this.semanticId != null) info = Key.KeyListToString(this.semanticId.Keys); @@ -2734,10 +2734,10 @@ public Reference GetReference() public Tuple ToCaptionInfo() { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", idShort, ""); + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); var info = ""; if (semanticId != null) - info = AdminShellUtil.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); + info = AdminShellUtilV10.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); return Tuple.Create(caption, info); } @@ -3087,7 +3087,7 @@ public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) public Tuple ToCaptionInfo() { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", idShort, ""); + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); if (administration != null) caption += "V" + administration.version + "." + administration.revision; var info = ""; @@ -3910,7 +3910,7 @@ public bool Load(string fn) { throw (new Exception( string.Format("While reading AAS {0} at {1} gave: {2}", fn, - AdminShellUtil.ShortLocation(ex), ex.Message))); + AdminShellUtilV10.ShortLocation(ex), ex.Message))); } return true; } @@ -3933,7 +3933,7 @@ public bool Load(string fn) { throw (new Exception( string.Format("While reading AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); } return true; } @@ -4007,14 +4007,14 @@ public bool Load(string fn) { throw (new Exception( string.Format("While reading AAS {0} spec at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); } } catch (Exception ex) { throw (new Exception( string.Format("While reading AASX {0} at {1} gave: {2}", fn, - AdminShellUtil.ShortLocation(ex), ex.Message))); + AdminShellUtilV10.ShortLocation(ex), ex.Message))); } return true; } @@ -4040,7 +4040,7 @@ public bool LoadFromAasEnvString(string content) { throw (new Exception( string.Format("While reading AASENV string {0} gave: {1}", - AdminShellUtil.ShortLocation(ex), ex.Message))); + AdminShellUtilV10.ShortLocation(ex), ex.Message))); } return true; } @@ -4071,7 +4071,7 @@ public bool SaveAs(string fn, bool writeFreshly = false, PreferredFormat prefFmt { throw (new Exception( string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); } return true; } @@ -4103,7 +4103,7 @@ public bool SaveAs(string fn, bool writeFreshly = false, PreferredFormat prefFmt { throw (new Exception( string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); } return true; } @@ -4374,7 +4374,7 @@ public bool SaveAs(string fn, bool writeFreshly = false, PreferredFormat prefFmt { throw (new Exception( string.Format("While write AASX {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); } return true; } diff --git a/src/AasxCsharpLibrary/AdminShell.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs similarity index 99% rename from src/AasxCsharpLibrary/AdminShell.cs rename to src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs index fc52be133..5aa491279 100644 --- a/src/AasxCsharpLibrary/AdminShell.cs +++ b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs @@ -21,10 +21,13 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Text.RegularExpressions; using System.Xml; using System.Xml.Serialization; +using AdminShell_V20; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -namespace AdminShellNS +//namespace AdminShellNS +//namespace AdminShell_V20 +namespace AasxCompatibilityModels { /// /// This empty class derives always from the current version of the Administration Shell class hierarchy. @@ -562,8 +565,8 @@ public static AasValidationAction Validate(AasValidationRecordList results, Key else { // check IdType - var idf = AdminShellUtil.CheckIfInConstantStringArray(IdentifierTypeNames, k.idType); - if (idf == AdminShellUtil.ConstantFoundEnum.No) + var idf = AdminShellUtilV20.CheckIfInConstantStringArray(IdentifierTypeNames, k.idType); + if (idf == AdminShellUtilV20.ConstantFoundEnum.No) // violation case results.Add(new AasValidationRecord( AasValidationSeverity.SchemaViolation, container, @@ -572,20 +575,20 @@ public static AasValidationAction Validate(AasValidationRecordList results, Key { k.idType = Custom; })); - if (idf == AdminShellUtil.ConstantFoundEnum.AnyCase) + if (idf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) // violation case results.Add(new AasValidationRecord( AasValidationSeverity.SchemaViolation, container, "Key: idType in wrong casing", () => { - k.idType = AdminShellUtil.CorrectCasingForConstantStringArray( + k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( IdentifierTypeNames, k.idType); })); // check type - var tf = AdminShellUtil.CheckIfInConstantStringArray(KeyElements, k.type); - if (tf == AdminShellUtil.ConstantFoundEnum.No) + var tf = AdminShellUtilV20.CheckIfInConstantStringArray(KeyElements, k.type); + if (tf == AdminShellUtilV20.ConstantFoundEnum.No) // violation case results.Add(new AasValidationRecord( AasValidationSeverity.SchemaViolation, container, @@ -594,14 +597,14 @@ public static AasValidationAction Validate(AasValidationRecordList results, Key { k.type = GlobalReference; })); - if (tf == AdminShellUtil.ConstantFoundEnum.AnyCase) + if (tf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) // violation case results.Add(new AasValidationRecord( AasValidationSeverity.SchemaViolation, container, "Key: type in wrong casing", () => { - k.idType = AdminShellUtil.CorrectCasingForConstantStringArray( + k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( KeyElements, k.type); })); } @@ -2263,7 +2266,7 @@ public virtual string GetElementName() public string GetFriendlyName() { - return AdminShellUtil.FilterFriendlyName(this.idShort); + return AdminShellUtilV20.FilterFriendlyName(this.idShort); } public virtual Reference GetReference(bool includeParents = true) @@ -2603,8 +2606,8 @@ public void SetAdminstration(string version, string revision) public new string GetFriendlyName() { if (identification != null && identification.id != "") - return AdminShellUtil.FilterFriendlyName(this.identification.id); - return AdminShellUtil.FilterFriendlyName(this.idShort); + return AdminShellUtilV20.FilterFriendlyName(this.identification.id); + return AdminShellUtilV20.FilterFriendlyName(this.idShort); } public override string ToString() @@ -2813,7 +2816,7 @@ public override AasElementSelfDescription GetSelfDescription() public Tuple ToCaptionInfo() { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); if (administration != null) caption += "V" + administration.version + "." + administration.revision; @@ -2988,7 +2991,7 @@ public override AasElementSelfDescription GetSelfDescription() public Tuple ToCaptionInfo() { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", idShort, ""); + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); if (administration != null) caption += "V" + administration.version + "." + administration.revision; @@ -3157,7 +3160,7 @@ public override AasElementSelfDescription GetSelfDescription() public Tuple ToCaptionInfo() { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", idShort, ""); + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); var info = ""; if (this.semanticId != null) info = Key.KeyListToString(this.semanticId.Keys); @@ -3601,7 +3604,7 @@ public void Validate(AasValidationRecordList results, ConceptDescription cd) () => { this.preferredName = new AdminShell.LangStringSetIEC61360("EN?", - AdminShellUtil.EvalToNonEmptyString("{0}", cd.idShort, "UNKNOWN")); + AdminShellUtilV20.EvalToNonEmptyString("{0}", cd.idShort, "UNKNOWN")); })); if (this.shortName != null && this.shortName.Count < 1) @@ -5783,12 +5786,12 @@ public IEnumerable FindAllParentsWithSemanticId( public Tuple ToCaptionInfo() { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", idShort, ""); + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); var info = ""; // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change // display presentation .. therefore to be checked again if (semanticId != null) - AdminShellUtil.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); + AdminShellUtilV20.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); return Tuple.Create(caption, info); } @@ -7123,7 +7126,7 @@ public IEnumerable FindDeep(Predicate match = null) where T : SubmodelE public Tuple ToCaptionInfo() { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", idShort, ""); + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); if (administration != null) caption += "V" + administration.version + "." + administration.revision; var info = ""; diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs new file mode 100644 index 000000000..3581980d4 --- /dev/null +++ b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs @@ -0,0 +1,174 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using AasxCompatibilityModels; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; + +//namespace AdminShellNS +namespace AdminShell_V20 +{ + public static class AdminShellConverters + { + /// + /// This converter is used for reading JSON files; it claims to be responsible for + /// "Referable" (the base class) + /// and decides, which sub-class of the base class shall be populated. + /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory + /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), + /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) + /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having + /// "modelType" being a class property with a contained property "name". + /// + public class JsonAasxConverter : JsonConverter + { + private string UpperClassProperty = "modelType"; + private string LowerClassProperty = "name"; + + public JsonAasxConverter() : base() + { + } + + public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() + { + this.UpperClassProperty = UpperClassProperty; + this.LowerClassProperty = LowerClassProperty; + } + + public override bool CanConvert(Type objectType) + { + // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable + if (typeof(AdminShell.Referable).IsAssignableFrom(objectType)) + return true; + return false; + } + + public override bool CanWrite + { + get { return false; } + } + + public override object ReadJson(JsonReader reader, + Type objectType, + object existingValue, + JsonSerializer serializer) + { + // Load JObject from stream + JObject jObject = JObject.Load(reader); + + // Create target object based on JObject + object target = new AdminShell.Referable(); + + if (jObject.ContainsKey(UpperClassProperty)) + { + var j2 = jObject[UpperClassProperty]; + if (j2 != null) + foreach (var c in j2.Children()) + { + var cprop = c as Newtonsoft.Json.Linq.JProperty; + if (cprop == null) + continue; + if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") + { + var cpval = cprop.Value.ToObject(); + if (cpval == null) + continue; + // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... + var o = AdminShell.Referable.CreateAdequateType(cpval); + if (o != null) + target = o; + } + } + } + + // Populate the object properties + serializer.Populate(jObject.CreateReader(), target); + + return target; + } + + /// + /// Introduced for JSON serialization, can create Referables based on a string name + /// + /// string name (standard PascalCased) + + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + + /// + /// This converter / contract resolver for Json.NET adaptively filters different levels of depth + /// of nested AASX structures. + /// + public class AdaptiveFilterContractResolver : DefaultContractResolver + { + public bool AasHasViews = true; + public bool BlobHasValue = true; + public bool SubmodelHasElements = true; + public bool SmcHasValue = true; + public bool OpHasVariables = true; + + public AdaptiveFilterContractResolver() { } + + public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) + { + if (!deep) + { + this.SubmodelHasElements = false; + this.SmcHasValue = false; + this.OpHasVariables = false; + } + if (!complete) + { + this.AasHasViews = false; + this.BlobHasValue = false; + } + + } + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + JsonProperty property = base.CreateProperty(member, memberSerialization); + + if (!BlobHasValue && property.DeclaringType == typeof(AdminShell.Blob) && + property.PropertyName == "value") + property.ShouldSerialize = instance => { return false; }; + + if (!SubmodelHasElements && property.DeclaringType == typeof(AdminShell.Submodel) && + property.PropertyName == "submodelElements") + property.ShouldSerialize = instance => { return false; }; + + if (!SmcHasValue && property.DeclaringType == typeof(AdminShell.SubmodelElementCollection) && + property.PropertyName == "value") + property.ShouldSerialize = instance => { return false; }; + + if (!OpHasVariables && property.DeclaringType == typeof(AdminShell.Operation) && + (property.PropertyName == "in" || property.PropertyName == "out")) + property.ShouldSerialize = instance => { return false; }; + + if (!AasHasViews && property.DeclaringType == typeof(AdminShell.AdministrationShell) && + property.PropertyName == "views") + property.ShouldSerialize = instance => { return false; }; + + return property; + } + } + + } +} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs new file mode 100644 index 000000000..81b80b9c5 --- /dev/null +++ b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs @@ -0,0 +1,636 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using AasxCompatibilityModels; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +//namespace AdminShellNS +namespace AdminShell_V20 +{ + public static class AdminShellUtilV20 + { + public static string EvalToNonNullString(string fmt, object o, string elseString = "") + { + if (o == null) + return elseString; + return string.Format(fmt, o); + } + + public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") + { + if (o == null || o == "") + return elseString; + return string.Format(fmt, o); + } + + /// Creates a filter-friendly name from the source. + /// + /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); + /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); + /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); + /// + public static string FilterFriendlyName(string src) + { + if (src == null) + return null; + return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); + } + + /// + /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); + /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); + /// + public static bool HasWhitespace(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + foreach (var s in src) + if (char.IsWhiteSpace(s)) + return true; + return false; + } + + /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); + public static bool ComplyIdShort(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + var res = true; + foreach (var s in src) + if (!Char.IsLetterOrDigit(s) && s != '_') + res = false; + if (src.Length > 0 && !Char.IsLetter(src[0])) + res = false; + return res; + } + + public static string ByteSizeHumanReadable(long len) + { + // see: https://stackoverflow.com/questions/281640/ + // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net + string[] sizes = { "B", "KB", "MB", "GB", "TB" }; + int order = 0; + while (len >= 1024 && order < sizes.Length - 1) + { + order++; + len = len / 1024; + } + // Adjust the format string to your preferences. For example "{0:0.#}{1}" would + // show a single decimal place, and no space. + string res = String.Format("{0:0.##} {1}", len, sizes[order]); + return res; + } + + public static string ExtractPascalCasingLetters(string src) + { + // access + src = src?.Trim(); + if (src == null || src.Length < 1) + return null; + + // walk through + var res = ""; + var arm = true; + foreach (var c in src) + { + // take? + if (arm && Char.IsUpper(c)) + res += c; + // state for next iteration + arm = !Char.IsUpper(c); + } + + // result + return res; + } + + public static int CountHeadingSpaces(string line) + { + if (line == null) + return 0; + int j; + for (j = 0; j < line.Length; j++) + if (!Char.IsWhiteSpace(line[j])) + break; + return j; + } + + /// + /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; + /// + public static string[] CleanHereStringToArray(string here) + { + if (here == null) + return null; + + // convert all weird breaks to pure new lines + here = here.Replace("\r\n", "\n"); + here = here.Replace("\n\r", "\n"); + + // convert all tabs to spaces + here = here.Replace("\t", " "); + + // split these + var lines = new List(here.Split('\n')); + if (lines.Count < 1) + return lines.ToArray(); + + // the first line could be special + string firstLine = null; + if (lines[0].Trim() != "") + { + firstLine = lines[0].Trim(); + lines.RemoveAt(0); + } + + // detect an constant amount of heading spaces + var headSpaces = int.MaxValue; + foreach (var line in lines) + if (line.Trim() != "") + headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); + + // multi line trim possible? + if (headSpaces != int.MaxValue && headSpaces > 0) + for (int i = 0; i < lines.Count; i++) + if (lines[i].Length > headSpaces) + lines[i] = lines[i].Substring(headSpaces); + + // re-compose again + if (firstLine != null) + lines.Insert(0, firstLine); + + // return + return lines.ToArray(); + } + + /// + /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; + /// + public static string CleanHereStringWithNewlines(string here, string nl = null) + { + if (nl == null) + nl = Environment.NewLine; + var lines = CleanHereStringToArray(here); + if (lines == null) + return null; + return String.Join(nl, lines); + } + + public static string ShortLocation(Exception ex) + { + if (ex == null || ex.StackTrace == null) + return ""; + string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + if (lines.Length < 1) + return ""; + // search for " in " + // as the most actual stacktrace might be a built-in function, this might not work and therefore + // go down in the stack + int currLine = 0; + while (true) + { + // nothing found at all + if (currLine >= lines.Length) + return ""; + // access current line + /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages + always as English. */ + var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); + if (p < 0) + p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // search last "\" or "/", to get only filename portion and position + p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // return this + return lines[currLine].Substring(p); + } + } + + public enum ConstantFoundEnum { No, AnyCase, ExactCase } + + public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) + { + if (arr == null || str == null) + return ConstantFoundEnum.No; + + bool anyCaseFound = false; + bool exactCaseFound = false; + foreach (var a in arr) + { + anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); + exactCaseFound = exactCaseFound || str == a; + } + if (exactCaseFound) + return ConstantFoundEnum.ExactCase; + if (anyCaseFound) + return ConstantFoundEnum.AnyCase; + return ConstantFoundEnum.No; + } + + public static string CorrectCasingForConstantStringArray(string[] arr, string str) + { + if (arr == null || str == null) + return str; + + foreach (var a in arr) + if (str.ToLower() == a.ToLower()) + return a; + + return str; + } + + // + // + // + // + // + + public static void PrintSearchableProperties(object obj, int indent) + { + if (obj == null) return; + string indentString = new string(' ', indent); + Type objType = obj.GetType(); + PropertyInfo[] properties = objType.GetProperties(); + foreach (PropertyInfo property in properties) + { + object propValue = property.GetValue(obj, null); + var elems = propValue as IList; + if (elems != null) + { + foreach (var item in elems) + { + PrintSearchableProperties(item, indent + 3); + } + } + else + { + // This will not cut-off System.Collections because of the first check + if (property.PropertyType.Assembly == objType.Assembly) + { + Console.WriteLine("{0}{1}:", indentString, property.Name); + + PrintSearchableProperties(propValue, indent + 2); + } + else + { + Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue); + } + } + } + } + + public class SearchOptions + { + public Assembly[] allowedAssemblies = null; + public int maxDepth = int.MaxValue; + public bool findFirst = false; + public int skipFirstResults = 0; + public string findText = null; + public bool isIgnoreCase = false; + public bool isRegex = false; + } + + public class SearchResultItem : IEquatable + { + public SearchOptions searchOptions; + public string qualifiedNameHead; + public string metaModelName; + public object businessObject; + public string foundText; + public object foundObject; + public object containingObject; + public int foundHash; + + public bool Equals(SearchResultItem other) + { + if (other == null) + return false; + + return this.qualifiedNameHead == other.qualifiedNameHead && + this.metaModelName == other.metaModelName && + this.businessObject == other.businessObject && + this.containingObject == other.containingObject && + this.foundText == other.foundText && + this.foundHash == other.foundHash; + } + } + + public class SearchResults + { + public int foundIndex = 0; + public List foundResults = new List(); + + public void Clear() + { + foundIndex = -1; + foundResults.Clear(); + } + } + + public static void CheckSearchable( + SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, + MemberInfo mi, object memberValue, object containingObject, Func getMemberHash) + { + // try get a speaking name + var metaModelName = ""; + var x1 = mi.GetCustomAttribute(); + if (x1 != null && x1.name != null) + metaModelName = x1.name; + + // check if this object is searchable + var x2 = mi.GetCustomAttribute(); + if (x2 != null) + { + // what to check? + string foundText = "" + memberValue?.ToString(); + + // find options + var found = true; + if (options.findText != null) + found = foundText.IndexOf( + options.findText, options.isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; + + // add? + if (found) + { + var sri = new SearchResultItem(); + sri.searchOptions = options; + sri.qualifiedNameHead = qualifiedNameHead; + sri.metaModelName = metaModelName; + sri.businessObject = businessObject; + sri.foundText = foundText; + sri.foundObject = memberValue; + sri.containingObject = containingObject; + if (getMemberHash != null) + sri.foundHash = getMemberHash(); + + // avoid duplicates + if (!results.foundResults.Contains(sri)) + results.foundResults.Add(sri); + } + } + } + + public static void EnumerateSearchable( + SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, + object businessObject = null) + { + // access + if (results == null || obj == null || options == null) + return; + Type objType = obj.GetType(); + + // depth + if (depth > options.maxDepth) + return; + + // try to get element name of an AAS entity + string elName = null; + if (obj is AdminShell.Referable) + { + elName = (obj as AdminShell.Referable).GetElementName(); + businessObject = obj; + } + + // enrich qualified name, accordingly + var qualifiedName = qualifiedNameHead; + if (elName != null) + qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; + + // do NOT dive into objects, which are not in the reight assembly + if (options.allowedAssemblies == null || !options.allowedAssemblies.Contains(objType.Assembly)) + return; + + // do not dive into enums + if (objType.IsEnum) + return; + + // look at fields, first + var fields = objType.GetFields(); + foreach (var fi in fields) + { + // is the object marked to be skipped? + var x3 = fi.GetCustomAttribute(); + if (x3 != null) + continue; + + var x4 = fi.GetCustomAttribute(); + if (x4 != null) + continue; + + // get value(s) + var fieldValue = fi.GetValue(obj); + if (fieldValue == null) + continue; + var valueElems = fieldValue as IList; + if (valueElems != null) + { + // field is a collection .. dive deeper, if allowed + foreach (var el in valueElems) + EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, fi, fieldValue, obj, + () => { return fieldValue.GetHashCode(); }); + + // dive deeper .. + EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject); + } + } + + // properties & objects behind + var properties = objType.GetProperties(); + foreach (var pi in properties) + { + var gip = pi.GetIndexParameters(); + if (gip.Length > 0) + // no indexed properties, yet + continue; + + // is the object marked to be skipped? + var x3 = pi.GetCustomAttribute(); + if (x3 != null) + continue; + + var x4 = pi.GetCustomAttribute(); + if (x4 != null) + continue; + + // get value(s) + var propValue = pi.GetValue(obj, null); + if (propValue == null) + continue; + var valueElems = propValue as IList; + if (valueElems != null) + { + // property is a collection .. dive deeper, if allowed + foreach (var el in valueElems) + EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, pi, propValue, obj, + () => { return propValue.GetHashCode(); }); + + // dive deeper .. + EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject); + } + } + } + + // + // String manipulations + // + + public static string ReplacePercentPlaceholder( + string input, + string searchFor, + Func substLamda, + StringComparison comparisonType = StringComparison.InvariantCulture) + { + // access + if (input == null || searchFor == null || searchFor == "") + return input; + + // find + while (true) + { + // any occurence + var p = input.IndexOf(searchFor, comparisonType); + if (p < 0) + break; + + // split + var left = input.Substring(0, p); + var right = ""; + var rp = p + searchFor.Length; + if (rp < input.Length) + right = input.Substring(rp); + + // lambda + var repl = "" + substLamda?.Invoke(); + + // build new + input = left + repl + right; + } + + // ok + return input; + } + + // + // Base 64 + // + + public static string Base64Encode(string plainText) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return System.Convert.ToBase64String(plainTextBytes); + } + + public static string Base64Decode(string base64EncodedData) + { + var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); + return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); + } + + // + // Generation of Ids + // + + private static Random MyRnd = new Random(); + + public static string GenerateIdAccordingTemplate(string tpl) + { + // generate a deterministic decimal digit string + var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); + decimals = new string(decimals.Reverse().ToArray()); + // convert this to an int + if (!Int64.TryParse(decimals, out Int64 decii)) + decii = MyRnd.Next(Int32.MaxValue); + // make an hex out of this + string hexamals = decii.ToString("X"); + // make an alphanumeric string out of this + string alphamals = ""; + var dii = decii; + while (dii >= 1) + { + var m = dii % 26; + alphamals += Convert.ToChar(65 + m); + dii = dii / 26; + } + + // now, "salt" the strings + for (int i = 0; i < 32; i++) + { + var c = Convert.ToChar(48 + MyRnd.Next(10)); + decimals += c; + hexamals += c; + alphamals += c; + } + + // now, can just use the template + var id = ""; + foreach (var tpli in tpl) + { + if (tpli == 'D' && decimals.Length > 0) + { + id += decimals[0]; + decimals = decimals.Remove(0, 1); + } + else + if (tpli == 'X' && hexamals.Length > 0) + { + id += hexamals[0]; + hexamals = hexamals.Remove(0, 1); + } + else + if (tpli == 'A' && alphamals.Length > 0) + { + id += alphamals[0]; + alphamals = alphamals.Remove(0, 1); + } + else + id += tpli; + } + + // ok + return id; + } + + } +} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs new file mode 100644 index 000000000..524683e57 --- /dev/null +++ b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs @@ -0,0 +1,326 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.Design; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Schema; +using JetBrains.Annotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Schema; + +//namespace AdminShellNS +namespace AdminShell_V20 +{ + /// + /// validates the XML content against the AASX XML schema. + /// + /// Please produce instances with . + /// + public class XmlValidator + { + private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; + + internal XmlValidator(XmlSchemaSet xmlSchemaSet) + { + this.xmlSchemaSet = xmlSchemaSet; + } + + /// + /// validates the given XML content and stores the results in the . + /// + /// Validation records + /// Content to be validated + public void Validate(AasValidationRecordList recs, Stream xmlContent) + { + if (recs == null) + throw new ArgumentException($"Unexpected null {nameof(recs)}"); + + if (xmlContent == null) + throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); + + // load/ validate on same records + var settings = new System.Xml.XmlReaderSettings(); + settings.ValidationType = System.Xml.ValidationType.Schema; + settings.Schemas = xmlSchemaSet; + + settings.ValidationEventHandler += + (object sender, System.Xml.Schema.ValidationEventArgs e) => + { + recs.Add( + new AasValidationRecord( + AasValidationSeverity.Serialization, null, + $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); + }; + + // use the xml stream + using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) + { + while (reader.Read()) + { + // Invoke callbacks + }; + } + } + } + + public enum AasValidationSeverity + { + Hint, Warning, SpecViolation, SchemaViolation, Serialization + } + + [UsedImplicitlyAttribute] // for eventual use + public enum AasValidationAction + { + No, ToBeDeleted + } + + public class AasValidationRecord + { + public AasValidationSeverity Severity = AasValidationSeverity.Hint; + public AasxCompatibilityModels.AdminShellV20.Referable Source = null; + public string Message = ""; + + public Action Fix = null; + + public AasValidationRecord(AasValidationSeverity Severity, AasxCompatibilityModels.AdminShellV20.Referable Source, + string Message, Action Fix = null) + { + this.Severity = Severity; + this.Source = Source; + this.Message = Message; + this.Fix = Fix; + } + + public override string ToString() + { + return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; + } + + public string DisplaySeverity { get { return "" + Severity.ToString(); } } + public string DisplaySource + { + get + { + return "" + ((Source != null) ? Source.ToString() : "(whole content)"); + } + } + public string DisplayMessage { get { return "" + Message?.ToString(); } } + } + + public class AasValidationRecordList : List + { + } + + public static class AasSchemaValidation + { + public enum SerializationFormat { XML, JSON } + + public static string[] GetSchemaResources(SerializationFormat fmt) + { + if (fmt == SerializationFormat.XML) + { + return new[] + { + "AdminShellNS.Resources.schemaV201.AAS.xsd", + "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", + "AdminShellNS.Resources.schemaV201.IEC61360.xsd" + }; + } + if (fmt == SerializationFormat.JSON) + { + return new[] + { + "AdminShellNS.Resources.schemaV201.aas.json" + }; + } + return null; + } + + /// + /// produces a validator which validates XML AASX files. + /// + /// initialized validator + public static XmlValidator NewXmlValidator() + { + // Load the schema files + var files = GetSchemaResources(SerializationFormat.XML); + if (files == null) + throw new InvalidOperationException("No XML schema files could be found in the resources."); + + var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); + xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); + + try + { + Assembly myAssembly = Assembly.GetExecutingAssembly(); + foreach (var schemaFn in files) + { + using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) + { + using (XmlReader schemaReader = XmlReader.Create(schemaStream)) + { + xmlSchemaSet.Add(null, schemaReader); + } + } + } + } + catch (Exception ex) + { + throw new FileNotFoundException( + $"Error accessing embedded resource schema files: {ex.Message}"); + } + + var newRecs = new AasValidationRecordList(); + + // set up messages + xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => + { + newRecs.Add( + new AasValidationRecord( + AasValidationSeverity.Serialization, null, + $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); + }; + + // compile + try + { + xmlSchemaSet.Compile(); + } + catch (Exception ex) + { + throw new InvalidOperationException( + $"Error compiling schema files: {ex.Message}"); + } + + if (newRecs.Count > 0) + { + var parts = new List { $"Failed to compile the schema files:" }; + parts.AddRange(newRecs.Select((r) => r.Message)); + throw new InvalidOperationException(string.Join(Environment.NewLine, parts)); + } + + return new XmlValidator(xmlSchemaSet); + } + + /// + /// creates an XML validator and applies it on the given content. + /// + /// If you repeatedly need to validate XML against a schema, re-use an instance of + /// produced with . + /// + /// Validation records + /// Content to be validated + public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) + { + var validator = NewXmlValidator(); + validator.Validate(recs, xmlContent); + } + + public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) + { + // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator + var newRecs = new AasValidationRecordList(); + + // access + if (recs == null || jsonContent == null) + return -1; + + // Load the schema files + // right now: exactly ONE schema file + var files = GetSchemaResources(SerializationFormat.JSON); + if (files == null || files.Length != 1) + return -1; + + NJsonSchema.JsonSchema schema = null; + + try + { + Assembly myAssembly = Assembly.GetExecutingAssembly(); + foreach (var schemaFn in files) + { + using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) + { + using (var streamReader = new StreamReader(schemaStream)) + { + var allTxt = streamReader.ReadToEnd(); + schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); + break; + } + } + } + } + catch (Exception ex) + { + throw new FileNotFoundException("ValidateJSON: Error loading schema: " + + ex.Message); + } + + if (schema == null) + { + throw new FileNotFoundException("ValidateJSON: Schema not found properly."); + } + + // create validator + var validator = new NJsonSchema.Validation.JsonSchemaValidator(); + + // load the JSON content + string jsonTxt = null; + try + { + using (var streamReader = new StreamReader(jsonContent)) + { + jsonTxt = streamReader.ReadToEnd(); + } + } + catch (Exception ex) + { + throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + + ex.Message); + } + + if (jsonTxt == null || jsonTxt == "") + throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); + + // validate + ICollection errors; + try + { + errors = validator.Validate(jsonTxt, schema); + } + catch (Exception ex) + { + throw new InvalidOperationException("ValidateJSON: Error when validating: " + + ex.Message); + } + + // re-format messages + if (errors != null) + foreach (var ve in errors) + { + var msg = ("" + ve.ToString()); + msg = Regex.Replace(msg, @"\s+", " "); + newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, + $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); + } + + // result + recs.AddRange(newRecs); + return newRecs.Count; + } + } +} diff --git a/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj b/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj index 9ab1f0812..fc2cc8dec 100644 --- a/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj +++ b/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj @@ -1,6 +1,6 @@  - netstandard2.0 + net6.0 Library AdminShellNS false @@ -8,6 +8,9 @@ TRACE;UseAasxCompatibilityModels + + false + PreserveNewest @@ -29,13 +32,14 @@ - - - - - - - - + + + + + + + + + diff --git a/src/AasxCsharpLibrary/AdminShellCollections.cs b/src/AasxCsharpLibrary/AdminShellCollections.cs index 3da038ead..26fc3f837 100644 --- a/src/AasxCsharpLibrary/AdminShellCollections.cs +++ b/src/AasxCsharpLibrary/AdminShellCollections.cs @@ -38,4 +38,29 @@ public IEnumerable> Keys } } } + + public class DoubleSidedDict + { + private Dictionary _forward = new Dictionary(); + private Dictionary _backward = new Dictionary(); + + public void AddPair(T1 item1, T2 item2) + { + _forward.Add(item1, item2); + _backward.Add(item2, item1); + } + + public bool Contains1(T1 key1) => _forward.ContainsKey(key1); + public bool Contains2(T2 key2) => _backward.ContainsKey(key2); + + public T2 Get2(T1 key1) => _forward[key1]; + public T1 Get1(T2 key2) => _backward[key2]; + + public T2 Get2OrDefault(T1 key1) + => (key1 != null && _forward.ContainsKey(key1)) ? _forward[key1] : default(T2); + public T1 Get1OrDefault(T2 key2) + => (key2 != null && _backward.ContainsKey(key2)) ? _backward[key2] : default(T1); + + public void Clear() { _forward.Clear(); _backward.Clear(); } + } } diff --git a/src/AasxCsharpLibrary/AdminShellConverters.cs b/src/AasxCsharpLibrary/AdminShellConverters.cs index 0d801d681..9d36f4db9 100644 --- a/src/AasxCsharpLibrary/AdminShellConverters.cs +++ b/src/AasxCsharpLibrary/AdminShellConverters.cs @@ -13,6 +13,7 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Reflection; using System.Text; using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; @@ -26,7 +27,7 @@ public static class AdminShellConverters /// "Referable" (the base class) /// and decides, which sub-class of the base class shall be populated. /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory - /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), + /// SubmodelElementWrapper.CreateAdequateType(), /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having /// "modelType" being a class property with a contained property "name". @@ -49,7 +50,7 @@ public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : public override bool CanConvert(Type objectType) { // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable - if (typeof(AdminShell.Referable).IsAssignableFrom(objectType)) + if (typeof(IReferable).IsAssignableFrom(objectType)) return true; return false; } @@ -68,7 +69,7 @@ public override object ReadJson(JsonReader reader, JObject jObject = JObject.Load(reader); // Create target object based on JObject - object target = new AdminShell.Referable(); + IReferable target = null; if (jObject.ContainsKey(UpperClassProperty)) { @@ -85,7 +86,7 @@ public override object ReadJson(JsonReader reader, if (cpval == null) continue; // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... - var o = AdminShell.Referable.CreateAdequateType(cpval); + var o = CreateAdequateType(cpval); if (o != null) target = o; } @@ -98,6 +99,33 @@ public override object ReadJson(JsonReader reader, return target; } + public static IReferable CreateAdequateType(string elementName) + { + if (elementName == KeyTypes.AssetAdministrationShell.ToString()) + return new AssetAdministrationShell("", null); + //TODO (jtikekar, 0000-00-00): refactor default + //if (elementName == "Asset") + //TODO (jtikekar, 0000-00-00): Change + // return new AssetInformation(AssetKind.Instance); + if (elementName == KeyTypes.ConceptDescription.ToString()) + return new ConceptDescription(""); + if (elementName == KeyTypes.Submodel.ToString()) + return new Submodel(""); + //if (elementName == KeyTypes.View) + // return new View(); + return CreateSubmodelElementIstance(elementName); + } + + private static ISubmodelElement CreateSubmodelElementIstance(string typeName) + { + //TODO (jtikekar, 0000-00-00): Need to test + Type type = Type.GetType(typeName); + if (type == null || !type.IsSubclassOf(typeof(ISubmodelElement))) + return null; + var sme = Activator.CreateInstance(type) as ISubmodelElement; + return sme; + } + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); @@ -138,23 +166,23 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ { JsonProperty property = base.CreateProperty(member, memberSerialization); - if (!BlobHasValue && property.DeclaringType == typeof(AdminShell.Blob) && + if (!BlobHasValue && property.DeclaringType == typeof(Blob) && property.PropertyName == "value") property.ShouldSerialize = instance => { return false; }; - if (!SubmodelHasElements && property.DeclaringType == typeof(AdminShell.Submodel) && + if (!SubmodelHasElements && property.DeclaringType == typeof(Submodel) && property.PropertyName == "submodelElements") property.ShouldSerialize = instance => { return false; }; - if (!SmcHasValue && property.DeclaringType == typeof(AdminShell.SubmodelElementCollection) && + if (!SmcHasValue && property.DeclaringType == typeof(SubmodelElementCollection) && property.PropertyName == "value") property.ShouldSerialize = instance => { return false; }; - if (!OpHasVariables && property.DeclaringType == typeof(AdminShell.Operation) && + if (!OpHasVariables && property.DeclaringType == typeof(Operation) && (property.PropertyName == "in" || property.PropertyName == "out")) property.ShouldSerialize = instance => { return false; }; - if (!AasHasViews && property.DeclaringType == typeof(AdminShell.AdministrationShell) && + if (!AasHasViews && property.DeclaringType == typeof(AssetAdministrationShell) && property.PropertyName == "views") property.ShouldSerialize = instance => { return false; }; diff --git a/src/AasxCsharpLibrary/AdminShellPackageEnv.cs b/src/AasxCsharpLibrary/AdminShellPackageEnv.cs index d75344d1f..2042682d1 100644 --- a/src/AasxCsharpLibrary/AdminShellPackageEnv.cs +++ b/src/AasxCsharpLibrary/AdminShellPackageEnv.cs @@ -1,1375 +1,1454 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Packaging; -using System.Linq; -using System.Text.RegularExpressions; -using System.Xml.Serialization; -using AdminShellNS; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace AdminShellNS -{ - /// - /// This class lets an outer functionality keep track on the supplementary files, which are in or - /// are pending to be added or deleted to an Package. - /// - public class AdminShellPackageSupplementaryFile : AdminShell.Referable - { - public delegate byte[] SourceGetByteChunk(); - - public enum LocationType { InPackage, AddPending, DeletePending } - - public enum SpecialHandlingType { None, EmbedAsThumbnail } - - public readonly Uri Uri = null; - - public readonly string UseMimeType = null; - - public readonly string SourceLocalPath = null; - public readonly SourceGetByteChunk SourceGetBytesDel = null; - - public LocationType Location; - public readonly SpecialHandlingType SpecialHandling; - - public AdminShellPackageSupplementaryFile( - Uri uri, string sourceLocalPath = null, LocationType location = LocationType.InPackage, - SpecialHandlingType specialHandling = SpecialHandlingType.None, - SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - Uri = uri; - UseMimeType = useMimeType; - SourceLocalPath = sourceLocalPath; - SourceGetBytesDel = sourceGetBytesDel; - Location = location; - SpecialHandling = specialHandling; - } - - // class derives from Referable in order to provide GetElementName - public override string GetElementName() - { - return "File"; - } - - } - - public class ListOfAasSupplementaryFile : List - { - public AdminShellPackageSupplementaryFile FindByUri(string path) - { - if (path == null) - return null; - - return this.FirstOrDefault( - x => x?.Uri?.ToString().Trim() == path.Trim()); - } - } - - /// - /// Provides (static?) helpers for serializing AAS.. - /// - public static class AdminShellSerializationHelper - { - - public static string TryReadXmlFirstElementNamespaceURI(Stream s) - { - string res = null; - try - { - var xr = System.Xml.XmlReader.Create(s); - int i = 0; - while (xr.Read()) - { - // limit amount of read - i++; - if (i > 99) - // obviously not found - break; - - // find element - if (xr.NodeType == System.Xml.XmlNodeType.Element) - { - res = xr.NamespaceURI; - break; - } - } - xr.Close(); - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - - // return to zero pos - s.Seek(0, SeekOrigin.Begin); - - // give back - return res; - } - - /// - /// De-serialize an open stream into AdministrationShellEnv. Does version/ compatibility management. - /// - /// Open for read stream - /// - public static AdminShell.AdministrationShellEnv DeserializeXmlFromStreamWithCompat(Stream s) - { - // not sure - AdminShell.AdministrationShellEnv res = null; - - // try get first element - var nsuri = TryReadXmlFirstElementNamespaceURI(s); - - // read V1.0? - if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/1/0") - { -#if !DoNotUseAasxCompatibilityModels - XmlSerializer serializer = new XmlSerializer( - typeof(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv), - "http://www.admin-shell.io/aas/1/0"); - var v10 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv; - res = new AdminShellV20.AdministrationShellEnv(v10); - return res; -#else - throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); -#endif - } - - // read V2.0? - if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/2/0") - { - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShell.AdministrationShellEnv), "http://www.admin-shell.io/aas/2/0"); - res = serializer.Deserialize(s) as AdminShell.AdministrationShellEnv; - return res; - } - - // nope! - return null; - } - - public static JsonSerializer BuildDefaultAasxJsonSerializer() - { - var serializer = new JsonSerializer(); - serializer.Converters.Add( - new AdminShellConverters.JsonAasxConverter( - "modelType", "name")); - return serializer; - } - - public static T DeserializeFromJSON(TextReader textReader) where T : AdminShell.Referable - { - var serializer = BuildDefaultAasxJsonSerializer(); - var rf = (T)serializer.Deserialize(textReader, typeof(T)); - return rf; - } - - public static T DeserializeFromJSON(string data) where T : AdminShell.Referable - { - using (var tr = new StringReader(data)) - { - var serializer = BuildDefaultAasxJsonSerializer(); - var rf = (T)serializer.Deserialize(tr, typeof(T)); - return rf; - } - } - - public static T DeserializeFromJSON(JToken obj) where T : AdminShell.Referable - { - if (obj == null) - return null; - var serializer = BuildDefaultAasxJsonSerializer(); - var rf = obj.ToObject(serializer); - return rf; - } - - /// - /// Use this, if DeserializeFromJSON is too tight. - /// - public static T DeserializePureObjectFromJSON(string data) - { - using (var tr = new StringReader(data)) - { - var serializer = BuildDefaultAasxJsonSerializer(); - var rf = (T)serializer.Deserialize(tr, typeof(T)); - return rf; - } - } - } - - /// - /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. - /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. - /// - public class AdminShellPackageEnv : IDisposable - { - private string _fn = "New Package"; - - private string _tempFn = null; - - private AdminShell.AdministrationShellEnv _aasEnv = new AdminShell.AdministrationShellEnv(); - private Package _openPackage = null; - private readonly ListOfAasSupplementaryFile _pendingFilesToAdd = new ListOfAasSupplementaryFile(); - private readonly ListOfAasSupplementaryFile _pendingFilesToDelete = new ListOfAasSupplementaryFile(); - - public AdminShellPackageEnv() { } - - public AdminShellPackageEnv(AdminShell.AdministrationShellEnv env) - { - if (env != null) - _aasEnv = env; - } - - public AdminShellPackageEnv(string fn, bool indirectLoadSave = false) - { - Load(fn, indirectLoadSave); - } - - public bool IsOpen - { - get - { - return _openPackage != null; - } - } - - public string Filename - { - get - { - return _fn; - } - } - - public AdminShell.AdministrationShellEnv AasEnv - { - get - { - return _aasEnv; - } - } - - private static AdminShell.AdministrationShellEnv LoadXml(string fn) - { - try - { - using (var reader = new StreamReader(fn)) - { - var aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat( - reader.BaseStream); - - if (aasEnv == null) - throw new Exception("Type error for XML file"); - - return aasEnv; - } - } - catch (Exception ex) - { - throw new Exception( - $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - private static AdminShell.AdministrationShellEnv LoadJson(string fn) - { - try - { - using (StreamReader file = System.IO.File.OpenText(fn)) - { - // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - var serializer = new JsonSerializer(); - serializer.Converters.Add( - new AdminShellConverters.JsonAasxConverter( - "modelType", "name")); - - var aasEnv = (AdminShell.AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdminShell.AdministrationShellEnv)); - - return aasEnv; - } - } - catch (Exception ex) - { - throw new Exception( - $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - /// is unequal if indirectLoadSave is used. - private static (AdminShell.AdministrationShellEnv, Package) LoadPackageAasx(string fn, string fnToLoad) - { - AdminShell.AdministrationShellEnv aasEnv; - Package openPackage = null; - - Package package; - try - { - package = Package.Open(fnToLoad, FileMode.Open); - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While opening the package to read AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While opening the package to read AASX {fn} indirectly from {fnToLoad} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - - try - { - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = package.GetPart(x.TargetUri); - break; - } - - if (originPart == null) - throw (new Exception("Unable to find AASX origin. Aborting!")); - - // get the specs from the package - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specPart = package.GetPart(x.TargetUri); - break; - } - - if (specPart == null) - throw (new Exception("Unable to find AASX spec(s). Aborting!")); - - // open spec part to read - try - { - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Open)) - { - using (var file = new StreamReader(s)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add( - new AdminShellConverters.JsonAasxConverter( - "modelType", "name")); - - aasEnv = (AdminShell.AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdminShell.AdministrationShellEnv)); - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Open)) - { - // own catch loop to be more specific - aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat(s); - openPackage = package; - - if (aasEnv == null) - throw new Exception("Type error for XML file!"); - } - } - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While reading spec from the AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While reading spec from the {fn} (and indirectly over {fnToLoad}) " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While reading the AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While reading the {fn} (and indirectly over {fnToLoad}) " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - finally - { - if (openPackage == null) - { - package.Close(); - } - } - - return (aasEnv, openPackage); - } - - public void Load(string fn, bool indirectLoadSave = false) - { - _fn = fn; - _openPackage?.Close(); - _openPackage = null; - - string extension = Path.GetExtension(fn).ToLower(); - switch (extension) - { - case ".xml": - { - _aasEnv = LoadXml(fn); - break; - } - case ".json": - { - _aasEnv = LoadJson(fn); - break; - } - case ".aasx": - { - var fnToLoad = fn; - _tempFn = null; - if (indirectLoadSave) - { - try - { - _tempFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".aasx"); - System.IO.File.Copy(fn, _tempFn); - fnToLoad = _tempFn; - - } - catch (Exception ex) - { - throw new Exception( - $"While copying AASX {fn} for indirect load to {fnToLoad} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - // load package AASX - (_aasEnv, _openPackage) = LoadPackageAasx(fn, fnToLoad); - break; - } - default: - throw new Exception( - $"Does not know how to handle the extension {extension} of the file: {fn}"); - } - } - - public void LoadFromAasEnvString(string content) - { - try - { - using (var file = new StringReader(content)) - { - // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); - _aasEnv = (AdminShell.AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdminShell.AdministrationShellEnv)); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AASENV string {0} gave: {1}", - AdminShellUtil.ShortLocation(ex), ex.Message))); - } - } - - public enum SerializationFormat { None, Xml, Json }; - - public static XmlSerializerNamespaces GetXmlDefaultNamespaces() - { - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - nss.Add("IEC", "http://www.admin-shell.io/IEC61360/2/0"); - nss.Add("abac", "http://www.admin-shell.io/aas/abac/2/0"); - return nss; - } - - public bool SaveAs(string fn, bool writeFreshly = false, SerializationFormat prefFmt = SerializationFormat.None, - MemoryStream useMemoryStream = null, bool saveOnlyCopy = false) - { - if (fn.ToLower().EndsWith(".xml")) - { - // save only XML - if (!saveOnlyCopy) - _fn = fn; - try - { - Stream s = (useMemoryStream != null) - ? (Stream)useMemoryStream - : File.Open(fn, FileMode.Create, FileAccess.Write); - - try - { - // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - var serializer = new XmlSerializer(typeof(AdminShell.AdministrationShellEnv)); - var nss = GetXmlDefaultNamespaces(); - serializer.Serialize(s, _aasEnv, nss); - s.Flush(); - } - finally - { - // close? - if (useMemoryStream == null) - s.Close(); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".json")) - { - // save only JSON - // This functionality is an initial test. - if (!saveOnlyCopy) - _fn = fn; - try - { - Stream s = (useMemoryStream != null) ? (Stream)useMemoryStream - : File.Open(fn, FileMode.Create, FileAccess.Write); - - try - { - // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - JsonSerializer serializer = new JsonSerializer() - { - NullValueHandling = NullValueHandling.Ignore, - ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - Formatting = Newtonsoft.Json.Formatting.Indented - }; - - var sw = new StreamWriter(s); - var writer = new JsonTextWriter(sw); - - serializer.Serialize(writer, _aasEnv); - writer.Flush(); - sw.Flush(); - s.Flush(); - - if (useMemoryStream == null) - { - writer.Close(); - sw.Close(); - } - } - finally - { - // close? - if (useMemoryStream == null) - s.Close(); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".aasx")) - { - // save package AASX - try - { - // We want existing contents to be preserved, but do not want to allow the change of the file name. - // Therefore: copy the file to a new name, then re-open. - // fn could be changed, therefore close "old" package first - if (_openPackage != null) - { - try - { - _openPackage.Close(); - if (!writeFreshly) - { - if (_tempFn != null) - System.IO.File.Copy(_tempFn, fn); - else - { - /* TODO (MIHO, 2021-01-02): check again. - * Revisiting this code after a while, and after - * the code has undergo some changes by MR, the following copy command needed - * to be amended with a if to protect against self-copy. */ - if (_fn != fn) - System.IO.File.Copy(_fn, fn); - } - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - _openPackage = null; - } - - // approach is to utilize the existing package, if possible. If not, create from scratch - Package package = null; - if (useMemoryStream != null) - { - package = Package.Open( - useMemoryStream, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - } - else - { - package = Package.Open( - (_tempFn != null) ? _tempFn : fn, - (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - } - _fn = fn; - - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = package.GetPart(x.TargetUri); - break; - } - if (originPart == null) - { - // create, as not existing - originPart = package.CreatePart( - new Uri("/aasx/aasx-origin", UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); - using (var s = originPart.GetStream(FileMode.Create)) - { - var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty."); - s.Write(bytes, 0, bytes.Length); - } - package.CreateRelationship( - originPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - } - - // get the specs from the package - PackagePart specPart = null; - PackageRelationship specRel = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specRel = x; - specPart = package.GetPart(x.TargetUri); - break; - } - - // check, if we have to change the spec part - if (specPart != null && specRel != null) - { - var name = System.IO.Path.GetFileNameWithoutExtension( - specPart.Uri.ToString()).ToLower().Trim(); - var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); - if ((ext == ".json" && prefFmt == SerializationFormat.Xml) - || (ext == ".xml" && prefFmt == SerializationFormat.Json) - || (name.StartsWith("aasenv-with-no-id"))) - { - // try kill specpart - try - { - originPart.DeleteRelationship(specRel.Id); - package.DeletePart(specPart.Uri); - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - finally { specPart = null; specRel = null; } - } - } - - if (specPart == null) - { - // create, as not existing - var frn = "aasenv-with-no-id"; - if (_aasEnv.AdministrationShells.Count > 0) - frn = _aasEnv.AdministrationShells[0].GetFriendlyName() ?? frn; - var aas_spec_fn = "/aasx/#/#.aas"; - if (prefFmt == SerializationFormat.Json) - aas_spec_fn += ".json"; - else - aas_spec_fn += ".xml"; - aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); - specPart = package.CreatePart( - new Uri(aas_spec_fn, UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Xml, CompressionOption.Maximum); - originPart.CreateRelationship( - specPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - } - - // now, specPart shall be != null! - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Create)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - using (var sw = new StreamWriter(s)) - { - using (JsonWriter writer = new JsonTextWriter(sw)) - { - serializer.Serialize(writer, _aasEnv); - } - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Create)) - { - var serializer = new XmlSerializer(typeof(AdminShell.AdministrationShellEnv)); - var nss = GetXmlDefaultNamespaces(); - serializer.Serialize(s, _aasEnv, nss); - } - } - - // there might be pending files to be deleted (first delete, then add, - // in case of identical files in both categories) - foreach (var psfDel in _pendingFilesToDelete) - { - // try find an existing part for that file .. - var found = false; - - // normal files - xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfDel.Uri) - { - // try to delete - specPart.DeleteRelationship(x.Id); - package.DeletePart(psfDel.Uri); - found = true; - break; - } - - // thumbnails - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.TargetUri == psfDel.Uri) - { - // try to delete - package.DeleteRelationship(x.Id); - package.DeletePart(psfDel.Uri); - found = true; - break; - } - - if (!found) - throw (new Exception( - $"Not able to delete pending file {psfDel.Uri} in saving package {fn}")); - } - - // after this, there are no more pending for delete files - _pendingFilesToDelete.Clear(); - - // write pending supplementary files - foreach (var psfAdd in _pendingFilesToAdd) - { - // make sure .. - if ((psfAdd.SourceLocalPath == null && psfAdd.SourceGetBytesDel == null) || - psfAdd.Location != AdminShellPackageSupplementaryFile.LocationType.AddPending) - continue; - - // normal file? - if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None || - psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - - // try find an existing part for that file .. - PackagePart filePart = null; - if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None) - { - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfAdd.Uri) - { - filePart = package.GetPart(x.TargetUri); - break; - } - } - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.Uri) - { - filePart = package.GetPart(x.TargetUri); - break; - } - } - - if (filePart == null) - { - // determine mimeType - var mimeType = psfAdd.UseMimeType; - // reconcile mime - if (mimeType == null && psfAdd.SourceLocalPath != null) - mimeType = AdminShellPackageEnv.GuessMimeType(psfAdd.SourceLocalPath); - // still null? - if (mimeType == null) - // see: https://stackoverflow.com/questions/6783921/ - // which-mime-type-to-use-for-a-binary-file-thats-specific-to-my-program - mimeType = "application/octet-stream"; - - // create new part and link - filePart = package.CreatePart(psfAdd.Uri, mimeType, CompressionOption.Maximum); - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.None) - specPart.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - package.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://schemas.openxmlformats.org/package/2006/" + - "relationships/metadata/thumbnail"); - } - - // now should be able to write - using (var s = filePart.GetStream(FileMode.Create)) - { - if (psfAdd.SourceLocalPath != null) - { - var bytes = System.IO.File.ReadAllBytes(psfAdd.SourceLocalPath); - s.Write(bytes, 0, bytes.Length); - } - - if (psfAdd.SourceGetBytesDel != null) - { - var bytes = psfAdd.SourceGetBytesDel(); - if (bytes != null) - s.Write(bytes, 0, bytes.Length); - } - } - } - } - - // after this, there are no more pending for add files - _pendingFilesToAdd.Clear(); - - // flush, but leave open - package.Flush(); - _openPackage = package; - - // if in temp fn, close the package, copy to original fn, re-open the package - if (_tempFn != null) - try - { - package.Close(); - System.IO.File.Copy(_tempFn, _fn, overwrite: true); - _openPackage = Package.Open(_tempFn, FileMode.OpenOrCreate); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} indirectly at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - // Don't know to handle - throw new Exception($"Does not know how to handle the file: {fn}"); - } - - /// - /// Temporariyl saves & closes package and executes lambda. Afterwards, the package is re-opened - /// under the same file name - /// - /// Action which is to be executed while the file is CLOSED - /// Format for the saved file - public void TemporarilySaveCloseAndReOpenPackage( - Action lambda, - AdminShellPackageEnv.SerializationFormat prefFmt = AdminShellPackageEnv.SerializationFormat.None) - { - // access - if (!this.IsOpen) - throw (new Exception( - string.Format("Could not temporarily close and re-open AASX {0}, because package" + - "not open as expected!", Filename))); - - try - { - // save (it will be open, still) - SaveAs(this.Filename, prefFmt: prefFmt); - - // close - _openPackage.Flush(); - _openPackage.Close(); - - // execute lambda - lambda?.Invoke(); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While temporarily close and re-open AASX {0} at {1} gave: {2}", - Filename, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - finally - { - // even after failing of the lambda, the package shall be re-opened - _openPackage = Package.Open(Filename, FileMode.OpenOrCreate); - } - } - - private int BackupIndex = 0; - - public void BackupInDir(string backupDir, int maxFiles) - { - // access - if (backupDir == null || maxFiles < 1) - return; - - // we do it not caring on any errors - try - { - // get index in form - if (BackupIndex == 0) - { - // do not always start at 0!! - var rnd = new Random(); - BackupIndex = rnd.Next(maxFiles); - } - var ndx = BackupIndex % maxFiles; - BackupIndex += 1; - - // build a filename - var bdfn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); - - // raw save - using (var s = new StreamWriter(bdfn)) - { - var serializer = new XmlSerializer(typeof(AdminShell.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); - serializer.Serialize(s, _aasEnv, nss); - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - } - - public Stream GetStreamFromUriOrLocalPackage(string uriString, - FileMode mode = FileMode.Open, - FileAccess access = FileAccess.Read) - { - // local - if (IsLocalFile(uriString)) - return GetLocalStreamFromPackage(uriString, mode); - - // no .. - return File.Open(uriString, mode, access); - } - - public byte[] GetByteArrayFromUriOrLocalPackage(string uriString) - { - try - { - using (var input = GetStreamFromUriOrLocalPackage(uriString)) - { - using (MemoryStream ms = new MemoryStream()) - { - input.CopyTo(ms); - return ms.ToArray(); - } - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - return null; - } - } - - public bool IsLocalFile(string uriString) - { - // access - if (_openPackage == null) - return false; - if (uriString == null || uriString == "" || !uriString.StartsWith("/")) - return false; - - // check - var isLocal = _openPackage.PartExists(new Uri(uriString, UriKind.RelativeOrAbsolute)); - return isLocal; - } - - public Stream GetLocalStreamFromPackage(string uriString, FileMode mode = FileMode.Open) - { - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - - // exist - var puri = new Uri(uriString, UriKind.RelativeOrAbsolute); - if (!_openPackage.PartExists(puri)) - throw (new Exception(string.Format($"AASX Package has no part {uriString}. Aborting!"))); - - // get part - var part = _openPackage.GetPart(puri); - if (part == null) - throw (new Exception( - string.Format($"Cannot access part {uriString} in {_fn}. Aborting!"))); - return part.GetStream(mode); - } - - public long GetStreamSizeFromPackage(string uriString) - { - long res = 0; - try - { - if (_openPackage == null) - return 0; - var part = _openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); - using (var s = part.GetStream(FileMode.Open)) - { - res = s.Length; - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - return 0; - } - return res; - } - - /// - /// Ensures: - ///
  • result == null || result.CanRead
- ///
- public Stream GetLocalThumbnailStream(ref Uri thumbUri) - { - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - // get the thumbnail over the relationship - PackagePart thumbPart = null; - var xs = _openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - thumbPart = _openPackage.GetPart(x.TargetUri); - thumbUri = x.TargetUri; - break; - } - if (thumbPart == null) - throw (new Exception("Unable to find AASX thumbnail. Aborting!")); - - var result = thumbPart.GetStream(FileMode.Open); - - // Post-condition - if (!(result == null || result.CanRead)) - { - throw new InvalidOperationException("Unexpected unreadable result stream"); - } - - return result; - } - - /// - /// Ensures: - ///
  • result == null || result.CanRead
- ///
- public Stream GetLocalThumbnailStream() - { - Uri dummy = null; - var result = GetLocalThumbnailStream(ref dummy); - - // Post-condition - if (!(result == null || result.CanRead)) - { - throw new InvalidOperationException("Unexpected unreadable result stream"); - } - - return result; - } - - public ListOfAasSupplementaryFile GetListOfSupplementaryFiles() - { - // new result - var result = new ListOfAasSupplementaryFile(); - - // access - if (_openPackage != null) - { - - // get the thumbnail(s) from the package - var xs = _openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - result.Add(new AdminShellPackageSupplementaryFile( - x.TargetUri, - location: AdminShellPackageSupplementaryFile.LocationType.InPackage, - specialHandling: AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); - } - - // get the origin from the package - PackagePart originPart = null; - xs = _openPackage.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = _openPackage.GetPart(x.TargetUri); - break; - } - - if (originPart != null) - { - // get the specs from the origin - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specPart = _openPackage.GetPart(x.TargetUri); - break; - } - - if (specPart != null) - { - // get the supplementaries from the package, derived from spec - xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - { - result.Add( - new AdminShellPackageSupplementaryFile( - x.TargetUri, location: AdminShellPackageSupplementaryFile.LocationType.InPackage)); - } - } - } - } - - // add or modify the files to delete - foreach (var psfDel in _pendingFilesToDelete) - { - // already in - var found = result.Find(x => { return x.Uri == psfDel.Uri; }); - if (found != null) - found.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; - else - { - psfDel.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; - result.Add(psfDel); - } - } - - // add the files to store as well - foreach (var psfAdd in _pendingFilesToAdd) - { - // already in (should not happen ?!) - var found = result.Find(x => { return x.Uri == psfAdd.Uri; }); - if (found != null) - found.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; - else - { - psfAdd.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; - result.Add(psfAdd); - } - } - - // done - return result; - } - - public static string GuessMimeType(string fn) - { - var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; - if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; - if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".igs") content_type = "application/iges"; - if (file_ext == ".iges") content_type = "application/iges"; - if (file_ext == ".stp") content_type = "application/step"; - if (file_ext == ".step") content_type = "application/step"; - if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".png") content_type = "image/png"; - if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; - return content_type; - } - - public void PrepareSupplementaryFileParameters(ref string targetDir, ref string targetFn) - { - // re-work target dir - if (targetDir != null) - targetDir = targetDir.Replace(@"\", "/"); - - // rework targetFn - if (targetFn != null) - targetFn = Regex.Replace(targetFn, @"[^A-Za-z0-9-.]+", "_"); - } - - /// - /// Add a file as supplementary file to package. Operation will be pending, package needs to be saved in order - /// materialize embedding. - /// - /// Target path of file in package - public string AddSupplementaryFileToStore( - string sourcePath, string targetDir, string targetFn, bool embedAsThumb, - AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - // beautify parameters - if ((sourcePath == null && sourceGetBytesDel == null) || targetDir == null || targetFn == null) - return null; - - // build target path - targetDir = targetDir.Trim(); - if (!targetDir.EndsWith("/")) - targetDir += "/"; - targetFn = targetFn.Trim(); - if (sourcePath == "" || targetDir == "" || targetFn == "") - throw (new Exception("Trying add supplementary file with empty name or path!")); - - var targetPath = "" + targetDir.Trim() + targetFn.Trim(); - - // base function - AddSupplementaryFileToStore(sourcePath, targetPath, embedAsThumb, sourceGetBytesDel, useMimeType); - - // return target path - return targetPath; - } - - public void AddSupplementaryFileToStore(string sourcePath, string targetPath, bool embedAsThumb, - AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - // beautify parameters - if ((sourcePath == null && sourceGetBytesDel == null) || targetPath == null) - return; - - sourcePath = sourcePath?.Trim(); - targetPath = targetPath.Trim(); - - // add record - _pendingFilesToAdd.Add( - new AdminShellPackageSupplementaryFile( - new Uri(targetPath, UriKind.RelativeOrAbsolute), - sourcePath, - location: AdminShellPackageSupplementaryFile.LocationType.AddPending, - specialHandling: (embedAsThumb - ? AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail - : AdminShellPackageSupplementaryFile.SpecialHandlingType.None), - sourceGetBytesDel: sourceGetBytesDel, - useMimeType: useMimeType) - ); - - } - - public void DeleteSupplementaryFile(AdminShellPackageSupplementaryFile psf) - { - if (psf == null) - throw (new Exception("No supplementary file given!")); - - if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.AddPending) - { - // is still pending in add list -> remove - _pendingFilesToAdd.RemoveAll((x) => { return x.Uri == psf.Uri; }); - } - - if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.InPackage) - { - // add to pending delete list - _pendingFilesToDelete.Add(psf); - } - } - - public void Close() - { - _openPackage?.Close(); - _openPackage = null; - _fn = ""; - _aasEnv = null; - } - - public void Flush() - { - if (_openPackage != null) - _openPackage.Flush(); - } - - public void Dispose() - { - Close(); - } - - public string MakePackageFileAvailableAsTempFile(string packageUri, bool keepFilename = false) - { - // access - if (packageUri == null) - return null; - - // get input stream - using (var input = GetLocalStreamFromPackage(packageUri)) - { - // generate tempfile name - string tempext = System.IO.Path.GetExtension(packageUri); - string temppath = System.IO.Path.GetTempFileName().Replace(".tmp", tempext); - - // maybe modify tempfile name? - if (keepFilename) - { - var masterFn = System.IO.Path.GetFileNameWithoutExtension(packageUri); - var tmpDir = System.IO.Path.GetDirectoryName(temppath); - var tmpFnExt = System.IO.Path.GetFileName(temppath); - - temppath = System.IO.Path.Combine(tmpDir, "" + masterFn + "_" + tmpFnExt); - } - - // copy to temp file - using (var temp = File.OpenWrite(temppath)) - { - input.CopyTo(temp); - return temppath; - } - } - } - - } -} +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Packaging; +using System.Linq; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using AasCore.Aas3_0_RC02; +using AdminShellNS; +using Extensions; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace AdminShellNS +{ + /// + /// This class lets an outer functionality keep track on the supplementary files, which are in or + /// are pending to be added or deleted to an Package. + /// + public class AdminShellPackageSupplementaryFile /*: IReferable*/ + { + public delegate byte[] SourceGetByteChunk(); + + public enum LocationType { InPackage, AddPending, DeletePending } + + public enum SpecialHandlingType { None, EmbedAsThumbnail } + + public readonly Uri Uri = null; + + public readonly string UseMimeType = null; + + public readonly string SourceLocalPath = null; + public readonly SourceGetByteChunk SourceGetBytesDel = null; + + public LocationType Location; + public readonly SpecialHandlingType SpecialHandling; + + public AdminShellPackageSupplementaryFile( + Uri uri, string sourceLocalPath = null, LocationType location = LocationType.InPackage, + SpecialHandlingType specialHandling = SpecialHandlingType.None, + SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) + { + Uri = uri; + UseMimeType = useMimeType; + SourceLocalPath = sourceLocalPath; + SourceGetBytesDel = sourceGetBytesDel; + Location = location; + SpecialHandling = specialHandling; + } + + // class derives from Referable in order to provide GetElementName + public string GetElementName() + { + return "File"; + } + + } + + public class ListOfAasSupplementaryFile : List + { + public AdminShellPackageSupplementaryFile FindByUri(string path) + { + if (path == null) + return null; + + return this.FirstOrDefault( + x => x?.Uri?.ToString().Trim() == path.Trim()); + } + } + + /// + /// Provides (static?) helpers for serializing AAS.. + /// + public static class AdminShellSerializationHelper + { + + public static string TryReadXmlFirstElementNamespaceURI(Stream s) + { + string res = null; + try + { + var xr = System.Xml.XmlReader.Create(s); + int i = 0; + while (xr.Read()) + { + // limit amount of read + i++; + if (i > 99) + // obviously not found + break; + + // find element + if (xr.NodeType == System.Xml.XmlNodeType.Element) + { + res = xr.NamespaceURI; + break; + } + } + xr.Close(); + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + + // return to zero pos + s.Seek(0, SeekOrigin.Begin); + + // give back + return res; + } + + /// + /// Skips first few tokens of an XML content until first "real" element is encountered + /// + /// + public static void XmlSkipHeader(XmlReader xmlReader) + { + while (xmlReader.NodeType == XmlNodeType.XmlDeclaration || + xmlReader.NodeType == XmlNodeType.Whitespace || + xmlReader.NodeType == XmlNodeType.Comment || + xmlReader.NodeType == XmlNodeType.None) + xmlReader.Read(); + } + + /// + /// De-serialize an open stream into Environment. Does version/ compatibility management. + /// + /// Open for read stream + /// + public static AasCore.Aas3_0_RC02.Environment DeserializeXmlFromStreamWithCompat(Stream s) + { + // not sure + AasCore.Aas3_0_RC02.Environment res = null; + + // try get first element + var nsuri = TryReadXmlFirstElementNamespaceURI(s); + + // read V1.0? + if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/1/0") + { +#if !DoNotUseAasxCompatibilityModels + XmlSerializer serializer = new XmlSerializer( + typeof(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv), + "http://www.admin-shell.io/aas/1/0"); + var v10 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv; + //res = new AdministrationShellEnv(v10); + res = new AasCore.Aas3_0_RC02.Environment(new List(), new List(), new List()); + res.ConvertFromV10(v10); + return res; +#else + throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); +#endif + } + + // read V2.0? + if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/2/0") + { +#if !DoNotUseAasxCompatibilityModels + XmlSerializer serializer = new XmlSerializer( + typeof(AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv), + "http://www.admin-shell.io/aas/2/0"); + var v20 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv; + //res = new AdministrationShellEnv(v20); + res = new AasCore.Aas3_0_RC02.Environment(new List(), new List(), new List()); + res.ConvertFromV20(v20); + return res; +#else + throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); +#endif + } + + // read V3.0? + if (nsuri != null && nsuri.Trim() == Xmlization.NS) + { + //XmlSerializer serializer = new XmlSerializer( + // typeof(AasCore.Aas3_0_RC02.Environment), "http://www.admin-shell.io/aas/3/0"); + //res = serializer.Deserialize(s) as AasCore.Aas3_0_RC02.Environment; + + using (var xmlReader = XmlReader.Create(s)) + { + // TODO (MIHO, 2022-12-26): check if could be feature of AAS core + XmlSkipHeader(xmlReader); + res = Xmlization.Deserialize.EnvironmentFrom(xmlReader); + return res; + } + } + + // nope! + return null; + } + + //public static JsonSerializer BuildDefaultAasxJsonSerializer() + //{ + // var serializer = new JsonSerializer(); + // serializer.Converters.Add( + // new AdminShellConverters.JsonAasxConverter( + // "modelType", "name")); + // return serializer; + //} + + public static T DeserializeFromJSON(string data) where T : IReferable + { + //using (var tr = new StringReader(data)) + //{ + //var serializer = BuildDefaultAasxJsonSerializer(); + //var rf = (T)serializer.Deserialize(tr, typeof(T)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(data); + var rf = Jsonization.Deserialize.IReferableFrom(node); + + return (T)rf; + //} + } + + //public static T DeserializeFromJSON(JToken obj) where T : IReferable + //{ + // if (obj == null) + // return default(T); + // var serializer = BuildDefaultAasxJsonSerializer(); + // var rf = obj.ToObject(serializer); + // return rf; + //} + + ///// + ///// Use this, if DeserializeFromJSON is too tight. + ///// + //public static T DeserializePureObjectFromJSON(string data) + //{ + // using (var tr = new StringReader(data)) + // { + // //var serializer = BuildDefaultAasxJsonSerializer(); + // //var rf = (T)serializer.Deserialize(tr, typeof(T)); + // return null; + // } + //} + } + + /// + /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. + /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. + /// + public class AdminShellPackageEnv : IDisposable + { + private string _fn = "New Package"; + + private string _tempFn = null; + + private AasCore.Aas3_0_RC02.Environment _aasEnv = new AasCore.Aas3_0_RC02.Environment(new List(), new List(), new List()); + private Package _openPackage = null; + private readonly ListOfAasSupplementaryFile _pendingFilesToAdd = new ListOfAasSupplementaryFile(); + private readonly ListOfAasSupplementaryFile _pendingFilesToDelete = new ListOfAasSupplementaryFile(); + + public AdminShellPackageEnv() { } + + public AdminShellPackageEnv(AasCore.Aas3_0_RC02.Environment env) + { + if (env != null) + _aasEnv = env; + } + + public AdminShellPackageEnv(string fn, bool indirectLoadSave = false) + { + Load(fn, indirectLoadSave); + } + + public bool IsOpen + { + get + { + return _openPackage != null; + } + } + + public string Filename + { + get + { + return _fn; + } + } + + public AasCore.Aas3_0_RC02.Environment AasEnv + { + get + { + return _aasEnv; + } + } + + private static AasCore.Aas3_0_RC02.Environment LoadXml(string fn) + { + try + { + using (var reader = new StreamReader(fn)) + { + var aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat( + reader.BaseStream); + + if (aasEnv == null) + throw new Exception("Type error for XML file"); + + return aasEnv; + } + } + catch (Exception ex) + { + throw new Exception( + $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + + private static AasCore.Aas3_0_RC02.Environment LoadJson(string fn) + { + try + { + using (var file = System.IO.File.OpenRead(fn)) + { + // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //var serializer = new JsonSerializer(); + //serializer.Converters.Add( + // new AdminShellConverters.JsonAasxConverter( + // "modelType", "name")); + + //var aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( + // file, typeof(AasCore.Aas3_0_RC02.Environment)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(file); + var aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); + + return aasEnv; + } + } + catch (Exception ex) + { + throw new Exception( + $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + + /// is unequal if indirectLoadSave is used. + private static (AasCore.Aas3_0_RC02.Environment, Package) LoadPackageAasx(string fn, string fnToLoad) + { + AasCore.Aas3_0_RC02.Environment aasEnv; + Package openPackage = null; + + Package package; + try + { + package = Package.Open(fnToLoad, FileMode.Open); + } + catch (Exception ex) + { + throw new Exception( + fn == fnToLoad + ? $"While opening the package to read AASX {fn} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" + : $"While opening the package to read AASX {fn} indirectly from {fnToLoad} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + + try + { + // get the origin from the package + PackagePart originPart = null; + var xs = package.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = package.GetPart(x.TargetUri); + break; + } + + if (originPart == null) + throw (new Exception("Unable to find AASX origin. Aborting!")); + + // get the specs from the package + PackagePart specPart = null; + xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specPart = package.GetPart(x.TargetUri); + break; + } + + if (specPart == null) + throw (new Exception("Unable to find AASX spec(s). Aborting!")); + + // open spec part to read + try + { + if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) + { + using (var s = specPart.GetStream(FileMode.Open)) + { + //using (var file = new StreamReader(s)) + //{ + //JsonSerializer serializer = new JsonSerializer(); + //serializer.Converters.Add( + // new AdminShellConverters.JsonAasxConverter( + // "modelType", "name")); + + //aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( + // file, typeof(AasCore.Aas3_0_RC02.Environment)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(s); + aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); + //} + } + } + else + { + using (var s = specPart.GetStream(FileMode.Open)) + { + // own catch loop to be more specific + aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat(s); + openPackage = package; + + if (aasEnv == null) + throw new Exception("Type error for XML file!"); + } + } + } + catch (Exception ex) + { + throw new Exception( + fn == fnToLoad + ? $"While reading spec from the AASX {fn} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" + : $"While reading spec from the {fn} (and indirectly over {fnToLoad}) " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + catch (Exception ex) + { + throw new Exception( + fn == fnToLoad + ? $"While reading the AASX {fn} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" + : $"While reading the {fn} (and indirectly over {fnToLoad}) " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + finally + { + if (openPackage == null) + { + package.Close(); + } + } + + return (aasEnv, openPackage); + } + + public void Load(string fn, bool indirectLoadSave = false) + { + _fn = fn; + _openPackage?.Close(); + _openPackage = null; + + string extension = Path.GetExtension(fn).ToLower(); + switch (extension) + { + case ".xml": + { + _aasEnv = LoadXml(fn); + break; + } + case ".json": + { + _aasEnv = LoadJson(fn); + break; + } + case ".aasx": + { + var fnToLoad = fn; + _tempFn = null; + if (indirectLoadSave) + { + try + { + _tempFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".aasx"); + System.IO.File.Copy(fn, _tempFn); + fnToLoad = _tempFn; + + } + catch (Exception ex) + { + throw new Exception( + $"While copying AASX {fn} for indirect load to {fnToLoad} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + + // load package AASX + (_aasEnv, _openPackage) = LoadPackageAasx(fn, fnToLoad); + break; + } + default: + throw new Exception( + $"Does not know how to handle the extension {extension} of the file: {fn}"); + } + } + + public void LoadFromAasEnvString(string content) + { + try + { + //using (var file = new StringReader(content)) + //{ + // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //JsonSerializer serializer = new JsonSerializer(); + //serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); + //_aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( + // file, typeof(AasCore.Aas3_0_RC02.Environment)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(content); + _aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); + //} + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AASENV string {0} gave: {1}", + AdminShellUtil.ShortLocation(ex), ex.Message))); + } + } + + public enum SerializationFormat { None, Xml, Json }; + + //public static XmlSerializerNamespaces GetXmlDefaultNamespaces() + //{ + // var nss = new XmlSerializerNamespaces(); + // nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + // nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); + // nss.Add("IEC", "http://www.admin-shell.io/IEC61360/2/0"); + // nss.Add("abac", "http://www.admin-shell.io/aas/abac/2/0"); + // return nss; + //} + + public bool SaveAs(string fn, bool writeFreshly = false, SerializationFormat prefFmt = SerializationFormat.None, + MemoryStream useMemoryStream = null, bool saveOnlyCopy = false) + { + if (fn.ToLower().EndsWith(".xml")) + { + // save only XML + if (!saveOnlyCopy) + _fn = fn; + try + { + Stream s = (useMemoryStream != null) + ? (Stream)useMemoryStream + : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); + + try + { + // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); + //var nss = GetXmlDefaultNamespaces(); + //serializer.Serialize(s, _aasEnv, nss); + + var writer = XmlWriter.Create(s, new XmlWriterSettings() { Indent = true }); + Xmlization.Serialize.To( + _aasEnv, writer); + writer.Flush(); + writer.Close(); + s.Flush(); + } + finally + { + // close? + if (useMemoryStream == null) + s.Close(); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While writing AAS {0} at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".json")) + { + // save only JSON + // This functionality is an initial test. + if (!saveOnlyCopy) + _fn = fn; + try + { + Stream s = (useMemoryStream != null) ? (Stream)useMemoryStream + : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); + + try + { + // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //JsonSerializer serializer = new JsonSerializer() + //{ + // NullValueHandling = NullValueHandling.Ignore, + // ReferenceLoopHandling = ReferenceLoopHandling.Serialize, + // Formatting = Newtonsoft.Json.Formatting.Indented + //}; + + //var sw = new StreamWriter(s); + //var writer = new JsonTextWriter(sw); + + //serializer.Serialize(writer, _aasEnv); + //writer.Flush(); + //sw.Flush(); + //s.Flush(); + + //if (useMemoryStream == null) + //{ + // writer.Close(); + // sw.Close(); + //} + + using (var wr = new System.Text.Json.Utf8JsonWriter(s)) + { + Jsonization.Serialize.ToJsonObject(_aasEnv).WriteTo(wr, + new System.Text.Json.JsonSerializerOptions() + { + WriteIndented = true + }); + wr.Flush(); + s.Flush(); + } + } + finally + { + // close? + if (useMemoryStream == null) + s.Close(); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While writing AAS {0} at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".aasx")) + { + // save package AASX + try + { + // We want existing contents to be preserved, but do not want to allow the change of the file name. + // Therefore: copy the file to a new name, then re-open. + // fn could be changed, therefore close "old" package first + if (_openPackage != null) + { + try + { + _openPackage.Close(); + if (!writeFreshly) + { + if (_tempFn != null) + System.IO.File.Copy(_tempFn, fn); + else + { + /* TODO (MIHO, 2021-01-02): check again. + * Revisiting this code after a while, and after + * the code has undergo some changes by MR, the following copy command needed + * to be amended with a if to protect against self-copy. */ + if (_fn != fn) + System.IO.File.Copy(_fn, fn); + } + } + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + _openPackage = null; + } + + // approach is to utilize the existing package, if possible. If not, create from scratch + Package package = null; + if (useMemoryStream != null) + { + package = Package.Open( + useMemoryStream, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); + } + else + { + package = Package.Open( + (_tempFn != null) ? _tempFn : fn, + (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); + } + _fn = fn; + + // get the origin from the package + PackagePart originPart = null; + var xs = package.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = package.GetPart(x.TargetUri); + break; + } + if (originPart == null) + { + // create, as not existing + originPart = package.CreatePart( + new Uri("/aasx/aasx-origin", UriKind.RelativeOrAbsolute), + System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); + using (var s = originPart.GetStream(FileMode.Create)) + { + var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty."); + s.Write(bytes, 0, bytes.Length); + } + package.CreateRelationship( + originPart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + } + + // get the specs from the package + PackagePart specPart = null; + PackageRelationship specRel = null; + xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specRel = x; + specPart = package.GetPart(x.TargetUri); + break; + } + + // check, if we have to change the spec part + if (specPart != null && specRel != null) + { + var name = System.IO.Path.GetFileNameWithoutExtension( + specPart.Uri.ToString()).ToLower().Trim(); + var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); + if ((ext == ".json" && prefFmt == SerializationFormat.Xml) + || (ext == ".xml" && prefFmt == SerializationFormat.Json) + || (name.StartsWith("aasenv-with-no-id"))) + { + // try kill specpart + try + { + originPart.DeleteRelationship(specRel.Id); + package.DeletePart(specPart.Uri); + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + finally { specPart = null; specRel = null; } + } + } + + if (specPart == null) + { + // create, as not existing + var frn = "aasenv-with-no-id"; + if (_aasEnv.AssetAdministrationShells.Count > 0) + frn = _aasEnv.AssetAdministrationShells[0].GetFriendlyName() ?? frn; + var aas_spec_fn = "/aasx/#/#.aas"; + if (prefFmt == SerializationFormat.Json) + aas_spec_fn += ".json"; + else + aas_spec_fn += ".xml"; + aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); + specPart = package.CreatePart( + new Uri(aas_spec_fn, UriKind.RelativeOrAbsolute), + System.Net.Mime.MediaTypeNames.Text.Xml, CompressionOption.Maximum); + originPart.CreateRelationship( + specPart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + } + + // now, specPart shall be != null! + if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) + { + using (var s = specPart.GetStream(FileMode.Create)) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.NullValueHandling = NullValueHandling.Ignore; + serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + serializer.Formatting = Newtonsoft.Json.Formatting.Indented; + using (var sw = new StreamWriter(s)) + { + using (JsonWriter writer = new JsonTextWriter(sw)) + { + serializer.Serialize(writer, _aasEnv); + } + } + } + } + else + { + using (var s = specPart.GetStream(FileMode.Create)) + { + //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); + //var nss = GetXmlDefaultNamespaces(); + //serializer.Serialize(s, _aasEnv, nss); + + var writer = XmlWriter.Create(s, new XmlWriterSettings() { Indent = true }); + Xmlization.Serialize.To( + _aasEnv, writer); + writer.Flush(); + writer.Close(); + s.Flush(); + } + } + + // there might be pending files to be deleted (first delete, then add, + // in case of identical files in both categories) + foreach (var psfDel in _pendingFilesToDelete) + { + // try find an existing part for that file .. + var found = false; + + // normal files + xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + if (x.TargetUri == psfDel.Uri) + { + // try to delete + specPart.DeleteRelationship(x.Id); + package.DeletePart(psfDel.Uri); + found = true; + break; + } + + // thumbnails + xs = package.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.TargetUri == psfDel.Uri) + { + // try to delete + package.DeleteRelationship(x.Id); + package.DeletePart(psfDel.Uri); + found = true; + break; + } + + if (!found) + throw (new Exception( + $"Not able to delete pending file {psfDel.Uri} in saving package {fn}")); + } + + // after this, there are no more pending for delete files + _pendingFilesToDelete.Clear(); + + // write pending supplementary files + foreach (var psfAdd in _pendingFilesToAdd) + { + // make sure .. + if ((psfAdd.SourceLocalPath == null && psfAdd.SourceGetBytesDel == null) || + psfAdd.Location != AdminShellPackageSupplementaryFile.LocationType.AddPending) + continue; + + // normal file? + if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None || + psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + { + + // try find an existing part for that file .. + PackagePart filePart = null; + if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None) + { + xs = specPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + if (x.TargetUri == psfAdd.Uri) + { + filePart = package.GetPart(x.TargetUri); + break; + } + } + if (psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + { + xs = package.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.Uri) + { + filePart = package.GetPart(x.TargetUri); + break; + } + } + + if (filePart == null) + { + // determine mimeType + var mimeType = psfAdd.UseMimeType; + // reconcile mime + if (mimeType == null && psfAdd.SourceLocalPath != null) + mimeType = AdminShellPackageEnv.GuessMimeType(psfAdd.SourceLocalPath); + // still null? + if (mimeType == null) + // see: https://stackoverflow.com/questions/6783921/ + // which-mime-type-to-use-for-a-binary-file-thats-specific-to-my-program + mimeType = "application/octet-stream"; + + // create new part and link + filePart = package.CreatePart(psfAdd.Uri, mimeType, CompressionOption.Maximum); + if (psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.None) + specPart.CreateRelationship( + filePart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + if (psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + package.CreateRelationship( + filePart.Uri, TargetMode.Internal, + "http://schemas.openxmlformats.org/package/2006/" + + "relationships/metadata/thumbnail"); + } + + // now should be able to write + using (var s = filePart.GetStream(FileMode.Create)) + { + if (psfAdd.SourceLocalPath != null) + { + var bytes = System.IO.File.ReadAllBytes(psfAdd.SourceLocalPath); + s.Write(bytes, 0, bytes.Length); + } + + if (psfAdd.SourceGetBytesDel != null) + { + var bytes = psfAdd.SourceGetBytesDel(); + if (bytes != null) + s.Write(bytes, 0, bytes.Length); + } + } + } + } + + // after this, there are no more pending for add files + _pendingFilesToAdd.Clear(); + + // flush, but leave open + package.Flush(); + _openPackage = package; + + // if in temp fn, close the package, copy to original fn, re-open the package + if (_tempFn != null) + try + { + package.Close(); + System.IO.File.Copy(_tempFn, _fn, overwrite: true); + _openPackage = Package.Open(_tempFn, FileMode.OpenOrCreate); + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While write AASX {0} indirectly at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While write AASX {0} at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + return true; + } + + // Don't know to handle + throw new Exception($"Does not know how to handle the file: {fn}"); + } + + /// + /// Temporariyl saves & closes package and executes lambda. Afterwards, the package is re-opened + /// under the same file name + /// + /// Action which is to be executed while the file is CLOSED + /// Format for the saved file + public void TemporarilySaveCloseAndReOpenPackage( + Action lambda, + AdminShellPackageEnv.SerializationFormat prefFmt = AdminShellPackageEnv.SerializationFormat.None) + { + // access + if (!this.IsOpen) + throw (new Exception( + string.Format("Could not temporarily close and re-open AASX {0}, because package" + + "not open as expected!", Filename))); + + try + { + // save (it will be open, still) + SaveAs(this.Filename, prefFmt: prefFmt); + + // close + _openPackage.Flush(); + _openPackage.Close(); + + // execute lambda + lambda?.Invoke(); + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While temporarily close and re-open AASX {0} at {1} gave: {2}", + Filename, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + finally + { + // even after failing of the lambda, the package shall be re-opened + _openPackage = Package.Open(Filename, FileMode.OpenOrCreate); + } + } + + private int BackupIndex = 0; + + public void BackupInDir(string backupDir, int maxFiles) + { + // access + if (backupDir == null || maxFiles < 1) + return; + + // we do it not caring on any errors + try + { + // get index in form + if (BackupIndex == 0) + { + // do not always start at 0!! + var rnd = new Random(); + BackupIndex = rnd.Next(maxFiles); + } + var ndx = BackupIndex % maxFiles; + BackupIndex += 1; + + // build a filename + var bdfn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); + + // raw save + using (var s = new StreamWriter(bdfn)) + { + //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); + //var nss = new XmlSerializerNamespaces(); + //nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + //nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); + //nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); + //serializer.Serialize(s, _aasEnv, nss); + + var writer = XmlWriter.Create(s, new XmlWriterSettings() { Indent = true }); + Xmlization.Serialize.To( + _aasEnv, writer); + writer.Flush(); + writer.Close(); + s.Flush(); + } + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + } + + public Stream GetStreamFromUriOrLocalPackage(string uriString, + FileMode mode = FileMode.Open, + FileAccess access = FileAccess.Read) + { + // local + if (IsLocalFile(uriString)) + return GetLocalStreamFromPackage(uriString, mode, access); + + // no .. + return System.IO.File.Open(uriString, mode, access); + } + + public byte[] GetByteArrayFromUriOrLocalPackage(string uriString) + { + try + { + using (var input = GetStreamFromUriOrLocalPackage(uriString)) + { + using (MemoryStream ms = new MemoryStream()) + { + input.CopyTo(ms); + return ms.ToArray(); + } + } + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); + return null; + } + } + + public bool IsLocalFile(string uriString) + { + // access + if (_openPackage == null) + return false; + if (uriString == null || uriString == "" || !uriString.StartsWith("/")) + return false; + + // check + var isLocal = _openPackage.PartExists(new Uri(uriString, UriKind.RelativeOrAbsolute)); + return isLocal; + } + + public Stream GetLocalStreamFromPackage(string uriString, FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read) + { + // access + if (_openPackage == null) + throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); + + // exist + var puri = new Uri(uriString, UriKind.RelativeOrAbsolute); + if (!_openPackage.PartExists(puri)) + throw (new Exception(string.Format($"AASX Package has no part {uriString}. Aborting!"))); + + // get part + var part = _openPackage.GetPart(puri); + if (part == null) + throw (new Exception( + string.Format($"Cannot access part {uriString} in {_fn}. Aborting!"))); + return part.GetStream(mode, access); + } + + public long GetStreamSizeFromPackage(string uriString) + { + long res = 0; + try + { + if (_openPackage == null) + return 0; + var part = _openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); + using (var s = part.GetStream(FileMode.Open)) + { + res = s.Length; + } + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + return 0; + } + return res; + } + + /// + /// Ensures: + ///
  • result == null || result.CanRead
+ ///
+ public Stream GetLocalThumbnailStream(ref Uri thumbUri) + { + // access + if (_openPackage == null) + throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); + // get the thumbnail over the relationship + PackagePart thumbPart = null; + var xs = _openPackage.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + thumbPart = _openPackage.GetPart(x.TargetUri); + thumbUri = x.TargetUri; + break; + } + if (thumbPart == null) + throw (new Exception("Unable to find AASX thumbnail. Aborting!")); + + var result = thumbPart.GetStream(FileMode.Open); + + // Post-condition + if (!(result == null || result.CanRead)) + { + throw new InvalidOperationException("Unexpected unreadable result stream"); + } + + return result; + } + + /// + /// Ensures: + ///
  • result == null || result.CanRead
+ ///
+ public Stream GetLocalThumbnailStream() + { + Uri dummy = null; + var result = GetLocalThumbnailStream(ref dummy); + + // Post-condition + if (!(result == null || result.CanRead)) + { + throw new InvalidOperationException("Unexpected unreadable result stream"); + } + + return result; + } + + public ListOfAasSupplementaryFile GetListOfSupplementaryFiles() + { + // new result + var result = new ListOfAasSupplementaryFile(); + + // access + if (_openPackage != null) + { + + // get the thumbnail(s) from the package + var xs = _openPackage.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + result.Add(new AdminShellPackageSupplementaryFile( + x.TargetUri, + location: AdminShellPackageSupplementaryFile.LocationType.InPackage, + specialHandling: AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); + } + + // get the origin from the package + PackagePart originPart = null; + xs = _openPackage.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = _openPackage.GetPart(x.TargetUri); + break; + } + + if (originPart != null) + { + // get the specs from the origin + PackagePart specPart = null; + xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specPart = _openPackage.GetPart(x.TargetUri); + break; + } + + if (specPart != null) + { + // get the supplementaries from the package, derived from spec + xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + { + result.Add( + new AdminShellPackageSupplementaryFile( + x.TargetUri, location: AdminShellPackageSupplementaryFile.LocationType.InPackage)); + } + } + } + } + + // add or modify the files to delete + foreach (var psfDel in _pendingFilesToDelete) + { + // already in + var found = result.Find(x => { return x.Uri == psfDel.Uri; }); + if (found != null) + found.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; + else + { + psfDel.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; + result.Add(psfDel); + } + } + + // add the files to store as well + foreach (var psfAdd in _pendingFilesToAdd) + { + // already in (should not happen ?!) + var found = result.Find(x => { return x.Uri == psfAdd.Uri; }); + if (found != null) + found.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; + else + { + psfAdd.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; + result.Add(psfAdd); + } + } + + // done + return result; + } + + public static string GuessMimeType(string fn) + { + var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); + var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; + if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; + if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; + if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; + if (file_ext == ".igs") content_type = "application/iges"; + if (file_ext == ".iges") content_type = "application/iges"; + if (file_ext == ".stp") content_type = "application/step"; + if (file_ext == ".step") content_type = "application/step"; + if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; + if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; + if (file_ext == ".png") content_type = "image/png"; + if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; + return content_type; + } + + public void PrepareSupplementaryFileParameters(ref string targetDir, ref string targetFn) + { + // re-work target dir + if (targetDir != null) + targetDir = targetDir.Replace(@"\", "/"); + + // rework targetFn + if (targetFn != null) + targetFn = Regex.Replace(targetFn, @"[^A-Za-z0-9-.]+", "_"); + } + + /// + /// Add a file as supplementary file to package. Operation will be pending, package needs to be saved in order + /// materialize embedding. + /// + /// Target path of file in package + public string AddSupplementaryFileToStore( + string sourcePath, string targetDir, string targetFn, bool embedAsThumb, + AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) + { + // beautify parameters + if ((sourcePath == null && sourceGetBytesDel == null) || targetDir == null || targetFn == null) + return null; + + // build target path + targetDir = targetDir.Trim(); + if (!targetDir.EndsWith("/")) + targetDir += "/"; + targetFn = targetFn.Trim(); + if (sourcePath == "" || targetDir == "" || targetFn == "") + throw (new Exception("Trying add supplementary file with empty name or path!")); + + var targetPath = "" + targetDir.Trim() + targetFn.Trim(); + + // base function + AddSupplementaryFileToStore(sourcePath, targetPath, embedAsThumb, sourceGetBytesDel, useMimeType); + + // return target path + return targetPath; + } + + public void AddSupplementaryFileToStore(string sourcePath, string targetPath, bool embedAsThumb, + AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) + { + // beautify parameters + if ((sourcePath == null && sourceGetBytesDel == null) || targetPath == null) + return; + + sourcePath = sourcePath?.Trim(); + targetPath = targetPath.Trim(); + + // add record + _pendingFilesToAdd.Add( + new AdminShellPackageSupplementaryFile( + new Uri(targetPath, UriKind.RelativeOrAbsolute), + sourcePath, + location: AdminShellPackageSupplementaryFile.LocationType.AddPending, + specialHandling: (embedAsThumb + ? AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail + : AdminShellPackageSupplementaryFile.SpecialHandlingType.None), + sourceGetBytesDel: sourceGetBytesDel, + useMimeType: useMimeType) + ); + + } + + public void DeleteSupplementaryFile(AdminShellPackageSupplementaryFile psf) + { + if (psf == null) + throw (new Exception("No supplementary file given!")); + + if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.AddPending) + { + // is still pending in add list -> remove + _pendingFilesToAdd.RemoveAll((x) => { return x.Uri == psf.Uri; }); + } + + if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.InPackage) + { + // add to pending delete list + _pendingFilesToDelete.Add(psf); + } + } + + public void Close() + { + _openPackage?.Close(); + _openPackage = null; + _fn = ""; + _aasEnv = null; + } + + public void Flush() + { + if (_openPackage != null) + _openPackage.Flush(); + } + + public void Dispose() + { + Close(); + } + + public string MakePackageFileAvailableAsTempFile(string packageUri, bool keepFilename = false) + { + // access + if (packageUri == null) + return null; + + // get input stream + using (var input = GetLocalStreamFromPackage(packageUri)) + { + // generate tempfile name + string tempext = System.IO.Path.GetExtension(packageUri); + string temppath = System.IO.Path.GetTempFileName().Replace(".tmp", tempext); + + // maybe modify tempfile name? + if (keepFilename) + { + var masterFn = System.IO.Path.GetFileNameWithoutExtension(packageUri); + var tmpDir = System.IO.Path.GetDirectoryName(temppath); + var tmpFnExt = System.IO.Path.GetFileName(temppath); + + temppath = System.IO.Path.Combine(tmpDir, "" + masterFn + "_" + tmpFnExt); + } + + // copy to temp file + using (var temp = System.IO.File.OpenWrite(temppath)) + { + input.CopyTo(temp); + return temppath; + } + } + } + + } +} diff --git a/src/AasxCsharpLibrary/AdminShellUtil.cs b/src/AasxCsharpLibrary/AdminShellUtil.cs index 864a742ef..ad78e0ead 100644 --- a/src/AasxCsharpLibrary/AdminShellUtil.cs +++ b/src/AasxCsharpLibrary/AdminShellUtil.cs @@ -7,20 +7,181 @@ This source code is licensed under the Apache License 2.0 (see LICENSE.txt). This source code may use other Open Source software components (see LICENSE.txt). */ +using AasCore.Aas3_0_RC02; +using Extensions; using System; using System.Collections; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; +using static AasxCompatibilityModels.AdminShellV20.SubmodelElementWrapper; +using static Extensions.ExtendIDataSpecificationContent; namespace AdminShellNS { public static class AdminShellUtil { + + #region Various utilities + // ------------------------------------------------------------------------------------ + + public static T[] GetEnumValues() where T : Enum + => (T[])Enum.GetValues(typeof(T)); + + public static IEnumerable GetEnumValues(T[] excludes) where T : Enum + { + foreach (var v in (T[])Enum.GetValues(typeof(T))) + if (!excludes.Contains(v)) + yield return v; + } + + #endregion + + #region V3 Methods + + public static string[] GetPopularMimeTypes() + { + return + new[] { + System.Net.Mime.MediaTypeNames.Text.Plain, + System.Net.Mime.MediaTypeNames.Text.Xml, + System.Net.Mime.MediaTypeNames.Text.Html, + "application/json", + "application/rdf+xml", + System.Net.Mime.MediaTypeNames.Application.Pdf, + System.Net.Mime.MediaTypeNames.Image.Jpeg, + "image/png", + System.Net.Mime.MediaTypeNames.Image.Gif, + "application/iges", + "application/step" + }; + } + + public static IEnumerable GetAdequateEnums(AasSubmodelElements[] excludeValues = null, AasSubmodelElements[] includeValues = null) + { + if (includeValues != null) + { + foreach (var en in includeValues) + yield return en; + } + else + { + foreach (var en in (AasSubmodelElements[])Enum.GetValues(typeof(AasSubmodelElements))) + { + if (en == AasSubmodelElements.SubmodelElement) + continue; + if (excludeValues != null && excludeValues.Contains(en)) + continue; + yield return en; + } + } + } + + public static AasSubmodelElements? AasSubmodelElementsFrom() where T : ISubmodelElement + { + if (typeof(T) == typeof(Property)) + return AasSubmodelElements.Property; + if (typeof(T) == typeof(MultiLanguageProperty)) + return AasSubmodelElements.MultiLanguageProperty; + if (typeof(T) == typeof(AasCore.Aas3_0_RC02.Range)) + return AasSubmodelElements.Range; + if (typeof(T) == typeof(AasCore.Aas3_0_RC02.File)) + return AasSubmodelElements.File; + if (typeof(T) == typeof(Blob)) + return AasSubmodelElements.Blob; + if (typeof(T) == typeof(ReferenceElement)) + return AasSubmodelElements.ReferenceElement; + if (typeof(T) == typeof(RelationshipElement)) + return AasSubmodelElements.RelationshipElement; + if (typeof(T) == typeof(AnnotatedRelationshipElement)) + return AasSubmodelElements.AnnotatedRelationshipElement; + if (typeof(T) == typeof(Capability)) + return AasSubmodelElements.Capability; + if (typeof(T) == typeof(SubmodelElementCollection)) + return AasSubmodelElements.SubmodelElementCollection; + if (typeof(T) == typeof(Operation)) + return AasSubmodelElements.Operation; + if (typeof(T) == typeof(BasicEventElement)) + return AasSubmodelElements.BasicEventElement; + if (typeof(T) == typeof(Entity)) + return AasSubmodelElements.Entity; + return null; + } + + + public static ISubmodelElement CreateSubmodelElementFromEnum(AasSubmodelElements smeEnum, ISubmodelElement sourceSme = null) + { + switch (smeEnum) + { + case AasSubmodelElements.Property: + { + return new Property(DataTypeDefXsd.String).UpdateFrom(sourceSme); + } + case AasSubmodelElements.MultiLanguageProperty: + { + return new MultiLanguageProperty().UpdateFrom(sourceSme); + } + case AasSubmodelElements.Range: + { + return new AasCore.Aas3_0_RC02.Range(DataTypeDefXsd.String).UpdateFrom(sourceSme); + } + case AasSubmodelElements.File: + { + return new AasCore.Aas3_0_RC02.File("").UpdateFrom(sourceSme); + } + case AasSubmodelElements.Blob: + { + return new Blob("").UpdateFrom(sourceSme); + } + case AasSubmodelElements.ReferenceElement: + { + return new ReferenceElement().UpdateFrom(sourceSme); + } + case AasSubmodelElements.RelationshipElement: + { + return new RelationshipElement(null, null).UpdateFrom(sourceSme); + } + case AasSubmodelElements.AnnotatedRelationshipElement: + { + return new AnnotatedRelationshipElement(null, null).UpdateFrom(sourceSme); + } + case AasSubmodelElements.Capability: + { + return new Capability(); + } + case AasSubmodelElements.SubmodelElementCollection: + { + return new SubmodelElementCollection().UpdateFrom(sourceSme); + } + case AasSubmodelElements.SubmodelElementList: + { + return new SubmodelElementList(AasSubmodelElements.SubmodelElement).UpdateFrom(sourceSme); + } + case AasSubmodelElements.Operation: + { + return new Operation().UpdateFrom(sourceSme); + } + case AasSubmodelElements.BasicEventElement: + { + return new BasicEventElement(null, Direction.Input, StateOfEvent.Off); + } + case AasSubmodelElements.Entity: + { + return new Entity(EntityType.SelfManagedEntity); + } + default: + { + return null; + } + } + } + + #endregion public static string EvalToNonNullString(string fmt, object o, string elseString = "") { if (o == null) @@ -35,6 +196,31 @@ public static string EvalToNonEmptyString(string fmt, string o, string elseStrin return string.Format(fmt, o); } + /// + /// If len of exceeds then + /// string is shortened and returned with an ellipsis(…) at the end. + /// + /// Shortened string + public static string ShortenWithEllipses(string str, int maxLen) + { + if (str == null) + return null; + if (maxLen >= 0 && str.Length > maxLen) + str = str.Substring(0, maxLen) + "\u2026"; + return str; + } + + /// + /// Returns a string without newlines and shortened (with ellipsis) + /// to a certain length + /// + /// Single-line, shortened string + public static string ToSingleLineShortened(string str, int maxLen, string textNewLine = " ") + { + str = str.ReplaceLineEndings(textNewLine); + return ShortenWithEllipses(str, maxLen); + } + /// Creates a filter-friendly name from the source. /// /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); @@ -185,7 +371,7 @@ public static string[] CleanHereStringToArray(string here) public static string CleanHereStringWithNewlines(string here, string nl = null) { if (nl == null) - nl = Environment.NewLine; + nl = System.Environment.NewLine; var lines = CleanHereStringToArray(here); if (lines == null) return null; @@ -267,287 +453,148 @@ public static string CorrectCasingForConstantStringArray(string[] arr, string st } // - // - // - // + // String manipulations // - public static void PrintSearchableProperties(object obj, int indent) + public static string ReplacePercentPlaceholder( + string input, + string searchFor, + Func substLamda, + StringComparison comparisonType = StringComparison.InvariantCulture) { - if (obj == null) return; - string indentString = new string(' ', indent); - Type objType = obj.GetType(); - PropertyInfo[] properties = objType.GetProperties(); - foreach (PropertyInfo property in properties) + // access + if (input == null || searchFor == null || searchFor == "") + return input; + + // find + while (true) { - object propValue = property.GetValue(obj, null); - var elems = propValue as IList; - if (elems != null) - { - foreach (var item in elems) - { - PrintSearchableProperties(item, indent + 3); - } - } - else - { - // This will not cut-off System.Collections because of the first check - if (property.PropertyType.Assembly == objType.Assembly) - { - Console.WriteLine("{0}{1}:", indentString, property.Name); + // any occurence + var p = input.IndexOf(searchFor, comparisonType); + if (p < 0) + break; - PrintSearchableProperties(propValue, indent + 2); - } - else - { - Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue); - } - } - } - } + // split + var left = input.Substring(0, p); + var right = ""; + var rp = p + searchFor.Length; + if (rp < input.Length) + right = input.Substring(rp); - public class SearchOptions - { - public Assembly[] allowedAssemblies = null; - public int maxDepth = int.MaxValue; - public bool findFirst = false; - public int skipFirstResults = 0; - public string findText = null; - public bool isIgnoreCase = false; - public bool isRegex = false; - } + // lambda + var repl = "" + substLamda?.Invoke(); - public class SearchResultItem : IEquatable - { - public SearchOptions searchOptions; - public string qualifiedNameHead; - public string metaModelName; - public object businessObject; - public string foundText; - public object foundObject; - public object containingObject; - public int foundHash; - - public bool Equals(SearchResultItem other) - { - if (other == null) - return false; - - return this.qualifiedNameHead == other.qualifiedNameHead && - this.metaModelName == other.metaModelName && - this.businessObject == other.businessObject && - this.containingObject == other.containingObject && - this.foundText == other.foundText && - this.foundHash == other.foundHash; + // build new + input = left + repl + right; } - } - public class SearchResults - { - public int foundIndex = 0; - public List foundResults = new List(); - - public void Clear() - { - foundIndex = -1; - foundResults.Clear(); - } + // ok + return input; } - public static void CheckSearchable( - SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, - MemberInfo mi, object memberValue, object containingObject, Func getMemberHash) - { - // try get a speaking name - var metaModelName = ""; - var x1 = mi.GetCustomAttribute(); - if (x1 != null && x1.name != null) - metaModelName = x1.name; - - // check if this object is searchable - var x2 = mi.GetCustomAttribute(); - if (x2 != null) - { - // what to check? - string foundText = "" + memberValue?.ToString(); - - // find options - var found = true; - if (options.findText != null) - found = foundText.IndexOf( - options.findText, options.isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; - - // add? - if (found) - { - var sri = new SearchResultItem(); - sri.searchOptions = options; - sri.qualifiedNameHead = qualifiedNameHead; - sri.metaModelName = metaModelName; - sri.businessObject = businessObject; - sri.foundText = foundText; - sri.foundObject = memberValue; - sri.containingObject = containingObject; - if (getMemberHash != null) - sri.foundHash = getMemberHash(); - - // avoid duplicates - if (!results.foundResults.Contains(sri)) - results.foundResults.Add(sri); - } - } - } + // + // Reflection + // - public static void EnumerateSearchable( - SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, - object businessObject = null) + public static void SetFieldLazyValue(FieldInfo f, object obj, object value) { // access - if (results == null || obj == null || options == null) - return; - Type objType = obj.GetType(); - - // depth - if (depth > options.maxDepth) + if (f == null || obj == null) return; - // try to get element name of an AAS entity - string elName = null; - if (obj is AdminShell.Referable) + switch (Type.GetTypeCode(f.FieldType)) { - elName = (obj as AdminShell.Referable).GetElementName(); - businessObject = obj; - } - - // enrich qualified name, accordingly - var qualifiedName = qualifiedNameHead; - if (elName != null) - qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; + case TypeCode.String: + f.SetValue(obj, "" + value); + break; - // do NOT dive into objects, which are not in the reight assembly - if (options.allowedAssemblies == null || !options.allowedAssemblies.Contains(objType.Assembly)) - return; + case TypeCode.Byte: + if (Byte.TryParse("" + value, out var ui8)) + f.SetValue(obj, ui8); + break; - // do not dive into enums - if (objType.IsEnum) - return; + case TypeCode.SByte: + if (SByte.TryParse("" + value, out var i8)) + f.SetValue(obj, i8); + break; - // look at fields, first - var fields = objType.GetFields(); - foreach (var fi in fields) - { - // is the object marked to be skipped? - var x3 = fi.GetCustomAttribute(); - if (x3 != null) - continue; + case TypeCode.Int16: + if (Int16.TryParse("" + value, out var i16)) + f.SetValue(obj, i16); + break; - var x4 = fi.GetCustomAttribute(); - if (x4 != null) - continue; + case TypeCode.Int32: + if (Int32.TryParse("" + value, out var i32)) + f.SetValue(obj, i32); + break; - // get value(s) - var fieldValue = fi.GetValue(obj); - if (fieldValue == null) - continue; - var valueElems = fieldValue as IList; - if (valueElems != null) - { - // field is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, fi, fieldValue, obj, - () => { return fieldValue.GetHashCode(); }); + case TypeCode.Int64: + if (Int64.TryParse("" + value, out var i64)) + f.SetValue(obj, i64); + break; - // dive deeper .. - EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject); - } - } + case TypeCode.UInt16: + if (UInt16.TryParse("" + value, out var ui16)) + f.SetValue(obj, ui16); + break; - // properties & objects behind - var properties = objType.GetProperties(); - foreach (var pi in properties) - { - var gip = pi.GetIndexParameters(); - if (gip.Length > 0) - // no indexed properties, yet - continue; + case TypeCode.UInt32: + if (UInt32.TryParse("" + value, out var ui32)) + f.SetValue(obj, ui32); + break; - // is the object marked to be skipped? - var x3 = pi.GetCustomAttribute(); - if (x3 != null) - continue; + case TypeCode.UInt64: + if (UInt64.TryParse("" + value, out var ui64)) + f.SetValue(obj, ui64); + break; - var x4 = pi.GetCustomAttribute(); - if (x4 != null) - continue; + case TypeCode.Single: + if (Single.TryParse("" + value, NumberStyles.Float, + CultureInfo.InvariantCulture, out var sgl)) + f.SetValue(obj, sgl); + break; - // get value(s) - var propValue = pi.GetValue(obj, null); - if (propValue == null) - continue; - var valueElems = propValue as IList; - if (valueElems != null) - { - // property is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, pi, propValue, obj, - () => { return propValue.GetHashCode(); }); + case TypeCode.Double: + if (Double.TryParse("" + value, NumberStyles.Float, + CultureInfo.InvariantCulture, out var dbl)) + f.SetValue(obj, dbl); + break; - // dive deeper .. - EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject); - } + case TypeCode.Boolean: + var isFalse = value == null + || (value is int vi && vi == 0) + || (value is string vs && vs == "") + || (value is bool vb && !vb); + f.SetValue(obj, isFalse); + break; } } // - // String manipulations + // some URL enabled path handling // - public static string ReplacePercentPlaceholder( - string input, - string searchFor, - Func substLamda, - StringComparison comparisonType = StringComparison.InvariantCulture) + /// + /// Uses System.IO.Path.GetExtension() to determine the extension part + /// of a path. If a URL based query is added to the extension, remove this. + /// + public static string GetExtensionWoQuery(string fn) { // access - if (input == null || searchFor == null || searchFor == "") - return input; - - // find - while (true) - { - // any occurence - var p = input.IndexOf(searchFor, comparisonType); - if (p < 0) - break; - - // split - var left = input.Substring(0, p); - var right = ""; - var rp = p + searchFor.Length; - if (rp < input.Length) - right = input.Substring(rp); + if (fn == null) + return null; - // lambda - var repl = "" + substLamda?.Invoke(); + // use system function + var ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - // build new - input = left + repl + right; - } + // as URLs *might* have an extension, but a loto f query string afterwards, + // lets try to cut of it + var extMatch = Regex.Match(ext, @"([._A-Za-z0-9]+)"); + if (extMatch.Success) + ext = extMatch.Groups[1].ToString(); // ok - return input; + return ext; } // @@ -630,5 +677,29 @@ public static string GenerateIdAccordingTemplate(string tpl) return id; } + public static string RemoveNewLinesAndLimit(string input, int maxLength = -1, string ellipsis = "..") + { + // access + if (input == null) + return null; + + // maybe do a generouse limit first + if (maxLength >= 1 && input.Length > 2 * maxLength) + input = input.Substring(0, 2 * maxLength); + + // now do expensive operations + input = input.Replace('\r', ' '); + input = input.Replace('\n', ' '); + input = Regex.Replace(input, @"\s+", " ", RegexOptions.Compiled); + + // now apply exact limit + if (maxLength >= 1 && input.Length > maxLength) + input = input.Substring(0, maxLength) + ellipsis; + + // ok + return input; + } + + } } diff --git a/src/AasxCsharpLibrary/AdminShellValidate.cs b/src/AasxCsharpLibrary/AdminShellValidate.cs index 48b1277af..938c91c57 100644 --- a/src/AasxCsharpLibrary/AdminShellValidate.cs +++ b/src/AasxCsharpLibrary/AdminShellValidate.cs @@ -22,6 +22,8 @@ This source code may use other Open Source software components (see LICENSE.txt) using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Schema; +using AasCore.Aas3_0_RC02; +using Environment = System.Environment; namespace AdminShellNS { @@ -91,12 +93,12 @@ public enum AasValidationAction public class AasValidationRecord { public AasValidationSeverity Severity = AasValidationSeverity.Hint; - public AdminShell.Referable Source = null; + public IReferable Source = null; public string Message = ""; public Action Fix = null; - public AasValidationRecord(AasValidationSeverity Severity, AdminShell.Referable Source, + public AasValidationRecord(AasValidationSeverity Severity, IReferable Source, string Message, Action Fix = null) { this.Severity = Severity; diff --git a/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs b/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs new file mode 100644 index 000000000..5920e6f6d --- /dev/null +++ b/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminShellNS.Display +{ + public class EnumerationPlacmentBase + { + + } +} diff --git a/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs b/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs new file mode 100644 index 000000000..b6d0e3a0a --- /dev/null +++ b/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs @@ -0,0 +1,15 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminShellNS.Display +{ + public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase + { + public OperationVariableDirection Direction; + public OperationVariable OperationVariable; + } +} diff --git a/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs b/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs new file mode 100644 index 000000000..d64f9c794 --- /dev/null +++ b/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminShellNS.Display +{ + public enum OperationVariableDirection + { + In, + Out, + InOut + } +} diff --git a/src/AasxCsharpLibrary/Exceptions/NullValueException.cs b/src/AasxCsharpLibrary/Exceptions/NullValueException.cs new file mode 100644 index 000000000..13c12bef1 --- /dev/null +++ b/src/AasxCsharpLibrary/Exceptions/NullValueException.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminShellNS.Exceptions +{ + public class NullValueException : Exception + { + public NullValueException(string field) : base($"The field {field} is null!!") + { + + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs b/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs new file mode 100644 index 000000000..c62e26590 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs @@ -0,0 +1,29 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public class AasElementSelfDescription + { + public string AasElementName { get; set; } + + public string ElementAbbreviation { get; set; } + + public KeyTypes? KeyType { get; set; } + + public AasSubmodelElements? SmeType { get; set; } + + public AasElementSelfDescription(string aasElementName, string elementAbbreviation, + KeyTypes? keyType, AasSubmodelElements? smeType) + { + AasElementName = aasElementName; + ElementAbbreviation = elementAbbreviation; + KeyType = keyType; + SmeType = smeType; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs b/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs new file mode 100644 index 000000000..7becf56cb --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs @@ -0,0 +1,57 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public class ComparerIdShort : IComparer + { + public int Compare(IReferable a, IReferable b) + { + return string.Compare(a?.IdShort, b?.IdShort, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); + } + } + + public class ComparerIdentification : IComparer + { + public int Compare(IIdentifiable a, IIdentifiable b) + { + return string.Compare(a.Id, b.Id, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); + } + } + + public class ComparerIndexed : IComparer + { + public int NullIndex = int.MaxValue; + public Dictionary Index = new(); + + public int Compare(IReferable a, IReferable b) + { + var ca = Index.ContainsKey(a); + var cb = Index.ContainsKey(b); + + if (!ca && !cb) + return 0; + // make CDs without usage to appear at end of list + if (!ca) + return +1; + if (!cb) + return -1; + + var ia = Index[a]; + var ib = Index[b]; + + if (ia == ib) + return 0; + if (ia < ib) + return -1; + return +1; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs new file mode 100644 index 000000000..85df6ed8e --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; +using Extensions; +using AdminShellNS.Display; + +namespace Extensions +{ + public static class ExtendAnnotatedRelationshipElement + { + #region AasxPackageExplorer + + public static void Add(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) + { + if (annotatedRelationshipElement != null) + { + annotatedRelationshipElement.Annotations ??= new(); + + submodelElement.Parent = annotatedRelationshipElement; + + annotatedRelationshipElement.Annotations.Add((IDataElement)submodelElement); + } + } + + public static void Remove(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) + { + if (annotatedRelationshipElement != null) + { + if (annotatedRelationshipElement.Annotations != null) + { + annotatedRelationshipElement.Annotations.Remove((IDataElement)submodelElement); + } + } + } + + public static object AddChild(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null || childSubmodelElement is not IDataElement) + return null; + + annotatedRelationshipElement.Annotations ??= new(); + + if (childSubmodelElement != null) + childSubmodelElement.Parent = annotatedRelationshipElement; + + annotatedRelationshipElement.Annotations.Add((IDataElement)childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static AnnotatedRelationshipElement ConvertAnnotationsFromV20(this AnnotatedRelationshipElement annotatedRelationshipElement, AasxCompatibilityModels.AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelElement) + { + if (sourceAnnotedRelElement == null) + { + return null; + } + + if (sourceAnnotedRelElement.annotations != null) + { + annotatedRelationshipElement.Annotations ??= new List(); + foreach (var submodelElementWrapper in sourceAnnotedRelElement.annotations) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); + } + annotatedRelationshipElement.Annotations.Add((IDataElement)outputSubmodelElement); + } + } + + return annotatedRelationshipElement; + } + + public static T FindFirstIdShortAs(this AnnotatedRelationshipElement annotedRelationshipElement, string idShort) where T : ISubmodelElement + { + + var submodelElements = annotedRelationshipElement.Annotations.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); + + if (submodelElements.Any()) + { + return (T)submodelElements.First(); + } + + return default; + } + + public static AnnotatedRelationshipElement Set(this AnnotatedRelationshipElement elem, + Reference first, Reference second) + { + elem.First = first; + elem.Second = second; + return elem; + } + + public static AnnotatedRelationshipElement UpdateFrom( + this AnnotatedRelationshipElement elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is ReferenceElement srcRef) + { + if (srcRef.Value != null) + elem.First = srcRef.Value.Copy(); + } + + if (source is RelationshipElement srcRel) + { + if (srcRel.First != null) + elem.First = srcRel.First.Copy(); + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs b/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs new file mode 100644 index 000000000..d2bb07e4f --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs @@ -0,0 +1,242 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendAssetAdministrationShell + { + #region AasxPackageExplorer + + public static Tuple ToCaptionInfo(this AssetAdministrationShell assetAdministrationShell) + { + var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", assetAdministrationShell.IdShort, "\"AAS\""); + if (assetAdministrationShell.Administration != null) + caption += "V" + assetAdministrationShell.Administration.Version + "." + assetAdministrationShell.Administration.Revision; + + var info = ""; + if (assetAdministrationShell.Id != null) + info = $"[{assetAdministrationShell.Id}]"; + return Tuple.Create(caption, info); + } + + public static IEnumerable FindAllReferences(this AssetAdministrationShell assetAdministrationShell) + { + // Asset + //TODO (jtikekar, 0000-00-00): support asset + //if (assetAdministrationShell.AssetInformation != null) + // yield return new LocatedReference(assetAdministrationShell, assetAdministrationShell.AssetInformation); + + // Submodel references + if (assetAdministrationShell.Submodels != null) + foreach (var r in assetAdministrationShell.Submodels) + yield return new LocatedReference(assetAdministrationShell, r); + + } + + #endregion + + public static bool HasSubmodelReference(this AssetAdministrationShell assetAdministrationShell, Reference submodelReference) + { + if (submodelReference == null) + { + return false; + } + + foreach (var aasSubmodelReference in assetAdministrationShell.Submodels) + { + if (aasSubmodelReference.Matches(submodelReference)) + { + return true; + } + } + + return false; + } + + public static void AddSubmodelReference(this AssetAdministrationShell assetAdministrationShell, Reference newSubmodelReference) + { + if (assetAdministrationShell.Submodels == null) + { + assetAdministrationShell.Submodels = new List(); + } + + assetAdministrationShell.Submodels.Add(newSubmodelReference); + } + + //TODO (jtikekar, 0000-00-00): Change the name, currently based on older implementation + public static string GetFriendlyName(this AssetAdministrationShell assetAdministrationShell) + { + if (string.IsNullOrEmpty(assetAdministrationShell.IdShort)) + { + return null; + } + + return Regex.Replace(assetAdministrationShell.IdShort, @"[^a-zA-Z0-9\-_]", "_"); + } + + public static AssetAdministrationShell ConvertFromV10(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV10.AdministrationShell sourceAas) + { + if (sourceAas == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceAas.idShort)) + { + assetAdministrationShell.IdShort = ""; + } + else + { + assetAdministrationShell.IdShort = sourceAas.idShort; + } + + if (sourceAas.description != null) + { + assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceAas.description); + } + + if (sourceAas.administration != null) + { + assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); + } + + if (sourceAas.derivedFrom != null) + { + var key = new Key(KeyTypes.AssetAdministrationShell, sourceAas.identification.id); + assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ModelReference, new List() { key }); + } + + if (sourceAas.submodelRefs != null || sourceAas.submodelRefs.Count != 0) + { + foreach (var submodelRef in sourceAas.submodelRefs) + { + var keyList = new List(); + foreach (var refKey in submodelRef.Keys) + { + //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + if (assetAdministrationShell.Submodels == null) + { + assetAdministrationShell.Submodels = new List(); + } + assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); + } + } + + if (sourceAas.hasDataSpecification != null) + { + //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) + if (assetAdministrationShell.EmbeddedDataSpecifications == null) + { + assetAdministrationShell.EmbeddedDataSpecifications = new List(); + } + foreach (var dataSpecification in sourceAas.hasDataSpecification.reference) + { + assetAdministrationShell.EmbeddedDataSpecifications.Add(new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.GlobalReference), + null)); + } + } + + return assetAdministrationShell; + } + + public static AssetAdministrationShell ConvertFromV20(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV20.AdministrationShell sourceAas) + { + if (sourceAas == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceAas.idShort)) + { + assetAdministrationShell.IdShort = ""; + } + else + { + assetAdministrationShell.IdShort = sourceAas.idShort; + } + + if (sourceAas.description != null) + { + assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceAas.description); + } + + if (sourceAas.administration != null) + { + assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); + } + + if (sourceAas.derivedFrom != null) + { + var key = new Key(KeyTypes.AssetAdministrationShell, sourceAas.identification.id); + assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ModelReference, new List() { key }); + } + + if (sourceAas.submodelRefs != null || sourceAas.submodelRefs.Count != 0) + { + foreach (var submodelRef in sourceAas.submodelRefs) + { + var keyList = new List(); + foreach (var refKey in submodelRef.Keys) + { + //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + if (assetAdministrationShell.Submodels == null) + { + assetAdministrationShell.Submodels = new List(); + } + assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); + } + } + + if (sourceAas.hasDataSpecification != null) + { + //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) + if (assetAdministrationShell.EmbeddedDataSpecifications == null) + { + assetAdministrationShell.EmbeddedDataSpecifications = new List(); + } + + //TODO (jtikekar, 0000-00-00): DataSpecificationContent?? (as per old implementation) + foreach (var sourceDataSpec in sourceAas.hasDataSpecification) + { + if (sourceDataSpec.dataSpecification != null) + { + assetAdministrationShell.EmbeddedDataSpecifications.Add( + new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV20(sourceDataSpec.dataSpecification, ReferenceTypes.GlobalReference), + null)); + } + } + } + + return assetAdministrationShell; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs b/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs new file mode 100644 index 000000000..5cd477fb3 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs @@ -0,0 +1,62 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendAssetInformation + { + #region AasxPackageExplorer + + public static Tuple ToCaptionInfo(this AssetInformation assetInformation) + { + //TODO (jtikekar, 0000-00-00): support KeyType.AssetInformation + //var caption = Key.AssetInformation; + var caption = "AssetInformation"; + var info = "" + assetInformation.GlobalAssetId?.ToStringExtended(); + return Tuple.Create(caption, info); + } + + #endregion + public static AssetInformation ConvertFromV10(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV10.Asset sourceAsset) + { + //Determine AssetKind + var assetKind = AssetKind.Instance; + if (sourceAsset.kind.IsType) + { + assetKind = AssetKind.Type; + } + + assetInformation.AssetKind = assetKind; + + + //Assign GlobalAssetId + var key = new Key(KeyTypes.GlobalReference, sourceAsset.identification.id); + assetInformation.GlobalAssetId = new Reference(ReferenceTypes.GlobalReference, new List { key }); + + return assetInformation; + } + + public static AssetInformation ConvertFromV20(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV20.Asset sourceAsset) + { + //Determine AssetKind + var assetKind = AssetKind.Instance; + if (sourceAsset.kind.IsType) + { + assetKind = AssetKind.Type; + } + + assetInformation.AssetKind = assetKind; + + + //Assign GlobalAssetId + var key = new Key(KeyTypes.GlobalReference, sourceAsset.identification.id); + assetInformation.GlobalAssetId = new Reference(ReferenceTypes.GlobalReference, new List { key }); + + return assetInformation; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs b/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs new file mode 100644 index 000000000..b49adce56 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs @@ -0,0 +1,69 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendBlob + { + public static void Set(this Blob blob, + string contentType = "", byte[]? value = null) + { + blob.ContentType = contentType; + blob.Value = value; + } + + public static Blob ConvertFromV10(this Blob blob, AasxCompatibilityModels.AdminShellV10.Blob sourceBlob) + { + blob.ContentType = sourceBlob.mimeType; + blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); + return blob; + } + + public static Blob ConvertFromV20(this Blob blob, AasxCompatibilityModels.AdminShellV20.Blob sourceBlob) + { + blob.ContentType = sourceBlob.mimeType; + blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); + return blob; + } + + public static Blob UpdateFrom(this Blob elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + if (srcProp.Value != null) + elem.Value = Encoding.Default.GetBytes(srcProp.Value); + } + + if (source is AasCore.Aas3_0_RC02.Range srcRng) + { + if (srcRng.Min != null) + elem.Value = Encoding.Default.GetBytes(srcRng.Min); + } + + if (source is MultiLanguageProperty srcMlp) + { + var s = srcMlp.Value?.GetDefaultString(); + if (s != null) + elem.Value = Encoding.Default.GetBytes(s); + } + + if (source is File srcFile) + { + if (srcFile.Value != null) + elem.Value = Encoding.Default.GetBytes(srcFile.Value); + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs b/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs new file mode 100644 index 000000000..c0596928c --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs @@ -0,0 +1,299 @@ +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendConceptDescription + { + #region AasxPackageExplorer + + public static string GetDefaultPreferredName(this ConceptDescription conceptDescription, string defaultLang = null) + { + return "" + + conceptDescription.GetIEC61360()? + .PreferredName?.GetDefaultString(defaultLang); + } + + public static EmbeddedDataSpecification SetIEC61360Spec(this ConceptDescription conceptDescription, + string[] preferredNames = null, + string shortName = "", + string unit = "", + Reference unitId = null, + string valueFormat = null, + string sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + var eds = new EmbeddedDataSpecification( + new Reference(ReferenceTypes.GlobalReference, + new List { ExtendIDataSpecificationContent.GetKeyForIec61360() }), + new DataSpecificationIec61360( + ExtendLangStringSet.CreateManyFromStringArray(preferredNames), + new List { new LangString("EN?", shortName) }, + unit, + unitId, + sourceOfDefinition, + symbol, + Stringification.DataTypeIec61360FromString(dataType), + ExtendLangStringSet.CreateManyFromStringArray(definition) + )); + + conceptDescription.EmbeddedDataSpecifications = new List { eds }; + + // TODO (MIHO, 2022-12-22): Check, but I think it makes no sense + // conceptDescription.IsCaseOf ??= new List(); + // conceptDescription.IsCaseOf.Add(new Reference(ReferenceTypes.ModelReference, new List() { new Key(KeyTypes.ConceptDescription, conceptDescription.Id) })); + + return eds; + } + + /* + + public static DataSpecificationIec61360 CreateDataSpecWithContentIec61360(this ConceptDescription conceptDescription) + { + var eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); + conceptDescription.EmbeddedDataSpecification ??= new HasDataSpecification(); + conceptDescription.EmbeddedDataSpecification.Add(eds); + return eds.DataSpecificationContent?.DataSpecificationIEC61360; + } + + */ + + public static Tuple ToCaptionInfo(this ConceptDescription conceptDescription) + { + var caption = ""; + if (!string.IsNullOrEmpty(conceptDescription.IdShort)) + caption = $"\"{conceptDescription.IdShort.Trim()}\""; + if (conceptDescription.Id != null) + caption = (caption + " " + conceptDescription.Id).Trim(); + + var info = "" + conceptDescription.GetDefaultShortName(); + + return Tuple.Create(caption, info); + } + + public static string GetDefaultShortName(this ConceptDescription conceptDescription, string defaultLang = null) + { + return "" + + conceptDescription.GetIEC61360()? + .ShortName?.GetDefaultString(defaultLang); + } + + public static DataSpecificationIec61360 GetIEC61360(this ConceptDescription conceptDescription) + { + return conceptDescription.EmbeddedDataSpecifications?.GetIEC61360Content(); + } + + public static DataSpecificationPhysicalUnit GetPhysicalUnit(this ConceptDescription conceptDescription) + { + return conceptDescription.EmbeddedDataSpecifications?.GetPhysicalUnitContent(); + } + + public static IEnumerable FindAllReferences(this ConceptDescription conceptDescription) + { + yield break; + } + + #endregion + #region ListOfConceptDescription + public static ConceptDescription AddConceptDescriptionOrReturnExisting(this List conceptDescriptions, ConceptDescription newConceptDescription) + { + if (newConceptDescription == null) + { + return null; + } + if (conceptDescriptions != null) + { + var existingCd = conceptDescriptions.Where(c => c.Id == newConceptDescription.Id).First(); + if (existingCd != null) + { + return existingCd; + } + else + { + conceptDescriptions.Add(newConceptDescription); + } + } + + return newConceptDescription; + } + #endregion + + public static void Validate(this ConceptDescription conceptDescription, AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check CD itself + //Handled by BaseValidation Method + //conceptDescription.Validate(results); + + // check IEC61360 spec + + //TODO (jtikekar, 0000-00-00): Temporarily Removed + //var eds61360 = this.IEC61360DataSpec; + //if (eds61360 != null) + //{ + // // check data spec + // if (eds61360.dataSpecification == null || + // !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) + // results.Add(new AasValidationRecord( + // AasValidationSeverity.SpecViolation, this, + // "HasDataSpecification: data specification content set to IEC61360, but no " + + // "data specification reference set!", + // () => + // { + // eds61360.dataSpecification = new DataSpecificationRef( + // new Reference( + // DataSpecificationIEC61360.GetKey())); + // })); + + // // validate content + // if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) + // { + // results.Add(new AasValidationRecord( + // AasValidationSeverity.SpecViolation, this, + // "HasDataSpecification: data specification reference set to IEC61360, but no " + + // "data specification content set!", + // () => + // { + // eds61360.dataSpecificationContent = new DataSpecificationContent(); + // eds61360.dataSpecificationContent.dataSpecificationIEC61360 = + // new DataSpecificationIEC61360(); + // })); + // } + // else + // { + // // validate + // eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); + // } + } + + public static Key GetSingleKey(this ConceptDescription conceptDescription) + { + return new Key(KeyTypes.ConceptDescription, conceptDescription.Id); + } + public static ConceptDescription ConvertFromV10(this ConceptDescription conceptDescription, AasxCompatibilityModels.AdminShellV10.ConceptDescription sourceConceptDescription) + { + if (sourceConceptDescription == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceConceptDescription.idShort)) + { + conceptDescription.IdShort = ""; + } + else + { + conceptDescription.IdShort = sourceConceptDescription.idShort; + } + + if (sourceConceptDescription.description != null) + { + conceptDescription.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceConceptDescription.description); + } + + if (sourceConceptDescription.administration != null) + { + conceptDescription.Administration = new AdministrativeInformation(version: sourceConceptDescription.administration.version, revision: sourceConceptDescription.administration.revision); + } + + if (sourceConceptDescription.IsCaseOf != null && sourceConceptDescription.IsCaseOf.Count != 0) + { + if (conceptDescription.IsCaseOf == null) + { + conceptDescription.IsCaseOf = new List(); + } + foreach (var caseOf in sourceConceptDescription.IsCaseOf) + { + conceptDescription.IsCaseOf.Add(ExtensionsUtil.ConvertReferenceFromV10(caseOf, ReferenceTypes.ModelReference)); + } + } + + return conceptDescription; + } + + public static ConceptDescription ConvertFromV20(this ConceptDescription cd, AasxCompatibilityModels.AdminShellV20.ConceptDescription srcCD) + { + if (srcCD == null) + return null; + + if (string.IsNullOrEmpty(srcCD.idShort)) + cd.IdShort = ""; + else + cd.IdShort = srcCD.idShort; + + if (srcCD.identification?.id != null) + cd.Id = srcCD.identification.id; + + if (srcCD.description != null) + cd.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcCD.description); + + if (srcCD.administration != null) + cd.Administration = new AdministrativeInformation( + version: srcCD.administration.version, revision: srcCD.administration.revision); + + if (srcCD.IsCaseOf != null && srcCD.IsCaseOf.Count != 0) + { + if (cd.IsCaseOf == null) + { + cd.IsCaseOf = new List(); + } + foreach (var caseOf in srcCD.IsCaseOf) + { + cd.IsCaseOf.Add(ExtensionsUtil.ConvertReferenceFromV20(caseOf, ReferenceTypes.ModelReference)); + } + } + + //jtikekar:as per old implementation + if (srcCD.embeddedDataSpecification != null) + { + foreach (var sourceEsd in srcCD.embeddedDataSpecification) + { + var esd = new EmbeddedDataSpecification(null, null); + esd.ConvertFromV20(sourceEsd); + cd.AddEmbeddedDataSpecification(esd); + } + } + + return cd; + } + + public static EmbeddedDataSpecification AddEmbeddedDataSpecification(this ConceptDescription cd, EmbeddedDataSpecification eds) + { + if (cd == null) + return null; + if (cd.EmbeddedDataSpecifications == null) + cd.EmbeddedDataSpecifications = new List(); + if (eds == null) + return null; + cd.EmbeddedDataSpecifications.Add(eds); + return eds; + } + + public static Reference GetCdReference(this ConceptDescription conceptDescription) + { + var key = new Key(KeyTypes.ConceptDescription, conceptDescription.Id); + return new Reference(ReferenceTypes.ModelReference, new List { key }); + } + + public static void AddIsCaseOf(this ConceptDescription cd, + Reference ico) + { + if (cd.IsCaseOf == null) + cd.IsCaseOf = new List(); + cd.IsCaseOf.Add(ico); + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs new file mode 100644 index 000000000..fa87ef082 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs @@ -0,0 +1,19 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendDataElement + { + public static DataTypeDefXsd[] ValueTypes_Number = + new[] { DataTypeDefXsd.Decimal, DataTypeDefXsd.Double, DataTypeDefXsd.Float, + DataTypeDefXsd.Integer, DataTypeDefXsd.Long, DataTypeDefXsd.Int, DataTypeDefXsd.Short, + DataTypeDefXsd.Byte, DataTypeDefXsd.NonNegativeInteger, DataTypeDefXsd.NonPositiveInteger, + DataTypeDefXsd.UnsignedInt, DataTypeDefXsd.Integer, DataTypeDefXsd.UnsignedByte, + DataTypeDefXsd.UnsignedLong, DataTypeDefXsd.UnsignedShort, DataTypeDefXsd.NegativeInteger }; + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs new file mode 100644 index 000000000..86143d47f --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs @@ -0,0 +1,40 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendDataSpecificationIEC61360 + { + public static DataSpecificationIec61360 ConvertFromV20(this DataSpecificationIec61360 ds61360, AasxCompatibilityModels.AdminShellV20.DataSpecificationIEC61360 src616360) + { + if (src616360.preferredName != null) + ds61360.PreferredName = new List().ConvertFromV20(src616360.preferredName); + + if (src616360.shortName != null) + ds61360.ShortName = new List().ConvertFromV20(src616360.shortName); + + ds61360.Unit = src616360.unit; + if (src616360.unitId != null) + ds61360.UnitId = ExtensionsUtil.ConvertReferenceFromV20(AasxCompatibilityModels.AdminShellV20.Reference.CreateNew(src616360.unitId.keys), ReferenceTypes.GlobalReference); + + ds61360.ValueFormat = src616360.valueFormat; + ds61360.SourceOfDefinition = src616360.sourceOfDefinition; + ds61360.Symbol = src616360.symbol; + if (!(string.IsNullOrEmpty(src616360.dataType))) + { + var dt = src616360.dataType; + if (!dt.StartsWith("xs:")) + dt = "xs:" + dt; + ds61360.DataType = Stringification.DataTypeIec61360FromString(dt); + } + if (src616360.definition != null) + ds61360.Definition = new List().ConvertFromV20(src616360.definition); + + return ds61360; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs b/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs new file mode 100644 index 000000000..f33bcb649 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs @@ -0,0 +1,108 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +// using DataSpecificationContent = HasDataSpecification.DataSpecificationContent; + +namespace Extensions +{ + // TODO (Jui, 2022-12-21): I do not know, if to put the List<> extension here or in a separate file + public static class ExtendListOfEmbeddedDataSpecification + { + + + public static EmbeddedDataSpecification FindFirstIEC61360Spec(this List list) + { + foreach (var eds in list) + if (eds?.DataSpecificationContent is DataSpecificationIec61360 + || eds?.DataSpecification?.MatchesExactlyOneKey( + ExtendIDataSpecificationContent.GetKeyForIec61360()) == true) + return eds; + return null; + } + + public static DataSpecificationIec61360 GetIEC61360Content(this List list) + { + foreach (var eds in list) + if (eds?.DataSpecificationContent is DataSpecificationIec61360 dsiec) + return dsiec; + return null; + } + + public static DataSpecificationPhysicalUnit GetPhysicalUnitContent(this List list) + { + foreach (var eds in list) + if (eds?.DataSpecificationContent is DataSpecificationPhysicalUnit dspu) + return dspu; + return null; + } + } + + public static class ExtendEmbeddedDataSpecification + { + public static EmbeddedDataSpecification ConvertFromV20(this EmbeddedDataSpecification embeddedDataSpecification, AasxCompatibilityModels.AdminShellV20.EmbeddedDataSpecification sourceEmbeddedSpec) + { + if (sourceEmbeddedSpec != null) + { + embeddedDataSpecification.DataSpecification = ExtensionsUtil.ConvertReferenceFromV20(sourceEmbeddedSpec.dataSpecification, ReferenceTypes.GlobalReference); + + // TODO (MIHO, 2022-19-12): check again, see questions + var o2id = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360"; + var oldid = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0"; + var newid = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"; + + if (sourceEmbeddedSpec.dataSpecification?.Matches("", false, "IRI", oldid, + AasxCompatibilityModels.AdminShellV20.Key.MatchMode.Identification) == true) + { + embeddedDataSpecification.DataSpecification.Keys[0].Value = newid; + } + + if (sourceEmbeddedSpec.dataSpecification?.Matches("", false, "IRI", o2id, + AasxCompatibilityModels.AdminShellV20.Key.MatchMode.Identification) == true) + { + embeddedDataSpecification.DataSpecification.Keys[0].Value = newid; + } + } + + if (sourceEmbeddedSpec.dataSpecificationContent?.dataSpecificationIEC61360 != null) + { + embeddedDataSpecification.DataSpecificationContent = + new DataSpecificationIec61360(null).ConvertFromV20( + sourceEmbeddedSpec.dataSpecificationContent.dataSpecificationIEC61360); + } + return embeddedDataSpecification; + } + + public static EmbeddedDataSpecification CreateIec61360WithContent(DataSpecificationIec61360 content = null) + { + if (content == null) + content = new DataSpecificationIec61360(null); + + var res = new EmbeddedDataSpecification( + new Reference(ReferenceTypes.GlobalReference, + new List(new[] { ExtendIDataSpecificationContent.GetKeyForIec61360() })), + content); + return res; + } + + public static bool FixReferenceWrtContent(this EmbeddedDataSpecification eds) + { + // does content tell something? + var ctc = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecificationContent); + var ctr = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecification); + + if (ctc == ExtendIDataSpecificationContent.ContentTypes.NoInfo) + return false; + + if (ctr == ctc) + return false; + + // ok, fix + eds.DataSpecification = new Reference(ReferenceTypes.GlobalReference, + new List { ExtendIDataSpecificationContent.GetKeyFor(ctc) }); + return true; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs b/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs new file mode 100644 index 000000000..de6ac6f08 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs @@ -0,0 +1,108 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS.Display; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendEntity + { + #region AasxPackageExplorer + + public static void Add(this Entity entity, ISubmodelElement submodelElement) + { + if (entity != null) + { + entity.Statements ??= new(); + + submodelElement.Parent = entity; + + entity.Statements.Add(submodelElement); + } + } + + public static void Remove(this Entity entity, ISubmodelElement submodelElement) + { + if (entity != null) + { + if (entity.Statements != null) + { + entity.Statements.Remove(submodelElement); + } + } + } + + public static object AddChild(this Entity entity, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + if (entity.Statements == null) + entity.Statements = new(); + if (childSubmodelElement != null) + childSubmodelElement.Parent = entity; + entity.Statements.Add(childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static Entity ConvertFromV20(this Entity entity, AasxCompatibilityModels.AdminShellV20.Entity sourceEntity) + { + if (sourceEntity == null) + { + return null; + } + + if (sourceEntity.statements != null) + { + entity.Statements ??= new List(); + foreach (var submodelElementWrapper in sourceEntity.statements) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); + } + entity.Statements.Add(outputSubmodelElement); + } + } + + if (sourceEntity.assetRef != null) + { + //TODO (jtikekar, 0000-00-00): whether to convert to Global or specific asset id + var assetRef = ExtensionsUtil.ConvertReferenceFromV20(sourceEntity.assetRef, ReferenceTypes.GlobalReference); + entity.GlobalAssetId = assetRef; + } + + return entity; + } + + public static T FindFirstIdShortAs(this Entity entity, string idShort) where T : ISubmodelElement + { + + var submodelElements = entity.Statements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); + + if (submodelElements.Any()) + { + return (T)submodelElements.First(); + } + + return default; + } + + public static T CreateSMEForCD( + this Entity ent, + ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + if (ent.Statements == null) + ent.Statements = new List(); + return ent.Statements.CreateSMEForCD( + conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs b/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs new file mode 100644 index 000000000..7b00039f8 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs @@ -0,0 +1,1054 @@ +using AasCore.Aas3_0_RC02; +using Extensions; +using AdminShellNS; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; + +namespace Extensions +{ + public static class ExtendEnvironment + { + #region Environment + + #region AasxPackageExplorer + + public static void RecurseOnReferables(this AasCore.Aas3_0_RC02.Environment environment, + object state, Func, IReferable, bool> lambda, bool includeThis = false) + { + // includeThis does not make sense, as no Referable + // just use the others + foreach (var idf in environment.FindAllReferable(onlyIdentifiables: true)) + idf?.RecurseOnReferables(state, lambda, includeThis); + } + + #endregion + + public static AasValidationRecordList ValidateAll(this AasCore.Aas3_0_RC02.Environment environment) + { + // collect results + var results = new AasValidationRecordList(); + + // all entities + foreach (var rf in environment.FindAllReferable()) + rf.Validate(results); + + // give back + return results; + } + + public static int AutoFix(this AasCore.Aas3_0_RC02.Environment environment, IEnumerable records) + { + // access + if (records == null) + return -1; + + // collect Referables (expensive safety measure) + var allowedReferables = environment.FindAllReferable().ToList(); + + // go thru records + int res = 0; + foreach (var rec in records) + { + // access + if (rec == null || rec.Fix == null || rec.Source == null) + continue; + + // minimal safety measure + if (!allowedReferables.Contains(rec.Source)) + continue; + + // apply fix + res++; + try + { + rec.Fix.Invoke(); + } + catch + { + res--; + } + } + + // return number of applied fixes + return res; + } + + public static IEnumerable FindAllReferable(this AasCore.Aas3_0_RC02.Environment environment, bool onlyIdentifiables = false) + { + if (environment.AssetAdministrationShells != null) + foreach (var aas in environment.AssetAdministrationShells) + if (aas != null) + { + // AAS itself + yield return aas; + } + + if (environment.Submodels != null) + foreach (var sm in environment.Submodels) + if (sm != null) + { + yield return sm; + + if (!onlyIdentifiables) + { + // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection + var allsme = new List(); + sm.RecurseOnSubmodelElements(null, (state, parents, sme) => + { + allsme.Add(sme); return true; + }); + foreach (var sme in allsme) + yield return sme; + } + } + + if (environment.ConceptDescriptions != null) + foreach (var cd in environment.ConceptDescriptions) + if (cd != null) + yield return cd; + } + +#if !DoNotUseAasxCompatibilityModels + + public static AasCore.Aas3_0_RC02.Environment ConvertFromV10(this AasCore.Aas3_0_RC02.Environment environment, AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv sourceEnvironement) + { + //Convert Administration Shells + if (sourceEnvironement.AdministrationShells != null) + { + if (environment.AssetAdministrationShells == null) + { + environment.AssetAdministrationShells = new List(); + } + foreach (var sourceAas in sourceEnvironement.AdministrationShells) + { + var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); + if (sourceAsset != null) + { + var newAssetInformation = new AssetInformation(AssetKind.Instance); + newAssetInformation = newAssetInformation.ConvertFromV10(sourceAsset); + + var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, newAssetInformation); + newAas = newAas.ConvertFromV10(sourceAas); + + environment.AssetAdministrationShells.Add(newAas); + } + + } + } + + //Convert Submodels + if (sourceEnvironement.Submodels != null) + { + if (environment.Submodels == null) + { + environment.Submodels = new List(); + } + foreach (var sourceSubmodel in sourceEnvironement.Submodels) + { + var newSubmodel = new Submodel(sourceSubmodel.identification.id); + newSubmodel = newSubmodel.ConvertFromV10(sourceSubmodel); + environment.Submodels.Add(newSubmodel); + } + } + + if (sourceEnvironement.ConceptDescriptions != null) + { + if (environment.ConceptDescriptions == null) + { + environment.ConceptDescriptions = new List(); + } + foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) + { + var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); + newConceptDescription = newConceptDescription.ConvertFromV10(sourceConceptDescription); + environment.ConceptDescriptions.Add(newConceptDescription); + } + } + + return environment; + } + + + public static AasCore.Aas3_0_RC02.Environment ConvertFromV20(this AasCore.Aas3_0_RC02.Environment environment, AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv sourceEnvironement) + { + //Convert Administration Shells + if (sourceEnvironement.AdministrationShells != null) + { + if (environment.AssetAdministrationShells == null) + { + environment.AssetAdministrationShells = new List(); + } + foreach (var sourceAas in sourceEnvironement.AdministrationShells) + { + // first make the AAS + var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, null); + newAas = newAas.ConvertFromV20(sourceAas); + environment.AssetAdministrationShells.Add(newAas); + + var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); + if (sourceAsset != null) + { + var newAssetInformation = new AssetInformation(AssetKind.Instance); + newAssetInformation = newAssetInformation.ConvertFromV20(sourceAsset); + newAas.AssetInformation = newAssetInformation; + } + + } + } + + //Convert Submodels + if (sourceEnvironement.Submodels != null) + { + if (environment.Submodels == null) + { + environment.Submodels = new List(); + } + foreach (var sourceSubmodel in sourceEnvironement.Submodels) + { + var newSubmodel = new Submodel(sourceSubmodel.identification.id); + newSubmodel = newSubmodel.ConvertFromV20(sourceSubmodel); + environment.Submodels.Add(newSubmodel); + } + } + + if (sourceEnvironement.ConceptDescriptions != null) + { + if (environment.ConceptDescriptions == null) + { + environment.ConceptDescriptions = new List(); + } + foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) + { + var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); + newConceptDescription = newConceptDescription.ConvertFromV20(sourceConceptDescription); + environment.ConceptDescriptions.Add(newConceptDescription); + } + } + + return environment; + } + +#endif + + //TODO (jtikekar, 0000-00-00): to test + public static AasCore.Aas3_0_RC02.Environment CreateFromExistingEnvironment(this AasCore.Aas3_0_RC02.Environment environment, AasCore.Aas3_0_RC02.Environment sourceEnvironment, + List filterForAas = null, List filterForAssets = null, List filterForSubmodel = null, List filterForConceptDescriptions = null) + { + if (filterForAas == null) + { + filterForAas = new List(); + } + + if (filterForAssets == null) + { + filterForAssets = new List(); + } + + if (filterForSubmodel == null) + { + filterForSubmodel = new List(); + } + + if (filterForConceptDescriptions == null) + { + filterForConceptDescriptions = new List(); + } + + //var outputEnvironment = new AasCore.Aas3_0_RC02.Environment(); + + //Copy AssetAdministrationShells + foreach (var aas in sourceEnvironment.AssetAdministrationShells) + { + if (filterForAas.Contains(aas)) + { + environment.AssetAdministrationShells.Add(aas); + + if (aas.Submodels != null && aas.Submodels.Count > 0) + { + foreach (var submodelReference in aas.Submodels) + { + var submodel = sourceEnvironment.FindSubmodel(submodelReference); + if (submodel != null) + { + filterForSubmodel.Add(submodel); + } + } + } + } + } + + //Copy Submodel + foreach (var submodel in sourceEnvironment.Submodels) + { + if (filterForSubmodel.Contains(submodel)) + { + environment.Submodels.Add(submodel); + + //Find Used CDs + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, submodel.SubmodelElements, ref filterForConceptDescriptions); + } + } + + //Copy ConceptDescription + foreach (var conceptDescription in sourceEnvironment.ConceptDescriptions) + { + if (filterForConceptDescriptions.Contains(conceptDescription)) + { + environment.ConceptDescriptions.Add(conceptDescription); + } + } + + return environment; + + } + + public static void CreateFromExistingEnvRecurseForCDs(this AasCore.Aas3_0_RC02.Environment environment, AasCore.Aas3_0_RC02.Environment sourceEnvironment, + List submodelElements, ref List filterForConceptDescription) + { + if (submodelElements == null || submodelElements.Count == 0 || filterForConceptDescription == null || filterForConceptDescription.Count == 0) + { + return; + } + + foreach (var submodelElement in submodelElements) + { + if (submodelElement == null) + { + return; + } + + if (submodelElement.SemanticId != null) + { + var conceptDescription = sourceEnvironment.FindConceptDescriptionByReference(submodelElement.SemanticId); + if (conceptDescription != null) + { + filterForConceptDescription.Add(conceptDescription); + } + } + + if (submodelElement is SubmodelElementCollection smeColl) + { + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeColl.Value, ref filterForConceptDescription); + } + + if (submodelElement is SubmodelElementList smeList) + { + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeList.Value, ref filterForConceptDescription); + } + + if (submodelElement is Entity entity) + { + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, entity.Statements, ref filterForConceptDescription); + } + + if (submodelElement is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotedELements = new List(); + foreach (var annotation in annotatedRelationshipElement.Annotations) + { + annotedELements.Add(annotation); + } + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, annotedELements, ref filterForConceptDescription); + } + + if (submodelElement is Operation operation) + { + var operationELements = new List(); + foreach (var inputVariable in operation.InputVariables) + { + operationELements.Add(inputVariable.Value); + } + + foreach (var outputVariable in operation.OutputVariables) + { + operationELements.Add(outputVariable.Value); + } + + foreach (var inOutVariable in operation.InoutputVariables) + { + operationELements.Add(inOutVariable.Value); + } + + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, operationELements, ref filterForConceptDescription); + + } + } + } + + public static ConceptDescription Add(this AasCore.Aas3_0_RC02.Environment env, ConceptDescription cd) + { + if (cd == null) + return null; + if (env.ConceptDescriptions == null) + env.ConceptDescriptions = new(); + env.ConceptDescriptions.Add(cd); + return cd; + } + + public static Submodel Add(this AasCore.Aas3_0_RC02.Environment env, Submodel sm) + { + if (sm == null) + return null; + if (env.Submodels == null) + env.Submodels = new(); + env.Submodels.Add(sm); + return sm; + } + + public static AssetAdministrationShell Add(this AasCore.Aas3_0_RC02.Environment env, AssetAdministrationShell aas) + { + if (aas == null) + return null; + if (env.AssetAdministrationShells == null) + env.AssetAdministrationShells = new(); + env.AssetAdministrationShells.Add(aas); + return aas; + } + + //public static JsonWriter SerialiazeJsonToStream(this AasCore.Aas3_0_RC02.Environment environment, StreamWriter streamWriter, bool leaveJsonWriterOpen = false) + //{ + // streamWriter.AutoFlush = true; + + // JsonSerializer serializer = new JsonSerializer() + // { + // NullValueHandling = NullValueHandling.Ignore, + // ReferenceLoopHandling = ReferenceLoopHandling.Serialize, + // Formatting = Newtonsoft.Json.Formatting.Indented + // }; + + // JsonWriter writer = new JsonTextWriter(streamWriter); + // serializer.Serialize(writer, environment); + // if (leaveJsonWriterOpen) + // return writer; + // writer.Close(); + // return null; + //} + + + #endregion + + #region Submodel Queries + + public static IEnumerable FindAllSubmodelGroupedByAAS(this AasCore.Aas3_0_RC02.Environment environment, Func p = null) + { + if (environment.AssetAdministrationShells == null || environment.Submodels == null) + yield break; + foreach (var aas in environment.AssetAdministrationShells) + { + if (aas?.Submodels == null) + continue; + foreach (var smref in aas.Submodels) + { + var sm = environment.FindSubmodel(smref); + if (sm != null && (p == null || p(aas, sm))) + yield return sm; + } + } + } + public static Submodel FindSubmodel(this AasCore.Aas3_0_RC02.Environment environment, Reference submodelReference) + { + if (submodelReference == null) + { + return null; + } + + if (submodelReference.Keys.Count != 1) // Can have only one reference key + { + return null; + } + + var key = submodelReference.Keys[0]; + if (key.Type != KeyTypes.Submodel) + { + return null; + } + + var submodels = environment.Submodels.Where(s => s.Id.Equals(key.Value, StringComparison.OrdinalIgnoreCase)); + if (submodels.Any()) + { + return submodels.First(); + } + + return null; + } + + public static Submodel FindSubmodelById(this AasCore.Aas3_0_RC02.Environment environment, string submodelId) + { + if (string.IsNullOrEmpty(submodelId)) + { + return null; + } + + var submodels = environment.Submodels.Where(s => s.Id.Equals(submodelId)); + if (submodels.Any()) + { + return submodels.First(); + } + + return null; + } + + public static IEnumerable FindAllSubmodelsGroupedByAAS(this AasCore.Aas3_0_RC02.Environment environment, Func p = null) + { + if (environment.AssetAdministrationShells == null || environment.Submodels == null) + yield break; + foreach (var aas in environment.AssetAdministrationShells) + { + if (aas?.Submodels == null) + continue; + foreach (var submodelReference in aas.Submodels) + { + var submodel = environment.FindSubmodel(submodelReference); + if (submodel != null && (p == null || p(aas, submodel))) + yield return submodel; + } + } + } + + public static IEnumerable FindAllSubmodelBySemanticId(this AasCore.Aas3_0_RC02.Environment environment, string semanticId) + { + if (semanticId == null) + yield break; + + foreach (var submodel in environment.Submodels) + if (true == submodel.SemanticId?.Matches(semanticId)) + yield return submodel; + } + + #endregion + + #region AssetAdministrationShell Queries + public static AssetAdministrationShell FindAasWithSubmodelId(this AasCore.Aas3_0_RC02.Environment environment, string submodelId) + { + if (submodelId == null) + { + return null; + } + + var aas = environment.AssetAdministrationShells.Where(a => (a.Submodels?.Where(s => s.Matches(submodelId)).First()) != null).First(); + + return aas; + } + + public static AssetAdministrationShell FindAasById(this AasCore.Aas3_0_RC02.Environment environment, string aasId) + { + if (string.IsNullOrEmpty(aasId)) + { + return null; + } + + var aas = environment.AssetAdministrationShells.Where(a => a.Id.Equals(aasId)).First(); + + return aas; + } + + #endregion + + #region ConceptDescription Queries + + public static ConceptDescription FindConceptDescriptionById( + this AasCore.Aas3_0_RC02.Environment env, string cdId) + { + if (string.IsNullOrEmpty(cdId)) + return null; + + var conceptDescription = env.ConceptDescriptions.Where(c => c.Id.Equals(cdId)).FirstOrDefault(); + return conceptDescription; + } + + public static ConceptDescription FindConceptDescriptionByReference( + this AasCore.Aas3_0_RC02.Environment env, Reference rf) + { + if (rf == null) + return null; + + return env.FindConceptDescriptionById(rf.GetAsIdentifier()); + } + + #endregion + + #region Referable Queries + + /// + /// Result of FindReferable in Environment + /// + public class ReferableRootInfo + { + public AssetAdministrationShell AAS = null; + public AssetInformation Asset = null; + public Submodel Submodel = null; + public ConceptDescription CD = null; + + public int NrOfRootKeys = 0; + + public bool IsValid + { + get + { + return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); + } + } + } + + //TODO (jtikekar, 0000-00-00): Need to test + public static IReferable FindReferableByReference( + this AasCore.Aas3_0_RC02.Environment environment, + Reference reference, + int keyIndex = 0, + List submodelElementList = null, + ReferableRootInfo rootInfo = null) + { + // access + var keyList = reference?.Keys; + if (keyList == null || keyList.Count == 0 || keyIndex >= keyList.Count) + return null; + + // shortcuts + var firstKeyType = keyList[keyIndex].Type; + var firstKeyId = keyList[keyIndex].Value; + + // different pathes + switch (firstKeyType) + { + case KeyTypes.AssetAdministrationShell: + { + var aas = environment.FindAasById(firstKeyId); + + // side info? + if (rootInfo != null) + { + rootInfo.AAS = aas; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + //Not found or already at the end of our search + if (aas == null || keyIndex >= keyList.Count - 1) + { + return aas; + } + + return environment.FindReferableByReference(reference, ++keyIndex); + } + + // TODO (MIHO, 2023-01-01): stupid generalization :-( + case KeyTypes.GlobalReference: + case KeyTypes.ConceptDescription: + { + // In meta model V3, multiple important things might by identified + // by a flat GlobalReference :-( + + // find an Asset by that id? + var keyedAas = environment.FindAasWithAssetInformation(firstKeyId); + if (keyedAas?.AssetInformation != null) + { + // found an Asset + + // side info? + if (rootInfo != null) + { + rootInfo.AAS = keyedAas; + rootInfo.Asset = keyedAas?.AssetInformation; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + // give back the AAS + return keyedAas; + } + + // Concept?Description + var keyedCd = environment.FindConceptDescriptionById(firstKeyId); + if (keyedCd != null) + { + // side info? + if (rootInfo != null) + { + rootInfo.CD = keyedCd; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + // give back the CD + return keyedCd; + } + + // Nope + return null; + } + + case KeyTypes.Submodel: + { + var submodel = environment.FindSubmodelById(firstKeyId); + // No? + if (submodel == null) + return null; + + // notice in side info + if (rootInfo != null) + { + rootInfo.Submodel = submodel; + rootInfo.NrOfRootKeys = 1 + keyIndex; + + // add even more info + if (rootInfo.AAS == null) + { + foreach (var aas2 in environment.AssetAdministrationShells) + { + var smref2 = environment.FindSubmodelById(submodel.Id); + if (smref2 != null) + { + rootInfo.AAS = aas2; + break; + } + } + } + } + + // at the end of the journey? + if (keyIndex >= keyList.Count - 1) + return submodel; + + return environment.FindReferableByReference(reference, ++keyIndex, submodel.SubmodelElements); + } + } + + if (firstKeyType.IsSME() && submodelElementList != null) + { + var submodelElement = submodelElementList.Where( + sme => sme.IdShort.Equals(keyList[keyIndex].Value, + StringComparison.OrdinalIgnoreCase)).First(); + + //This is required element + if (keyIndex + 1 >= keyList.Count) + { + return submodelElement; + } + + //Recurse again + if (submodelElement != null && submodelElement is SubmodelElementCollection smeColl) + { + return environment.FindReferableByReference(reference, ++keyIndex, smeColl.Value); + } + + if (submodelElement != null && submodelElement is SubmodelElementList smeList) + { + return environment.FindReferableByReference(reference, ++keyIndex, smeList.Value); + } + } + + //Nothing in this environment + return null; + } + + #endregion + + #region AasxPackageExplorer + + public static IEnumerable FindAllSubmodelElements(this AasCore.Aas3_0_RC02.Environment environment, + Predicate match = null, AssetAdministrationShell onlyForAAS = null) where T : ISubmodelElement + { + // more or less two different schemes + if (onlyForAAS != null) + { + if (onlyForAAS.Submodels == null) + yield break; + foreach (var smr in onlyForAAS.Submodels) + { + var sm = environment.FindSubmodel(smr); + if (sm?.SubmodelElements != null) + foreach (var x in sm.SubmodelElements.FindDeep(match)) + yield return x; + } + } + else + { + if (environment.Submodels != null) + foreach (var sm in environment.Submodels) + if (sm?.SubmodelElements != null) + foreach (var x in sm.SubmodelElements.FindDeep(match)) + yield return x; + } + } + + public static IEnumerable FindAllReferences(this AasCore.Aas3_0_RC02.Environment environment) + { + if (environment.AssetAdministrationShells != null) + foreach (var aas in environment.AssetAdministrationShells) + if (aas != null) + foreach (var r in aas.FindAllReferences()) + yield return r; + + //if (this.Assets != null) + // foreach (var asset in this.Assets) + // if (asset != null) + // foreach (var r in asset.FindAllReferences()) + // yield return new LocatedReference(asset, r); + + if (environment.Submodels != null) + foreach (var sm in environment.Submodels) + if (sm != null) + foreach (var r in sm.FindAllReferences()) + yield return r; + + if (environment.ConceptDescriptions != null) + foreach (var cd in environment.ConceptDescriptions) + if (cd != null) + foreach (var r in cd.FindAllReferences()) + yield return new LocatedReference(cd, r); + } + + /// + /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and + /// all references to it. + /// Currently supported: ConceptDescriptions + /// Returns a list of Referables, which were changed or null in case of error + /// + public static List RenameIdentifiable(this AasCore.Aas3_0_RC02.Environment environment, string oldId, string newId) + where T : IClass + { + // access + if (oldId == null || newId == null || oldId.Equals(newId)) + return null; + + var res = new List(); + + if (typeof(T) == typeof(ConceptDescription)) + { + // check, if exist or not exist + var cdOld = environment.FindConceptDescriptionById(oldId); + if (cdOld == null || environment.FindConceptDescriptionById(newId) != null) + return null; + + // rename old cd + cdOld.Id = newId; + res.Add(cdOld); + + // search all SMEs referring to this CD + foreach (var sme in environment.FindAllSubmodelElements(match: (s) => + { + return (s != null && s.SemanticId != null && s.SemanticId.Matches(oldId)); + })) + { + sme.SemanticId.Keys[0].Value = newId; + res.Add(sme); + } + + // seems fine + return res; + } + else + if (typeof(T) == typeof(Submodel)) + { + // check, if exist or not exist + var smOld = environment.FindSubmodelById(oldId); + if (smOld == null || environment.FindSubmodelById(newId) != null) + return null; + + // recurse all possible Referenes in the aas env + foreach (var lr in environment.FindAllReferences()) + { + var r = lr?.Reference; + if (r != null) + for (int i = 0; i < r.Keys.Count; i++) + if (r.Keys[i].Matches(KeyTypes.Submodel, oldId, MatchMode.Relaxed)) + { + // directly replace + r.Keys[i].Value = newId; + if (res.Contains(lr.Identifiable)) + res.Add(lr.Identifiable); + } + } + + // rename old Submodel + smOld.Id = newId; + + // seems fine + return res; + } + else + if (typeof(T) == typeof(AssetAdministrationShell)) + { + // check, if exist or not exist + var aasOld = environment.FindAasById(oldId); + if (aasOld == null || environment.FindAasById(newId) != null) + return null; + + // recurse? -> no? + + // rename old Asset + aasOld.Id = newId; + + // seems fine + return res; + } + else + //TODO (jtikekar, 0000-00-00): support asset + if (typeof(T) == typeof(AssetInformation)) + { + // check, if exist or not exist + var assetOld = environment.FindAasWithAssetInformation(oldId); + if (assetOld == null || environment.FindAasWithAssetInformation(newId) != null) + return null; + + // recurse all possible Referenes in the aas env + foreach (var lr in environment.FindAllReferences()) + { + var r = lr?.Reference; + if (r != null) + for (int i = 0; i < r.Keys.Count; i++) + if (r.Keys[i].Matches(KeyTypes.GlobalReference, oldId)) + { + // directly replace + r.Keys[i].Value = newId; + if (res.Contains(lr.Identifiable)) + res.Add(lr.Identifiable); + } + } + + // rename old Asset + assetOld.AssetInformation.GlobalAssetId = new Reference(ReferenceTypes.GlobalReference, new List() { new Key(KeyTypes.GlobalReference, newId) }); + + // seems fine + return res; + } + + // no result is false, as well + return null; + } + + public static AssetAdministrationShell FindAasWithAssetInformation(this AasCore.Aas3_0_RC02.Environment environment, string globalAssetId) + { + if (string.IsNullOrEmpty(globalAssetId)) + { + return null; + } + + foreach (var aas in environment.AssetAdministrationShells) + { + if (aas.AssetInformation.GlobalAssetId.GetAsIdentifier().Equals(globalAssetId)) + { + return aas; + } + } + + return null; + } + + public static ComparerIndexed CreateIndexedComparerCdsForSmUsage(this AasCore.Aas3_0_RC02.Environment environment) + { + var cmp = new ComparerIndexed(); + int nr = 0; + foreach (var sm in environment.FindAllSubmodelGroupedByAAS()) + foreach (var sme in sm.FindDeep()) + { + if (sme.SemanticId == null) + continue; + var cd = environment.FindConceptDescriptionByReference(sme.SemanticId); + if (cd == null) + continue; + if (cmp.Index.ContainsKey(cd)) + continue; + cmp.Index[cd] = nr++; + } + return cmp; + } + + public static ISubmodelElement CopySubmodelElementAndCD(this AasCore.Aas3_0_RC02.Environment environment, + AasCore.Aas3_0_RC02.Environment srcEnv, ISubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) + { + // access + if (srcEnv == null || srcElem == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate Submodel) + var res = srcElem.Copy(); + + // copy the CDs.. + if (copyCD) + environment.CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); + + // give back + return res; + } + + public static Reference CopySubmodelRefAndCD(this AasCore.Aas3_0_RC02.Environment environment, + AasCore.Aas3_0_RC02.Environment srcEnv, Reference srcSubRef, bool copySubmodel = false, bool copyCD = false, + bool shallowCopy = false) + { + // access + if (srcEnv == null || srcSubRef == null) + return null; + + // need to have the source Submodel + var srcSub = srcEnv.FindSubmodel(srcSubRef); + if (srcSub == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate AAS) + var dstSubRef = srcSubRef.Copy(); + + // get the destination and shall src != dst + var dstSub = environment.FindSubmodel(dstSubRef); + if (srcSub == dstSub) + return null; + + // maybe we need the Submodel in our environment, as well + if (dstSub == null && copySubmodel) + { + dstSub = srcSub.Copy(); + environment.Submodels.Add(dstSub); + } + else + if (dstSub != null) + { + // there is already an submodel, just add members + if (!shallowCopy && srcSub.SubmodelElements != null) + { + if (dstSub.SubmodelElements == null) + dstSub.SubmodelElements = new List(); + foreach (var smw in srcSub.SubmodelElements) + dstSub.SubmodelElements.Add( + smw.Copy()); + } + } + + // copy the CDs.. + if (copyCD && srcSub.SubmodelElements != null) + foreach (var smw in srcSub.SubmodelElements) + environment.CopyConceptDescriptionsFrom(srcEnv, smw, shallowCopy); + + // give back + return dstSubRef; + } + + private static void CopyConceptDescriptionsFrom(this AasCore.Aas3_0_RC02.Environment environment, + AasCore.Aas3_0_RC02.Environment srcEnv, ISubmodelElement src, bool shallowCopy = false) + { + // access + if (srcEnv == null || src == null || src.SemanticId == null) + return; + // check for this SubmodelElement in Source + var cdSrc = srcEnv.FindConceptDescriptionByReference(src.SemanticId); + if (cdSrc == null) + return; + // check for this SubmodelElement in Destnation (this!) + var cdDest = environment.FindConceptDescriptionByReference(src.SemanticId); + if (cdDest != null) + return; + // copy new + environment.ConceptDescriptions.Add(cdSrc.Copy()); + // recurse? + if (!shallowCopy && src is SubmodelElementCollection) + foreach (var m in (src as SubmodelElementCollection).Value) + environment.CopyConceptDescriptionsFrom(srcEnv, m, shallowCopy: false); + + } + #endregion + + } + + + +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendFile.cs b/src/AasxCsharpLibrary/Extensions/ExtendFile.cs new file mode 100644 index 000000000..303b656c1 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendFile.cs @@ -0,0 +1,68 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendFile + { + public static string ValueAsText(this File file) + { + return "" + file.Value; + } + + public static void Set(this File file, + string contentType = "", string value = "") + { + file.ContentType = contentType; + file.Value = value; + } + + public static File ConvertFromV10(this File file, AasxCompatibilityModels.AdminShellV10.File sourceFile) + { + file.ContentType = sourceFile.mimeType; + file.Value = sourceFile.value; + return file; + } + public static File ConvertFromV20(this File file, AasxCompatibilityModels.AdminShellV20.File sourceFile) + { + file.ContentType = sourceFile.mimeType; + file.Value = sourceFile.value; + return file; + } + + public static File UpdateFrom(this File elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + elem.Value = srcProp.Value; + } + + if (source is AasCore.Aas3_0_RC02.Range srcRng) + { + elem.Value = srcRng.Min; + } + + if (source is MultiLanguageProperty srcMlp) + { + elem.Value = "" + srcMlp.Value?.GetDefaultString(); + } + + if (source is File srcFile) + { + elem.Value = "" + srcFile.Value; + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs b/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs new file mode 100644 index 000000000..e7ff6d555 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs @@ -0,0 +1,26 @@ +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendHasDataSpecification + { + public static IHasDataSpecification ConvertFromV20(this IHasDataSpecification embeddedDataSpecifications, AasxCompatibilityModels.AdminShellV20.HasDataSpecification sourceSpecification) + { + foreach (var sourceSpec in sourceSpecification) + { + var newEmbeddedSpec = new EmbeddedDataSpecification(null, null); + newEmbeddedSpec.ConvertFromV20(sourceSpec); + embeddedDataSpecifications.EmbeddedDataSpecifications.Add(newEmbeddedSpec); + } + + return embeddedDataSpecifications; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs b/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs new file mode 100644 index 000000000..97fe3ba2e --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs @@ -0,0 +1,68 @@ +using Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; +using AdminShellNS; + +namespace Extensions +{ + public static class ExtendIDataSpecificationContent + { + public enum ContentTypes { NoInfo, Iec61360, PhysicalUnit } + + public static Key GetKeyForIec61360() + { + return new Key(KeyTypes.GlobalReference, + "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"); + } + + public static Reference GetReferencForIec61360() + { + return new Reference(ReferenceTypes.GlobalReference, new List { GetKeyForIec61360() }); + } + + public static Key GetKeyForPhysicalUnit() + { + return new Key(KeyTypes.GlobalReference, + "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationPhysicalUnit/3/0"); + } + + public static Key GetKeyFor(ContentTypes ct) + { + if (ct == ContentTypes.Iec61360) + return GetKeyForIec61360(); + if (ct == ContentTypes.PhysicalUnit) + return GetKeyForPhysicalUnit(); + return null; + } + + public static IDataSpecificationContent ContentFactoryFor(ContentTypes ct) + { + if (ct == ContentTypes.Iec61360) + return new DataSpecificationIec61360(null); + if (ct == ContentTypes.PhysicalUnit) + return new DataSpecificationPhysicalUnit("", "", null); + return null; + } + + public static ContentTypes GuessContentTypeFor(Reference rf) + { + foreach (var v in AdminShellUtil.GetEnumValues(new[] { ContentTypes.NoInfo })) + if (rf?.MatchesExactlyOneKey(GetKeyFor(v)) == true) + return v; + return ContentTypes.NoInfo; + } + + public static ContentTypes GuessContentTypeFor(IDataSpecificationContent content) + { + if (content is DataSpecificationIec61360) + return ContentTypes.Iec61360; + if (content is DataSpecificationPhysicalUnit) + return ContentTypes.PhysicalUnit; + return ContentTypes.NoInfo; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs b/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs new file mode 100644 index 000000000..74e9f0b26 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs @@ -0,0 +1,28 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendIIdentifiable + { + #region List of Identifiers + + public static string ToStringExtended(this List identifiables, string delimiter = ",") + { + return string.Join(delimiter, identifiables.Select((x) => x.Id)); + } + + #endregion + public static Reference GetReference(this IIdentifiable identifiable) + { + var key = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); + var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }); + + return outputReference; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs b/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs new file mode 100644 index 000000000..ea6a079c5 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs @@ -0,0 +1,600 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS; +using AdminShellNS.Display; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendIReferable + { + #region AasxPackageExplorer + + public static void RecurseOnReferables(this IReferable referable, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + if (referable is Submodel submodel) + { + submodel.RecurseOnReferables(state, lambda, includeThis); + } + else if (referable is SubmodelElementCollection submodelElementCollection) + { + submodelElementCollection.RecurseOnReferables(state, lambda, includeThis); + } + else if (referable is SubmodelElementList submodelElementList) + { + submodelElementList.RecurseOnReferables(state, lambda, includeThis); + } + else if (includeThis) + lambda(state, null, referable); + } + + public static void Remove(this IReferable referable, ISubmodelElement submodelElement) + { + if (referable is Submodel submodel) + { + submodel.Remove(submodelElement); + } + else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) + { + annotatedRelationshipElement.Remove(submodelElement); + } + else if (referable is SubmodelElementCollection submodelElementCollection) + { + submodelElementCollection.Remove(submodelElement); + } + else if (referable is SubmodelElementList submodelElementList) + { + submodelElementList.Remove(submodelElement); + } + else if (referable is Entity entity) + { + entity.Remove(submodelElement); + } + } + + public static void Add(this IReferable referable, ISubmodelElement submodelElement) + { + if (referable is Submodel submodel) + { + submodel.Add(submodelElement); + } + else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) + { + annotatedRelationshipElement.Add(submodelElement); + } + else if (referable is SubmodelElementCollection submodelElementCollection) + { + submodelElementCollection.Add(submodelElement); + } + else if (referable is SubmodelElementList submodelElementList) + { + submodelElementList.Add(submodelElement); + } + else if (referable is Entity entity) + { + entity.Add(submodelElement); + } + } + + #region Display + + public static EnumerationPlacmentBase GetChildrenPlacement(this IReferable referable, ISubmodelElement submodelElement) + { + if (referable is Operation operation) + { + return operation.GetChildrenPlacement(submodelElement); + } + + return null; + } + + #endregion + + public static IIdentifiable FindParentFirstIdentifiable(this IReferable referable) + { + IReferable curr = referable; + while (curr != null) + { + if (curr is IIdentifiable curri) + return curri; + curr = curr.Parent as IReferable; + } + return null; + } + + #endregion + + #region ListOfReferables + public static Reference GetReference(this List referables) + { + return new Reference(ReferenceTypes.GlobalReference, referables.ToKeyList()); + } + + public static List ToKeyList(this List referables) + { + var res = new List(); + foreach (var rf in referables) + res.Add(new Key(rf.GetSelfDescription()?.KeyType ?? KeyTypes.GlobalReference, rf.IdShort)); + return res; + } + #endregion + + public static string ToIdShortString(this IReferable rf) + { + if (rf.IdShort == null || rf.IdShort.Trim().Length < 1) + return (""); + return rf.IdShort.Trim(); + } + + public static Reference GetReference(this IReferable referable) + { + if (referable is IIdentifiable identifiable) + { + return identifiable.GetReference(); + } + else if (referable is ISubmodelElement submodelElement) + { + return submodelElement.GetModelReference(); + } + else + return null; + } + public static void Validate(this IReferable referable, AasValidationRecordList results) + { + referable.BaseValidation(results); + + if (referable is ConceptDescription conceptDescription) + { + conceptDescription.Validate(results); + } + else if (referable is Submodel submodel) + { + submodel.Validate(results); + } + else if (referable is ISubmodelElement submodelElement) + { + submodelElement.Validate(results); + } + } + + public static void BaseValidation(this IReferable referable, AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + if (string.IsNullOrEmpty(referable.IdShort)) + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, referable, + "Referable: missing idShort", + () => + { + referable.IdShort = "TO_FIX"; + })); + + if (referable.Description != null && (referable.Description.Count < 1)) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, referable, + "Referable: existing description with missing langString", + () => + { + referable.Description = null; + })); + } + + /// + /// Tells, if the IReferable is used with an index instead of idShort. + /// + public static bool IsIndexed(this IReferable rf) + { + return rf is SubmodelElementList; + } + + public static AasElementSelfDescription GetSelfDescription(this IReferable referable) + { + if (referable is AssetAdministrationShell) + { + return new AasElementSelfDescription("AssetAdministrationShell", "AAS", + KeyTypes.AssetAdministrationShell, null); + } + else if (referable is ConceptDescription) + { + return new AasElementSelfDescription("ConceptDescription", "CD", + KeyTypes.ConceptDescription, null); + } + else if (referable is Submodel) + { + return new AasElementSelfDescription("Submodel", "SM", + KeyTypes.Submodel, null); + } + else if (referable is Property) + { + return new AasElementSelfDescription("Property", "Prop", + KeyTypes.Property, AasSubmodelElements.Property); + } + else if (referable is MultiLanguageProperty) + { + return new AasElementSelfDescription("MultiLanguageProperty", "MLP", + KeyTypes.MultiLanguageProperty, AasSubmodelElements.MultiLanguageProperty); + } + else if (referable is AasCore.Aas3_0_RC02.Range) + { + return new AasElementSelfDescription("Range", "Range", + KeyTypes.Range, AasSubmodelElements.Range); + } + else if (referable is Blob) + { + return new AasElementSelfDescription("Blob", "Blob", + KeyTypes.Blob, AasSubmodelElements.Blob); + } + else if (referable is AasCore.Aas3_0_RC02.File) + { + return new AasElementSelfDescription("File", "File", + KeyTypes.File, AasSubmodelElements.File); + } + else if (referable is ReferenceElement) + { + return new AasElementSelfDescription("ReferenceElement", "Ref", + KeyTypes.ReferenceElement, AasSubmodelElements.ReferenceElement); + } + else if (referable is RelationshipElement) + { + return new AasElementSelfDescription("RelationshipElement", "Rel", + KeyTypes.RelationshipElement, AasSubmodelElements.RelationshipElement); + } + else if (referable is AnnotatedRelationshipElement) + { + return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", + KeyTypes.AnnotatedRelationshipElement, AasSubmodelElements.AnnotatedRelationshipElement); + } + else if (referable is Capability) + { + return new AasElementSelfDescription("Capability", "Cap", + KeyTypes.Capability, AasSubmodelElements.Capability); + } + else if (referable is SubmodelElementCollection) + { + return new AasElementSelfDescription("SubmodelElementCollection", "SMC", + KeyTypes.SubmodelElementCollection, AasSubmodelElements.SubmodelElementCollection); + } + else if (referable is SubmodelElementList) + { + return new AasElementSelfDescription("SubmodelElementList", "SML", + KeyTypes.SubmodelElementList, AasSubmodelElements.SubmodelElementList); + } + else if (referable is Operation) + { + return new AasElementSelfDescription("Operation", "Opr", + KeyTypes.Operation, AasSubmodelElements.Operation); + } + else if (referable is Entity) + { + return new AasElementSelfDescription("Entity", "Ent", + KeyTypes.Entity, AasSubmodelElements.Entity); + } + else if (referable is BasicEventElement) + { + return new AasElementSelfDescription("BasicEventElement", "Evt", + + KeyTypes.BasicEventElement, AasSubmodelElements.BasicEventElement); + } + else if (referable is IDataElement) + { + return new AasElementSelfDescription("DataElement", "DE", + KeyTypes.DataElement, AasSubmodelElements.DataElement); + } + else if (referable is ISubmodelElement) + { + return new AasElementSelfDescription("SubmodelElement", "SME", + KeyTypes.SubmodelElement, AasSubmodelElements.SubmodelElement); + } + else + { + return new AasElementSelfDescription("Referable", "Ref", + KeyTypes.Referable, null); + } + } + public static void CollectReferencesByParent(this IReferable referable, List refs) + { + // access + if (refs == null) + return; + + // check, if this is identifiable + if (referable is IIdentifiable) + { + var idf = referable as IIdentifiable; + if (idf != null) + { + //var k = Key.CreateNew( + // idf.GetElementName(), true, idf.identification?.idType, idf.identification?.id); + + var key = new Key((KeyTypes)Stringification.KeyTypesFromString(idf.GetType().Name), idf.Id); + refs.Insert(0, key); + } + } + else + { + //var k = Key.CreateNew(this.GetElementName(), true, "IdShort", referable.IdShort); + var key = new Key((KeyTypes)Stringification.KeyTypesFromString(referable.GetType().Name), referable.IdShort); + refs.Insert(0, key); + // recurse upwards! + if (referable.Parent is IReferable prf) + prf.CollectReferencesByParent(refs); + } + } + public static void SetTimeStamp(this IReferable referable, DateTime timeStamp) + { + IReferable newReferable = referable; + do + { + newReferable.TimeStamp = timeStamp; + if (newReferable != newReferable.Parent) + { + newReferable = (IReferable)newReferable.Parent; + } + else + newReferable = null; + } + while (newReferable != null); + } + + public static bool EnumeratesChildren(this ISubmodelElement elem) + { + var num = elem.EnumerateChildren().Count(); + return (num > 0); + } + + public static IEnumerable EnumerateChildren(this IReferable referable) + { + if (referable is Submodel submodel && submodel.SubmodelElements != null) + { + if (submodel.SubmodelElements != null) + { + foreach (var submodelElement in submodel.SubmodelElements) + { + yield return submodelElement; + } + } + } + else if (referable is SubmodelElementCollection submodelElementCollection) + { + if (submodelElementCollection.Value != null) + { + foreach (var submodelElement in submodelElementCollection.Value) + { + yield return submodelElement; + } + } + } + else if (referable is SubmodelElementList submodelElementList) + { + if (submodelElementList.Value != null) + { + foreach (var submodelElement in submodelElementList.Value) + { + yield return submodelElement; + } + } + } + else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) + { + if (annotatedRelationshipElement.Annotations != null) + { + foreach (var submodelElement in annotatedRelationshipElement.Annotations) + { + yield return submodelElement; + } + } + } + else if (referable is Entity entity) + { + if (entity.Statements != null) + { + foreach (var submodelElement in entity.Statements) + { + yield return submodelElement; + } + } + } + else if (referable is Operation operation) + { + if (operation.InputVariables != null) + foreach (var inputVariable in operation.InputVariables) + { + yield return inputVariable.Value; + } + + if (operation.OutputVariables != null) + foreach (var outputVariable in operation.OutputVariables) + { + yield return outputVariable.Value; + } + + if (operation.InoutputVariables != null) + foreach (var inOutVariable in operation.InoutputVariables) + { + yield return inOutVariable.Value; + } + } + else + { + yield break; + } + } + + + public static void SetAllParentsAndTimestamps(this IReferable referable, IReferable parent, DateTime timeStamp, DateTime timeStampCreate) + { + if (parent == null) + return; + + referable.Parent = parent; + referable.TimeStamp = timeStamp; + referable.TimeStampCreate = timeStampCreate; + + foreach (var submodelElement in referable.EnumerateChildren()) + { + submodelElement.SetAllParentsAndTimestamps(referable, timeStamp, timeStampCreate); + } + } + + public static Submodel GetParentSubmodel(this IReferable referable) + { + IReferable parent = referable; + while (parent is not Submodel && parent != null) + parent = (IReferable)parent.Parent; + return parent as Submodel; + } + + public static string CollectIdShortByParent(this IReferable referable) + { + // recurse first + var head = ""; + if (referable is not IIdentifiable && referable.Parent is IReferable parentReferable) + // can go up + head = parentReferable.CollectIdShortByParent() + "/"; + // add own + var myid = ""; + if (string.IsNullOrEmpty(referable.IdShort)) + myid = referable.IdShort.Trim(); + // together + return head + myid; + } + + public static void AddDescription(this IReferable referable, string language, string Text) + { + if (referable.Description == null) + referable.Description = new List(); + referable.Description.Add(new LangString(language, Text)); + } + + public static List ListOfIReferableFrom( + System.Text.Json.Nodes.JsonNode node) + { + var res = new List(); + if (node == null) + return res; + var array = node.AsArray(); + foreach (var it in array) + { + var ir = Jsonization.Deserialize.IReferableFrom(it); + res.Add(ir); + } + return res; + } + + public static Key ToKey(this IReferable rf) + { + var sd = rf.GetSelfDescription(); + if (sd == null || !sd.KeyType.HasValue) + return null; + if (rf is IIdentifiable rfi) + return new Key(sd.KeyType.Value, rfi.Id); + return new Key(sd.KeyType.Value, rf.IdShort); + } + + public static System.Text.Json.Nodes.JsonNode ToJsonObject(List classes) + { + var jar = new System.Text.Json.Nodes.JsonArray(); + if (classes != null) + foreach (var c in classes) + jar.Add(Jsonization.Serialize.ToJsonObject(c)); + return jar; + } + + public static IEnumerable FindAllQualifierType(this IReferable rf, string qualifierType) + { + if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null || qualifierType == null) + yield break; + foreach (var q in rfq.Qualifiers) + if (q.Type.Trim().ToLower() == qualifierType.Trim().ToLower()) + yield return q; + } + + public static Qualifier HasQualifierOfType(this IReferable rf, string qualifierType) + { + if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null) + return null; + foreach (var q in rfq.Qualifiers) + if (q.Type?.Trim().ToLower() == qualifierType?.Trim().ToLower()) + return q; + return null; + } + + public static Qualifier Add(this IReferable rf, Qualifier q) + { + if (!(rf is IQualifiable rfq)) + return null; + if (rfq.Qualifiers == null) + rfq.Qualifiers = new List(); + rfq.Qualifiers.Add(q); + return q; + } + + public static IEnumerable FindAllExtensionName(this IReferable rf, string extensionName) + { + if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) + yield break; + foreach (var e in rfe.Extensions) + if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) + yield return e; + } + + + public static Extension HasExtensionOfName(this IReferable rf, string extensionName) + { + if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) + return null; + foreach (var e in rfe.Extensions) + if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) + return e; + return null; + } + + public static Extension Add(this IReferable rf, Extension ext) + { + if (rf.Extensions == null) + rf.Extensions = new List(); + rf.Extensions.Add(ext); + return ext; + } + + public static void MigrateV20QualifiersToExtensions(this IReferable rf) + { + // access + if (!(rf is IQualifiable iq) || iq.Qualifiers == null || !(rf is IHasExtensions ihe)) + return; + + // Qualifiers to migrate + var toMigrate = new[] { + "Animate.Args", "Plotting.Args", "TimeSeries.Args", "BOM.Args", "ImageMap.Args" + }; + + List toMove = new List(); + foreach (var q in iq.Qualifiers) + foreach (var tm in toMigrate) + if (q?.Type?.Equals(tm, StringComparison.InvariantCultureIgnoreCase) == true) + toMove.Add(q); + + // now move these + for (int i = 0; i < toMove.Count; i++) + { + var q = toMove[i]; + var ext = new Extension( + name: q.Type, semanticId: q.SemanticId, + valueType: q.ValueType, value: q.Value); + rf.Add(ext); + iq.Qualifiers.Remove(q); + } + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs new file mode 100644 index 000000000..d66ef6b84 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs @@ -0,0 +1,1514 @@ +using AdminShellNS; +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using AdminShellNS.Display; +using Newtonsoft.Json.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using Microsoft.Win32.SafeHandles; + +namespace Extensions +{ + public static class ExtendISubmodelElement + { + // constants + public static Type[] PROP_MLP = new Type[] { + typeof(MultiLanguageProperty), typeof(Property) }; + + #region AasxPackageExplorer + + public static object AddChild(this ISubmodelElement submodelElement, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (submodelElement is AnnotatedRelationshipElement annotatedRelationshipElement) + { + return annotatedRelationshipElement.AddChild(childSubmodelElement, placement); + } + else if (submodelElement is SubmodelElementCollection submodelElementCollection) + { + return submodelElementCollection.AddChild(childSubmodelElement, placement); + } + else if (submodelElement is SubmodelElementList submodelElementList) + { + return submodelElementList.AddChild(childSubmodelElement, placement); + } + else if (submodelElement is Operation operation) + { + return operation.AddChild(childSubmodelElement, placement); + } + else if (submodelElement is Entity entity) + { + return entity.AddChild(childSubmodelElement, placement); + } + else + return childSubmodelElement; + } + + public static Tuple ToCaptionInfo(this ISubmodelElement submodelElement) + { + var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodelElement.IdShort, ""); + var info = ""; + // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change + // display presentation .. therefore to be checked again + if (submodelElement.SemanticId != null) + AdminShellUtil.EvalToNonEmptyString("\u21e8 {0}", submodelElement.SemanticId.ToStringExtended(), ""); + return Tuple.Create(caption, info); + } + + public static void ValueFromText(this ISubmodelElement submodelElement, string text, string defaultLang = null) + { + switch (submodelElement) + { + case Property property: + { + property.ValueFromText(text); + break; + } + case MultiLanguageProperty multiLanguageProperty: + { + multiLanguageProperty.ValueFromText(text, defaultLang); + break; + } + default: + { + throw new Exception("Unhandled submodel element type"); + } + } + } + + #endregion + public static IEnumerable FindAllParents(this ISubmodelElement submodelElement, + Predicate p, + bool includeThis = false, bool includeSubmodel = false, + bool passOverMiss = false) + { + // call for this? + if (includeThis) + { + if (p == null || p.Invoke(submodelElement)) + yield return submodelElement; + else + if (!passOverMiss) + yield break; + } + + // daisy chain all parents .. + if (submodelElement.Parent != null) + { + if (submodelElement.Parent is ISubmodelElement psme) + { + foreach (var q in psme.FindAllParents(p, includeThis: true, + passOverMiss: passOverMiss)) + yield return q; + } + else if (includeSubmodel && submodelElement.Parent is Submodel psm) + { + if (p == null || p.Invoke(psm)) + yield return submodelElement; + } + } + } + + public static IEnumerable FindAllParentsWithSemanticId( + this ISubmodelElement submodelElement, Reference semId, + bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) + { + return (FindAllParents(submodelElement, + (rf) => (true == (rf as IHasSemantics)?.SemanticId?.Matches(semId, + matchMode: MatchMode.Relaxed)), + includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); + } + + public static string ValueAsText(this ISubmodelElement submodelElement, string defaultLang = null) + { + //TODO (who?, 0000-00-00): Need to check/test this logic again + if (submodelElement is Property property) + { + return property.ValueAsText(); + } + + if (submodelElement is MultiLanguageProperty multiLanguageProperty) + { + return multiLanguageProperty.ValueAsText(defaultLang); + } + + if (submodelElement is AasCore.Aas3_0_RC02.Range range) + { + return range.ValueAsText(); + } + + if (submodelElement is File file) + { + return file.ValueAsText(); + } + + return ""; + } + + public static Qualifier FindQualifierOfType(this ISubmodelElement submodelElement, string qualifierType) + { + if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) + { + return null; + } + + foreach (var qualifier in submodelElement.Qualifiers) + { + if (qualifier.Type.Equals(qualifierType, StringComparison.OrdinalIgnoreCase)) + { + return qualifier; + } + } + + return null; + + } + + public static Reference GetModelReference(this ISubmodelElement sme, bool includeParents = true) + { + // this will be the tail of our chain + var keyList = new List(); + var keyType = ExtensionsUtil.GetKeyType(sme); + var key = new Key(keyType, sme.IdShort); + keyList.Add(key); + + // keys for Parents will be INSERTED in front, iteratively + var currentParent = sme.Parent; + while (includeParents && currentParent != null) + { + if (currentParent is IIdentifiable identifiable) + { + var currentParentKey = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); + keyList.Insert(0, currentParentKey); + currentParent = null; + } + else if (currentParent is IReferable referable) + { + var currentParentKey = new Key(ExtensionsUtil.GetKeyType(referable), referable.IdShort); + keyList.Insert(0, currentParentKey); + currentParent = referable.Parent; + } + + } + + var outputReference = new Reference(ReferenceTypes.ModelReference, keyList); + outputReference.ReferredSemanticId = sme.SemanticId; + return outputReference; + } + + public static IEnumerable FindDeep(this ISubmodelElement submodelElement) + { + if (submodelElement is T) + { + yield return (T)submodelElement; + } + + foreach (var x in submodelElement.Descend().OfType()) + yield return x; + + //if (submodelElement is SubmodelElementList sml && sml.Value != null) + // foreach (var ce in sml.Value) + // if (ce != null) + // foreach (var x in ce.FindDeep()) + // yield return x; + + //if (submodelElement is AnnotatedRelationshipElement arel && arel.Annotations != null) + // foreach (var x in arel.FindDeep()) + // yield return x; + + //if (submodelElement is Entity entity) + // foreach (var statement in entity.Statements) + // foreach (var x in statement.FindDeep()) + // yield return x; + + //if (submodelElement is Operation operation) + //{ + // var variableCollection = new SubmodelElementCollection(); + // variableCollection.Value = new List(); + // foreach (var inputVariable in operation.InputVariables) + // { + // variableCollection.Value.Add(inputVariable.Value); + // } + // foreach (var outputVariable in operation.OutputVariables) + // { + // variableCollection.Value.Add(outputVariable.Value); + // } + // foreach (var inOutVariable in operation.InoutputVariables) + // { + // variableCollection.Value.Add(inOutVariable.Value); + // } + // yield return (T)variableCollection.FindDeep(); + //} + } + + public static ISubmodelElement ConvertFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) + { + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + if (sourceSubmodelElement is AdminShellV10.SubmodelElementCollection collection) + { + var newSmeCollection = new SubmodelElementCollection(); + outputSubmodelElement = newSmeCollection.ConvertFromV10(collection, shallowCopy); + } + else if (sourceSubmodelElement is AdminShellV10.Property sourceProperty) + { + var newProperty = new Property(DataTypeDefXsd.String); + outputSubmodelElement = newProperty.ConvertFromV10(sourceProperty); + } + else if (sourceSubmodelElement is AdminShellV10.File sourceFile) + { + var newFile = new File(""); + outputSubmodelElement = newFile.ConvertFromV10(sourceFile); + } + else if (sourceSubmodelElement is AdminShellV10.Blob blob) + { + var newBlob = new Blob(""); + outputSubmodelElement = newBlob.ConvertFromV10(blob); + } + else if (sourceSubmodelElement is AdminShellV10.ReferenceElement sourceReferenceElement) + { + outputSubmodelElement = new ReferenceElement(); + } + else if (sourceSubmodelElement is AdminShellV10.RelationshipElement sourceRelationshipElement) + { + var newFirst = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.first, ReferenceTypes.ModelReference); + var newSecond = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.second, ReferenceTypes.ModelReference); + outputSubmodelElement = new RelationshipElement(newFirst, newSecond); + } + + if (sourceSubmodelElement is AdminShellV10.Operation sourceOperation) + { + var newInputVariables = new List(); + var newOutputVariables = new List(); + if (sourceOperation.valueIn != null) + { + + foreach (var inputVariable in sourceOperation.valueIn) + { + if (inputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV10(inputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newInputVariables.Add(newOpVariable); + } + } + } + if (sourceOperation.valueOut != null) + { + foreach (var outputVariable in sourceOperation.valueOut) + { + if (outputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV10(outputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newOutputVariables.Add(newOpVariable); + } + } + } + + outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables); + } + + + outputSubmodelElement.BasicConversionFromV10(sourceSubmodelElement); + } + + return outputSubmodelElement; + } + + private static void BasicConversionFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement) + { + if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) + { + submodelElement.IdShort = sourceSubmodelElement.idShort; + } + + if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) + { + submodelElement.Category = sourceSubmodelElement.category; + } + + if (sourceSubmodelElement.description != null) + { + submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodelElement.description); + } + + if (sourceSubmodelElement.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in sourceSubmodelElement.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + submodelElement.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + if (sourceSubmodelElement.kind != null) + { + if (sourceSubmodelElement.kind.IsInstance) + { + submodelElement.Kind = ModelingKind.Instance; + } + else + { + submodelElement.Kind = ModelingKind.Template; + } + } + + if (sourceSubmodelElement.qualifiers != null && sourceSubmodelElement.qualifiers.Count != 0) + { + if (submodelElement.Qualifiers == null && submodelElement.Qualifiers.Count != 0) + { + submodelElement.Qualifiers = new List(); + } + + foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV10(sourceQualifier); + submodelElement.Qualifiers.Add(newQualifier); + } + } + + if (sourceSubmodelElement.hasDataSpecification != null) + { + //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) + if (submodelElement.EmbeddedDataSpecifications == null) + { + submodelElement.EmbeddedDataSpecifications = new List(); + } + foreach (var dataSpecification in sourceSubmodelElement.hasDataSpecification.reference) + { + submodelElement.EmbeddedDataSpecifications.Add( + new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.GlobalReference), + null)); + } + } + } + + public static ISubmodelElement ConvertFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) + { + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + if (sourceSubmodelElement is AdminShellV20.SubmodelElementCollection collection) + { + var newSmeCollection = new SubmodelElementCollection(); + outputSubmodelElement = newSmeCollection.ConvertFromV20(collection, shallowCopy); + } + else if (sourceSubmodelElement is AdminShellV20.Property sourceProperty) + { + var newProperty = new Property(DataTypeDefXsd.String); + outputSubmodelElement = newProperty.ConvertFromV20(sourceProperty); + } + else if (sourceSubmodelElement is AdminShellV20.MultiLanguageProperty sourceMultiLangProp) + { + var newMultiLangProperty = new MultiLanguageProperty(); + outputSubmodelElement = newMultiLangProperty.ConvertFromV20(sourceMultiLangProp); + } + else if (sourceSubmodelElement is AdminShellV20.Range sourceRange) + { + var newRange = new AasCore.Aas3_0_RC02.Range(DataTypeDefXsd.String); + outputSubmodelElement = newRange.ConvertFromV20(sourceRange); + } + else if (sourceSubmodelElement is AdminShellV20.File sourceFile) + { + var newFile = new File(""); + outputSubmodelElement = newFile.ConvertFromV20(sourceFile); + } + else if (sourceSubmodelElement is AdminShellV20.Blob blob) + { + var newBlob = new Blob(""); + outputSubmodelElement = newBlob.ConvertFromV20(blob); + } + else if (sourceSubmodelElement is AdminShellV20.ReferenceElement sourceReferenceElement) + { + var newReference = ExtensionsUtil.ConvertReferenceFromV20(sourceReferenceElement.value, ReferenceTypes.ModelReference); + outputSubmodelElement = new ReferenceElement(value: newReference); + } + else if (sourceSubmodelElement is AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelationshipElement) + { + var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.first, ReferenceTypes.ModelReference); + var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.second, ReferenceTypes.ModelReference); + var newAnnotedRelElement = new AnnotatedRelationshipElement(newFirst, newSecond); + outputSubmodelElement = newAnnotedRelElement.ConvertAnnotationsFromV20(sourceAnnotedRelationshipElement); + } + else if (sourceSubmodelElement is AdminShellV20.RelationshipElement sourceRelationshipElement) + { + var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.first, ReferenceTypes.ModelReference); + var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.second, ReferenceTypes.ModelReference); + outputSubmodelElement = new RelationshipElement(newFirst, newSecond); + } + else if (sourceSubmodelElement is AdminShellV20.BasicEvent sourceBasicEvent) + { + var newObserved = ExtensionsUtil.ConvertReferenceFromV20(sourceBasicEvent.observed, ReferenceTypes.ModelReference); + + outputSubmodelElement = new BasicEventElement(newObserved, Direction.Input, StateOfEvent.Off); + //TODO (jtikekar, 0000-00-00): default values of enums + } + else if (sourceSubmodelElement is AdminShellV20.Entity sourceEntity) + { + var entityType = Stringification.EntityTypeFromString(sourceEntity.entityType); + var newEntity = new Entity(entityType ?? EntityType.CoManagedEntity); + outputSubmodelElement = newEntity.ConvertFromV20(sourceEntity); + } + else if (sourceSubmodelElement is AdminShellV20.Operation sourceOperation) + { + var newInputVariables = new List(); + var newOutputVariables = new List(); + var newInOutVariables = new List(); + if (sourceOperation.inputVariable != null) + { + + foreach (var inputVariable in sourceOperation.inputVariable) + { + if (inputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV20(inputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newInputVariables.Add(newOpVariable); + } + } + } + if (sourceOperation.outputVariable != null) + { + foreach (var outputVariable in sourceOperation.outputVariable) + { + if (outputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV20(outputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newOutputVariables.Add(newOpVariable); + } + } + } + + if (sourceOperation.inoutputVariable != null) + { + foreach (var inOutVariable in sourceOperation.inoutputVariable) + { + if (inOutVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV20(inOutVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newInOutVariables.Add(newOpVariable); + } + } + } + + outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables, inoutputVariables: newInOutVariables); + } + + outputSubmodelElement.BasicConversionFromV20(sourceSubmodelElement); + } + + return outputSubmodelElement; + } + + private static void BasicConversionFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement) + { + if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) + submodelElement.IdShort = sourceSubmodelElement.idShort; + + if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) + submodelElement.Category = sourceSubmodelElement.category; + + if (sourceSubmodelElement.description != null) + submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceSubmodelElement.description); + + if (sourceSubmodelElement.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in sourceSubmodelElement.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + // DECISION: After phone call with Birgit, set all CD to GlobalReference + // assuming it is always a external concept + if (keyType == KeyTypes.ConceptDescription) + keyType = KeyTypes.GlobalReference; + + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + submodelElement.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + if (sourceSubmodelElement.kind != null) + { + if (sourceSubmodelElement.kind.IsInstance) + submodelElement.Kind = ModelingKind.Instance; + else + submodelElement.Kind = ModelingKind.Template; + } + + if (sourceSubmodelElement.qualifiers != null && sourceSubmodelElement.qualifiers.Count != 0) + { + if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) + submodelElement.Qualifiers = new List(); + + foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV20(sourceQualifier); + submodelElement.Qualifiers.Add(newQualifier); + } + } + + if (sourceSubmodelElement.hasDataSpecification != null) + { + //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) + if (submodelElement.EmbeddedDataSpecifications == null) + submodelElement.EmbeddedDataSpecifications = new List(); + + //TODO (jtikekar, 0000-00-00): DataSpecificationContent?? (as per old implementation) + foreach (var sourceDataSpec in sourceSubmodelElement.hasDataSpecification) + { + submodelElement.EmbeddedDataSpecifications.Add( + new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV20(sourceDataSpec.dataSpecification, ReferenceTypes.GlobalReference), + null)); + } + } + + // move Qualifiers to Extensions + submodelElement.MigrateV20QualifiersToExtensions(); + } + + #region List + + public static IReferable FindReferableByReference( + this List submodelElements, Reference rf, int keyIndex) + { + return FindReferableByReference(submodelElements, rf?.Keys, keyIndex); + } + + public static IReferable FindReferableByReference( + this List submodelElements, List keys, int keyIndex) + { + // first index needs to exist .. + if (submodelElements == null || keys == null || keyIndex >= keys.Count) + return null; + + + // over all wrappers + foreach (var smw in submodelElements) + if (smw != null && smw.IdShort.Equals(keys[keyIndex].Value, StringComparison.OrdinalIgnoreCase)) + { + // match on this level. Did we find a leaf element? + if ((keyIndex + 1) >= keys.Count) + return smw; + + // dive into SMC? + if (smw is SubmodelElementCollection smc) + { + var found = FindReferableByReference(smc.Value, keys, keyIndex + 1); + if (found != null) + return found; + } + // dive into SML? + if (smw is SubmodelElementList submodelElementList) + { + var found = FindReferableByReference(submodelElementList.Value, keys, keyIndex + 1); + if (found != null) + return found; + } + + // dive into AnnotedRelationshipElement? + if (smw is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotations = new List(annotatedRelationshipElement.Annotations); + var found = FindReferableByReference(annotations, keys, keyIndex + 1); + if (found != null) + return found; + } + + // dive into Entity statements? + if (smw is Entity ent) + { + var found = FindReferableByReference(ent.Statements, keys, keyIndex + 1); + if (found != null) + return found; + } + + // else: + return null; + } + + // no? + return null; + } + + public static IEnumerable FindDeep(this List submodelElements, Predicate match = null) where T : ISubmodelElement + { + foreach (var smw in submodelElements) + { + var current = smw; + if (current == null) + continue; + + // call lambda for this element + if (current is T) + if (match == null || match.Invoke((T)current)) + yield return (T)current; + + // dive into? + // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. + if (current is SubmodelElementCollection smc && smc.Value != null) + foreach (var x in smc.Value.FindDeep(match)) + yield return x; + + if (current is AnnotatedRelationshipElement are && are.Annotations != null) + { + var annotationsList = new List(are.Annotations); + foreach (var x in annotationsList.FindDeep(match)) + yield return x; + } + + if (current is Entity ent && ent.Statements != null) + foreach (var x in ent.Statements.FindDeep(match)) + yield return x; + + if (current is Operation op) + { + var operationVariables = new List(); + foreach (var opVariable in op.InputVariables) + { + operationVariables.Add(opVariable.Value); + } + + foreach (var opVariable in op.InoutputVariables) + { + operationVariables.Add(opVariable.Value); + } + + foreach (var opVariable in op.OutputVariables) + { + operationVariables.Add(opVariable.Value); + } + + foreach (var x in operationVariables.FindDeep(match)) + yield return x; + } + } + } + + public static void CopyManySMEbyCopy(this List submodelElements, ConceptDescription destCD, + List sourceSmc, ConceptDescription sourceCD, + bool createDefault = false, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement + { + submodelElements.CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), + createDefault ? destCD : null, setDefault, matchMode); + } + + public static void CopyManySMEbyCopy(this List submodelElements, Key destSemanticId, + List sourceSmc, Key sourceSemanticId, + ConceptDescription createDefault = null, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement + { + // bool find possible sources + bool foundSrc = false; + if (sourceSmc == null) + return; + foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) + { + // type of found src? + AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src.GetType().Name); + + // ok? + if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) + continue; + foundSrc = true; + + // ok, create new one + var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); + if (dst != null) + { + // make same things sure + dst.IdShort = src.IdShort; + dst.Category = src.Category; + dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId }); + + // instantanously add it? + submodelElements.Add(dst); + } + } + + // default? + if (createDefault != null && !foundSrc) + { + // ok, default + var dflt = submodelElements.CreateSMEForCD(createDefault, addSme: true); + + // set default? + setDefault?.Invoke(dflt); + } + } + + public static T CopyOneSMEbyCopy(this List submodelElements, ConceptDescription destCD, + List sourceSmc, Key[] sourceKeys, + bool createDefault = false, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + return submodelElements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, + createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); + } + + public static T CopyOneSMEbyCopy(this List submodelELements, ConceptDescription destCD, + List sourceSmc, ConceptDescription sourceCD, + bool createDefault = false, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + return submodelELements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, + createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); + } + + public static T CopyOneSMEbyCopy(this List submodelElements, Key destSemanticId, + List sourceSmc, Key[] sourceSemanticId, + ConceptDescription createDefault = null, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + // get source + var src = sourceSmc.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); + + // may be make an adaptive conversion + if (src == null) + { + var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); + src = submodelElements.AdaptiveConvertTo(anySrc, createDefault, + idShort: idShort, addSme: false); + } + + // proceed + AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src?.GetType().Name); + if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) + { + // create a default? + if (createDefault == null) + return default(T); + + // ok, default + var dflt = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + + // set default? + setDefault?.Invoke(dflt); + + // return + return dflt; + } + + // ok, create new one + var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); + if (dst == null) + return default(T); + + // make same things sure + dst.IdShort = src.IdShort; + dst.Category = src.Category; + dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId }); + + // instantanously add it? + if (addSme) + submodelElements.Add(dst); + + // give back + return (T)dst; + } + + public static T AdaptiveConvertTo(this List submodelElements, + ISubmodelElement anySrc, + ConceptDescription createDefault = null, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + if (typeof(T) == typeof(MultiLanguageProperty) + && anySrc is Property srcProp) + { + var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + if (res is MultiLanguageProperty mlp) + { + mlp.Value = new List() { new LangString("EN?", srcProp.Value) }; + mlp.ValueId = srcProp.ValueId; + return res; + } + } + + if (typeof(T) == typeof(Property) + && anySrc is MultiLanguageProperty srcMlp) + { + var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + if (res is Property prp) + { + prp.Value = "" + srcMlp.Value?.GetDefaultString(); + prp.ValueId = srcMlp.ValueId; + return res; + } + } + + return default(T); + } + + public static IEnumerable FindAllIdShort(this List submodelElements, + string idShort) + { + foreach (var smw in submodelElements) + if (smw != null) + if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) + yield return smw; + } + + public static IEnumerable FindAllIdShortAs(this List submodelElements, + string idShort) where T : class, ISubmodelElement + { + foreach (var smw in submodelElements) + if (smw is T) + if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) + yield return smw as T; + } + + public static ISubmodelElement FindFirstIdShort(this List submodelElements, + string idShort) + { + return submodelElements.FindAllIdShort(idShort)?.FirstOrDefault(); + } + + public static T FindFirstIdShortAs(this List submodelElements, + string idShort) where T : class, ISubmodelElement + { + return submodelElements.FindAllIdShortAs(idShort)?.FirstOrDefault(); + } + + + public static ISubmodelElement FindFirstAnySemanticId(this List submodelElements, + Key[] semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) + { + if (semId == null) + return null; + foreach (var si in semId) + { + var found = submodelElements.FindAllSemanticId(si, allowedTypes, matchMode)? + .FirstOrDefault(); + if (found != null) + return found; + } + return null; + } + + public static T FindFirstAnySemanticIdAs(this List submodelElements, Key[] semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + if (semId == null) + return default(T); + foreach (var si in semId) + { + var found = submodelElements.FindAllSemanticIdAs(si, matchMode).FirstOrDefault(); + if (found != null) + return found; + } + return default(T); + } + + public static T CreateNew(string idShort = null, string category = null, Reference semanticId = null) + where T : ISubmodelElement, new() + { + var res = new T(); + if (idShort != null) + res.IdShort = idShort; + if (category != null) + res.Category = category; + if (semanticId != null) + res.SemanticId = semanticId.Copy(); + return res; + } + + public static T CreateSMEForCD(this List submodelELements, ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + // access + if (conceptDescription == null) + return default(T); + + // fin type enum + var smeType = AdminShellUtil.AasSubmodelElementsFrom(); + if (!smeType.HasValue) + return default(T); + + // try to potentially figure out idShort + var ids = conceptDescription.IdShort; + + //TODO (jtikekar, 0000-00-00): Temporarily removed + if ((ids == null || ids.Trim() == "") && conceptDescription.GetIEC61360() != null) + ids = conceptDescription.GetIEC61360().ShortName? + .GetDefaultString(); + + if (idShort != null) + ids = idShort; + + if (ids == null) + return default(T); + + // unique? + if (idxTemplate != null) + ids = submodelELements.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); + + // make a new instance + var semanticId = conceptDescription.GetCdReference(); + ISubmodelElement sme = AdminShellUtil.CreateSubmodelElementFromEnum(smeType.Value); + if (sme == null) + return default(T); + sme.IdShort = ids; + sme.SemanticId = semanticId.Copy(); + if (category != null) + sme.Category = category; + if (isTemplate) + sme.Kind = ModelingKind.Template; + + // if its a SMC, make sure its accessible + if (sme is SubmodelElementCollection smc) + smc.Value = new List(); + + // instantanously add it? + if (addSme) + submodelELements.Add(sme); + + // give back + return (T)sme; + } + + public static IEnumerable FindAllSemanticIdAs(this List submodelELements, Key semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + foreach (var submodelElement in submodelELements) + if (submodelElement != null && submodelElement is T + && submodelElement.SemanticId != null) + if (submodelElement.SemanticId.MatchesExactlyOneKey(semId, matchMode)) + yield return (T)submodelElement; + } + + public static IEnumerable FindAllSemanticIdAs(this List submodelELements, + Reference semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + foreach (var submodelElement in submodelELements) + if (submodelElement != null && submodelElement is T + && submodelElement.SemanticId != null) + if (submodelElement.SemanticId.Matches(semId, matchMode)) + yield return (T)submodelElement; + } + + public static T FindFirstSemanticIdAs(this List submodelElements, + Key semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); + } + + public static T FindFirstSemanticIdAs(this List submodelElements, + Reference semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); + } + + public static void RecurseOnReferables(this List submodelElements, object state, List parents, + Func, IReferable, bool> lambda) + { + if (lambda == null) + return; + if (parents == null) + parents = new List(); + + // over all elements + foreach (var submodelElement in submodelElements) + { + var current = submodelElement; + if (current == null) + continue; + + // call lambda for this element + // AND decide, if to recurse! + var goDeeper = lambda(state, parents, current); + + if (goDeeper) + { + // add to parents + parents.Add(current); + + // dive into? + if (current is SubmodelElementCollection smc) + smc.Value?.RecurseOnReferables(state, parents, lambda); + + if (current is Entity ent) + ent.Statements?.RecurseOnReferables(state, parents, lambda); + + if (current is Operation operation) + { + SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); + foreach (var inputVariable in operation.InputVariables) + { + opVariableCollection.Value.Add(inputVariable.Value); + } + + foreach (var outputVariable in operation.OutputVariables) + { + opVariableCollection.Value.Add(outputVariable.Value); + } + + foreach (var inOutVariable in operation.InoutputVariables) + { + opVariableCollection.Value.Add(inOutVariable.Value); + } + + opVariableCollection.Value.RecurseOnReferables(state, parents, lambda); + } + + if (current is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotationElements = new List(); + if (annotatedRelationshipElement.Annotations != null) + foreach (var annotation in annotatedRelationshipElement.Annotations) + { + annotationElements.Add(annotation); + } + annotationElements.RecurseOnReferables(state, parents, lambda); + } + + // remove from parents + parents.RemoveAt(parents.Count - 1); + } + } + } + + public static void RecurseOnSubmodelElements(this List submodelElements, object state, List parents, Action, ISubmodelElement> lambda) + { + // trivial + if (lambda == null) + return; + if (parents == null) + parents = new List(); + + // over all elements + foreach (var smw in submodelElements) + { + var current = smw; + if (current == null) + continue; + + // call lambda for this element + lambda(state, parents, current); + + // add to parents + parents.Add(current); + + // dive into? + if (current is SubmodelElementCollection smc) + smc.Value?.RecurseOnSubmodelElements(state, parents, lambda); + + if (current is Entity ent) + ent.Statements?.RecurseOnSubmodelElements(state, parents, lambda); + + if (current is Operation operation) + { + SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); + foreach (var inputVariable in operation.InputVariables) + { + opVariableCollection.Value.Add(inputVariable.Value); + } + + foreach (var outputVariable in operation.OutputVariables) + { + opVariableCollection.Value.Add(outputVariable.Value); + } + + foreach (var inOutVariable in operation.InoutputVariables) + { + opVariableCollection.Value.Add(inOutVariable.Value); + } + + opVariableCollection.Value.RecurseOnSubmodelElements(state, parents, lambda); + } + + if (current is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotationElements = new List(); + foreach (var annotation in annotatedRelationshipElement.Annotations) + { + annotationElements.Add(annotation); + } + annotationElements.RecurseOnSubmodelElements(state, parents, lambda); + } + + // remove from parents + parents.RemoveAt(parents.Count - 1); + } + } + + public static IEnumerable FindAllSemanticIdAs(this List submodelELements, string semanticId) where T : ISubmodelElement + { + foreach (var submodelElement in submodelELements) + { + if (submodelElement != null && submodelElement is T && submodelElement.SemanticId != null) + { + if (submodelElement.SemanticId.Matches(semanticId)) + { + yield return (T)submodelElement; + } + } + } + } + + public static T FindFirstSemanticIdAs(this List submodelELements, string semanticId) where T : ISubmodelElement + { + return submodelELements.FindAllSemanticIdAs(semanticId).FirstOrDefault(); + } + + public static T FindFirstAnySemanticIdAs(this List submodelELements, string[] semanticIds) where T : ISubmodelElement + { + if (semanticIds == null) + return default; + foreach (var semanticId in semanticIds) + { + var found = submodelELements.FindFirstSemanticIdAs(semanticId); + if (found != null) + return found; + } + return default; + } + + public static IEnumerable FindAllSemanticId( + this List smes, + string[] allowedSemanticIds, + bool invertedAllowed = false) where T : ISubmodelElement + { + if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) + yield break; + + foreach (var sme in smes) + { + if (sme == null || !(sme is T)) + continue; + + if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) + { + if (invertedAllowed) + yield return (T)sme; + continue; + } + + var found = false; + foreach (var semanticId in allowedSemanticIds) + if (sme.SemanticId.Matches(semanticId)) + { + found = true; + break; + } + + if (invertedAllowed) + found = !found; + + if (found) + yield return (T)sme; + } + } + + public static T FindFirstAnySemanticId(this List submodelElements, string[] allowedSemanticIds, bool invertAllowed = false) where T : ISubmodelElement + { + return submodelElements.FindAllSemanticId(allowedSemanticIds, invertAllowed).FirstOrDefault(); + } + + public static IEnumerable FindAllSemanticId( + this List smes, + Key[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, + bool invertedAllowed = false) where T : ISubmodelElement + { + if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) + yield break; + + foreach (var sme in smes) + { + if (sme == null || !(sme is T)) + continue; + + if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) + { + if (invertedAllowed) + yield return (T)sme; + continue; + } + + var found = false; + foreach (var semanticId in allowedSemanticIds) + if (sme.SemanticId.MatchesExactlyOneKey(semanticId, mm)) + { + found = true; + break; + } + + if (invertedAllowed) + found = !found; + + if (found) + yield return (T)sme; + } + } + + public static T FindFirstAnySemanticId( + this List submodelElements, + Key[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, + bool invertAllowed = false) where T : ISubmodelElement + { + return submodelElements.FindAllSemanticId(allowedSemanticIds, mm, invertAllowed).FirstOrDefault(); + } + + public static IEnumerable FindAllSemanticId( + this List submodelElements, Key semId, + Type[] allowedTypes = null, + MatchMode matchMode = MatchMode.Strict) + { + foreach (var smw in submodelElements) + if (smw != null && smw.SemanticId != null) + { + if (smw == null) + continue; + + if (allowedTypes != null) + { + var smwt = smw.GetType(); + if (!allowedTypes.Contains(smwt)) + continue; + } + + if (smw.SemanticId.MatchesExactlyOneKey(semId, matchMode)) + yield return smw; + } + } + + public static ISubmodelElement FindFirstSemanticId(this List submodelElements, Key semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) + { + return submodelElements.FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); + } + + public static IEnumerable FindAllSemanticIdAs( + this List smes, + ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + foreach (var x in FindAllSemanticIdAs(smes, cd.GetReference(), matchMode)) + yield return x; + } + + public static T FindFirstSemanticIdAs( + this List smes, + ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + return smes.FindAllSemanticIdAs(cd, matchMode).FirstOrDefault(); + } + + + public static string IterateIdShortTemplateToBeUnique(this List submodelElements, string idShortTemplate, int maxNum) + { + if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) + return null; + + int i = 1; + while (i < maxNum) + { + var ids = string.Format(idShortTemplate, i); + if (submodelElements.CheckIdShortIsUnique(ids)) + return ids; + i++; + } + + return null; + } + + public static bool CheckIdShortIsUnique(this List submodelElements, string idShort) + { + idShort = idShort?.Trim(); + if (idShort == null || idShort.Length < 1) + return false; + + var res = true; + foreach (var smw in submodelElements) + if (smw != null && smw.IdShort != null && smw.IdShort == idShort) + { + res = false; + break; + } + + return res; + } + + #endregion + + public static ISubmodelElement UpdateFrom(this ISubmodelElement elem, ISubmodelElement source) + { + if (source == null) + return elem; + + // IReferable + elem.Category = source.Category; + elem.IdShort = source.IdShort; + elem.DisplayName = source.DisplayName?.Copy(); + elem.Description = source.Description?.Copy(); + elem.Checksum = source.Checksum; + + // IHasKind + if (source.Kind.HasValue) + elem.Kind = source.Kind.Value; + + // IHasSemantics + if (source.SemanticId != null) + elem.SemanticId = source.SemanticId.Copy(); + if (source.SupplementalSemanticIds != null) + elem.SupplementalSemanticIds = source.SupplementalSemanticIds.Copy(); + + // IQualifiable + if (source.Qualifiers != null) + elem.Qualifiers = source.Qualifiers.Copy(); + + // IHasDataSpecification + if (source.EmbeddedDataSpecifications != null) + elem.EmbeddedDataSpecifications = source.EmbeddedDataSpecifications.Copy(); + + return elem; + } + + // + // Factories + // + + private static readonly Dictionary AasSubmodelElementsToAbbrev = ( + new Dictionary() + { + { AasSubmodelElements.AnnotatedRelationshipElement, "RelA" }, + { AasSubmodelElements.BasicEventElement, "BEvt" }, + { AasSubmodelElements.Blob, "Blob" }, + { AasSubmodelElements.Capability, "Cap" }, + { AasSubmodelElements.DataElement, "DE" }, + { AasSubmodelElements.Entity, "Ent" }, + { AasSubmodelElements.EventElement, "Evt" }, + { AasSubmodelElements.File, "File" }, + { AasSubmodelElements.MultiLanguageProperty, "MLP" }, + { AasSubmodelElements.Operation, "Opr" }, + { AasSubmodelElements.Property, "Prop" }, + { AasSubmodelElements.Range, "Range" }, + { AasSubmodelElements.ReferenceElement, "Ref" }, + { AasSubmodelElements.RelationshipElement, "Rel" }, + { AasSubmodelElements.SubmodelElement, "SME" }, + { AasSubmodelElements.SubmodelElementList, "SML" }, + { AasSubmodelElements.SubmodelElementCollection, "SMC" } + }); + + /// + /// Retrieve the string abbreviation of . + /// + /// + /// If is not a valid literal, return null. + /// + public static string? ToString(AasSubmodelElements? that) + { + if (!that.HasValue) + { + return null; + } + else + { + if (AasSubmodelElementsToAbbrev.TryGetValue(that.Value, out string? value)) + { + return value; + } + else + { + return null; + } + } + } + + private static readonly Dictionary _aasSubmodelElementsFromAbbrev = ( + new Dictionary() + { + { "RelA", AasSubmodelElements.AnnotatedRelationshipElement }, + { "BEvt", AasSubmodelElements.BasicEventElement }, + { "Blob", AasSubmodelElements.Blob }, + { "Cap", AasSubmodelElements.Capability }, + { "DE", AasSubmodelElements.DataElement }, + { "Ent", AasSubmodelElements.Entity }, + { "Evt", AasSubmodelElements.EventElement }, + { "File", AasSubmodelElements.File }, + { "MLP", AasSubmodelElements.MultiLanguageProperty }, + { "Opr", AasSubmodelElements.Operation }, + { "Prop", AasSubmodelElements.Property }, + { "Range", AasSubmodelElements.Range }, + { "Ref", AasSubmodelElements.ReferenceElement }, + { "Rel", AasSubmodelElements.RelationshipElement }, + { "SME", AasSubmodelElements.SubmodelElement }, + { "SML", AasSubmodelElements.SubmodelElementList }, + { "SMC", AasSubmodelElements.SubmodelElementCollection } + }); + + /// + /// Parse the string abbreviation of . + /// + /// + /// If is not a valid string representation + /// of a literal of , + /// return null. + /// + public static AasSubmodelElements? AasSubmodelElementsFromAbbrev(string text) + { + if (_aasSubmodelElementsFromAbbrev.TryGetValue(text, out AasSubmodelElements value)) + { + return value; + } + else + { + return null; + } + } + + /// + /// Parse the string representation or the abbreviation of . + /// + /// + /// If is not a valid string representation + /// of a literal of , + /// return null. + /// + public static AasSubmodelElements? AasSubmodelElementsFromStringOrAbbrev(string text) + { + var res = Stringification.AasSubmodelElementsFromString(text); + if (res.HasValue) + return res; + + return AasSubmodelElementsFromAbbrev(text); + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKey.cs b/src/AasxCsharpLibrary/Extensions/ExtendKey.cs new file mode 100644 index 000000000..cad65e7b9 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendKey.cs @@ -0,0 +1,229 @@ +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; +using System.Text.RegularExpressions; + +namespace Extensions +{ + public static class ExtendKey + { + public static Key CreateFrom(Reference r) + { + if (r == null || r.Count() != 1) + return null; + return r.Keys[0].Copy(); + } + + public static bool Matches(this Key key, + KeyTypes type, string id, MatchMode matchMode = MatchMode.Strict) + { + if (matchMode == MatchMode.Strict) + return key.Type == type && key.Value == id; + + if (matchMode == MatchMode.Relaxed) + return (key.Type == type || key.Type == KeyTypes.GlobalReference || type == KeyTypes.GlobalReference) + && key.Value == id; + + if (matchMode == MatchMode.Identification) + return key.Value == id; + + return false; + } + public static bool Matches(this Key key, Key otherKey) + { + if (otherKey == null) + { + return false; + } + + if (key.Type == otherKey.Type && key.Value.Equals(otherKey.Value)) + { + return true; + } + + return false; + } + + public static bool Matches(this Key key, Key otherKey, MatchMode matchMode = MatchMode.Strict) + { + if (matchMode == MatchMode.Strict) + return key.Type == otherKey.Type && key.Value == otherKey.Value; + + if (matchMode == MatchMode.Relaxed) + return (key.Type == otherKey.Type || key.Type == KeyTypes.GlobalReference || otherKey.Type == KeyTypes.GlobalReference) + && (key.Value == otherKey.Value); + + if (matchMode == MatchMode.Identification) + return key.Value == otherKey.Value; + + return false; + } + + public static bool MatchesSetOfTypes(this Key key, IEnumerable set) + { + foreach (var kt in set) + if (key.Type == kt) + return true; + return false; + } + + + public static AasValidationAction Validate(this Key key, AasValidationRecordList results, IReferable container) + { + // access + if (results == null || container == null) + return AasValidationAction.No; + + var res = AasValidationAction.No; + + // check + if (key == null) + { + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, container, + "Key: is null", + () => + { + res = AasValidationAction.ToBeDeleted; + })); + } + else + { + + // check type + var tf = AdminShellUtil.CheckIfInConstantStringArray(Enum.GetNames(typeof(KeyTypes)), Stringification.ToString(key.Type)); + if (tf == AdminShellUtil.ConstantFoundEnum.No) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: type is not in allowed enumeration values", + () => + { + key.Type = KeyTypes.GlobalReference; + })); + if (tf == AdminShellUtil.ConstantFoundEnum.AnyCase) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: type in wrong casing", + () => + { + //NO IdType in V3 + //key.idType = AdminShellUtil.CorrectCasingForConstantStringArray( + // KeyElements, key.type); + })); + } + + // may give result "to be deleted" + return res; + } + + + + public static string ToStringExtended(this Key key, int format = 1) + { + if (format == 2) + return "" + key.Value; + return $"[{key.Type}, {key.Value}]"; + } + + public static bool IsAbsolute(this Key key) + { + return key.Type == KeyTypes.GlobalReference || key.Type == KeyTypes.AssetAdministrationShell || key.Type == KeyTypes.Submodel; + } + + public static Key Parse(string cell, KeyTypes typeIfNotSet = KeyTypes.GlobalReference, + bool allowFmtAll = false, bool allowFmt0 = false, + bool allowFmt1 = false, bool allowFmt2 = false) + { + // access and defaults? + if (cell == null || cell.Trim().Length < 1) + return null; + + // format == 1 + if (allowFmtAll || allowFmt1) + { + var m = Regex.Match(cell, @"\((\w+)\)( ?)(.*)$"); + if (m.Success) + { + return new Key( + Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, + m.Groups[3].ToString()); + } + } + + // format == 2 + if (allowFmtAll || allowFmt2) + { + var m = Regex.Match(cell, @"( ?)(.*)$"); + if (m.Success) + { + return new Key( + typeIfNotSet, m.Groups[2].ToString()); + } + } + + // format == 0 + if (allowFmtAll || allowFmt0) + { + var m = Regex.Match(cell, @"\[(\w+),( ?)(.*)\]"); + if (m.Success) + { + return new Key( + Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, + m.Groups[3].ToString()); + } + } + + // no + return null; + } + + // ------------------------------------------------------------------------------------------------------------- + #region Handling with enums for KeyTypes + + // see: https://stackoverflow.com/questions/27372816/how-to-read-the-value-for-an-enummember-attribute + //public static string? GetEnumMemberValue(this T value) + // where T : Enum + //{ + // return typeof(T) + // .GetTypeInfo() + // .DeclaredMembers + // .SingleOrDefault(x => x.Name == value.ToString()) + // ?.GetCustomAttribute(false) + // ?.Value; + //} + + //public static KeyTypes? MapFrom(AasReferables input) + //{ + // var st = input.GetEnumMemberValue(); + // var res = Stringification.KeyTypesFromString(st); + // return res; + //} + + //public static List MapFrom(IEnumerable input) + //{ + // List res = new(); + // foreach (var i in input) + // { + // var x = MapFrom(i); + // if (x.HasValue) + // res.Add(x.Value); + // } + // return res; + //} + + //public static List GetAllKeyTypesForAasReferables() + // => ExtendKey.MapFrom(Enum.GetValues(typeof(AasReferables)).OfType()); + + #endregion + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs b/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs new file mode 100644 index 000000000..ad8c7d959 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs @@ -0,0 +1,183 @@ +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; +using System.Text.RegularExpressions; +using Extensions; + +namespace Extensions +{ + public static class ExtendKeyList + { + public static bool IsEmpty(this List keys) + { + return keys.Count < 1; + } + + public static bool Matches(this List keys, List other, MatchMode matchMode = MatchMode.Strict) + { + if (other == null || other.Count != keys.Count) + return false; + + var same = true; + for (int i = 0; i < keys.Count; i++) + same = same && keys[i].Matches(other[i], matchMode); + + return same; + } + + public static List ReplaceLastKey(this List keys, List newKeys) + { + var res = new List(keys); + if (res.Count < 1 || newKeys == null || newKeys.Count < 1) + return res; + + res.Remove(res.Last()); + res.AddRange(newKeys); + return res; + } + + public static bool StartsWith(this List keyList, List otherKeyList) + { + if (otherKeyList == null || otherKeyList.Count == 0) + return false; + + // simply test element-wise + for (int i = 0; i < otherKeyList.Count; i++) + { + // does head have more elements than this list? + if (i >= keyList.Count) + return false; + + if (!otherKeyList[i].Matches(keyList[i])) + return false; + } + + // ok! + return true; + } + + public static bool StartsWith(this List keyList, List head, bool emptyIsTrue = false, + MatchMode matchMode = MatchMode.Relaxed) + { + // access + if (head == null) + return false; + if (head.Count == 0) + return emptyIsTrue; + + // simply test element-wise + for (int i = 0; i < head.Count; i++) + { + // does head have more elements than this list? + if (i >= keyList.Count) + return false; + + if (!head[i].Matches(keyList[i], matchMode)) + return false; + } + + // ok! + return true; + } + + public static string ToStringExtended(this List keys, int format = 1, string delimiter = ",") + { + return string.Join(delimiter, keys.Select((k) => k.ToStringExtended(format))); + } + + public static void Validate(this List keys, AasValidationRecordList results, + IReferable container) + { + // access + if (results == null || keys == null || container == null) + return; + + // iterate thru + var idx = 0; + while (idx < keys.Count) + { + var act = keys[idx].Validate(results, container); + if (act == AasValidationAction.ToBeDeleted) + { + keys.RemoveAt(idx); + continue; + } + idx++; + } + } + + public static bool MatchesSetOfTypes(this List key, IEnumerable set) + { + var res = true; + foreach (var kt in key) + if (!key.MatchesSetOfTypes(set)) + res = false; + return res; + } + + public static List Parse(string input) + { + // access + if (input == null) + return null; + + // split + var parts = input.Split(',', ';'); + var kl = new List(); + + foreach (var p in parts) + { + var k = ExtendKey.Parse(p); + if (k != null) + kl.Add(k); + } + + return kl; + } + + /// + /// Take only idShort, ignore all other key-types and create a '/'-separated list + /// + /// Empty string or list of idShorts + public static string BuildIdShortPath(this List keyList, + int startPos = 0, int count = int.MaxValue) + { + if (keyList == null || startPos >= keyList.Count) + return ""; + int nr = 0; + var res = ""; + for (int i = startPos; i < keyList.Count && nr < count; i++) + { + nr++; + //// if (keyList[i].Type.Trim().ToLower() == Key.IdShort.Trim().ToLower()) + { + if (res != "") + res += "/"; + res += keyList[i].Value; + } + } + return res; + } + + public static List SubList(this List keyList, + int startPos, int count = int.MaxValue) + { + var res = new List(); + if (startPos >= keyList.Count()) + return res; + int nr = 0; + for (int i = startPos; i < keyList.Count() && nr < count; i++) + { + nr++; + res.Add(keyList[i]); + } + return res; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs b/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs new file mode 100644 index 000000000..2b00c5fd1 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs @@ -0,0 +1,22 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; + +namespace Extensions +{ + public static class ExtendKeyTypes + { + public static bool IsSME(this KeyTypes keyType) + { + foreach (var kt in Constants.AasSubmodelElementsAsKeys) + if (kt.HasValue && kt.Value == keyType) + return true; + return false; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs b/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs new file mode 100644 index 000000000..1dc8f9504 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs @@ -0,0 +1,35 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendLangString + { + // constants + public static string LANG_DEFAULT = "en"; + + // MIHO: not required, see ExtendLangStringSte + //public static string GetDefaultString(this List langStrings, string defaultLang = null) + //{ + // // start + // if (defaultLang == null) + // defaultLang = "en"; + // defaultLang = defaultLang.Trim().ToLower(); + // string res = null; + + // // search + // foreach (var ls in langStrings) + // if (ls.Language.Trim().ToLower() == defaultLang) + // res = ls.Text; + // if (res == null && langStrings.Count > 0) + // res = langStrings[0].Text; + + // // found? + // return res; + //} + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs b/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs new file mode 100644 index 000000000..e39b2e0dd --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs @@ -0,0 +1,165 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace Extensions +{ + public static class ExtendLangStringSet + { + #region AasxPackageExplorer + + public static bool IsValid(this List langStringSet) + { + if (langStringSet != null && langStringSet.Count >= 1) + { + return true; + } + + return false; + } + + #endregion + public static bool IsEmpty(this List langStringSet) + { + if (langStringSet == null || langStringSet.Count == 0) + { + return true; + } + + return false; + } + public static string GetDefaultString(this List langStringSet, string defaultLang = null) + { + // start + if (defaultLang == null) + defaultLang = "en"; //Default Lang in old implementation is en + + string res = null; + + // search + foreach (var langString in langStringSet) + if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) + res = langString.Text; + + if (res == null && langStringSet.Count > 0) + res = langStringSet[0].Text; + + // found? + return res; + } + + public static List Create(string language, string text) + { + return new List { new LangString(language, text) }; + } + + public static List CreateManyFromStringArray(string[] s) + { + if (s == null) + return null; + var r = new List(); + var i = 0; + while ((i + 1) < s.Length) + { + r.Add(new LangString(s[i], s[i + 1])); + i += 2; + } + return r; + } + + // TODO (Jui, 2023-01-05): Check why the generic Copy does not apply here?! + public static List Copy(this List original) + { + var res = new List(); + if (original != null) + foreach (var o in original) + res.Add(o.Copy()); + return res; + } + + public static List Set(this List lss, string lang, string text) + { + foreach (var ls in lss) + if (ls.Language.Trim().ToLower() == lang?.Trim().ToLower()) + { + ls.Text = text; + return lss; + } + lss.Add(new LangString(lang, text)); + return lss; + } + + public static List ConvertFromV20( + this List langStringSet, + AasxCompatibilityModels.AdminShellV20.LangStringSet sourceLangStrings) + { + + //if (!sourceLangStrings.langString.IsNullOrEmpty()) + if (sourceLangStrings.langString != null && sourceLangStrings.langString.Count != 0) + { + langStringSet = new List(); + foreach (var sourceLangString in sourceLangStrings.langString) + { + var langString = new LangString(sourceLangString.lang, sourceLangString.str); + langStringSet.Add(langString); + } + } + return langStringSet; + } + + public static List ConvertFromV20( + this List lss, + AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) + { + + //if (!sourceLangStrings.langString.IsNullOrEmpty()) + if (src != null && src.Count != 0) + { + lss = new List(); + foreach (var sourceLangString in src) + { + var langString = new LangString(sourceLangString.lang, sourceLangString.str); + lss.Add(langString); + } + } + return lss; + } + + public static List Parse(string cell) + { + // access + if (cell == null) + return null; + + // iterative approach + var res = new List(); + while (true) + { + // trivial case and finite end + if (!cell.Contains("@")) + { + if (cell.Trim() != "") + res.Add(new LangString(ExtendLangString.LANG_DEFAULT, cell)); + break; + } + + // OK, pick the next couple + var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); + if (!m.Success) + { + // take emergency exit? + res.Add(new LangString("??", cell)); + break; + } + + // use the match and shorten cell .. + res.Add(new LangString(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); + cell = cell.Substring(m.Index + m.Length); + } + + return res; + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs b/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs new file mode 100644 index 000000000..142f91c65 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs @@ -0,0 +1,33 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AdminShellNS; + +namespace Extensions +{ + public static class ExtendModelKind + { + public static void Validate(this ModelingKind modelingKind, AasValidationRecordList results, IReferable container) + { + // access + if (results == null || container == null) + return; + + // check + if (modelingKind != ModelingKind.Template && modelingKind != ModelingKind.Instance) + { + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + $"ModelingKind: enumeration value neither Template nor Instance", + () => + { + modelingKind = ModelingKind.Instance; + })); + } + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs b/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs new file mode 100644 index 000000000..f53e5a192 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs @@ -0,0 +1,127 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendMultiLanguageProperty + { + #region AasxPackageExplorer + + public static void ValueFromText(this MultiLanguageProperty multiLanguageProperty, string text, string defaultLang) + { + multiLanguageProperty.Value ??= new List(); + + multiLanguageProperty.Value.Add(new LangString(defaultLang == null ? "en" : defaultLang, text)); + } + + #endregion + + public static string ValueAsText(this MultiLanguageProperty multiLanguageProperty, string defaultLang = null) + { + //TODO (who?, 0000-00-00): need to check/test again + //return "" + multiLanguageProperty.Value?.LangStrings.FirstOrDefault().Text; + return "" + multiLanguageProperty.Value?.GetDefaultString(defaultLang); + } + + public static MultiLanguageProperty ConvertFromV20(this MultiLanguageProperty property, AasxCompatibilityModels.AdminShellV20.MultiLanguageProperty sourceProperty) + { + if (sourceProperty == null) + { + return null; + } + + if (sourceProperty.valueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceProperty.valueId.Keys) + { + //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value not found for property {property.IdShort}"); + } + } + property.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + var newLangStrings = new List(); + + List newLangStringSet = new(newLangStrings); + + property.Value = newLangStringSet.ConvertFromV20(sourceProperty.value); + + return property; + + } + + public static MultiLanguageProperty UpdateFrom( + this MultiLanguageProperty elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + elem.Value = new List { new LangString("EN?", srcProp.Value) }; + if (srcProp.ValueId != null) + elem.ValueId = srcProp.ValueId.Copy(); + } + + if (source is MultiLanguageProperty srcMlp) + { + if (srcMlp.Value != null) + elem.Value = srcMlp.Value.Copy(); + if (srcMlp.ValueId != null) + elem.ValueId = srcMlp.ValueId.Copy(); + } + + if (source is AasCore.Aas3_0_RC02.Range srcRng) + { + if (srcRng.Min != null) + elem.Value = new List { new LangString("EN?", srcRng.Min) }; + } + + if (source is File srcFile) + { + elem.Value = new List { new LangString("EN?", srcFile.Value) }; + } + + return elem; + } + + public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, + List ls) + { + mlp.Value = ls; + return mlp; + } + + public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, + LangString ls) + { + if (ls == null) + return mlp; + if (mlp.Value == null) + mlp.Value = new List(); + mlp.Value.Set(ls.Language, ls.Text); + return mlp; + } + + public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, + string lang, string str) + { + return mlp.Set(new LangString(lang, str)); + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendObject.cs b/src/AasxCsharpLibrary/Extensions/ExtendObject.cs new file mode 100644 index 000000000..92ffe7867 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendObject.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Extensions.ArrayExtensions; + +namespace Extensions +{ + public static class ExtendObject + { + private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); + + public static bool IsPrimitive(this Type type) + { + if (type == typeof(String)) return true; + return (type.IsValueType & type.IsPrimitive); + } + + public static Object Copy(this Object originalObject) + { + return InternalCopy(originalObject, new Dictionary(new ReferenceEqualityComparer())); + } + + private static Object InternalCopy(Object originalObject, IDictionary visited) + { + if (originalObject == null) return null; + var typeToReflect = originalObject.GetType(); + if (IsPrimitive(typeToReflect)) return originalObject; + if (visited.ContainsKey(originalObject)) return visited[originalObject]; + if (typeof(Delegate).IsAssignableFrom(typeToReflect)) return null; + var cloneObject = CloneMethod.Invoke(originalObject, null); + if (typeToReflect.IsArray) + { + var arrayType = typeToReflect.GetElementType(); + if (IsPrimitive(arrayType) == false) + { + Array clonedArray = (Array)cloneObject; + clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); + } + + } + visited.Add(originalObject, cloneObject); + CopyFields(originalObject, visited, cloneObject, typeToReflect); + RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect); + return cloneObject; + } + + private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) + { + if (typeToReflect.BaseType != null) + { + RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); + CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); + } + } + + private static void CopyFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect, + BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, Func filter = null) + { + foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) + { + if (filter != null && filter(fieldInfo) == false) continue; + if (IsPrimitive(fieldInfo.FieldType)) continue; + var originalFieldValue = fieldInfo.GetValue(originalObject); + var clonedFieldValue = InternalCopy(originalFieldValue, visited); + fieldInfo.SetValue(cloneObject, clonedFieldValue); + } + } + public static T Copy(this T original) + { + return (T)Copy((Object)original); + } + } + + public class ReferenceEqualityComparer : EqualityComparer + { + public override bool Equals(object x, object y) + { + return ReferenceEquals(x, y); + } + public override int GetHashCode(object obj) + { + if (obj == null) return 0; + return obj.GetHashCode(); + } + } + + namespace ArrayExtensions + { + public static class ArrayExtensions + { + public static void ForEach(this Array array, Action action) + { + if (array.LongLength == 0) return; + ArrayTraverse walker = new ArrayTraverse(array); + do action(array, walker.Position); + while (walker.Step()); + } + } + + internal class ArrayTraverse + { + public int[] Position; + private int[] maxLengths; + + public ArrayTraverse(Array array) + { + maxLengths = new int[array.Rank]; + for (int i = 0; i < array.Rank; ++i) + { + maxLengths[i] = array.GetLength(i) - 1; + } + Position = new int[array.Rank]; + } + + public bool Step() + { + for (int i = 0; i < Position.Length; ++i) + { + if (Position[i] < maxLengths[i]) + { + Position[i]++; + for (int j = 0; j < i; j++) + { + Position[j] = 0; + } + return true; + } + } + return false; + } + } + } + +} + diff --git a/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs b/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs new file mode 100644 index 000000000..12ad52979 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs @@ -0,0 +1,148 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS.Display; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendOperation + { + #region AasxPackageExplorer + + public static object AddChild(this Operation operation, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + // not enough information to select list of children? + var pl = placement as EnumerationPlacmentOperationVariable; + if (childSubmodelElement == null || pl == null) + return null; + + // ok, use information + var ov = new OperationVariable(childSubmodelElement); + + if (childSubmodelElement != null) + childSubmodelElement.Parent = operation; + + if (pl.Direction == OperationVariableDirection.In) + { + operation.InputVariables ??= new List(); + operation.InputVariables.Add(ov); + } + + if (pl.Direction == OperationVariableDirection.Out) + { + operation.OutputVariables ??= new List(); + operation.OutputVariables.Add(ov); + } + + if (pl.Direction == OperationVariableDirection.InOut) + { + operation.InoutputVariables ??= new List(); + operation.InoutputVariables.Add(ov); + } + + return ov; + } + + public static EnumerationPlacmentBase GetChildrenPlacement(this Operation operation, ISubmodelElement child) + { + // trivial + if (child == null) + return null; + + // search + OperationVariableDirection? dir = null; + OperationVariable opvar = null; + if (operation.InputVariables != null) + foreach (var ov in operation.InputVariables) + if (ov?.Value == child) + { + dir = OperationVariableDirection.In; + opvar = ov; + } + + if (operation.OutputVariables != null) + foreach (var ov in operation.OutputVariables) + if (ov?.Value == child) + { + dir = OperationVariableDirection.Out; + opvar = ov; + } + + if (operation.InoutputVariables != null) + foreach (var ov in operation.InoutputVariables) + if (ov?.Value == child) + { + dir = OperationVariableDirection.InOut; + opvar = ov; + } + + // found + if (!dir.HasValue) + return null; + return new EnumerationPlacmentOperationVariable() + { + Direction = dir.Value, + OperationVariable = opvar + }; + } + + public static List GetVars(this Operation op, OperationVariableDirection dir) + { + if (dir == OperationVariableDirection.In) + return op.InputVariables; + if (dir == OperationVariableDirection.Out) + return op.OutputVariables; + return op.InoutputVariables; + } + + public static List SetVars( + this Operation op, OperationVariableDirection dir, List value) + { + if (dir == OperationVariableDirection.In) + { + op.InputVariables = value; + return op.InputVariables; + } + if (dir == OperationVariableDirection.Out) + { + op.OutputVariables = value; + return op.OutputVariables; + } + + op.InoutputVariables = value; + return op.InoutputVariables; + } + + #endregion + + public static Operation UpdateFrom( + this Operation elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is SubmodelElementCollection srcColl) + { + if (srcColl.Value != null) + elem.InputVariables = srcColl.Value.Copy().Select( + (isme) => new OperationVariable(isme)).ToList(); + } + + if (source is SubmodelElementCollection srcList) + { + if (srcList.Value != null) + elem.InputVariables = srcList.Value.Copy().Select( + (isme) => new OperationVariable(isme)).ToList(); + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs b/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs new file mode 100644 index 000000000..ac73ba1a9 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs @@ -0,0 +1,266 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendProperty + { + #region AasxPackageExplorer + + public static void ValueFromText(this Property property, string text) + { + property.Value = text; + } + + #endregion + public static bool IsValueTrue(this Property property) + { + if (property.ValueType == DataTypeDefXsd.Boolean) + { + if (property.Value.Equals("true", StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + } + + public static string ValueAsText(this Property property) + { + return "" + property.Value; + } + + public static double? ValueAsDouble(this Property prop) + { + // pointless + if (prop.Value == null || prop.Value.Trim() == "") + return null; + + // type? + if (!ExtendDataElement.ValueTypes_Number.Contains(prop.ValueType)) + return null; + + // try convert + if (double.TryParse(prop.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) + return dbl; + + // no + return null; + } + public static Property ConvertFromV10(this Property property, AasxCompatibilityModels.AdminShellV10.Property sourceProperty) + { + if (sourceProperty == null) + { + return null; + } + var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); + if (propertyType != null) + { + property.ValueType = (DataTypeDefXsd)propertyType; + } + else + { + Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); + } + property.Value = sourceProperty.value; + if (sourceProperty.valueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceProperty.valueId.Keys) + { + //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); + } + } + property.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + return property; + } + + public static Property ConvertFromV20(this Property property, AasxCompatibilityModels.AdminShellV20.Property sourceProperty) + { + if (sourceProperty == null) + { + return null; + } + + var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); + if (propertyType != null) + { + property.ValueType = (DataTypeDefXsd)propertyType; + } + else + { + Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); + } + property.Value = sourceProperty.value; + if (sourceProperty.valueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceProperty.valueId.Keys) + { + //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); + } + } + property.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + return property; + } + + public static Property UpdateFrom(this Property elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + elem.ValueType = srcProp.ValueType; + elem.Value = srcProp.Value; + if (srcProp.ValueId != null) + elem.ValueId = srcProp.ValueId.Copy(); + } + + if (source is AasCore.Aas3_0_RC02.Range srcRng) + { + elem.ValueType = srcRng.ValueType; + elem.Value = srcRng.Min; + } + + if (source is MultiLanguageProperty srcMlp) + { + elem.ValueType = DataTypeDefXsd.String; + elem.Value = "" + srcMlp.Value?.GetDefaultString(); + if (srcMlp.ValueId != null) + elem.ValueId = srcMlp.ValueId.Copy(); + } + + if (source is File srcFile) + { + elem.ValueType = DataTypeDefXsd.String; + elem.Value = "" + srcFile.Value; + } + + return elem; + } + + // MIHO: Jui, why was this required? +#if OLD + + public static void UpdatePropertyFrom(this Property property, Property sourceProperty) + { + if (sourceProperty.Extensions != null) + { + property.Extensions = sourceProperty.Extensions; + } + if (sourceProperty.Category != null) + { + property.Category = sourceProperty.Category; + } + if (sourceProperty.IdShort != null) + { + property.IdShort = sourceProperty.IdShort; + } + if (sourceProperty.DisplayName != null) + { + property.DisplayName = sourceProperty.DisplayName; + } + if (sourceProperty.Description != null) + { + property.Description = sourceProperty.Description; + } + if (sourceProperty.Checksum != null) + { + property.Checksum = sourceProperty.Checksum; + } + if (sourceProperty.Kind != null) + { + property.Kind = sourceProperty.Kind; + } + if (sourceProperty.SemanticId != null) + { + property.SemanticId = sourceProperty.SemanticId; + } + if (sourceProperty.SupplementalSemanticIds != null) + { + property.SupplementalSemanticIds = sourceProperty.SupplementalSemanticIds; + } + if (sourceProperty.Qualifiers != null) + { + property.Qualifiers = sourceProperty.Qualifiers; + } + if (sourceProperty.EmbeddedDataSpecifications != null) + { + property.EmbeddedDataSpecifications = sourceProperty.EmbeddedDataSpecifications; + } + if (true) + { + property.ValueType = sourceProperty.ValueType; + } + if (sourceProperty.ValueId != null) + { + property.ValueId = sourceProperty.ValueId; + } + if (sourceProperty.Value != null) + { + property.Value = sourceProperty.Value; + } + } +#endif + + public static Property Set(this Property prop, + DataTypeDefXsd valueType = DataTypeDefXsd.String, string value = "") + { + prop.ValueType = valueType; + prop.Value = value; + return prop; + } + + public static Property Set(this Property prop, + KeyTypes type, string value) + { + prop.ValueId = ExtendReference.CreateFromKey(new Key(type, value)); + return prop; + } + + public static Property Set(this Property prop, + Qualifier q) + { + if (q != null) + prop.Add(q); + return prop; + } + + public static Property Set(this Property prop, + Extension ext) + { + if (ext != null) + prop.Add(ext); + return prop; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs b/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs new file mode 100644 index 000000000..6acf27b96 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs @@ -0,0 +1,192 @@ +using AasCore.Aas3_0_RC02; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendQualifier + { + public static Qualifier ConvertFromV10(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV10.Qualifier sourceQualifier) + { + if (sourceQualifier.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + qualifier.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + qualifier.Type = sourceQualifier.qualifierType; + qualifier.Value = sourceQualifier.qualifierValue; + + if (sourceQualifier.qualifierValueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.qualifierValueId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + qualifier.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + return qualifier; + } + + public static Qualifier ConvertFromV20(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV20.Qualifier sourceQualifier) + { + if (sourceQualifier.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + + } + qualifier.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + qualifier.Type = sourceQualifier.type; + qualifier.Value = sourceQualifier.value; + + if (sourceQualifier.valueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.valueId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + qualifier.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + return qualifier; + } + + // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow + // ReSharper disable RedundantArgumentDefaultValue + public static string ToStringExtended(this Qualifier q, + int format = 0, string delimiter = ",") + { + var res = "" + q.Type; + if (res == "") + res += "" + q.SemanticId?.ToStringExtended(format, delimiter); + + if (q.Value != null) + res += " = " + q.Value; + else if (q.ValueId != null) + res += " = " + q.ValueId?.ToStringExtended(format, delimiter); + + return res; + } + // ReSharper enable MethodOverloadWithOptionalParameter + // ReSharper enable RedundantArgumentDefaultValue + + // + // + // List + // + // + + #region QualifierCollection + + public static Qualifier FindQualifierOfType(this List qualifiers, string qualifierType) + { + if (qualifierType == null) + { + return null; + } + + foreach (var qualifier in qualifiers) + { + if (qualifier != null && qualifierType.Equals(qualifier.Type)) + { + return qualifier; + } + } + + return null; + } + + // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow + // ReSharper disable RedundantArgumentDefaultValue + public static string ToStringExtended(this List qualifiers, + int format = 0, string delimiter = ";", string referencesDelimiter = ",") + { + var res = ""; + foreach (var q in qualifiers) + { + if (res != "") + res += delimiter; + res += q.ToStringExtended(format, referencesDelimiter); + } + return res; + } + // ReSharper enable MethodOverloadWithOptionalParameter + // ReSharper enable RedundantArgumentDefaultValue + + public static Qualifier FindType(this List qualifiers, string type) + { + if (type == null || qualifiers == null) + return null; + foreach (var q in qualifiers) + if (q != null && q.Type != null && q.Type.Trim() == type.Trim()) + return q; + return null; + } + + public static Qualifier Parse(string input) + { + var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); + if (!m.Success) + return null; + + return new Qualifier( + valueType: DataTypeDefXsd.String, + type: m.Groups[1].ToString().Trim(), + semanticId: ExtendReference.Parse(m.Groups[1].ToString().Trim()), + value: m.Groups[3].ToString().Trim(), + valueId: ExtendReference.Parse(m.Groups[1].ToString().Trim()) + ); + } + + #endregion + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendRange.cs b/src/AasxCsharpLibrary/Extensions/ExtendRange.cs new file mode 100644 index 000000000..e67c7b40c --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendRange.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AAS = AasCore.Aas3_0_RC02; + +namespace Extensions +{ + public static class ExtendRange + { + public static string ValueAsText(this AasCore.Aas3_0_RC02.Range range) + { + return "" + range.Min + " .. " + range.Max; + } + + public static AasCore.Aas3_0_RC02.Range ConvertFromV20(this AasCore.Aas3_0_RC02.Range range, AasxCompatibilityModels.AdminShellV20.Range sourceRange) + { + if (sourceRange == null) + { + return null; + } + + var propertyType = AAS.Stringification.DataTypeDefXsdFromString("xs:" + sourceRange.valueType); + if (propertyType != null) + { + range.ValueType = (AAS.DataTypeDefXsd)propertyType; + } + else + { + Console.WriteLine($"ValueType {sourceRange.valueType} not found for property {range.IdShort}"); + } + + range.Max = sourceRange.max; + range.Min = sourceRange.min; + + return range; + } + + public static AAS.Range UpdateFrom(this AAS.Range elem, AAS.ISubmodelElement source) + { + if (source == null) + return elem; + + ((AAS.ISubmodelElement)elem).UpdateFrom(source); + + if (source is AAS.Property srcProp) + { + elem.ValueType = srcProp.ValueType; + elem.Min = srcProp.Value; + elem.Max = elem.Min; + } + + if (source is AAS.MultiLanguageProperty srcMlp) + { + elem.ValueType = AAS.DataTypeDefXsd.String; + elem.Min = "" + srcMlp.Value?.GetDefaultString(); + elem.Max = elem.Min; + } + + if (source is AAS.File srcFile) + { + elem.ValueType = AAS.DataTypeDefXsd.String; + elem.Min = "" + srcFile.Value; + elem.Max = elem.Min; + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendReference.cs b/src/AasxCsharpLibrary/Extensions/ExtendReference.cs new file mode 100644 index 000000000..30c3781ed --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendReference.cs @@ -0,0 +1,264 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS.Exceptions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendReference + { + #region AasxPackageExplorer + + public static AasElementSelfDescription GetSelfDescription(this Reference reference) + { + return new AasElementSelfDescription("Reference", "Rfc", null, null); + } + + public static bool IsValid(this Reference reference) + { + return reference.Keys != null && !reference.Keys.IsEmpty(); + } + + /// + /// Formaly a static constructor. + /// Creates a Reference from a key, guessing Reference.Type. + /// + /// Given single Key + /// Reference with guessed type + public static Reference CreateFromKey(Key k) + { + var res = new Reference(ReferenceTypes.GlobalReference, new List { k }); + res.Type = res.GuessType(); + return res; + } + + /// + /// Formaly a static constructor. + /// Creates a Reference from a key, guessing Reference.Type. + /// + public static Reference CreateFromKey(KeyTypes type, + string value) + { + var res = new Reference(ReferenceTypes.GlobalReference, + new List { new Key(type, value) }); + res.Type = res.GuessType(); + return res; + } + + /// + /// Formaly a static constructor. + /// Creates a Reference from a list of keys, guessing Reference.Type. + /// + /// + /// + public static Reference CreateNew(List lk) + { + var res = new Reference(ReferenceTypes.GlobalReference, new List()); + if (lk == null) + return res; + res.Keys.AddRange(lk.Copy()); + res.Type = res.GuessType(); + return res; + } + + // TODO (Jui, 2023-01-05): Check why the generic Copy does not apply here?! + public static Reference Copy(this Reference original) + { + var res = new Reference(original.Type, new List()); + if (original != null) + foreach (var o in original.Keys) + res.Add(o.Copy()); + return res; + } + + + public static Reference Parse(string input) + { + var res = new Reference(ReferenceTypes.GlobalReference, new List()); + if (input == null) + return res; + + res.Keys = ExtendKeyList.Parse(input); + res.Type = res.GuessType(); + return res; + } + + //This is alternative for operator overloding method +, as operator overloading cannot be done in extension classes + public static Reference Add(this Reference a, Reference b) + { + a.Keys?.AddRange(b?.Keys); + return a; + } + + public static Reference Add(this Reference a, Key k) + { + if (k != null) + a.Keys?.Add(k); + return a; + } + + public static bool IsEmpty(this Reference reference) + { + if (reference == null || reference.Keys == null || reference.Keys.Count < 1) + { + return true; + } + + return false; + } + + #endregion + + public static bool Matches(this Reference reference, KeyTypes keyType, string id, MatchMode matchMode = MatchMode.Strict) + { + if (reference.IsEmpty()) + { + return false; + } + + if (reference.Keys.Count == 1) + { + var key = reference.Keys[0]; + return key.Matches(new Key(keyType, id), matchMode); + } + + return false; + } + + public static bool Matches(this Reference reference, string id) + { + if (string.IsNullOrEmpty(id)) + { + return false; + } + + if (reference.Keys.Count == 1) // As per old implementation + { + if (reference.Keys[0].Value == id) + return true; + } + + return false; + } + + public static bool Matches(this Reference reference, Reference otherReference, MatchMode matchMode = MatchMode.Strict) + { + if (reference.Keys == null || reference.Keys.Count == 0 || otherReference?.Keys == null || otherReference.Keys.Count == 0) + { + return false; + } + + bool match = true; + for (int i = 0; i < reference.Keys.Count; i++) + { + match = match && reference.Keys[i].Matches(otherReference.Keys[i], matchMode); + } + + return match; + } + + public static bool MatchesExactlyOneKey(this Reference reference, Key key, MatchMode matchMode = MatchMode.Strict) + { + if (key == null || reference.Keys == null || reference.Keys.Count != 1) + { + return false; + } + + var referenceKey = reference.Keys[0]; + return referenceKey.Matches(key, matchMode); + } + + public static string GetAsIdentifier(this Reference reference) + { + //TODO (who?, 0000-00-00): Make it Generic + if (reference.Type == ReferenceTypes.GlobalReference) // Applying only to Global Reference, based on older implementation + { + if (reference.Keys == null || reference.Keys.Count < 1) + { + return null; + } + + return reference.Keys[0].Value; + } + + return null; + } + + public static string MostSignificantInfo(this Reference reference) + { + if (reference.Keys.Count < 1) + { + return "-"; + } + + var i = reference.Keys.Count - 1; + var output = reference.Keys[i].Value; + if (reference.Keys[i].Type == KeyTypes.FragmentReference && i > 0) + output += reference.Keys[i - 1].Value; + return output; + } + + public static Key GetAsExactlyOneKey(this Reference reference) + { + if (reference.Keys == null || reference.Keys.Count != 1) + { + return null; + } + + var key = reference.Keys[0]; + return new Key(key.Type, key.Value); + } + + public static string ToStringExtended(this Reference reference, int format = 1, string delimiter = ",") + { + if (reference.Keys == null) + { + throw new NullValueException("Keys"); + } + + return reference.Keys.ToStringExtended(format, delimiter); + } + + public static ReferenceTypes GuessType(this Reference reference) + { + var setAasRefs = Constants.AasReferables.Where((kt) => kt != null).Select(kt => kt.Value).ToArray(); + var allAasRefs = true; + foreach (var k in reference.Keys) + if (!k.MatchesSetOfTypes(setAasRefs)) + allAasRefs = false; + if (allAasRefs) + return ReferenceTypes.ModelReference; + else + return ReferenceTypes.GlobalReference; + } + + public static int Count(this Reference rf) + { + return rf.Keys.Count; + } + + public static Key Last(this Reference rf) + { + return rf.Keys.Last(); + } + + public static string ListOfValues(this Reference rf, string delim) + { + string res = ""; + if (rf.Keys != null) + foreach (var x in rf.Keys) + { + if (x == null) + continue; + if (res != "") res += delim; + res += x.Value; + } + return res; + } + } + +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs new file mode 100644 index 000000000..4fdc888a0 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AAS = AasCore.Aas3_0_RC02; +using AasCore.Aas3_0_RC02; + +namespace Extensions +{ + public static class ExtendReferenceElement + { + public static AAS.ReferenceElement Set(this AAS.ReferenceElement elem, + Reference rf) + { + elem.Value = rf; + return elem; + } + + public static AAS.ReferenceElement UpdateFrom( + this AAS.ReferenceElement elem, AAS.ISubmodelElement source) + { + if (source == null) + return elem; + + ((AAS.ISubmodelElement)elem).UpdateFrom(source); + + if (source is AAS.RelationshipElement srcRel) + { + if (srcRel.First != null) + elem.Value = srcRel.First.Copy(); + } + + if (source is AAS.AnnotatedRelationshipElement srcRelA) + { + if (srcRelA.First != null) + elem.Value = srcRelA.First.Copy(); + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs new file mode 100644 index 000000000..45dfa17b3 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AAS = AasCore.Aas3_0_RC02; + +namespace Extensions +{ + public static class ExtendRelationshipElement + { + public static AAS.RelationshipElement Set(this AAS.RelationshipElement elem, + AAS.Reference first, AAS.Reference second) + { + elem.First = first; + elem.Second = second; + return elem; + } + + public static AAS.RelationshipElement UpdateFrom( + this AAS.RelationshipElement elem, AAS.ISubmodelElement source) + { + if (source == null) + return elem; + + ((AAS.ISubmodelElement)elem).UpdateFrom(source); + + if (source is AAS.ReferenceElement srcRef) + { + if (srcRef.Value != null) + elem.First = srcRef.Value.Copy(); + } + + if (source is AAS.AnnotatedRelationshipElement srcRelA) + { + if (srcRelA.First != null) + elem.First = srcRelA.First.Copy(); + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendStream.cs b/src/AasxCsharpLibrary/Extensions/ExtendStream.cs new file mode 100644 index 000000000..fefe4af1f --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendStream.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendStream + { + public static byte[] ToByteArray(this Stream stream) + { + using (stream) + { + using MemoryStream memStream = new(); + stream.CopyTo(memStream); + return memStream.ToArray(); + } + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs b/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs new file mode 100644 index 000000000..cb554c921 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs @@ -0,0 +1,15 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendStringification + { + public static IEnumerable DataTypeXsdToStringArray() => + Enum.GetValues(typeof(DataTypeDefXsd)).OfType().Select((dt) => Stringification.ToString(dt)); + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs new file mode 100644 index 000000000..2a420987c --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs @@ -0,0 +1,455 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS; +using AdminShellNS.Display; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendSubmodel + { + #region AasxPackageExplorer + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public static void RecurseOnReferables(this Submodel submodel, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + var parents = new List(); + if (includeThis) + { + lambda(state, null, submodel); + parents.Add(submodel); + } + submodel.SubmodelElements?.RecurseOnReferables(state, parents, lambda); + } + + public static void Remove(this Submodel submodel, ISubmodelElement submodelElement) + { + if (submodel != null) + { + if (submodel.SubmodelElements != null) + { + submodel.SubmodelElements.Remove(submodelElement); + } + } + } + + public static object AddChild(this Submodel submodel, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + submodel.SubmodelElements ??= new(); + if (childSubmodelElement != null) + childSubmodelElement.Parent = submodel; + submodel.SubmodelElements.Add(childSubmodelElement); + return childSubmodelElement; + } + + public static Tuple ToCaptionInfo(this Submodel submodel) + { + var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodel.IdShort, ""); + if (submodel.Administration != null) + caption += "V" + submodel.Administration.Version + "." + submodel.Administration.Revision; + var info = ""; + if (submodel.Id != null) + info = $"[{submodel.Id}]"; + return Tuple.Create(caption, info); + } + + public static IEnumerable FindAllReferences(this Submodel submodel) + { + // not nice: use temp list + var temp = new List(); + + // recurse + submodel.RecurseOnSubmodelElements(null, (state, parents, sme) => + { + if (sme is ReferenceElement re) + if (re.Value != null) + temp.Add(re.Value); + if (sme is RelationshipElement rl) + { + if (rl.First != null) + temp.Add(rl.First); + if (rl.Second != null) + temp.Add(rl.Second); + } + // recurse + return true; + }); + + // now, give back + foreach (var r in temp) + yield return new LocatedReference(submodel, r); + } + + #endregion + public static void Validate(this Submodel submodel, AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + submodel.BaseValidation(results); + submodel.Kind.Value.Validate(results, submodel); + submodel.SemanticId.Keys.Validate(results, submodel); + } + public static Submodel ConvertFromV10(this Submodel submodel, AasxCompatibilityModels.AdminShellV10.Submodel sourceSubmodel, bool shallowCopy = false) + { + if (sourceSubmodel == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceSubmodel.idShort)) + { + submodel.IdShort = ""; + } + else + { + submodel.IdShort = sourceSubmodel.idShort; + } + + if (sourceSubmodel.description != null) + { + submodel.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodel.description); + } + + if (sourceSubmodel.administration != null) + { + submodel.Administration = new AdministrativeInformation(version: sourceSubmodel.administration.version, revision: sourceSubmodel.administration.revision); + } + + if (sourceSubmodel.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in sourceSubmodel.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + submodel.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + if (sourceSubmodel.kind != null) + { + if (sourceSubmodel.kind.IsInstance) + { + submodel.Kind = ModelingKind.Instance; + } + else + { + submodel.Kind = ModelingKind.Template; + } + } + + if (sourceSubmodel.qualifiers != null && sourceSubmodel.qualifiers.Count != 0) + { + if (submodel.Qualifiers == null && submodel.Qualifiers.Count != 0) + { + submodel.Qualifiers = new List(); + } + + foreach (var sourceQualifier in sourceSubmodel.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV10(sourceQualifier); + submodel.Qualifiers.Add(newQualifier); + } + } + + if (!shallowCopy && sourceSubmodel.submodelElements != null) + { + if (submodel.SubmodelElements == null) + { + submodel.SubmodelElements = new List(); + } + + foreach (var submodelElementWrapper in sourceSubmodel.submodelElements) + { + var sourceSubmodelELement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelELement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelELement, shallowCopy); + submodel.SubmodelElements.Add(outputSubmodelElement); + } + + } + } + + return submodel; + + } + + public static Submodel ConvertFromV20(this Submodel sm, AasxCompatibilityModels.AdminShellV20.Submodel srcSM, bool shallowCopy = false) + { + if (srcSM == null) + return null; + + if (string.IsNullOrEmpty(srcSM.idShort)) + sm.IdShort = ""; + else + sm.IdShort = srcSM.idShort; + + if (srcSM.identification?.id != null) + sm.Id = srcSM.identification.id; + + if (srcSM.description != null) + sm.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcSM.description); + + if (srcSM.administration != null) + sm.Administration = new AdministrativeInformation( + version: srcSM.administration.version, revision: srcSM.administration.revision); + + if (srcSM.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in srcSM.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + sm.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + if (srcSM.kind != null) + { + if (srcSM.kind.IsInstance) + { + sm.Kind = ModelingKind.Instance; + } + else + { + sm.Kind = ModelingKind.Template; + } + } + + if (srcSM.qualifiers != null && srcSM.qualifiers.Count != 0) + { + if (sm.Qualifiers == null) + { + sm.Qualifiers = new List(); + } + + foreach (var sourceQualifier in srcSM.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV20(sourceQualifier); + sm.Qualifiers.Add(newQualifier); + } + } + + if (!shallowCopy && srcSM.submodelElements != null) + { + if (sm.SubmodelElements == null) + { + sm.SubmodelElements = new List(); + } + + foreach (var submodelElementWrapper in srcSM.submodelElements) + { + var sourceSubmodelELement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelELement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelELement, shallowCopy); + sm.SubmodelElements.Add(outputSubmodelElement); + } + + } + } + + // move Qualifiers to Extensions + sm.MigrateV20QualifiersToExtensions(); + + return sm; + } + + public static T FindFirstIdShortAs(this Submodel submodel, string idShort) where T : ISubmodelElement + { + + var submodelElement = submodel.SubmodelElements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + + return (T)submodelElement; + } + + public static IEnumerable FindDeep(this Submodel submodel) + { + if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) + { + yield break; + } + + foreach (var submodelElement in submodel.SubmodelElements) + { + foreach (var x in submodelElement.FindDeep()) + yield return x; + } + } + + public static Reference GetModelReference(this Submodel submodel) + { + var key = new Key(KeyTypes.Submodel, submodel.Id); + var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }) + { + ReferredSemanticId = submodel.SemanticId + }; + + return outputReference; + } + + /// + /// If instance, return semanticId as one key. + /// If template, return identification as key. + /// + public static Key GetSemanticKey(this Submodel submodel) + { + if (submodel.Kind == ModelingKind.Instance) + return submodel.SemanticId.GetAsExactlyOneKey(); + else + return new Key(KeyTypes.Submodel, submodel.Id); + } + + public static List SmeForWrite(this Submodel submodel) + { + if (submodel.SubmodelElements == null) + submodel.SubmodelElements = new(); + return submodel.SubmodelElements; + } + + public static void RecurseOnSubmodelElements(this Submodel submodel, object state, Func, ISubmodelElement, bool> lambda) + { + submodel.SubmodelElements?.RecurseOnReferables(state, null, (o, par, rf) => + { + if (rf is ISubmodelElement sme) + return lambda(o, par, sme); + else + return true; + }); + } + + public static ISubmodelElement FindSubmodelElementByIdShort(this Submodel submodel, string smeIdShort) + { + if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) + { + return null; + } + + var submodelElements = submodel.SubmodelElements.Where(sme => (sme != null) && sme.IdShort.Equals(smeIdShort, StringComparison.OrdinalIgnoreCase)); + if (submodelElements.Any()) + { + return submodelElements.First(); + } + else + { + return null; + } + } + + public static void SetAllParents(this Submodel submodel, DateTime timestamp) + { + if (submodel.SubmodelElements != null) + foreach (var sme in submodel.SubmodelElements) + SetParentsForSME(submodel, sme, timestamp); + } + + public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement, DateTime timestamp) + { + if (submodelElement == null) + return; + + submodelElement.Parent = parent; + submodelElement.TimeStamp = timestamp; + submodelElement.TimeStampCreate = timestamp; + + foreach (var childElement in submodelElement.EnumerateChildren()) + { + SetParentsForSME(submodelElement, childElement, timestamp); + } + } + + public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement) + { + if (submodelElement == null) + return; + + submodelElement.Parent = parent; + + foreach (var childElement in submodelElement.EnumerateChildren()) + { + SetParentsForSME(submodelElement, childElement); + } + } + + public static void SetAllParents(this Submodel submodel) + { + if (submodel.SubmodelElements != null) + foreach (var sme in submodel.SubmodelElements) + SetParentsForSME(submodel, sme); + } + + public static void Add(this Submodel submodel, ISubmodelElement submodelElement) + { + if (submodel.SubmodelElements == null) + { + submodel.SubmodelElements = new List(); + } + + submodelElement.Parent = submodel; + submodel.SubmodelElements.Add(submodelElement); + } + + public static void Insert(this Submodel submodel, int index, ISubmodelElement submodelElement) + { + if (submodel.SubmodelElements == null) + { + submodel.SubmodelElements = new List(); + } + + submodelElement.Parent = submodel; + submodel.SubmodelElements.Insert(index, submodelElement); + } + + public static T CreateSMEForCD( + this Submodel sm, + ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + if (sm.SubmodelElements == null) + sm.SubmodelElements = new List(); + return sm.SubmodelElements.CreateSMEForCD( + conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs new file mode 100644 index 000000000..1c29b2de9 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs @@ -0,0 +1,194 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS.Display; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendSubmodelElementCollection + { + #region AasxPackageExplorer + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public static void RecurseOnReferables(this SubmodelElementCollection submodelElementCollection, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + var parents = new List(); + if (includeThis) + { + lambda(state, null, submodelElementCollection); + parents.Add(submodelElementCollection); + } + submodelElementCollection.Value?.RecurseOnReferables(state, parents, lambda); + } + + public static void Remove(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) + { + if (submodelElementCollection != null) + { + if (submodelElementCollection.Value != null) + { + submodelElementCollection.Value.Remove(submodelElement); + } + } + } + + public static object AddChild(this SubmodelElementCollection submodelElementCollection, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + if (submodelElementCollection.Value == null) + submodelElementCollection.Value = new(); + if (childSubmodelElement != null) + childSubmodelElement.Parent = submodelElementCollection; + submodelElementCollection.Value.Add(childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static T FindFirstIdShortAs(this SubmodelElementCollection submodelElementCollection, string idShort) where T : ISubmodelElement + { + + var submodelElement = submodelElementCollection.Value.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + + return (T)submodelElement; + } + + public static SubmodelElementCollection ConvertFromV10(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) + { + if (sourceSmeCollection == null) + return null; + + if (submodelElementCollection.Value == null) + { + submodelElementCollection.Value = new List(); + } + + if (!shallowCopy) + { + foreach (var submodelElementWrapper in sourceSmeCollection.value) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelElement, shallowCopy); + } + + submodelElementCollection.Value.Add(outputSubmodelElement); + } + } + + return submodelElementCollection; + } + + public static SubmodelElementCollection ConvertFromV20(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV20.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) + { + if (sourceSmeCollection == null) + return null; + + if (submodelElementCollection.Value == null) + { + submodelElementCollection.Value = new List(); + } + + if (!shallowCopy) + { + foreach (var submodelElementWrapper in sourceSmeCollection.value) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement, shallowCopy); + } + + submodelElementCollection.Value.Add(outputSubmodelElement); + } + } + + return submodelElementCollection; + } + + public static void Add(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) + { + submodelElementCollection.Value ??= new List(); + + submodelElement.Parent = submodelElementCollection; + submodelElementCollection.Value.Add(submodelElement); + } + + public static void Insert(this SubmodelElementCollection submodelElementCollection, int index, ISubmodelElement submodelElement) + { + if (submodelElementCollection.Value == null) + { + submodelElementCollection.Value = new List(); + } + + submodelElement.Parent = submodelElementCollection; + submodelElementCollection.Value.Insert(index, submodelElement); + } + + public static T CreateSMEForCD( + this SubmodelElementCollection smc, + ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + if (smc.Value == null) + smc.Value = new List(); + return smc.Value.CreateSMEForCD( + conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); + } + + public static SubmodelElementCollection UpdateFrom( + this SubmodelElementCollection elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is SubmodelElementList srcList) + { + if (srcList.Value != null) + elem.Value = srcList.Value.Copy(); + } + + if (source is Operation srcOp) + { + Action, List> appov = (dst, src) => + { + if (src == null) + return; + foreach (var ov in src) + if (ov.Value != null) + dst.Append(ov.Value.Copy()); + }; + + elem.Value = new(); + appov(elem.Value, srcOp.InputVariables); + appov(elem.Value, srcOp.InoutputVariables); + appov(elem.Value, srcOp.OutputVariables); + if (elem.Value.Count < 1) + elem.Value = null; + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs new file mode 100644 index 000000000..4d700549f --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs @@ -0,0 +1,200 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS.Display; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendSubmodelElementList + { + #region AasxPackageExplorer + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public static void RecurseOnReferables(this SubmodelElementList submodelElementList, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + var parents = new List(); + if (includeThis) + { + lambda(state, null, submodelElementList); + parents.Add(submodelElementList); + } + submodelElementList.Value?.RecurseOnReferables(state, parents, lambda); + } + + public static void Add(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) + { + if (submodelElementList != null) + { + submodelElementList.Value ??= new(); + + submodelElement.Parent = submodelElementList; + + submodelElementList.Value.Add(submodelElement); + } + } + + public static void Remove(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) + { + if (submodelElementList != null) + { + if (submodelElementList.Value != null) + { + submodelElementList.Value.Remove(submodelElement); + } + } + } + + public static object AddChild(this SubmodelElementList submodelElementList, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + if (submodelElementList.Value == null) + submodelElementList.Value = new(); + if (childSubmodelElement != null) + childSubmodelElement.Parent = submodelElementList; + submodelElementList.Value.Add(childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static T FindFirstIdShortAs(this SubmodelElementList submodelElementList, string idShort) where T : ISubmodelElement + { + + var submodelElements = submodelElementList.Value.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); + + if (submodelElements.Any()) + { + return (T)submodelElements.First(); + } + + return default; + } + + public static SubmodelElementList UpdateFrom( + this SubmodelElementList elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is SubmodelElementCollection srcColl) + { + if (srcColl.Value != null) + elem.Value = srcColl.Value.Copy(); + } + + if (source is Operation srcOp) + { + Action, List> appov = (dst, src) => + { + if (src == null) + return; + foreach (var ov in src) + if (ov.Value != null) + dst.Append(ov.Value.Copy()); + }; + + elem.Value = new(); + appov(elem.Value, srcOp.InputVariables); + appov(elem.Value, srcOp.InoutputVariables); + appov(elem.Value, srcOp.OutputVariables); + if (elem.Value.Count < 1) + elem.Value = null; + } + + return elem; + } + + // advanced checks + + public class ConstraintStat + { + /// + /// Constraint AASd-107: If a first level child element in a SubmodelElementList has a semanticId + /// it shall be identical to SubmodelElementList/semanticIdListElement. + /// + public bool AllChildSemIdMatch = true; + + /// + /// Constraint AASd-108: All first level child elements in a SubmodelElementList shall have the + /// same submodel element type as specified in SubmodelElementList/typeValueListElement. + /// + public bool AllChildSmeTypeMatch = true; + + /// + /// Constraint AASd-109: If SubmodelElementList/typeValueListElement equal to Property or Range, + /// SubmodelElementList/valueTypeListElement shall be set and all first level child elements in + /// the SubmodelElementList shall have the the value type as specified in + /// SubmodelElementList/valueTypeListElement + /// + public bool AllChildValueTypeMatch = true; + } + + public static ConstraintStat EvalConstraintStat(this SubmodelElementList list) + { + // access + var res = new ConstraintStat(); + if (list.Value == null) + return res; + + // prepare SME type + var smeTypeToCheck = list.TypeValueListElement; + + // prepare value type + var valueTypeToCheck = list.ValueTypeListElement; + + // eval + foreach (var sme in list.Value) + { + // need self description + var smesd = sme.GetSelfDescription(); + if (smesd == null) + continue; + + // sem id? + if (res.AllChildSemIdMatch + && list.SemanticIdListElement?.IsValid() == true + && sme.SemanticId?.IsValid() == true + && !list.SemanticIdListElement.Matches(sme.SemanticId)) + res.AllChildSemIdMatch = false; + + // type of SME? + if (res.AllChildSmeTypeMatch + && smesd.SmeType != smeTypeToCheck) + res.AllChildSmeTypeMatch = false; + + // value type to check + if (valueTypeToCheck.HasValue + && res.AllChildValueTypeMatch + && sme is Property prop + && prop.ValueType != valueTypeToCheck.Value) + res.AllChildValueTypeMatch = false; + + if (valueTypeToCheck.HasValue + && res.AllChildValueTypeMatch + && sme is AasCore.Aas3_0_RC02.Range range + && range.ValueType != valueTypeToCheck.Value) + res.AllChildValueTypeMatch = false; + } + + // ok + return res; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs b/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs new file mode 100644 index 000000000..86d663963 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs @@ -0,0 +1,116 @@ +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtensionsUtil + { + + public static Reference ConvertReferenceFromV10(AdminShellV10.Reference sourceReference, ReferenceTypes referenceTypes) + { + Reference outputReference = null; + if (sourceReference != null) + { + var keyList = new List(); + foreach (var refKey in sourceReference.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + outputReference = new Reference(referenceTypes, keyList); + } + + return outputReference; + } + + public static Reference ConvertReferenceFromV20(AdminShellV20.Reference sourceReference, ReferenceTypes referenceTypes) + { + Reference outputReference = null; + if (sourceReference != null) + { + var keyList = new List(); + foreach (var refKey in sourceReference.Keys) + { + // Fix, as Asset does not exist anymore + if (refKey.type?.Trim().Equals("Asset", StringComparison.InvariantCultureIgnoreCase) == true) + refKey.type = "GlobalReference"; + + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + outputReference = new Reference(referenceTypes, keyList); + } + + return outputReference; + } + + internal static List ConvertDescriptionFromV10(AdminShellV10.Description sourceDescription) + { + var newLangStrList = new List(); + foreach (var ls in sourceDescription.langString) + { + newLangStrList.Add(new LangString(ls.lang, ls.str)); + } + + return new List(newLangStrList); + } + + internal static List ConvertDescriptionFromV20(AdminShellV20.Description sourceDescription) + { + var newLangStrList = new List(); + foreach (var ls in sourceDescription.langString) + { + newLangStrList.Add(new LangString(ls.lang, ls.str)); + } + + return new List(newLangStrList); + } + + internal static KeyTypes GetKeyType(IClass aasElement) + { + return aasElement switch + { + AssetAdministrationShell => KeyTypes.AssetAdministrationShell, + Submodel => KeyTypes.Submodel, + ConceptDescription => KeyTypes.ConceptDescription, + SubmodelElementCollection => KeyTypes.SubmodelElementCollection, + SubmodelElementList => KeyTypes.SubmodelElementList, + BasicEventElement => KeyTypes.BasicEventElement, + Blob => KeyTypes.Blob, + Entity => KeyTypes.Entity, + File => KeyTypes.File, + MultiLanguageProperty => KeyTypes.MultiLanguageProperty, + Property => KeyTypes.Property, + Operation => KeyTypes.Operation, + AasCore.Aas3_0_RC02.Range => KeyTypes.Range, + ReferenceElement => KeyTypes.ReferenceElement, + RelationshipElement => KeyTypes.RelationshipElement, + AnnotatedRelationshipElement => KeyTypes.AnnotatedRelationshipElement, + IIdentifiable => KeyTypes.Identifiable, + IReferable => KeyTypes.Referable, + Reference => KeyTypes.GlobalReference, + //TODO (jtikekar, 0000-00-00): what about model reference + _ => KeyTypes.SubmodelElement, // default case + }; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/LocatedReference.cs b/src/AasxCsharpLibrary/Extensions/LocatedReference.cs new file mode 100644 index 000000000..433578d61 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/LocatedReference.cs @@ -0,0 +1,22 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public class LocatedReference + { + public IIdentifiable Identifiable; + public Reference Reference; + + public LocatedReference() { } + public LocatedReference(IIdentifiable identifiable, Reference reference) + { + Identifiable = identifiable; + Reference = reference; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/MatchMode.cs b/src/AasxCsharpLibrary/Extensions/MatchMode.cs new file mode 100644 index 000000000..f30029657 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/MatchMode.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public enum MatchMode + { + Strict, //may be not needed in future, as no local flag in V3 + Relaxed, //should be as default + Identification + } +} diff --git a/src/AasxCsharpLibrary/IAasxOnlineConnection.cs b/src/AasxCsharpLibrary/IAasxOnlineConnection.cs index 79a5b4c13..7ce13b014 100644 --- a/src/AasxCsharpLibrary/IAasxOnlineConnection.cs +++ b/src/AasxCsharpLibrary/IAasxOnlineConnection.cs @@ -13,6 +13,7 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Linq; using System.Text; using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; using AdminShellNS; namespace AasxIntegrationBase @@ -27,6 +28,6 @@ public interface IAasxOnlineConnection string GetInfo(); Stream GetThumbnailStream(); string UpdatePropertyValue( - AdminShell.AdministrationShellEnv env, AdminShell.Submodel submodel, AdminShell.SubmodelElement sme); + AasCore.Aas3_0_RC02.Environment env, Submodel submodel, ISubmodelElement sme); } } diff --git a/src/AasxCsharpLibrary/LICENSE.txt b/src/AasxCsharpLibrary/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxCsharpLibrary/LICENSE.txt +++ b/src/AasxCsharpLibrary/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxCsharpLibrary/LogInternally.cs b/src/AasxCsharpLibrary/LogInternally.cs index 9c531e723..8d0c98dd3 100644 --- a/src/AasxCsharpLibrary/LogInternally.cs +++ b/src/AasxCsharpLibrary/LogInternally.cs @@ -7,6 +7,7 @@ This source code is licensed under the Apache License 2.0 (see LICENSE.txt). This source code may use other Open Source software components (see LICENSE.txt). */ +using System; using Exception = System.Exception; namespace AdminShellNS @@ -25,11 +26,20 @@ private static string GetExceptionMessages(this Exception e, string msgs = "") public static string FormatError(Exception ex, string where) { - return string.Format("Error: {0}: {1} {2} at {3}.", + var res = string.Format("Error: {0}: {1} {2} at {3}.", where, ex.Message, ex.GetExceptionMessages(), ex.StackTrace); + + var inner = ex.InnerException; + while (inner != null) + { + res += $"Inner message: {inner.Message}" + Environment.NewLine; + inner = inner.InnerException; + } + + return res; } } diff --git a/src/AasxCsharpLibrary/app.config b/src/AasxCsharpLibrary/app.config deleted file mode 100644 index 58c01219d..000000000 --- a/src/AasxCsharpLibrary/app.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary/packages.config b/src/AasxCsharpLibrary/packages.config deleted file mode 100644 index b0fe237ff..000000000 --- a/src/AasxCsharpLibrary/packages.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj b/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj index 316b4d599..97aacdf39 100644 --- a/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj +++ b/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj @@ -1,10 +1,11 @@  - net472 + net6.0-windows Library 8.0 Enable false + false UseAasxCompatibilityModels @@ -13,8 +14,8 @@ UseAasxCompatibilityModels - - + + diff --git a/src/AasxDictionaryImport.Tests/LICENSE.txt b/src/AasxDictionaryImport.Tests/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxDictionaryImport.Tests/LICENSE.txt +++ b/src/AasxDictionaryImport.Tests/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxDictionaryImport/AasxDictionaryImport.csproj b/src/AasxDictionaryImport/AasxDictionaryImport.csproj index e2e9248b4..3c059da7c 100644 --- a/src/AasxDictionaryImport/AasxDictionaryImport.csproj +++ b/src/AasxDictionaryImport/AasxDictionaryImport.csproj @@ -1,6 +1,6 @@ - + - net472 + net6.0-windows library Enable 8.0 @@ -8,6 +8,7 @@ true true x64 + false @@ -16,10 +17,5 @@ - - - - - diff --git a/src/AasxDictionaryImport/Cdd/Importer.cs b/src/AasxDictionaryImport/Cdd/Importer.cs index 554a6acee..8e702feee 100644 --- a/src/AasxDictionaryImport/Cdd/Importer.cs +++ b/src/AasxDictionaryImport/Cdd/Importer.cs @@ -11,7 +11,9 @@ This source code may use other Open Source software components (see LICENSE.txt) using System; using System.Collections.Generic; using System.Linq; +using Aas = AasCore.Aas3_0_RC02; using AdminShellNS; +using Extensions; namespace AasxDictionaryImport.Cdd { @@ -30,7 +32,7 @@ namespace AasxDictionaryImport.Cdd /// internal class Importer { - private readonly AdminShellV20.AdministrationShellEnv _env; + private readonly Aas.Environment _env; private readonly Context _context; private readonly bool _all; @@ -39,7 +41,7 @@ internal class Importer /// /// The environment to import the data into /// The data context of the IEC CDD data - public Importer(AdminShellV20.AdministrationShellEnv env, Context context) + public Importer(Aas.Environment env, Context context) { _env = env; _context = context; @@ -52,7 +54,7 @@ public Importer(AdminShellV20.AdministrationShellEnv env, Context context) /// The IEC CDD class to import /// The admin shell to import the submodel into /// true if the class was imported successfully - public bool ImportSubmodel(ClassWrapper cls, AdminShellV20.AdministrationShell adminShell) + public bool ImportSubmodel(ClassWrapper cls, Aas.AssetAdministrationShell adminShell) { if (!cls.IsSelected) return false; @@ -69,7 +71,7 @@ public bool ImportSubmodel(ClassWrapper cls, AdminShellV20.AdministrationShell a /// The IEC CDD element to import /// The parent element to import the submodel into /// true if the class was imported successfully - public bool ImportSubmodelElements(Model.IElement element, AdminShell.IManageSubmodelElements parent) + public bool ImportSubmodelElements(Model.IElement element, Aas.IReferable parent) { if (!element.IsSelected) return false; @@ -85,7 +87,7 @@ public bool ImportSubmodelElements(Model.IElement element, AdminShell.IManageSub } private void AddProperties(T elements, IEnumerable properties) - where T : AdminShellV20.IManageSubmodelElements + where T : Aas.IReferable { foreach (var property in properties) { @@ -98,7 +100,7 @@ private void AddProperties(T elements, IEnumerable properties } } - private AdminShellV20.SubmodelElement? CreateSubmodelElement(Model.IElement e) + private Aas.ISubmodelElement? CreateSubmodelElement(Model.IElement e) { if (e is ClassWrapper cls) return CreatePropertyCollection(cls.Element, cls.Children); @@ -107,7 +109,7 @@ private void AddProperties(T elements, IEnumerable properties return null; } - private AdminShellV20.SubmodelElementCollection CreatePropertyCollection(Class cls, + private Aas.SubmodelElementCollection CreatePropertyCollection(Class cls, IEnumerable properties) { var collection = Iec61360Utils.CreateCollection(_env, cls.GetIec61360Data(_all)); @@ -115,7 +117,7 @@ private AdminShellV20.SubmodelElementCollection CreatePropertyCollection(Class c return collection; } - private AdminShellV20.SubmodelElement? CreatePropertySubmodelElement(PropertyWrapper wrapper) + private Aas.ISubmodelElement? CreatePropertySubmodelElement(PropertyWrapper wrapper) { var reference = wrapper.Element.DataType.GetClassReference(); if (reference != null) @@ -130,7 +132,7 @@ private AdminShellV20.SubmodelElementCollection CreatePropertyCollection(Class c return CreateProperty(wrapper.Element); } - private AdminShellV20.SubmodelElementCollection CreateAggregateCollection( + private Aas.SubmodelElementCollection CreateAggregateCollection( PropertyWrapper wrapper, AggregateType aggregateType) { var collection = Iec61360Utils.CreateCollection(_env, wrapper.Element.GetIec61360Data(_all)); @@ -145,7 +147,7 @@ private AdminShellV20.SubmodelElementCollection CreateAggregateCollection( var element = CreateSubmodelElement(child); if (element != null) { - element.idShort += i; + element.IdShort += i; collection.Add(element); } } @@ -155,7 +157,7 @@ private AdminShellV20.SubmodelElementCollection CreateAggregateCollection( return collection; } - private AdminShellV20.SubmodelElementCollection CreateLevelCollection(Property property, LevelType levelType) + private Aas.SubmodelElementCollection CreateLevelCollection(Property property, LevelType levelType) { var data = property.GetIec61360Data(_all); var collection = Iec61360Utils.CreateCollection(_env, data); @@ -169,23 +171,24 @@ private AdminShellV20.SubmodelElementCollection CreateLevelCollection(Property p return collection; } - private AdminShellV20.Property CreateProperty(Property property) + private Aas.Property CreateProperty(Property property) { return Iec61360Utils.CreateProperty(_env, property.GetIec61360Data(_all), GetValueType(property.DataType)); } - private AdminShellV20.Property CreateLevelProperty(Iec61360Data data, LevelType levelType, + private Aas.Property CreateLevelProperty(Iec61360Data data, LevelType levelType, LevelType.Type levelValue) { // idShort for the level property: , e. g. MinimumOperatingTemperature, // MaximumOperatingTemperature var idShort = levelValue.ToString() + data.IdShort; - return new AdminShellV20.Property() + return new Aas.Property(Aas.DataTypeDefXsd.String) { - idShort = idShort, - kind = AdminShellV20.ModelingKind.CreateAsInstance(), - valueType = GetValueType(levelType.Subtype), + IdShort = idShort, + Kind = Aas.ModelingKind.Instance, + ValueType = Aas.Stringification.DataTypeDefXsdFromString(GetValueType(levelType.Subtype)) + ?? Aas.DataTypeDefXsd.String, }; } diff --git a/src/AasxDictionaryImport/Cdd/Model.cs b/src/AasxDictionaryImport/Cdd/Model.cs index 5efd317a7..75ea6274b 100644 --- a/src/AasxDictionaryImport/Cdd/Model.cs +++ b/src/AasxDictionaryImport/Cdd/Model.cs @@ -13,7 +13,9 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.IO; using System.Linq; using AasxDictionaryImport.Model; +using Aas = AasCore.Aas3_0_RC02; using AdminShellNS; +using Extensions; namespace AasxDictionaryImport.Cdd { @@ -263,15 +265,15 @@ public ClassWrapper(Context context, Class cls, Model.IElement? parent = null) } /// - public override bool ImportSubmodelInto(AdminShellV20.AdministrationShellEnv env, - AdminShellV20.AdministrationShell adminShell) + public override bool ImportSubmodelInto(Aas.Environment env, + Aas.AssetAdministrationShell adminShell) { return new Importer(env, Context).ImportSubmodel(this, adminShell); } /// - public override bool ImportSubmodelElementsInto(AdminShell.AdministrationShellEnv env, - AdminShell.IManageSubmodelElements parent) + public override bool ImportSubmodelElementsInto(Aas.Environment env, + Aas.IReferable parent) { // If we wanted to import the class, we would typically use the submodel import // instead. Therefore we import the children instead. @@ -350,8 +352,8 @@ public override Dictionary GetDetails() } /// - public override bool ImportSubmodelElementsInto(AdminShell.AdministrationShellEnv env, - AdminShell.IManageSubmodelElements parent) + public override bool ImportSubmodelElementsInto(Aas.Environment env, + Aas.IReferable parent) { return new Importer(env, Context).ImportSubmodelElements(this, parent); } diff --git a/src/AasxDictionaryImport/Eclass/Model.cs b/src/AasxDictionaryImport/Eclass/Model.cs index 4793ab102..7d4f58860 100644 --- a/src/AasxDictionaryImport/Eclass/Model.cs +++ b/src/AasxDictionaryImport/Eclass/Model.cs @@ -25,7 +25,10 @@ This source code may use other Open Source software components (see LICENSE.txt) using AasxDictionaryImport.Model; using AasxPackageExplorer; using AasxPackageLogic; +using Aas = AasCore.Aas3_0_RC02; using AdminShellNS; +using Extensions; + namespace AasxDictionaryImport.Eclass { @@ -659,8 +662,8 @@ private bool IsAspect() } /// - public override bool ImportSubmodelInto(AdminShellV20.AdministrationShellEnv env, - AdminShellV20.AdministrationShell adminShell) + public override bool ImportSubmodelInto(Aas.Environment env, + Aas.AssetAdministrationShell adminShell) { if (!IsSelected) return false; @@ -688,8 +691,8 @@ public override bool ImportSubmodelInto(AdminShellV20.AdministrationShellEnv env } /// - public override bool ImportSubmodelElementsInto(AdminShellV20.AdministrationShellEnv env, - AdminShellV20.IManageSubmodelElements parent) + public override bool ImportSubmodelElementsInto(Aas.Environment env, + Aas.IReferable parent) { if (!IsSelected) return false; @@ -786,8 +789,8 @@ public Property(Property property, Model.IElement? parent) } /// - public override bool ImportSubmodelElementsInto(AdminShellV20.AdministrationShellEnv env, - AdminShellV20.IManageSubmodelElements parent) + public override bool ImportSubmodelElementsInto(Aas.Environment env, + Aas.IReferable parent) { if (!IsSelected) return false; @@ -820,10 +823,10 @@ private static string GetDataType(string type) // TODO (krahlro-sick, 2021-02-23): This logic is copied from EclassUtils.GenerateConceptDescription -- does // it handle all possible values? var lowerType = type.ToLower(); - foreach (var aasType in AdminShell.DataSpecificationIEC61360.DataTypeNames) + foreach (var aasType in AdminShellUtil.GetEnumValues()) { - if (lowerType.Contains(aasType.ToLower())) - return aasType; + if (lowerType.Contains(aasType.ToString().ToLower())) + return aasType.ToString(); } return string.Empty; } diff --git a/src/AasxDictionaryImport/Iec61360Utils.cs b/src/AasxDictionaryImport/Iec61360Utils.cs index 7ac4f861f..130fbbaa4 100644 --- a/src/AasxDictionaryImport/Iec61360Utils.cs +++ b/src/AasxDictionaryImport/Iec61360Utils.cs @@ -13,7 +13,10 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Linq; using System.Threading; using AasxPackageLogic; +using Aas = AasCore.Aas3_0_RC02; using AdminShellNS; +using Extensions; +using AasCore.Aas3_0_RC02; namespace AasxDictionaryImport { @@ -41,27 +44,24 @@ public static string CreateIdShort(string s) /// The admin shell to add the submodel to /// The IEC 61360 data to create the submodel from /// A new submodel with the given data - public static AdminShellV20.Submodel CreateSubmodel( - AdminShellV20.AdministrationShellEnv env, - AdminShellV20.AdministrationShell adminShell, Iec61360Data data) + public static Aas.Submodel CreateSubmodel( + Aas.Environment env, + Aas.AssetAdministrationShell adminShell, Iec61360Data data) { // We need this to ensure that we don't use the same AAS ID twice when importing multiple submodels (as // GenerateIdAccordingTemplate uses the timestamp as part of the ID). Thread.Sleep(1000); - var submodel = new AdminShellV20.Submodel() - { - identification = new AdminShellV20.Identification( - AdminShell.Identification.IRI, - AdminShellUtil.GenerateIdAccordingTemplate(Options.Curr.TemplateIdSubmodelInstance)), - idShort = data.IdShort, - kind = AdminShellV20.ModelingKind.CreateAsInstance(), - }; + var submodel = new Aas.Submodel( + id: AdminShellUtil.GenerateIdAccordingTemplate(Options.Curr.TemplateIdSubmodelInstance), + idShort: data.IdShort, + kind: Aas.ModelingKind.Instance + ); AddDescriptions(submodel, data); AddDataSpecification(env, submodel, data); - adminShell.AddSubmodelRef(new AdminShell.SubmodelRef(submodel.GetReference())); - env.Submodels.Add(submodel); + adminShell.AddSubmodelReference(submodel.GetReference()); + env.Add(submodel); return submodel; } @@ -72,14 +72,13 @@ public static AdminShellV20.Submodel CreateSubmodel( /// The AAS environment to add the collection to /// The IEC 61360 data to create the collection from /// A new submodel element collection with the given data - public static AdminShellV20.SubmodelElementCollection CreateCollection( - AdminShellV20.AdministrationShellEnv env, Iec61360Data data) + public static Aas.SubmodelElementCollection CreateCollection( + Aas.Environment env, Iec61360Data data) { - var collection = new AdminShellV20.SubmodelElementCollection() - { - idShort = data.IdShort, - kind = AdminShellV20.ModelingKind.CreateAsInstance(), - }; + var collection = new Aas.SubmodelElementCollection( + idShort: data.IdShort, + kind: Aas.ModelingKind.Instance + ); InitSubmodelElement(env, collection, data); return collection; } @@ -91,84 +90,77 @@ public static AdminShellV20.SubmodelElementCollection CreateCollection( /// The IEC 61360 data to create the property from /// The value type of the property /// A new property with the given data - public static AdminShellV20.Property CreateProperty( - AdminShellV20.AdministrationShellEnv env, Iec61360Data data, string valueType) + public static Aas.Property CreateProperty( + Aas.Environment env, Iec61360Data data, string valueType) { - var property = new AdminShellV20.Property() - { - idShort = data.IdShort, - kind = AdminShellV20.ModelingKind.CreateAsInstance(), - valueType = valueType, - }; + var property = new Aas.Property( + idShort: data.IdShort, + kind: Aas.ModelingKind.Instance, + valueType: Aas.Stringification.DataTypeDefXsdFromString(valueType) ?? DataTypeDefXsd.String + ); InitSubmodelElement(env, property, data); return property; } - private static void InitSubmodelElement(AdminShellV20.AdministrationShellEnv env, - AdminShellV20.SubmodelElement submodelElement, Iec61360Data data) + private static void InitSubmodelElement(Aas.Environment env, + Aas.ISubmodelElement submodelElement, Iec61360Data data) { AddDescriptions(submodelElement, data); AddDataSpecification(env, submodelElement, data); } - private static void AddDescriptions(AdminShellV20.Referable r, Iec61360Data data) + private static void AddDescriptions(Aas.IReferable r, Iec61360Data data) { foreach (var lang in data.PreferredName.AvailableLanguages) r.AddDescription(lang, data.PreferredName.Get(lang)); } - private static void AddDataSpecification(AdminShellV20.AdministrationShellEnv env, - AdminShellV20.Submodel submodel, Iec61360Data data) + private static void AddDataSpecification(Aas.Environment env, + Aas.Submodel submodel, Iec61360Data data) { var cd = CreateConceptDescription(env, data); // cd should already contain IEC61360Spec; add data spec // TODO (Robin, 2020-09-03): MIHO is not sure, if the data spec reference is correct; please check - var eds = cd.IEC61360DataSpec; + var eds = cd.EmbeddedDataSpecifications.FindFirstIEC61360Spec(); if (eds != null) { - eds.dataSpecification = new AdminShellV20.DataSpecificationRef(cd.GetReference()); + eds.DataSpecification = new Reference(ReferenceTypes.GlobalReference, + new List(new[] { ExtendIDataSpecificationContent.GetKeyForIec61360() })); } - submodel.semanticId = new AdminShellV20.SemanticId(cd.GetReference()); + submodel.SemanticId = cd.GetReference().Copy(); } - private static void AddDataSpecification(AdminShellV20.AdministrationShellEnv env, - AdminShellV20.SubmodelElement submodelElement, Iec61360Data data) + private static void AddDataSpecification(Aas.Environment env, + Aas.ISubmodelElement submodelElement, Iec61360Data data) { var cd = CreateConceptDescription(env, data); // cd should already contain IEC61360Spec; add data spec // TODO (Robin, 2020-09-03): MIHO is not sure, if the data spec reference is correct; please check - var eds = cd.IEC61360DataSpec; + var eds = cd.EmbeddedDataSpecifications.FindFirstIEC61360Spec(); if (eds != null) { - eds.dataSpecification = new AdminShellV20.DataSpecificationRef(cd.GetReference()); + eds.DataSpecification = new Reference(ReferenceTypes.GlobalReference, + new List(new[] { ExtendIDataSpecificationContent.GetKeyForIec61360() })); } - submodelElement.semanticId = new AdminShellV20.SemanticId(cd.GetReference()); + submodelElement.SemanticId = cd.GetReference().Copy(); } - private static AdminShellV20.ConceptDescription CreateConceptDescription( - AdminShellV20.AdministrationShellEnv env, Iec61360Data data) + private static Aas.ConceptDescription CreateConceptDescription( + Aas.Environment env, Iec61360Data data) { - var cd = AdminShellV20.ConceptDescription.CreateNew( - data.IdShort, AdminShellV20.Identification.IRDI, data.Irdi); - - // TODO (Robin, 2020-09-03): check this code - cd.IEC61360Content = data.ToDataSpecification(); - // dead-csharp off - //cd.embeddedDataSpecification = new AdminShellV20.EmbeddedDataSpecification() - //{ - // dataSpecificationContent = new AdminShellV20.DataSpecificationContent() - // { - // dataSpecificationIEC61360 = data.ToDataSpecification(), - // }, - //}; - // dead-csharp on - - cd.AddIsCaseOf(AdminShellV20.Reference.CreateIrdiReference(data.Irdi)); - env.ConceptDescriptions.Add(cd); + var cd = new Aas.ConceptDescription( + idShort: data.IdShort, id: data.Irdi); + + var eds = cd.SetIEC61360Spec(); + eds.DataSpecificationContent = data.ToDataSpecification(); + + cd.AddIsCaseOf(ExtendReference.CreateFromKey(Aas.KeyTypes.GlobalReference, data.Irdi)); + + env.Add(cd); return cd; } @@ -288,14 +280,14 @@ public string GetDefault() /// are added to the set. /// /// A LangStringSet with the values form this multi string - public AdminShellV20.LangStringSetIEC61360 ToLangStringSet() + public List ToLangStringSet() { - var set = new AdminShellV20.LangStringSetIEC61360(); + var set = new List(); foreach (var lang in Languages) { var value = Get(lang); if (value.Length > 0) - set.Add(new AdminShellV20.LangStr(lang, value)); + set.Add(new Aas.LangString(lang, value)); } return set; } @@ -395,29 +387,27 @@ public Iec61360Data(string irdi) /// Converts this data to a DataSpecification object used by the AAS data model. Empty fields are ignored. /// /// The AAS DataSpecification with the data stored in this element - public AdminShellV20.DataSpecificationIEC61360 ToDataSpecification() + public Aas.DataSpecificationIec61360 ToDataSpecification() { - var ds = new AdminShellV20.DataSpecificationIEC61360() + var ds = new Aas.DataSpecificationIec61360(null) { - definition = Definition.ToLangStringSet(), - preferredName = PreferredName.ToLangStringSet(), - shortName = ShortName.ToLangStringSet(), + Definition = Definition.ToLangStringSet(), + PreferredName = PreferredName.ToLangStringSet(), + ShortName = ShortName.ToLangStringSet(), }; if (DefinitionSource.Length > 0) - ds.sourceOfDefinition = DefinitionSource; + ds.SourceOfDefinition = DefinitionSource; if (Symbol.Length > 0) - ds.symbol = Symbol; + ds.Symbol = Symbol; if (Unit.Length > 0) - ds.unit = Unit; + ds.Unit = Unit; if (UnitIrdi.Length > 0) - ds.unitId = AdminShellV20.UnitId.CreateNew( - AdminShellV20.Key.GlobalReference, false, - AdminShellV20.Identification.IRDI, UnitIrdi); + ds.UnitId = ExtendReference.CreateFromKey(Aas.KeyTypes.GlobalReference, UnitIrdi); if (DataType.Length > 0) - ds.dataType = DataType; + ds.DataType = Aas.Stringification.DataTypeIec61360FromString(DataType); if (DataFormat.Length > 0) - ds.valueFormat = DataFormat; + ds.ValueFormat = DataFormat; return ds; } diff --git a/src/AasxDictionaryImport/Import.cs b/src/AasxDictionaryImport/Import.cs index a0bed36da..c8f39b165 100644 --- a/src/AasxDictionaryImport/Import.cs +++ b/src/AasxDictionaryImport/Import.cs @@ -13,7 +13,9 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Windows; using System.Windows.Input; using AasxPackageLogic; +using Aas = AasCore.Aas3_0_RC02; using AdminShellNS; +using Extensions; namespace AasxDictionaryImport { @@ -68,8 +70,8 @@ public static class Import /// The admin shell to import into, or null if a new admin shell should be /// created /// true if at least one submodel was imported - public static bool ImportSubmodel(Window window, AdminShellV20.AdministrationShellEnv env, - string defaultSourceDir, AdminShellV20.AdministrationShell? adminShell = null) + public static bool ImportSubmodel(Window window, Aas.Environment env, + string defaultSourceDir, Aas.AssetAdministrationShell? adminShell = null) { adminShell ??= CreateAdminShell(env); return PerformImport(window, ImportMode.Submodels, defaultSourceDir, @@ -87,8 +89,8 @@ public static bool ImportSubmodel(Window window, AdminShellV20.AdministrationShe /// directory /// The parent element to import into /// true if at least one submodel element was imported - public static bool ImportSubmodelElements(Window window, AdminShell.AdministrationShellEnv env, - string defaultSourceDir, AdminShell.IManageSubmodelElements parent) + public static bool ImportSubmodelElements(Window window, Aas.Environment env, + string defaultSourceDir, Aas.IReferable parent) { return PerformImport(window, ImportMode.SubmodelElements, defaultSourceDir, e => e.ImportSubmodelElementsInto(env, parent)); @@ -117,15 +119,13 @@ private static bool PerformImport(Window window, ImportMode importMode, string d return imported > 0; } - private static AdminShellV20.AdministrationShell CreateAdminShell(AdminShellV20.AdministrationShellEnv env) + private static Aas.AssetAdministrationShell CreateAdminShell(Aas.Environment env) { - var adminShell = new AdminShellV20.AdministrationShell() + var adminShell = new Aas.AssetAdministrationShell("", new Aas.AssetInformation(Aas.AssetKind.Instance)) { - identification = new AdminShellV20.Identification( - AdminShellV20.Identification.IRI, - AdminShellUtil.GenerateIdAccordingTemplate(Options.Curr.TemplateIdAas)) + Id = AdminShellUtil.GenerateIdAccordingTemplate(Options.Curr.TemplateIdAas) }; - env.AdministrationShells.Add(adminShell); + env.Add(adminShell); return adminShell; } diff --git a/src/AasxDictionaryImport/LICENSE.txt b/src/AasxDictionaryImport/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxDictionaryImport/LICENSE.txt +++ b/src/AasxDictionaryImport/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxDictionaryImport/Model.cs b/src/AasxDictionaryImport/Model.cs index 8761ec929..28056ad19 100644 --- a/src/AasxDictionaryImport/Model.cs +++ b/src/AasxDictionaryImport/Model.cs @@ -12,7 +12,9 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Collections.Generic; using System.Linq; using System.Text; +using Aas = AasCore.Aas3_0_RC02; using AdminShellNS; +using Extensions; namespace AasxDictionaryImport.Model { @@ -238,8 +240,8 @@ public interface IElement /// The admin shell to add the submodel to /// true if the import was successful, or false if the import failed or if this element cannot be /// converted to an AAS submodel - bool ImportSubmodelInto(AdminShellV20.AdministrationShellEnv env, - AdminShellV20.AdministrationShell adminShell); + bool ImportSubmodelInto(Aas.Environment env, + Aas.AssetAdministrationShell adminShell); /// /// Converts this element into a AAS submodel element (i. e. a property or a collection) and adds it to the @@ -254,8 +256,8 @@ bool ImportSubmodelInto(AdminShellV20.AdministrationShellEnv env, /// The parent element to add the submodel elements to /// true if the import was successful, or false if the import failed or /// if this element cannot be converted to an AAS submodel element - bool ImportSubmodelElementsInto(AdminShell.AdministrationShellEnv env, - AdminShell.IManageSubmodelElements parent); + bool ImportSubmodelElementsInto(Aas.Environment env, + Aas.IReferable parent); /// /// Returns all detail information for this element, suitable for the user interface. The keys of the returned @@ -434,12 +436,12 @@ protected ElementBase(IDataSource dataSource, IElement? parent = null) public virtual Uri? GetDetailsUrl() => null; /// - public virtual bool ImportSubmodelInto(AdminShellV20.AdministrationShellEnv env, - AdminShellV20.AdministrationShell adminShell) => false; + public virtual bool ImportSubmodelInto(Aas.Environment env, + Aas.AssetAdministrationShell adminShell) => false; /// - public virtual bool ImportSubmodelElementsInto(AdminShell.AdministrationShellEnv env, - AdminShell.IManageSubmodelElements parent) => false; + public virtual bool ImportSubmodelElementsInto(Aas.Environment env, + Aas.IReferable parent) => false; /// public virtual bool Match(IEnumerable queryParts) diff --git a/src/AasxDictionaryImport/app.config b/src/AasxDictionaryImport/app.config deleted file mode 100644 index e936cc132..000000000 --- a/src/AasxDictionaryImport/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxDictionaryImport/packages.config b/src/AasxDictionaryImport/packages.config deleted file mode 100644 index 0a65480e8..000000000 --- a/src/AasxDictionaryImport/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/AasxFileServerRestLibrary/AasxFileServerRestLibrary.csproj b/src/AasxFileServerRestLibrary/AasxFileServerRestLibrary.csproj index 5f569ae73..e0774a0a7 100644 --- a/src/AasxFileServerRestLibrary/AasxFileServerRestLibrary.csproj +++ b/src/AasxFileServerRestLibrary/AasxFileServerRestLibrary.csproj @@ -1,19 +1,16 @@  - netstandard2.0 + net6.0 Library false IO.Swagger + false - - - - - - - - + + + + diff --git a/src/AasxFileServerRestLibrary/AasxFileServerRestLibrary.csproj.bak b/src/AasxFileServerRestLibrary/AasxFileServerRestLibrary.csproj.bak deleted file mode 100644 index fde5ab2f5..000000000 --- a/src/AasxFileServerRestLibrary/AasxFileServerRestLibrary.csproj.bak +++ /dev/null @@ -1,238 +0,0 @@ - - - - - Debug - AnyCPU - {6AFCA9D9-2F72-42BF-861B-F87D782C95C3} - Library - Properties - IO.Swagger - IO.Swagger - v4.7.2 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.5.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll - - - ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - - - ..\..\packages\RestSharp.107.3.0\lib\netstandard2.0\RestSharp.dll - - - - ..\..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll - - - - - ..\..\packages\System.IO.4.3.0\lib\net462\System.IO.dll - True - True - - - ..\..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll - - - - - ..\..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - - ..\..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll - True - True - - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll - - - ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll - True - True - - - ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll - True - True - - - ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll - True - True - - - ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll - True - True - - - ..\..\packages\System.Text.Encodings.Web.5.0.0\lib\net461\System.Text.Encodings.Web.dll - - - ..\..\packages\System.Text.Json.5.0.0\lib\net461\System.Text.Json.dll - - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll - - - ..\..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll - - - - - - - - - - $(SolutionDir)\packages\JsonSubTypes.1.2.0\lib\net45\JsonSubTypes.dll - ..\packages\JsonSubTypes.1.2.0\lib\net45\JsonSubTypes.dll - ..\..\packages\JsonSubTypes.1.2.0\lib\net45\JsonSubTypes.dll - ..\..\vendor\JsonSubTypes.1.2.0\lib\net45\JsonSubTypes.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {9863799B-4E44-4DA2-9120-C85C7985BC6D} - AasxCsharpLibrary - - - - \ No newline at end of file diff --git a/src/AasxFileServerRestLibrary/Api/AASXFileServerInterfaceApi.cs b/src/AasxFileServerRestLibrary/Api/AASXFileServerInterfaceApi.cs index 391fda311..ad7a78b55 100644 --- a/src/AasxFileServerRestLibrary/Api/AASXFileServerInterfaceApi.cs +++ b/src/AasxFileServerRestLibrary/Api/AASXFileServerInterfaceApi.cs @@ -1,1222 +1,1223 @@ -/* - * DotAAS Part 2 | HTTP/REST | Entire Interface Collection - * - * The entire interface collection as part of Details of the Asset Administration Shell Part 2 - * - * OpenAPI spec version: Final-Draft - * - * Generated by: https://github.com/swagger-api/swagger-codegen.git - */ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using AdminShellNS; -using IO.Swagger.Client; -using IO.Swagger.Model; -using RestSharp; - -namespace IO.Swagger.Api -{ - /// - /// Represents a collection of functions to interact with the API endpoints - /// - public interface IAASXFileServerInterfaceApi : IApiAccessor - { - #region Synchronous Operations - /// - /// Deletes a specific AASX package from the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The Package Id (BASE64-URL-encoded) - /// - void DeleteAASXByPackageId(string packageId); - - /// - /// Deletes a specific AASX package from the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The Package Id (BASE64-URL-encoded) - /// ApiResponse of Object(void) - ApiResponse DeleteAASXByPackageIdWithHttpInfo(string packageId); - /// - /// Returns a specific AASX package from the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The package Id (BASE64-URL-encoded) - /// byte[] - byte[] GetAASXByPackageId(string packageId); - - /// - /// Returns a specific AASX package from the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The package Id (BASE64-URL-encoded) - /// ApiResponse of byte[] - ApiResponse GetAASXByPackageIdWithHttpInfo(string packageId); - /// - /// Returns a list of available AASX packages at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) - /// List<PackageDescription> - List GetAllAASXPackageIds(string aasId = null); - - /// - /// Returns a list of available AASX packages at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) - /// ApiResponse of List<PackageDescription> - ApiResponse> GetAllAASXPackageIdsWithHttpInfo(string aasId = null); - /// - /// Stores the AASX package at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// - /// - /// - /// PackageDescription - //PackageDescription PostAASXPackage (List aasIds, byte[] file, string fileName); - int PostAASXPackage(List aasIds, byte[] file, string fileName); - - /// - /// Stores the AASX package at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// - /// - /// - /// ApiResponse of PackageDescription - //ApiResponse PostAASXPackageWithHttpInfo (List aasIds, byte[] file, string fileName); - ApiResponse PostAASXPackageWithHttpInfo(List aasIds, byte[] file, string fileName); - /// - /// Updates the AASX package at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// - /// - /// - /// The Package Id (BASE64-URL-encoded) - /// - void PutAASXByPackageId(List aasIds, byte[] file, string fileName, string packageId); - - /// - /// Updates the AASX package at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// - /// - /// - /// The Package Id (BASE64-URL-encoded) - /// ApiResponse of Object(void) - ApiResponse PutAASXByPackageIdWithHttpInfo(List aasIds, byte[] file, string fileName, string packageId); - #endregion Synchronous Operations - #region Asynchronous Operations - /// - /// Deletes a specific AASX package from the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The Package Id (BASE64-URL-encoded) - /// Task of void - System.Threading.Tasks.Task DeleteAASXByPackageIdAsync(string packageId); - - /// - /// Deletes a specific AASX package from the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The Package Id (BASE64-URL-encoded) - /// Task of ApiResponse - System.Threading.Tasks.Task> DeleteAASXByPackageIdAsyncWithHttpInfo(string packageId); - /// - /// Returns a specific AASX package from the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The package Id (BASE64-URL-encoded) - /// Task of byte[] - System.Threading.Tasks.Task GetAASXByPackageIdAsync(string packageId); - - /// - /// Returns a specific AASX package from the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The package Id (BASE64-URL-encoded) - /// Task of ApiResponse (byte[]) - System.Threading.Tasks.Task> GetAASXByPackageIdAsyncWithHttpInfo(string packageId); - /// - /// Returns a list of available AASX packages at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) - /// Task of List<PackageDescription> - System.Threading.Tasks.Task> GetAllAASXPackageIdsAsync(string aasId = null); - - /// - /// Returns a list of available AASX packages at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) - /// Task of ApiResponse (List<PackageDescription>) - System.Threading.Tasks.Task>> GetAllAASXPackageIdsAsyncWithHttpInfo(string aasId = null); - /// - /// Stores the AASX package at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// - /// - /// - /// Task of PackageDescription - System.Threading.Tasks.Task PostAASXPackageAsync(List aasIds, byte[] file, string fileName); - - /// - /// Stores the AASX package at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// - /// - /// - /// Task of ApiResponse (PackageDescription) - System.Threading.Tasks.Task> PostAASXPackageAsyncWithHttpInfo(List aasIds, byte[] file, string fileName); - /// - /// Updates the AASX package at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// - /// - /// - /// The Package Id (BASE64-URL-encoded) - /// Task of void - System.Threading.Tasks.Task PutAASXByPackageIdAsync(List aasIds, byte[] file, string fileName, string packageId); - - /// - /// Updates the AASX package at the server - /// - /// - /// - /// - /// Thrown when fails to make API call - /// - /// - /// - /// The Package Id (BASE64-URL-encoded) - /// Task of ApiResponse - System.Threading.Tasks.Task> PutAASXByPackageIdAsyncWithHttpInfo(List aasIds, byte[] file, string fileName, string packageId); - #endregion Asynchronous Operations - } - - /// - /// Represents a collection of functions to interact with the API endpoints - /// - public partial class AASXFileServerInterfaceApi : IAASXFileServerInterfaceApi - { - private IO.Swagger.Client.ExceptionFactory _exceptionFactory = (name, response) => null; - - /// - /// Initializes a new instance of the class. - /// - /// - public AASXFileServerInterfaceApi(String basePath) - { - this.Configuration = new IO.Swagger.Client.Configuration { BasePath = basePath }; - - ExceptionFactory = IO.Swagger.Client.Configuration.DefaultExceptionFactory; - } - - /// - /// Initializes a new instance of the class - /// - /// - public AASXFileServerInterfaceApi() - { - this.Configuration = IO.Swagger.Client.Configuration.Default; - - ExceptionFactory = IO.Swagger.Client.Configuration.DefaultExceptionFactory; - } - - /// - /// Initializes a new instance of the class - /// using Configuration object - /// - /// An instance of Configuration - /// - public AASXFileServerInterfaceApi(IO.Swagger.Client.Configuration configuration = null) - { - if (configuration == null) // use the default one in Configuration - this.Configuration = IO.Swagger.Client.Configuration.Default; - else - this.Configuration = configuration; - - ExceptionFactory = IO.Swagger.Client.Configuration.DefaultExceptionFactory; - } - - /// - /// Gets the base path of the API client. - /// - /// The base path - public String GetBasePath() - { - //TODO (jtikekar, 2022-04-04): Change - return this.Configuration.BasePath; - //return this.Configuration.ApiClient.RestClient.BaseUrl.ToString(); - } - - /// - /// Sets the base path of the API client. - /// - /// The base path - [Obsolete("SetBasePath is deprecated, please do 'Configuration.ApiClient = new ApiClient(\"http://new-path\")' instead.")] - public void SetBasePath(String basePath) - { - // do nothing - } - - /// - /// Gets or sets the configuration object - /// - /// An instance of the Configuration - public IO.Swagger.Client.Configuration Configuration { get; set; } - - /// - /// Provides a factory method hook for the creation of exceptions. - /// - public IO.Swagger.Client.ExceptionFactory ExceptionFactory - { - get - { - if (_exceptionFactory != null && _exceptionFactory.GetInvocationList().Length > 1) - { - throw new InvalidOperationException("Multicast delegate for ExceptionFactory is unsupported."); - } - return _exceptionFactory; - } - set { _exceptionFactory = value; } - } - - /// - /// Gets the default header. - /// - /// Dictionary of HTTP header - [Obsolete("DefaultHeader is deprecated, please use Configuration.DefaultHeader instead.")] - public IDictionary DefaultHeader() - { - return new ReadOnlyDictionary(this.Configuration.DefaultHeader); - } - - /// - /// Add default header. - /// - /// Header field name. - /// Header field value. - /// - [Obsolete("AddDefaultHeader is deprecated, please use Configuration.AddDefaultHeader instead.")] - public void AddDefaultHeader(string key, string value) - { - this.Configuration.AddDefaultHeader(key, value); - } - - /// - /// Deletes a specific AASX package from the server - /// - /// Thrown when fails to make API call - /// The Package Id (BASE64-URL-encoded) - /// - public void DeleteAASXByPackageId(string packageId) - { - DeleteAASXByPackageIdWithHttpInfo(packageId); - } - - /// - /// Deletes a specific AASX package from the server - /// - /// Thrown when fails to make API call - /// The Package Id (BASE64-URL-encoded) - /// ApiResponse of Object(void) - public ApiResponse DeleteAASXByPackageIdWithHttpInfo(string packageId) - { - // verify the required parameter 'packageId' is set - if (packageId == null) - throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->DeleteAASXByPackageId"); - - var localVarPath = "/packages/{packageId}"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("DeleteAASXByPackageId", localVarResponse); - if (exception != null) throw exception; - } - - return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - null); - } - - /// - /// Deletes a specific AASX package from the server - /// - /// Thrown when fails to make API call - /// The Package Id (BASE64-URL-encoded) - /// Task of void - public async System.Threading.Tasks.Task DeleteAASXByPackageIdAsync(string packageId) - { - await DeleteAASXByPackageIdAsyncWithHttpInfo(packageId); - - } - - /// - /// Deletes a specific AASX package from the server - /// - /// Thrown when fails to make API call - /// The Package Id (BASE64-URL-encoded) - /// Task of ApiResponse - public async System.Threading.Tasks.Task> DeleteAASXByPackageIdAsyncWithHttpInfo(string packageId) - { - // verify the required parameter 'packageId' is set - if (packageId == null) - throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->DeleteAASXByPackageId"); - - var localVarPath = "/packages/{packageId}"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("DeleteAASXByPackageId", localVarResponse); - if (exception != null) throw exception; - } - - return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - null); - } - - /// - /// Returns a specific AASX package from the server - /// - /// Thrown when fails to make API call - /// The package Id (BASE64-URL-encoded) - /// byte[] - public byte[] GetAASXByPackageId(string packageId) - { - ApiResponse localVarResponse = GetAASXByPackageIdWithHttpInfo(packageId); - return localVarResponse.Data; - } - - /// - /// Returns a specific AASX package from the server - /// - /// Thrown when fails to make API call - /// The package Id (BASE64-URL-encoded) - /// ApiResponse of byte[] - public ApiResponse GetAASXByPackageIdWithHttpInfo(string packageId) - { - // verify the required parameter 'packageId' is set - if (packageId == null) - throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->GetAASXByPackageId"); - - var localVarPath = "/packages/{packageId}"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - "application/asset-administration-shell-package" - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("GetAASXByPackageId", localVarResponse); - if (exception != null) throw exception; - } - - var apiResponse = new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (byte[])this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(byte[]))); - - apiResponse.Headers.Add("ContentLength", localVarResponse.ContentLength.ToString()); - - //return new ApiResponse(localVarStatusCode, - // localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - // (byte[]) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(byte[]))); - - return apiResponse; - } - - - /// - /// Returns a specific AASX package from the server - /// - /// Thrown when fails to make API call - /// The package Id (BASE64-URL-encoded) - /// action to be called for advanced response writer - /// ApiResponse of byte[] - public async Task> GetAASXByPackageIdWithHttpInfo(string packageId, Action action) - { - // verify the required parameter 'packageId' is set - if (packageId == null) - throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->GetAASXByPackageId"); - - var localVarPath = "/packages/{packageId}"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - "application/asset-administration-shell-package" - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsyncWithDelegate(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType, action); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("GetAASXByPackageId", localVarResponse); - if (exception != null) throw exception; - } - - var apiResponse = new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (byte[])this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(byte[]))); - - apiResponse.Headers.Add("ContentLength", localVarResponse.ContentLength.ToString()); - - //return new ApiResponse(localVarStatusCode, - // localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - // (byte[]) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(byte[]))); - - return apiResponse; - } - - /// - /// Returns a specific AASX package from the server - /// - /// Thrown when fails to make API call - /// The package Id (BASE64-URL-encoded) - /// Task of byte[] - public async System.Threading.Tasks.Task GetAASXByPackageIdAsync(string packageId) - { - ApiResponse localVarResponse = await GetAASXByPackageIdAsyncWithHttpInfo(packageId); - return localVarResponse.Data; - - } - - /// - /// Returns a specific AASX package from the server - /// - /// Thrown when fails to make API call - /// The package Id (BASE64-URL-encoded) - /// Task of ApiResponse (byte[]) - public async System.Threading.Tasks.Task> GetAASXByPackageIdAsyncWithHttpInfo(string packageId) - { - // verify the required parameter 'packageId' is set - if (packageId == null) - throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->GetAASXByPackageId"); - - var localVarPath = "/packages/{packageId}"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - "application/asset-administration-shell-package" - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("GetAASXByPackageId", localVarResponse); - if (exception != null) throw exception; - } - - return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (byte[])this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(byte[]))); - } - - /// - /// Returns a list of available AASX packages at the server - /// - /// Thrown when fails to make API call - /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) - /// List<PackageDescription> - public List GetAllAASXPackageIds(string aasId = null) - { - ApiResponse> localVarResponse = GetAllAASXPackageIdsWithHttpInfo(aasId); - return localVarResponse.Data; - } - - /// - /// Returns a list of available AASX packages at the server - /// - /// Thrown when fails to make API call - /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) - /// ApiResponse of List<PackageDescription> - public ApiResponse> GetAllAASXPackageIdsWithHttpInfo(string aasId = null) - { - - var localVarPath = "/packages"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - "application/json" - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (aasId != null) localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("", "aasId", aasId)); // query parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("GetAllAASXPackageIds", localVarResponse); - if (exception != null) throw exception; - } - - return new ApiResponse>(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (List)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(List))); - } - - /// - /// Returns a list of available AASX packages at the server - /// - /// Thrown when fails to make API call - /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) - /// Task of List<PackageDescription> - public async System.Threading.Tasks.Task> GetAllAASXPackageIdsAsync(string aasId = null) - { - ApiResponse> localVarResponse = await GetAllAASXPackageIdsAsyncWithHttpInfo(aasId); - return localVarResponse.Data; - - } - - /// - /// Returns a list of available AASX packages at the server - /// - /// Thrown when fails to make API call - /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) - /// Task of ApiResponse (List<PackageDescription>) - public async System.Threading.Tasks.Task>> GetAllAASXPackageIdsAsyncWithHttpInfo(string aasId = null) - { - - var localVarPath = "/packages"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - "application/json" - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (aasId != null) localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("", "aasId", aasId)); // query parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("GetAllAASXPackageIds", localVarResponse); - if (exception != null) throw exception; - } - - return new ApiResponse>(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (List)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(List))); - } - - /// - /// Stores the AASX package at the server - /// - /// Thrown when fails to make API call - /// - /// - /// - /// PackageDescription - //public PackageDescription PostAASXPackage (List aasIds, byte[] file, string fileName) - public int PostAASXPackage(List aasIds, byte[] file, string fileName) - { - //ApiResponse localVarResponse = PostAASXPackageWithHttpInfo(aasIds, file, fileName); - ApiResponse localVarResponse = PostAASXPackageWithHttpInfo(aasIds, file, fileName); - return localVarResponse.Data; - } - - /// - /// Stores the AASX package at the server - /// - /// Thrown when fails to make API call - /// - /// - /// - /// ApiResponse of PackageDescription - //public ApiResponse< PackageDescription > PostAASXPackageWithHttpInfo (List aasIds, byte[] file, string fileName) - public ApiResponse PostAASXPackageWithHttpInfo(List aasIds, byte[] file, string fileName) - { - // verify the required parameter 'aasIds' is set - if (aasIds == null) - throw new ApiException(400, "Missing required parameter 'aasIds' when calling AASXFileServerInterfaceApi->PostAASXPackage"); - // verify the required parameter 'file' is set - if (file == null) - throw new ApiException(400, "Missing required parameter 'file' when calling AASXFileServerInterfaceApi->PostAASXPackage"); - // verify the required parameter 'fileName' is set - if (fileName == null) - throw new ApiException(400, "Missing required parameter 'fileName' when calling AASXFileServerInterfaceApi->PostAASXPackage"); - - var localVarPath = "/packages"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - "multipart/form-data" - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - "application/json" - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (aasIds != null) localVarFormParams.Add("aasIds", this.Configuration.ApiClient.ParameterToString(aasIds)); // form parameter - if (file != null) localVarFileParams.Add("file", this.Configuration.ApiClient.ParameterToFile("file", file)); - if (fileName != null) localVarFormParams.Add("fileName", this.Configuration.ApiClient.ParameterToString(fileName)); // form parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("PostAASXPackage", localVarResponse); - if (exception != null) throw exception; - } - - //return new ApiResponse(localVarStatusCode, - // localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - // (PackageDescription) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(PackageDescription))); - - return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (int)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(int))); - } - - /// - /// Stores the AASX package at the server - /// - /// Thrown when fails to make API call - /// - /// - /// - /// Task of PackageDescription - public async System.Threading.Tasks.Task PostAASXPackageAsync(List aasIds, byte[] file, string fileName) - { - ApiResponse localVarResponse = await PostAASXPackageAsyncWithHttpInfo(aasIds, file, fileName); - return localVarResponse.Data; - - } - - /// - /// Stores the AASX package at the server - /// - /// Thrown when fails to make API call - /// - /// - /// - /// Task of ApiResponse (PackageDescription) - public async System.Threading.Tasks.Task> PostAASXPackageAsyncWithHttpInfo(List aasIds, byte[] file, string fileName) - { - // verify the required parameter 'aasIds' is set - if (aasIds == null) - throw new ApiException(400, "Missing required parameter 'aasIds' when calling AASXFileServerInterfaceApi->PostAASXPackage"); - // verify the required parameter 'file' is set - if (file == null) - throw new ApiException(400, "Missing required parameter 'file' when calling AASXFileServerInterfaceApi->PostAASXPackage"); - // verify the required parameter 'fileName' is set - if (fileName == null) - throw new ApiException(400, "Missing required parameter 'fileName' when calling AASXFileServerInterfaceApi->PostAASXPackage"); - - var localVarPath = "/packages"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - "multipart/form-data" - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - "application/json" - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (aasIds != null) localVarFormParams.Add("aasIds", this.Configuration.ApiClient.ParameterToString(aasIds)); // form parameter - if (file != null) localVarFileParams.Add("file", this.Configuration.ApiClient.ParameterToFile("file", file)); - if (fileName != null) localVarFormParams.Add("fileName", this.Configuration.ApiClient.ParameterToString(fileName)); // form parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("PostAASXPackage", localVarResponse); - if (exception != null) throw exception; - } - - return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (PackageDescription)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(PackageDescription))); - } - - /// - /// Updates the AASX package at the server - /// - /// Thrown when fails to make API call - /// - /// - /// - /// The Package Id (BASE64-URL-encoded) - /// - public void PutAASXByPackageId(List aasIds, byte[] file, string fileName, string packageId) - { - PutAASXByPackageIdWithHttpInfo(aasIds, file, fileName, packageId); - } - - /// - /// Updates the AASX package at the server - /// - /// Thrown when fails to make API call - /// - /// - /// - /// The Package Id (BASE64-URL-encoded) - /// ApiResponse of Object(void) - public ApiResponse PutAASXByPackageIdWithHttpInfo(List aasIds, byte[] file, string fileName, string packageId) - { - // verify the required parameter 'aasIds' is set - if (aasIds == null) - throw new ApiException(400, "Missing required parameter 'aasIds' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); - // verify the required parameter 'file' is set - if (file == null) - throw new ApiException(400, "Missing required parameter 'file' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); - // verify the required parameter 'fileName' is set - if (fileName == null) - throw new ApiException(400, "Missing required parameter 'fileName' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); - // verify the required parameter 'packageId' is set - if (packageId == null) - throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); - - var localVarPath = "/packages/{packageId}"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - "multipart/form-data" - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter - if (aasIds != null) localVarFormParams.Add("aasIds", this.Configuration.ApiClient.ParameterToString(aasIds)); // form parameter - if (file != null) localVarFileParams.Add("file", this.Configuration.ApiClient.ParameterToFile("file", file)); - if (fileName != null) localVarFormParams.Add("fileName", this.Configuration.ApiClient.ParameterToString(fileName)); // form parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("PutAASXByPackageId", localVarResponse); - if (exception != null) throw exception; - } - - return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - null); - } - - /// - /// Updates the AASX package at the server - /// - /// Thrown when fails to make API call - /// - /// - /// - /// The Package Id (BASE64-URL-encoded) - /// Task of void - public async System.Threading.Tasks.Task PutAASXByPackageIdAsync(List aasIds, byte[] file, string fileName, string packageId) - { - await PutAASXByPackageIdAsyncWithHttpInfo(aasIds, file, fileName, packageId); - - } - - /// - /// Updates the AASX package at the server - /// - /// Thrown when fails to make API call - /// - /// - /// - /// The Package Id (BASE64-URL-encoded) - /// Task of ApiResponse - public async System.Threading.Tasks.Task> PutAASXByPackageIdAsyncWithHttpInfo(List aasIds, byte[] file, string fileName, string packageId) - { - // verify the required parameter 'aasIds' is set - if (aasIds == null) - throw new ApiException(400, "Missing required parameter 'aasIds' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); - // verify the required parameter 'file' is set - if (file == null) - throw new ApiException(400, "Missing required parameter 'file' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); - // verify the required parameter 'fileName' is set - if (fileName == null) - throw new ApiException(400, "Missing required parameter 'fileName' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); - // verify the required parameter 'packageId' is set - if (packageId == null) - throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); - - var localVarPath = "/packages/{packageId}"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - "multipart/form-data" - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter - if (aasIds != null) localVarFormParams.Add("aasIds", this.Configuration.ApiClient.ParameterToString(aasIds)); // form parameter - if (file != null) localVarFileParams.Add("file", this.Configuration.ApiClient.ParameterToFile("file", file)); - if (fileName != null) localVarFormParams.Add("fileName", this.Configuration.ApiClient.ParameterToString(fileName)); // form parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("PutAASXByPackageId", localVarResponse); - if (exception != null) throw exception; - } - - return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - null); - } - - public AssetAdministrationShellAndAsset GetAssetAdministrationShellAndAssetByPackageId(string packageId, string aasIdentifier) - { - ApiResponse localVarResponse = GetAssetAdministrationShellAndAssetByPackageIdWithHttpInfo(packageId, aasIdentifier); - return localVarResponse.Data; - } - - private ApiResponse GetAssetAdministrationShellAndAssetByPackageIdWithHttpInfo(string packageId, string aasIdentifier) - { - // verify the required parameter 'aasIdentifier' is set - if (packageId == null) - throw new ApiException(400, "Missing required parameter 'packageId' when calling AssetAdministrationShellRepositoryApi->GetAssetAdministrationShellByPackageId"); - - // verify the required parameter 'aasIdentifier' is set - if (aasIdentifier == null) - throw new ApiException(400, "Missing required parameter 'aasIdentifier' when calling AssetAdministrationShellRepositoryApi->GetAssetAdministrationShellByPackageId"); - - var localVarPath = "/packages/{packageId}/shells/{aasIdentifier}"; - var localVarPathParams = new Dictionary(); - var localVarQueryParams = new List>(); - var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); - var localVarFormParams = new Dictionary(); - var localVarFileParams = new Dictionary(); - Object localVarPostBody = null; - - // to determine the Content-Type header - String[] localVarHttpContentTypes = new String[] { - }; - String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); - - // to determine the Accept header - String[] localVarHttpHeaderAccepts = new String[] { - "application/json" - }; - String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); - if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (aasIdentifier != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter - if (aasIdentifier != null) localVarPathParams.Add("aasIdentifier", this.Configuration.ApiClient.ParameterToString(aasIdentifier)); // path parameter - - // make the HTTP request - RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, - localVarPathParams, localVarHttpContentType); - - int localVarStatusCode = (int)localVarResponse.StatusCode; - - if (ExceptionFactory != null) - { - Exception exception = ExceptionFactory("GetAssetAdministrationShellByPackageId", localVarResponse); - if (exception != null) throw exception; - } - - //TODO (jtikekar, 2022-04-04): Change duting V3 upgrade - //return new ApiResponse(localVarStatusCode, - // localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - // (AssetAdministrationShell) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AssetAdministrationShell))); - return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (AssetAdministrationShellAndAsset)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AssetAdministrationShellAndAsset))); - } - - } -} +/* + * DotAAS Part 2 | HTTP/REST | Entire Interface Collection + * + * The entire interface collection as part of Details of the Asset Administration Shell Part 2 + * + * OpenAPI spec version: Final-Draft + * + * Generated by: https://github.com/swagger-api/swagger-codegen.git + */ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using AdminShellNS; +using IO.Swagger.Client; +using IO.Swagger.Model; +using Microsoft.AspNetCore.Http; +using RestSharp; + +namespace IO.Swagger.Api +{ + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public interface IAASXFileServerInterfaceApi : IApiAccessor + { + #region Synchronous Operations + /// + /// Deletes a specific AASX package from the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The Package Id (BASE64-URL-encoded) + /// + void DeleteAASXByPackageId(string packageId); + + /// + /// Deletes a specific AASX package from the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The Package Id (BASE64-URL-encoded) + /// ApiResponse of Object(void) + ApiResponse DeleteAASXByPackageIdWithHttpInfo(string packageId); + /// + /// Returns a specific AASX package from the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The package Id (BASE64-URL-encoded) + /// byte[] + byte[] GetAASXByPackageId(string packageId); + + /// + /// Returns a specific AASX package from the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The package Id (BASE64-URL-encoded) + /// ApiResponse of byte[] + ApiResponse GetAASXByPackageIdWithHttpInfo(string packageId); + /// + /// Returns a list of available AASX packages at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) + /// List<PackageDescription> + List GetAllAASXPackageIds(string aasId = null); + + /// + /// Returns a list of available AASX packages at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) + /// ApiResponse of List<PackageDescription> + ApiResponse> GetAllAASXPackageIdsWithHttpInfo(string aasId = null); + /// + /// Stores the AASX package at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// + /// PackageDescription + //PackageDescription PostAASXPackage (List aasIds, byte[] file, string fileName); + int PostAASXPackage(List aasIds, byte[] file, string fileName); + + /// + /// Stores the AASX package at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// + /// ApiResponse of PackageDescription + //ApiResponse PostAASXPackageWithHttpInfo (List aasIds, byte[] file, string fileName); + ApiResponse PostAASXPackageWithHttpInfo(List aasIds, byte[] file, string fileName); + /// + /// Updates the AASX package at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// + /// The Package Id (BASE64-URL-encoded) + /// + void PutAASXByPackageId(List aasIds, byte[] file, string fileName, string packageId); + + /// + /// Updates the AASX package at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// + /// The Package Id (BASE64-URL-encoded) + /// ApiResponse of Object(void) + ApiResponse PutAASXByPackageIdWithHttpInfo(List aasIds, byte[] file, string fileName, string packageId); + #endregion Synchronous Operations + #region Asynchronous Operations + /// + /// Deletes a specific AASX package from the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The Package Id (BASE64-URL-encoded) + /// Task of void + System.Threading.Tasks.Task DeleteAASXByPackageIdAsync(string packageId); + + /// + /// Deletes a specific AASX package from the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The Package Id (BASE64-URL-encoded) + /// Task of ApiResponse + System.Threading.Tasks.Task> DeleteAASXByPackageIdAsyncWithHttpInfo(string packageId); + /// + /// Returns a specific AASX package from the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The package Id (BASE64-URL-encoded) + /// Task of byte[] + System.Threading.Tasks.Task GetAASXByPackageIdAsync(string packageId); + + /// + /// Returns a specific AASX package from the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The package Id (BASE64-URL-encoded) + /// Task of ApiResponse (byte[]) + System.Threading.Tasks.Task> GetAASXByPackageIdAsyncWithHttpInfo(string packageId); + /// + /// Returns a list of available AASX packages at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) + /// Task of List<PackageDescription> + System.Threading.Tasks.Task> GetAllAASXPackageIdsAsync(string aasId = null); + + /// + /// Returns a list of available AASX packages at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) + /// Task of ApiResponse (List<PackageDescription>) + System.Threading.Tasks.Task>> GetAllAASXPackageIdsAsyncWithHttpInfo(string aasId = null); + /// + /// Stores the AASX package at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// + /// Task of PackageDescription + System.Threading.Tasks.Task PostAASXPackageAsync(List aasIds, byte[] file, string fileName); + + /// + /// Stores the AASX package at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// + /// Task of ApiResponse (PackageDescription) + System.Threading.Tasks.Task> PostAASXPackageAsyncWithHttpInfo(List aasIds, byte[] file, string fileName); + /// + /// Updates the AASX package at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// + /// The Package Id (BASE64-URL-encoded) + /// Task of void + System.Threading.Tasks.Task PutAASXByPackageIdAsync(List aasIds, byte[] file, string fileName, string packageId); + + /// + /// Updates the AASX package at the server + /// + /// + /// + /// + /// Thrown when fails to make API call + /// + /// + /// + /// The Package Id (BASE64-URL-encoded) + /// Task of ApiResponse + System.Threading.Tasks.Task> PutAASXByPackageIdAsyncWithHttpInfo(List aasIds, byte[] file, string fileName, string packageId); + #endregion Asynchronous Operations + } + + /// + /// Represents a collection of functions to interact with the API endpoints + /// + public partial class AASXFileServerInterfaceApi : IAASXFileServerInterfaceApi + { + private IO.Swagger.Client.ExceptionFactory _exceptionFactory = (name, response) => null; + + /// + /// Initializes a new instance of the class. + /// + /// + public AASXFileServerInterfaceApi(String basePath) + { + this.Configuration = new IO.Swagger.Client.Configuration { BasePath = basePath }; + + ExceptionFactory = IO.Swagger.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// Initializes a new instance of the class + /// + /// + public AASXFileServerInterfaceApi() + { + this.Configuration = IO.Swagger.Client.Configuration.Default; + + ExceptionFactory = IO.Swagger.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// Initializes a new instance of the class + /// using Configuration object + /// + /// An instance of Configuration + /// + public AASXFileServerInterfaceApi(IO.Swagger.Client.Configuration configuration = null) + { + if (configuration == null) // use the default one in Configuration + this.Configuration = IO.Swagger.Client.Configuration.Default; + else + this.Configuration = configuration; + + ExceptionFactory = IO.Swagger.Client.Configuration.DefaultExceptionFactory; + } + + /// + /// Gets the base path of the API client. + /// + /// The base path + public String GetBasePath() + { + //TODO (jtikekar, 2022-04-04): Change + return this.Configuration.BasePath; + //return this.Configuration.ApiClient.RestClient.BaseUrl.ToString(); + } + + /// + /// Sets the base path of the API client. + /// + /// The base path + [Obsolete("SetBasePath is deprecated, please do 'Configuration.ApiClient = new ApiClient(\"http://new-path\")' instead.")] + public void SetBasePath(String basePath) + { + // do nothing + } + + /// + /// Gets or sets the configuration object + /// + /// An instance of the Configuration + public IO.Swagger.Client.Configuration Configuration { get; set; } + + /// + /// Provides a factory method hook for the creation of exceptions. + /// + public IO.Swagger.Client.ExceptionFactory ExceptionFactory + { + get + { + if (_exceptionFactory != null && _exceptionFactory.GetInvocationList().Length > 1) + { + throw new InvalidOperationException("Multicast delegate for ExceptionFactory is unsupported."); + } + return _exceptionFactory; + } + set { _exceptionFactory = value; } + } + + /// + /// Gets the default header. + /// + /// Dictionary of HTTP header + [Obsolete("DefaultHeader is deprecated, please use Configuration.DefaultHeader instead.")] + public IDictionary DefaultHeader() + { + return new ReadOnlyDictionary(this.Configuration.DefaultHeader); + } + + /// + /// Add default header. + /// + /// Header field name. + /// Header field value. + /// + [Obsolete("AddDefaultHeader is deprecated, please use Configuration.AddDefaultHeader instead.")] + public void AddDefaultHeader(string key, string value) + { + this.Configuration.AddDefaultHeader(key, value); + } + + /// + /// Deletes a specific AASX package from the server + /// + /// Thrown when fails to make API call + /// The Package Id (BASE64-URL-encoded) + /// + public void DeleteAASXByPackageId(string packageId) + { + DeleteAASXByPackageIdWithHttpInfo(packageId); + } + + /// + /// Deletes a specific AASX package from the server + /// + /// Thrown when fails to make API call + /// The Package Id (BASE64-URL-encoded) + /// ApiResponse of Object(void) + public ApiResponse DeleteAASXByPackageIdWithHttpInfo(string packageId) + { + // verify the required parameter 'packageId' is set + if (packageId == null) + throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->DeleteAASXByPackageId"); + + var localVarPath = "/packages/{packageId}"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("DeleteAASXByPackageId", localVarResponse); + if (exception != null) throw exception; + } + + return new ApiResponse(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + null); + } + + /// + /// Deletes a specific AASX package from the server + /// + /// Thrown when fails to make API call + /// The Package Id (BASE64-URL-encoded) + /// Task of void + public async System.Threading.Tasks.Task DeleteAASXByPackageIdAsync(string packageId) + { + await DeleteAASXByPackageIdAsyncWithHttpInfo(packageId); + + } + + /// + /// Deletes a specific AASX package from the server + /// + /// Thrown when fails to make API call + /// The Package Id (BASE64-URL-encoded) + /// Task of ApiResponse + public async System.Threading.Tasks.Task> DeleteAASXByPackageIdAsyncWithHttpInfo(string packageId) + { + // verify the required parameter 'packageId' is set + if (packageId == null) + throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->DeleteAASXByPackageId"); + + var localVarPath = "/packages/{packageId}"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("DeleteAASXByPackageId", localVarResponse); + if (exception != null) throw exception; + } + + return new ApiResponse(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + null); + } + + /// + /// Returns a specific AASX package from the server + /// + /// Thrown when fails to make API call + /// The package Id (BASE64-URL-encoded) + /// byte[] + public byte[] GetAASXByPackageId(string packageId) + { + ApiResponse localVarResponse = GetAASXByPackageIdWithHttpInfo(packageId); + return localVarResponse.Data; + } + + /// + /// Returns a specific AASX package from the server + /// + /// Thrown when fails to make API call + /// The package Id (BASE64-URL-encoded) + /// ApiResponse of byte[] + public ApiResponse GetAASXByPackageIdWithHttpInfo(string packageId) + { + // verify the required parameter 'packageId' is set + if (packageId == null) + throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->GetAASXByPackageId"); + + var localVarPath = "/packages/{packageId}"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + "application/asset-administration-shell-package" + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("GetAASXByPackageId", localVarResponse); + if (exception != null) throw exception; + } + + var apiResponse = new ApiResponse(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + (byte[])this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(byte[]))); + + apiResponse.Headers.Add("ContentLength", localVarResponse.ContentLength.ToString()); + + //return new ApiResponse(localVarStatusCode, + // localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + // (byte[]) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(byte[]))); + + return apiResponse; + } + + + /// + /// Returns a specific AASX package from the server + /// + /// Thrown when fails to make API call + /// The package Id (BASE64-URL-encoded) + /// action to be called for advanced response writer + /// ApiResponse of byte[] + public async Task> GetAASXByPackageIdWithHttpInfo(string packageId, Action action) + { + // verify the required parameter 'packageId' is set + if (packageId == null) + throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->GetAASXByPackageId"); + + var localVarPath = "/packages/{packageId}"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + "application/asset-administration-shell-package" + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsyncWithDelegate(localVarPath, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType, action); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("GetAASXByPackageId", localVarResponse); + if (exception != null) throw exception; + } + + var apiResponse = new ApiResponse(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + (byte[])this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(byte[]))); + + apiResponse.Headers.Add("ContentLength", localVarResponse.ContentLength.ToString()); + + //return new ApiResponse(localVarStatusCode, + // localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + // (byte[]) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(byte[]))); + + return apiResponse; + } + + /// + /// Returns a specific AASX package from the server + /// + /// Thrown when fails to make API call + /// The package Id (BASE64-URL-encoded) + /// Task of byte[] + public async System.Threading.Tasks.Task GetAASXByPackageIdAsync(string packageId) + { + ApiResponse localVarResponse = await GetAASXByPackageIdAsyncWithHttpInfo(packageId); + return localVarResponse.Data; + + } + + /// + /// Returns a specific AASX package from the server + /// + /// Thrown when fails to make API call + /// The package Id (BASE64-URL-encoded) + /// Task of ApiResponse (byte[]) + public async System.Threading.Tasks.Task> GetAASXByPackageIdAsyncWithHttpInfo(string packageId) + { + // verify the required parameter 'packageId' is set + if (packageId == null) + throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->GetAASXByPackageId"); + + var localVarPath = "/packages/{packageId}"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + "application/asset-administration-shell-package" + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("GetAASXByPackageId", localVarResponse); + if (exception != null) throw exception; + } + + return new ApiResponse(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + (byte[])this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(byte[]))); + } + + /// + /// Returns a list of available AASX packages at the server + /// + /// Thrown when fails to make API call + /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) + /// List<PackageDescription> + public List GetAllAASXPackageIds(string aasId = null) + { + ApiResponse> localVarResponse = GetAllAASXPackageIdsWithHttpInfo(aasId); + return localVarResponse.Data; + } + + /// + /// Returns a list of available AASX packages at the server + /// + /// Thrown when fails to make API call + /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) + /// ApiResponse of List<PackageDescription> + public ApiResponse> GetAllAASXPackageIdsWithHttpInfo(string aasId = null) + { + + var localVarPath = "/packages"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + "application/json" + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (aasId != null) localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("", "aasId", aasId)); // query parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("GetAllAASXPackageIds", localVarResponse); + if (exception != null) throw exception; + } + + return new ApiResponse>(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + (List)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(List))); + } + + /// + /// Returns a list of available AASX packages at the server + /// + /// Thrown when fails to make API call + /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) + /// Task of List<PackageDescription> + public async System.Threading.Tasks.Task> GetAllAASXPackageIdsAsync(string aasId = null) + { + ApiResponse> localVarResponse = await GetAllAASXPackageIdsAsyncWithHttpInfo(aasId); + return localVarResponse.Data; + + } + + /// + /// Returns a list of available AASX packages at the server + /// + /// Thrown when fails to make API call + /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) (optional) + /// Task of ApiResponse (List<PackageDescription>) + public async System.Threading.Tasks.Task>> GetAllAASXPackageIdsAsyncWithHttpInfo(string aasId = null) + { + + var localVarPath = "/packages"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + "application/json" + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (aasId != null) localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("", "aasId", aasId)); // query parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("GetAllAASXPackageIds", localVarResponse); + if (exception != null) throw exception; + } + + return new ApiResponse>(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + (List)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(List))); + } + + /// + /// Stores the AASX package at the server + /// + /// Thrown when fails to make API call + /// + /// + /// + /// PackageDescription + //public PackageDescription PostAASXPackage (List aasIds, byte[] file, string fileName) + public int PostAASXPackage(List aasIds, byte[] file, string fileName) + { + //ApiResponse localVarResponse = PostAASXPackageWithHttpInfo(aasIds, file, fileName); + ApiResponse localVarResponse = PostAASXPackageWithHttpInfo(aasIds, file, fileName); + return localVarResponse.Data; + } + + /// + /// Stores the AASX package at the server + /// + /// Thrown when fails to make API call + /// + /// + /// + /// ApiResponse of PackageDescription + //public ApiResponse< PackageDescription > PostAASXPackageWithHttpInfo (List aasIds, byte[] file, string fileName) + public ApiResponse PostAASXPackageWithHttpInfo(List aasIds, byte[] file, string fileName) + { + // verify the required parameter 'aasIds' is set + if (aasIds == null) + throw new ApiException(400, "Missing required parameter 'aasIds' when calling AASXFileServerInterfaceApi->PostAASXPackage"); + // verify the required parameter 'file' is set + if (file == null) + throw new ApiException(400, "Missing required parameter 'file' when calling AASXFileServerInterfaceApi->PostAASXPackage"); + // verify the required parameter 'fileName' is set + if (fileName == null) + throw new ApiException(400, "Missing required parameter 'fileName' when calling AASXFileServerInterfaceApi->PostAASXPackage"); + + var localVarPath = "/packages"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + "multipart/form-data" + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + "application/json" + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (aasIds != null) localVarFormParams.Add("aasIds", this.Configuration.ApiClient.ParameterToString(aasIds)); // form parameter + if (file != null) localVarFileParams.Add("file", this.Configuration.ApiClient.ParameterToFile("file", file)); + if (fileName != null) localVarFormParams.Add("fileName", this.Configuration.ApiClient.ParameterToString(fileName)); // form parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("PostAASXPackage", localVarResponse); + if (exception != null) throw exception; + } + + //return new ApiResponse(localVarStatusCode, + // localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + // (PackageDescription) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(PackageDescription))); + + return new ApiResponse(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + (int)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(int))); + } + + /// + /// Stores the AASX package at the server + /// + /// Thrown when fails to make API call + /// + /// + /// + /// Task of PackageDescription + public async System.Threading.Tasks.Task PostAASXPackageAsync(List aasIds, byte[] file, string fileName) + { + ApiResponse localVarResponse = await PostAASXPackageAsyncWithHttpInfo(aasIds, file, fileName); + return localVarResponse.Data; + + } + + /// + /// Stores the AASX package at the server + /// + /// Thrown when fails to make API call + /// + /// + /// + /// Task of ApiResponse (PackageDescription) + public async System.Threading.Tasks.Task> PostAASXPackageAsyncWithHttpInfo(List aasIds, byte[] file, string fileName) + { + // verify the required parameter 'aasIds' is set + if (aasIds == null) + throw new ApiException(400, "Missing required parameter 'aasIds' when calling AASXFileServerInterfaceApi->PostAASXPackage"); + // verify the required parameter 'file' is set + if (file == null) + throw new ApiException(400, "Missing required parameter 'file' when calling AASXFileServerInterfaceApi->PostAASXPackage"); + // verify the required parameter 'fileName' is set + if (fileName == null) + throw new ApiException(400, "Missing required parameter 'fileName' when calling AASXFileServerInterfaceApi->PostAASXPackage"); + + var localVarPath = "/packages"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + "multipart/form-data" + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + "application/json" + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (aasIds != null) localVarFormParams.Add("aasIds", this.Configuration.ApiClient.ParameterToString(aasIds)); // form parameter + if (file != null) localVarFileParams.Add("file", this.Configuration.ApiClient.ParameterToFile("file", file)); + if (fileName != null) localVarFormParams.Add("fileName", this.Configuration.ApiClient.ParameterToString(fileName)); // form parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("PostAASXPackage", localVarResponse); + if (exception != null) throw exception; + } + + return new ApiResponse(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + (PackageDescription)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(PackageDescription))); + } + + /// + /// Updates the AASX package at the server + /// + /// Thrown when fails to make API call + /// + /// + /// + /// The Package Id (BASE64-URL-encoded) + /// + public void PutAASXByPackageId(List aasIds, byte[] file, string fileName, string packageId) + { + PutAASXByPackageIdWithHttpInfo(aasIds, file, fileName, packageId); + } + + /// + /// Updates the AASX package at the server + /// + /// Thrown when fails to make API call + /// + /// + /// + /// The Package Id (BASE64-URL-encoded) + /// ApiResponse of Object(void) + public ApiResponse PutAASXByPackageIdWithHttpInfo(List aasIds, byte[] file, string fileName, string packageId) + { + // verify the required parameter 'aasIds' is set + if (aasIds == null) + throw new ApiException(400, "Missing required parameter 'aasIds' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); + // verify the required parameter 'file' is set + if (file == null) + throw new ApiException(400, "Missing required parameter 'file' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); + // verify the required parameter 'fileName' is set + if (fileName == null) + throw new ApiException(400, "Missing required parameter 'fileName' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); + // verify the required parameter 'packageId' is set + if (packageId == null) + throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); + + var localVarPath = "/packages/{packageId}"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + "multipart/form-data" + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter + if (aasIds != null) localVarFormParams.Add("aasIds", this.Configuration.ApiClient.ParameterToString(aasIds)); // form parameter + if (file != null) localVarFileParams.Add("file", this.Configuration.ApiClient.ParameterToFile("file", file)); + if (fileName != null) localVarFormParams.Add("fileName", this.Configuration.ApiClient.ParameterToString(fileName)); // form parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("PutAASXByPackageId", localVarResponse); + if (exception != null) throw exception; + } + + return new ApiResponse(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + null); + } + + /// + /// Updates the AASX package at the server + /// + /// Thrown when fails to make API call + /// + /// + /// + /// The Package Id (BASE64-URL-encoded) + /// Task of void + public async System.Threading.Tasks.Task PutAASXByPackageIdAsync(List aasIds, byte[] file, string fileName, string packageId) + { + await PutAASXByPackageIdAsyncWithHttpInfo(aasIds, file, fileName, packageId); + + } + + /// + /// Updates the AASX package at the server + /// + /// Thrown when fails to make API call + /// + /// + /// + /// The Package Id (BASE64-URL-encoded) + /// Task of ApiResponse + public async System.Threading.Tasks.Task> PutAASXByPackageIdAsyncWithHttpInfo(List aasIds, byte[] file, string fileName, string packageId) + { + // verify the required parameter 'aasIds' is set + if (aasIds == null) + throw new ApiException(400, "Missing required parameter 'aasIds' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); + // verify the required parameter 'file' is set + if (file == null) + throw new ApiException(400, "Missing required parameter 'file' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); + // verify the required parameter 'fileName' is set + if (fileName == null) + throw new ApiException(400, "Missing required parameter 'fileName' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); + // verify the required parameter 'packageId' is set + if (packageId == null) + throw new ApiException(400, "Missing required parameter 'packageId' when calling AASXFileServerInterfaceApi->PutAASXByPackageId"); + + var localVarPath = "/packages/{packageId}"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + "multipart/form-data" + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (packageId != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter + if (aasIds != null) localVarFormParams.Add("aasIds", this.Configuration.ApiClient.ParameterToString(aasIds)); // form parameter + if (file != null) localVarFileParams.Add("file", this.Configuration.ApiClient.ParameterToFile("file", file)); + if (fileName != null) localVarFormParams.Add("fileName", this.Configuration.ApiClient.ParameterToString(fileName)); // form parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("PutAASXByPackageId", localVarResponse); + if (exception != null) throw exception; + } + + return new ApiResponse(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + null); + } + + public AssetAdministrationShellAndAsset GetAssetAdministrationShellAndAssetByPackageId(string packageId, string aasIdentifier) + { + ApiResponse localVarResponse = GetAssetAdministrationShellAndAssetByPackageIdWithHttpInfo(packageId, aasIdentifier); + return localVarResponse.Data; + } + + private ApiResponse GetAssetAdministrationShellAndAssetByPackageIdWithHttpInfo(string packageId, string aasIdentifier) + { + // verify the required parameter 'aasIdentifier' is set + if (packageId == null) + throw new ApiException(400, "Missing required parameter 'packageId' when calling AssetAdministrationShellRepositoryApi->GetAssetAdministrationShellByPackageId"); + + // verify the required parameter 'aasIdentifier' is set + if (aasIdentifier == null) + throw new ApiException(400, "Missing required parameter 'aasIdentifier' when calling AssetAdministrationShellRepositoryApi->GetAssetAdministrationShellByPackageId"); + + var localVarPath = "/packages/{packageId}/shells/{aasIdentifier}"; + var localVarPathParams = new Dictionary(); + var localVarQueryParams = new List>(); + var localVarHeaderParams = new Dictionary(this.Configuration.DefaultHeader); + var localVarFormParams = new Dictionary(); + var localVarFileParams = new Dictionary(); + Object localVarPostBody = null; + + // to determine the Content-Type header + String[] localVarHttpContentTypes = new String[] { + }; + String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); + + // to determine the Accept header + String[] localVarHttpHeaderAccepts = new String[] { + "application/json" + }; + String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); + if (localVarHttpHeaderAccept != null) + localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + + if (aasIdentifier != null) localVarPathParams.Add("packageId", this.Configuration.ApiClient.ParameterToString(packageId)); // path parameter + if (aasIdentifier != null) localVarPathParams.Add("aasIdentifier", this.Configuration.ApiClient.ParameterToString(aasIdentifier)); // path parameter + + // make the HTTP request + RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + localVarPathParams, localVarHttpContentType); + + int localVarStatusCode = (int)localVarResponse.StatusCode; + + if (ExceptionFactory != null) + { + Exception exception = ExceptionFactory("GetAssetAdministrationShellByPackageId", localVarResponse); + if (exception != null) throw exception; + } + + //TODO (jtikekar, 2022-04-04): Change duting V3 upgrade + //return new ApiResponse(localVarStatusCode, + // localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + // (AssetAdministrationShell) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AssetAdministrationShell))); + return new ApiResponse(localVarStatusCode, + localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + (AssetAdministrationShellAndAsset)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AssetAdministrationShellAndAsset))); + } + + } +} diff --git a/src/AasxFileServerRestLibrary/Api/AssetAdministrationShellInterfaceApi.cs b/src/AasxFileServerRestLibrary/Api/AssetAdministrationShellInterfaceApi.cs index 1ef05c7f8..999117e62 100644 --- a/src/AasxFileServerRestLibrary/Api/AssetAdministrationShellInterfaceApi.cs +++ b/src/AasxFileServerRestLibrary/Api/AssetAdministrationShellInterfaceApi.cs @@ -13,8 +13,9 @@ using System.Linq; using AdminShellNS; using IO.Swagger.Client; -using IO.Swagger.Model; +//using IO.Swagger.Model; using RestSharp; +using AasCore.Aas3_0_RC02; //using AdminShellNS; namespace IO.Swagger.Api @@ -477,7 +478,7 @@ public ApiResponse DeleteSubmodelReferenceByIdWithHttpInfo(string submod // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -541,7 +542,7 @@ public async System.Threading.Tasks.Task> DeleteSubmodelRefe // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -600,7 +601,7 @@ public ApiResponse> GetAllSubmodelReferencesWithHttpInfo() // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -660,7 +661,7 @@ public async System.Threading.Tasks.Task>> GetAllSub // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -722,7 +723,7 @@ public ApiResponse GetAssetAdministrationShellWithHttp // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -738,10 +739,10 @@ public ApiResponse GetAssetAdministrationShellWithHttp // (AssetAdministrationShell)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AssetAdministrationShell))); //TODO (jtikekar, 2022-04-04): Change during refactoring - var aas = AdminShellSerializationHelper.DeserializeFromJSON(localVarResponse.Content); + var aas = AdminShellSerializationHelper.DeserializeFromJSON(localVarResponse.Content); return new ApiResponse(localVarStatusCode, localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (AssetAdministrationShell)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AdminShell.AdministrationShell))); + (AssetAdministrationShell)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AssetAdministrationShell))); } /// @@ -791,7 +792,7 @@ public async System.Threading.Tasks.Task> // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -850,7 +851,7 @@ public ApiResponse GetAssetInformationWithHttpInfo() // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -910,7 +911,7 @@ public async System.Threading.Tasks.Task> GetAsset // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -983,7 +984,7 @@ public ApiResponse PostSubmodelReferenceWithHttpInfo(Reference body) // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -1057,7 +1058,7 @@ public async System.Threading.Tasks.Task> PostSubmodelRef // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -1131,7 +1132,7 @@ public ApiResponse PutAssetAdministrationShellWithHttpInfo(AssetAdminist // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -1206,7 +1207,7 @@ public async System.Threading.Tasks.Task> PutAssetAdministra // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -1277,7 +1278,7 @@ public ApiResponse PutAssetInformationWithHttpInfo(AssetInformation body // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -1349,7 +1350,7 @@ public async System.Threading.Tasks.Task> PutAssetInformatio // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; diff --git a/src/AasxFileServerRestLibrary/Api/AssetAdministrationShellRepositoryApi.cs b/src/AasxFileServerRestLibrary/Api/AssetAdministrationShellRepositoryApi.cs index 37d2a7e58..06b0d35ac 100644 --- a/src/AasxFileServerRestLibrary/Api/AssetAdministrationShellRepositoryApi.cs +++ b/src/AasxFileServerRestLibrary/Api/AssetAdministrationShellRepositoryApi.cs @@ -343,7 +343,7 @@ public interface IAssetAdministrationShellRepositoryApi : IApiAccessor /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) /// AssetAdministrationShell //AssetAdministrationShell GetAssetAdministrationShellById (string aasIdentifier); - AdminShell.AdministrationShell GetAssetAdministrationShellById(string aasIdentifier); + AssetAdministrationShell GetAssetAdministrationShellById(string aasIdentifier); /// /// Returns a specific Asset Administration Shell @@ -355,7 +355,7 @@ public interface IAssetAdministrationShellRepositoryApi : IApiAccessor /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) /// ApiResponse of AssetAdministrationShell //ApiResponse GetAssetAdministrationShellByIdWithHttpInfo (string aasIdentifier); - ApiResponse GetAssetAdministrationShellByIdWithHttpInfo(string aasIdentifier); + ApiResponse GetAssetAdministrationShellByIdWithHttpInfo(string aasIdentifier); /// /// Returns the Asset Information /// @@ -367,7 +367,7 @@ public interface IAssetAdministrationShellRepositoryApi : IApiAccessor /// AssetInformation //TODO (jtikekar, 2022-04-04): Change during v3 upgrade //AssetInformation GetAssetInformation (string aasIdentifier); - AdminShellV20.Asset GetAssetInformation(string aasIdentifier); + AssetInformation GetAssetInformation(string aasIdentifier); /// /// Returns the Asset Information @@ -380,7 +380,7 @@ public interface IAssetAdministrationShellRepositoryApi : IApiAccessor /// ApiResponse of AssetInformation //TODO (jtikekar, 2022-04-04): Change during v3 upgrade //ApiResponse GetAssetInformationWithHttpInfo (string aasIdentifier); - ApiResponse GetAssetInformationWithHttpInfo(string aasIdentifier); + ApiResponse GetAssetInformationWithHttpInfo(string aasIdentifier); /// /// Returns a specific Concept Description /// @@ -2256,7 +2256,7 @@ public ApiResponse DeleteAssetAdministrationShellByIdWithHttpInfo(string // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -2320,7 +2320,7 @@ public async System.Threading.Tasks.Task> DeleteAssetAdminis // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -2383,7 +2383,7 @@ public ApiResponse DeleteConceptDescriptionByIdWithHttpInfo(string cdIde // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -2447,7 +2447,7 @@ public async System.Threading.Tasks.Task> DeleteConceptDescr // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -2522,7 +2522,7 @@ public ApiResponse DeleteSubmodelElementByPathWithHttpInfo(string aasIde // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -2598,7 +2598,7 @@ public async System.Threading.Tasks.Task> DeleteSubmodelElem // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -2667,7 +2667,7 @@ public ApiResponse DeleteSubmodelElementByPathSubmodelRepoWithHttpInfo(s // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -2737,7 +2737,7 @@ public async System.Threading.Tasks.Task> DeleteSubmodelElem // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -2806,7 +2806,7 @@ public ApiResponse DeleteSubmodelReferenceByIdWithHttpInfo(string aasIde // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -2876,7 +2876,7 @@ public async System.Threading.Tasks.Task> DeleteSubmodelRefe // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.DELETE, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Delete, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -2955,7 +2955,7 @@ public ApiResponse GenerateSerializationByIdsWithHttpInfo(List a // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3035,7 +3035,7 @@ public async System.Threading.Tasks.Task> GenerateSerializat // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3100,7 +3100,7 @@ public ApiResponse> GetAllAssetAdministrationShel // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3166,7 +3166,7 @@ public async System.Threading.Tasks.Task> GetAllConceptDescriptionsWithHttpIn // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3303,7 +3303,7 @@ public async System.Threading.Tasks.Task>> // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3383,7 +3383,7 @@ public ApiResponse> GetAllSubmodelElementsWithHttpInfo(str // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3464,7 +3464,7 @@ public async System.Threading.Tasks.Task>> Get // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3538,7 +3538,7 @@ public ApiResponse> GetAllSubmodelElementsSubmodelRepoWith // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3613,7 +3613,7 @@ public async System.Threading.Tasks.Task>> Get // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3678,7 +3678,7 @@ public ApiResponse> GetAllSubmodelReferencesWithHttpInfo(string // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3744,7 +3744,7 @@ public async System.Threading.Tasks.Task>> GetAllSub // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3809,7 +3809,7 @@ public ApiResponse> GetAllSubmodelsWithHttpInfo(string semanticId // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3875,7 +3875,7 @@ public async System.Threading.Tasks.Task>> GetAllSubm // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -3943,7 +3943,7 @@ public ApiResponse GetAssetAdministrationShellWithHttp // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4012,7 +4012,7 @@ public async System.Threading.Tasks.Task> // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4035,10 +4035,10 @@ public async System.Threading.Tasks.Task> /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) /// AssetAdministrationShell //public AssetAdministrationShell GetAssetAdministrationShellById (string aasIdentifier) - public AdminShell.AdministrationShell GetAssetAdministrationShellById(string aasIdentifier) + public AssetAdministrationShell GetAssetAdministrationShellById(string aasIdentifier) { //ApiResponse localVarResponse = GetAssetAdministrationShellByIdWithHttpInfo(aasIdentifier); - ApiResponse localVarResponse = GetAssetAdministrationShellByIdWithHttpInfo(aasIdentifier); + ApiResponse localVarResponse = GetAssetAdministrationShellByIdWithHttpInfo(aasIdentifier); return localVarResponse.Data; } @@ -4049,7 +4049,7 @@ public AdminShell.AdministrationShell GetAssetAdministrationShellById(string aas /// The Asset Administration Shell’s unique id (BASE64-URL-encoded) /// ApiResponse of AssetAdministrationShell //public ApiResponse< AssetAdministrationShell > GetAssetAdministrationShellByIdWithHttpInfo (string aasIdentifier) - public ApiResponse GetAssetAdministrationShellByIdWithHttpInfo(string aasIdentifier) + public ApiResponse GetAssetAdministrationShellByIdWithHttpInfo(string aasIdentifier) { // verify the required parameter 'aasIdentifier' is set if (aasIdentifier == null) @@ -4080,7 +4080,7 @@ public AdminShell.AdministrationShell GetAssetAdministrationShellById(string aas // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4095,9 +4095,9 @@ public AdminShell.AdministrationShell GetAssetAdministrationShellById(string aas //return new ApiResponse(localVarStatusCode, // localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), // (AssetAdministrationShell) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AssetAdministrationShell))); - return new ApiResponse(localVarStatusCode, + return new ApiResponse(localVarStatusCode, localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (AdminShell.AdministrationShell)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AdminShell.AdministrationShell))); + (AssetAdministrationShell)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AssetAdministrationShell))); } /// @@ -4150,7 +4150,7 @@ public async System.Threading.Tasks.Task> // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4174,10 +4174,10 @@ public async System.Threading.Tasks.Task> /// AssetInformation //TODO (jtikekar, 2022-04-04): Change to V3 //public AssetInformation GetAssetInformation (string aasIdentifier) - public AdminShellV20.Asset GetAssetInformation(string aasIdentifier) + public AssetInformation GetAssetInformation(string aasIdentifier) { //ApiResponse localVarResponse = GetAssetInformationWithHttpInfo(aasIdentifier); - ApiResponse localVarResponse = GetAssetInformationWithHttpInfo(aasIdentifier); + ApiResponse localVarResponse = GetAssetInformationWithHttpInfo(aasIdentifier); return localVarResponse.Data; } @@ -4189,7 +4189,7 @@ public AdminShellV20.Asset GetAssetInformation(string aasIdentifier) /// ApiResponse of AssetInformation //TODO (jtikekar, 2022-04-04): Change during v3 upgrade //public ApiResponse< AssetInformation > GetAssetInformationWithHttpInfo (string aasIdentifier) - public ApiResponse GetAssetInformationWithHttpInfo(string aasIdentifier) + public ApiResponse GetAssetInformationWithHttpInfo(string aasIdentifier) { // verify the required parameter 'aasIdentifier' is set if (aasIdentifier == null) @@ -4220,7 +4220,7 @@ public AdminShellV20.Asset GetAssetInformation(string aasIdentifier) // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4235,9 +4235,9 @@ public AdminShellV20.Asset GetAssetInformation(string aasIdentifier) // localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), // (AssetInformation) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AssetInformation))); - return new ApiResponse(localVarStatusCode, + return new ApiResponse(localVarStatusCode, localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (AdminShellV20.Asset)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AdminShellV20.Asset))); + (AssetInformation)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(AssetInformation))); } /// @@ -4290,7 +4290,7 @@ public async System.Threading.Tasks.Task> GetAsset // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4355,7 +4355,7 @@ public ApiResponse GetConceptDescriptionByIdWithHttpInfo(str // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4421,7 +4421,7 @@ public async System.Threading.Tasks.Task> GetCon // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4507,7 +4507,7 @@ public ApiResponse GetOperationAsyncResultWithHttpInfo(string a // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4594,7 +4594,7 @@ public async System.Threading.Tasks.Task> GetOperat // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4674,7 +4674,7 @@ public ApiResponse GetOperationAsyncResultSubmodelRepoWithHttpI // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4755,7 +4755,7 @@ public async System.Threading.Tasks.Task> GetOperat // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4835,7 +4835,7 @@ public ApiResponse GetSubmodelWithHttpInfo(string aasIdentifier, strin // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -4916,7 +4916,7 @@ public async System.Threading.Tasks.Task> GetSubmodelAsync // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5002,7 +5002,7 @@ public ApiResponse GetSubmodelElementByPathWithHttpInfo(string // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5089,7 +5089,7 @@ public async System.Threading.Tasks.Task> GetSubmod // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5169,7 +5169,7 @@ public ApiResponse GetSubmodelElementByPathSubmodelRepoWithHttp // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5250,7 +5250,7 @@ public async System.Threading.Tasks.Task> GetSubmod // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5324,7 +5324,7 @@ public ApiResponse GetSubmodelSubmodelRepoWithHttpInfo(string submodel // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5399,7 +5399,7 @@ public async System.Threading.Tasks.Task> GetSubmodelSubmo // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.GET, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5496,7 +5496,7 @@ public ApiResponse InvokeOperationWithHttpInfo(OperationRequest // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5594,7 +5594,7 @@ public async System.Threading.Tasks.Task> InvokeOpe // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5685,7 +5685,7 @@ public ApiResponse InvokeOperationSubmodelRepoWithHttpInfo(Oper // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5777,7 +5777,7 @@ public async System.Threading.Tasks.Task> InvokeOpe // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5850,7 +5850,7 @@ public ApiResponse PostAssetAdministrationShellWithHtt // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5924,7 +5924,7 @@ public async System.Threading.Tasks.Task> // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -5997,7 +5997,7 @@ public ApiResponse PostConceptDescriptionWithHttpInfo(Concep // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6071,7 +6071,7 @@ public async System.Threading.Tasks.Task> PostCo // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6144,7 +6144,7 @@ public ApiResponse PostSubmodelWithHttpInfo(Submodel body) // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6218,7 +6218,7 @@ public async System.Threading.Tasks.Task> PostSubmodelAsyn // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6312,7 +6312,7 @@ public ApiResponse PostSubmodelElementWithHttpInfo(SubmodelElem // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6407,7 +6407,7 @@ public async System.Threading.Tasks.Task> PostSubmo // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6507,7 +6507,7 @@ public ApiResponse PostSubmodelElementByPathWithHttpInfo(Submod // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6608,7 +6608,7 @@ public async System.Threading.Tasks.Task> PostSubmo // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6702,7 +6702,7 @@ public ApiResponse PostSubmodelElementByPathSubmodelRepoWithHtt // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6797,7 +6797,7 @@ public async System.Threading.Tasks.Task> PostSubmo // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6885,7 +6885,7 @@ public ApiResponse PostSubmodelElementSubmodelRepoWithHttpInfo( // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -6974,7 +6974,7 @@ public async System.Threading.Tasks.Task> PostSubmo // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7053,7 +7053,7 @@ public ApiResponse PostSubmodelReferenceWithHttpInfo(Reference body, // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7133,7 +7133,7 @@ public async System.Threading.Tasks.Task> PostSubmodelRef // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Post, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7213,7 +7213,7 @@ public ApiResponse PutAssetAdministrationShellWithHttpInfo(AssetAdminist // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7294,7 +7294,7 @@ public async System.Threading.Tasks.Task> PutAssetAdministra // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7371,7 +7371,7 @@ public ApiResponse PutAssetAdministrationShellByIdWithHttpInfo(AssetAdmi // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7449,7 +7449,7 @@ public async System.Threading.Tasks.Task> PutAssetAdministra // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7526,7 +7526,7 @@ public ApiResponse PutAssetInformationWithHttpInfo(AssetInformation body // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7604,7 +7604,7 @@ public async System.Threading.Tasks.Task> PutAssetInformatio // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7681,7 +7681,7 @@ public ApiResponse PutConceptDescriptionByIdWithHttpInfo(ConceptDescript // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7759,7 +7759,7 @@ public async System.Threading.Tasks.Task> PutConceptDescript // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7851,7 +7851,7 @@ public ApiResponse PutSubmodelWithHttpInfo(Submodel body, string aasIden // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -7944,7 +7944,7 @@ public async System.Threading.Tasks.Task> PutSubmodelAsyncWi // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -8042,7 +8042,7 @@ public ApiResponse PutSubmodelElementByPathWithHttpInfo(SubmodelElement // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -8141,7 +8141,7 @@ public async System.Threading.Tasks.Task> PutSubmodelElement // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -8233,7 +8233,7 @@ public ApiResponse PutSubmodelElementByPathSubmodelRepoWithHttpInfo(Subm // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -8326,7 +8326,7 @@ public async System.Threading.Tasks.Task> PutSubmodelElement // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -8412,7 +8412,7 @@ public ApiResponse PutSubmodelSubmodelRepoWithHttpInfo(Submodel body, st // make the HTTP request RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; @@ -8499,7 +8499,7 @@ public async System.Threading.Tasks.Task> PutSubmodelSubmode // make the HTTP request RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, - Method.PUT, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, + Method.Put, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; diff --git a/src/AasxFileServerRestLibrary/Client/ApiClient.cs b/src/AasxFileServerRestLibrary/Client/ApiClient.cs index beb313098..1f399336f 100644 --- a/src/AasxFileServerRestLibrary/Client/ApiClient.cs +++ b/src/AasxFileServerRestLibrary/Client/ApiClient.cs @@ -7,18 +7,17 @@ * * Generated by: https://github.com/swagger-api/swagger-codegen.git */ +using Microsoft.AspNetCore.Http; +using Newtonsoft.Json; +using RestSharp; using System; using System.Collections; using System.Collections.Generic; -using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; -using System.Web; -using Newtonsoft.Json; -using RestSharp; namespace IO.Swagger.Client { @@ -68,7 +67,7 @@ public ApiClient(Configuration config) //IWebProxy proxy = WebRequest.DefaultWebProxy; //proxy.Credentials = CredentialCache.DefaultCredentials; - RestClient.Proxy = GetProxy(); + //RestClient.Proxy = GetProxy(); //RestClient = new RestClient(Configuration.BasePath); } @@ -181,8 +180,8 @@ private RestRequest PrepareRequest( foreach (var param in fileParams) { //request.AddFile(param.Value.Name, param.Value.Writer, param.Value.FileName, param.Value.ContentType); - //request.AddFile(param.Value.Name, param.Value.FileName, param.Value.ContentType); - request.AddFile(param.Value.Name, param.Value.Writer, param.Value.Name, param.Value.ContentLength); + request.AddFile(param.Value.Name, param.Value.FileName, param.Value.ContentType); + //request.AddFile((param.Value.Name, param.Value.Writer, param.Value.Name, param.Value.ContentLength); } if (postBody != null) // http body (model or byte[]) parameter @@ -241,14 +240,14 @@ public async System.Threading.Tasks.Task CallApiAsyncWithDelegate( String path, RestSharp.Method method, List> queryParams, Object postBody, Dictionary headerParams, Dictionary formParams, Dictionary fileParams, Dictionary pathParams, - String contentType, Action delegateMethod) + String contentType, Action delegateMethod) { var request = PrepareRequest( path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams, contentType); InterceptRequest(request); - request.AdvancedResponseWriter = delegateMethod; + //request.AdvancedResponseWriter = delegateMethod; RestResponse response = (RestResponse)await RestClient.ExecuteAsync(request); //TODO (jtikekar, 2022-04-04): May need to change response.Result InterceptResponse(request, response); diff --git a/src/AasxFileServerRestLibrary/Client/Configuration.cs b/src/AasxFileServerRestLibrary/Client/Configuration.cs index f01b89c50..7277653fe 100644 --- a/src/AasxFileServerRestLibrary/Client/Configuration.cs +++ b/src/AasxFileServerRestLibrary/Client/Configuration.cs @@ -173,8 +173,8 @@ public Configuration( /// HTTP connection timeout (in milliseconds) /// HTTP user agent [Obsolete("Use explicit object construction and setting of properties.", true)] - public Configuration( - // ReSharper disable UnusedParameter.Local + public Configuration( + // ReSharper disable UnusedParameter.Local ApiClient apiClient = null, IDictionary defaultHeader = null, string username = null, @@ -185,8 +185,8 @@ public Configuration( string tempFolderPath = null, string dateTimeFormat = null, int timeout = 100000, - string userAgent = "Swagger-Codegen/1.0.0/csharp" - // ReSharper restore UnusedParameter.Local + string userAgent = "Swagger-Codegen/1.0.0/csharp" + // ReSharper restore UnusedParameter.Local ) { diff --git a/src/AasxFileServerRestLibrary/IO.Swagger.csproj.bak b/src/AasxFileServerRestLibrary/IO.Swagger.csproj.bak deleted file mode 100644 index 873991f3e..000000000 --- a/src/AasxFileServerRestLibrary/IO.Swagger.csproj.bak +++ /dev/null @@ -1,238 +0,0 @@ - - - - - Debug - AnyCPU - {6AFCA9D9-2F72-42BF-861B-F87D782C95C3} - Library - Properties - IO.Swagger - IO.Swagger - v4.8 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.5.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll - - - ..\..\packages\RestSharp.107.3.0\lib\netstandard2.0\RestSharp.dll - - - - ..\..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll - - - - - ..\..\packages\System.IO.4.3.0\lib\net462\System.IO.dll - True - True - - - ..\..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll - - - ..\..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll - True - True - - - - ..\..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - - ..\..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll - True - True - - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll - - - ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll - True - True - - - ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll - True - True - - - ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll - True - True - - - ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll - True - True - - - ..\..\packages\System.Text.Encodings.Web.5.0.0\lib\net461\System.Text.Encodings.Web.dll - - - ..\..\packages\System.Text.Json.5.0.0\lib\net461\System.Text.Json.dll - - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll - - - ..\..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll - - - - - - - - - - $(SolutionDir)\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - ..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - ..\..\vendor\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - - $(SolutionDir)\packages\JsonSubTypes.1.2.0\lib\net45\JsonSubTypes.dll - ..\packages\JsonSubTypes.1.2.0\lib\net45\JsonSubTypes.dll - ..\..\packages\JsonSubTypes.1.2.0\lib\net45\JsonSubTypes.dll - ..\..\vendor\JsonSubTypes.1.2.0\lib\net45\JsonSubTypes.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxFileServerRestLibrary/LICENSE.txt b/src/AasxFileServerRestLibrary/LICENSE.txt index 72844134f..2e5ee87b9 100644 --- a/src/AasxFileServerRestLibrary/LICENSE.txt +++ b/src/AasxFileServerRestLibrary/LICENSE.txt @@ -91,6 +91,12 @@ The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license (MIT, see below). +The Magick.NET library is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1056,3 +1062,414 @@ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to Magick.NET +========================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxFileServerRestLibrary/Model/AssetAdministrationShellAndAsset.cs b/src/AasxFileServerRestLibrary/Model/AssetAdministrationShellAndAsset.cs index 2ec178af9..3d4410ba3 100644 --- a/src/AasxFileServerRestLibrary/Model/AssetAdministrationShellAndAsset.cs +++ b/src/AasxFileServerRestLibrary/Model/AssetAdministrationShellAndAsset.cs @@ -24,12 +24,12 @@ public partial class AssetAdministrationShellAndAsset /// Gets or sets AssetAdministrationShell /// [DataMember(Name = "aas")] - public AdminShell.AdministrationShell aas; + public AasCore.Aas3_0_RC02.AssetAdministrationShell aas; /// /// Gets or sets Asset /// [DataMember(Name = "asset")] - public AdminShell.Asset asset; + public AasCore.Aas3_0_RC02.AssetInformation asset; } } diff --git a/src/AasxFileServerRestLibrary/app.config b/src/AasxFileServerRestLibrary/app.config deleted file mode 100644 index 3e71138d7..000000000 --- a/src/AasxFileServerRestLibrary/app.config +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxFileServerRestLibrary/packages.config b/src/AasxFileServerRestLibrary/packages.config deleted file mode 100644 index 255e18915..000000000 --- a/src/AasxFileServerRestLibrary/packages.config +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxFormatCst/AasxFormatCst.csproj b/src/AasxFormatCst/AasxFormatCst.csproj index f0c0898a0..0deda4d11 100644 --- a/src/AasxFormatCst/AasxFormatCst.csproj +++ b/src/AasxFormatCst/AasxFormatCst.csproj @@ -1,15 +1,16 @@  - netstandard2.0 + net6.0 Library false + false - - + + diff --git a/src/AasxFormatCst/AasxToCst.cs b/src/AasxFormatCst/AasxToCst.cs index 06d9862b7..869db8ccf 100644 --- a/src/AasxFormatCst/AasxToCst.cs +++ b/src/AasxFormatCst/AasxToCst.cs @@ -14,8 +14,10 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Text; using System.Threading.Tasks; using AasxIntegrationBase; -using AdminShellNS; using Newtonsoft.Json; +using Aas = AasCore.Aas3_0_RC02; +using AdminShellNS; +using Extensions; // ReSharper disable ReplaceWithSingleAssignment.True @@ -35,8 +37,8 @@ public class AasxToCst new ListOfUnique(); public List PropertyRecs = new List(); - protected Dictionary - _cdToProp = new Dictionary(); + protected Dictionary + _cdToProp = new Dictionary(); protected CstIdStore _knownIdStore = new CstIdStore(); @@ -60,7 +62,7 @@ private CstIdObjectBase GenerateCustomId(string threePrefix) } private void RecurseOnSme( - AdminShell.SubmodelElementWrapperCollection smwc, + List smwc, CstIdObjectBase presetId, string presetClassType, CstPropertyRecord.ListOfProperty propRecs) @@ -85,21 +87,21 @@ private void RecurseOnSme( foreach (var smw in smwc) { // trivial - var sme = smw?.submodelElement; + var sme = smw; if (sme == null) continue; // is SMC? .. ugly contraption to have first all Properties, then all SMCs - var smc = sme as AdminShell.SubmodelElementCollection; + var smc = sme as Aas.SubmodelElementCollection; if ((smcMode == 0 && smc != null) || (smcMode == 1 && smc == null)) continue; // check, if ConceptDescription exists .. - var cd = _env?.AasEnv.FindConceptDescription(sme.semanticId); + var cd = _env?.AasEnv.FindConceptDescriptionByReference(sme.SemanticId); // try to take over as much information from the pure SME as possible - var semid = sme.semanticId.GetAsExactlyOneKey()?.value; + var semid = sme.SemanticId.GetAsExactlyOneKey()?.Value; string refStr = null; string refName = null; if (semid != null) @@ -135,23 +137,23 @@ private void RecurseOnSme( tmpPd = new CstPropertyDef.PropertyDefinition(bo); // more info - tmpPd.Name = "" + sme.idShort; - if (sme.description != null) - tmpPd.Remark = sme.description.GetDefaultStr("en"); + tmpPd.Name = "" + sme.IdShort; + if (sme.Description != null) + tmpPd.Remark = sme.Description.GetDefaultString("en"); - if (sme is AdminShell.Property prop) - tmpDt = prop.valueType; + if (sme is Aas.Property prop) + tmpDt = Aas.Stringification.ToString(prop.ValueType); // more info if (cd != null) { - var ds61360 = cd.IEC61360Content; + var ds61360 = cd.EmbeddedDataSpecifications?.GetIEC61360Content(); if (ds61360 != null) { - if (ds61360.definition != null) - tmpPd.Definition = ds61360.definition.GetDefaultStr("en"); + if (ds61360.Definition != null) + tmpPd.Definition = ds61360.Definition.GetDefaultString("en"); - var dst = ds61360.dataType?.Trim().ToUpper(); + var dst = Aas.Stringification.ToString(ds61360.DataType)?.ToUpper(); if (ds61360 == null && dst != null) { tmpDt = dst; @@ -206,7 +208,7 @@ private void RecurseOnSme( var pr = new CstPropertyRecord.Property() { ID = tmpPd.ToRef(), - Name = "" + smc.idShort, + Name = "" + smc.IdShort, ValueProps = rec }; @@ -227,7 +229,7 @@ private void RecurseOnSme( // TODO (MIHO, 2021-05-28): extend Parse() to parse also ECLASS, IEC CDD var blockId = CstIdObjectBase.Parse(refStr); blockId.Name = refName; - RecurseOnSme(smc.value, blockId, "Block", lop); + RecurseOnSme(smc.Value, blockId, "Block", lop); } } else @@ -260,7 +262,7 @@ private void RecurseOnSme( { ValueStr = sme.ValueAsText(), ID = refStr, - Name = "" + sme.idShort + Name = "" + sme.IdShort }; if (propRecs != null) propRecs.Add(pr); @@ -270,8 +272,8 @@ private void RecurseOnSme( public void ExportSingleSubmodel( AdminShellPackageEnv env, string path, - AdminShell.Key smId, - IEnumerable cdReferables, + Aas.Key smId, + IEnumerable cdReferables, CstIdObjectBase firstNodeId, CstIdObjectBase secondNodeId, CstIdObjectBase appClassId) @@ -281,19 +283,19 @@ public void ExportSingleSubmodel( return; _env = env; - var sm = _env?.AasEnv.FindFirstSubmodelBySemanticId(smId); + var sm = _env?.AasEnv.FindAllSubmodelBySemanticId(smId.Value).First(); if (sm == null) return; // Step 1: copy all relevant CDs into the AAS if (cdReferables != null) foreach (var rf in cdReferables) - if (rf is AdminShell.ConceptDescription cd) - env?.AasEnv.ConceptDescriptions.AddIfNew(cd); + if (rf is Aas.ConceptDescription cd) + env?.AasEnv.ConceptDescriptions.AddConceptDescriptionOrReturnExisting(cd); // Step 2: make up a list of used semantic references and write to default file var tmpIdStore = new CstIdStore(); - tmpIdStore.CreateEmptyItemsFromSMEs(sm.submodelElements, omitIecEclass: true); + tmpIdStore.CreateEmptyItemsFromSMEs(sm.SubmodelElements, omitIecEclass: true); tmpIdStore.WriteToFile(path + "_default_prop_refs.json"); // Step 3: initialize node defs @@ -332,7 +334,7 @@ public void ExportSingleSubmodel( }); // Step 4: recursively look at SME - RecurseOnSme(sm.submodelElements, appClassId, "Application Class", lop); + RecurseOnSme(sm.SubmodelElements, appClassId, "Application Class", lop); // Step 90: write class definitions var clsRoot = new CstClassDef.Root() { ClassDefinitions = ClassDefs }; diff --git a/src/AasxFormatCst/CstIdStore.cs b/src/AasxFormatCst/CstIdStore.cs index 77bb29646..e8541fe12 100644 --- a/src/AasxFormatCst/CstIdStore.cs +++ b/src/AasxFormatCst/CstIdStore.cs @@ -13,7 +13,9 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Linq; using System.Text; using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; using AdminShellNS; +using Extensions; using Newtonsoft.Json; // ReSharper disable UnassignedField.Global @@ -30,7 +32,7 @@ public class CstIdDictionaryItem /// /// Full fledged Reference, presumably not used at all /// - public AdminShell.SemanticId semanticId; + public Reference semanticId; /// /// String based CST ID info in one string ("Reference" format) @@ -66,14 +68,14 @@ public CstIdDictionaryItem FindStringSemId(string semId) } - public void CreateEmptyItemsFromCDs(IEnumerable cds) + public void CreateEmptyItemsFromCDs(IEnumerable cds) { if (cds == null) return; foreach (var cd in cds) { - var si = cd?.identification?.id; + var si = cd?.Id; if (si != null) { var item = new CstIdDictionaryItem() @@ -87,7 +89,7 @@ public void CreateEmptyItemsFromCDs(IEnumerable c } public void CreateEmptyItemsFromSMEs( - AdminShell.SubmodelElementWrapperCollection smwc, + List smwc, bool omitIecEclass = false) { if (smwc == null) @@ -95,12 +97,12 @@ public void CreateEmptyItemsFromSMEs( foreach (var smw in smwc) { - var sme = smw?.submodelElement; + var sme = smw; if (sme == null) continue; // any - var si = sme.semanticId?.GetAsExactlyOneKey()?.value; + var si = sme.SemanticId?.GetAsExactlyOneKey()?.Value; if (si != null) { if (omitIecEclass && (si.StartsWith("0173") || si.StartsWith("0112"))) @@ -114,10 +116,10 @@ public void CreateEmptyItemsFromSMEs( this.Add(item); } - if (sme is AdminShell.SubmodelElementCollection smc) + if (sme is SubmodelElementCollection smc) { // SMC ? recurse! - CreateEmptyItemsFromSMEs(smc.value, omitIecEclass); + CreateEmptyItemsFromSMEs(smc.Value, omitIecEclass); } } } @@ -140,9 +142,9 @@ public void AddFromFile(string fn) if (fn == null) return; - if (File.Exists(fn)) + if (System.IO.File.Exists(fn)) { - var tmpst = File.ReadAllText(fn); + var tmpst = System.IO.File.ReadAllText(fn); var tmp = JsonConvert.DeserializeObject(tmpst); if (tmp != null) foreach (var ti in tmp) diff --git a/src/AasxFormatCst/LICENSE.txt b/src/AasxFormatCst/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxFormatCst/LICENSE.txt +++ b/src/AasxFormatCst/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxFormatCst/packages.config b/src/AasxFormatCst/packages.config deleted file mode 100644 index a9de8b557..000000000 --- a/src/AasxFormatCst/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/AasxIntegrationBaseWpf/AasForms/AasFormUtils.cs b/src/AasxIntegrationBase/AasForms/AasFormUtils.cs similarity index 58% rename from src/AasxIntegrationBaseWpf/AasForms/AasFormUtils.cs rename to src/AasxIntegrationBase/AasForms/AasFormUtils.cs index 165c16656..0d3216473 100644 --- a/src/AasxIntegrationBaseWpf/AasForms/AasFormUtils.cs +++ b/src/AasxIntegrationBase/AasForms/AasFormUtils.cs @@ -10,15 +10,18 @@ This source code may use other Open Source software components (see LICENSE.txt) using System; using System.Collections.Generic; using System.IO; +using System.Linq; +using Aas = AasCore.Aas3_0_RC02; using AdminShellNS; +using Extensions; namespace AasxIntegrationBase.AasForms { public static class AasFormUtils { private static void RecurseExportAsTemplate( - AdminShell.SubmodelElementWrapperCollection smwc, FormDescListOfElement tels, - AdminShell.AdministrationShellEnv env = null, AdminShell.ListOfConceptDescriptions cds = null) + List smwc, FormDescListOfElement tels, + Aas.Environment env = null, List cds = null) { // access if (smwc == null || tels == null) @@ -26,100 +29,100 @@ private static void RecurseExportAsTemplate( // over all elems foreach (var smw in smwc) - if (smw != null && smw.submodelElement != null) + if (smw != null && smw != null) { FormDescSubmodelElement tsme = null; - if (smw.submodelElement is AdminShell.Property p) + if (smw is Aas.Property p) { tsme = new FormDescProperty( - "" + p.idShort, FormMultiplicity.One, p.semanticId?.GetAsExactlyOneKey(), - "" + p.idShort, valueType: p.valueType); + "" + p.IdShort, FormMultiplicity.One, p.SemanticId?.GetAsExactlyOneKey(), + "" + p.IdShort, valueType: Aas.Stringification.ToString(p.ValueType)); } - if (smw.submodelElement is AdminShell.MultiLanguageProperty mlp) + if (smw is Aas.MultiLanguageProperty mlp) { tsme = new FormDescMultiLangProp( - "" + mlp.idShort, FormMultiplicity.One, mlp.semanticId?.GetAsExactlyOneKey(), - "" + mlp.idShort); + "" + mlp.IdShort, FormMultiplicity.One, mlp.SemanticId?.GetAsExactlyOneKey(), + "" + mlp.IdShort); } - if (smw.submodelElement is AdminShell.File fl) + if (smw is Aas.File fl) { tsme = new FormDescFile( - "" + fl.idShort, FormMultiplicity.One, fl.semanticId?.GetAsExactlyOneKey(), - "" + fl.idShort); + "" + fl.IdShort, FormMultiplicity.One, fl.SemanticId?.GetAsExactlyOneKey(), + "" + fl.IdShort); } - if (smw.submodelElement is AdminShell.ReferenceElement rf) + if (smw is Aas.ReferenceElement rf) { tsme = new FormDescReferenceElement( - "" + rf.idShort, FormMultiplicity.One, rf.semanticId?.GetAsExactlyOneKey(), - "" + rf.idShort); + "" + rf.IdShort, FormMultiplicity.One, rf.SemanticId?.GetAsExactlyOneKey(), + "" + rf.IdShort); } - if (smw.submodelElement is AdminShell.RelationshipElement re) + if (smw is Aas.RelationshipElement re) { tsme = new FormDescRelationshipElement( - "" + re.idShort, FormMultiplicity.One, re.semanticId?.GetAsExactlyOneKey(), - "" + re.idShort); + "" + re.IdShort, FormMultiplicity.One, re.SemanticId?.GetAsExactlyOneKey(), + "" + re.IdShort); } - if (smw.submodelElement is AdminShell.Capability cap) + if (smw is Aas.Capability cap) { tsme = new FormDescCapability( - "" + cap.idShort, FormMultiplicity.One, cap.semanticId?.GetAsExactlyOneKey(), - "" + cap.idShort); + "" + cap.IdShort, FormMultiplicity.One, cap.SemanticId?.GetAsExactlyOneKey(), + "" + cap.IdShort); } - if (smw.submodelElement is AdminShell.SubmodelElementCollection smec) + if (smw is Aas.SubmodelElementCollection smec) { tsme = new FormDescSubmodelElementCollection( - "" + smec.idShort, FormMultiplicity.One, smec.semanticId?.GetAsExactlyOneKey(), - "" + smec.idShort); + "" + smec.IdShort, FormMultiplicity.One, smec.SemanticId?.GetAsExactlyOneKey(), + "" + smec.IdShort); } if (tsme != null) { // take over directly - tsme.PresetCategory = smw.submodelElement.category; + tsme.PresetCategory = smw.Category; // Qualifers - var qs = smw.submodelElement.qualifiers; + var qs = smw.Qualifiers; - var q = qs?.FindType("FormTitle"); + var q = qs?.FindQualifierOfType("FormTitle"); if (q != null) - tsme.FormTitle = "" + q.value; + tsme.FormTitle = "" + q.Value; - q = qs?.FindType("FormInfo"); + q = qs?.FindQualifierOfType("FormInfo"); if (q != null) - tsme.FormInfo = "" + q.value; + tsme.FormInfo = "" + q.Value; - q = qs?.FindType("FormUrl"); + q = qs?.FindQualifierOfType("FormUrl"); if (q != null) - tsme.FormUrl = "" + q.value; + tsme.FormUrl = "" + q.Value; - q = qs?.FindType("EditIdShort"); + q = qs?.FindQualifierOfType("EditIdShort"); if (q != null) - tsme.FormEditIdShort = q.value.Trim().ToLower() == "true"; + tsme.FormEditIdShort = q.Value.Trim().ToLower() == "true"; - q = qs?.FindType("EditDescription"); + q = qs?.FindQualifierOfType("EditDescription"); if (q != null) - tsme.FormEditDescription = q.value.Trim().ToLower() == "true"; + tsme.FormEditDescription = q.Value.Trim().ToLower() == "true"; - q = qs?.FindType("Multiplicity"); + q = qs?.FindQualifierOfType("Multiplicity"); if (q != null) { foreach (var m in (FormMultiplicity[])Enum.GetValues(typeof(FormMultiplicity))) - if (("" + q.value) == Enum.GetName(typeof(FormMultiplicity), m)) + if (("" + q.Value) == Enum.GetName(typeof(FormMultiplicity), m)) tsme.Multiplicity = m; } - q = qs?.FindType("PresetValue"); + q = qs?.FindQualifierOfType("PresetValue"); if (q != null && tsme is FormDescProperty) - (tsme as FormDescProperty).presetValue = "" + q.value; + (tsme as FormDescProperty).presetValue = "" + q.Value; - q = qs?.FindType("PresetMimeType"); + q = qs?.FindQualifierOfType("PresetMimeType"); if (q != null && tsme is FormDescFile) - (tsme as FormDescFile).presetMimeType = "" + q.value; + (tsme as FormDescFile).presetMimeType = "" + q.Value; - q = qs?.FindType("FormChoices"); - if (q != null && q.value.HasContent() && tsme is FormDescProperty fdprop) + q = qs?.FindQualifierOfType("FormChoices"); + if (q != null && q.Value.HasContent() && tsme is FormDescProperty fdprop) { - var choices = q.value.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + var choices = q.Value.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); if (choices != null && choices.Length > 0) fdprop.comboBoxChoices = choices; } @@ -130,7 +133,7 @@ private static void RecurseExportAsTemplate( tsme.PresetIdShort += "{0:00}"; // Ignore this element - q = qs?.FindType("FormIgnore"); + q = qs?.FindQualifierOfType("FormIgnore"); if (q != null) continue; } @@ -139,25 +142,29 @@ private static void RecurseExportAsTemplate( tels.Add(tsme); // in any case, check for CD - if (env != null && cds != null && smw?.submodelElement?.semanticId?.Keys != null) + if (env != null && cds != null && smw?.SemanticId?.Keys != null) { - var masterCd = env.FindConceptDescription(smw?.submodelElement?.semanticId?.Keys); - if (masterCd != null && masterCd.identification != null) + var masterCd = env.FindConceptDescriptionByReference(smw?.SemanticId); + if (masterCd != null && masterCd.Id != null) { // already in cds? - var copyCd = cds.Find(masterCd.identification); + var copyCd = cds.Where(cd => cd.Id.Equals(masterCd.Id)).First(); if (copyCd == null) { // add clone - cds.Add(new AdminShell.ConceptDescription(masterCd)); + cds.Add( + new Aas.ConceptDescription(masterCd.Id, masterCd.Extensions, masterCd.Category, + masterCd.IdShort, masterCd.DisplayName, masterCd.Description, + masterCd.Checksum, masterCd.Administration, + masterCd.EmbeddedDataSpecifications, masterCd.IsCaseOf)); } } } // recurse - if (smw.submodelElement is AdminShell.SubmodelElementCollection) + if (smw is Aas.SubmodelElementCollection) RecurseExportAsTemplate( - (smw.submodelElement as AdminShell.SubmodelElementCollection).value, + (smw as Aas.SubmodelElementCollection).Value, (tsme as FormDescSubmodelElementCollection).value, env, cds); } } @@ -170,8 +177,8 @@ public static void ExportAsTemplate(AdminShellPackageEnv package, string fn) // build templates var templateArr = new List(); - foreach (var aas in package.AasEnv.AdministrationShells) - foreach (var smref in aas.submodelRefs) + foreach (var aas in package.AasEnv.AssetAdministrationShells) + foreach (var smref in aas.Submodels) { // get Submodel var sm = package.AasEnv.FindSubmodel(smref); @@ -181,47 +188,47 @@ public static void ExportAsTemplate(AdminShellPackageEnv package, string fn) // make submodel template var tsm = new FormDescSubmodel( "Submodel", - sm.GetSemanticKey(), - sm.idShort, + sm.SemanticId.GetAsExactlyOneKey(), + sm.IdShort, ""); tsm.SubmodelElements = new FormDescListOfElement(); templateArr.Add(tsm); // ok, export all SubmodelElems - RecurseExportAsTemplate(sm.submodelElements, tsm.SubmodelElements); + RecurseExportAsTemplate(sm.SubmodelElements, tsm.SubmodelElements); } // write var settings = AasxPluginOptionSerialization.GetDefaultJsonSettings(new[] { typeof(FormDescBase) }); settings.Formatting = Newtonsoft.Json.Formatting.Indented; var json = Newtonsoft.Json.JsonConvert.SerializeObject(templateArr, templateArr.GetType(), settings); - File.WriteAllText(fn, json); + System.IO.File.WriteAllText(fn, json); } - public static void ExportAsTemplate(AdminShell.Submodel sm, string fn) + public static void ExportAsTemplate(Aas.Submodel sm, string fn) { // access - if (fn == null || sm == null || sm.submodelElements == null) + if (fn == null || sm == null || sm.SubmodelElements == null) return; // make submodel template var templateArr = new List(); var tsm = new FormDescSubmodel( "Submodel", - sm.semanticId?.GetAsExactlyOneKey(), - sm.idShort, + sm.SemanticId?.GetAsExactlyOneKey(), + sm.IdShort, ""); tsm.SubmodelElements = new FormDescListOfElement(); templateArr.Add(tsm); // ok, export all SubmodelElems - RecurseExportAsTemplate(sm.submodelElements, tsm.SubmodelElements); + RecurseExportAsTemplate(sm.SubmodelElements, tsm.SubmodelElements); // write var settings = AasxPluginOptionSerialization.GetDefaultJsonSettings(new[] { typeof(FormDescBase) }); settings.Formatting = Newtonsoft.Json.Formatting.Indented; var json = Newtonsoft.Json.JsonConvert.SerializeObject(templateArr, templateArr.GetType(), settings); - File.WriteAllText(fn, json); + System.IO.File.WriteAllText(fn, json); } [DisplayName("Record", noTypeLookup: true)] @@ -230,7 +237,7 @@ private class ExportAsGenericFormsOptions_OptionsRecord public string FormTag = ""; public string FormTitle = ""; public FormDescSubmodel FormSubmodel = null; - public AdminShell.ListOfConceptDescriptions ConceptDescriptions = null; + public List ConceptDescriptions = null; } [DisplayName("Options", noTypeLookup: true)] @@ -241,38 +248,38 @@ private class ExportAsGenericFormsOptions_OptionsOverall } public static void ExportAsGenericFormsOptions( - AdminShell.AdministrationShellEnv env, AdminShell.Submodel sm, string fn) + Aas.Environment env, Aas.Submodel sm, string fn) { // access - if (fn == null || env == null || sm == null || sm.submodelElements == null) + if (fn == null || env == null || sm == null || sm.SubmodelElements == null) return; // make submodel template var tsm = new FormDescSubmodel( "Submodel", - sm.semanticId?.GetAsExactlyOneKey(), - sm.idShort, + sm.SemanticId?.GetAsExactlyOneKey(), + sm.IdShort, ""); tsm.SubmodelElements = new FormDescListOfElement(); // will collect a list of CDs - var cds = new AdminShell.ListOfConceptDescriptions(); + var cds = new List(); // ok, export all SubmodelElems into tsm - RecurseExportAsTemplate(sm.submodelElements, tsm.SubmodelElements, env, cds); + RecurseExportAsTemplate(sm.SubmodelElements, tsm.SubmodelElements, env, cds); // fill out record var rec = new ExportAsGenericFormsOptions_OptionsRecord(); rec.FormTag = "TBD"; - var q = sm.qualifiers?.FindType("FormTag"); + var q = sm.Qualifiers?.FindQualifierOfType("FormTag"); if (q != null) - rec.FormTag = "" + q.value; + rec.FormTag = "" + q.Value; - rec.FormTitle = "TBD/" + sm.idShort; - q = sm.qualifiers?.FindType("FormTitle"); + rec.FormTitle = "TBD/" + sm.IdShort; + q = sm.Qualifiers?.FindQualifierOfType("FormTitle"); if (q != null) - rec.FormTitle = "" + q.value; + rec.FormTitle = "" + q.Value; rec.FormSubmodel = tsm; rec.ConceptDescriptions = cds; @@ -285,7 +292,7 @@ public static void ExportAsGenericFormsOptions( var settings = AasxPluginOptionSerialization.GetDefaultJsonSettings(new[] { typeof(FormDescBase) }); settings.Formatting = Newtonsoft.Json.Formatting.Indented; var json = Newtonsoft.Json.JsonConvert.SerializeObject(overall, overall.GetType(), settings); - File.WriteAllText(fn, json); + System.IO.File.WriteAllText(fn, json); } } diff --git a/src/AasxIntegrationBase/AasForms/AnyUiRenderForm.cs b/src/AasxIntegrationBase/AasForms/AnyUiRenderForm.cs index f980b1eac..fe0dc8240 100644 --- a/src/AasxIntegrationBase/AasForms/AnyUiRenderForm.cs +++ b/src/AasxIntegrationBase/AasForms/AnyUiRenderForm.cs @@ -43,9 +43,9 @@ public void RenderFormInst( AnyUiStackPanel view, AnyUiSmallWidgetToolkit uitk, PluginOperationContextBase opctx, bool setLastScrollPos = false, - Func lambdaFixCds = null, - Func lambdaCancel = null, - Func lambdaOK = null) + Func> lambdaFixCds = null, + Func> lambdaCancel = null, + Func> lambdaOK = null) { // make an outer grid, very simple grid of two rows: header & body var outer = view.Add(uitk.AddSmallGrid(rows: 3, cols: 1, colWidths: new[] { "*" })); @@ -70,7 +70,7 @@ public void RenderFormInst( margin: new AnyUiThickness(2), setHeight: 21, padding: new AnyUiThickness(2, 0, 2, 0), content: "Fix missing CDs .."), - lambdaFixCds); + setValueAsync: lambdaFixCds); uitk.AddSmallBasicLabelTo(header, 0, 2, foreground: AnyUiBrushes.DarkBlue, @@ -86,7 +86,7 @@ public void RenderFormInst( margin: new AnyUiThickness(2), setHeight: 21, padding: new AnyUiThickness(2, 0, 2, 0), content: "Cancel"), - lambdaCancel); + setValueAsync: lambdaCancel); if (lambdaOK != null) AnyUiUIElement.RegisterControl( @@ -94,7 +94,7 @@ public void RenderFormInst( margin: new AnyUiThickness(2, 2, 4, 2), setHeight: 21, padding: new AnyUiThickness(2, 0, 2, 0), content: "Update to AAS"), - lambdaOK); + setValueAsync: lambdaOK); // small spacer uitk.AddSmallBasicLabelTo(outer, 1, 0, diff --git a/src/AasxIntegrationBase/AasForms/FormDescription.cs b/src/AasxIntegrationBase/AasForms/FormDescription.cs index 6a755b2ff..93d366096 100644 --- a/src/AasxIntegrationBase/AasForms/FormDescription.cs +++ b/src/AasxIntegrationBase/AasForms/FormDescription.cs @@ -9,7 +9,9 @@ This source code may use other Open Source software components (see LICENSE.txt) using System; using System.Collections.Generic; +using Aas = AasCore.Aas3_0_RC02; using AdminShellNS; +using Extensions; using Newtonsoft.Json; namespace AasxIntegrationBase.AasForms @@ -86,13 +88,13 @@ public class FormDescReferable : FormDescBase /// Preset for Referable.description /// [JsonProperty(Order = 7)] - public AdminShell.Description PresetDescription = null; + public List PresetDescription = null; /// /// SemanticId of the SubmodelElement. Always required. /// [JsonProperty(Order = 8)] - public AdminShell.Key KeySemanticId = new AdminShell.Key(); + public Aas.Key KeySemanticId = new Aas.Key(Aas.KeyTypes.GlobalReference, ""); // Constructors //============= @@ -100,7 +102,7 @@ public class FormDescReferable : FormDescBase public FormDescReferable() { } public FormDescReferable( - string formText, AdminShell.Key keySemanticId, string presetIdShort, string formInfo = null) + string formText, Aas.Key keySemanticId, string presetIdShort, string formInfo = null) : base() { this.FormTitle = formText; @@ -121,19 +123,51 @@ public FormDescReferable(FormDescReferable other) this.PresetDescription = other.PresetDescription; } +#if !DoNotUseAasxCompatibilityModels + + public static List ConvertFromV20(AasxCompatibilityModels.AdminShellV20.Description desc) + { + var res = new List(); + if (desc?.langString != null) + foreach (var ls in desc.langString) + res.Add(new Aas.LangString(ls?.lang, ls?.str)); + return res; + } + + public static Aas.Key ConvertFromV20(AasxCompatibilityModels.AdminShellV20.Key key) + { + if (key != null) + return new Aas.Key( + Aas.Stringification.KeyTypesFromString(key.type) ?? Aas.KeyTypes.GlobalReference, key.value); + return null; + } + + public FormDescReferable(AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescReferableV20 other) + : base() + { + // this part == static, therefore only shallow copy + this.FormTitle = other.FormTitle; + this.FormInfo = other.FormInfo; + this.KeySemanticId = ConvertFromV20(other.KeySemanticId); + this.PresetIdShort = other.PresetIdShort; + this.PresetCategory = other.PresetCategory; + this.PresetDescription = ConvertFromV20(other.PresetDescription); + } +#endif + // Dynamic behaviour //================== - protected void InitReferable(AdminShell.Referable rf) + protected void InitReferable(Aas.IReferable rf) { if (rf == null) return; - rf.idShort = this.PresetIdShort; - rf.category = this.PresetCategory; + rf.IdShort = this.PresetIdShort; + rf.Category = this.PresetCategory; if (this.PresetDescription != null) - rf.description = new AdminShell.Description(this.PresetDescription); + rf.Description = this.PresetDescription.Copy(); } } @@ -157,7 +191,7 @@ public class FormDescSubmodel : FormDescReferable public FormDescSubmodel() { } public FormDescSubmodel( - string formText, AdminShell.Key keySemanticId, string presetIdShort, string formInfo = null) + string formText, Aas.Key keySemanticId, string presetIdShort, string formInfo = null) : base(formText, keySemanticId, presetIdShort, formInfo) { } @@ -169,6 +203,14 @@ public FormDescSubmodel(FormDescSubmodel other) this.SubmodelElements = other.SubmodelElements; } +#if !DoNotUseAasxCompatibilityModels + public FormDescSubmodel(AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescSubmodelV20 other) + : base(other) + { + // this part == static, therefore only shallow copy + this.SubmodelElements = new FormDescListOfElement(other.SubmodelElements); + } +#endif // Dynamic behaviour //================== @@ -187,19 +229,19 @@ public void Add(FormDescSubmodelElement elem) /// Needs to get a unique Identification. /// /// - public AdminShell.Submodel GenerateDefault() + public Aas.Submodel GenerateDefault() { - var res = new AdminShell.Submodel(); + var res = new Aas.Submodel(""); // is Referable this.InitReferable(res); // has SemanticId if (this.KeySemanticId != null) - res.semanticId = AdminShell.SemanticId.CreateFromKey(this.KeySemanticId); + res.SemanticId = ExtendReference.CreateFromKey(this.KeySemanticId); // has elements - res.submodelElements = this.SubmodelElements.GenerateDefault(); + res.SubmodelElements = this.SubmodelElements.GenerateDefault(); return res; } @@ -226,13 +268,43 @@ public FormDescListOfElement(FormDescListOfElement other) this.Add(o); } - public AdminShell.SubmodelElementWrapperCollection GenerateDefault() +#if !DoNotUseAasxCompatibilityModels + public static FormDescSubmodelElement CloneFromOld( + AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescSubmodelElementV20 o) + { + if (o is AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescPropertyV20 op) + return new FormDescProperty(op); + if (o is AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescMultiLangPropV20 omlp) + return new FormDescMultiLangProp(omlp); + if (o is AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescFileV20 ofile) + return new FormDescFile(ofile); + if (o is AasxCompatibilityModels.AasxIntegrationBase + .AasForms.FormDescSubmodelElementCollectionV20 osmc) + return new FormDescSubmodelElementCollection(osmc); + return null; + } + + public FormDescListOfElement( + AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescListOfElementV20 other) + { + if (other == null) + return; + foreach (var o in other) + { + var sme = CloneFromOld(o); + if (sme != null) + this.Add(sme); + } + } +#endif + + public List GenerateDefault() { - var res = new AdminShell.SubmodelElementWrapperCollection(); + var res = new List(); foreach (var desc in this) { - AdminShell.SubmodelElement sme = null; + Aas.ISubmodelElement sme = null; // generate element @@ -285,7 +357,7 @@ public class FormDescSubmodelElement : FormDescReferable public FormDescSubmodelElement() { } public FormDescSubmodelElement( - string formText, FormMultiplicity multiplicity, AdminShell.Key keySemanticId, string presetIdShort, + string formText, FormMultiplicity multiplicity, Aas.Key keySemanticId, string presetIdShort, string formInfo = null, bool isReadOnly = false) : base(formText, keySemanticId, presetIdShort, formInfo) { @@ -301,6 +373,17 @@ public FormDescSubmodelElement(FormDescSubmodelElement other) this.IsReadOnly = other.IsReadOnly; } +#if !DoNotUseAasxCompatibilityModels + public FormDescSubmodelElement( + AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescSubmodelElementV20 other) + : base(other) + { + // this part == static, therefore only shallow copy + this.Multiplicity = (FormMultiplicity)((int)other.Multiplicity); + this.IsReadOnly = other.IsReadOnly; + } +#endif + public virtual FormDescSubmodelElement Clone() { return new FormDescSubmodelElement(this); @@ -310,19 +393,19 @@ public virtual FormDescSubmodelElement Clone() /// Build a new instance, based on the description data /// public virtual FormInstanceSubmodelElement CreateInstance( - FormInstanceListOfSame parentInstance, AdminShell.SubmodelElement source = null) + FormInstanceListOfSame parentInstance, Aas.ISubmodelElement source = null) { return null; } - public void InitSme(AdminShell.SubmodelElement sme) + public void InitSme(Aas.ISubmodelElement sme) { // is a Referable this.InitReferable(sme); // has SemanticId if (this.KeySemanticId != null) - sme.semanticId = AdminShell.SemanticId.CreateFromKey(this.KeySemanticId); + sme.SemanticId = ExtendReference.CreateFromKey(this.KeySemanticId); } } @@ -341,7 +424,7 @@ public class FormDescSubmodelElementCollection : FormDescSubmodelElement public FormDescSubmodelElementCollection() { } public FormDescSubmodelElementCollection( - string formText, FormMultiplicity multiplicity, AdminShell.Key smeSemanticId, string presetIdShort, + string formText, FormMultiplicity multiplicity, Aas.Key smeSemanticId, string presetIdShort, string formInfo = null) : base(formText, multiplicity, smeSemanticId, presetIdShort, formInfo) { @@ -355,6 +438,21 @@ public FormDescSubmodelElementCollection(FormDescSubmodelElementCollection other this.value.Add(ov.Clone()); } +#if !DoNotUseAasxCompatibilityModels + public FormDescSubmodelElementCollection( + AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescSubmodelElementCollectionV20 other) + : base(other) + { + if (other.value != null) + foreach (var ov in other.value) + { + var sme = FormDescListOfElement.CloneFromOld(ov); + if (sme != null) + this.value.Add(sme); + } + } +#endif + public override FormDescSubmodelElement Clone() { return new FormDescSubmodelElementCollection(this); @@ -364,7 +462,7 @@ public override FormDescSubmodelElement Clone() /// Build a new instance, based on the description data /// public override FormInstanceSubmodelElement CreateInstance( - FormInstanceListOfSame parentInstance, AdminShell.SubmodelElement source = null) + FormInstanceListOfSame parentInstance, Aas.ISubmodelElement source = null) { return new FormInstanceSubmodelElementCollection(parentInstance, this, source); } @@ -379,12 +477,12 @@ public void Add(FormDescSubmodelElement subDescription) value.Add(subDescription); } - public AdminShell.SubmodelElementCollection GenerateDefault() + public Aas.SubmodelElementCollection GenerateDefault() { - var res = new AdminShell.SubmodelElementCollection(); + var res = new Aas.SubmodelElementCollection(); this.InitSme(res); - res.value = this.value.GenerateDefault(); + res.Value = this.value.GenerateDefault(); return res; } @@ -434,7 +532,7 @@ public class FormDescProperty : FormDescSubmodelElement public FormDescProperty() { } public FormDescProperty( - string formText, FormMultiplicity multiplicity, AdminShell.Key smeSemanticId, + string formText, FormMultiplicity multiplicity, Aas.Key smeSemanticId, string presetIdShort, string formInfo = null, bool isReadOnly = false, string valueType = null, string presetValue = null) : base(formText, multiplicity, smeSemanticId, presetIdShort, formInfo, isReadOnly) @@ -456,6 +554,18 @@ public FormDescProperty(FormDescProperty other) this.valueFromComboBoxIndex = other.valueFromComboBoxIndex; } +#if !DoNotUseAasxCompatibilityModels + public FormDescProperty(AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescPropertyV20 other) + : base(other) + { + // this part == static, therefore only shallow copy + this.allowedValueTypes = other.allowedValueTypes; + this.presetValue = other.presetValue; + this.comboBoxChoices = other.comboBoxChoices; + this.valueFromComboBoxIndex = other.valueFromComboBoxIndex; + } +#endif + public override FormDescSubmodelElement Clone() { return new FormDescProperty(this); @@ -465,20 +575,21 @@ public override FormDescSubmodelElement Clone() /// Build a new instance, based on the description data /// public override FormInstanceSubmodelElement CreateInstance( - FormInstanceListOfSame parentInstance, AdminShell.SubmodelElement source = null) + FormInstanceListOfSame parentInstance, Aas.ISubmodelElement source = null) { return new FormInstanceProperty(parentInstance, this, source); } - public AdminShell.Property GenerateDefault() + public Aas.Property GenerateDefault() { - var res = new AdminShell.Property(); + var res = new Aas.Property(Aas.DataTypeDefXsd.String); this.InitSme(res); if (this.presetValue != null) - res.value = this.presetValue; + res.Value = this.presetValue; if (this.allowedValueTypes.Length == 1) { - res.valueType = this.allowedValueTypes[0]; + res.ValueType = Aas.Stringification.DataTypeDefXsdFromString(this.allowedValueTypes[0]) + ?? Aas.DataTypeDefXsd.String; } return res; } @@ -487,7 +598,7 @@ public AdminShell.Property GenerateDefault() [DisplayName("FormMultiLangProp")] public class FormDescMultiLangProp : FormDescSubmodelElement { - public static string[] DefaultLanguages = new string[] { "de", "en", "fr", "es", "it", "zh", "kr" }; + public static string[] DefaultLanguages = new string[] { "de", "en", "fr", "es", "it", "zh", "ko", "ja" }; public FormDescMultiLangProp() { } @@ -495,7 +606,7 @@ public FormDescMultiLangProp() { } //============= public FormDescMultiLangProp( - string formText, FormMultiplicity multiplicity, AdminShell.Key smeSemanticId, string presetIdShort, + string formText, FormMultiplicity multiplicity, Aas.Key smeSemanticId, string presetIdShort, string formInfo = null, bool isReadOnly = false) : base(formText, multiplicity, smeSemanticId, presetIdShort, formInfo, isReadOnly) { @@ -506,18 +617,26 @@ public FormDescMultiLangProp(FormDescMultiLangProp other) { } +#if !DoNotUseAasxCompatibilityModels + public FormDescMultiLangProp( + AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescMultiLangPropV20 other) + : base(other) + { + } +#endif + /// /// Build a new instance, based on the description data /// public override FormInstanceSubmodelElement CreateInstance( - FormInstanceListOfSame parentInstance, AdminShell.SubmodelElement source = null) + FormInstanceListOfSame parentInstance, Aas.ISubmodelElement source = null) { return new FormInstanceMultiLangProp(parentInstance, this, source); } - public AdminShell.MultiLanguageProperty GenerateDefault() + public Aas.MultiLanguageProperty GenerateDefault() { - var res = new AdminShell.MultiLanguageProperty(); + var res = new Aas.MultiLanguageProperty(); this.InitSme(res); return res; } @@ -539,7 +658,7 @@ public FormDescFile() { } //============= public FormDescFile( - string formText, FormMultiplicity multiplicity, AdminShell.Key smeSemanticId, + string formText, FormMultiplicity multiplicity, Aas.Key smeSemanticId, string presetIdShort, string formInfo = null, bool isReadOnly = false, string presetMimeType = null) : base(formText, multiplicity, smeSemanticId, presetIdShort, formInfo, isReadOnly) @@ -555,6 +674,16 @@ public FormDescFile(FormDescFile other) this.presetMimeType = other.presetMimeType; } +#if !DoNotUseAasxCompatibilityModels + public FormDescFile(AasxCompatibilityModels.AasxIntegrationBase.AasForms.FormDescFileV20 other) + : base(other) + { + // this part == static, therefore only shallow copy + this.presetMimeType = other.presetMimeType; + } +#endif + + public override FormDescSubmodelElement Clone() { return new FormDescFile(this); @@ -564,17 +693,17 @@ public override FormDescSubmodelElement Clone() /// Build a new instance, based on the description data /// public override FormInstanceSubmodelElement CreateInstance( - FormInstanceListOfSame parentInstance, AdminShell.SubmodelElement source = null) + FormInstanceListOfSame parentInstance, Aas.ISubmodelElement source = null) { return new FormInstanceFile(parentInstance, this, source); } - public AdminShell.File GenerateDefault() + public Aas.ISubmodelElement GenerateDefault() { - var res = new AdminShell.File(); + var res = new Aas.File(""); this.InitSme(res); if (this.presetMimeType != null) - res.mimeType = this.presetMimeType; + res.ContentType = this.presetMimeType; return res; } @@ -595,7 +724,7 @@ public FormDescReferenceElement() { } //============= public FormDescReferenceElement( - string formText, FormMultiplicity multiplicity, AdminShell.Key smeSemanticId, + string formText, FormMultiplicity multiplicity, Aas.Key smeSemanticId, string presetIdShort, string formInfo = null, bool isReadOnly = false, string presetFilter = null) : base(formText, multiplicity, smeSemanticId, presetIdShort, formInfo, isReadOnly) @@ -620,14 +749,14 @@ public override FormDescSubmodelElement Clone() /// Build a new instance, based on the description data /// public override FormInstanceSubmodelElement CreateInstance( - FormInstanceListOfSame parentInstance, AdminShell.SubmodelElement source = null) + FormInstanceListOfSame parentInstance, Aas.ISubmodelElement source = null) { return new FormInstanceReferenceElement(parentInstance, this, source); } - public AdminShell.ReferenceElement GenerateDefault() + public Aas.ReferenceElement GenerateDefault() { - var res = new AdminShell.ReferenceElement(); + var res = new Aas.ReferenceElement(); this.InitSme(res); return res; } @@ -649,7 +778,7 @@ public FormDescRelationshipElement() { } //============= public FormDescRelationshipElement( - string formText, FormMultiplicity multiplicity, AdminShell.Key smeSemanticId, + string formText, FormMultiplicity multiplicity, Aas.Key smeSemanticId, string presetIdShort, string formInfo = null, bool isReadOnly = false, string presetFilter = null) : base(formText, multiplicity, smeSemanticId, presetIdShort, formInfo, isReadOnly) @@ -674,14 +803,14 @@ public override FormDescSubmodelElement Clone() /// Build a new instance, based on the description data /// public override FormInstanceSubmodelElement CreateInstance( - FormInstanceListOfSame parentInstance, AdminShell.SubmodelElement source = null) + FormInstanceListOfSame parentInstance, Aas.ISubmodelElement source = null) { return new FormInstanceRelationshipElement(parentInstance, this, source); } - public AdminShell.RelationshipElement GenerateDefault() + public Aas.RelationshipElement GenerateDefault() { - var res = new AdminShell.RelationshipElement(); + var res = new Aas.RelationshipElement(null, null); this.InitSme(res); return res; } @@ -703,7 +832,7 @@ public FormDescCapability() { } //============= public FormDescCapability( - string formText, FormMultiplicity multiplicity, AdminShell.Key smeSemanticId, + string formText, FormMultiplicity multiplicity, Aas.Key smeSemanticId, string presetIdShort, string formInfo = null, bool isReadOnly = false, string presetFilter = null) : base(formText, multiplicity, smeSemanticId, presetIdShort, formInfo, isReadOnly) @@ -728,14 +857,14 @@ public override FormDescSubmodelElement Clone() /// Build a new instance, based on the description data /// public override FormInstanceSubmodelElement CreateInstance( - FormInstanceListOfSame parentInstance, AdminShell.SubmodelElement source = null) + FormInstanceListOfSame parentInstance, Aas.ISubmodelElement source = null) { return new FormInstanceCapability(parentInstance, this, source); } - public AdminShell.Capability GenerateDefault() + public Aas.Capability GenerateDefault() { - var res = new AdminShell.Capability(); + var res = new Aas.Capability(); this.InitSme(res); return res; } diff --git a/src/AasxIntegrationBase/AasForms/FormInstance.cs b/src/AasxIntegrationBase/AasForms/FormInstance.cs index 714c77718..a59e0e8b9 100644 --- a/src/AasxIntegrationBase/AasForms/FormInstance.cs +++ b/src/AasxIntegrationBase/AasForms/FormInstance.cs @@ -12,7 +12,9 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Linq; using System.Text; using System.Threading.Tasks; +using Aas = AasCore.Aas3_0_RC02; using AdminShellNS; +using Extensions; using AnyUi; using Newtonsoft.Json; @@ -57,21 +59,21 @@ namespace AasxIntegrationBase.AasForms public static class FormInstanceHelper { /// - /// Check if smw.idShortc> contains something like "{0:00}" and iterate index to make it unique + /// Check if smw.IdShortc> contains something like "{0:00}" and iterate index to make it unique /// public static void MakeIdShortUnique( - AdminShell.SubmodelElementWrapperCollection collection, AdminShell.SubmodelElement sme) + List collection, Aas.ISubmodelElement sme) { // access if (collection == null || sme == null) return; // check, if to make idShort unique? - if (sme.idShort.Contains("{0")) + if (sme.IdShort.Contains("{0")) { - var newIdShort = collection.IterateIdShortTemplateToBeUnique(sme.idShort, 999); + var newIdShort = collection.IterateIdShortTemplateToBeUnique(sme.IdShort, 999); if (newIdShort != null) - sme.idShort = newIdShort; + sme.IdShort = newIdShort; } } @@ -315,12 +317,12 @@ public FormDescInstancesPair FindInstance(FormInstanceListOfSame searchInst) /// /// Render the list of form elements into a list of SubmodelElements. /// - public AdminShell.SubmodelElementWrapperCollection AddOrUpdateDifferentElementsToCollection( - AdminShell.SubmodelElementWrapperCollection elements, + public List AddOrUpdateDifferentElementsToCollection( + List elements, AdminShellPackageEnv packageEnv = null, bool addFilesToPackage = false) { // will be a list of newly added elements (for tracing) - var res = new AdminShell.SubmodelElementWrapperCollection(); + var res = new List(); // each description / instance pair foreach (var pair in this) @@ -330,17 +332,17 @@ public AdminShell.SubmodelElementWrapperCollection AddOrUpdateDifferentElementsT // for newly added elements, shaping of idSHort might be required if (lst != null) - foreach (var smw in lst) + foreach (var sme in lst) { // access - if (smw?.submodelElement?.idShort == null) + if (sme.IdShort == null) continue; // check, if to make idShort unique? - FormInstanceHelper.MakeIdShortUnique(elements, smw.submodelElement); + FormInstanceHelper.MakeIdShortUnique(elements, sme); // add to tracing - res.Add(smw); + res.Add(sme); } } return res; @@ -369,7 +371,7 @@ public class FormInstanceListOfSame : IFormInstanceParent, IFormRenderAnyUi /// Instances based on source elements are missing when updating. /// [JsonIgnore] - protected List InitialSourceElements = null; + protected List InitialSourceElements = null; /// /// Clears Instances, InitialSourceElements and further dynamically data- @@ -428,7 +430,7 @@ public void TriggerSlaveEvents(FormInstanceSubmodelElement masterInst, int maste /// the description/ form. /// If not, the display functionality will finally care about creating them. /// - public void PresetInstancesBasedOnSource(AdminShell.SubmodelElementWrapperCollection sourceElements = null) + public void PresetInstancesBasedOnSource(List sourceElements = null) { // access var desc = this.workingDesc as FormDescSubmodelElement; @@ -443,10 +445,10 @@ public void PresetInstancesBasedOnSource(AdminShell.SubmodelElementWrapperCollec // maximum == 1? if (desc.Multiplicity == FormMultiplicity.ZeroToOne || desc.Multiplicity == FormMultiplicity.One) { - var smw = sourceElements.FindFirstSemanticId(desc.KeySemanticId); - if (smw != null && smw.submodelElement != null) + var sme = sourceElements.FindFirstSemanticId(desc.KeySemanticId, matchMode: MatchMode.Relaxed); + if (sme != null) { - var y = desc.CreateInstance(this, smw.submodelElement); + var y = desc.CreateInstance(this, sme); if (y != null) this.SubInstances.Add(y); } @@ -455,10 +457,10 @@ public void PresetInstancesBasedOnSource(AdminShell.SubmodelElementWrapperCollec // maximum > 1? if (desc.Multiplicity == FormMultiplicity.ZeroToMany || desc.Multiplicity == FormMultiplicity.OneToMany) { - foreach (var smw in sourceElements.FindAllSemanticId(desc.KeySemanticId)) - if (smw != null && smw.submodelElement != null) + foreach (var sme in sourceElements.FindAllSemanticId(desc.KeySemanticId, matchMode: MatchMode.Relaxed)) + if (sme != null) { - var y = desc.CreateInstance(this, smw.submodelElement); + var y = desc.CreateInstance(this, sme); if (y != null) this.SubInstances.Add(y); } @@ -466,7 +468,7 @@ public void PresetInstancesBasedOnSource(AdminShell.SubmodelElementWrapperCollec // prepare list of original source elements if (this.InitialSourceElements == null) - this.InitialSourceElements = new List(); + this.InitialSourceElements = new List(); foreach (var inst in this.SubInstances) if (inst != null && inst is FormInstanceSubmodelElement && (inst as FormInstanceSubmodelElement).sourceSme != null) @@ -476,12 +478,12 @@ public void PresetInstancesBasedOnSource(AdminShell.SubmodelElementWrapperCollec /// /// Render the form description and adds or updates its instances into a list of SubmodelElements. /// - public AdminShell.SubmodelElementWrapperCollection AddOrUpdateSameElementsToCollection( - AdminShell.SubmodelElementWrapperCollection elements, AdminShellPackageEnv packageEnv = null, + public List AddOrUpdateSameElementsToCollection( + List elements, AdminShellPackageEnv packageEnv = null, bool addFilesToPackage = false) { // access - var res = new AdminShell.SubmodelElementWrapperCollection(); + var res = new List(); if (this.SubInstances == null || this.workingDesc == null) return null; @@ -512,20 +514,20 @@ public AdminShell.SubmodelElementWrapperCollection AddOrUpdateSameElementsToColl // the Same-Instance was already prepared, however it needs to be eventually // filled with the new elements var smecInst = ins as FormInstanceSubmodelElementCollection; - var sourceSmec = smecInst?.sourceSme as AdminShell.SubmodelElementCollection; + var sourceSmec = smecInst?.sourceSme as Aas.SubmodelElementCollection; - AdminShell.SubmodelElementWrapperCollection newElems = null; + List newElems = null; bool addMode = false; if (sourceSmec == null) { // will become a NEW SMEC ! - newElems = new AdminShell.SubmodelElementWrapperCollection(); + newElems = new List(); addMode = true; } else { // will be added to an existing SMEC - newElems = sourceSmec.value; + newElems = sourceSmec.Value; addMode = false; } @@ -534,15 +536,15 @@ public AdminShell.SubmodelElementWrapperCollection AddOrUpdateSameElementsToColl if (newElems != null && newElems.Count > 0) { - var smec = smecInst?.sme as AdminShell.SubmodelElementCollection; + var smec = smecInst?.sme as Aas.SubmodelElementCollection; // really add a new instances of the SMEC if (addMode && smecInst != null && smec != null) { // add - if (smec.value == null) - smec.value = new AdminShellV20.SubmodelElementWrapperCollection(); - smec.value.AddRange(newElems); + if (smec.Value == null) + smec.Value = new List(); + smec.Value.AddRange(newElems); // make smec unique FormInstanceHelper.MakeIdShortUnique(elements, smec); @@ -762,7 +764,7 @@ public static class FormInstanceAnyUiHelper public static AnyUiGrid RenderAnyUiHead( AnyUiStackPanel view, AnyUiSmallWidgetToolkit uitk, PluginOperationContextBase opctx, FormDescReferable desc, - AdminShell.Referable rf, + Aas.IReferable rf, int? extraRows = null, Func plusButtonLambda = null, Func expandButtonLambda = null) @@ -785,7 +787,7 @@ public static AnyUiGrid RenderAnyUiHead( Foreground = AnyUiBrushes.DarkBlue, FontSize = 1.3f, Margin = new AnyUiThickness(0, 0, 10, 0), - Text = $"{desc?.FormTitle} {"" + rf?.idShort}" + Text = $"{desc?.FormTitle} {"" + rf?.IdShort}" }); if (desc.FormUrl.HasContent()) @@ -834,7 +836,7 @@ public static AnyUiGrid RenderAnyUiHead( public static AnyUiGrid RenderAnyUiRefAttribs( AnyUiStackPanel view, AnyUiSmallWidgetToolkit uitk, PluginOperationContextBase opctx, FormDescReferable desc, - AdminShell.Referable rf, + Aas.IReferable rf, IFormInstanceParent current, Action touch = null, bool editIdShort = false, @@ -853,7 +855,7 @@ public static AnyUiGrid RenderAnyUiRefAttribs( rows: 2 + (editIdShort ? 1 : 0) + (editDesc ? 1 : 0) - + (editDesc && rf.description?.langString != null ? rf.description.langString.Count : 0), + + (editDesc && rf.Description != null ? rf.Description.Count : 0), cols: 6, colWidths: new[] { "2:", "60:", "60:", "*", "22:", "2:" })); @@ -871,11 +873,11 @@ public static AnyUiGrid RenderAnyUiRefAttribs( AnyUiUIElement.RegisterControl( uitk.AddSmallTextBoxTo(g, row, 2, colSpan: 2, margin: new AnyUiThickness(1.0), - text: "" + rf.idShort), + text: "" + rf.IdShort), (o) => { if (o is string os) - rf.idShort = os; + rf.IdShort = os; touch?.Invoke(); return new AnyUiLambdaActionNone(); }); @@ -895,7 +897,7 @@ public static AnyUiGrid RenderAnyUiRefAttribs( content: "Description:"); // info text only, if now langauges - if (rf.description?.langString == null || rf.description.langString.Count < 1) + if (rf.Description == null || rf.Description.Count < 1) uitk.AddSmallBasicLabelTo(g, row, 2, colSpan: 2, foreground: AnyUiBrushes.DarkGray, fontSize: 0.8f, verticalAlignment: AnyUiVerticalAlignment.Center, @@ -921,19 +923,19 @@ public static AnyUiGrid RenderAnyUiRefAttribs( row++; // list single languages - if (rf.description?.langString != null) - foreach (var ls in rf.description.langString) + if (rf.Description != null) + foreach (var ls in rf.Description) { // lang AnyUiUIElement.RegisterControl( uitk.AddSmallComboBoxTo(g, row, 2, margin: new AnyUiThickness(1.0), horizontalAlignment: AnyUiHorizontalAlignment.Stretch, - text: "" + ls.lang, + text: "" + ls.Language, items: AasxLanguageHelper.GetLangCodes().ToArray()), (o) => { if (o is string os) - ls.lang = os; + ls.Language = os; touch?.Invoke(); return new AnyUiLambdaActionNone(); }); @@ -941,11 +943,11 @@ public static AnyUiGrid RenderAnyUiRefAttribs( // key AnyUiUIElement.RegisterControl( uitk.AddSmallTextBoxTo(g, row, 3, margin: new AnyUiThickness(1.0), - text: "" + ls.str), + text: "" + ls.Text), (o) => { if (o is string os) - ls.str = os; + ls.Text = os; touch?.Invoke(); return new AnyUiLambdaActionNone(); }); @@ -959,8 +961,8 @@ public static AnyUiGrid RenderAnyUiRefAttribs( content: "\u2796"), (o) => { - if (rf.description.langString.Contains(storedLs)) - rf.description.langString.Remove(storedLs); + if (rf.Description.Contains(storedLs)) + rf.Description.Remove(storedLs); touch?.Invoke(); return FormInstanceBase.NewLambdaUpdateUi(current); }); @@ -981,12 +983,12 @@ public class FormInstanceSubmodel : FormInstanceBase, IFormListOfDifferent /// /// The Submodel is maintained by the instance /// - public AdminShell.Submodel sm = null; + public Aas.Submodel sm = null; /// /// This links to a Submodel, from which the instance was read/ edited. /// - public AdminShell.Submodel sourceSM = null; + public Aas.Submodel sourceSM = null; public FormInstanceListOfDifferent PairInstances = new FormInstanceListOfDifferent(); @@ -1008,26 +1010,26 @@ public FormInstanceSubmodel(FormDescSubmodel desc) } } - public void InitReferable(FormDescSubmodel desc, AdminShell.Submodel source) + public void InitReferable(FormDescSubmodel desc, Aas.Submodel source) { if (desc == null) return; // create sm here! (different than handling of SME!!) - this.sm = new AdminShell.Submodel(); + this.sm = new Aas.Submodel(""); this.sourceSM = source; - sm.idShort = desc.PresetIdShort; - if (source?.idShort != null) - sm.idShort = source.idShort; - sm.category = desc.PresetCategory; + sm.IdShort = desc.PresetIdShort; + if (source?.IdShort != null) + sm.IdShort = source.IdShort; + sm.Category = desc.PresetCategory; if (desc.PresetDescription != null) - sm.description = new AdminShell.Description(desc.PresetDescription); - if (source?.description != null) - sm.description = new AdminShell.Description(source.description); + sm.Description = desc.PresetDescription.Copy(); + if (source?.Description != null) + sm.Description = source.Description.Copy(); if (desc.KeySemanticId != null) - sm.semanticId = AdminShell.SemanticId.CreateFromKey(desc.KeySemanticId); + sm.SemanticId = ExtendReference.CreateFromKey(desc.KeySemanticId); } public FormInstanceListOfDifferent GetListOfDifferent() @@ -1040,7 +1042,7 @@ public FormInstanceListOfDifferent GetListOfDifferent() /// of the description/ form. /// If not, the display functionality will finally care about creating them. /// - public void PresetInstancesBasedOnSource(AdminShell.SubmodelElementWrapperCollection sourceElements = null) + public void PresetInstancesBasedOnSource(List sourceElements = null) { if (this.PairInstances != null) foreach (var pair in this.PairInstances) @@ -1052,8 +1054,8 @@ public void PresetInstancesBasedOnSource(AdminShell.SubmodelElementWrapperCollec /// /// Render the list of form elements into a list of SubmodelElements. /// - public AdminShell.SubmodelElementWrapperCollection AddOrUpdateDifferentElementsToCollection( - AdminShell.SubmodelElementWrapperCollection elements, + public List AddOrUpdateDifferentElementsToCollection( + List elements, AdminShellPackageEnv packageEnv = null, bool addFilesToPackage = false, bool editSource = false) @@ -1061,10 +1063,10 @@ public AdminShell.SubmodelElementWrapperCollection AddOrUpdateDifferentElementsT // SM itself? if (this.sm != null && Touched && this.sourceSM != null && editSource) { - if (this.sm.idShort != null) - this.sourceSM.idShort = "" + this.sm.idShort; - if (this.sm.description != null) - this.sourceSM.description = new AdminShell.Description(this.sm.description); + if (this.sm.IdShort != null) + this.sourceSM.IdShort = "" + this.sm.IdShort; + if (this.sm.Description != null) + this.sourceSM.Description = sm.Description.Copy(); } // SM as a set of elements @@ -1130,29 +1132,29 @@ public class FormInstanceSubmodelElement : FormInstanceBase /// /// The SME which is maintained by the instance /// - public AdminShell.SubmodelElement sme = null; + public Aas.ISubmodelElement sme = null; /// /// This links to a SME, from which the instance was read/ edited. /// - public AdminShell.SubmodelElement sourceSme = null; + public Aas.ISubmodelElement sourceSme = null; - protected void InitReferable(FormDescSubmodelElement desc, AdminShell.SubmodelElement source) + protected void InitReferable(FormDescSubmodelElement desc, Aas.ISubmodelElement source) { if (desc == null || sme == null) return; - sme.idShort = desc.PresetIdShort; - if (source?.idShort != null) - sme.idShort = source.idShort; - sme.category = desc.PresetCategory; + sme.IdShort = desc.PresetIdShort; + if (source?.IdShort != null) + sme.IdShort = source.IdShort; + sme.Category = desc.PresetCategory; if (desc.PresetDescription != null) - sme.description = new AdminShell.Description(desc.PresetDescription); - if (source?.description != null) - sme.description = new AdminShell.Description(source.description); + sme.Description = desc.PresetDescription.Copy(); + if (source?.Description != null) + sme.Description = source.Description.Copy(); if (desc.KeySemanticId != null) - sme.semanticId = AdminShell.SemanticId.CreateFromKey(desc.KeySemanticId); + sme.SemanticId = ExtendReference.CreateFromKey(desc.KeySemanticId); } /// @@ -1166,10 +1168,10 @@ public virtual bool ProcessSmeForRender( { if (this.sme != null && Touched && this.sourceSme != null && editSource) { - if (this.sme.idShort != null) - this.sourceSme.idShort = "" + this.sme.idShort; - if (this.sme.description != null) - this.sourceSme.description = new AdminShell.Description(this.sme.description); + if (this.sme.IdShort != null) + this.sourceSme.IdShort = "" + this.sme.IdShort; + if (this.sme.Description != null) + this.sourceSme.Description = this.sme.Description.Copy(); } return false; } @@ -1178,12 +1180,12 @@ public virtual bool ProcessSmeForRender( /// Render the instance into a list (right now, exactly one!) of SubmodelElements. /// Might be overridden in subclasses. /// - public virtual AdminShell.SubmodelElementWrapperCollection AddOrUpdateSmeToCollection( - AdminShell.SubmodelElementWrapperCollection collectionNewElements, + public virtual List AddOrUpdateSmeToCollection( + List collectionNewElements, AdminShellPackageEnv packageEnv = null, bool addFilesToPackage = false) { // typically, there will be only one SME - var res = new AdminShell.SubmodelElementWrapperCollection(); + var res = new List(); // SME present? if (sme != null) @@ -1195,10 +1197,10 @@ public virtual AdminShell.SubmodelElementWrapperCollection AddOrUpdateSmeToColle if (doAdd) { // add to elements (this is the real transaction) - collectionNewElements.Add(AdminShell.SubmodelElementWrapper.CreateFor(sme)); + collectionNewElements.Add(sme.Copy()); // add to the tracing information for new elements - res.Add(AdminShell.SubmodelElementWrapper.CreateFor(sme)); + res.Add(sme.Copy()); } } @@ -1221,7 +1223,7 @@ public class FormInstanceSubmodelElementCollection : FormInstanceSubmodelElement public FormInstanceSubmodelElementCollection( FormInstanceListOfSame parentInstance, - FormDescSubmodelElementCollection parentDesc, AdminShell.SubmodelElement source = null) + FormDescSubmodelElementCollection parentDesc, Aas.ISubmodelElement source = null) { // way back to description this.desc = parentDesc; @@ -1229,7 +1231,7 @@ public FormInstanceSubmodelElementCollection( var smecDesc = this.desc as FormDescSubmodelElementCollection; // initialize Referable - var smec = new AdminShell.SubmodelElementCollection(); + var smec = new Aas.SubmodelElementCollection(); this.sme = smec; InitReferable(parentDesc, source); @@ -1244,13 +1246,13 @@ public FormInstanceSubmodelElementCollection( // check, if a source is present this.sourceSme = source; - var smecSource = this.sourceSme as AdminShell.SubmodelElementCollection; + var smecSource = this.sourceSme as Aas.SubmodelElementCollection; if (smecSource != null) { if (this.PairInstances != null) foreach (var pair in this.PairInstances) { - pair?.instances?.PresetInstancesBasedOnSource(smecSource.value); + pair?.instances?.PresetInstancesBasedOnSource(smecSource.Value); } } @@ -1273,8 +1275,8 @@ public FormInstanceListOfDifferent GetListOfDifferent() /// Build a new instance, based on the description data /// - public override AdminShell.SubmodelElementWrapperCollection AddOrUpdateSmeToCollection( - AdminShell.SubmodelElementWrapperCollection elements, AdminShellPackageEnv packageEnv = null, + public override List AddOrUpdateSmeToCollection( + List elements, AdminShellPackageEnv packageEnv = null, bool addFilesToPackage = false) { // SMEC as Refrable @@ -1293,7 +1295,7 @@ public override AdminShell.SubmodelElementWrapperCollection AddOrUpdateSmeToColl /// of the description/ form. /// If not, the display functionality will finally care about creating them. /// - public void PresetInstancesBasedOnSource(AdminShell.SubmodelElementWrapperCollection sourceElements = null) + public void PresetInstancesBasedOnSource(List sourceElements = null) { if (this.PairInstances != null) foreach (var pair in this.PairInstances) @@ -1305,8 +1307,8 @@ public void PresetInstancesBasedOnSource(AdminShell.SubmodelElementWrapperCollec /// /// Render the list of form elements into a list of SubmodelElements. /// - public AdminShell.SubmodelElementWrapperCollection AddOrUpdateDifferentElementsToCollection( - AdminShell.SubmodelElementWrapperCollection elements, AdminShellPackageEnv packageEnv = null, + public List AddOrUpdateDifferentElementsToCollection( + List elements, AdminShellPackageEnv packageEnv = null, bool addFilesToPackage = false) { if (this.PairInstances != null) @@ -1364,35 +1366,36 @@ public class FormInstanceProperty : FormInstanceSubmodelElement { public FormInstanceProperty( FormInstanceListOfSame parentInstance, FormDescProperty parentDesc, - AdminShell.SubmodelElement source = null, bool deepCopy = false) + Aas.ISubmodelElement source = null, bool deepCopy = false) { // way back to description this.parentInstance = parentInstance; this.desc = parentDesc; // initialize Referable - var p = new AdminShell.Property(); + var p = new Aas.Property(Aas.DataTypeDefXsd.String); this.sme = p; InitReferable(parentDesc, source); // check, if a source is present this.sourceSme = source; - var pSource = this.sourceSme as AdminShell.Property; + var pSource = this.sourceSme as Aas.Property; if (pSource != null) { // take over - p.valueType = pSource.valueType; - p.value = pSource.value; + p.ValueType = pSource.ValueType; + p.Value = pSource.Value; } else { // some more preferences if (parentDesc.allowedValueTypes != null && parentDesc.allowedValueTypes.Length >= 1) - p.valueType = parentDesc.allowedValueTypes[0]; + p.ValueType = Aas.Stringification.DataTypeDefXsdFromString(parentDesc.allowedValueTypes[0]) + ?? Aas.DataTypeDefXsd.String; if (parentDesc.presetValue != null && parentDesc.presetValue.Length > 0) { - p.value = parentDesc.presetValue; + p.Value = parentDesc.presetValue; // immediately set touched in order to have this value saved this.Touch(); } @@ -1420,12 +1423,12 @@ public override bool ProcessSmeForRender( // refer to base (SME) function, but not caring about result base.ProcessSmeForRender(packageEnv, addFilesToPackage, editSource); - var p = this.sme as AdminShell.Property; - var pSource = this.sourceSme as AdminShell.Property; + var p = this.sme as Aas.Property; + var pSource = this.sourceSme as Aas.Property; if (p != null && Touched && pSource != null && editSource) { - pSource.valueType = p.valueType; - pSource.value = p.value; + pSource.ValueType = p.ValueType; + pSource.Value = p.Value; return false; } return true; @@ -1439,23 +1442,23 @@ public override void OnSlaveEvent( { // access to master var pMasterInst = masterInst as FormInstanceProperty; - var pMaster = pMasterInst?.sme as AdminShell.Property; - if (pMaster?.value == null) + var pMaster = pMasterInst?.sme as Aas.Property; + if (pMaster?.Value == null) return; // accues to this - var pThis = this.sme as AdminShell.Property; + var pThis = this.sme as Aas.Property; if (pThis == null) return; // desc of this var pDesc = this.desc as FormDescProperty; if (pDesc == null || pDesc.valueFromMasterValue == null || - !pDesc.valueFromMasterValue.ContainsKey(pMaster.value.Trim())) + !pDesc.valueFromMasterValue.ContainsKey(pMaster.Value.Trim())) return; // simply take value - pThis.value = pDesc.valueFromMasterValue[pMaster.value.Trim()]; + pThis.Value = pDesc.valueFromMasterValue[pMaster.Value.Trim()]; this.Touch(); // refresh @@ -1465,13 +1468,13 @@ public override void OnSlaveEvent( #endif if (MainControl is AnyUiTextBox mtb) { - mtb.Text = pThis.value; + mtb.Text = pThis.Value; mtb.Touch(); } if (MainControl is AnyUiComboBox mcb && mcb.IsEditable == true) { - mcb.Text = pThis.value; + mcb.Text = pThis.Value; mcb.Touch(); } } @@ -1483,7 +1486,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u PluginOperationContextBase opctx) { // access - var prop = sme as AdminShell.Property; + var prop = sme as Aas.Property; var pDesc = desc as FormDescProperty; if (prop == null || pDesc == null) return; @@ -1518,7 +1521,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u if (items != null && items.Length > 0 && idx >= 0 && idx < items.Length && !editableMode) { Touch(); - prop.value = "" + items[idx]; + prop.Value = "" + items[idx]; // dependent values parentInstance?.TriggerSlaveEvents(this, Index); @@ -1538,7 +1541,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u if (pDesc.valueFromComboBoxIndex != null && pDesc.valueFromComboBoxIndex.Length >= 1) { for (int i = 0; i < pDesc.valueFromComboBoxIndex.Length; i++) - if (pDesc.valueFromComboBoxIndex[i].Trim() == prop.value) + if (pDesc.valueFromComboBoxIndex[i].Trim() == prop.Value) { mcb2.SelectedIndex = i; break; @@ -1547,7 +1550,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u else { // editable combo box, initialize normal - mcb2.Text = "" + prop.value; + mcb2.Text = "" + prop.Value; } } } @@ -1556,11 +1559,11 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u MainControl = AnyUiUIElement.RegisterControl( uitk.AddSmallTextBoxTo(g, 0, 1, margin: new AnyUiThickness(0, 2, 0, 2), - text: "" + prop.value), + text: "" + prop.Value), (o) => { if (o is string os) - prop.value = os; + prop.Value = os; Touch(); return new AnyUiLambdaActionNone(); }); @@ -1572,24 +1575,25 @@ public class FormInstanceMultiLangProp : FormInstanceSubmodelElement { public FormInstanceMultiLangProp( FormInstanceListOfSame parentInstance, FormDescMultiLangProp parentDesc, - AdminShell.SubmodelElement source = null, bool deepCopy = false) + Aas.ISubmodelElement source = null, bool deepCopy = false) { // way back to description this.parentInstance = parentInstance; this.desc = parentDesc; // initialize Referable - var mlp = new AdminShell.MultiLanguageProperty(); + var mlp = new Aas.MultiLanguageProperty(); this.sme = mlp; InitReferable(parentDesc, source); // check, if a source is present this.sourceSme = source; - var mlpSource = this.sourceSme as AdminShell.MultiLanguageProperty; + var mlpSource = this.sourceSme as Aas.MultiLanguageProperty; if (mlpSource != null) { // take over - mlp.value = new AdminShell.LangStringSet(mlpSource.value); + if (mlpSource.Value != null) + mlp.Value = mlpSource.Value.Copy(); } // create user control @@ -1613,11 +1617,12 @@ public override bool ProcessSmeForRender( // refer to base (SME) function, but not caring about result base.ProcessSmeForRender(packageEnv, addFilesToPackage, editSource); - var mlp = this.sme as AdminShell.MultiLanguageProperty; - var mlpSource = this.sourceSme as AdminShell.MultiLanguageProperty; + var mlp = this.sme as Aas.MultiLanguageProperty; + var mlpSource = this.sourceSme as Aas.MultiLanguageProperty; if (mlp != null && Touched && mlpSource != null && editSource) { - mlpSource.value = new AdminShell.LangStringSet(mlp.value); + if (mlp.Value != null) + mlpSource.Value = mlp.Value.Copy(); return false; } return true; @@ -1630,7 +1635,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u PluginOperationContextBase opctx) { // access - var mlp = sme as AdminShell.MultiLanguageProperty; + var mlp = sme as Aas.MultiLanguageProperty; if (mlp == null) return; @@ -1642,7 +1647,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u // LANG2 VAL2 [-] var g = view.Add( - uitk.AddSmallGrid(rows: 1 + mlp.value.Count, cols: 5, + uitk.AddSmallGrid(rows: 1 + (mlp.Value?.Count ?? 0), cols: 5, colWidths: new[] { "2:", "60:", "*", "23:", "2:" })); // Label in 1st row @@ -1659,15 +1664,15 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u content: "\u2795"), (o) => { - if (mlp.value?.langString == null) - mlp.value = new AdminShell.LangStringSet(); - mlp.value.langString.Add(new AdminShell.LangStr()); + if (mlp.Value == null) + mlp.Value = new List(); + mlp.Value.Add(new Aas.LangString("", "")); Touch(); return NewLambdaUpdateUi(this); }); // no content? .. info on 1st row - if (mlp.value?.langString == null || mlp.value.Count < 1) + if (mlp.Value == null || mlp.Value.Count < 1) { uitk.AddSmallBasicLabelTo(g, 0, 2, foreground: AnyUiBrushes.MiddleGray, fontSize: 0.8f, @@ -1679,7 +1684,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u // simply render the langStrs int row = 0; - foreach (var ls in mlp.value.langString) + foreach (var ls in mlp.Value) { // row by row row++; @@ -1688,12 +1693,12 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u AnyUiUIElement.RegisterControl( uitk.AddSmallComboBoxTo(g, row, 1, margin: new AnyUiThickness(1.0), horizontalAlignment: AnyUiHorizontalAlignment.Stretch, - text: "" + ls.lang, + text: "" + ls.Language, items: AasxLanguageHelper.GetLangCodes().ToArray()), (o) => { if (o is string os) - ls.lang = os; + ls.Language = os; Touch(); return new AnyUiLambdaActionNone(); }); @@ -1701,11 +1706,11 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u // key AnyUiUIElement.RegisterControl( uitk.AddSmallTextBoxTo(g, row, 2, margin: new AnyUiThickness(1.0), - text: "" + ls.str), + text: "" + ls.Text), (o) => { if (o is string os) - ls.str = os; + ls.Text = os; Touch(); return new AnyUiLambdaActionNone(); }); @@ -1719,8 +1724,8 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u content: "\u2796"), (o) => { - if (mlp.value.langString.Contains(storedLs)) - mlp.value.langString.Remove(storedLs); + if (mlp.Value.Contains(storedLs)) + mlp.Value.Remove(storedLs); Touch(); return NewLambdaUpdateUi(this); }); @@ -1738,24 +1743,24 @@ public class FormInstanceFile : FormInstanceSubmodelElement public FormInstanceFile( FormInstanceListOfSame parentInstance, FormDescFile parentDesc, - AdminShell.SubmodelElement source = null, bool deepCopy = false) + Aas.ISubmodelElement source = null, bool deepCopy = false) { // way back to description this.parentInstance = parentInstance; this.desc = parentDesc; // initialize Refwrable - var file = new AdminShell.File(); + var file = new Aas.File(""); this.sme = file; InitReferable(parentDesc, source); // check, if a source is present this.sourceSme = source; - var fileSource = this.sourceSme as AdminShell.File; + var fileSource = this.sourceSme as Aas.File; if (fileSource != null) { // take over - file.value = fileSource.value; + file.Value = fileSource.Value; } // create user control @@ -1781,8 +1786,8 @@ public override bool ProcessSmeForRender( base.ProcessSmeForRender(packageEnv, addFilesToPackage, editSource); // access - var file = this.sme as AdminShell.File; - var fileSource = this.sourceSme as AdminShell.File; + var file = this.sme as Aas.File; + var fileSource = this.sourceSme as Aas.File; // need to do more than the base implementation! if (file != null) @@ -1807,7 +1812,7 @@ public override bool ProcessSmeForRender( packageEnv.PrepareSupplementaryFileParameters(ref targetPath, ref targetFn); // save - file.value = targetPath + targetFn; + file.Value = targetPath + targetFn; if (addFilesToPackage) { @@ -1828,7 +1833,7 @@ public override bool ProcessSmeForRender( // now, may be edit instead of new if (file != null && Touched && fileSource != null && editSource) { - fileSource.value = file.value; + fileSource.Value = file.Value; return false; } return true; @@ -1841,7 +1846,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u PluginOperationContextBase opctx) { // access - var file = sme as AdminShell.File; + var file = sme as Aas.File; if (file == null) return; @@ -1856,8 +1861,8 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u // prepare file display var finfo = "Drag a file to register loading it!"; - if (file.value.HasContent()) - finfo = "File current: " + file.value; + if (file.Value.HasContent()) + finfo = "File current: " + file.Value; if (FileToLoad != null) finfo = "File to load: " + FileToLoad; @@ -1883,7 +1888,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u content: "Clear"), (o) => { - file.value = ""; + file.Value = ""; FileToLoad = null; Touch(); return NewLambdaUpdateUi(this); @@ -1923,24 +1928,25 @@ public class FormInstanceReferenceElement : FormInstanceSubmodelElement { public FormInstanceReferenceElement( FormInstanceListOfSame parentInstance, FormDescReferenceElement parentDesc, - AdminShell.SubmodelElement source = null, bool deepCopy = false) + Aas.ISubmodelElement source = null, bool deepCopy = false) { // way back to description this.parentInstance = parentInstance; this.desc = parentDesc; // initialize Referable - var re = new AdminShell.ReferenceElement(); + var re = new Aas.ReferenceElement(); this.sme = re; InitReferable(parentDesc, source); // check, if a source is present this.sourceSme = source; - var reSource = this.sourceSme as AdminShell.ReferenceElement; + var reSource = this.sourceSme as Aas.ReferenceElement; if (reSource != null) { // take over - re.value = new AdminShell.Reference(reSource.value); + if (reSource.Value != null) + re.Value = reSource.Value.Copy(); } // create user control @@ -1964,11 +1970,12 @@ public override bool ProcessSmeForRender( // refer to base (SME) function, but not caring about result base.ProcessSmeForRender(packageEnv, addFilesToPackage, editSource); - var re = this.sme as AdminShell.ReferenceElement; - var reSource = this.sourceSme as AdminShell.ReferenceElement; + var re = this.sme as Aas.ReferenceElement; + var reSource = this.sourceSme as Aas.ReferenceElement; if (re != null && Touched && reSource != null && editSource) { - reSource.value = new AdminShell.Reference(re.value); + if (re.Value != null) + reSource.Value = re.Value.Copy(); return false; } return true; @@ -1981,7 +1988,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u PluginOperationContextBase opctx) { // access - var refe = sme as AdminShell.ReferenceElement; + var refe = sme as Aas.ReferenceElement; if (refe == null) return; @@ -1996,10 +2003,10 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u // prepare reference display var info = "(no reference set)"; - if (refe.value != null) + if (refe.Value != null) info = "(no Keys)"; - if (refe.value?.Keys != null && refe.value.Keys.Count > 0) - info = refe.value.ToString(format: 1, delimiter: Environment.NewLine); + if (refe.Value?.Keys != null && refe.Value.Keys.Count > 0) + info = refe.Value.ToStringExtended(delimiter: System.Environment.NewLine); // Use a drop box as info; but now allow drop uitk.AddSmallDropBoxTo( @@ -2015,7 +2022,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u content: "Clear"), (o) => { - refe.value = null; + refe.Value = null; Touch(); return NewLambdaUpdateUi(this); }); @@ -2032,7 +2039,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u tempI.PushAndAdaptEventFromTop( new AasxIntegrationBase.AasxPluginResultEventSelectAasEntity() { - filterEntities = AdminShell.Key.AllElements, + filterEntities = "All", showAuxPackage = true, showRepoFiles = true }, @@ -2041,7 +2048,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u if (revt is AasxPluginEventReturnSelectAasEntity rsel && rsel.resultKeys != null) { // do it - refe.value = AdminShell.Reference.CreateNew(rsel.resultKeys); + refe.Value = ExtendReference.CreateNew(rsel.resultKeys); Touch(); // send event to re-render @@ -2058,25 +2065,27 @@ public class FormInstanceRelationshipElement : FormInstanceSubmodelElement { public FormInstanceRelationshipElement( FormInstanceListOfSame parentInstance, FormDescRelationshipElement parentDesc, - AdminShell.SubmodelElement source = null, bool deepCopy = false) + Aas.ISubmodelElement source = null, bool deepCopy = false) { // way back to description this.parentInstance = parentInstance; this.desc = parentDesc; // initialize Referable - var re = new AdminShell.RelationshipElement(); + var re = new Aas.RelationshipElement(null, null); this.sme = re; InitReferable(parentDesc, source); // check, if a source is present this.sourceSme = source; - var reSource = this.sourceSme as AdminShell.RelationshipElement; + var reSource = this.sourceSme as Aas.RelationshipElement; if (reSource != null) { // take over - re.first = new AdminShell.Reference(reSource.first); - re.second = new AdminShell.Reference(reSource.second); + if (reSource.First != null) + re.First = reSource.First.Copy(); + if (reSource.Second != null) + re.Second = reSource.Second.Copy(); } // create user control @@ -2100,12 +2109,14 @@ public override bool ProcessSmeForRender( // refer to base (SME) function, but not caring about result base.ProcessSmeForRender(packageEnv, addFilesToPackage, editSource); - var re = this.sme as AdminShell.RelationshipElement; - var reSource = this.sourceSme as AdminShell.RelationshipElement; + var re = this.sme as Aas.RelationshipElement; + var reSource = this.sourceSme as Aas.RelationshipElement; if (re != null && Touched && reSource != null && editSource) { - reSource.first = new AdminShell.Reference(re.first); - reSource.second = new AdminShell.Reference(re.second); + if (re.First != null) + reSource.First = re.First.Copy(); + if (re.Second != null) + reSource.Second = re.Second.Copy(); return false; } return true; @@ -2118,7 +2129,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u PluginOperationContextBase opctx) { // access - var rele = sme as AdminShell.RelationshipElement; + var rele = sme as Aas.RelationshipElement; if (rele == null) return; @@ -2138,10 +2149,10 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u for (int i = 0; i < 2; i++) { // selektor - var valGet = (i == 0) ? rele.first : rele.second; - Action valSet = (rf) => rele.first = rf; + var valGet = (i == 0) ? rele.First : rele.Second; + Action valSet = (rf) => rele.First = rf; if (i == 1) - valSet = (rf) => rele.second = rf; + valSet = (rf) => rele.Second = rf; var name = (new[] { "first", "second" })[i]; var row = 3 * i; @@ -2157,7 +2168,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u if (valGet != null) info = "(no Keys)"; if (valGet?.Keys != null && valGet.Keys.Count > 0) - info = valGet.ToString(format: 1, delimiter: Environment.NewLine); + info = valGet.ToStringExtended(delimiter: System.Environment.NewLine); // Use a drop box as info; but now allow drop uitk.AddSmallDropBoxTo( @@ -2190,7 +2201,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u tempI.PushAndAdaptEventFromTop( new AasxIntegrationBase.AasxPluginResultEventSelectAasEntity() { - filterEntities = AdminShell.Key.AllElements, + filterEntities = "All", showAuxPackage = true, showRepoFiles = true }, @@ -2200,7 +2211,7 @@ public override void RenderAnyUi(AnyUiStackPanel view, AnyUiSmallWidgetToolkit u && rsel.resultKeys != null) { // do it - valSet(AdminShell.Reference.CreateNew(rsel.resultKeys)); + valSet(ExtendReference.CreateNew(rsel.resultKeys)); Touch(); // send event to re-render @@ -2219,20 +2230,20 @@ public class FormInstanceCapability : FormInstanceSubmodelElement { public FormInstanceCapability( FormInstanceListOfSame parentInstance, FormDescCapability parentDesc, - AdminShell.SubmodelElement source = null, bool deepCopy = false) + Aas.ISubmodelElement source = null, bool deepCopy = false) { // way back to description this.parentInstance = parentInstance; this.desc = parentDesc; // initialize Referable - var re = new AdminShell.Capability(); + var re = new Aas.Capability(); this.sme = re; InitReferable(parentDesc, source); // check, if a source is present this.sourceSme = source; - var reSource = this.sourceSme as AdminShell.Capability; + var reSource = this.sourceSme as Aas.Capability; if (reSource != null) { // take over @@ -2260,12 +2271,14 @@ public override bool ProcessSmeForRender( // refer to base (SME) function, but not caring about result base.ProcessSmeForRender(packageEnv, addFilesToPackage, editSource); - var re = this.sme as AdminShell.RelationshipElement; - var reSource = this.sourceSme as AdminShell.RelationshipElement; + var re = this.sme as Aas.RelationshipElement; + var reSource = this.sourceSme as Aas.RelationshipElement; if (re != null && Touched && reSource != null && editSource) { - reSource.first = new AdminShell.Reference(re.first); - reSource.second = new AdminShell.Reference(re.second); + if (re.First != null) + reSource.First = re.First.Copy(); + if (re.Second != null) + reSource.Second = re.Second.Copy(); return false; } return true; diff --git a/src/AasxIntegrationBase/AasxCompatibilityModels/AasForms/FormDescriptionV20.cs b/src/AasxIntegrationBase/AasxCompatibilityModels/AasForms/FormDescriptionV20.cs new file mode 100644 index 000000000..5b8a41834 --- /dev/null +++ b/src/AasxIntegrationBase/AasxCompatibilityModels/AasForms/FormDescriptionV20.cs @@ -0,0 +1,237 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using AasxIntegrationBase; +using Newtonsoft.Json; + +// ReSharper disable All .. as this is legacy code! + +#if !DoNotUseAasxCompatibilityModels + +namespace AasxCompatibilityModels.AasxIntegrationBase.AasForms +{ + /// + /// Possible multiplicities for form description elements. This says, how many of a e.g. + /// Property with _same__ SemanticId shall be placed in a collection. + /// Outside the FormDescription class only for shorter names. + /// + public enum FormMultiplicity { ZeroToOne = 0, One, ZeroToMany, OneToMany }; + + public static class AasFormConstants + { + public static string[] FormMultiplicityAsUmlCardinality = new string[] { "0..1", "1", "0..*", "1..*" }; + } + + [DisplayName("FormBase")] + public class FormDescBaseV20 + { + } + + /// + /// Aim: provide a (abstract) communality for Submodel und SubmodelElement. + /// Host FormTitle, Info, Presets and Semantic Id + /// + [DisplayName("FormSubmodelReferable")] + public class FormDescReferableV20 : FormDescBaseV20 + { + /// + /// Displayed as label in front/ on top of the SubmodelElement + /// + [JsonProperty(Order = 1)] + public string FormTitle = ""; + + /// + /// Displayed on demand / very small. Might contain a longer text. + /// + [JsonProperty(Order = 2)] + public string FormInfo = null; + + /// + /// True, if the user shall be able to edit the idShort of the Referable + /// + [JsonProperty(Order = 3)] + public bool FormEditIdShort = false; + + /// + /// True, if the user shall be able to edit the description of the Referable + /// + [JsonProperty(Order = 4)] + public bool FormEditDescription = false; + + /// + /// Indicated by a small (i) symbol allows to jump to web-browser showing the URL (inluding fragment). + /// + public string FormUrl = null; + + /// + /// Preset for Referable.idShort. Always required. "{0}" will be replaced by instance number + /// + [JsonProperty(Order = 5)] + public string PresetIdShort = "SME{0:000}"; + + /// + /// Preset for Referable.category. Always required + /// + [JsonProperty(Order = 6)] + public string PresetCategory = "CONSTANT"; + + /// + /// Preset for Referable.description + /// + [JsonProperty(Order = 7)] + public AdminShellV20.Description PresetDescription = null; + + /// + /// SemanticId of the SubmodelElement. Always required. + /// + [JsonProperty(Order = 8)] + public AdminShellV20.Key KeySemanticId = new AdminShellV20.Key(); + + } + + /// + /// An specialization of FormDescListOfElement. Defines a total Submodel to be represented by the form, + /// that is, + /// no outer structures tha form instances will be in the Submodel. The Plugin's will match to + /// the SemanticId of the + /// Submodel, therefore it has to be present. + /// + [DisplayName("FormSubmodel")] + public class FormDescSubmodelV20 : FormDescReferableV20 + { + [JsonProperty(Order = 800)] + public FormDescListOfElementV20 SubmodelElements = null; + + } + + + /// + /// An extension of List(FormDescSubmodelElement), in order to unify the lists of Root and SMC + /// + [DisplayName("FormListOfElement")] + public class FormDescListOfElementV20 : List + { + } + + [DisplayName("FormSubmodelElement")] + public class FormDescSubmodelElementV20 : FormDescReferableV20 + { + /// + /// In the containing collection, how often shall the SubmodelElement might occur? + /// + [JsonProperty(Order = 10)] + [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public FormMultiplicity Multiplicity = FormMultiplicity.One; + + /// + /// If set to true, the property is displayed but not editable by the user. + /// + [JsonProperty(Order = 11)] + public bool IsReadOnly = false; + + /// + /// If not null, this SME will subscribe to events from a "master" SME which is identifed + /// by an IdShort starting with this string. + /// + public string SlaveOfIdShort = null; + + } + + [DisplayName("FormSubmodelElementCollection")] + public class FormDescSubmodelElementCollectionV20 : FormDescSubmodelElementV20 + { + /// + /// Describes possible members of the SMEC. + /// + [JsonProperty(Order = 800)] + public FormDescListOfElementV20 value = new FormDescListOfElementV20(); + + } + + [DisplayName("FormProperty")] + public class FormDescPropertyV20 : FormDescSubmodelElementV20 + { + /// + /// Pre-set the Property with this valueType. Right now, only one item (and this shall be "string") is allowed! + /// + [JsonProperty(Order = 20)] + public string[] allowedValueTypes = new string[] { "string" }; + + /// + /// Pre-set the editable Property value with this value. + /// + [JsonProperty(Order = 21)] + public string presetValue = ""; + + /// + /// Allows to define combox box items for the value. + /// + [JsonProperty(Order = 22)] + public string[] comboBoxChoices = null; + + /// + /// If not null, take the combox box index and map into to the given field of values. + /// To be used in combination with comboBoxChoices[]. + /// If null, then use the comboBoxChoices[] to set the value, which is also editable. + /// + [JsonProperty(Order = 23)] + public string[] valueFromComboBoxIndex = null; + + /// + /// If not null, contains a dictionary mapping possible master values (that is: strings) + /// into this SME's values. + /// + [JsonProperty(Order = 23)] + public Dictionary valueFromMasterValue = null; + + } + + [DisplayName("FormMultiLangProp")] + public class FormDescMultiLangPropV20 : FormDescSubmodelElementV20 + { + public static string[] DefaultLanguages = new string[] { "de", "en", "fr", "es", "it", "cn", "kr" }; + + public FormDescMultiLangPropV20() { } + + } + + [DisplayName("FormFile")] + public class FormDescFileV20 : FormDescSubmodelElementV20 + { + /// + /// pre-set the editable MimeType value with this value. + /// + [JsonProperty(Order = 20)] + public string presetMimeType = ""; + + public FormDescFileV20() { } + + } + + [DisplayName("FormReferenceElement")] + public class FormDescReferenceElementV20 : FormDescSubmodelElementV20 + { + /// + /// pre-set a filter for allowed SubmodelElement types. + /// + [JsonProperty(Order = 20)] + public string presetFilter = ""; + + public FormDescReferenceElementV20() { } + } + +} + +#endif \ No newline at end of file diff --git a/src/AasxIntegrationBase/AasxCompatibilityModels/AasxPluginOptionsBaseV20.cs b/src/AasxIntegrationBase/AasxCompatibilityModels/AasxPluginOptionsBaseV20.cs new file mode 100644 index 000000000..c735d58f6 --- /dev/null +++ b/src/AasxIntegrationBase/AasxCompatibilityModels/AasxPluginOptionsBaseV20.cs @@ -0,0 +1,66 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +// ReSharper disable ClassNeverInstantiated.Global +// ReSharper disable UnassignedField.Global + +#if !DoNotUseAasxCompatibilityModels + +namespace AasxCompatibilityModels.AasxIntegrationBase +{ + /// + /// Base class for an options record. This is a piece of options information, which is + /// associated with an id of a Submodel template. + /// + public class AasxPluginOptionsRecordBaseV20 + { + } + + /// + /// Base class of plugin options, which may be also load from file. + /// + public class AasxPluginOptionsBaseV20 + { + } + + // + // Extension: options (records) with lookup of semantic ids + // + + /// + /// Base class for an options record. This is a piece of options information, which is + /// associated with an id of a Submodel template. + /// This base class is extended for lookup information. + /// + public class AasxPluginOptionsLookupRecordBaseV20 : AasxPluginOptionsRecordBaseV20 + { + /// + /// This keyword is used by the plugin options to code allowed semantic ids for + /// a Submodel sensitive plugin + /// + public List AllowSubmodelSemanticId = new List(); + } + + /// + /// Base class of plugin options, which may be also load from file. + /// This base class is extended for lookup information. + /// + public class AasxPluginLookupOptionsBaseV20 : AasxPluginOptionsBaseV20 + { + } +} + +#endif \ No newline at end of file diff --git a/src/AasxIntegrationBase/AasxIntegrationBase.csproj b/src/AasxIntegrationBase/AasxIntegrationBase.csproj index 9fc20631f..4b13e2c72 100644 --- a/src/AasxIntegrationBase/AasxIntegrationBase.csproj +++ b/src/AasxIntegrationBase/AasxIntegrationBase.csproj @@ -1,14 +1,15 @@  - netstandard2.0 + net6.0 library false + false - + diff --git a/src/AasxIntegrationBase/AasxLanguageHelper.cs b/src/AasxIntegrationBase/AasxLanguageHelper.cs index 75c2c6564..50d4b1b0b 100644 --- a/src/AasxIntegrationBase/AasxLanguageHelper.cs +++ b/src/AasxIntegrationBase/AasxLanguageHelper.cs @@ -17,10 +17,10 @@ namespace AasxIntegrationBase { public static class AasxLanguageHelper { - public enum LangEnum { Any = 0, EN, DE, ZH, JP, KR, FR, ES }; + public enum LangEnum { Any = 0, EN, DE, ZH, JA, KO, FR, ES }; public static string[] LangEnumToISO639String = { - "All", "en", "de", "zh", "jp", "kr", "fr", "es" }; // ISO 639 -> List of languages + "All", "en", "de", "zh", "ja", "ko", "fr", "es" }; // ISO 639 -> List of languages public static string[] LangEnumToISO3166String = { "All", "GB", "DE", "CN", "JP", "KR", "FR", "ES" }; // ISO 3166 -> List of countries diff --git a/src/AasxIntegrationBase/AasxMenu.cs b/src/AasxIntegrationBase/AasxMenu.cs new file mode 100644 index 000000000..2e67016a5 --- /dev/null +++ b/src/AasxIntegrationBase/AasxMenu.cs @@ -0,0 +1,923 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using AnyUi; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; +using Aas = AasCore.Aas3_0_RC02; +using AdminShellNS; +using Extensions; + +namespace AasxIntegrationBase +{ + /// + /// AASX menu items might be available in multiple applications. + /// + public enum AasxMenuFilter + { + None = 0x00, + Wpf = 0x01, Blazor = 0x02, Toolkit = 0x04, + WpfBlazor = 0x03, + All = 0x07, + NotBlazor = 0x05 + } + + /// + /// Special information requirement to an AASX menu item + /// + public enum AasxMenuArgReqInfo + { + None = 0x00, + AAS = 0x01, + Submodel = 0x02, + SubmodelRef = 0x04, + SME = 0x08, + SmSmrSme = 0x02 | 0x04 | 0x08 + }; + + /// + /// AASX menu items will link to functionality, which requires + /// a set of arguments to executed (automatically). This class + /// describes the requirements for a particular argument. + /// + public class AasxMenuArgDef + { + /// + /// Name of the argument. Might be used in script language and + /// command line. PascalCasing is recommended. + /// + public string Name = ""; + + /// + /// Helping text for the argument. Might be displayed on the + /// command line. + /// + public string Help = ""; + + /// + /// If true, not shown in user views. + /// + public bool Hidden = false; + } + + /// + /// This attribute indicates, that the field / property can be passed by an argument + /// of an AASX menu item ticket / command. + /// + [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] + public class AasxMenuArgument : System.Attribute + { + /// + /// If set, name to be used + /// + public string Name = ""; + + /// + /// Help text for parsing command arguments + /// + public string Help = ""; + + /// + /// If set, header (key) in a UI dialogue. + /// + public string UiHeader = null; + + /// + /// If true, add help texts in a additional column + /// + public bool UiShowHelp = false; + + /// + /// If true, will group edit field and help directly after each other + /// + public bool UiGroupHelp = false; + + /// + /// If not null, will restrict the minimum length of the edit field. + /// Automatically disable "stretch" behavior of the field. + /// + public int? UiMinWidth = null; + + /// + /// If not null, will restrict the maximum length of the edit field. + /// Automatically disable "stretch" behavior of the field. + /// + public int? UiMaxWidth = null; + + public AasxMenuArgument( + string name = "", string help = "", + string uiHeader = null, bool uiShowHelp = false, + bool uiGroupHelp = false, + int minWidth = -1, int maxWidth = -1) + { + Name = name; + Help = help; + UiHeader = uiHeader; + UiShowHelp = uiShowHelp; + UiGroupHelp = uiGroupHelp; + if (minWidth >= 0.0) + UiMinWidth = minWidth; + if (maxWidth >= 0.0) + UiMaxWidth = maxWidth; + } + } + + /// + /// List of such argument definitions. + /// For future extension. + /// + public class AasxMenuListOfArgDefs : List + { + public AasxMenuListOfArgDefs Add( + string name, string help, bool hidden = false) + { + this.Add(new AasxMenuArgDef() { Name = name, Help = help, Hidden = hidden }); + return this; + } + + public AasxMenuArgDef Find(string name) + { + return this + .FindAll((arg) => arg?.Name?.Trim().ToLower() == name?.Trim().ToLower()) + .FirstOrDefault(); + } + + public AasxMenuListOfArgDefs AddFromReflection(object o) + { + // access + if (o == null) + return this; + + // find fields for this object + var t = o.GetType(); + var l = t.GetFields(BindingFlags.Instance | BindingFlags.Public); + foreach (var f in l) + { + var a = f.GetCustomAttribute(); + if (a != null) + { + var name = f.Name; + if (!name.HasContent()) + name = t.Name; + this.Add(new AasxMenuArgDef() { Name = "" + name, Help = "" + a.Help }); + } + } + // OK + return this; + } + } + + /// + /// Holds arguments for a AASX menu item. + /// + public class AasxMenuArgDictionary : Dictionary + { + public bool PopulateObjectFromArgs(object o) + { + // access + if (o == null) + return false; + + // find fields for this object + var t = o.GetType(); + var l = t.GetFields(BindingFlags.Instance | BindingFlags.Public); + foreach (var f in l) + { + var a = f.GetCustomAttribute(); + if (a != null) + { + var name = f.Name; + if (!name.HasContent()) + name = t.Name; + + foreach (var ad in this) + if (ad.Key?.Name?.Trim().ToLower() == name.ToLower()) + { + AdminShellUtil.SetFieldLazyValue(f, o, ad.Value); + break; + } + } + } + + // OK + return true; + } + } + + /// + /// AASX menu items might call this action when activated. + /// + /// Name of menu item in lower case + public delegate void AasxMenuActionDelegate( + string nameLower, + AasxMenuItemBase item, + AasxMenuActionTicket ticket); + + /// + /// AASX menu items might call this action when activated. + /// + /// Name of menu item in lower case + public delegate Task AasxMenuActionAsyncDelegate( + string nameLower, + AasxMenuItemBase item, + AasxMenuActionTicket ticket); + + /// + /// Empty class to be overloaded in order to carry UI specific + /// display data, e.g. controls/ widgets. + /// + public class AasxMenuDisplayDataBase + { + } + + /// + /// Base class for menu items with a possible action. + /// + public abstract class AasxMenuItemBase + { + /// + /// Name of the menu item. Relevant. Will be used to differentiate + /// in actions. + /// + public string Name = ""; + + /// + /// UI specific display data, e.g. controls/ widgets. + /// + public AasxMenuDisplayDataBase DisplayData; + + /// + /// For which application is this menu item applicable. + /// + public AasxMenuFilter Filter = AasxMenuFilter.All; + + /// + /// List of argument definitions + /// + public AasxMenuListOfArgDefs ArgDefs = null; + + /// + /// List of required informations to be available, but + /// not provided by used-provided arguments. + /// + public AasxMenuArgReqInfo RequiredInfos; + + /// + /// The action to be activated. + /// + public AasxMenuActionDelegate Action = null; + + /// + /// The action to be activated. + /// + public AasxMenuActionAsyncDelegate ActionAsync = null; + + /// + /// If not null will cause to invoke the action "call-menu-item" for + /// the named plugin. + /// + public string PluginToAction = null; + + // + // Convenience + // + + public AasxMenuItemBase Set( + Nullable reqs = null, + AasxMenuListOfArgDefs args = null) + { + if (reqs != null) + this.RequiredInfos = reqs.Value; + if (args != null) + this.ArgDefs = args; + return this; + } + + public override string ToString() + { + return Name; + } + } + + /// + /// Menu item equipped with a possible hotkey + /// + public abstract class AasxMenuItemHotkeyed : AasxMenuItemBase + { + /// + /// Contains the gesture in form of "Ctrl+Shift+F" stuff. + /// see: https://learn.microsoft.com/en-us/dotnet/api/system.windows.input.keygesture + /// + public string InputGesture; + + /// + /// Displays gesture, but not auto-create a hotkey for it + /// + public bool GestureOnlyDisplay = false; + } + + /// + /// By this information, menu items for AASX Package Explorer, Blazor and Toolkit + /// shall be described. Goal is to build up menu systems dynamically. + /// Shall be also usable for plugins. + /// + public class AasxMenuItem : AasxMenuItemHotkeyed + { + /// + /// Displayed header in GUI based applications. + /// + public string Header = ""; + + /// + /// Foreground color of the menu item. + /// + public AnyUiColor Foreground = null; + + /// + /// Icon to be place aside the header in GUI based applications. + /// Might contain unicode symbil, text or bitmap. + /// + public object Icon = null; + + /// + /// If true, not shown in menu. + /// + public bool Hidden = false; + + /// + /// Can be switched to checked or not + /// + public bool IsCheckable = false; + + /// + /// Switch state to initailize with. + /// + public bool IsChecked = false; + + /// + /// Command name in command line based applications. Typically lower case with + /// dashes in between. No dask at front. + /// + public string CmdLine = null; + + /// + /// Help text or description in command line applications. + /// + public string HelpText = null; + + /// + /// Sub menues + /// + public AasxMenu Childs = null; + + /// + /// Declares this menu as a named attach point, to which dynamic items, e.g. provided + /// by plugins, can be attached to. + /// + public string AttachPoint = null; + + // + // more + // + + public void Add(AasxMenuItemBase item) + { + Childs.Add(item); + } + } + + + /// + /// Represents a single hotkey which is not a visible menu item + /// + public class AasxHotkey : AasxMenuItemHotkeyed + { + } + + /// + /// Holds a list of menu items, e.g. representing the main menu. + /// + public class AasxMenu : List + { + // + // Members + // + + /// + /// The action to be activated, if no action is set by single items. + /// + public AasxMenuActionDelegate DefaultAction = null; + + /// + /// The action to be activated, if no action is set by single items. + /// + public AasxMenuActionAsyncDelegate DefaultActionAsync = null; + + /// + /// Default foreground color, if not overruled by items. + /// + public AnyUiColor DefaultForeground = null; + + // + // Creators (here, because class name is shorter) + // + + public AasxMenu AddWpf( + string name, string header, + string help = null, + AasxMenuActionDelegate action = null, + AasxMenuActionAsyncDelegate actionAsync = null, + AasxMenuFilter filter = AasxMenuFilter.Wpf, + string inputGesture = null, + bool onlyDisplay = false, + bool isCheckable = false, bool isChecked = false, + bool isHidden = false, + AasxMenuArgReqInfo reqs = AasxMenuArgReqInfo.None, + AasxMenuListOfArgDefs args = null) + { + this.Add(new AasxMenuItem() + { + Name = name, + Header = header, + HelpText = help, + Action = action, + ActionAsync = actionAsync, + Filter = filter, + InputGesture = inputGesture, + GestureOnlyDisplay = onlyDisplay, + IsCheckable = isCheckable, + IsChecked = isChecked, + Hidden = isHidden, + RequiredInfos = reqs, + ArgDefs = args + }); + return this; + } + + public AasxMenu AddWpfBlazor( + string name, string header, + string help = null, + AasxMenuActionDelegate action = null, + AasxMenuActionAsyncDelegate actionAsync = null, + AasxMenuFilter filter = AasxMenuFilter.WpfBlazor, + string inputGesture = null, + bool onlyDisplay = false, + bool isCheckable = false, bool isChecked = false, + AasxMenuArgReqInfo reqs = AasxMenuArgReqInfo.None, + AasxMenuListOfArgDefs args = null) + { + this.Add(new AasxMenuItem() + { + Name = name, + Header = header, + HelpText = help, + Action = action, + ActionAsync = actionAsync, + Filter = filter, + InputGesture = inputGesture, + GestureOnlyDisplay = onlyDisplay, + IsCheckable = isCheckable, + IsChecked = isChecked, + RequiredInfos = reqs, + ArgDefs = args + }); + return this; + } + + public AasxMenu AddAll( + string name, string header, + string cmd, string help, + AasxMenuActionDelegate action = null, + AasxMenuActionAsyncDelegate actionAsync = null, + AasxMenuFilter filter = AasxMenuFilter.All, + string inputGesture = null, + bool onlyDisplay = false) + { + this.Add(new AasxMenuItem() + { + Name = name, + Header = header, + CmdLine = cmd, + HelpText = header, + Action = action, + ActionAsync = actionAsync, + Filter = filter, + InputGesture = inputGesture, + GestureOnlyDisplay = onlyDisplay, + }); + return this; + } + + public AasxMenu AddAction( + string name, string header, + string help = null, + object icon = null, + AasxMenuActionDelegate action = null, + AasxMenuActionAsyncDelegate actionAsync = null, + AasxMenuFilter filter = AasxMenuFilter.Wpf, + string inputGesture = null, + AasxMenuArgReqInfo reqs = AasxMenuArgReqInfo.None, + AasxMenuListOfArgDefs args = null, + bool? isChecked = null) + { + var mi = new AasxMenuItem() + { + Name = name, + Header = header, + HelpText = help, + Icon = icon, + Action = action, + ActionAsync = actionAsync, + Filter = filter, + InputGesture = inputGesture, + RequiredInfos = reqs, + ArgDefs = args + }; + if (isChecked.HasValue) + mi.IsChecked = isChecked.Value; + this.Add(mi); + return this; + } + + public AasxMenu AddSeparator(AasxMenuFilter filter = AasxMenuFilter.WpfBlazor) + { + this.Add(new AasxMenuSeparator() + { + Filter = filter + }); + return this; + } + + public AasxMenu AddMenu( + string header, + AasxMenuFilter filter = AasxMenuFilter.WpfBlazor, + AasxMenu childs = null, + string attachPoint = null) + { + this.Add(new AasxMenuItem() + { + Header = header, + Filter = filter, + Childs = childs, + AttachPoint = attachPoint + }); + return this; + } + + public AasxMenu AddHotkey( + string name, + string gesture, + string header = null) + { + this.Add(new AasxHotkey() + { + Name = name, + InputGesture = gesture + }); + return this; + } + + public AasxMenu AddTextBox( + string name, object icon, string header, + double headerWidth, string textValue, double textWidth) + { + this.Add(new AasxMenuTextBox() + { + Name = name, + Icon = icon, + Header = header, + HeaderWidth = headerWidth, + TextValue = textValue, + TextWidth = textWidth + }); + return this; + } + + public AasxMenu AddLambda( + AasxMenuActionDelegate defaultAction = null, + AasxMenuActionAsyncDelegate defaultActionAsync = null) + { + DefaultAction ??= defaultAction; + DefaultActionAsync ??= defaultActionAsync; + return this; + } + + // + // Operate + // + + public async Task ActivateAction(AasxMenuItemBase mi, AasxMenuActionTicket ticket) + { + var name = mi?.Name?.Trim()?.ToLower(); + + if (mi?.ActionAsync != null) + await mi.ActionAsync(name, mi, ticket); + else if (mi?.Action != null) + mi.Action(name, mi, ticket); + else if (this.DefaultActionAsync != null) + await this.DefaultActionAsync(name, mi, ticket); + else if (this.DefaultAction != null) + this.DefaultAction(name, mi, ticket); + } + + // + // Child management + // + + public IEnumerable FindAll(Func pred = null) + { + foreach (var ch in this) + { + if (pred == null || pred(ch)) + yield return ch; + if (ch is AasxMenuItem chmi && chmi.Childs != null) + foreach (var x in chmi.Childs.FindAll(pred)) + yield return x; + } + } + + public IEnumerable FindAll(Func pred = null) + where T : AasxMenuItemBase + { + // test itself + if (this is T chi && (pred == null || pred(chi))) + yield return chi; + + foreach (var ch in this) + { + if (ch is T cht && (pred == null || pred(cht))) + yield return cht; + if (ch is AasxMenuItem chmi && chmi.Childs != null) + foreach (var x in chmi.Childs.FindAll(pred)) + if (x is T xt) + yield return xt; + } + } + + public AasxMenuItemBase FindName(string name) + { + return FindAll((i) => i?.Name?.Trim().ToLower() == name?.Trim().ToLower()) + .FirstOrDefault(); + } + + // + // Special functions + // + + public class JavaScriptHotkey + { + public string ItemName { get; set; } + public string Key { get; set; } + public bool IsShift { get; set; } + public bool IsCtrl { get; set; } + public bool IsAlt { get; set; } + } + + public IList PrepareJavaScriptHotkeys() + { + var res = new List(); + foreach (var mihk in FindAll()) + { + // any at all? + if (mihk.InputGesture?.HasContent() != true || mihk.GestureOnlyDisplay) + continue; + + var jshk = new JavaScriptHotkey() { ItemName = mihk.Name }; + var found = false; + + // let '+' lead us + var parts = mihk.InputGesture.Split('+', StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < parts.Length; i++) + { + var part = "" + parts[i].Trim(); + if (!part.HasContent()) + continue; + if (part.Equals("Shift", StringComparison.InvariantCultureIgnoreCase)) + jshk.IsShift = true; + else + if (part.Equals("Ctrl", StringComparison.InvariantCultureIgnoreCase)) + jshk.IsCtrl = true; + else + if (part.Equals("Alt", StringComparison.InvariantCultureIgnoreCase)) + jshk.IsAlt = true; + else + if (i == (parts.Length - 1)) + { + jshk.Key = part; + found = true; + } + } + + // ok? + if (found) + res.Add(jshk); + } + return res; + } + } + + /// + /// To be used for separators + /// + public class AasxMenuSeparator : AasxMenuItemBase + { + } + + /// + /// Carries additional information to allow rendering + /// of UI specific menu items having a text box inside. + /// + public class AasxMenuTextBox : AasxMenuItem + { + /// + /// Must be given. Width of the header, before the text box starts. + /// + public double HeaderWidth = 100.0; + + /// + /// Value of the edited text string. + /// + public string TextValue; + + /// + /// Must be given. Width of the text box, after the header. + /// + public double TextWidth = 100.0; + } + + /// + /// This class holds a runtime item which is used to invoke a certain action, + /// transfer parameter assignments and give back action recults. + /// + public class AasxMenuActionTicket + { + /// + /// The reuqested AASX menu item + /// + public AasxMenuItemBase MenuItem; + + /// + /// If set, will not show interactive dialogues but will try to + /// execute with as much information given as possible. + /// + public bool ScriptMode = false; + + /// + /// This dictionary links to the single arg definitions of the menu item + /// and assign values to it. The invoked action needs to check for value + /// types. + /// + public AasxMenuArgDictionary ArgValue = null; + + /// + /// Indicates that some functionality started the execution. + /// + public bool Started = false; + + /// + /// Indicates a success or the availablity of an result. + /// + public bool Success = false; + + /// + /// If not null indicates the presence of an exception while executing + /// the action. Should correspond to Result == null. + /// + public string Exception = null; + + /// + /// If true, then script will sleep after leaving the UI STA thread. + /// 1 means short, 2 means long. + /// + public int SleepForVisual = 0; + + /// + /// If the ticket is executed, then executing action can return a + /// UI lambda action to update the screen. + /// + public AnyUiLambdaActionBase UiLambdaAction = null; + + // + // Runtime data + // + + /// + /// Pair of main data and dereferenced main data view. + /// + public object MainDataObject = null; + + /// + /// Pair of main data and dereferenced main data view. + /// + public object DereferencedMainDataObject = null; + + /// + /// Filled by the currently selected element. + /// + public AdminShellPackageEnv Package; + + /// + /// Filled by the currently selected element. + /// + public Aas.Environment Env; + + /// + /// Filled by the currently selected element. + /// + public Aas.AssetAdministrationShell AAS; + + /// + /// Filled by the currently selected element. + /// + public Aas.AssetInformation AssetInfo; + + /// + /// Filled by the currently selected element. + /// + public Aas.Submodel Submodel; + + /// + /// Filled by the currently selected element. + /// + public Aas.Reference SubmodelRef; + + /// + /// Filled by the currently selected element. + /// + public Aas.ISubmodelElement SubmodelElement; + + /// + /// Gives the calling function the possibility to better handle messages + /// to/ from the user. + /// + public AnyUiMinimalInvokeMessageDelegate InvokeMessage = null; + + /// + /// In special cases, the ticket execution does require a post-process. + /// + public Dictionary PostResults = null; + + // + // Convenience + // + + public object this[string name] + { + get + { + if (ArgValue != null) + foreach (var av in ArgValue) + if (av.Key?.Name?.Trim().ToLower() == name?.Trim().ToLower()) + return av.Value; + return null; + } + set + { + if (ArgValue != null) + foreach (var av in ArgValue) + if (av.Key?.Name?.Trim().ToLower() == name?.Trim().ToLower()) + { + ArgValue[av.Key] = value; + return; + } + + // find in ArgDefs + AasxMenuArgDef foundAd = null; + if (MenuItem?.ArgDefs != null) + foreach (var ad in MenuItem?.ArgDefs) + if (ad.Name?.Trim().ToLower() == name?.Trim().ToLower()) + foundAd = ad; + if (foundAd == null) + return; + + // no, add + if (ArgValue == null) + ArgValue = new AasxMenuArgDictionary(); + ArgValue[foundAd] = value; + } + } + + /// + /// Starts execution. For the time being, set Result = true. + /// + public void StartExec() + { + Started = true; + Success = true; + } + } + +} diff --git a/src/AasxIntegrationBase/AasxPluginHelper.cs b/src/AasxIntegrationBase/AasxPluginHelper.cs index 49251bb80..ef9512b81 100644 --- a/src/AasxIntegrationBase/AasxPluginHelper.cs +++ b/src/AasxIntegrationBase/AasxPluginHelper.cs @@ -7,13 +7,8 @@ This source code is licensed under the Apache License 2.0 (see LICENSE.txt). This source code may use other Open Source software components (see LICENSE.txt). */ -using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Reflection; -using System.Text; -using System.Threading.Tasks; // ReSharper disable ClassNeverInstantiated.Global diff --git a/src/AasxIntegrationBase/AasxPluginInterface.cs b/src/AasxIntegrationBase/AasxPluginInterface.cs index cd632eee1..35d185237 100644 --- a/src/AasxIntegrationBase/AasxPluginInterface.cs +++ b/src/AasxIntegrationBase/AasxPluginInterface.cs @@ -9,15 +9,12 @@ This source code may use other Open Source software components (see LICENSE.txt) using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AdminShellNS; +using Aas = AasCore.Aas3_0_RC02; using AnyUi; +using System.Threading.Tasks; // ReSharper disable ClassNeverInstantiated.Global - namespace AasxIntegrationBase { public class AasxPluginActionDescriptionBase @@ -25,14 +22,20 @@ public class AasxPluginActionDescriptionBase public string name = ""; public string info = ""; + /// + /// If true will use ActivateActionAsync to call the plugin in async mode. + /// + public bool UseAsync = false; + public AasxPluginActionDescriptionBase() { } - public AasxPluginActionDescriptionBase(string name, string info) + public AasxPluginActionDescriptionBase(string name, string info, bool useAsync = false) { this.name = name; this.info = info; + UseAsync = useAsync; } } @@ -55,8 +58,29 @@ public AasxPluginResultBaseObject(string strType, object obj) public class AasxPluginResultGenerateSubmodel : AasxPluginResultBase { - public AdminShell.Submodel sm; - public AdminShell.ListOfConceptDescriptions cds; + public Aas.Submodel sm; + public List cds; + } + + public class AasxPluginResultSingleMenuItem + { + /// + /// Identifies, where in the hierarchy of the application's main menu + /// this new menu item shall be attached to. Designates a named + /// AasxMenu. + /// + public string AttachPoint; + + /// + /// The new menu item including name, header, may be hotkey and + /// argument description. + /// + public AasxMenuItem MenuItem; + } + + public class AasxPluginResultProvideMenuItems : AasxPluginResultBase + { + public List MenuItems; } public interface IPushApplicationEvent @@ -72,7 +96,7 @@ public class AasxPluginResultEventBase : AasxPluginResultBase public class AasxPluginResultEventNavigateToReference : AasxPluginResultEventBase { - public AdminShell.Reference targetReference = null; + public Aas.Reference targetReference = null; } public class AasxPluginResultEventDisplayContentFile : AasxPluginResultEventBase @@ -80,6 +104,9 @@ public class AasxPluginResultEventDisplayContentFile : AasxPluginResultEventBase public string fn = null; public string mimeType = null; public bool preferInternalDisplay = false; + + public bool SaveInsteadDisplay = false; + public string ProposeFn = null; } public class AasxPluginResultEventRedrawAllElements : AasxPluginResultEventBase @@ -118,7 +145,7 @@ public class AasxPluginEventReturnBase public class AasxPluginEventReturnSelectAasEntity : AasxPluginEventReturnBase { - public AdminShell.KeyList resultKeys = null; + public List resultKeys = null; } public class AasxPluginEventReturnSelectFile : AasxPluginEventReturnBase @@ -219,6 +246,15 @@ public interface IAasxPluginInterface /// Array of arguments. Will be checked and type-casted by the plugin /// Any result to be derived from AasxPluginResultBase AasxPluginResultBase ActivateAction(string action, params object[] args); + + /// + /// Activate a specific action. Async variant. + /// Note: for some reason of type conversion, it has to return Task. + /// + /// Name of the action as describe in AasxPluginActionDescriptionBase record + /// Array of arguments. Will be checked and type-casted by the plugin + /// Any result to be derived from AasxPluginResultBase + // Task ActivateActionAsync(string action, params object[] args); } /// @@ -268,7 +304,9 @@ public class AasxPluginBase : IAasxPluginInterface protected PluginEventStack _eventStack = new PluginEventStack(); protected PluginSessionCollection _sessions = new PluginSessionCollection(); - public static string PluginName = "(not initialized)"; + protected string _pluginName = "(not initialized)"; + + public string PluginName { get { return _pluginName; } set { _pluginName = value; } } public string GetPluginName() { @@ -285,6 +323,12 @@ public AasxPluginResultBase ActivateAction(string action, params object[] args) throw new NotImplementedException(); } + public async Task ActivateActionAsync(string action, params object[] args) + { + await Task.Yield(); + throw new NotImplementedException(); + } + public object CheckForLogMessage() { return _log?.PopLastShortTermPrint(); diff --git a/src/AasxIntegrationBase/AasxPluginOptionSerialization.cs b/src/AasxIntegrationBase/AasxPluginOptionSerialization.cs index 972b48617..01a571186 100644 --- a/src/AasxIntegrationBase/AasxPluginOptionSerialization.cs +++ b/src/AasxIntegrationBase/AasxPluginOptionSerialization.cs @@ -7,14 +7,11 @@ This source code is licensed under the Apache License 2.0 (see LICENSE.txt). This source code may use other Open Source software components (see LICENSE.txt). */ +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; namespace AasxIntegrationBase { @@ -63,11 +60,11 @@ public DisplayNameSerializationBinder(Type[] startingTypes) foreach (var startingType in startingTypes) { - var customDisplayNameTypes = - // this.GetType() + var customDisplayNameTypes = + // this.GetType() startingType - .Assembly - //concat with references if desired + .Assembly + //concat with references if desired .GetTypes() .Where(x => x .GetCustomAttributes(false) diff --git a/src/AasxIntegrationBase/AasxPluginOptionsBase.cs b/src/AasxIntegrationBase/AasxPluginOptionsBase.cs index 812fd45f4..c04627c6b 100644 --- a/src/AasxIntegrationBase/AasxPluginOptionsBase.cs +++ b/src/AasxIntegrationBase/AasxPluginOptionsBase.cs @@ -14,8 +14,12 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Reflection; using System.Text; using System.Threading.Tasks; +using AAS = AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; using AdminShellNS; +using Extensions; using Newtonsoft.Json; +using Aas = AasCore.Aas3_0_RC02; // ReSharper disable AssignNullToNotNullAttribute .. a bit unclear, why issues here @@ -27,6 +31,17 @@ namespace AasxIntegrationBase /// public class AasxPluginOptionsRecordBase { + // Constructors + + public AasxPluginOptionsRecordBase() { } + +#if !DoNotUseAasxCompatibilityModels + public AasxPluginOptionsRecordBase( + AasxCompatibilityModels.AasxIntegrationBase.AasxPluginOptionsRecordBaseV20 src) + { + } +#endif + } /// @@ -34,15 +49,84 @@ public class AasxPluginOptionsRecordBase /// public class AasxPluginOptionsBase { + /// + /// This string marks the "file-format" version of the options. + /// Typically, it is connected with major versions of the AAS meta model. + /// + public string Version = "AAS3.0"; + protected MultiValueDictionary _recordLookup = null; + public AasxPluginOptionsBase() : base() { } + +#if !DoNotUseAasxCompatibilityModels + public AasxPluginOptionsBase(AasxCompatibilityModels.AasxIntegrationBase.AasxPluginOptionsBaseV20 src) + { + } +#endif + public virtual void Merge(AasxPluginOptionsBase options) { } + protected static T LoadOptionsFromJson( + string json, string fnInfo, + JsonSerializerSettings settings = null, + LogInstance log = null, + UpgradeMapping[] upgrades = null) + where T : AasxPluginOptionsBase + { + // access + if (!json.HasContent()) + return null; + + T opts = null; + + // find an upgrade path? + UpgradeMapping um = null; + if (upgrades != null) + foreach (var u in upgrades) + if (u?.Trigger.HasContent() == true + && u.OldRootType != null + && u.UpgradeLambda != null + && json.Contains(u.Trigger)) + { + um = u; + break; + } + + // upgrade or straight forward + if (um != null) + { + log?.Append(new StoredPrint(StoredPrint.Color.Blue, + $"Detected an old version of options: {um.Info}. Upgrading from {fnInfo} ..")); + + if (um.Replacements != null) + foreach (var rkey in um.Replacements.Keys) + json = json.Replace(rkey, um.Replacements[rkey]); + var oldOpts = Newtonsoft.Json.JsonConvert.DeserializeObject(json, um.OldRootType, settings); + opts = um.UpgradeLambda.Invoke(oldOpts) as T; + + if (opts != null) + log?.Append(new StoredPrint(StoredPrint.Color.Blue, + $"Upgraded successfully! Consider saving options in new format.")); + } + else + { + // assume current version + log?.Info($"Try load options from {fnInfo} .."); + opts = Newtonsoft.Json.JsonConvert.DeserializeObject(json, settings); + } + + return opts; + } + public static T LoadDefaultOptionsFromAssemblyDir( string pluginName, Assembly assy = null, - JsonSerializerSettings settings = null) where T : AasxPluginOptionsBase + JsonSerializerSettings settings = null, + LogInstance log = null, + UpgradeMapping[] upgrades = null) + where T : AasxPluginOptionsBase { // expand assy? if (assy == null) @@ -55,21 +139,32 @@ public static T LoadDefaultOptionsFromAssemblyDir( System.IO.Path.GetDirectoryName(assy.Location), pluginName + ".options.json"); - if (File.Exists(optfn)) + if (System.IO.File.Exists(optfn)) { - var optText = File.ReadAllText(optfn); - - return Newtonsoft.Json.JsonConvert.DeserializeObject(optText, settings); + var json = System.IO.File.ReadAllText(optfn); + var opts = LoadOptionsFromJson(json, optfn, settings, log, upgrades); + return opts; } // no return null; } + public class UpgradeMapping + { + public string Info = ""; + public string Trigger; + public Type OldRootType; + public Dictionary Replacements; + public Func UpgradeLambda; + } + public void TryLoadAdditionalOptionsFromAssemblyDir( string pluginName, Assembly assy = null, JsonSerializerSettings settings = null, - LogInstance log = null) where T : AasxPluginOptionsBase + LogInstance log = null, + UpgradeMapping[] upgrades = null + ) where T : AasxPluginOptionsBase { // expand assy? if (assy == null) @@ -86,15 +181,78 @@ public void TryLoadAdditionalOptionsFromAssemblyDir( foreach (var fn in files) try { - var optText = File.ReadAllText(fn); - var opts = Newtonsoft.Json.JsonConvert.DeserializeObject(optText, settings); - this.Merge(opts); + var json = System.IO.File.ReadAllText(fn); + var opts = LoadOptionsFromJson(json, fn, settings, log, upgrades); + if (opts != null) + this.Merge(opts); } catch (Exception ex) { log?.Error(ex, $"loading additional options (${fn})"); } } + + //protected MultiValueDictionary _recordLookup = null; + + //public virtual void Merge(AasxPluginOptionsBase options) + //{ + //} + + //public static T LoadDefaultOptionsFromAssemblyDir( + // string pluginName, Assembly assy = null, + // JsonSerializerSettings settings = null) where T : AasxPluginOptionsBase + //{ + // // expand assy? + // if (assy == null) + // assy = Assembly.GetExecutingAssembly(); + // if (pluginName == null || pluginName == "") + // return null; + + // // build fn + // var optfn = System.IO.Path.Combine( + // System.IO.Path.GetDirectoryName(assy.Location), + // pluginName + ".options.json"); + + // if (System.IO.File.Exists(optfn)) + // { + // var optText = System.IO.File.ReadAllText(optfn); + + // return Newtonsoft.Json.JsonConvert.DeserializeObject(optText, settings); + // } + + // // no + // return null; + //} + + //public void TryLoadAdditionalOptionsFromAssemblyDir( + // string pluginName, Assembly assy = null, + // JsonSerializerSettings settings = null, + // LogInstance log = null) where T : AasxPluginOptionsBase + //{ + // // expand assy? + // if (assy == null) + // assy = Assembly.GetExecutingAssembly(); + // if (pluginName == null || pluginName == "") + // return; + + // // build dir name + // var baseDir = System.IO.Path.GetDirectoryName(assy.Location); + + // // search + // var files = Directory.GetFiles(baseDir, "*.add-options.json"); + + // foreach (var fn in files) + // try + // { + // var optText = System.IO.File.ReadAllText(fn); + // var opts = Newtonsoft.Json.JsonConvert.DeserializeObject(optText, settings); + // this.Merge(opts); + // } + // catch (Exception ex) + // { + // log?.Error(ex, $"loading additional options (${fn})"); + // } + //} } // @@ -112,7 +270,25 @@ public class AasxPluginOptionsLookupRecordBase : AasxPluginOptionsRecordBase /// This keyword is used by the plugin options to code allowed semantic ids for /// a Submodel sensitive plugin /// - public List AllowSubmodelSemanticId = new List(); + public List AllowSubmodelSemanticId = new List(); + + // Constructors + + public AasxPluginOptionsLookupRecordBase() : base() { } + +#if !DoNotUseAasxCompatibilityModels + public AasxPluginOptionsLookupRecordBase( + AasxCompatibilityModels.AasxIntegrationBase.AasxPluginOptionsLookupRecordBaseV20 src) + : base(src) + { + if (src.AllowSubmodelSemanticId != null) + foreach (var assi in src.AllowSubmodelSemanticId) + AllowSubmodelSemanticId.Add( + new AAS.Key(Aas.Stringification.KeyTypesFromString(assi?.type) + ?? Aas.KeyTypes.GlobalReference, assi.value)); + } +#endif + } /// @@ -121,17 +297,27 @@ public class AasxPluginOptionsLookupRecordBase : AasxPluginOptionsRecordBase /// public class AasxPluginLookupOptionsBase : AasxPluginOptionsBase { - private string GenerateIndexKey(AdminShell.Key key) + public AasxPluginLookupOptionsBase() : base() { } + +#if !DoNotUseAasxCompatibilityModels + public AasxPluginLookupOptionsBase( + AasxCompatibilityModels.AasxIntegrationBase.AasxPluginLookupOptionsBaseV20 src) + : base(src) + { + } +#endif + + + private string GenerateIndexKey(Aas.Key key) { if (key == null) return null; - // eliminate "local" - var k = new AdminShell.Key(key) { local = false }; - var ndx = k?.ToString(format: 1); + var k = new Aas.Key(key.Type, key.Value); + var ndx = k?.ToStringExtended(); return ndx; } - public void IndexRecord(AdminShell.Key key, AasxPluginOptionsRecordBase rec) + public void IndexRecord(Aas.Key key, AasxPluginOptionsRecordBase rec) { if (_recordLookup == null) _recordLookup = new MultiValueDictionary(); @@ -153,7 +339,7 @@ public void IndexListOfRecords(IEnumerable re IndexRecord(a2, rec); } - public bool ContainsIndexKey(AdminShell.Key key) + public bool ContainsIndexKey(Aas.Key key) { // access var ndx = GenerateIndexKey(key); @@ -163,7 +349,7 @@ public bool ContainsIndexKey(AdminShell.Key key) return _recordLookup.ContainsKey(ndx); } - public IEnumerable LookupAllIndexKey(AdminShell.Key key) + public IEnumerable LookupAllIndexKey(Aas.Key key) where T : AasxPluginOptionsRecordBase { // access diff --git a/src/AasxIntegrationBase/AasxSearchUtil.cs b/src/AasxIntegrationBase/AasxSearchUtil.cs new file mode 100644 index 000000000..b59138d8d --- /dev/null +++ b/src/AasxIntegrationBase/AasxSearchUtil.cs @@ -0,0 +1,844 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using AasxIntegrationBase; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Aas = AasCore.Aas3_0_RC02; +using AdminShellNS; +using Extensions; + +namespace AasxIntegrationBase +{ + /// + /// This call implements some functions to search entities in the AdminShell data structures. + /// + public static class AasxSearchUtil + { + public static void PrintSearchableProperties(object obj, int indent) + { + if (obj == null) return; + string indentString = new string(' ', indent); + Type objType = obj.GetType(); + PropertyInfo[] properties = objType.GetProperties(); + foreach (PropertyInfo property in properties) + { + object propValue = property.GetValue(obj, null); + var elems = propValue as IList; + if (elems != null) + { + foreach (var item in elems) + { + PrintSearchableProperties(item, indent + 3); + } + } + else + { + // This will not cut-off System.Collections because of the first check + if (property.PropertyType.Assembly == objType.Assembly) + { + Console.WriteLine("{0}{1}:", indentString, property.Name); + + PrintSearchableProperties(propValue, indent + 2); + } + else + { + Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue); + } + } + } + } + + public class SearchOptions + { + /// + /// Search might restrict assemblies to be searched in + /// + public Assembly[] AllowedAssemblies = null; + + /// + /// Search might restrict recursive depth to not go into loops + /// + public int MaxDepth = int.MaxValue; + + [AasxMenuArgument(help: "Specifies the text to be searched.")] + public string FindText = null; + + [AasxMenuArgument(help: "Specifies the text to be replaced with.")] + public string ReplaceText = null; + + [AasxMenuArgument(help: "'True' if only whole words are to be searched.")] + public bool IsWholeWord = false; + + [AasxMenuArgument(help: "'True' if to ignore upper/ lower case when searching.")] + public bool IsIgnoreCase = false; + + [AasxMenuArgument(help: "'True' if to use regular expressions for searching.")] + public bool IsRegex = false; + + [AasxMenuArgument(help: "'True' if texts in SubmodelElementCollections shall be searched.")] + public bool SearchCollection = true; + + [AasxMenuArgument(help: "'True' if texts in Properties shall be searched.")] + public bool SearchProperty = true; + + [AasxMenuArgument(help: "'True' if texts in MultiLanguageProperties shall be searched.")] + public bool SearchMultiLang = true; + + [AasxMenuArgument(help: "'True' if texts in other elements shall be searched.")] + public bool SearchOther = true; + + [AasxMenuArgument(help: "If string present, restricts the search to a certain language " + + "given by that string in multi language entities.")] + public string SearchLanguage = ""; + + /// + /// For sake of speed, regex'es will be compiled + /// + public RegexOptions CompiledRegOpt = RegexOptions.None; + + /// + /// For sake of speed, regex'es will be compiled + /// + public Regex CompiledRegex = null; + + /// + /// Perform compilation for regex'es. + /// + public void CompileOptions() + { + CompiledRegex = null; + CompiledRegOpt = RegexOptions.None; + if (IsRegex) + { + CompiledRegOpt = RegexOptions.Compiled | RegexOptions.CultureInvariant; + if (IsIgnoreCase) + CompiledRegOpt |= RegexOptions.IgnoreCase; + CompiledRegex = new Regex(FindText, CompiledRegOpt); + } + } + } + + public class SearchResultItem : IEquatable + { + public SearchOptions searchOptions; + public string qualifiedNameHead; + public string metaModelName; + public object businessObject; + public string foundText; + public object foundObject; + public object containingObject; + public int foundHash; + public Match foundMatch = null; + + public bool Equals(SearchResultItem other) + { + if (other == null) + return false; + + return this.qualifiedNameHead == other.qualifiedNameHead && + this.metaModelName == other.metaModelName && + this.businessObject == other.businessObject && + this.containingObject == other.containingObject && + this.foundText == other.foundText && + this.foundHash == other.foundHash; + } + + public override string ToString() + { + var idn = ""; + if (businessObject is Aas.IReferable rf) + idn = "." + rf.IdShort; + return "" + qualifiedNameHead + idn + "." + metaModelName; + } + } + + public class SearchResults + { + public int foundIndex = 0; + public List foundResults = new List(); + + public void Clear() + { + foundIndex = -1; + foundResults.Clear(); + } + } + + public class EmulateAttribute + { + public string MemberName; + public bool TextSearchable; + + public EmulateAttribute(string memberName, bool textSearchable = false) + { + MemberName = memberName; + TextSearchable = textSearchable; + } + } + + public static IEnumerable EnumerateEmulateAttributes(Aas.IClass obj) + { + if (obj is Aas.IReferable) + { + yield return new EmulateAttribute("Category", textSearchable: true); + yield return new EmulateAttribute("IdShort", textSearchable: true); + yield return new EmulateAttribute("Checksum", textSearchable: true); + } + + if (obj is Aas.AdministrativeInformation) + { + yield return new EmulateAttribute("Version", textSearchable: true); + yield return new EmulateAttribute("Revision", textSearchable: true); + } + + if (obj is Aas.IIdentifiable) + { + yield return new EmulateAttribute("Id", textSearchable: true); + } + + if (obj is Aas.Property) + { + yield return new EmulateAttribute("Value", textSearchable: true); + yield return new EmulateAttribute("ValueType", textSearchable: true); + } + else + if (obj is Aas.Range) + { + yield return new EmulateAttribute("Min", textSearchable: true); + yield return new EmulateAttribute("Max", textSearchable: true); + yield return new EmulateAttribute("ValueType", textSearchable: true); + } + else + if (obj is Aas.File) + { + yield return new EmulateAttribute("ContentType", textSearchable: true); + yield return new EmulateAttribute("Value", textSearchable: true); + } + else + if (obj is Aas.Blob) + { + yield return new EmulateAttribute("ContentType", textSearchable: true); + yield return new EmulateAttribute("Value", textSearchable: true); + } + + + if (obj is Aas.Key) + { + yield return new EmulateAttribute("Type", textSearchable: true); + yield return new EmulateAttribute("Value", textSearchable: true); + } + + if (obj is Aas.LangString) + { + yield return new EmulateAttribute("Language", textSearchable: true); + yield return new EmulateAttribute("Text", textSearchable: true); + } + + if (obj is Aas.Qualifier) + { + yield return new EmulateAttribute("Type", textSearchable: true); + yield return new EmulateAttribute("Value", textSearchable: true); + } + + if (obj is Aas.Extension) + { + yield return new EmulateAttribute("Name", textSearchable: true); + yield return new EmulateAttribute("Value", textSearchable: true); + } + } + + /// + /// Internal function used by EnumerateSearchable + /// + public static void CheckSearchable( + SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, + MemberInfo mi, object memberValue, object containingObject, Func getMemberHash, + Action progress = null, LogInstance log = null) + { + // try get a speaking name + var metaModelName = ""; + var x1 = mi.GetCustomAttribute(); + if (x1 != null && x1.name != null) + metaModelName = x1.name; + else + { + // as in AasCore we have "nice" names + metaModelName = mi.Name; + } + + // check if this object is searchable + var x2 = mi.GetCustomAttribute(); + if (x2 != null || memberValue is string) + { + // what to check? + string foundText = "" + memberValue?.ToString(); + + // quite late: investigate, if we accepted findings from the + // type of business element + var isColl = (businessObject is Aas.AssetAdministrationShell + || businessObject is Aas.Submodel + || businessObject is Aas.SubmodelElementCollection); + + var isProp = (businessObject is Aas.Property); + + var isMLP = (businessObject is Aas.MultiLanguageProperty); + + + if (!options.SearchCollection && isColl) + return; + + if (!options.SearchProperty && isProp) + return; + + if (!options.SearchMultiLang && isMLP) + return; + + if (!options.SearchOther && !(isColl || isProp || isMLP)) + return; + + // find options + var found = true; + Match foundMatch = null; + if (options.FindText != null) + { + if (options.IsRegex && options.CompiledRegex != null) + { + foundMatch = options.CompiledRegex.Match(foundText); + found = foundMatch.Success; + } + else + if (options.IsWholeWord) + { + found = string.Equals(foundText, options.FindText, + options.IsIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0); + } + else + { + found = foundText.IndexOf(options.FindText, + options.IsIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; + } + } + + // add? + if (found) + { + // prepapre add + var sri = new SearchResultItem(); + sri.searchOptions = options; + sri.qualifiedNameHead = qualifiedNameHead; + sri.metaModelName = metaModelName; + sri.businessObject = businessObject; + sri.foundText = foundText; + sri.foundObject = memberValue; + sri.containingObject = containingObject; + if (getMemberHash != null) + sri.foundHash = getMemberHash(); + + sri.foundMatch = foundMatch; + + // VERY VERY late: if bypassed the [TextSearchable] attribute test, + // then do an EXPENSIVE test for white listed member names + var white = false; + if (x2 == null) + { + foreach (var x in EnumerateEmulateAttributes(containingObject as Aas.IClass)) + if (x.TextSearchable && x.MemberName.Equals(mi.Name, StringComparison.InvariantCultureIgnoreCase)) + { + white = true; + break; + } + if (!white) + return; + } + + // avoid duplicates + if (!results.foundResults.Contains(sri)) + { + log?.Info($"Add SearchResult {sri.ToString()}"); + results.foundResults.Add(sri); + } + + // progress + progress?.Invoke(true, results.foundResults.Count % 50); + } + } + } + + //// + // + // OLD + // + // +#if OLD + + /// + /// Uses reflection to investigate the members of a data structure, which is supposely a + /// structure of the AAS meta model. Inspected classes need to be in options.allowedAssemblies + /// and classes shall be annotated with attributes AdminShell.MetaModelName and + /// AdminShell.TextSearchable. Inspection recursion is controlled via attributes + /// AdminShell.SkipForReflection and AdminShell.SkipForSearch + /// + /// Found result items + /// Root of the data structures to be inspected + /// used for recursion + /// used for recursion + /// Search options + /// used for recursion + /// Progress is reported for any check of field/ property and for any addition + public static void EnumerateSearchable( + SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, + object businessObject = null, + Action progress = null) + { + // access + if (results == null || obj == null || options == null) + return; + Type objType = obj.GetType(); + + // depth + if (depth > options.MaxDepth) + return; + + // try to get element name of an AAS entity + string elName = null; + if (obj is Aas.IReferable) + { + elName = (obj as Aas.IReferable).GetSelfDescription()?.AasElementName; + businessObject = obj; + } + + // enrich qualified name, accordingly + var qualifiedName = qualifiedNameHead; + if (elName != null) + qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; + + // do NOT dive into objects, which are not in the right assembly + if (options.AllowedAssemblies == null || !options.AllowedAssemblies.Contains(objType.Assembly)) + return; + + // do not dive into enums + if (objType.IsEnum) + return; + + // report a "false" progress + progress?.Invoke(false, 0); + + // look at fields, first + var fields = objType.GetFields(); + foreach (var fi in fields) + { + // is the object marked to be skipped? + var x3 = fi.GetCustomAttribute(); + if (x3 != null) + continue; + + var x4 = fi.GetCustomAttribute(); + if (x4 != null) + continue; + + // get value(s) + var fieldValue = fi.GetValue(obj); + if (fieldValue == null) + continue; + var valueElems = fieldValue as IList; + if (valueElems != null) + { + // field is a collection .. dive deeper, if allowed + foreach (var el in valueElems) + EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject, progress); + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, fi, fieldValue, obj, + () => { return fieldValue.GetHashCode(); }, progress); + + // dive deeper .. + EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject, progress); + } + } + + // properties & objects behind + var properties = objType.GetProperties(); + foreach (var pi in properties) + { + var gip = pi.GetIndexParameters(); + if (gip.Length > 0) + // no indexed properties, yet + continue; + + // is the object marked to be skipped? + var x3 = pi.GetCustomAttribute(); + if (x3 != null) + continue; + + var x4 = pi.GetCustomAttribute(); + if (x4 != null) + continue; + + // get value(s) + var propValue = pi.GetValue(obj, null); + if (propValue == null) + continue; + var valueElems = propValue as IList; + if (valueElems != null) + { + // property is a collection .. dive deeper, if allowed + foreach (var el in valueElems) + EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject, progress); + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, pi, propValue, obj, + () => { return propValue.GetHashCode(); }, progress); + + // dive deeper .. + EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject, progress); + } + } + } + + /// + /// Internal function for ReplaceInSearchable + /// + /// New member object, if to set. + private static object ReplaceInSearchableMember( + SearchOptions options, + SearchResultItem item, + string replaceText, + object member) + { + // access + if (options == null || item == null || replaceText == null || member == null) + return null; + + // member type + if (!(member is string memstr)) + { + throw new NotImplementedException("ReplaceInSearchableMember::No string member"); + } + + // regex? + if (options.IsRegex) + { + memstr = Regex.Replace(memstr, options.FindText, replaceText, options.CompiledRegOpt); + return memstr; + } + else + { + // plain text replacement + memstr = memstr.Replace(options.FindText, replaceText); + return memstr; + } + } + + /// + /// Do a replacement according to the options in one search result item. + /// + public static void ReplaceInSearchable( + SearchOptions options, + SearchResultItem item, + string replaceText) + { + // access + if (options == null || item == null || replaceText == null) + return; + + // access in item + var obj = item.containingObject; + if (obj == null) + return; + + // access the object + Type objType = obj.GetType(); + + // reflect thru this object + // look at fields, first + var fields = objType.GetFields(); + foreach (var fi in fields) + { + // get value(s) + var fieldValue = fi.GetValue(obj); + if (fieldValue == null) + continue; + + // hash check on the fieldValue + if (fieldValue.GetHashCode() == item.foundHash) + { + var newval = ReplaceInSearchableMember(options, item, replaceText, fieldValue); + if (newval != null) + fi.SetValue(obj, newval); + } + } + + // properties & objects behind + var properties = objType.GetProperties(); + foreach (var pi in properties) + { + // get value(s) + var propValue = pi.GetValue(obj, null); + if (propValue == null) + continue; + + // hash check on the propValue + if (propValue.GetHashCode() == item.foundHash) + { + ReplaceInSearchableMember(options, item, replaceText, propValue); + } + } + + } +#endif + // + // + // NEW + // + // + + /// + /// New search function using the features of the AasCore model with Descend(). + /// Tries to avoid generic reflection. + /// + /// Found result items + /// Root of the data structures to be inspected + /// used for recursion + /// used for recursion + /// Search options + /// used for recursion + /// Progress is reported for any check of field/ property and for any addition + public static void EnumerateSearchableNew( + SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, + object businessObject = null, + Action progress = null, + LogInstance log = null) + { + // access + if (results == null || obj == null || options == null) + return; + Type objType = obj.GetType(); + + // depth + if (depth > options.MaxDepth) + return; + + // try to get element name of an AAS entity + string elName = null; + if (obj is Aas.IReferable objrf) + { + elName = objrf.GetSelfDescription()?.AasElementName; + businessObject = obj; + log?.Info($"Encouter {elName}: {"" + (obj as Aas.ISubmodelElement)?.GetReference()?.ToStringExtended(1)}"); + } + else + if (obj is Aas.Environment) + { + elName = "Environment"; + businessObject = obj; + } + //else + //if (obj is Aas.IClass objic2) + //{ + // elName = objic2.GetType().Name; + // businessObject = obj; + //} + + // enrich qualified name, accordingly + var qualifiedName = qualifiedNameHead; + if (elName != null) + qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; + + // do NOT dive into objects, which are not in the right assembly + if (options.AllowedAssemblies == null || !options.AllowedAssemblies.Contains(objType.Assembly)) + return; + + // do not dive into enums + if (objType.IsEnum) + return; + + // report a "false" progress + progress?.Invoke(false, 0); + + // look at fields, first + var fields = objType.GetFields(); + foreach (var fi in fields) + { + // get value(s) + var fieldValue = fi.GetValue(obj); + if (fieldValue == null) + continue; + var valueElems = fieldValue as IList; + if (valueElems != null) + { + // field is a collection + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, fi, fieldValue, obj, + () => { return fieldValue.GetHashCode(); }, progress, log); + } + } + + // properties & objects behind + var properties = objType.GetProperties(); + foreach (var pi in properties) + { + var gip = pi.GetIndexParameters(); + if (gip.Length > 0) + // no indexed properties, yet + continue; + + // get value(s) + var propValue = pi.GetValue(obj, null); + if (propValue == null) + continue; + var valueElems = propValue as IList; + if (valueElems != null) + { + // property is a collection + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, pi, propValue, obj, + () => { return propValue.GetHashCode(); }, progress, log); + } + } + + // use the AasCore provided DescendOnce() feature to dive in + if (obj is Aas.IClass objic) + { + if (obj is Aas.AssetAdministrationShell aas) + { + ; + } + foreach (var child in objic.DescendOnce()) + EnumerateSearchableNew(results, child, qualifiedName, depth + 1, options, businessObject, progress, log); + } + } + + /// + /// Internal function for ReplaceInSearchable + /// + /// New member object, if to set. + private static object ReplaceInSearchableMemberNew( + SearchOptions options, + SearchResultItem item, + string replaceText, + object member) + { + // access + if (options == null || item == null || replaceText == null || member == null) + return null; + + // member type + if (!(member is string memstr)) + { + throw new NotImplementedException("ReplaceInSearchableMember::No string member"); + } + + // regex? + if (options.IsRegex) + { + memstr = Regex.Replace(memstr, options.FindText, replaceText, options.CompiledRegOpt); + return memstr; + } + else + { + // plain text replacement + + if (options.IsIgnoreCase) + { + // https://stackoverflow.com/questions/6275980/string-replace-ignoring-case + memstr = Regex.Replace(memstr, Regex.Escape(options.FindText), replaceText, RegexOptions.IgnoreCase); + } + else + { + memstr = memstr.Replace(options.FindText, replaceText); + } + + return memstr; + } + } + + /// + /// Do a replacement according to the options in one search result item. + /// + public static void ReplaceInSearchableNew( + SearchOptions options, + SearchResultItem sri, + string replaceText) + { + // access + if (options == null || sri == null || replaceText == null) + return; + + // access in item + var obj = sri.containingObject; + if (obj == null) + return; + + // access the object + Type objType = obj.GetType(); + + // reflect thru this object + // look at fields, first + var fields = objType.GetFields(); + foreach (var fi in fields) + { + // get value(s) + var fieldValue = fi.GetValue(obj); + if (fieldValue == null) + continue; + + // hash check on the fieldValue + if (fieldValue.GetHashCode() == sri.foundHash) + { + var newval = ReplaceInSearchableMemberNew(options, sri, replaceText, fieldValue); + if (newval != null) + fi.SetValue(obj, newval); + } + } + + // properties & objects behind + var properties = objType.GetProperties(); + foreach (var pi in properties) + { + // get value(s) + var propValue = pi.GetValue(obj, null); + if (propValue == null) + continue; + + // hash check on the propValue + if (propValue.GetHashCode() == sri.foundHash) + { + var newval = ReplaceInSearchableMemberNew(options, sri, replaceText, propValue); + if (newval != null) + pi.SetValue(obj, newval); + } + } + } + + } + +} diff --git a/src/AasxIntegrationBase/AdminShellEvents/AasEventMsgEnvelope.cs b/src/AasxIntegrationBase/AdminShellEvents/AasEventMsgEnvelope.cs index db24a52fa..ba68abd76 100644 --- a/src/AasxIntegrationBase/AdminShellEvents/AasEventMsgEnvelope.cs +++ b/src/AasxIntegrationBase/AdminShellEvents/AasEventMsgEnvelope.cs @@ -16,9 +16,11 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Linq; using System.Text; using System.Threading.Tasks; +using Aas = AasCore.Aas3_0_RC02; using AasxIntegrationBase; using AasxIntegrationBase.MiniMarkup; using AdminShellNS; +using Extensions; using Newtonsoft.Json; namespace AasxIntegrationBase.AdminShellEvents @@ -35,23 +37,23 @@ public class AasEventMsgEnvelope : IAasPayloadItem /// /// Reference to the source EventElement, including identification of AAS, Submodel, SubmodelElements. /// - public AdminShell.Reference Source { get; set; } + public Aas.Reference Source { get; set; } /// - /// SemanticId of the source EventElement, if available. + /// SematicId of the source EventElement, if available. /// - public AdminShell.SemanticId SourceSemanticId { get; set; } + public Aas.Reference SourceSemanticId { get; set; } /// /// Reference to the Referable, which defines the scope of the event. Can be AAS, Submodel, /// SubmodelElementCollection or SubmodelElement. /// - public AdminShell.Reference ObservableReference { get; set; } + public Aas.Reference ObservableReference { get; set; } /// /// SemanticId of the Referable, which defines the scope of the event, if available. /// - public AdminShell.SemanticId ObservableSemanticId { get; set; } + public Aas.Reference ObservableSemanticId { get; set; } /// /// Information for the outer message infrastructure for scheduling the event to the respective @@ -108,9 +110,9 @@ public bool IsWellInformed { get { - return Source != null && Source.Count > 0 - && SourceSemanticId != null && SourceSemanticId.Count > 0 - && ObservableReference != null && ObservableReference.Count > 0; + return Source != null && Source.Keys.Count > 0 + && SourceSemanticId != null && SourceSemanticId.Keys.Count > 0 + && ObservableReference != null && ObservableReference.Keys.Count > 0; } } @@ -134,13 +136,13 @@ public string DisplayTimestamp } [JsonIgnore] - public string DisplaySource { get { return "" + Source?.Keys?.MostSignificantInfo(); } } + public string DisplaySource { get { return "" + Source?.MostSignificantInfo(); } } [JsonIgnore] - public string DisplaySourceSemantic { get { return "" + SourceSemanticId?.GetAsExactlyOneKey()?.value; } } + public string DisplaySourceSemantic { get { return "" + SourceSemanticId?.GetAsExactlyOneKey()?.Value; } } [JsonIgnore] - public string DisplayObservable { get { return "" + ObservableReference?.Keys?.MostSignificantInfo(); } } + public string DisplayObservable { get { return "" + ObservableReference?.MostSignificantInfo(); } } [JsonIgnore] public string DisplayInfo @@ -166,10 +168,10 @@ public AasEventMsgEnvelope() { } public AasEventMsgEnvelope( DateTime timestamp, - AdminShell.Reference source = null, - AdminShell.SemanticId sourceSemanticId = null, - AdminShell.Reference observableReference = null, - AdminShell.SemanticId observableSemanticId = null, + Aas.Reference source = null, + Aas.Reference sourceSemanticId = null, + Aas.Reference observableReference = null, + Aas.Reference observableSemanticId = null, string topic = null, string subject = null, AasPayloadBase payload = null, diff --git a/src/AasxIntegrationBase/AdminShellEvents/AasPayloadBase.cs b/src/AasxIntegrationBase/AdminShellEvents/AasPayloadBase.cs index f3ba35194..8ff1bc2bc 100644 --- a/src/AasxIntegrationBase/AdminShellEvents/AasPayloadBase.cs +++ b/src/AasxIntegrationBase/AdminShellEvents/AasPayloadBase.cs @@ -10,13 +10,9 @@ This source code may use other Open Source software components (see LICENSE.txt) // to be disabled for AASX Server #define UseMarkup +using AasxIntegrationBase.MiniMarkup; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AasxIntegrationBase.MiniMarkup; -using AdminShellNS; namespace AasxIntegrationBase.AdminShellEvents { diff --git a/src/AasxIntegrationBase/AdminShellEvents/AasPayloadStructuralChange.cs b/src/AasxIntegrationBase/AdminShellEvents/AasPayloadStructuralChange.cs index 7730b8546..c3ef46ae7 100644 --- a/src/AasxIntegrationBase/AdminShellEvents/AasPayloadStructuralChange.cs +++ b/src/AasxIntegrationBase/AdminShellEvents/AasPayloadStructuralChange.cs @@ -16,9 +16,11 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; +using Aas = AasCore.Aas3_0_RC02; using AasxIntegrationBase; using AasxIntegrationBase.MiniMarkup; using AdminShellNS; +using AdminShellNS.DiaryData; using Newtonsoft.Json; // ReSharper disable ClassNeverInstantiated.Global @@ -35,7 +37,7 @@ public enum StructuralChangeReason { Create, Modify, Delete } /// Single item of a structural change payload /// [DisplayName("AasPayloadStructuralChangeItem")] - public class AasPayloadStructuralChangeItem : IAasPayloadItem, AdminShell.IAasDiaryEntry + public class AasPayloadStructuralChangeItem : IAasPayloadItem, IAasDiaryEntry { /// /// Reason for the change. According to CRUD principle. @@ -53,7 +55,7 @@ public class AasPayloadStructuralChangeItem : IAasPayloadItem, AdminShell.IAasDi /// Observable of the defined Event. /// Is null / empty, if identical to Observable. /// - public AdminShell.KeyList Path { get; set; } + public List Path { get; set; } /// /// JSON-Serialization of the Submodel, SMC, SME which was denoted by Observabale and Path. @@ -67,11 +69,11 @@ public class AasPayloadStructuralChangeItem : IAasPayloadItem, AdminShell.IAasDi public int CreateAtIndex = -1; /// - /// Direct reference to Referable, when change item was successfully processed. + /// Direct reference to IReferable, when change item was successfully processed. /// Note: only runtime value; not specified; not interoperable /// [JsonIgnore] - public AdminShell.Referable FoundReferable; + public Aas.IReferable FoundReferable; // // Constructor @@ -80,7 +82,7 @@ public class AasPayloadStructuralChangeItem : IAasPayloadItem, AdminShell.IAasDi public AasPayloadStructuralChangeItem( DateTime timeStamp, StructuralChangeReason reason, - AdminShell.KeyList path = null, + List path = null, int createAtIndex = -1, string data = null) { @@ -100,7 +102,7 @@ public override string ToString() var res = "PayloadStructuralChangeItem: {Observable}"; if (Path != null) foreach (var k in Path) - res += "/" + k.value; + res += "/" + k.Value; res += " -> " + Reason.ToString(); return res; } @@ -111,7 +113,7 @@ public MiniMarkupBase ToMarkup() var left = " MsgUpdateValueItem: {Observable}"; if (Path != null) foreach (var k in Path) - left += "/" + k.value; + left += "/" + k.Value; var right = ""; right += " -> " + Reason.ToString(); @@ -129,14 +131,14 @@ public MiniMarkupBase ToMarkup() } #endif - public AdminShell.Referable GetDataAsReferable() + public Aas.IReferable GetDataAsReferable() { // access if (Data == null) return null; // try deserialize - return AdminShellSerializationHelper.DeserializeFromJSON(Data); + return AdminShellSerializationHelper.DeserializeFromJSON(Data); } public string GetDetailsText() @@ -191,7 +193,7 @@ public override string ToString() var res = base.ToString(); if (Changes != null) foreach (var chg in Changes) - res += Environment.NewLine + chg.ToString(); + res += System.Environment.NewLine + chg.ToString(); return res; } diff --git a/src/AasxIntegrationBase/AdminShellEvents/AasPayloadUpdateValue.cs b/src/AasxIntegrationBase/AdminShellEvents/AasPayloadUpdateValue.cs index f0da04abe..75ce143bb 100644 --- a/src/AasxIntegrationBase/AdminShellEvents/AasPayloadUpdateValue.cs +++ b/src/AasxIntegrationBase/AdminShellEvents/AasPayloadUpdateValue.cs @@ -16,9 +16,11 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; +using Aas = AasCore.Aas3_0_RC02; using AasxIntegrationBase; using AasxIntegrationBase.MiniMarkup; using AdminShellNS; +using AdminShellNS.DiaryData; using Newtonsoft.Json; // ReSharper disable ClassNeverInstantiated.Global @@ -31,13 +33,13 @@ namespace AasxIntegrationBase.AdminShellEvents /// single payloads. /// [DisplayName("AasPayloadUpdateValueItem")] - public class AasPayloadUpdateValueItem : IAasPayloadItem, AdminShell.IAasDiaryEntry + public class AasPayloadUpdateValueItem : IAasPayloadItem, IAasDiaryEntry { /// /// Path of the element to be updated. Contains one or more Keys, relative to the Observable of /// the defined Event. /// - public AdminShell.KeyList Path { get; set; } + public List Path { get; set; } /// /// Serialized updated value of the updated element. @@ -47,23 +49,23 @@ public class AasPayloadUpdateValueItem : IAasPayloadItem, AdminShell.IAasDiaryEn /// /// ValueId of the update element. /// - public AdminShell.Reference ValueId { get; set; } + public Aas.Reference ValueId { get; set; } /// /// Direct reference to Referable, when value item was successfully processed. /// Note: only runtime value; not specified; not interoperable /// [JsonIgnore] - public AdminShell.Referable FoundReferable; + public Aas.IReferable FoundReferable; // // Constructor // public AasPayloadUpdateValueItem( - AdminShell.KeyList path = null, + List path = null, string value = null, - AdminShell.Reference valueId = null) + Aas.Reference valueId = null) { Path = path; Value = value; @@ -79,7 +81,7 @@ public override string ToString() var res = "PayloadUpdateValueItem: {Observable}"; if (Path != null) foreach (var k in Path) - res += "/" + k.value; + res += "/" + k.Value; if (Value != null) res += " = " + Value; if (ValueId != null) @@ -93,7 +95,7 @@ public MiniMarkupBase ToMarkup() var left = " MsgUpdateValueItem: {Observable}"; if (Path != null) foreach (var k in Path) - left += "/" + k.value; + left += "/" + k.Value; var right = ""; if (Value != null) @@ -165,7 +167,7 @@ public override string ToString() var res = base.ToString(); if (Values != null) foreach (var val in Values) - res += Environment.NewLine + val.ToString(); + res += System.Environment.NewLine + val.ToString(); return res; } diff --git a/src/AasxIntegrationBase/AnyUI/AnyUiContextPlusDialogs.cs b/src/AasxIntegrationBase/AnyUI/AnyUiContextPlusDialogs.cs new file mode 100644 index 000000000..8a4ebc673 --- /dev/null +++ b/src/AasxIntegrationBase/AnyUI/AnyUiContextPlusDialogs.cs @@ -0,0 +1,423 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using AnyUi; +using AasxIntegrationBase; +using AdminShellNS; +using System.Globalization; +using System.Reflection; +using System.Linq; + +namespace AnyUi +{ + /// + /// This attribute controls the automatic generation of some edit fields + /// in abstract AnyUI DisplayContext. + /// + [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] + public class AnyUiEditField : System.Attribute + { + /// + /// If set, header (key) in a UI dialogue. + /// + public string UiHeader = null; + + /// + /// If true, add help texts in a additional column + /// + public bool UiShowHelp = false; + + /// + /// If true, will group edit field and help directly after each other + /// + public bool UiGroupHelp = false; + + /// + /// If not null, will restrict the minimum length of the edit field. + /// Automatically disable "stretch" behavior of the field. + /// + public int? UiMinWidth = null; + + /// + /// If not null, will restrict the maximum length of the edit field. + /// Automatically disable "stretch" behavior of the field. + /// + public int? UiMaxWidth = null; + + public AnyUiEditField( + string uiHeader = null, bool uiShowHelp = false, + bool uiGroupHelp = false, + int minWidth = -1, int maxWidth = -1) + { + UiHeader = uiHeader; + UiShowHelp = uiShowHelp; + UiGroupHelp = uiGroupHelp; + if (minWidth >= 0.0) + UiMinWidth = minWidth; + if (maxWidth >= 0.0) + UiMaxWidth = maxWidth; + } + } + + public enum AnyUiContextCapability + { + /// + /// Display is a WPF application. + /// Allows hardcoded behaviour. It is recommended to use + /// other capablities instead. + /// + WPF, + + /// + /// Display is a Blazor application. + /// Allows hardcoded behaviour. It is recommended to use + /// other capablities instead. + /// + Blazor, + + /// + /// Display can perform open/save dialogs and further without + /// utilizing the singleton modal flyover. + /// Note: display context allows only for one level of + /// modal / flyover dialogues. NO stacking of dialogues. + /// + DialogWithoutFlyover + }; + + /// + /// This class extends the base context with more functions for handling + /// convenience dialogues. + /// + public class AnyUiContextPlusDialogs : AnyUiContextBase + { + /// + /// Enumerates all given (positive) capabilities. + /// + public virtual IEnumerable EnumCapablities() + { + yield break; + } + + /// + /// Checks if a particular capability is given. + /// + public virtual bool HasCapability(AnyUiContextCapability capa) + { + return EnumCapablities().Contains(capa); + } + + /// + /// Used to hold the directory the user was using the last time + /// + /// + public void RememberForInitialDirectory(string fn) + { + lastFnForInitialDirectory = fn; + } + protected static string lastFnForInitialDirectory = null; + + /// + /// Selects a filename to read either from user or from ticket. + /// + /// The dialog data containing the filename or null + public virtual async Task MenuSelectOpenFilenameAsync( + AasxMenuActionTicket ticket, + string argName, + string caption, + string proposeFn, + string filter, + string msg, + bool requireNoFlyout = false) + { + await Task.Yield(); + return null; + } + + /// + /// If ticket does not contain the filename named by argName, + /// read it by the user. + /// + public virtual async Task MenuSelectOpenFilenameToTicketAsync( + AasxMenuActionTicket ticket, + string argName, + string caption, + string proposeFn, + string filter, + string msg) + { + await Task.Yield(); + return false; + } + + /// + /// Selects a filename to write either from user or from ticket. + /// + /// The dialog data containing the filename or null + public virtual async Task MenuSelectSaveFilenameAsync( + AasxMenuActionTicket ticket, + string argName, + string caption, + string proposeFn, + string filter, + string msg, + bool requireNoFlyout = false) + { + await Task.Yield(); + return null; + } + + /// + /// If ticket does not contain the filename named by argName, + /// read it by the user. + /// + public virtual async Task MenuSelectSaveFilenameToTicketAsync( + AasxMenuActionTicket ticket, + string argName, + string caption, + string proposeFn, + string filter, + string msg, + string argFilterIndex = null, + string argLocation = null) + { + await Task.Yield(); + return false; + } + + /// + /// Selects a text either from user or from ticket. + /// + /// Success + public virtual async Task MenuSelectTextAsync( + AasxMenuActionTicket ticket, + string argName, + string caption, + string proposeText, + string msg) + { + await Task.Yield(); + return null; + } + + /// + /// Selects a text either from user or from ticket. + /// + /// Success + public virtual async Task MenuSelectTextToTicketAsync( + AasxMenuActionTicket ticket, + string argName, + string caption, + string proposeText, + string msg) + { + await Task.Yield(); + return false; + } + + /// + /// The display context tells, if user files are allowable for the application + /// + public virtual bool UserFilesAllowed() + { + return false; + } + + /// + /// The display context tells, if web browser services are allowable for the application. + /// These are: download files, open new browser window .. + /// + public virtual bool WebBrowserServicesAllowed() + { + return false; + } + + /// + /// Initiate a download within the web browser + /// + public virtual async Task WebBrowserDisplayOrDownloadFile(string fn, string mimeType = null) + { + await Task.Yield(); + return; + } + + public async Task CheckIfDownloadAndStart( + LogInstance log, + object location, + string fn, + string contentType = "application/octet-stream") + { + if (location is string ls + && ls.Equals(AnyUiDialogueDataSaveFile.LocationKind.Download.ToString(), + StringComparison.InvariantCultureIgnoreCase) + && WebBrowserServicesAllowed()) + { + try + { + await WebBrowserDisplayOrDownloadFile(fn, contentType); + log?.Info("Download initiated."); + } + catch (Exception ex) + { + log?.Error( + ex, $"When downloading saved file"); + return; + } + } + } + + + /// + /// This function add single rows to a given grid (2 or 3 columns) having + /// header, edit field and help text for a series of data fields given in + /// data via the attribute AasxMenuArgument + /// + public bool AutoGenerateUiFieldsFor( + object data, AnyUiSmallWidgetToolkit helper, + AnyUiGrid grid, int startRow = 0) + { + // access + if (data == null || helper == null || grid == null) + return false; + + int row = startRow; + + // find fields for this object + var t = data.GetType(); + var l = t.GetFields(BindingFlags.Instance | BindingFlags.Public); + foreach (var f in l) + { + var attrMenuArg = f.GetCustomAttribute(); + var attrEditField = f.GetCustomAttribute(); + if (attrEditField != null) + { + // access here + if (attrEditField.UiHeader?.HasContent() != true) + continue; + + // some more layout options + var gridToAdd = grid; + var grpHelp = attrEditField.UiGroupHelp; + var hAlign = AnyUiHorizontalAlignment.Stretch; + int? minWidth = null; + int? maxWidth = null; + int helpGap = 0; + if (attrEditField.UiMinWidth.HasValue) + { + grpHelp = true; + minWidth = attrEditField.UiMinWidth.Value; + } + if (attrEditField.UiMaxWidth.HasValue) + { + grpHelp = true; + maxWidth = attrEditField.UiMinWidth.Value; + } + if (grpHelp) + { + hAlign = AnyUiHorizontalAlignment.Left; + helpGap = 10; + gridToAdd = helper.AddSmallGridTo(grid, row, 1, 1, 3, new[] { "0:", "#", "*" }); + } + + // string + if (f.FieldType == typeof(string) + && f.GetValue(data) is string strVal) + { + AnyUiUIElement.SetStringFromControl( + helper.Set( + helper.AddSmallTextBoxTo(gridToAdd, row, 1, + margin: new AnyUiThickness(0, 2, 2, 2), + text: "" + strVal, + verticalAlignment: AnyUiVerticalAlignment.Center, + verticalContentAlignment: AnyUiVerticalAlignment.Center), + minWidth: minWidth, maxWidth: maxWidth, + horizontalAlignment: hAlign), + (i) => + { + AdminShellUtil.SetFieldLazyValue(f, data, i); + }); + } + else + if (f.FieldType == typeof(bool) + && f.GetValue(data) is bool boolVal) + { + AnyUiUIElement.SetBoolFromControl( + helper.Set( + helper.AddSmallCheckBoxTo(gridToAdd, row, 1, + content: "", + isChecked: boolVal, + verticalContentAlignment: AnyUiVerticalAlignment.Center)), + (b) => + { + AdminShellUtil.SetFieldLazyValue(f, data, b); + }); + } + else + if ((f.FieldType == typeof(byte) || f.FieldType == typeof(sbyte) + || f.FieldType == typeof(Int16) || f.FieldType == typeof(Int32) + || f.FieldType == typeof(Int64) || f.FieldType == typeof(UInt16) + || f.FieldType == typeof(UInt32) || f.FieldType == typeof(UInt64) + || f.FieldType == typeof(Single) || f.FieldType == typeof(Double)) + && f.GetValue(data) is object objVal) + { + var valStr = objVal.ToString(); + if (objVal is Single fVal) + valStr = fVal.ToString(CultureInfo.InvariantCulture); + if (objVal is Double dVal) + valStr = dVal.ToString(CultureInfo.InvariantCulture); + + AnyUiUIElement.RegisterControl( + helper.Set( + helper.AddSmallTextBoxTo(gridToAdd, row, 1, + margin: new AnyUiThickness(0, 2, 2, 2), + text: "" + valStr, + verticalAlignment: AnyUiVerticalAlignment.Center, + verticalContentAlignment: AnyUiVerticalAlignment.Center), + minWidth: minWidth, maxWidth: maxWidth, + horizontalAlignment: hAlign), + setValue: (o) => + { + AdminShellUtil.SetFieldLazyValue(f, data, o); + return new AnyUiLambdaActionNone(); + }); + } + else + { + // if not found, no row + continue; + } + + // start the row with the header + helper.AddSmallLabelTo(grid, row, 0, content: attrEditField.UiHeader + ":", + verticalAlignment: AnyUiVerticalAlignment.Center, + verticalContentAlignment: AnyUiVerticalAlignment.Center); + + // help text + if (attrEditField.UiShowHelp && attrMenuArg?.Help?.HasContent() == true) + { + helper.AddSmallLabelTo(gridToAdd, row, 2, content: "(" + attrMenuArg.Help + ")", + margin: new AnyUiThickness(helpGap, 0, 0, 0), + setNoWrap: true, + verticalAlignment: AnyUiVerticalAlignment.Center, + verticalContentAlignment: AnyUiVerticalAlignment.Center); + } + + // advance row + row++; + } + } + + // OK + return true; + } + } +} diff --git a/src/AasxIntegrationBase/LICENSE.txt b/src/AasxIntegrationBase/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxIntegrationBase/LICENSE.txt +++ b/src/AasxIntegrationBase/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxIntegrationBase/MiniMarkup/MiniMarkupBase.cs b/src/AasxIntegrationBase/MiniMarkup/MiniMarkupBase.cs index 8a0cfda1e..eed143864 100644 --- a/src/AasxIntegrationBase/MiniMarkup/MiniMarkupBase.cs +++ b/src/AasxIntegrationBase/MiniMarkup/MiniMarkupBase.cs @@ -7,11 +7,7 @@ This source code is licensed under the Apache License 2.0 (see LICENSE.txt). This source code may use other Open Source software components (see LICENSE.txt). */ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AasxIntegrationBase.MiniMarkup { diff --git a/src/AasxIntegrationBase/PluginEventStack.cs b/src/AasxIntegrationBase/PluginEventStack.cs index dd1cb0b5d..04a440097 100644 --- a/src/AasxIntegrationBase/PluginEventStack.cs +++ b/src/AasxIntegrationBase/PluginEventStack.cs @@ -7,11 +7,7 @@ This source code is licensed under the Apache License 2.0 (see LICENSE.txt). This source code may use other Open Source software components (see LICENSE.txt). */ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace AasxIntegrationBase { diff --git a/src/AasxIntegrationBase/packages.config b/src/AasxIntegrationBase/packages.config deleted file mode 100644 index 8ab13a902..000000000 --- a/src/AasxIntegrationBase/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/AasxIntegrationBaseGdi/AasxIntegrationBaseGdi.csproj b/src/AasxIntegrationBaseGdi/AasxIntegrationBaseGdi.csproj index 4188b8009..d90e094a3 100644 --- a/src/AasxIntegrationBaseGdi/AasxIntegrationBaseGdi.csproj +++ b/src/AasxIntegrationBaseGdi/AasxIntegrationBaseGdi.csproj @@ -1,12 +1,17 @@  - net472 + net6.0-windows + + + + true + - - + + diff --git a/src/AasxIntegrationBaseGdi/AnyUI/AnyUiGdiHelper.cs b/src/AasxIntegrationBaseGdi/AnyUI/AnyUiGdiHelper.cs index f25345cbe..473717018 100644 --- a/src/AasxIntegrationBaseGdi/AnyUI/AnyUiGdiHelper.cs +++ b/src/AasxIntegrationBaseGdi/AnyUI/AnyUiGdiHelper.cs @@ -78,8 +78,16 @@ public static AnyUiBitmapInfo LoadBitmapInfoFromPackage(AdminShellPackageEnv pac return null; } - + public static AnyUiBitmapInfo MakePreviewFromPackageOrUrl( + AdminShellPackageEnv package, string path, + double dpi = 75) + { + // makes only sense for ImageMagick + return null; + } + + } } -#endif \ No newline at end of file +#endif diff --git a/src/AasxIntegrationBaseGdi/AnyUI/AnyUiMagickHelper.cs b/src/AasxIntegrationBaseGdi/AnyUI/AnyUiMagickHelper.cs index e1431c721..54ca2601f 100644 --- a/src/AasxIntegrationBaseGdi/AnyUI/AnyUiMagickHelper.cs +++ b/src/AasxIntegrationBaseGdi/AnyUI/AnyUiMagickHelper.cs @@ -14,6 +14,7 @@ This source code may use other Open Source software components (see LICENSE.txt) using System; using System.Net; +using System.Net.Http; using AdminShellNS; using AnyUi; using ImageMagick; @@ -35,8 +36,7 @@ public static AnyUiBitmapInfo CreateAnyUiBitmapInfo(MagickImage source, bool doF { // take over direct data res.ImageSource = source; - res.PixelWidth = source.Width; - res.PixelHeight = source.Height; + res.Dimension = new AnyUiDimension(source.Width, source.Height); // provide PNG as well using (var cloneImage = source.Clone()) @@ -58,7 +58,9 @@ public static AnyUiBitmapInfo CreateAnyUiBitmapInfo(string path, bool doFreeze = return CreateAnyUiBitmapInfo(bi); } - public static AnyUiBitmapInfo LoadBitmapInfoFromPackage(AdminShellPackageEnv package, string path) + public static AnyUiBitmapInfo LoadBitmapInfoFromPackage( + AdminShellPackageEnv package, string path, + double? scalePercentage = null) { if (package == null || path == null) return null; @@ -71,6 +73,12 @@ public static AnyUiBitmapInfo LoadBitmapInfoFromPackage(AdminShellPackageEnv pac // load image var bi = new MagickImage(thumbStream); + + if (scalePercentage.HasValue) + { + bi.Resize(new Percentage(scalePercentage.Value)); + } + var binfo = CreateAnyUiBitmapInfo(bi); thumbStream.Close(); @@ -85,6 +93,8 @@ public static AnyUiBitmapInfo LoadBitmapInfoFromPackage(AdminShellPackageEnv pac return null; } + // TODO (MIHO, 2023-02-23): make the whole thing async!! + public static AnyUiBitmapInfo MakePreviewFromPackageOrUrl( AdminShellPackageEnv package, string path, double dpi = 75) @@ -102,8 +112,25 @@ public static AnyUiBitmapInfo MakePreviewFromPackageOrUrl( else { // try download - var wc = new WebClient(); +#if __old + var wc = new WebClient(); thumbStream = wc.OpenRead(path); +#else + // upgrade to HttpClient and follow re-directs + var hc = new HttpClient(); + var response = hc.GetAsync(path).GetAwaiter().GetResult(); + + // if you call response.EnsureSuccessStatusCode here it will throw an exception + if (response.StatusCode == HttpStatusCode.Moved + || response.StatusCode == HttpStatusCode.Found) + { + var location = response.Headers.Location; + response = hc.GetAsync(location).GetAwaiter().GetResult(); + } + + response.EnsureSuccessStatusCode(); + thumbStream = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); +#endif } if (thumbStream == null) @@ -137,4 +164,4 @@ public static AnyUiBitmapInfo MakePreviewFromPackageOrUrl( } } -#endif \ No newline at end of file +#endif diff --git a/src/AasxIntegrationBaseGdi/AnyUI/AnyUiTimerHelper.cs b/src/AasxIntegrationBaseGdi/AnyUI/AnyUiTimerHelper.cs index a4d418fb8..c3a807b42 100644 --- a/src/AasxIntegrationBaseGdi/AnyUI/AnyUiTimerHelper.cs +++ b/src/AasxIntegrationBaseGdi/AnyUI/AnyUiTimerHelper.cs @@ -15,7 +15,6 @@ public static class AnyUiTimerHelper { public static object CreatePluginTimer(int intervalMs, EventHandler eventHandler) { -#if NOT_ALWAYS_SUITABLE { // Note: this timer shall work for all sorts of applications? // see: https://stackoverflow.com/questions/21041299/c-sharp-dispatchertimer-in-dll-application-never-triggered @@ -25,15 +24,6 @@ public static object CreatePluginTimer(int intervalMs, EventHandler eventHandler _timer2.Start(); return _timer2; } -#else - { - var dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); - dispatcherTimer.Tick += eventHandler; - dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, intervalMs); - dispatcherTimer.Start(); - return dispatcherTimer; - } -#endif } } } diff --git a/src/AasxIntegrationBaseGdi/LICENSE.txt b/src/AasxIntegrationBaseGdi/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxIntegrationBaseGdi/LICENSE.txt +++ b/src/AasxIntegrationBaseGdi/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxIntegrationBaseWpf/AasForms/FormListOfDifferentControl.xaml b/src/AasxIntegrationBaseWpf/AasForms/FormListOfDifferentControl.xaml deleted file mode 100644 index 9216c0a45..000000000 --- a/src/AasxIntegrationBaseWpf/AasForms/FormListOfDifferentControl.xaml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void StartFlyoverModal(UserControl uc, Action closingAction = null); + /// + /// Start UserControl as modal flyout. The UserControl has to implement + /// the interface IFlyoutControl + /// + Task StartFlyoverModalAsync(UserControl uc, Action closingAction = null); + /// /// Show MessageBoxFlyout with contents /// @@ -55,9 +61,25 @@ public interface IFlyoutProvider AnyUiMessageBoxResult MessageBoxFlyoutShow( string message, string caption, AnyUiMessageBoxButton buttons, AnyUiMessageBoxImage image); + /// + /// Show MessageBoxFlyout with contents + /// + /// Message on the main screen + /// Caption string (title) + /// Buttons according to WPF standard messagebox + /// Image according to WPF standard messagebox + /// + Task MessageBoxFlyoutShowAsync( + string message, string caption, AnyUiMessageBoxButton buttons, AnyUiMessageBoxImage image); + /// /// Returns the window for advanced modal dialogues /// Window GetWin32Window(); + + /// + /// Gets the display context, e.g. to use UI-abstracted forms of dialogues + /// + AnyUiContextBase GetDisplayContext(); } } diff --git a/src/AasxIntegrationBaseWpf/LICENSE.txt b/src/AasxIntegrationBaseWpf/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxIntegrationBaseWpf/LICENSE.txt +++ b/src/AasxIntegrationBaseWpf/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxIntegrationBaseWpf/MessageBoxFlyout.xaml.cs b/src/AasxIntegrationBaseWpf/MessageBoxFlyout.xaml.cs index a0895cd31..96b9e2f78 100644 --- a/src/AasxIntegrationBaseWpf/MessageBoxFlyout.xaml.cs +++ b/src/AasxIntegrationBaseWpf/MessageBoxFlyout.xaml.cs @@ -135,6 +135,10 @@ private void StackPanelButton_Click(object sender, RoutedEventArgs e) } } + public void LambdaActionAvailable(AnyUiLambdaActionBase la) + { + } + // // Mechanics // diff --git a/src/AasxIntegrationBaseWpf/Properties/AssemblyInfo.cs b/src/AasxIntegrationBaseWpf/Properties/AssemblyInfo.cs index d409370bb..ff8d702d0 100644 --- a/src/AasxIntegrationBaseWpf/Properties/AssemblyInfo.cs +++ b/src/AasxIntegrationBaseWpf/Properties/AssemblyInfo.cs @@ -30,12 +30,12 @@ //// [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] [assembly: ThemeInfo( - ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) - ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) + ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) + ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) )] diff --git a/src/AasxIntegrationBaseWpf/app.config b/src/AasxIntegrationBaseWpf/app.config deleted file mode 100644 index e936cc132..000000000 --- a/src/AasxIntegrationBaseWpf/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxIntegrationBaseWpf/packages.config b/src/AasxIntegrationBaseWpf/packages.config deleted file mode 100644 index 8ab13a902..000000000 --- a/src/AasxIntegrationBaseWpf/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/AasxIntegrationEmptySample/AasxIntegrationEmptySample.csproj b/src/AasxIntegrationEmptySample/AasxIntegrationEmptySample.csproj index 16b4c9513..0a0748b74 100644 --- a/src/AasxIntegrationEmptySample/AasxIntegrationEmptySample.csproj +++ b/src/AasxIntegrationEmptySample/AasxIntegrationEmptySample.csproj @@ -1,13 +1,14 @@  - netstandard2.0 + net6.0 Library false + false - + diff --git a/src/AasxIntegrationEmptySample/LICENSE.txt b/src/AasxIntegrationEmptySample/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxIntegrationEmptySample/LICENSE.txt +++ b/src/AasxIntegrationEmptySample/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxIntegrationEmptySample/app.config b/src/AasxIntegrationEmptySample/app.config deleted file mode 100644 index e936cc132..000000000 --- a/src/AasxIntegrationEmptySample/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxIntegrationEmptySample/packages.config b/src/AasxIntegrationEmptySample/packages.config deleted file mode 100644 index 0dfab7579..000000000 --- a/src/AasxIntegrationEmptySample/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/AasxMqtt/AasxMqtt.csproj b/src/AasxMqtt/AasxMqtt.csproj index 5baf202ac..7e37c597b 100644 --- a/src/AasxMqtt/AasxMqtt.csproj +++ b/src/AasxMqtt/AasxMqtt.csproj @@ -1,16 +1,17 @@  - netstandard2.0 + net6.0 Library AasxMqttServer AasxMqttServer false + false - + diff --git a/src/AasxMqtt/LICENSE.txt b/src/AasxMqtt/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxMqtt/LICENSE.txt +++ b/src/AasxMqtt/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxMqtt/app.config b/src/AasxMqtt/app.config deleted file mode 100644 index e936cc132..000000000 --- a/src/AasxMqtt/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxMqtt/packages.config b/src/AasxMqtt/packages.config deleted file mode 100644 index bd0d8a77c..000000000 --- a/src/AasxMqtt/packages.config +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxMqttClient/AasxMqttClient.csproj b/src/AasxMqttClient/AasxMqttClient.csproj index 7e96176d5..ef23b36f8 100644 --- a/src/AasxMqttClient/AasxMqttClient.csproj +++ b/src/AasxMqttClient/AasxMqttClient.csproj @@ -1,8 +1,9 @@  - netstandard2.0 + net6.0 Library false + false @@ -10,9 +11,9 @@ - - - - + + + + diff --git a/src/AasxMqttClient/LICENSE.txt b/src/AasxMqttClient/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxMqttClient/LICENSE.txt +++ b/src/AasxMqttClient/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxMqttClient/MqttClient.cs b/src/AasxMqttClient/MqttClient.cs index d34356bbc..63f7fa5a7 100644 --- a/src/AasxMqttClient/MqttClient.cs +++ b/src/AasxMqttClient/MqttClient.cs @@ -22,12 +22,14 @@ This source code may use other Open Source software components (see LICENSE.txt) using System.Threading.Tasks; using AasxIntegrationBase; using AasxIntegrationBase.AdminShellEvents; -using AdminShellNS; using AnyUi; using MQTTnet; using MQTTnet.Client; -using MQTTnet.Client.Options; using Newtonsoft.Json; +using Aas = AasCore.Aas3_0_RC02; +using AdminShellNS; +using Extensions; +using AasCore.Aas3_0_RC02; namespace AasxMqttClient { @@ -38,8 +40,8 @@ public class AnyUiDialogueDataMqttPublisher : AnyUiDialogueDataBase [JsonIgnore] public static string HelpString = - "{aas} = AAS.idShort, {aas-id} = AAS.identification" + Environment.NewLine + - "{sm} = Submodel.idShort, {sm-id} = Submodel.identification" + Environment.NewLine + + "{aas} = AAS.idShort, {aas-id} = AAS.identification" + System.Environment.NewLine + + "{sm} = Submodel.idShort, {sm-id} = Submodel.identification" + System.Environment.NewLine + "{path} = Path of idShorts"; public string BrokerUrl = "localhost:1883"; @@ -142,8 +144,8 @@ private Tuple SplitBrokerUrl(string url) private string GenerateTopic(string template, string defaultIfNull = null, - string aasIdShort = null, AdminShell.Identification aasId = null, - string smIdShort = null, AdminShell.Identification smId = null, + string aasIdShort = null, string aasId = null, + string smIdShort = null, string smId = null, string path = null) { var res = template; @@ -154,14 +156,14 @@ private string GenerateTopic(string template, if (aasIdShort != null) res = res.Replace("{aas}", "" + aasIdShort); - if (aasId?.id != null) - res = res.Replace("{aas-id}", "" + System.Net.WebUtility.UrlEncode(aasId.id)); + if (aasId != null) + res = res.Replace("{aas-id}", "" + System.Net.WebUtility.UrlEncode(aasId)); if (smIdShort != null) res = res.Replace("{sm}", "" + smIdShort); - if (smId?.id != null) - res = res.Replace("{sm-id}", "" + System.Net.WebUtility.UrlEncode(smId.id)); + if (smId != null) + res = res.Replace("{sm-id}", "" + System.Net.WebUtility.UrlEncode(smId)); if (path != null) res = res.Replace("{path}", path); @@ -213,15 +215,15 @@ public async Task StartAsync( if (_diaData.EnableFirstPublish) { - foreach (AdminShell.AdministrationShell aas in package.AasEnv.AdministrationShells) + foreach (Aas.AssetAdministrationShell aas in package.AasEnv.AssetAdministrationShells) { _logger?.Info("Publish first AAS"); var message = new MqttApplicationMessageBuilder() .WithTopic(GenerateTopic( _diaData.FirstTopicAAS, defaultIfNull: "AAS", - aasIdShort: aas.idShort, aasId: aas.identification)) + aasIdShort: aas.IdShort, aasId: aas.Id)) .WithPayload(Newtonsoft.Json.JsonConvert.SerializeObject(aas)) - .WithExactlyOnceQoS() + .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce) .WithRetainFlag(_diaData.MqttRetain) .Build(); @@ -232,15 +234,15 @@ public async Task StartAsync( foreach (var sm in package.AasEnv.Submodels) { // whole structure - _logger?.Info("Publish first " + "Submodel_" + sm.idShort); + _logger?.Info("Publish first " + "Submodel_" + sm.IdShort); var message2 = new MqttApplicationMessageBuilder() .WithTopic(GenerateTopic( - _diaData.FirstTopicSubmodel, defaultIfNull: "Submodel_" + sm.idShort, - aasIdShort: aas.idShort, aasId: aas.identification, - smIdShort: sm.idShort, smId: sm.identification)) + _diaData.FirstTopicSubmodel, defaultIfNull: "Submodel_" + sm.IdShort, + aasIdShort: aas.IdShort, aasId: aas.Id, + smIdShort: sm.IdShort, smId: sm.Id)) .WithPayload(Newtonsoft.Json.JsonConvert.SerializeObject(sm)) - .WithExactlyOnceQoS() + .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce) .WithRetainFlag(_diaData.MqttRetain) .Build(); @@ -258,10 +260,18 @@ public async Task StartAsync( _logger?.Info("Publish single values: " + _diaData.SingleValuePublish); } + protected bool IsLeaf(ISubmodelElement sme) + { + if (sme == null) + return false; + var childExist = sme.EnumerateChildren().FirstOrDefault(); + return childExist == null; + } + private void PublishSingleValues_FirstTimeSubmodel( - AdminShell.AdministrationShell aas, - AdminShell.Submodel sm, - AdminShell.KeyList startPath) + Aas.AssetAdministrationShell aas, + Aas.Submodel sm, + List startPath) { // trivial if (aas == null || sm == null) @@ -271,14 +281,16 @@ private void PublishSingleValues_FirstTimeSubmodel( sm.RecurseOnSubmodelElements(null, (o, parents, sme) => { // assumption is, the sme is now "leaf" of a SME-hierarchy - if (sme is AdminShell.IEnumerateChildren) + if (!IsLeaf(sme)) return true; // value of the leaf var valStr = sme.ValueAsText(); // build a complete path of keys - var path = startPath + parents.ToKeyList() + sme?.ToKey(); + var path = startPath.Copy(); + path.AddRange(parents.ToKeyList()); + path.Add(sme?.ToKey()); var pathStr = path.BuildIdShortPath(); // publish @@ -288,11 +300,11 @@ private void PublishSingleValues_FirstTimeSubmodel( var msg = new MqttApplicationMessageBuilder() .WithTopic(GenerateTopic( _diaData.SingleValueTopic, defaultIfNull: "SingleValue", - aasIdShort: aas.idShort, aasId: aas.identification, - smIdShort: sm.idShort, smId: sm.identification, + aasIdShort: aas.IdShort, aasId: aas.Id, + smIdShort: sm.IdShort, smId: sm.Id, path: pathStr)) .WithPayload(valStr) - .WithExactlyOnceQoS() + .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce) .WithRetainFlag(_diaData.MqttRetain) .Build(); _mqttClient.PublishAsync(msg).GetAwaiter().GetResult(); @@ -305,8 +317,8 @@ private void PublishSingleValues_FirstTimeSubmodel( private void PublishSingleValues_ChangeItem( AasEventMsgEnvelope ev, - AdminShell.ReferableRootInfo ri, - AdminShell.KeyList startPath, + ExtendEnvironment.ReferableRootInfo ri, + List startPath, AasPayloadStructuralChangeItem ci) { // trivial @@ -325,21 +337,23 @@ private void PublishSingleValues_ChangeItem( // give this to (recursive) function var messages = new List(); - if (dataRef is AdminShell.SubmodelElement dataSme) + if (dataRef is IReferable dataSme) { - var smwc = new AdminShell.SubmodelElementWrapperCollection(dataSme); - smwc.RecurseOnReferables(null, null, (o, parents, rf) => + dataSme.RecurseOnReferables(null, (o, parents, rf) => { // assumption is, the sme is now "leaf" of a SME-hierarchy - var sme = rf as AdminShell.SubmodelElement; - if (sme == null || sme is AdminShell.IEnumerateChildren) + var sme = rf as Aas.ISubmodelElement; + if (sme == null || !IsLeaf(sme)) return true; // value of the leaf var valStr = sme.ValueAsText(); // build a complete path of keys - var path = startPath + ci.Path + parents.ToKeyList() + sme?.ToKey(); + var path = startPath.Copy(); + path.AddRange(ci.Path); + path.AddRange(parents.ToKeyList()); + path.Add(sme?.ToKey()); var pathStr = path.BuildIdShortPath(); // publish @@ -349,11 +363,11 @@ private void PublishSingleValues_ChangeItem( new MqttApplicationMessageBuilder() .WithTopic(GenerateTopic( _diaData.SingleValueTopic, defaultIfNull: "SingleValue", - aasIdShort: ri?.AAS?.idShort, aasId: ri?.AAS?.identification, - smIdShort: ri?.Submodel?.idShort, smId: ri?.Submodel?.identification, + aasIdShort: ri?.AAS?.IdShort, aasId: ri?.AAS?.Id, + smIdShort: ri?.Submodel?.IdShort, smId: ri?.Submodel?.Id, path: pathStr)) .WithPayload(valStr) - .WithExactlyOnceQoS() + .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce) .WithRetainFlag(_diaData.MqttRetain) .Build()); @@ -375,8 +389,8 @@ private void PublishSingleValues_ChangeItem( private void PublishSingleValues_UpdateItem( AasEventMsgEnvelope ev, - AdminShell.ReferableRootInfo ri, - AdminShell.KeyList startPath, + ExtendEnvironment.ReferableRootInfo ri, + List startPath, AasPayloadUpdateValueItem ui) { // trivial @@ -387,7 +401,8 @@ private void PublishSingleValues_UpdateItem( var valStr = "" + ui.Value; // build a complete path of keys - var path = startPath + ui.Path; + var path = startPath.Copy(); + path.AddRange(ui.Path); var pathStr = path.BuildIdShortPath(); // publish @@ -396,11 +411,11 @@ private void PublishSingleValues_UpdateItem( var message = new MqttApplicationMessageBuilder() .WithTopic(GenerateTopic( _diaData.SingleValueTopic, defaultIfNull: "SingleValue", - aasIdShort: ri?.AAS?.idShort, aasId: ri?.AAS?.identification, - smIdShort: ri?.Submodel?.idShort, smId: ri?.Submodel?.identification, + aasIdShort: ri?.AAS?.IdShort, aasId: ri?.AAS?.Id, + smIdShort: ri?.Submodel?.IdShort, smId: ri?.Submodel?.Id, path: pathStr)) .WithPayload(valStr) - .WithExactlyOnceQoS() + .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce) .WithRetainFlag(_diaData.MqttRetain) .Build(); @@ -410,7 +425,7 @@ private void PublishSingleValues_UpdateItem( } public void PublishEventAsync(AasEventMsgEnvelope ev, - AdminShell.ReferableRootInfo ri = null) + ExtendEnvironment.ReferableRootInfo ri = null) { // access if (ev == null || _mqttClient == null || !_mqttClient.IsConnected) @@ -425,14 +440,14 @@ public void PublishEventAsync(AasEventMsgEnvelope ev, // aas / sm already available in rootInfo, prepare idShortPath var sourcePathStr = ""; - var sourcePath = new AdminShell.KeyList(); + var sourcePath = new List(); if (ev.Source?.Keys != null && ri != null && ev.Source.Keys.Count > ri.NrOfRootKeys) { sourcePath = ev.Source.Keys.SubList(ri.NrOfRootKeys); sourcePathStr = sourcePath.BuildIdShortPath(); } - var observablePath = new AdminShell.KeyList(); + var observablePath = new List(); if (ev.ObservableReference?.Keys != null && ri != null && ev.ObservableReference.Keys.Count > ri.NrOfRootKeys) { @@ -447,11 +462,11 @@ public void PublishEventAsync(AasEventMsgEnvelope ev, var message = new MqttApplicationMessageBuilder() .WithTopic(GenerateTopic( _diaData.EventTopic, defaultIfNull: "Event", - aasIdShort: ri?.AAS?.idShort, aasId: ri?.AAS?.identification, - smIdShort: ri?.Submodel?.idShort, smId: ri?.Submodel?.identification, + aasIdShort: ri?.AAS?.IdShort, aasId: ri?.AAS?.Id, + smIdShort: ri?.Submodel?.IdShort, smId: ri?.Submodel?.Id, path: sourcePathStr)) .WithPayload(json) - .WithExactlyOnceQoS() + .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce) .WithRetainFlag(_diaData.MqttRetain) .Build(); @@ -481,7 +496,7 @@ public void PublishEventAsync(AasEventMsgEnvelope ev, } public void PublishEvent(AasEventMsgEnvelope ev, - AdminShell.ReferableRootInfo ri = null) + ExtendEnvironment.ReferableRootInfo ri = null) { PublishEventAsync(ev, ri); } diff --git a/src/AasxMqttClient/app.config b/src/AasxMqttClient/app.config deleted file mode 100644 index e936cc132..000000000 --- a/src/AasxMqttClient/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxMqttClient/packages.config b/src/AasxMqttClient/packages.config deleted file mode 100644 index 8e8106a78..000000000 --- a/src/AasxMqttClient/packages.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxOpenidClient/AasxOpenidClient.csproj b/src/AasxOpenidClient/AasxOpenidClient.csproj index fa6d2d09e..e4dea0284 100644 --- a/src/AasxOpenidClient/AasxOpenidClient.csproj +++ b/src/AasxOpenidClient/AasxOpenidClient.csproj @@ -1,14 +1,12 @@ - + - net472 + net6.0-windows Library false true true + false - - - Always @@ -24,11 +22,10 @@ - - - - - + + + + diff --git a/src/AasxOpenidClient/LICENSE.txt b/src/AasxOpenidClient/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxOpenidClient/LICENSE.txt +++ b/src/AasxOpenidClient/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxOpenidClient/OpenIDCLient.cs b/src/AasxOpenidClient/OpenIDCLient.cs index 0acff72a4..181cf58e7 100644 --- a/src/AasxOpenidClient/OpenIDCLient.cs +++ b/src/AasxOpenidClient/OpenIDCLient.cs @@ -1,27 +1,20 @@ -using System; +using IdentityModel; +using IdentityModel.Client; +using Jose; +using Microsoft.IdentityModel.Tokens; +using Newtonsoft.Json.Linq; +using SSIExtension; +using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.IO; using System.Net; using System.Net.Http; using System.Security.Claims; -using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; -using System.Security.Permissions; using System.Text; using System.Threading.Tasks; -using System.Web.Helpers; -using System.Windows; using System.Windows.Forms; -using AasxOpenIdClient; -using IdentityModel; -using IdentityModel.Client; -using Jose; -using Microsoft.IdentityModel.Tokens; -using Microsoft.VisualBasic; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using SSIExtension; /* Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 @@ -290,7 +283,7 @@ public static async Task RequestTokenAsync( UiLambdaSet.MesssageBoxShow(uiLambda, disco.Raw, "", "Discovery JSON", MessageBoxButtons.OK); List rootCertSubject = new List(); - dynamic discoObject = Json.Decode(disco.Raw); + dynamic discoObject = null;// Json.Decode(disco.Raw); if (discoObject.rootCertSubjects != null) { int i = 0; diff --git a/src/AasxOpenidClient/OpenIDClientInstance.cs b/src/AasxOpenidClient/OpenIDClientInstance.cs index 537cdbe0b..858b87a57 100644 --- a/src/AasxOpenidClient/OpenIDClientInstance.cs +++ b/src/AasxOpenidClient/OpenIDClientInstance.cs @@ -1,4 +1,11 @@ -using System; +using AnyUi; +using IdentityModel; +using IdentityModel.Client; +using Jose; +using Microsoft.IdentityModel.Tokens; +using Newtonsoft.Json.Linq; +using SSIExtension; +using System; using System.Collections.Generic; using System.Diagnostics; using System.IdentityModel.Tokens.Jwt; @@ -7,33 +14,18 @@ using System.Net.Http; using System.Net.Http.Headers; using System.Security.Claims; -using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; -using System.Security.Permissions; using System.Text; using System.Threading.Tasks; -using System.Web.Helpers; -using System.Windows; -using System.Windows.Forms; -using AasxOpenIdClient; -using AnyUi; -using IdentityModel; -using IdentityModel.Client; -using Jose; -using Microsoft.IdentityModel.Tokens; -using Microsoft.VisualBasic; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using SSIExtension; - + /* Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 We adapted the code marginally and removed the parts that we do not use. -*/ - -// ReSharper disable All .. as this is code from others (adapted from IdentityServer4). - +*/ + +// ReSharper disable All .. as this is code from others (adapted from IdentityServer4). + namespace AasxOpenIdClient { /// @@ -367,7 +359,7 @@ public async Task RequestTokenAsync( UiLambdaSet.MesssageBoxShow(uiLambda, disco.Raw, "", "Discovery JSON", AnyUiMessageBoxButton.OK); List rootCertSubject = new List(); - dynamic discoObject = Json.Decode(disco.Raw); + dynamic discoObject = null; // Json.Decode(disco.Raw); if (discoObject.rootCertSubjects != null) { int i = 0; diff --git a/src/AasxOpenidClient/app.config b/src/AasxOpenidClient/app.config deleted file mode 100644 index 739e9c9c8..000000000 --- a/src/AasxOpenidClient/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/AasxOpenidClient/packages.config b/src/AasxOpenidClient/packages.config deleted file mode 100644 index 0c4854d70..000000000 --- a/src/AasxOpenidClient/packages.config +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj b/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj index 396817be4..ea4c001c4 100644 --- a/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj +++ b/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj @@ -1,20 +1,18 @@ - + Library - net472 + net6.0-windows true false 8 enable + false - - - - - - + + + diff --git a/src/AasxPackageExplorer.GuiTests/Common.cs b/src/AasxPackageExplorer.GuiTests/Common.cs index 6052f1f9b..16bd7f36e 100644 --- a/src/AasxPackageExplorer.GuiTests/Common.cs +++ b/src/AasxPackageExplorer.GuiTests/Common.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using FlaUI.Core.AutomationElements; +using FlaUI.Core.Tools; using NUnit.Framework; // necessary extension for AsLabel() and other methods using Application = FlaUI.Core.Application; @@ -175,8 +176,8 @@ public static void RunWithMainWindow(Implementation implementation, Run? run = n { using var automation = new UIA3Automation(); - var mainWindow = Retry.Find(() => - // ReSharper disable once AccessToDisposedClosure + var mainWindow = Retry.Find(() => + // ReSharper disable once AccessToDisposedClosure app.GetAllTopLevelWindows(automation) .FirstOrDefault( (w) => w.AutomationId == "mainWindow"), @@ -295,8 +296,8 @@ public static void AssertLoadAasx(Application application, Window mainWindow, st public static Window RequireTopLevelWindow(Application application, UIA3Automation automation, Func filter, string timeoutMessage, int timeoutSeconds = 5) { - return Retry.WhileNull(() => - // ReSharper disable once AccessToDisposedClosure + return Retry.WhileNull(() => + // ReSharper disable once AccessToDisposedClosure application.GetAllTopLevelWindows(automation).FirstOrDefault(filter), throwOnTimeout: true, timeout: TimeSpan.FromSeconds(timeoutSeconds), timeoutMessage: timeoutMessage ).Result; diff --git a/src/AasxPackageExplorer.GuiTests/LICENSE.txt b/src/AasxPackageExplorer.GuiTests/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxPackageExplorer.GuiTests/LICENSE.txt +++ b/src/AasxPackageExplorer.GuiTests/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxPackageExplorer.GuiTests/Test.cs b/src/AasxPackageExplorer.GuiTests/Test.cs index ef313a083..26897b371 100644 --- a/src/AasxPackageExplorer.GuiTests/Test.cs +++ b/src/AasxPackageExplorer.GuiTests/Test.cs @@ -4,6 +4,7 @@ using System.Windows.Interop; using FlaUI.Core.AutomationElements; using FlaUI.Core.Definitions; +using FlaUI.Core.Tools; using NUnit.Framework; using Assert = NUnit.Framework.Assert; using AssertionException = NUnit.Framework.AssertionException; diff --git a/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj b/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj index 010d6796f..80cd92b0f 100644 --- a/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj +++ b/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj @@ -1,18 +1,19 @@ - + - net472 + net6.0-windows Library false true + false - - + + diff --git a/src/AasxPackageExplorer.Tests/LICENSE.txt b/src/AasxPackageExplorer.Tests/LICENSE.txt index cd3ff93ed..2e5ee87b9 100644 --- a/src/AasxPackageExplorer.Tests/LICENSE.txt +++ b/src/AasxPackageExplorer.Tests/LICENSE.txt @@ -94,6 +94,9 @@ Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license The Magick.NET library is licensed under Apache License 2.0 (Apache-2.0, see below). +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + ------------------------------------------------------------------------------- @@ -1263,4 +1266,210 @@ With respect to Magick.NET distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/AasxPackageExplorer.sln b/src/AasxPackageExplorer.sln index 5088ad604..445f56f47 100644 --- a/src/AasxPackageExplorer.sln +++ b/src/AasxPackageExplorer.sln @@ -1,1512 +1,1940 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.32428.217 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageExplorer", "AasxPackageExplorer\AasxPackageExplorer.csproj", "{569B369E-9393-4F57-994E-6B84398FD7CC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxToolkit", "AasxToolkit\AasxToolkit.csproj", "{294FC59A-5645-412F-8216-702FB66528C1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxCsharpLibrary", "AasxCsharpLibrary\AasxCsharpLibrary.csproj", "{9863799B-4E44-4DA2-9120-C85C7985BC6D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxWpfControlLibrary", "AasxWpfControlLibrary\AasxWpfControlLibrary.csproj", "{EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxRestServerLibrary", "AasxRestServerLibrary\AasxRestServerLibrary.csproj", "{967E60E3-D668-42A3-AA0B-1A031C20D871}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxRestConsoleServer", "AasxRestConsoleServer\AasxRestConsoleServer.csproj", "{6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationBase", "AasxIntegrationBase\AasxIntegrationBase.csproj", "{5A05DF78-216B-4A0B-9E30-7B2557C7E867}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationEmptySample", "AasxIntegrationEmptySample\AasxIntegrationEmptySample.csproj", "{7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxAmlImExport", "AasxAmlImExport\AasxAmlImExport.csproj", "{6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxMqtt", "AasxMqtt\AasxMqtt.csproj", "{042305D7-DB68-4D02-B08F-ED47BBCD705E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxMqttClient", "AasxMqttClient\AasxMqttClient.csproj", "{7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginBomStructure", "AasxPluginBomStructure\AasxPluginBomStructure.csproj", "{9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPredefinedConcepts", "AasxPredefinedConcepts\AasxPredefinedConcepts.csproj", "{A8583F61-E5D8-44A0-98E3-A795578BE3F0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginDocumentShelf", "AasxPluginDocumentShelf\AasxPluginDocumentShelf.csproj", "{00CDE8B2-EBF3-4ECC-B533-D2270693828F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationBaseWpf", "AasxIntegrationBaseWpf\AasxIntegrationBaseWpf.csproj", "{E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginGenericForms", "AasxPluginGenericForms\AasxPluginGenericForms.csproj", "{B9A11210-B5F8-40BC-9464-04D69C3C512B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsaglWpfControl", "MsaglWpfControl\MsaglWpfControl.csproj", "{57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginExportTable", "AasxPluginExportTable\AasxPluginExportTable.csproj", "{FB0ACC7F-3115-44BF-9931-1BB317CC2F02}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginWebBrowser", "AasxPluginWebBrowser\AasxPluginWebBrowser.csproj", "{AA2A09A7-1E92-4572-9411-249C392ED6A6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginTechnicalData", "AasxPluginTechnicalData\AasxPluginTechnicalData.csproj", "{B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9264D68F-5269-420F-A486-6B8F39BEEB8B}" - ProjectSection(SolutionItems) = preProject - README-packages.md = README-packages.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxUANodesetImExport", "AasxUANodesetImExport\AasxUANodesetImExport.csproj", "{65783100-86DA-4CF6-8066-1292B902B216}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxDictionaryImport", "AasxDictionaryImport\AasxDictionaryImport.csproj", "{DEC389BC-59BC-48E5-B163-6E44CE782C4A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxSignature", "AasxSignature\AasxSignature.csproj", "{69824EF3-30F8-4C8A-874E-9B1F5873D25E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxOpenidClient", "AasxOpenidClient\AasxOpenidClient.csproj", "{7788AC2B-7F97-4755-B343-C4196FA90198}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxCsharpLibrary.Tests", "AasxCsharpLibrary.Tests\AasxCsharpLibrary.Tests.csproj", "{2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BaseCode", "BaseCode", "{DDA9C372-F8ED-4099-A53C-01B9333FD985}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxDictionaryImport.Tests", "AasxDictionaryImport.Tests\AasxDictionaryImport.Tests.csproj", "{B540EBF4-C026-45A4-9721-909AF0CC14C1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalLibs", "FunctionalLibs", "{F9AE9D23-200C-455B-B14E-2EF20B13432E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{66D730EB-B9D7-4C3A-8954-0F86240AD612}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProgsCommandLine", "ProgsCommandLine", "{1A282279-9375-4714-96B6-89A00985C9DC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProgsUserInterface", "ProgsUserInterface", "{98C89299-C429-4F0B-9938-4B7775943393}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataStore", "DataStore", "{9490C085-8FDC-4EDE-BDCF-280FC19E43FF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfMtpControl", "WpfMtpControl\WpfMtpControl.csproj", "{F6CF3948-C67A-40FC-812A-3733F673EA21}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginMtpViewer", "AasxPluginMtpViewer\AasxPluginMtpViewer.csproj", "{7A612803-BAE2-4FED-BBCE-56079EDB8594}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfMtpVisuViewer", "WpfMtpVisuViewer\WpfMtpVisuViewer.csproj", "{1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalUiLibs", "FunctionalUiLibs", "{C1752DB5-0157-4666-A25D-2666089457BB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxUaNetServer", "AasxUaNetServer\AasxUaNetServer.csproj", "{C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginUaNetServer", "AasxPluginUaNetServer\AasxPluginUaNetServer.csproj", "{32EEDE14-8622-42E6-81AE-33941B7A6EFC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginUaNetClient", "AasxPluginUaNetClient\AasxPluginUaNetClient.csproj", "{9EB71E8B-EC41-4054-BAB4-F419B4D13A36}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxUaNetConsoleServer", "AasxUaNetConsoleServer\AasxUaNetConsoleServer.csproj", "{232852C2-358B-4577-9D29-1E48ED75C342}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UserSpecific", "UserSpecific", "{4FD813E9-EC97-4E85-BAFC-5280BC07C302}" - ProjectSection(SolutionItems) = preProject - MIHO.NUnit.runsettings = MIHO.NUnit.runsettings - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfXamlTool", "WpfXamlTool\WpfXamlTool.csproj", "{96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginImageMap", "AasxPluginImageMap\AasxPluginImageMap.csproj", "{8D09D103-1B97-4D54-BAA9-841B2F93FF36}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxToolkit.Tests", "AasxToolkit.Tests\AasxToolkit.Tests.csproj", "{B649731D-C961-4A0E-9A20-3DF20D941E83}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageExplorer.GuiTests", "AasxPackageExplorer.GuiTests\AasxPackageExplorer.GuiTests.csproj", "{24E4B82E-36AC-478E-935C-90DE74121750}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginAdvancedTextEditor", "AasxPluginAdvancedTextEditor\AasxPluginAdvancedTextEditor.csproj", "{1E49EB1C-890C-41BA-8446-B04359067833}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageExplorer.Tests", "AasxPackageExplorer.Tests\AasxPackageExplorer.Tests.csproj", "{F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginPlotting", "AasxPluginPlotting\AasxPluginPlotting.csproj", "{85F1BAF6-AB96-47B6-A039-8F00182390B4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxFormatCst", "AasxFormatCst\AasxFormatCst.csproj", "{CDFB6FFC-7D23-4168-B691-A8A56147F310}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginSmdExporter", "AasxPluginSmdExporter\AasxPluginSmdExporter.csproj", "{02C78DBD-7C1E-4E61-9A30-E44A5736339A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageLogic", "AasxPackageLogic\AasxPackageLogic.csproj", "{45C60157-657F-4213-B5B0-185132CEA861}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AnyUi", "AnyUi\AnyUi.csproj", "{E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorUI", "BlazorUI\BlazorUI.csproj", "{BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SSIExtension", "SSIExtension\SSIExtension.csproj", "{03255E23-87A8-417F-A229-B9A626EA94FD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginKnownSubmodels", "AasxPluginKnownSubmodels\AasxPluginKnownSubmodels.csproj", "{49046502-71CE-4F6A-97C5-324F88FA6F75}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UIComponents.Flags.Blazor", "UIComponents.Flags.Blazor\UIComponents.Flags.Blazor.csproj", "{BEB47CF1-976D-4BF4-B668-586F314608F6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationBaseGdi", "AasxIntegrationBaseGdi\AasxIntegrationBaseGdi.csproj", "{4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxFileServerRestLibrary", "AasxFileServerRestLibrary\AasxFileServerRestLibrary.csproj", "{6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxBammRdfImExport", "AasxBammRdfImExport\AasxBammRdfImExport.csproj", "{00F5EA49-F66D-4104-A621-AF668DD58C05}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "jsoncanonicalizer", "jsoncanonicalizer\jsoncanonicalizer.csproj", "{A713E962-38FB-4FD0-9687-30F530E95E91}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "es6numberserializer", "es6numberserializer\es6numberserializer.csproj", "{AB60370B-DC87-414D-8A6C-7B095F940A1B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Setup", "Setup", "{5BA4D327-1907-4F5A-BC90-5EA939497BFC}" -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "AasxPackageExplorerSetup", "AASXPackageExplorerSetup\AasxPackageExplorerSetup.wixproj", "{8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}" - ProjectSection(ProjectDependencies) = postProject - {AB60370B-DC87-414D-8A6C-7B095F940A1B} = {AB60370B-DC87-414D-8A6C-7B095F940A1B} - {A713E962-38FB-4FD0-9687-30F530E95E91} = {A713E962-38FB-4FD0-9687-30F530E95E91} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - DebugWithoutCEF|Any CPU = DebugWithoutCEF|Any CPU - DebugWithoutCEF|x64 = DebugWithoutCEF|x64 - DebugWithoutCEF|x86 = DebugWithoutCEF|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - ReleaseWithoutCEF|Any CPU = ReleaseWithoutCEF|Any CPU - ReleaseWithoutCEF|x64 = ReleaseWithoutCEF|x64 - ReleaseWithoutCEF|x86 = ReleaseWithoutCEF|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|Any CPU.ActiveCfg = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|Any CPU.Build.0 = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|x64.ActiveCfg = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|x64.Build.0 = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|x86.ActiveCfg = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|Any CPU.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|Any CPU.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x64.ActiveCfg = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x64.Build.0 = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x86.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x86.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|Any CPU.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|Any CPU.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|x64.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|x64.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|x86.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x64.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x64.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x86.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x86.Build.0 = Release|x64 - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x64.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x64.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x86.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x86.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|Any CPU.Build.0 = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|x64.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|x64.Build.0 = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|x86.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|x86.Build.0 = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x64.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x64.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x86.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x86.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|Any CPU.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x64.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x64.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x86.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x86.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x64.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x64.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x86.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x86.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|Any CPU.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x64.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x64.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x86.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x86.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|Any CPU.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x64.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x64.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x86.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x86.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|Any CPU.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|Any CPU.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x64.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x64.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x86.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x86.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x64.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x64.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x86.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x86.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|Any CPU.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x64.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x64.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x86.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x86.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x64.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x64.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x86.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x86.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|Any CPU.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x64.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x64.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x86.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x86.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x64.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x64.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x86.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x86.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|Any CPU.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x64.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x64.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x86.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x86.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x64.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x64.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x86.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x86.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|Any CPU.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x64.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x64.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x86.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x86.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x64.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x64.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x86.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x86.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|Any CPU.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x64.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x64.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x86.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x86.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x64.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x64.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x86.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x86.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|Any CPU.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x64.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x64.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x86.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x86.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x64.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x64.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x86.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x86.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|Any CPU.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x64.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x64.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x86.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x86.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x64.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x64.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x86.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x86.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|Any CPU.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x64.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x64.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x86.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x86.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x64.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x64.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x86.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x86.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|Any CPU.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x64.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x64.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x86.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x86.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x64.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x64.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x86.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x86.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|Any CPU.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x64.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x64.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x86.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x86.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x64.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x64.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x86.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x86.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|Any CPU.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x64.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x64.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x86.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x86.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x64.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x64.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x86.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x86.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|Any CPU.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x64.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x64.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x86.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x86.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x64.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x64.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x86.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x86.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|Any CPU.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x64.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x64.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x86.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x86.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|Any CPU.ActiveCfg = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|Any CPU.Build.0 = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|x64.ActiveCfg = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|x64.Build.0 = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|x86.ActiveCfg = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|Any CPU.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|Any CPU.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x64.ActiveCfg = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x64.Build.0 = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x86.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x86.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|Any CPU.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|Any CPU.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|x64.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|x64.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|x86.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x64.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x64.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x86.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x86.Build.0 = Release|x64 - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x64.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x64.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x86.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x86.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|Any CPU.Build.0 = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x64.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x64.Build.0 = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x86.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x86.Build.0 = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|x64.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|x64.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|x86.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|x86.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|Any CPU.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|x64.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|x64.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|x86.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|x86.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x64.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x64.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x86.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x86.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|Any CPU.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x64.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x64.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x86.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x86.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x64.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x64.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x86.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x86.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|Any CPU.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x64.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x64.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x86.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x86.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x64.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x64.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x86.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x86.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|Any CPU.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x64.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x64.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x86.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x86.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x64.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x64.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x86.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x86.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|Any CPU.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x64.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x64.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x86.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x86.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x64.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x64.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x86.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x86.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|Any CPU.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x64.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x64.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x86.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x86.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x64.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x64.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x86.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x86.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|Any CPU.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x64.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x64.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x86.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x86.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x64.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x64.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x86.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x86.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|Any CPU.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x64.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x64.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x86.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x86.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x64.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x64.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x86.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|Any CPU.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x64.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x64.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x86.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x86.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x64.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x64.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x86.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x86.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|Any CPU.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x64.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x64.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x86.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x86.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x64.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x64.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x86.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x86.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|Any CPU.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x64.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x64.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x86.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x86.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x64.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x64.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x86.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x86.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|Any CPU.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x64.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x64.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x86.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x86.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|Any CPU.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x64.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x64.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x86.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x86.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|Any CPU.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|Any CPU.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x64.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x64.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x86.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x86.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x64.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x64.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x86.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x86.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|Any CPU.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x64.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x64.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x86.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x86.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x64.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x64.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x86.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x86.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|Any CPU.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x64.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x64.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x86.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x86.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x64.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x64.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x86.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x86.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|Any CPU.Build.0 = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x64.ActiveCfg = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x64.Build.0 = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x86.ActiveCfg = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x86.Build.0 = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x64.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x86.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|Any CPU.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x64.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x64.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x86.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x86.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|Any CPU.ActiveCfg = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|Any CPU.Build.0 = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x64.ActiveCfg = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x64.Build.0 = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x86.ActiveCfg = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x86.Build.0 = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x64.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x86.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x64.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x64.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x86.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|Any CPU.Build.0 = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x64.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x64.Build.0 = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x86.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x86.Build.0 = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x64.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x64.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x86.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x86.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|Any CPU.Build.0 = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x64.ActiveCfg = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x64.Build.0 = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x86.ActiveCfg = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x86.Build.0 = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x64.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x86.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x64.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x64.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x86.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x86.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|Any CPU.Build.0 = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x64.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x64.Build.0 = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x86.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x86.Build.0 = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x64.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x64.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x86.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x86.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|Any CPU.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x64.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x64.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x86.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x86.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x64.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x64.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x86.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x86.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|Any CPU.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x64.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x64.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x86.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x86.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|Any CPU.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x64.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x64.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x86.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x86.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|Any CPU.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|Any CPU.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|x64.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|x64.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|x86.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|x86.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x64.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x64.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x86.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x86.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|Any CPU.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x64.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x64.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x86.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x86.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x64.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x64.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x86.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x86.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|Any CPU.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x64.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x64.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x86.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x86.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x64.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x64.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x86.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x86.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|Any CPU.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x64.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x64.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x86.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x86.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|Any CPU.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x64.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x64.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x86.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x86.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|Any CPU.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|Any CPU.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x64.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x64.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x86.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x86.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|x64.ActiveCfg = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|x64.Build.0 = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|x86.ActiveCfg = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|x86.Build.0 = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|Any CPU.Build.0 = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|x64.ActiveCfg = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|x64.Build.0 = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|x86.ActiveCfg = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|x86.Build.0 = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|x64.ActiveCfg = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|x64.Build.0 = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|x86.ActiveCfg = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|x86.Build.0 = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|Any CPU.Build.0 = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|x64.ActiveCfg = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|x64.Build.0 = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|x86.ActiveCfg = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|x86.Build.0 = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|x64.ActiveCfg = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|x64.Build.0 = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|x86.ActiveCfg = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|x86.Build.0 = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|Any CPU.Build.0 = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|x64.ActiveCfg = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|x64.Build.0 = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|x86.ActiveCfg = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|x86.Build.0 = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|Any CPU.Build.0 = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|x64.ActiveCfg = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|x64.Build.0 = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|x86.ActiveCfg = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|x86.Build.0 = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|Any CPU.ActiveCfg = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|Any CPU.Build.0 = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|x64.ActiveCfg = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|x64.Build.0 = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|x86.ActiveCfg = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|x86.Build.0 = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x64.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x64.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x86.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x86.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|Any CPU.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x64.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x64.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x86.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x86.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x64.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x64.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x86.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x86.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|Any CPU.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x64.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x64.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x86.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x86.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|Any CPU.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x64.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x86.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x86.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|Any CPU.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x64.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x64.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x86.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x86.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|Any CPU.ActiveCfg = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|Any CPU.Build.0 = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|x64.ActiveCfg = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|x86.ActiveCfg = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|x86.Build.0 = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x64.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x86.ActiveCfg = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {569B369E-9393-4F57-994E-6B84398FD7CC} = {98C89299-C429-4F0B-9938-4B7775943393} - {294FC59A-5645-412F-8216-702FB66528C1} = {1A282279-9375-4714-96B6-89A00985C9DC} - {9863799B-4E44-4DA2-9120-C85C7985BC6D} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E} = {98C89299-C429-4F0B-9938-4B7775943393} - {967E60E3-D668-42A3-AA0B-1A031C20D871} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF} = {1A282279-9375-4714-96B6-89A00985C9DC} - {5A05DF78-216B-4A0B-9E30-7B2557C7E867} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {042305D7-DB68-4D02-B08F-ED47BBCD705E} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {A8583F61-E5D8-44A0-98E3-A795578BE3F0} = {9490C085-8FDC-4EDE-BDCF-280FC19E43FF} - {00CDE8B2-EBF3-4ECC-B533-D2270693828F} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {B9A11210-B5F8-40BC-9464-04D69C3C512B} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1} = {C1752DB5-0157-4666-A25D-2666089457BB} - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {AA2A09A7-1E92-4572-9411-249C392ED6A6} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {65783100-86DA-4CF6-8066-1292B902B216} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {DEC389BC-59BC-48E5-B163-6E44CE782C4A} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {69824EF3-30F8-4C8A-874E-9B1F5873D25E} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {7788AC2B-7F97-4755-B343-C4196FA90198} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {B540EBF4-C026-45A4-9721-909AF0CC14C1} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {F6CF3948-C67A-40FC-812A-3733F673EA21} = {C1752DB5-0157-4666-A25D-2666089457BB} - {7A612803-BAE2-4FED-BBCE-56079EDB8594} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C} = {98C89299-C429-4F0B-9938-4B7775943393} - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {32EEDE14-8622-42E6-81AE-33941B7A6EFC} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {232852C2-358B-4577-9D29-1E48ED75C342} = {1A282279-9375-4714-96B6-89A00985C9DC} - {4FD813E9-EC97-4E85-BAFC-5280BC07C302} = {9264D68F-5269-420F-A486-6B8F39BEEB8B} - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC} = {98C89299-C429-4F0B-9938-4B7775943393} - {8D09D103-1B97-4D54-BAA9-841B2F93FF36} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {B649731D-C961-4A0E-9A20-3DF20D941E83} = {1A282279-9375-4714-96B6-89A00985C9DC} - {24E4B82E-36AC-478E-935C-90DE74121750} = {98C89299-C429-4F0B-9938-4B7775943393} - {1E49EB1C-890C-41BA-8446-B04359067833} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7} = {98C89299-C429-4F0B-9938-4B7775943393} - {85F1BAF6-AB96-47B6-A039-8F00182390B4} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {CDFB6FFC-7D23-4168-B691-A8A56147F310} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {02C78DBD-7C1E-4E61-9A30-E44A5736339A} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {45C60157-657F-4213-B5B0-185132CEA861} = {98C89299-C429-4F0B-9938-4B7775943393} - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5} = {98C89299-C429-4F0B-9938-4B7775943393} - {03255E23-87A8-417F-A229-B9A626EA94FD} = {98C89299-C429-4F0B-9938-4B7775943393} - {49046502-71CE-4F6A-97C5-324F88FA6F75} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {00F5EA49-F66D-4104-A621-AF668DD58C05} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {A713E962-38FB-4FD0-9687-30F530E95E91} = {98C89299-C429-4F0B-9938-4B7775943393} - {AB60370B-DC87-414D-8A6C-7B095F940A1B} = {98C89299-C429-4F0B-9938-4B7775943393} - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34} = {5BA4D327-1907-4F5A-BC90-5EA939497BFC} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1AE21162-9541-4B98-A49C-A63B6AD03998} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32922.545 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageExplorer", "AasxPackageExplorer\AasxPackageExplorer.csproj", "{569B369E-9393-4F57-994E-6B84398FD7CC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxToolkit", "AasxToolkit\AasxToolkit.csproj", "{294FC59A-5645-412F-8216-702FB66528C1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxCsharpLibrary", "AasxCsharpLibrary\AasxCsharpLibrary.csproj", "{9863799B-4E44-4DA2-9120-C85C7985BC6D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxWpfControlLibrary", "AasxWpfControlLibrary\AasxWpfControlLibrary.csproj", "{EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxRestServerLibrary", "AasxRestServerLibrary\AasxRestServerLibrary.csproj", "{967E60E3-D668-42A3-AA0B-1A031C20D871}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxRestConsoleServer", "AasxRestConsoleServer\AasxRestConsoleServer.csproj", "{6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationBase", "AasxIntegrationBase\AasxIntegrationBase.csproj", "{5A05DF78-216B-4A0B-9E30-7B2557C7E867}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationEmptySample", "AasxIntegrationEmptySample\AasxIntegrationEmptySample.csproj", "{7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxAmlImExport", "AasxAmlImExport\AasxAmlImExport.csproj", "{6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxMqtt", "AasxMqtt\AasxMqtt.csproj", "{042305D7-DB68-4D02-B08F-ED47BBCD705E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxMqttClient", "AasxMqttClient\AasxMqttClient.csproj", "{7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginBomStructure", "AasxPluginBomStructure\AasxPluginBomStructure.csproj", "{9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPredefinedConcepts", "AasxPredefinedConcepts\AasxPredefinedConcepts.csproj", "{A8583F61-E5D8-44A0-98E3-A795578BE3F0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginDocumentShelf", "AasxPluginDocumentShelf\AasxPluginDocumentShelf.csproj", "{00CDE8B2-EBF3-4ECC-B533-D2270693828F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationBaseWpf", "AasxIntegrationBaseWpf\AasxIntegrationBaseWpf.csproj", "{E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginGenericForms", "AasxPluginGenericForms\AasxPluginGenericForms.csproj", "{B9A11210-B5F8-40BC-9464-04D69C3C512B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsaglWpfControl", "MsaglWpfControl\MsaglWpfControl.csproj", "{57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginExportTable", "AasxPluginExportTable\AasxPluginExportTable.csproj", "{FB0ACC7F-3115-44BF-9931-1BB317CC2F02}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginWebBrowser", "AasxPluginWebBrowser\AasxPluginWebBrowser.csproj", "{AA2A09A7-1E92-4572-9411-249C392ED6A6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginTechnicalData", "AasxPluginTechnicalData\AasxPluginTechnicalData.csproj", "{B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9264D68F-5269-420F-A486-6B8F39BEEB8B}" + ProjectSection(SolutionItems) = preProject + Notes_V3.md = Notes_V3.md + README-packages.md = README-packages.md + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxDictionaryImport", "AasxDictionaryImport\AasxDictionaryImport.csproj", "{DEC389BC-59BC-48E5-B163-6E44CE782C4A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxSignature", "AasxSignature\AasxSignature.csproj", "{69824EF3-30F8-4C8A-874E-9B1F5873D25E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxOpenidClient", "AasxOpenidClient\AasxOpenidClient.csproj", "{7788AC2B-7F97-4755-B343-C4196FA90198}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxCsharpLibrary.Tests", "AasxCsharpLibrary.Tests\AasxCsharpLibrary.Tests.csproj", "{2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BaseCode", "BaseCode", "{DDA9C372-F8ED-4099-A53C-01B9333FD985}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxDictionaryImport.Tests", "AasxDictionaryImport.Tests\AasxDictionaryImport.Tests.csproj", "{B540EBF4-C026-45A4-9721-909AF0CC14C1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalLibs", "FunctionalLibs", "{F9AE9D23-200C-455B-B14E-2EF20B13432E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{66D730EB-B9D7-4C3A-8954-0F86240AD612}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProgsCommandLine", "ProgsCommandLine", "{1A282279-9375-4714-96B6-89A00985C9DC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProgsUserInterface", "ProgsUserInterface", "{98C89299-C429-4F0B-9938-4B7775943393}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataStore", "DataStore", "{9490C085-8FDC-4EDE-BDCF-280FC19E43FF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfMtpControl", "WpfMtpControl\WpfMtpControl.csproj", "{F6CF3948-C67A-40FC-812A-3733F673EA21}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginMtpViewer", "AasxPluginMtpViewer\AasxPluginMtpViewer.csproj", "{7A612803-BAE2-4FED-BBCE-56079EDB8594}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfMtpVisuViewer", "WpfMtpVisuViewer\WpfMtpVisuViewer.csproj", "{1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalUiLibs", "FunctionalUiLibs", "{C1752DB5-0157-4666-A25D-2666089457BB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxUaNetServer", "AasxUaNetServer\AasxUaNetServer.csproj", "{C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginUaNetServer", "AasxPluginUaNetServer\AasxPluginUaNetServer.csproj", "{32EEDE14-8622-42E6-81AE-33941B7A6EFC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginUaNetClient", "AasxPluginUaNetClient\AasxPluginUaNetClient.csproj", "{9EB71E8B-EC41-4054-BAB4-F419B4D13A36}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxUaNetConsoleServer", "AasxUaNetConsoleServer\AasxUaNetConsoleServer.csproj", "{232852C2-358B-4577-9D29-1E48ED75C342}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UserSpecific", "UserSpecific", "{4FD813E9-EC97-4E85-BAFC-5280BC07C302}" + ProjectSection(SolutionItems) = preProject + MIHO.NUnit.runsettings = MIHO.NUnit.runsettings + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfXamlTool", "WpfXamlTool\WpfXamlTool.csproj", "{96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginImageMap", "AasxPluginImageMap\AasxPluginImageMap.csproj", "{8D09D103-1B97-4D54-BAA9-841B2F93FF36}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxToolkit.Tests", "AasxToolkit.Tests\AasxToolkit.Tests.csproj", "{B649731D-C961-4A0E-9A20-3DF20D941E83}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageExplorer.GuiTests", "AasxPackageExplorer.GuiTests\AasxPackageExplorer.GuiTests.csproj", "{24E4B82E-36AC-478E-935C-90DE74121750}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginAdvancedTextEditor", "AasxPluginAdvancedTextEditor\AasxPluginAdvancedTextEditor.csproj", "{1E49EB1C-890C-41BA-8446-B04359067833}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageExplorer.Tests", "AasxPackageExplorer.Tests\AasxPackageExplorer.Tests.csproj", "{F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginPlotting", "AasxPluginPlotting\AasxPluginPlotting.csproj", "{85F1BAF6-AB96-47B6-A039-8F00182390B4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxFormatCst", "AasxFormatCst\AasxFormatCst.csproj", "{CDFB6FFC-7D23-4168-B691-A8A56147F310}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginSmdExporter", "AasxPluginSmdExporter\AasxPluginSmdExporter.csproj", "{02C78DBD-7C1E-4E61-9A30-E44A5736339A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageLogic", "AasxPackageLogic\AasxPackageLogic.csproj", "{45C60157-657F-4213-B5B0-185132CEA861}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AnyUi", "AnyUi\AnyUi.csproj", "{E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorUI", "BlazorUI\BlazorUI.csproj", "{BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SSIExtension", "SSIExtension\SSIExtension.csproj", "{03255E23-87A8-417F-A229-B9A626EA94FD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginKnownSubmodels", "AasxPluginKnownSubmodels\AasxPluginKnownSubmodels.csproj", "{49046502-71CE-4F6A-97C5-324F88FA6F75}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UIComponents.Flags.Blazor", "UIComponents.Flags.Blazor\UIComponents.Flags.Blazor.csproj", "{BEB47CF1-976D-4BF4-B668-586F314608F6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationBaseGdi", "AasxIntegrationBaseGdi\AasxIntegrationBaseGdi.csproj", "{4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxFileServerRestLibrary", "AasxFileServerRestLibrary\AasxFileServerRestLibrary.csproj", "{6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxBammRdfImExport", "AasxBammRdfImExport\AasxBammRdfImExport.csproj", "{00F5EA49-F66D-4104-A621-AF668DD58C05}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "jsoncanonicalizer", "jsoncanonicalizer\jsoncanonicalizer.csproj", "{A713E962-38FB-4FD0-9687-30F530E95E91}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "es6numberserializer", "es6numberserializer\es6numberserializer.csproj", "{AB60370B-DC87-414D-8A6C-7B095F940A1B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Setup", "Setup", "{5BA4D327-1907-4F5A-BC90-5EA939497BFC}" +EndProject +Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "AasxPackageExplorerSetup", "AASXPackageExplorerSetup\AasxPackageExplorerSetup.wixproj", "{8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}" + ProjectSection(ProjectDependencies) = postProject + {AB60370B-DC87-414D-8A6C-7B095F940A1B} = {AB60370B-DC87-414D-8A6C-7B095F940A1B} + {A713E962-38FB-4FD0-9687-30F530E95E91} = {A713E962-38FB-4FD0-9687-30F530E95E91} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasCore.Aas3_0_RC02", "AasxServer.DomainModelV3_0_RC02\AasCore.Aas3_0_RC02.csproj", "{63711642-8F7F-4740-886A-BDE6BBACC31D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Projektmappenelemente", "Projektmappenelemente", "{087C80D2-F815-401C-96ED-3BD61A768FF3}" + ProjectSection(SolutionItems) = preProject + Notes_V3.md = Notes_V3.md + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxSchemaExport", "AasxSchemaExport\AasxSchemaExport.csproj", "{4EB64F40-1A01-46BB-BEED-D1A75313C7F8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AasxSchemaExport.Tests", "AasxSchemaExport.Tests\AasxSchemaExport.Tests.csproj", "{BE68E42C-28CB-4298-9F34-A18AF92FC4DE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorExplorer", "BlazorExplorer\BlazorExplorer.csproj", "{FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + DebugSlow|Any CPU = DebugSlow|Any CPU + DebugSlow|x64 = DebugSlow|x64 + DebugSlow|x86 = DebugSlow|x86 + DebugWithoutCEF|Any CPU = DebugWithoutCEF|Any CPU + DebugWithoutCEF|x64 = DebugWithoutCEF|x64 + DebugWithoutCEF|x86 = DebugWithoutCEF|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + ReleaseWithoutCEF|Any CPU = ReleaseWithoutCEF|Any CPU + ReleaseWithoutCEF|x64 = ReleaseWithoutCEF|x64 + ReleaseWithoutCEF|x86 = ReleaseWithoutCEF|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|x64.ActiveCfg = Debug|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|x64.Build.0 = Debug|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|x86.ActiveCfg = Debug|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugSlow|x64.ActiveCfg = Debug|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugSlow|x64.Build.0 = Debug|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugSlow|x86.Build.0 = Debug|Any CPU + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|Any CPU.ActiveCfg = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|Any CPU.Build.0 = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x64.ActiveCfg = Debug|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x64.Build.0 = Debug|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x86.ActiveCfg = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x86.Build.0 = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|Any CPU.ActiveCfg = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|Any CPU.Build.0 = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|x64.ActiveCfg = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|x64.Build.0 = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|x86.ActiveCfg = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x64.ActiveCfg = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x64.Build.0 = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x86.ActiveCfg = Release|x64 + {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x86.Build.0 = Release|x64 + {294FC59A-5645-412F-8216-702FB66528C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x64.ActiveCfg = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x64.Build.0 = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x86.ActiveCfg = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x86.Build.0 = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugSlow|x64.Build.0 = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugSlow|x86.Build.0 = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Release|Any CPU.Build.0 = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Release|x64.ActiveCfg = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Release|x64.Build.0 = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Release|x86.ActiveCfg = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.Release|x86.Build.0 = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x64.ActiveCfg = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x64.Build.0 = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x86.ActiveCfg = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x86.Build.0 = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugSlow|x64.Build.0 = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugSlow|x86.Build.0 = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|Any CPU.Build.0 = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x64.ActiveCfg = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x64.Build.0 = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x86.ActiveCfg = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x86.Build.0 = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x64.ActiveCfg = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x64.Build.0 = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x86.ActiveCfg = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x86.Build.0 = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugSlow|x64.Build.0 = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugSlow|x86.Build.0 = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|Any CPU.Build.0 = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x64.ActiveCfg = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x64.Build.0 = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x86.ActiveCfg = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x86.Build.0 = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|Any CPU.Build.0 = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x64.ActiveCfg = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x64.Build.0 = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x86.ActiveCfg = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x86.Build.0 = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|x64.Build.0 = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|x86.Build.0 = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|Any CPU.ActiveCfg = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|Any CPU.Build.0 = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x64.ActiveCfg = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x64.Build.0 = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x86.ActiveCfg = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x86.Build.0 = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x64.ActiveCfg = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x64.Build.0 = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x86.ActiveCfg = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x86.Build.0 = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|x64.Build.0 = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|x86.Build.0 = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|Any CPU.Build.0 = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x64.ActiveCfg = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x64.Build.0 = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x86.ActiveCfg = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x86.Build.0 = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x64.ActiveCfg = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x64.Build.0 = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x86.ActiveCfg = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x86.Build.0 = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugSlow|x64.Build.0 = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugSlow|x86.Build.0 = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|Any CPU.Build.0 = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x64.ActiveCfg = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x64.Build.0 = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x86.ActiveCfg = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x86.Build.0 = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x64.ActiveCfg = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x64.Build.0 = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x86.ActiveCfg = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x86.Build.0 = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugSlow|x64.Build.0 = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugSlow|x86.Build.0 = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|Any CPU.Build.0 = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x64.ActiveCfg = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x64.Build.0 = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x86.ActiveCfg = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x86.Build.0 = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x64.ActiveCfg = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x64.Build.0 = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x86.ActiveCfg = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x86.Build.0 = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugSlow|x64.Build.0 = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugSlow|x86.Build.0 = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|Any CPU.Build.0 = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x64.ActiveCfg = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x64.Build.0 = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x86.ActiveCfg = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x86.Build.0 = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x64.ActiveCfg = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x64.Build.0 = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x86.ActiveCfg = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x86.Build.0 = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugSlow|x64.Build.0 = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugSlow|x86.Build.0 = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|Any CPU.Build.0 = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x64.ActiveCfg = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x64.Build.0 = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x86.ActiveCfg = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x86.Build.0 = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x64.ActiveCfg = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x64.Build.0 = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x86.ActiveCfg = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x86.Build.0 = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugSlow|x64.Build.0 = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugSlow|x86.Build.0 = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|Any CPU.Build.0 = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x64.ActiveCfg = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x64.Build.0 = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x86.ActiveCfg = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x86.Build.0 = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x64.ActiveCfg = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x64.Build.0 = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x86.ActiveCfg = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x86.Build.0 = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugSlow|x64.Build.0 = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugSlow|x86.Build.0 = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|Any CPU.Build.0 = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x64.ActiveCfg = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x64.Build.0 = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x86.ActiveCfg = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x86.Build.0 = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x64.ActiveCfg = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x64.Build.0 = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x86.ActiveCfg = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x86.Build.0 = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugSlow|x64.Build.0 = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugSlow|x86.Build.0 = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|Any CPU.Build.0 = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x64.ActiveCfg = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x64.Build.0 = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x86.ActiveCfg = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x86.Build.0 = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x64.ActiveCfg = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x64.Build.0 = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x86.ActiveCfg = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x86.Build.0 = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugSlow|x64.Build.0 = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugSlow|x86.Build.0 = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|Any CPU.Build.0 = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x64.ActiveCfg = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x64.Build.0 = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x86.ActiveCfg = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x86.Build.0 = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x64.ActiveCfg = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x64.Build.0 = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x86.ActiveCfg = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x86.Build.0 = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugSlow|x64.Build.0 = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugSlow|x86.Build.0 = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|Any CPU.Build.0 = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x64.ActiveCfg = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x64.Build.0 = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x86.ActiveCfg = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x86.Build.0 = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x64.Build.0 = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x86.ActiveCfg = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x86.Build.0 = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugSlow|x64.Build.0 = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugSlow|x86.Build.0 = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|Any CPU.Build.0 = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x64.ActiveCfg = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x64.Build.0 = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x86.ActiveCfg = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x86.Build.0 = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x64.ActiveCfg = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x64.Build.0 = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x86.ActiveCfg = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x86.Build.0 = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugSlow|x64.Build.0 = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugSlow|x86.Build.0 = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|Any CPU.Build.0 = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x64.ActiveCfg = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x64.Build.0 = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x86.ActiveCfg = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x86.Build.0 = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x64.Build.0 = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x86.Build.0 = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugSlow|x64.Build.0 = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugSlow|x86.Build.0 = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|Any CPU.Build.0 = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x64.ActiveCfg = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x64.Build.0 = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x86.ActiveCfg = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x86.Build.0 = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|Any CPU.ActiveCfg = Debug|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|Any CPU.Build.0 = Debug|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|x64.ActiveCfg = Debug|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|x64.Build.0 = Debug|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|x86.ActiveCfg = Debug|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugSlow|x64.ActiveCfg = Debug|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugSlow|x64.Build.0 = Debug|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugSlow|x86.Build.0 = Debug|Any CPU + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|Any CPU.ActiveCfg = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|Any CPU.Build.0 = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x64.ActiveCfg = Debug|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x64.Build.0 = Debug|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x86.ActiveCfg = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x86.Build.0 = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|Any CPU.ActiveCfg = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|Any CPU.Build.0 = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|x64.ActiveCfg = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|x64.Build.0 = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|x86.ActiveCfg = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x64.ActiveCfg = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x64.Build.0 = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x86.ActiveCfg = Release|x64 + {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x86.Build.0 = Release|x64 + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x64.ActiveCfg = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x64.Build.0 = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x86.ActiveCfg = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x86.Build.0 = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugSlow|x64.Build.0 = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugSlow|x86.Build.0 = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|Any CPU.Build.0 = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x64.ActiveCfg = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x64.Build.0 = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x86.ActiveCfg = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x86.Build.0 = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x64.ActiveCfg = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x64.Build.0 = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x86.ActiveCfg = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x86.Build.0 = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugSlow|x64.Build.0 = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugSlow|x86.Build.0 = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|Any CPU.Build.0 = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x64.ActiveCfg = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x64.Build.0 = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x86.ActiveCfg = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x86.Build.0 = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x64.ActiveCfg = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x64.Build.0 = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x86.ActiveCfg = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x86.Build.0 = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugSlow|x64.Build.0 = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugSlow|x86.Build.0 = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|Any CPU.Build.0 = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x64.ActiveCfg = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x64.Build.0 = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x86.ActiveCfg = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x86.Build.0 = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x64.ActiveCfg = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x64.Build.0 = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x86.ActiveCfg = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x86.Build.0 = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugSlow|x64.Build.0 = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugSlow|x86.Build.0 = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|Any CPU.Build.0 = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x64.ActiveCfg = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x64.Build.0 = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x86.ActiveCfg = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x86.Build.0 = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x64.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x64.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x86.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x86.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x64.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x86.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|Any CPU.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x64.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x64.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x86.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x86.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x64.ActiveCfg = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x64.Build.0 = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x86.ActiveCfg = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x86.Build.0 = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugSlow|x64.Build.0 = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugSlow|x86.Build.0 = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|Any CPU.Build.0 = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x64.ActiveCfg = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x64.Build.0 = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x86.ActiveCfg = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x86.Build.0 = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x64.ActiveCfg = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x64.Build.0 = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x86.ActiveCfg = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x86.Build.0 = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|x64.Build.0 = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|x86.Build.0 = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|Any CPU.Build.0 = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x64.ActiveCfg = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x64.Build.0 = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x86.ActiveCfg = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x86.Build.0 = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x64.ActiveCfg = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x64.Build.0 = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x86.ActiveCfg = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x86.Build.0 = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|x64.Build.0 = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|x86.Build.0 = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|Any CPU.Build.0 = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x64.ActiveCfg = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x64.Build.0 = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x86.ActiveCfg = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x86.Build.0 = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x64.ActiveCfg = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x64.Build.0 = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x86.ActiveCfg = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x86.Build.0 = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|x64.Build.0 = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|x86.Build.0 = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|Any CPU.Build.0 = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x64.ActiveCfg = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x64.Build.0 = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x86.ActiveCfg = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x86.Build.0 = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x64.ActiveCfg = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x64.Build.0 = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x86.ActiveCfg = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x86.Build.0 = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|x64.Build.0 = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|x86.Build.0 = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|Any CPU.Build.0 = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x64.ActiveCfg = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x64.Build.0 = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x86.ActiveCfg = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x86.Build.0 = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x64.ActiveCfg = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x64.Build.0 = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x86.ActiveCfg = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x86.Build.0 = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|x64.Build.0 = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|x86.Build.0 = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|Any CPU.Build.0 = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x64.ActiveCfg = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x64.Build.0 = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x86.ActiveCfg = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x86.Build.0 = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x64.ActiveCfg = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x64.Build.0 = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x86.ActiveCfg = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x86.Build.0 = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|x64.Build.0 = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|x86.Build.0 = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|Any CPU.Build.0 = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x64.ActiveCfg = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x64.Build.0 = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x86.ActiveCfg = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x86.Build.0 = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|Any CPU.Build.0 = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x64.ActiveCfg = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x64.Build.0 = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x86.ActiveCfg = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x86.Build.0 = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|x64.Build.0 = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|x86.Build.0 = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Release|Any CPU.ActiveCfg = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Release|Any CPU.Build.0 = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x64.ActiveCfg = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x64.Build.0 = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x86.ActiveCfg = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x86.Build.0 = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x64.ActiveCfg = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x64.Build.0 = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x86.ActiveCfg = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x86.Build.0 = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugSlow|x64.Build.0 = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugSlow|x86.Build.0 = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|Any CPU.Build.0 = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x64.ActiveCfg = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x64.Build.0 = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x86.ActiveCfg = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x86.Build.0 = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x64.ActiveCfg = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x64.Build.0 = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x86.ActiveCfg = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x86.Build.0 = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugSlow|x64.Build.0 = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugSlow|x86.Build.0 = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|Any CPU.Build.0 = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x64.ActiveCfg = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x64.Build.0 = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x86.ActiveCfg = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x86.Build.0 = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x64.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x64.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x86.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x86.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugSlow|x64.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugSlow|x86.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|Any CPU.Build.0 = Release|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x64.ActiveCfg = Release|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x64.Build.0 = Release|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x86.ActiveCfg = Release|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x86.Build.0 = Release|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x64.Build.0 = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x86.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x64.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x64.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x86.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x86.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugSlow|x64.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugSlow|x86.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Release|Any CPU.Build.0 = Release|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x64.ActiveCfg = Release|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x64.Build.0 = Release|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x86.ActiveCfg = Release|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x86.Build.0 = Release|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x64.Build.0 = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x86.Build.0 = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x64.ActiveCfg = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x64.Build.0 = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x86.ActiveCfg = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x86.Build.0 = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugSlow|x64.Build.0 = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugSlow|x86.Build.0 = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Release|Any CPU.Build.0 = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x64.ActiveCfg = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x64.Build.0 = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x86.ActiveCfg = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x86.Build.0 = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x64.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x64.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x86.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x86.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugSlow|x64.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugSlow|x86.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|Any CPU.Build.0 = Release|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x64.ActiveCfg = Release|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x64.Build.0 = Release|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x86.ActiveCfg = Release|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x86.Build.0 = Release|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x64.Build.0 = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x86.Build.0 = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x64.ActiveCfg = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x64.Build.0 = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x86.ActiveCfg = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x86.Build.0 = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugSlow|x64.Build.0 = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugSlow|x86.Build.0 = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|Any CPU.Build.0 = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x64.ActiveCfg = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x64.Build.0 = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x86.ActiveCfg = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x86.Build.0 = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x64.ActiveCfg = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x64.Build.0 = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x86.ActiveCfg = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x86.Build.0 = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugSlow|x64.Build.0 = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugSlow|x86.Build.0 = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|Any CPU.Build.0 = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x64.ActiveCfg = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x64.Build.0 = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x86.ActiveCfg = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x86.Build.0 = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x64.ActiveCfg = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x64.Build.0 = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x86.ActiveCfg = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x86.Build.0 = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugSlow|x64.Build.0 = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugSlow|x86.Build.0 = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|Any CPU.Build.0 = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x64.ActiveCfg = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x64.Build.0 = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x86.ActiveCfg = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x86.Build.0 = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Debug|Any CPU.Build.0 = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x64.ActiveCfg = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x64.Build.0 = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x86.ActiveCfg = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x86.Build.0 = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugSlow|x64.Build.0 = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugSlow|x86.Build.0 = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Release|Any CPU.ActiveCfg = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Release|Any CPU.Build.0 = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Release|x64.ActiveCfg = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Release|x64.Build.0 = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Release|x86.ActiveCfg = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.Release|x86.Build.0 = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x64.ActiveCfg = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x64.Build.0 = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x86.ActiveCfg = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x86.Build.0 = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugSlow|x64.Build.0 = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugSlow|x86.Build.0 = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|Any CPU.Build.0 = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x64.ActiveCfg = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x64.Build.0 = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x86.ActiveCfg = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x86.Build.0 = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x64.ActiveCfg = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x64.Build.0 = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x86.ActiveCfg = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x86.Build.0 = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugSlow|x64.Build.0 = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugSlow|x86.Build.0 = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|Any CPU.Build.0 = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x64.ActiveCfg = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x64.Build.0 = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x86.ActiveCfg = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x86.Build.0 = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x64.ActiveCfg = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x64.Build.0 = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x86.ActiveCfg = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x86.Build.0 = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugSlow|x64.Build.0 = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugSlow|x86.Build.0 = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|Any CPU.Build.0 = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x64.ActiveCfg = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x64.Build.0 = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x86.ActiveCfg = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x86.Build.0 = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x64.ActiveCfg = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x64.Build.0 = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x86.ActiveCfg = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x86.Build.0 = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugSlow|x64.Build.0 = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugSlow|x86.Build.0 = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|Any CPU.Build.0 = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x64.ActiveCfg = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x64.Build.0 = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x86.ActiveCfg = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x86.Build.0 = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|x64.ActiveCfg = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|x64.Build.0 = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|x86.ActiveCfg = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Debug|x86.Build.0 = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugSlow|x64.Build.0 = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugSlow|x86.Build.0 = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|Any CPU.Build.0 = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|x64.ActiveCfg = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|x64.Build.0 = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|x86.ActiveCfg = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.Release|x86.Build.0 = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {BEB47CF1-976D-4BF4-B668-586F314608F6}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|x64.ActiveCfg = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|x64.Build.0 = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|x86.ActiveCfg = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Debug|x86.Build.0 = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugSlow|x64.Build.0 = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugSlow|x86.Build.0 = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|Any CPU.Build.0 = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|x64.ActiveCfg = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|x64.Build.0 = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|x86.ActiveCfg = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.Release|x86.Build.0 = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|x64.ActiveCfg = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|x64.Build.0 = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|x86.ActiveCfg = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Debug|x86.Build.0 = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugSlow|x64.Build.0 = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugSlow|x86.Build.0 = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|Any CPU.Build.0 = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|x64.ActiveCfg = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|x64.Build.0 = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|x86.ActiveCfg = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.Release|x86.Build.0 = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|x64.ActiveCfg = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|x64.Build.0 = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|x86.ActiveCfg = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Debug|x86.Build.0 = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugSlow|x64.Build.0 = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugSlow|x86.Build.0 = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|Any CPU.ActiveCfg = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|Any CPU.Build.0 = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|x64.ActiveCfg = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|x64.Build.0 = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|x86.ActiveCfg = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.Release|x86.Build.0 = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x64.ActiveCfg = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x64.Build.0 = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x86.ActiveCfg = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x86.Build.0 = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|x64.Build.0 = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|x86.Build.0 = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|Any CPU.Build.0 = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x64.ActiveCfg = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x64.Build.0 = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x86.ActiveCfg = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x86.Build.0 = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x64.ActiveCfg = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x64.Build.0 = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x86.ActiveCfg = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x86.Build.0 = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|x64.Build.0 = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|x86.Build.0 = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|Any CPU.Build.0 = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x64.ActiveCfg = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x64.Build.0 = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x86.ActiveCfg = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x86.Build.0 = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|Any CPU.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x64.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x86.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x86.Build.0 = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugSlow|Any CPU.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugSlow|x64.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugSlow|x86.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|Any CPU.Build.0 = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x64.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x64.Build.0 = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x86.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x86.Build.0 = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|Any CPU.ActiveCfg = Release|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|Any CPU.Build.0 = Release|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|x64.ActiveCfg = Release|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|x86.ActiveCfg = Release|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|x86.Build.0 = Release|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x64.Build.0 = Debug|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x86.ActiveCfg = Release|x86 + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x86.Build.0 = Release|x86 + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Debug|x64.ActiveCfg = Debug|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Debug|x64.Build.0 = Debug|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Debug|x86.ActiveCfg = Debug|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Debug|x86.Build.0 = Debug|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugSlow|Any CPU.ActiveCfg = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugSlow|Any CPU.Build.0 = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugSlow|x64.ActiveCfg = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugSlow|x64.Build.0 = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugSlow|x86.ActiveCfg = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugSlow|x86.Build.0 = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugWithoutCEF|Any CPU.ActiveCfg = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugWithoutCEF|Any CPU.Build.0 = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugWithoutCEF|x64.ActiveCfg = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugWithoutCEF|x64.Build.0 = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugWithoutCEF|x86.ActiveCfg = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.DebugWithoutCEF|x86.Build.0 = DebugSlow|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Release|Any CPU.Build.0 = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Release|x64.ActiveCfg = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Release|x64.Build.0 = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Release|x86.ActiveCfg = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.Release|x86.Build.0 = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {63711642-8F7F-4740-886A-BDE6BBACC31D}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Debug|x64.ActiveCfg = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Debug|x64.Build.0 = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Debug|x86.ActiveCfg = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Debug|x86.Build.0 = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugSlow|x64.Build.0 = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugSlow|x86.Build.0 = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Release|Any CPU.Build.0 = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Release|x64.ActiveCfg = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Release|x64.Build.0 = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Release|x86.ActiveCfg = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Release|x86.Build.0 = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Debug|x64.ActiveCfg = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Debug|x64.Build.0 = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Debug|x86.ActiveCfg = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Debug|x86.Build.0 = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugSlow|x64.Build.0 = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugSlow|x86.Build.0 = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Release|Any CPU.Build.0 = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Release|x64.ActiveCfg = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Release|x64.Build.0 = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Release|x86.ActiveCfg = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.Release|x86.Build.0 = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Debug|x64.ActiveCfg = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Debug|x64.Build.0 = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Debug|x86.ActiveCfg = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Debug|x86.Build.0 = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugSlow|x64.Build.0 = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugSlow|x86.Build.0 = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Release|Any CPU.Build.0 = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Release|x64.ActiveCfg = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Release|x64.Build.0 = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Release|x86.ActiveCfg = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.Release|x86.Build.0 = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {569B369E-9393-4F57-994E-6B84398FD7CC} = {98C89299-C429-4F0B-9938-4B7775943393} + {294FC59A-5645-412F-8216-702FB66528C1} = {1A282279-9375-4714-96B6-89A00985C9DC} + {9863799B-4E44-4DA2-9120-C85C7985BC6D} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} + {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E} = {98C89299-C429-4F0B-9938-4B7775943393} + {967E60E3-D668-42A3-AA0B-1A031C20D871} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF} = {1A282279-9375-4714-96B6-89A00985C9DC} + {5A05DF78-216B-4A0B-9E30-7B2557C7E867} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} + {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {042305D7-DB68-4D02-B08F-ED47BBCD705E} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {A8583F61-E5D8-44A0-98E3-A795578BE3F0} = {9490C085-8FDC-4EDE-BDCF-280FC19E43FF} + {00CDE8B2-EBF3-4ECC-B533-D2270693828F} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} + {B9A11210-B5F8-40BC-9464-04D69C3C512B} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1} = {C1752DB5-0157-4666-A25D-2666089457BB} + {FB0ACC7F-3115-44BF-9931-1BB317CC2F02} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {AA2A09A7-1E92-4572-9411-249C392ED6A6} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {DEC389BC-59BC-48E5-B163-6E44CE782C4A} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {69824EF3-30F8-4C8A-874E-9B1F5873D25E} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {7788AC2B-7F97-4755-B343-C4196FA90198} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} + {B540EBF4-C026-45A4-9721-909AF0CC14C1} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {F6CF3948-C67A-40FC-812A-3733F673EA21} = {C1752DB5-0157-4666-A25D-2666089457BB} + {7A612803-BAE2-4FED-BBCE-56079EDB8594} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C} = {98C89299-C429-4F0B-9938-4B7775943393} + {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {32EEDE14-8622-42E6-81AE-33941B7A6EFC} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {9EB71E8B-EC41-4054-BAB4-F419B4D13A36} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {232852C2-358B-4577-9D29-1E48ED75C342} = {1A282279-9375-4714-96B6-89A00985C9DC} + {4FD813E9-EC97-4E85-BAFC-5280BC07C302} = {9264D68F-5269-420F-A486-6B8F39BEEB8B} + {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC} = {98C89299-C429-4F0B-9938-4B7775943393} + {8D09D103-1B97-4D54-BAA9-841B2F93FF36} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {B649731D-C961-4A0E-9A20-3DF20D941E83} = {1A282279-9375-4714-96B6-89A00985C9DC} + {24E4B82E-36AC-478E-935C-90DE74121750} = {98C89299-C429-4F0B-9938-4B7775943393} + {1E49EB1C-890C-41BA-8446-B04359067833} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7} = {98C89299-C429-4F0B-9938-4B7775943393} + {85F1BAF6-AB96-47B6-A039-8F00182390B4} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {CDFB6FFC-7D23-4168-B691-A8A56147F310} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {02C78DBD-7C1E-4E61-9A30-E44A5736339A} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {45C60157-657F-4213-B5B0-185132CEA861} = {98C89299-C429-4F0B-9938-4B7775943393} + {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} + {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5} = {98C89299-C429-4F0B-9938-4B7775943393} + {03255E23-87A8-417F-A229-B9A626EA94FD} = {98C89299-C429-4F0B-9938-4B7775943393} + {49046502-71CE-4F6A-97C5-324F88FA6F75} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} + {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} + {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {00F5EA49-F66D-4104-A621-AF668DD58C05} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {A713E962-38FB-4FD0-9687-30F530E95E91} = {98C89299-C429-4F0B-9938-4B7775943393} + {AB60370B-DC87-414D-8A6C-7B095F940A1B} = {98C89299-C429-4F0B-9938-4B7775943393} + {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34} = {5BA4D327-1907-4F5A-BC90-5EA939497BFC} + {63711642-8F7F-4740-886A-BDE6BBACC31D} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} + {4EB64F40-1A01-46BB-BEED-D1A75313C7F8} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {BE68E42C-28CB-4298-9F34-A18AF92FC4DE} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1AE21162-9541-4B98-A49C-A63B6AD03998} + EndGlobalSection +EndGlobal diff --git a/src/AasxPackageExplorer.sln.bak b/src/AasxPackageExplorer.sln.bak deleted file mode 100644 index d6afbb66f..000000000 --- a/src/AasxPackageExplorer.sln.bak +++ /dev/null @@ -1,1347 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30413.136 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageExplorer", "AasxPackageExplorer\AasxPackageExplorer.csproj", "{569B369E-9393-4F57-994E-6B84398FD7CC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxToolkit", "AasxToolkit\AasxToolkit.csproj", "{294FC59A-5645-412F-8216-702FB66528C1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxCsharpLibrary", "AasxCsharpLibrary\AasxCsharpLibrary.csproj", "{9863799B-4E44-4DA2-9120-C85C7985BC6D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxWpfControlLibrary", "AasxWpfControlLibrary\AasxWpfControlLibrary.csproj", "{EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxRestServerLibrary", "AasxRestServerLibrary\AasxRestServerLibrary.csproj", "{967E60E3-D668-42A3-AA0B-1A031C20D871}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxRestConsoleServer", "AasxRestConsoleServer\AasxRestConsoleServer.csproj", "{6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationBase", "AasxIntegrationBase\AasxIntegrationBase.csproj", "{5A05DF78-216B-4A0B-9E30-7B2557C7E867}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationEmptySample", "AasxIntegrationEmptySample\AasxIntegrationEmptySample.csproj", "{7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxAmlImExport", "AasxAmlImExport\AasxAmlImExport.csproj", "{6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxMqtt", "AasxMqtt\AasxMqtt.csproj", "{042305D7-DB68-4D02-B08F-ED47BBCD705E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxMqttClient", "AasxMqttClient\AasxMqttClient.csproj", "{7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginBomStructure", "AasxPluginBomStructure\AasxPluginBomStructure.csproj", "{9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPredefinedConcepts", "AasxPredefinedConcepts\AasxPredefinedConcepts.csproj", "{A8583F61-E5D8-44A0-98E3-A795578BE3F0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginDocumentShelf", "AasxPluginDocumentShelf\AasxPluginDocumentShelf.csproj", "{00CDE8B2-EBF3-4ECC-B533-D2270693828F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationBaseWpf", "AasxIntegrationBaseWpf\AasxIntegrationBaseWpf.csproj", "{E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginGenericForms", "AasxPluginGenericForms\AasxPluginGenericForms.csproj", "{B9A11210-B5F8-40BC-9464-04D69C3C512B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsaglWpfControl", "MsaglWpfControl\MsaglWpfControl.csproj", "{57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginExportTable", "AasxPluginExportTable\AasxPluginExportTable.csproj", "{FB0ACC7F-3115-44BF-9931-1BB317CC2F02}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginWebBrowser", "AasxPluginWebBrowser\AasxPluginWebBrowser.csproj", "{AA2A09A7-1E92-4572-9411-249C392ED6A6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginTechnicalData", "AasxPluginTechnicalData\AasxPluginTechnicalData.csproj", "{B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9264D68F-5269-420F-A486-6B8F39BEEB8B}" - ProjectSection(SolutionItems) = preProject - README-packages.md = README-packages.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxUANodesetImExport", "AasxUANodesetImExport\AasxUANodesetImExport.csproj", "{65783100-86DA-4CF6-8066-1292B902B216}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxDictionaryImport", "AasxDictionaryImport\AasxDictionaryImport.csproj", "{DEC389BC-59BC-48E5-B163-6E44CE782C4A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxSignature", "AasxSignature\AasxSignature.csproj", "{69824EF3-30F8-4C8A-874E-9B1F5873D25E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxOpenidClient", "AasxOpenidClient\AasxOpenidClient.csproj", "{7788AC2B-7F97-4755-B343-C4196FA90198}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxCsharpLibrary.Tests", "AasxCsharpLibrary.Tests\AasxCsharpLibrary.Tests.csproj", "{2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BaseCode", "BaseCode", "{DDA9C372-F8ED-4099-A53C-01B9333FD985}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxDictionaryImport.Tests", "AasxDictionaryImport.Tests\AasxDictionaryImport.Tests.csproj", "{B540EBF4-C026-45A4-9721-909AF0CC14C1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalLibs", "FunctionalLibs", "{F9AE9D23-200C-455B-B14E-2EF20B13432E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{66D730EB-B9D7-4C3A-8954-0F86240AD612}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProgsCommandLine", "ProgsCommandLine", "{1A282279-9375-4714-96B6-89A00985C9DC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProgsUserInterface", "ProgsUserInterface", "{98C89299-C429-4F0B-9938-4B7775943393}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataStore", "DataStore", "{9490C085-8FDC-4EDE-BDCF-280FC19E43FF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfMtpControl", "WpfMtpControl\WpfMtpControl.csproj", "{F6CF3948-C67A-40FC-812A-3733F673EA21}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginMtpViewer", "AasxPluginMtpViewer\AasxPluginMtpViewer.csproj", "{7A612803-BAE2-4FED-BBCE-56079EDB8594}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfMtpVisuViewer", "WpfMtpVisuViewer\WpfMtpVisuViewer.csproj", "{1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalUiLibs", "FunctionalUiLibs", "{C1752DB5-0157-4666-A25D-2666089457BB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxUaNetServer", "AasxUaNetServer\AasxUaNetServer.csproj", "{C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginUaNetServer", "AasxPluginUaNetServer\AasxPluginUaNetServer.csproj", "{32EEDE14-8622-42E6-81AE-33941B7A6EFC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginUaNetClient", "AasxPluginUaNetClient\AasxPluginUaNetClient.csproj", "{9EB71E8B-EC41-4054-BAB4-F419B4D13A36}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxUaNetConsoleServer", "AasxUaNetConsoleServer\AasxUaNetConsoleServer.csproj", "{232852C2-358B-4577-9D29-1E48ED75C342}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UserSpecific", "UserSpecific", "{4FD813E9-EC97-4E85-BAFC-5280BC07C302}" - ProjectSection(SolutionItems) = preProject - MIHO.NUnit.runsettings = MIHO.NUnit.runsettings - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfXamlTool", "WpfXamlTool\WpfXamlTool.csproj", "{96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginImageMap", "AasxPluginImageMap\AasxPluginImageMap.csproj", "{8D09D103-1B97-4D54-BAA9-841B2F93FF36}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxToolkit.Tests", "AasxToolkit.Tests\AasxToolkit.Tests.csproj", "{B649731D-C961-4A0E-9A20-3DF20D941E83}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageExplorer.GuiTests", "AasxPackageExplorer.GuiTests\AasxPackageExplorer.GuiTests.csproj", "{24E4B82E-36AC-478E-935C-90DE74121750}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginAdvancedTextEditor", "AasxPluginAdvancedTextEditor\AasxPluginAdvancedTextEditor.csproj", "{1E49EB1C-890C-41BA-8446-B04359067833}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageExplorer.Tests", "AasxPackageExplorer.Tests\AasxPackageExplorer.Tests.csproj", "{F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginPlotting", "AasxPluginPlotting\AasxPluginPlotting.csproj", "{85F1BAF6-AB96-47B6-A039-8F00182390B4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxBammRdfImExport", "AasxBammRdfImExport\AasxBammRdfImExport.csproj", "{80E6390E-C08D-4DA9-9A11-181C0A23EEFA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxFormatCst", "AasxFormatCst\AasxFormatCst.csproj", "{CDFB6FFC-7D23-4168-B691-A8A56147F310}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginSmdExporter", "AasxPluginSmdExporter\AasxPluginSmdExporter.csproj", "{02C78DBD-7C1E-4E61-9A30-E44A5736339A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPackageLogic", "AasxPackageLogic\AasxPackageLogic.csproj", "{45C60157-657F-4213-B5B0-185132CEA861}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AnyUi", "AnyUi\AnyUi.csproj", "{E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorUI", "BlazorUI\BlazorUI.csproj", "{BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SSIExtension", "SSIExtension\SSIExtension.csproj", "{03255E23-87A8-417F-A229-B9A626EA94FD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginKnownSubmodels", "AasxPluginKnownSubmodels\AasxPluginKnownSubmodels.csproj", "{49046502-71CE-4F6A-97C5-324F88FA6F75}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - DebugWithoutCEF|Any CPU = DebugWithoutCEF|Any CPU - DebugWithoutCEF|x64 = DebugWithoutCEF|x64 - DebugWithoutCEF|x86 = DebugWithoutCEF|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - ReleaseWithoutCEF|Any CPU = ReleaseWithoutCEF|Any CPU - ReleaseWithoutCEF|x64 = ReleaseWithoutCEF|x64 - ReleaseWithoutCEF|x86 = ReleaseWithoutCEF|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|Any CPU.ActiveCfg = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|Any CPU.Build.0 = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|x64.ActiveCfg = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|x64.Build.0 = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Debug|x86.ActiveCfg = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|Any CPU.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|Any CPU.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x64.ActiveCfg = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x64.Build.0 = Debug|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x86.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.DebugWithoutCEF|x86.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|Any CPU.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|x64.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|x64.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.Release|x86.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x64.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x64.Build.0 = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x86.ActiveCfg = Release|x64 - {569B369E-9393-4F57-994E-6B84398FD7CC}.ReleaseWithoutCEF|x86.Build.0 = Release|x64 - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x64.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x64.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x86.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Debug|x86.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|Any CPU.Build.0 = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|x64.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|x64.Build.0 = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|x86.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.Release|x86.Build.0 = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {294FC59A-5645-412F-8216-702FB66528C1}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x64.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x64.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x86.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Debug|x86.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|Any CPU.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x64.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x64.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x86.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.Release|x86.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {9863799B-4E44-4DA2-9120-C85C7985BC6D}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x64.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x64.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x86.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Debug|x86.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|Any CPU.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x64.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x64.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x86.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.Release|x86.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|Any CPU.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x64.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x64.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x86.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x86.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|Any CPU.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|Any CPU.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x64.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x64.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x86.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x86.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x64.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x64.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x86.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x86.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|Any CPU.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x64.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x64.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x86.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x86.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x64.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x64.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x86.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x86.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|Any CPU.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x64.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x64.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x86.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Release|x86.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x64.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x64.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x86.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Debug|x86.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|Any CPU.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x64.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x64.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x86.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.Release|x86.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x64.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x64.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x86.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Debug|x86.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|Any CPU.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x64.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x64.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x86.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.Release|x86.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x64.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x64.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x86.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Debug|x86.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|Any CPU.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x64.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x64.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x86.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.Release|x86.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {042305D7-DB68-4D02-B08F-ED47BBCD705E}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x64.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x64.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x86.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Debug|x86.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|Any CPU.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x64.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x64.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x86.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.Release|x86.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x64.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x64.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x86.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Debug|x86.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|Any CPU.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x64.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x64.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x86.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.Release|x86.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x64.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x64.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x86.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Debug|x86.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|Any CPU.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x64.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x64.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x86.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.Release|x86.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {A8583F61-E5D8-44A0-98E3-A795578BE3F0}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x64.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x64.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x86.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Debug|x86.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|Any CPU.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x64.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x64.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x86.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.Release|x86.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {00CDE8B2-EBF3-4ECC-B533-D2270693828F}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x64.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x64.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x86.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Debug|x86.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|Any CPU.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x64.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x64.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x86.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.Release|x86.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x64.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x64.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x86.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Debug|x86.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|Any CPU.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x64.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x64.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x86.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.Release|x86.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {B9A11210-B5F8-40BC-9464-04D69C3C512B}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x64.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x64.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x86.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Debug|x86.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|Any CPU.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x64.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x64.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x86.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.Release|x86.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x64.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x64.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x86.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Debug|x86.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|Any CPU.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x64.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x64.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x86.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.Release|x86.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|Any CPU.ActiveCfg = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|Any CPU.Build.0 = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|x64.ActiveCfg = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|x64.Build.0 = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Debug|x86.ActiveCfg = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|Any CPU.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|Any CPU.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x64.ActiveCfg = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x64.Build.0 = Debug|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x86.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.DebugWithoutCEF|x86.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|Any CPU.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|x64.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|x64.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.Release|x86.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x64.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x64.Build.0 = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x86.ActiveCfg = Release|x64 - {AA2A09A7-1E92-4572-9411-249C392ED6A6}.ReleaseWithoutCEF|x86.Build.0 = Release|x64 - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x64.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x64.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x86.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Debug|x86.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|Any CPU.Build.0 = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x64.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x64.Build.0 = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x86.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.Release|x86.Build.0 = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|x64.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|x64.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|x86.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Debug|x86.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|Any CPU.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|x64.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|x64.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|x86.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.Release|x86.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {65783100-86DA-4CF6-8066-1292B902B216}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x64.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x64.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x86.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Debug|x86.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|Any CPU.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x64.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x64.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x86.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.Release|x86.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {DEC389BC-59BC-48E5-B163-6E44CE782C4A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x64.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x64.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x86.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Debug|x86.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|Any CPU.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x64.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x64.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x86.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.Release|x86.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {69824EF3-30F8-4C8A-874E-9B1F5873D25E}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x64.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x64.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x86.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Debug|x86.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|Any CPU.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x64.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x64.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x86.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.Release|x86.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x64.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x64.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x86.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x86.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|Any CPU.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x64.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x64.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x86.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x86.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x64.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x64.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x86.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x86.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|Any CPU.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x64.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x64.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x86.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Release|x86.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x64.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x64.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x86.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x86.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|Any CPU.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x64.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x64.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x86.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x86.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x64.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x64.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x86.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x86.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|Any CPU.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x64.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x64.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x86.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x86.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x64.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x64.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x86.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|Any CPU.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x64.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x64.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x86.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x86.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x64.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x64.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x86.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x86.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|Any CPU.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x64.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x64.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x86.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x86.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x64.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x64.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x86.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x86.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|Any CPU.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x64.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x64.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x86.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x86.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x64.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x64.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x86.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x86.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|Any CPU.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x64.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x64.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x86.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x86.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|Any CPU.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x64.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x64.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x86.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x86.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|Any CPU.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|Any CPU.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x64.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x64.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x86.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x86.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x64.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x64.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x86.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x86.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|Any CPU.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x64.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x64.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x86.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Release|x86.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x64.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x64.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x86.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Debug|x86.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|Any CPU.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x64.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x64.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x86.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.Release|x86.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {8D09D103-1B97-4D54-BAA9-841B2F93FF36}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x64.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x64.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x86.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Debug|x86.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|Any CPU.Build.0 = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x64.ActiveCfg = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x64.Build.0 = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x86.ActiveCfg = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.Release|x86.Build.0 = Release|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x64.Build.0 = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {B649731D-C961-4A0E-9A20-3DF20D941E83}.ReleaseWithoutCEF|x86.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|Any CPU.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x64.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x64.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x86.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Debug|x86.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|Any CPU.ActiveCfg = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|Any CPU.Build.0 = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x64.ActiveCfg = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x64.Build.0 = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x86.ActiveCfg = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.Release|x86.Build.0 = Release|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x64.Build.0 = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {24E4B82E-36AC-478E-935C-90DE74121750}.ReleaseWithoutCEF|x86.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x64.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x64.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Debug|x86.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|Any CPU.Build.0 = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x64.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x64.Build.0 = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x86.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.Release|x86.Build.0 = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {1E49EB1C-890C-41BA-8446-B04359067833}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x64.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x64.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x86.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Debug|x86.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|Any CPU.Build.0 = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x64.ActiveCfg = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x64.Build.0 = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x86.ActiveCfg = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.Release|x86.Build.0 = Release|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x64.Build.0 = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7}.ReleaseWithoutCEF|x86.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x64.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x64.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x86.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Debug|x86.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|Any CPU.Build.0 = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x64.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x64.Build.0 = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x86.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.Release|x86.Build.0 = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {85F1BAF6-AB96-47B6-A039-8F00182390B4}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Debug|x64.ActiveCfg = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Debug|x64.Build.0 = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Debug|x86.ActiveCfg = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Debug|x86.Build.0 = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Release|Any CPU.Build.0 = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Release|x64.ActiveCfg = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Release|x64.Build.0 = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Release|x86.ActiveCfg = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.Release|x86.Build.0 = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x64.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x64.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x86.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Debug|x86.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|Any CPU.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x64.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x64.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x86.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.Release|x86.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {CDFB6FFC-7D23-4168-B691-A8A56147F310}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x64.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x64.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x86.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Debug|x86.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|Any CPU.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x64.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x64.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x86.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.Release|x86.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {02C78DBD-7C1E-4E61-9A30-E44A5736339A}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|Any CPU.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x64.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x64.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x86.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Debug|x86.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|Any CPU.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|Any CPU.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|x64.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|x64.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|x86.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.Release|x86.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {45C60157-657F-4213-B5B0-185132CEA861}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x64.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x64.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x86.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Debug|x86.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|Any CPU.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x64.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x64.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x86.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.Release|x86.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x64.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x64.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x86.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Debug|x86.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|Any CPU.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x64.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x64.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x86.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.Release|x86.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x64.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x64.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x86.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Debug|x86.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|Any CPU.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x64.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x64.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x86.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.Release|x86.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {03255E23-87A8-417F-A229-B9A626EA94FD}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|Any CPU.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x64.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x64.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x86.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Debug|x86.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|Any CPU.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|Any CPU.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x64.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x64.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x86.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.Release|x86.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {49046502-71CE-4F6A-97C5-324F88FA6F75}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {569B369E-9393-4F57-994E-6B84398FD7CC} = {98C89299-C429-4F0B-9938-4B7775943393} - {294FC59A-5645-412F-8216-702FB66528C1} = {1A282279-9375-4714-96B6-89A00985C9DC} - {9863799B-4E44-4DA2-9120-C85C7985BC6D} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E} = {98C89299-C429-4F0B-9938-4B7775943393} - {967E60E3-D668-42A3-AA0B-1A031C20D871} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF} = {1A282279-9375-4714-96B6-89A00985C9DC} - {5A05DF78-216B-4A0B-9E30-7B2557C7E867} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {042305D7-DB68-4D02-B08F-ED47BBCD705E} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {7DFE2ECB-37C5-4697-8D8C-050ECAFCF553} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {9E14C360-2DBC-46AE-90A5-6171ABA9CFDB} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {A8583F61-E5D8-44A0-98E3-A795578BE3F0} = {9490C085-8FDC-4EDE-BDCF-280FC19E43FF} - {00CDE8B2-EBF3-4ECC-B533-D2270693828F} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {E3AB36EA-E98A-4CC2-BC18-1D0E40EEAE1A} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {B9A11210-B5F8-40BC-9464-04D69C3C512B} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {57BB1D65-1EF9-4EAE-A1DE-9EA749431FA1} = {C1752DB5-0157-4666-A25D-2666089457BB} - {FB0ACC7F-3115-44BF-9931-1BB317CC2F02} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {AA2A09A7-1E92-4572-9411-249C392ED6A6} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {B074E5E8-A2D4-4DFB-81C6-4DD5F0ABB8B4} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {65783100-86DA-4CF6-8066-1292B902B216} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {DEC389BC-59BC-48E5-B163-6E44CE782C4A} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {69824EF3-30F8-4C8A-874E-9B1F5873D25E} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {7788AC2B-7F97-4755-B343-C4196FA90198} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {B540EBF4-C026-45A4-9721-909AF0CC14C1} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {F6CF3948-C67A-40FC-812A-3733F673EA21} = {C1752DB5-0157-4666-A25D-2666089457BB} - {7A612803-BAE2-4FED-BBCE-56079EDB8594} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C} = {98C89299-C429-4F0B-9938-4B7775943393} - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {32EEDE14-8622-42E6-81AE-33941B7A6EFC} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {232852C2-358B-4577-9D29-1E48ED75C342} = {1A282279-9375-4714-96B6-89A00985C9DC} - {4FD813E9-EC97-4E85-BAFC-5280BC07C302} = {9264D68F-5269-420F-A486-6B8F39BEEB8B} - {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC} = {98C89299-C429-4F0B-9938-4B7775943393} - {8D09D103-1B97-4D54-BAA9-841B2F93FF36} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {B649731D-C961-4A0E-9A20-3DF20D941E83} = {1A282279-9375-4714-96B6-89A00985C9DC} - {24E4B82E-36AC-478E-935C-90DE74121750} = {98C89299-C429-4F0B-9938-4B7775943393} - {1E49EB1C-890C-41BA-8446-B04359067833} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {F0F08513-DEA5-456E-B03B-D8DF08A5C9E7} = {98C89299-C429-4F0B-9938-4B7775943393} - {85F1BAF6-AB96-47B6-A039-8F00182390B4} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {80E6390E-C08D-4DA9-9A11-181C0A23EEFA} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {CDFB6FFC-7D23-4168-B691-A8A56147F310} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {02C78DBD-7C1E-4E61-9A30-E44A5736339A} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {45C60157-657F-4213-B5B0-185132CEA861} = {98C89299-C429-4F0B-9938-4B7775943393} - {E9AC7B0F-58FC-4BD8-A1C9-97BBB34A4E99} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - {BCE9B9F3-35CD-4CEA-8C88-68B0FD48DFD5} = {98C89299-C429-4F0B-9938-4B7775943393} - {03255E23-87A8-417F-A229-B9A626EA94FD} = {98C89299-C429-4F0B-9938-4B7775943393} - {49046502-71CE-4F6A-97C5-324F88FA6F75} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {BEB47CF1-976D-4BF4-B668-586F314608F6} = {98C89299-C429-4F0B-9938-4B7775943393} - {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1AE21162-9541-4B98-A49C-A63B6AD03998} - EndGlobalSection -EndGlobal diff --git a/src/AasxPackageExplorer/AasxPackageExplorer.csproj b/src/AasxPackageExplorer/AasxPackageExplorer.csproj index 328c494ec..4a8a4f146 100644 --- a/src/AasxPackageExplorer/AasxPackageExplorer.csproj +++ b/src/AasxPackageExplorer/AasxPackageExplorer.csproj @@ -1,9 +1,11 @@ - + - net472 + net6.0-windows WinExe false true + win7-x64 + true true - x64 + x64;AnyCPU x64 aasx.ico + + false + - - + + + + + + + + + + - + + @@ -67,6 +80,13 @@ + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -83,9 +103,13 @@ SettingsSingleFileGenerator Settings.Designer.cs + + PreserveNewest + PreserveNewest + @@ -105,20 +129,21 @@ Always - + PreserveNewest - - - - + - - - + + + + + + + @@ -127,11 +152,10 @@ Settings.settings - - - Designer - - - + + + + + diff --git a/src/AasxPackageExplorer/AasxPackageExplorer.options-for-debug.json b/src/AasxPackageExplorer/AasxPackageExplorer.options-for-debug.json index 06b97dbc0..0ce912fa3 100644 --- a/src/AasxPackageExplorer/AasxPackageExplorer.options-for-debug.json +++ b/src/AasxPackageExplorer/AasxPackageExplorer.options-for-debug.json @@ -10,7 +10,7 @@ "TemplateIdSubmodelTemplate": "https://example.com/ids/sm/DDDD_DDDD_DDDD_DDDD", "TemplateIdConceptDescription": "https://example.com/ids/cd/DDDD_DDDD_DDDD_DDDD", "EclassDir": ".\\eclass\\", - "LogoFile": "SpecPI40_t.png", + "LogoFile": "PI40_and_IDTA.png", "QualifiersFile": "qualifier-presets.json", "AasxRepositoryFn": "..\\..\\..\\..\\..\\Sample_AAS\\aasxrepo-new.json", "ContentHome": "https://github.com/admin-shell/io/blob/master/README.md", diff --git a/src/AasxPackageExplorer/AasxPackageExplorer.options-for-release.json b/src/AasxPackageExplorer/AasxPackageExplorer.options-for-release.json index 6a261e05d..ff346d04a 100644 --- a/src/AasxPackageExplorer/AasxPackageExplorer.options-for-release.json +++ b/src/AasxPackageExplorer/AasxPackageExplorer.options-for-release.json @@ -10,7 +10,7 @@ "TemplateIdSubmodelTemplate": "https://example.com/ids/sm/DDDD_DDDD_DDDD_DDDD", "TemplateIdConceptDescription": "https://example.com/ids/cd/DDDD_DDDD_DDDD_DDDD", "EclassDir": ".\\eclass\\", - "LogoFile": "SpecPI40_t.png", + "LogoFile": "PI40_and_IDTA.png", "QualifiersFile": "qualifier-presets.json", "AasxRepositoryFn": "..\\..\\..\\..\\..\\Sample_AAS\\aasxrepo-new.json", "ContentHome": "https://github.com/admin-shell/io/blob/master/README.md", diff --git a/src/AasxPackageExplorer/App.config b/src/AasxPackageExplorer/App.config deleted file mode 100644 index 720410c0f..000000000 --- a/src/AasxPackageExplorer/App.config +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/AasxPackageExplorer/App.xaml.cs b/src/AasxPackageExplorer/App.xaml.cs index 53cfcb229..f7a8d0b58 100644 --- a/src/AasxPackageExplorer/App.xaml.cs +++ b/src/AasxPackageExplorer/App.xaml.cs @@ -15,6 +15,8 @@ This source code may use other Open Source software components (see LICENSE.txt) using AasxPackageLogic; using AnyUi; +// [assembly: System.Windows.Media.DisableDpiAwareness] + namespace AasxPackageExplorer { public partial class App : Application @@ -89,6 +91,9 @@ public static OptionsInformation InferOptions(string exePath, string[] args) private void Application_Startup(object sender, StartupEventArgs e) { + // MIHO: This does not work + // WinPInvokeHelpers.SetProcessDPIAware(WinPInvokeHelpers.PROCESS_DPI_AWARENESS.Process_DPI_Unaware); + // allow long term logging (for report box) Log.Singleton.EnableLongTermStore(); @@ -163,6 +168,7 @@ private void Application_Startup(object sender, StartupEventArgs e) } } + // preferences Pref pref = Pref.Read(); // show splash (required for licenses of open source) diff --git a/src/AasxPackageExplorer/CustomSplashScreenNew.xaml b/src/AasxPackageExplorer/CustomSplashScreenNew.xaml index bdec934bb..ebdacafa2 100644 --- a/src/AasxPackageExplorer/CustomSplashScreenNew.xaml +++ b/src/AasxPackageExplorer/CustomSplashScreenNew.xaml @@ -6,7 +6,7 @@ xmlns:local="clr-namespace:AasxPackageExplorer" mc:Ignorable="d" x:Name="splashScreen" - Title="AASX Package Explorer Splash Screen" Width="650" Height="350" Background="White" WindowStyle="None" + Title="AASX Package Explorer Splash Screen" Width="550" Height="350" Background="White" WindowStyle="None" WindowStartupLocation="CenterScreen" Topmost="True" MouseDown="Window_MouseDown"> import into AAS - env = aasItem.theEnv; - aas = aasItem.theAas; - } - else if (DisplayElements.SelectedItem is VisualElementEnvironmentItem envItem && - envItem.theItemType == VisualElementEnvironmentItem.ItemType.EmptySet) - { - // Empty environment is selected --> create new AAS - env = envItem.theEnv; - } - else - { - // Other element is selected --> error - MessageBoxFlyoutShow("Please select the administration shell for the submodel import.", - "Submodel Import", AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); - return; - } - } + return MainMenu?.IsChecked("EventsShowLogMenu") == true; + } -#if !DoNotUseAasxDictionaryImport - var dataChanged = false; - try + public void PanelConcurrentSetVisibleIfRequired( + bool targetState, bool targetAgents = false, bool targetEvents = false) + { + if (!targetState) { - dataChanged = AasxDictionaryImport.Import.ImportSubmodel(this, env, Options.Curr.DictImportDir, aas); + RowDefinitionConcurrent.Height = new GridLength(0); } - catch (Exception e) + else { - Log.Singleton.Error(e, "An error occurred during the submodel import."); - } + if (RowDefinitionConcurrent.Height.Value < 1.0) + { + var desiredH = Math.Max(140.0, this.Height / 3.0); + RowDefinitionConcurrent.Height = new GridLength(desiredH); + } - if (dataChanged) - { - Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; - RestartUIafterNewPackage(); - Mouse.OverrideCursor = null; + if (targetEvents) + TabControlConcurrent.SelectedItem = TabItemConcurrentEvents; + + if (targetAgents) + TabControlConcurrent.SelectedItem = TabItemConcurrentAgents; } -#endif } - public void CommandBinding_ImportSubmodelElements() + public void CommandBinding_CheckAndFix() { - AdminShell.AdministrationShellEnv env = null; - AdminShell.Submodel submodel = null; - if (DisplayElements.SelectedItem is VisualElementSubmodel ves) - { - env = ves.theEnv; - submodel = ves.theSubmodel; - } - else if (DisplayElements.SelectedItem is VisualElementSubmodelRef vesr) - { - env = vesr.theEnv; - submodel = vesr.theSubmodel; - } - else + // work on package + var msgBoxHeadline = "Check, validate and fix .."; + var env = PackageCentral.Main?.AasEnv; + if (env == null) { - MessageBoxFlyoutShow("Please select the submodel for the submodel element import.", - "Submodel Element Import", AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); + MessageBoxFlyoutShow( + "No package/ environment open. Aborting.", msgBoxHeadline, + AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); return; } -#if !DoNotUseAasxDictionaryImport - var dataChanged = false; + // try to get results + AasValidationRecordList recs = null; try { - dataChanged = AasxDictionaryImport.Import.ImportSubmodelElements(this, env, Options.Curr.DictImportDir, - submodel); - } - catch (Exception e) - { - Log.Singleton.Error(e, "An error occurred during the submodel element import."); - } - - if (dataChanged) - { - Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; - RestartUIafterNewPackage(); - Mouse.OverrideCursor = null; - } -#endif - } - - public void CommandBinding_ImportAML() - { - var dlg = new Microsoft.Win32.OpenFileDialog(); - dlg.InitialDirectory = DetermineInitialDirectory(System.AppDomain.CurrentDomain.BaseDirectory); - dlg.Title = "Select AML file to be imported"; - dlg.Filter = "AutomationML files (*.aml)|*.aml|All files (*.*)|*.*"; + // validate (logically) + recs = env.ValidateAll(); - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - var res = dlg.ShowDialog(this); + // validate as XML + var ms = new MemoryStream(); + PackageCentral.Main.SaveAs("noname.xml", true, AdminShellPackageEnv.SerializationFormat.Xml, ms, + saveOnlyCopy: true); + ms.Flush(); + ms.Position = 0; + AasSchemaValidation.ValidateXML(recs, ms); + ms.Close(); - try - { - if (res == true) - { - RememberForInitialDirectory(dlg.FileName); - AasxAmlImExport.AmlImport.ImportInto(_packageCentral.Main, dlg.FileName); - this.RestartUIafterNewPackage(); - } + // validate as JSON + var ms2 = new MemoryStream(); + PackageCentral.Main.SaveAs("noname.json", true, AdminShellPackageEnv.SerializationFormat.Json, ms2, + saveOnlyCopy: true); + ms2.Flush(); + ms2.Position = 0; + AasSchemaValidation.ValidateJSONAlternative(recs, ms2); + ms2.Close(); } catch (Exception ex) { - Log.Singleton.Error(ex, "When importing AML, an error occurred"); + Log.Singleton.Error(ex, "Checking model contents"); + MessageBoxFlyoutShow( + "Error while checking model contents. Aborting.", msgBoxHeadline, + AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); + return; } - if (Options.Curr.UseFlyovers) this.CloseFlyover(); - } - - public void CommandBinding_RDFRead() - - { - VisualElementSubmodelRef ve = null; - if (DisplayElements.SelectedItem != null && DisplayElements.SelectedItem is VisualElementSubmodelRef) - ve = DisplayElements.SelectedItem as VisualElementSubmodelRef; - - if (ve == null || ve.theSubmodel == null || ve.theEnv == null) + // could be nothing + if (recs.Count < 1) { MessageBoxFlyoutShow( - "No valid SubModel selected.", "Import", AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); + "No issues found. Done.", msgBoxHeadline, + AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Information); return; } - // ok! - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - - var dlg = new Microsoft.Win32.OpenFileDialog(); - dlg.InitialDirectory = DetermineInitialDirectory(_packageCentral.MainItem.Filename); - dlg.Title = "Select RDF file to be imported"; - dlg.Filter = "BAMM files (*.ttl)|*.ttl|All files (*.*)|*.*"; - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - var res = dlg.ShowDialog(); - if (res == true) + // prompt for this list + var uc = new ShowValidationResultsFlyout(); + uc.ValidationItems = recs; + this.StartFlyoverModal(uc); + if (uc.FixSelected) + { + // fix + var fixes = recs.FindAll((r) => + { + var res = uc.DoHint && r.Severity == AasValidationSeverity.Hint + || uc.DoWarning && r.Severity == AasValidationSeverity.Warning + || uc.DoSpecViolation && r.Severity == AasValidationSeverity.SpecViolation + || uc.DoSchemaViolation && r.Severity == AasValidationSeverity.SchemaViolation; + return res; + }); + + int done = 0; try { - // do it - RememberForInitialDirectory(dlg.FileName); - AasxBammRdfImExport.BAMMRDFimport.ImportInto( - dlg.FileName, ve.theEnv, ve.theSubmodel, ve.theSubmodelRef); - // redisplay - RedrawAllAasxElements(); - RedrawElementView(); + done = env.AutoFix(fixes); } catch (Exception ex) { - Log.Singleton.Error(ex, "When importing, an error occurred"); + Log.Singleton.Error(ex, "Fixing model contents"); + MessageBoxFlyoutShow( + "Error while fixing issues. Aborting.", msgBoxHeadline, + AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); + return; } - if (Options.Curr.UseFlyovers) this.CloseFlyover(); - } - - + // info + MessageBoxFlyoutShow( + $"Corresponding {done} issues were fixed. Please check the changes and consider saving " + + "with a new filename.", msgBoxHeadline, + AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Information); - public void CommandBinding_ExportAML() + // redraw + CommandExecution_RedrawAll(); + } + } + + public void CommandBinding_ConnectSecure() { - // get the output file - var dlg = new Microsoft.Win32.SaveFileDialog(); - dlg.InitialDirectory = DetermineInitialDirectory(System.AppDomain.CurrentDomain.BaseDirectory); - dlg.Title = "Select AML file to be exported"; - dlg.FileName = "new.aml"; - dlg.DefaultExt = "*.aml"; - dlg.Filter = - "AutomationML files (*.aml)|*.aml|AutomationML files (*.aml) (compact)|" + - "*.aml|All files (*.*)|*.*"; - - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - var res = dlg.ShowDialog(this); + // make dialgue flyout + var uc = new SecureConnectFlyout(); + uc.LoadPresets(Options.Curr.SecureConnectPresets); - try - { - if (res == true) - { - RememberForInitialDirectory(dlg.FileName); - AasxAmlImExport.AmlExport.ExportTo( - _packageCentral.Main, dlg.FileName, tryUseCompactProperties: dlg.FilterIndex == 2); - } - } - catch (Exception ex) + // modal dialogue + this.StartFlyoverModal(uc, closingAction: () => { - Log.Singleton.Error(ex, "When exporting AML, an error occurred"); - } + }); - if (Options.Curr.UseFlyovers) this.CloseFlyover(); - } + // succss? + if (uc.Result == null) + return; + var preset = uc.Result; - public void CommandBinding_ExportNodesetUaPlugin() - { - // get the output file - var dlg = new Microsoft.Win32.SaveFileDialog(); - dlg.InitialDirectory = DetermineInitialDirectory(System.AppDomain.CurrentDomain.BaseDirectory); - dlg.Title = "Select Nodeset2.XML file to be exported"; - dlg.FileName = "new.xml"; - dlg.DefaultExt = "*.xml"; - dlg.Filter = "OPC UA Nodeset2 files (*.xml)|*.xml|All files (*.*)|*.*"; + // make listing flyout + var logger = new LogInstance(); + var uc2 = new LogMessageFlyout("Secure connecting ..", "Start secure connect ..", () => + { + return logger.PopLastShortTermPrint(); + }); + uc2.EnableLargeScreen(); - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - var res = dlg.ShowDialog(this); + // do some statistics + Log.Singleton.Info("Start secure connect .."); + Log.Singleton.Info("Protocol: {0}", preset.Protocol.Value); + Log.Singleton.Info("AuthorizationServer: {0}", preset.AuthorizationServer.Value); + Log.Singleton.Info("AasServer: {0}", preset.AasServer.Value); + Log.Singleton.Info("CertificateFile: {0}", preset.CertificateFile.Value); + Log.Singleton.Info("Password: {0}", preset.Password.Value); - try + logger.Info("Protocol: {0}", preset.Protocol.Value); + logger.Info("AuthorizationServer: {0}", preset.AuthorizationServer.Value); + logger.Info("AasServer: {0}", preset.AasServer.Value); + logger.Info("CertificateFile: {0}", preset.CertificateFile.Value); + logger.Info("Password: {0}", preset.Password.Value); + + // start CONNECT as a worker (will start in the background) + var worker = new BackgroundWorker(); + AdminShellPackageEnv envToload = null; + worker.DoWork += (s1, e1) => { - if (res == true) + for (int i = 0; i < 15; i++) { - RememberForInitialDirectory(dlg.FileName); - CommandBinding_ExecutePluginServer( - "AasxPluginUaNetServer", - "server-start", - "server-stop", - "Export Nodeset2 via OPC UA Server...", - new[] { "-export-nodeset", dlg.FileName } - ); + var sb = new StringBuilder(); + for (double j = 0; j < 1; j += 0.0025) + sb.Append($"{j}"); + logger.Info("The output is: {0} gives {1} was {0}", i, sb.ToString()); + logger.Info(StoredPrint.Color.Blue, "This is blue"); + logger.Info(StoredPrint.Color.Red, "This is red"); + logger.Error("This is an error!"); + logger.InfoWithHyperlink(0, "This is an link", "(Link)", "https://www.google.de"); + logger.Info("----"); + Thread.Sleep(2134); } - } - catch (Exception ex) + + envToload = null; + }; + worker.RunWorkerCompleted += (s1, e1) => { - Log.Singleton.Error( - ex, "When exporting UA nodeset via plug-in, an error occurred"); - } + }; + worker.RunWorkerAsync(); - if (Options.Curr.UseFlyovers) this.CloseFlyover(); - } + // modal dialogue + this.StartFlyoverModal(uc2, closingAction: () => + { + // clean up + }); - public void CommandBinding_CopyClipboardElementJson() - { - // get the selected element - var ve = DisplayElements.SelectedItem; - - // allow only some elements - if (!(ve is VisualElementConceptDescription - || ve is VisualElementSubmodelElement - || ve is VisualElementAdminShell - || ve is VisualElementAsset - || ve is VisualElementOperationVariable - || ve is VisualElementReference - || ve is VisualElementSubmodel - || ve is VisualElementSubmodelRef - || ve is VisualElementView)) - ve = null; - - // need to have business object - var mdo = ve?.GetMainDataObject(); - - if (ve == null || mdo == null) + // commit Package + if (envToload != null) { - MessageBoxFlyoutShow( - "No valid element selected.", "Copy selected elements", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); - return; } - // ok, for Serialization we just want the plain element with no BLOBs.. - var settings = new JsonSerializerSettings(); - settings.ContractResolver = new AdminShellConverters.AdaptiveFilterContractResolver( - deep: false, complete: false); - var jsonStr = JsonConvert.SerializeObject(mdo, Formatting.Indented, settings); + // done + Log.Singleton.Info("Secure connect done."); + } + + public void CommandBinding_ConnectIntegrated() + { + // make dialogue flyout + var uc = new IntegratedConnectFlyout( + PackageCentral, + initialLocation: "" /* "http://admin-shell-io.com:51310/server/getaasx/0" */, + logger: new LogInstance()); + uc.LoadPresets(Options.Curr.IntegratedConnectPresets); - // copy to clipboard - if (jsonStr != null && jsonStr != "") + // modal dialogue + this.StartFlyoverModal(uc, closingAction: () => { - System.Windows.Clipboard.SetText(jsonStr); - Log.Singleton.Info("Copied selected element to clipboard."); - } - else + }); + + // execute + if (uc.Result && uc.ResultContainer != null) { - Log.Singleton.Info("No JSON text could be generated for selected element."); + Log.Singleton.Info($"For integrated connection, trying to take over " + + $"{uc.ResultContainer.ToString()} .."); + try + { + UiLoadPackageWithNew( + PackageCentral.MainItem, null, takeOverContainer: uc.ResultContainer, onlyAuxiliary: false); + } + catch (Exception ex) + { + Log.Singleton.Error(ex, $"When opening {uc.ResultContainer.ToString()}"); + } } } - public void CommandBinding_ExportGenericForms() + public void CommandBinding_PrintAsset( + AasxMenuActionTicket ticket) { - // trivial things - if (!_packageCentral.MainStorable) - { - MessageBoxFlyoutShow( - "An AASX package needs to be open", "Error", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Exclamation); + // rely on ticket availability + if (ticket == null) return; - } - // a SubmodelRef shall be exported - VisualElementSubmodelRef ve1 = null; - if (DisplayElements.SelectedItem != null && DisplayElements.SelectedItem is VisualElementSubmodelRef) - ve1 = DisplayElements.SelectedItem as VisualElementSubmodelRef; + // start + ticket?.StartExec(); - if (ve1 == null || ve1.theSubmodel == null || ve1.theEnv == null) + if (ticket.AAS == null || ticket.AssetInfo?.GlobalAssetId?.IsValid() != true) { - MessageBoxFlyoutShow( - "No valid SubModel selected for exporting options file for GenericForms.", "Generic Forms", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); + Logic?.LogErrorToTicket(ticket, + "No asset selected or no asset identification for printing code sheet."); return; } - // get the output file - var dlg = new Microsoft.Win32.SaveFileDialog(); - dlg.InitialDirectory = DetermineInitialDirectory(System.AppDomain.CurrentDomain.BaseDirectory); - dlg.Title = "Select options file for GenericForms to be exported"; - dlg.FileName = "new.add-options.json"; - dlg.DefaultExt = "*.add-options.json"; - dlg.Filter = "options file for GenericForms (*.add-options.json)|*.add-options.json|All files (*.*)|*.*"; - - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - var res = dlg.ShowDialog(this); - + // ok! + // Note: WPF based; no command line possible try { - if (res == true) - { - Log.Singleton.Info( - "Exporting add-options file to GenericForm: {0}", dlg.FileName); - RememberForInitialDirectory(dlg.FileName); - AasxIntegrationBase.AasForms.AasFormUtils.ExportAsGenericFormsOptions( - ve1.theEnv, ve1.theSubmodel, dlg.FileName); - } + if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); + AasxPrintFunctions.PrintSingleAssetCodeSheet(ticket.AssetInfo.GlobalAssetId.Keys[0].Value, ticket.AAS.IdShort); + if (Options.Curr.UseFlyovers) this.CloseFlyover(); } catch (Exception ex) { - Log.Singleton.Error( - ex, "When exporting options file for GenericForms, an error occurred"); + Logic?.LogErrorToTicket(ticket, ex, "When printing"); } - - if (Options.Curr.UseFlyovers) this.CloseFlyover(); } - public void CommandBinding_ExportPredefineConcepts() + public void CommandBinding_ServerRest() { - // trivial things - if (!_packageCentral.MainAvailable) +#if TODO + // make a logger + var logger = new AasxRestServerLibrary.GrapevineLoggerToListOfStrings(); + + // make listing flyout + var uc = new LogMessageFlyout("AASX REST Server", "Starting REST server ..", () => { - MessageBoxFlyoutShow( - "An AASX package needs to be open", "Error", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Exclamation); - return; - } + var st = logger.Pop(); + return (st == null) ? null : new StoredPrint(st); + }); - // a SubmodelRef shall be exported - VisualElementSubmodelRef ve1 = null; - if (DisplayElements.SelectedItem != null && DisplayElements.SelectedItem is VisualElementSubmodelRef) - ve1 = DisplayElements.SelectedItem as VisualElementSubmodelRef; + // start REST as a worker (will start in the background) + var worker = new BackgroundWorker(); + worker.DoWork += (s1, e1) => + { + AasxRestServerLibrary.AasxRestServer.Start( + _packageCentral.Main, Options.Curr.RestServerHost, Options.Curr.RestServerPort, logger); + }; + worker.RunWorkerAsync(); - if (ve1 == null || ve1.theSubmodel == null || ve1.theEnv == null) + // modal dialogue + this.StartFlyoverModal(uc, closingAction: () => { - MessageBoxFlyoutShow( - "No valid SubModel selected for exporting snippets.", "Snippets for PredefinedConcepts", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); + AasxRestServerLibrary.AasxRestServer.Stop(); + }); +#endif + } + + public class FlyoutAgentMqttPublisher : FlyoutAgentBase + { + public AasxMqttClient.AnyUiDialogueDataMqttPublisher DiaData; + public AasxMqttClient.GrapevineLoggerToStoredPrints Logger; + public AasxMqttClient.MqttClient Client; + public BackgroundWorker Worker; + } + + public void CommandBinding_MQTTPub() + { + + // make an agent + var agent = new FlyoutAgentMqttPublisher(); + + // ask for preferences + agent.DiaData = AasxMqttClient.AnyUiDialogueDataMqttPublisher.CreateWithOptions("AASQ MQTT publisher ..", + jtoken: Options.Curr.MqttPublisherOptions); + var uc1 = new MqttPublisherFlyout(agent.DiaData); + this.StartFlyoverModal(uc1); + if (!uc1.Result) return; - } - // get the output file - var dlg = new Microsoft.Win32.SaveFileDialog(); - dlg.InitialDirectory = DetermineInitialDirectory(System.AppDomain.CurrentDomain.BaseDirectory); - dlg.Title = "Select text file for PredefinedConcepts to be exported"; - dlg.FileName = "new.txt"; - dlg.DefaultExt = "*.txt"; - dlg.Filter = "Text file for PredefinedConcepts (*.txt)|*.txt|All files (*.*)|*.*"; + // make a logger + agent.Logger = new AasxMqttClient.GrapevineLoggerToStoredPrints(); - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - var res = dlg.ShowDialog(this); + // make listing flyout + var uc2 = new LogMessageFlyout("AASX MQTT Publisher", "Starting MQTT Client ..", () => + { + var sp = agent.Logger.Pop(); + return sp; + }); + uc2.Agent = agent; - try + // start MQTT Client as a worker (will start in the background) + agent.Client = new AasxMqttClient.MqttClient(); + agent.Worker = new BackgroundWorker(); + agent.Worker.DoWork += async (s1, e1) => { - if (res == true) + try { - RememberForInitialDirectory(dlg.FileName); - Log.Singleton.Info( - "Exporting text snippets for PredefinedConcepts: {0}", dlg.FileName); - AasxPredefinedConcepts.ExportPredefinedConcepts.Export( - _packageCentral.Main.AasEnv, ve1.theSubmodel, dlg.FileName); + await agent.Client.StartAsync(PackageCentral.Main, agent.DiaData, agent.Logger); } - } - catch (Exception ex) + catch (Exception e) + { + agent.Logger.Error(e); + } + }; + agent.Worker.RunWorkerAsync(); + + // wire events + agent.EventTriggered += (ev) => { - Log.Singleton.Error( - ex, "When exporting text snippets for PredefinedConcepts, an error occurred"); - } + // trivial + if (ev == null) + return; + + // safe + try + { + // potentially expensive .. get more context for the event source + ExtendEnvironment.ReferableRootInfo foundRI = null; + if (PackageCentral != null && ev.Source?.Keys != null) + foreach (var pck in PackageCentral.GetAllPackageEnv()) + { + var ri = new ExtendEnvironment.ReferableRootInfo(); + var res = pck?.AasEnv?.FindReferableByReference(ev.Source, rootInfo: ri); + if (res != null && ri.IsValid) + foundRI = ri; + } + + // publish + agent.Client?.PublishEvent(ev, foundRI); + } + catch (Exception e) + { + agent.Logger.Error(e); + } + }; + + agent.GenerateFlyoutMini = () => + { + var storedAgent = agent; + var mini = new LogMessageMiniFlyout("AASX MQTT Publisher", "Executing minimized ..", () => + { + var sp = storedAgent.Logger.Pop(); + return sp; + }); + mini.Agent = agent; + return mini; + }; - if (Options.Curr.UseFlyovers) this.CloseFlyover(); + // modal dialogue + this.StartFlyoverModal(uc2, closingAction: () => { }); } - public void CommandBinding_ConvertElement() + static string lastConnectInput = ""; + public async void CommandBinding_ConnectRest() { - // trivial things - if (!_packageCentral.MainStorable) + var uc = new TextBoxFlyout("REST server adress:", AnyUiMessageBoxImage.Question); + if (lastConnectInput == "") { - MessageBoxFlyoutShow( - "An AASX package needs to be open for storage", "Error", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Exclamation); - return; + uc.Text = "http://" + Options.Curr.RestServerHost + ":" + Options.Curr.RestServerPort; } - - // a Referable shall be exported - AdminShell.Referable rf = null; - object bo = null; - if (DisplayElements.SelectedItem != null) + else { - bo = DisplayElements.SelectedItem.GetMainDataObject(); - rf = DisplayElements.SelectedItem.GetDereferencedMainDataObject() as AdminShell.Referable; + uc.Text = lastConnectInput; } - - if (rf == null) + this.StartFlyoverModal(uc); + if (uc.Result) { - MessageBoxFlyoutShow( - "No valid Referable selected for conversion.", "Convert Referable", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); - return; - } + string value = ""; + string input = uc.Text.ToLower(); + lastConnectInput = input; + if (!input.StartsWith("http://localhost:1111")) + { + string tag = ""; + bool connect = false; - // try to get offers - var offers = AasxPredefinedConcepts.Convert.ConvertPredefinedConcepts.CheckForOffers(rf); - if (offers == null || offers.Count < 1) - { - MessageBoxFlyoutShow( - "No valid conversion offers found for this Referable. Aborting.", "Convert Referable", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); - return; - } + if (input.Contains("/getaasxbyassetid/")) // get by AssetID + { + if (PackageCentral.MainAvailable) + PackageCentral.MainItem.Close(); + System.IO.File.Delete(AasxOpenIdClient.OpenIDClient.outputDir + "\\download.aasx"); + + var handler = new HttpClientHandler(); + handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; + //// handler.AllowAutoRedirect = false; - // convert these to list items - var fol = new List(); - foreach (var o in offers) - fol.Add(new AnyUiDialogueListItem(o.OfferDisplay, o)); + string dataServer = new Uri(input).GetLeftPart(UriPartial.Authority); - // show a list - // prompt for this list - var uc = new SelectFromListFlyout(); - uc.DiaData.Caption = "Select Conversion action to be executed .."; - uc.DiaData.ListOfItems = fol; - this.StartFlyoverModal(uc); - if (uc.DiaData.ResultItem != null && uc.DiaData.ResultItem.Tag != null && - uc.DiaData.ResultItem.Tag is AasxPredefinedConcepts.Convert.ConvertOfferBase) - try + var client = new HttpClient(handler) + { + BaseAddress = new Uri(dataServer) + }; + input = input.Substring(dataServer.Length, input.Length - dataServer.Length); + client.DefaultRequestHeaders.Add("Accept", "application/aas"); + var response2 = await client.GetAsync(input); + + // ReSharper disable PossibleNullReferenceException + var contentStream = await response2?.Content?.ReadAsStreamAsync(); + if (contentStream == null) + return; + // ReSharper enable PossibleNullReferenceException + + string outputDir = "."; + Console.WriteLine("Writing file: " + outputDir + "\\" + "download.aasx"); + using (var file = new FileStream(outputDir + "\\" + "download.aasx", + FileMode.Create, FileAccess.Write, FileShare.None)) + { + await contentStream.CopyToAsync(file); + } + + if (System.IO.File.Exists(AasxOpenIdClient.OpenIDClient.outputDir + "\\download.aasx")) + UiLoadPackageWithNew( + PackageCentral.MainItem, + null, + AasxOpenIdClient.OpenIDClient.outputDir + "\\download.aasx", onlyAuxiliary: false); + return; + } + else + { + tag = "http"; + tag = input.Substring(0, tag.Length); + if (tag == "http") + { + connect = true; + tag = "openid "; + value = input; + } + else + { + tag = "openid1"; + tag = input.Substring(0, tag.Length); + if (tag == "openid " || tag == "openid1" || tag == "openid2" || tag == "openid3") + { + connect = true; + value = input.Substring(tag.Length); + } + } + } + + if (connect) + { + if (PackageCentral.MainAvailable) + PackageCentral.MainItem.Close(); + System.IO.File.Delete(AasxOpenIdClient.OpenIDClient.outputDir + "\\download.aasx"); + await AasxOpenIdClient.OpenIDClient.Run(tag, value/*, this*/); + + if (System.IO.File.Exists(AasxOpenIdClient.OpenIDClient.outputDir + "\\download.aasx")) + UiLoadPackageWithNew( + PackageCentral.MainItem, + null, + AasxOpenIdClient.OpenIDClient.outputDir + "\\download.aasx", onlyAuxiliary: false); + } + } + else { + var url = uc.Text; + Log.Singleton.Info($"Connecting to REST server {url} .."); + + try + { +#if TODO + var client = new AasxRestServerLibrary.AasxRestClient(url); + theOnlineConnection = client; + var pe = client.OpenPackageByAasEnv(); + if (pe != null) + UiLoadPackageWithNew(_packageCentral.MainItem, pe, info: uc.Text, onlyAuxiliary: false); +#endif + } + catch (Exception ex) { - var offer = uc.DiaData.ResultItem.Tag as AasxPredefinedConcepts.Convert.ConvertOfferBase; - offer?.Provider?.ExecuteOffer( - _packageCentral.Main, rf, offer, deleteOldCDs: true, addNewCDs: true); + Log.Singleton.Error(ex, $"Connecting to REST server {url}"); } } - catch (Exception ex) - { - Log.Singleton.Error(ex, "Executing user defined conversion"); - } - - // redisplay - // add to "normal" event quoue - DispEditEntityPanel.AddWishForOutsideAction(new AnyUiLambdaActionRedrawAllElements(bo)); + } } - public void CommandBinding_ExportImportTableUml( - bool import = false, bool exportUml = false, bool importTimeSeries = false) + private void CommandBinding_ExecutePluginServer( + string pluginName, string actionName, string stopName, string caption, string[] additionalArgs = null) { - // trivial things - if (!_packageCentral.MainAvailable) - { - MessageBoxFlyoutShow( - "An AASX package needs to be open", "Error", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Exclamation); - return; - } - - // a SubmodelRef shall be exported/ imported - VisualElementSubmodelRef ve1 = null; - if (DisplayElements.SelectedItem != null && DisplayElements.SelectedItem is VisualElementSubmodelRef) - ve1 = DisplayElements.SelectedItem as VisualElementSubmodelRef; - - if (ve1 == null || ve1.theSubmodel == null || ve1.theEnv == null) - { - MessageBoxFlyoutShow( - "No valid Submodel selected for exporting/ importing.", "Export table/ UML/ time series", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); - return; - } - - // check, if required plugin can be found - var pluginName = "AasxPluginExportTable"; - var actionName = (!import) ? "export-submodel" : "import-submodel"; - if (exportUml) - actionName = "export-uml"; - if (importTimeSeries) - actionName = "import-time-series"; + // check var pi = Plugins.FindPluginInstance(pluginName); - if (pi == null || !pi.HasAction(actionName)) + if (pi == null || !pi.HasAction(actionName) || !pi.HasAction(stopName)) { var res = MessageBoxFlyoutShow( $"This function requires a binary plug-in file named '{pluginName}', " + $"which needs to be added to the command line, with an action named '{actionName}'. " + - $"Press 'OK' to show help page on GitHub.", + "Press 'OK' to show help page on GitHub.", "Plug-in not present", AnyUiMessageBoxButton.OKCancel, AnyUiMessageBoxImage.Hand); if (res == AnyUiMessageBoxResult.OK) @@ -3232,353 +887,563 @@ public void CommandBinding_ExportImportTableUml( return; } - // try activate plugin - pi.InvokeAction(actionName, this, ve1.theEnv, ve1.theSubmodel); - - // redraw - CommandExecution_RedrawAll(); - } - - public void CommandBinding_SubmodelTDExport() - { - VisualElementSubmodelRef ve1 = null; + // activate server via plugin + // make listing flyout + var uc = new LogMessageFlyout(caption, $"Starting plug-in {pluginName}, action {actionName} ..", () => + { + return this.FlyoutLoggingPop(); + }); - if (DisplayElements.SelectedItem != null && DisplayElements.SelectedItem is VisualElementSubmodelRef) - ve1 = DisplayElements.SelectedItem as VisualElementSubmodelRef; + this.FlyoutLoggingStart(); - if (ve1 == null || ve1.theSubmodel == null || ve1.theEnv == null) + uc.ControlCloseWarnTime = 10000; + uc.ControlWillBeClosed += () => { - MessageBoxFlyoutShow( - "No valid SubModel is selected.", "Unable to create TD JSON LD document", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); - return; - } - var obj = ve1.theSubmodel; + uc.LogMessage("Initiating closing (wait at max 10sec) .."); + pi.InvokeAction(stopName); + }; + uc.AddPatternError(new Regex(@"^\[1\]")); - // ok! - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - - var dlg = new Microsoft.Win32.SaveFileDialog(); - dlg.InitialDirectory = DetermineInitialDirectory(_packageCentral.MainItem.Filename); - dlg.FileName = "Submodel_" + obj.idShort + ".jsonld"; - dlg.Filter = "JSON files (*.JSONLD)|*.jsonld"; - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - var res = dlg.ShowDialog(); - if (res == true) + // start server as a worker (will start in the background) + var worker = new BackgroundWorker(); + worker.WorkerSupportsCancellation = true; + worker.DoWork += (s1, e1) => { - JObject exportData = TDJsonExport.ExportSMtoJson(ve1.theSubmodel); - if (exportData["status"].ToString() == "success") + try { - RememberForInitialDirectory(dlg.FileName); - using (var s = new StreamWriter(dlg.FileName)) - { - string output = Newtonsoft.Json.JsonConvert.SerializeObject(exportData["data"], - Newtonsoft.Json.Formatting.Indented); - s.WriteLine(output); - } + // total argument list + var totalArgs = new List(); + if (pi.args != null) + totalArgs.AddRange(pi.args); + if (additionalArgs != null) + totalArgs.AddRange(additionalArgs); + + // invoke + pi.InvokeAction(actionName, PackageCentral.Main, totalArgs.ToArray()); + } - else + catch (Exception ex) { - MessageBoxFlyoutShow( - "Unable to Import the JSON LD File", exportData["data"].ToString(), - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); + uc.LogMessage("Exception in plug-in: " + ex.Message + " in " + ex.StackTrace); + uc.LogMessage("Stopping..."); + Thread.Sleep(5000); } + }; + worker.RunWorkerCompleted += (s1, e1) => + { + // in any case, close flyover + this.FlyoutLoggingStop(); + uc.LogMessage("Completed."); + uc.CloseControlExplicit(); + }; + worker.RunWorkerAsync(); - } - if (Options.Curr.UseFlyovers) this.CloseFlyover(); + // modal dialogue + this.StartFlyoverModal(uc, closingAction: () => + { +#if FALSE + if (false && worker.IsBusy) + try + { + worker.CancelAsync(); + worker.Dispose(); + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); + } +#endif + }); } - public void CommandBinding_NewSubmodelFromPlugin() + /// + /// Selects Submodel and Env from DisplayElements. + /// In future, may be take from ticket. + /// Checks, if these are not NULL or logs a message. + /// + /// Success + public bool MenuSelectEnvSubmodel( + AasxMenuActionTicket ticket, + out Aas.Environment env, + out Aas.Submodel sm, + out Aas.Reference smr, + string msg) { - // trivial things - if (!_packageCentral.MainStorable) + env = null; + sm = null; + smr = null; + if (DisplayElements.SelectedItem is VisualElementSubmodelRef vesmr) { - MessageBoxFlyoutShow( - "An AASX package needs to be open for storage", "Error" - , AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Exclamation); - return; + env = vesmr.theEnv; + sm = vesmr.theSubmodel; + smr = vesmr.theSubmodelRef; + } + if (DisplayElements.SelectedItem is VisualElementSubmodel vesm) + { + env = vesm.theEnv; + sm = vesm.theSubmodel; } - // an AAS needs to be selected - VisualElementAdminShell ve1 = null; - if (DisplayElements.SelectedItem != null && DisplayElements.SelectedItem is VisualElementAdminShell) - ve1 = DisplayElements.SelectedItem as VisualElementAdminShell; - - if (ve1 == null || ve1.theAas == null || ve1.theEnv == null) + if (sm == null || env == null) { - MessageBoxFlyoutShow( - "No valid AAS selected for creating a new Submodel.", "New Submodel from plugins", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); - return; + Logic?.LogErrorToTicket(ticket, "Submodel Read: No valid SubModel selected."); + return false; } - // create a list of plugins, which are capable of generating Submodels - var listOfSm = new List(); - foreach (var lpi in Plugins.LoadedPlugins.Values) + return true; + } + + /// + /// Selects a filename to read either from user or from ticket. + /// + /// Success + public bool MenuSelectOpenFilename( + AasxMenuActionTicket ticket, + string argName, + string caption, + string proposeFn, + string filter, + out string sourceFn, + string msg) + { + // filename + sourceFn = ticket?[argName] as string; + + if (sourceFn?.HasContent() != true) { - if (lpi.HasAction("get-list-new-submodel")) - try - { - var lpires = lpi.InvokeAction("get-list-new-submodel") as AasxPluginResultBaseObject; - if (lpires != null) - { - var lpireslist = lpires.obj as List; - if (lpireslist != null) - foreach (var smname in lpireslist) - listOfSm.Add(new AnyUiDialogueListItem( - "" + lpi.name + " | " + "" + smname, - new Tuple(lpi, smname) - )); - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } + if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); + + var dlg = new Microsoft.Win32.OpenFileDialog(); + dlg.InitialDirectory = DetermineInitialDirectory(System.AppDomain.CurrentDomain.BaseDirectory); + if (caption != null) + dlg.Title = caption; + if (proposeFn != null) + dlg.FileName = proposeFn; + if (filter != null) + dlg.Filter = filter; + + if (true == dlg.ShowDialog()) + { + RememberForInitialDirectory(sourceFn); + sourceFn = dlg.FileName; + } + + if (Options.Curr.UseFlyovers) this.CloseFlyover(); } - // could be nothing - if (listOfSm.Count < 1) + if (sourceFn?.HasContent() != true) { - MessageBoxFlyoutShow( - "No plugins generating Submodels found. Aborting.", "New Submodel from plugins", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); - return; + Logic?.LogErrorToTicketOrSilent(ticket, msg); + return false; } - // prompt for this list - var uc = new SelectFromListFlyout(); - uc.DiaData.Caption = "Select Plug-in and Submodel to be generated .."; - uc.DiaData.ListOfItems = listOfSm; - this.StartFlyoverModal(uc); - if (uc.DiaData.ResultItem != null && uc.DiaData.ResultItem.Tag != null && - uc.DiaData.ResultItem.Tag is Tuple) + return true; + } + + public void CommandBinding_ImportDictToSubmodel( + string cmd, + AasxMenuActionTicket ticket = null) + { + // These 2 functions are using WPF and cannot migrated to PackageLogic + + // REFACTOR: NO + if (cmd == "importdictsubmodel") { - // get result arguments - var TagTuple = uc.DiaData.ResultItem.Tag as Tuple; - var lpi = TagTuple?.Item1; - var smname = TagTuple?.Item2; - if (lpi == null || smname == null || smname.Length < 1) - { - MessageBoxFlyoutShow( - "Error accessing plugins. Aborting.", "New Submodel from plugins", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); - return; - } + // start + ticket?.StartExec(); - // try to invoke plugin to get submodel - AdminShell.Submodel smres = null; - AdminShell.ListOfConceptDescriptions cdres = null; - try + // which item selected? + Aas.Environment env = PackageCentral.Main.AasEnv; + Aas.AssetAdministrationShell aas = null; + if (DisplayElements.SelectedItem != null) { - var res = lpi.InvokeAction("generate-submodel", smname) as AasxPluginResultBase; - if (res is AasxPluginResultBaseObject rbo) + if (DisplayElements.SelectedItem is VisualElementAdminShell aasItem) { - smres = rbo.obj as AdminShell.Submodel; + // AAS is selected --> import into AAS + env = aasItem.theEnv; + aas = aasItem.theAas; } - if (res is AasxPluginResultGenerateSubmodel rgsm) + else if (DisplayElements.SelectedItem is VisualElementEnvironmentItem envItem && + envItem.theItemType == VisualElementEnvironmentItem.ItemType.EmptySet) { - smres = rgsm.sm; - cdres = rgsm.cds; + // Empty environment is selected --> create new AAS + env = envItem.theEnv; + } + else + { + // Other element is selected --> error + Logic?.LogErrorToTicket(ticket, + "Dictionary Import: Please select the administration shell for the submodel import."); + return; } } + +#if !DoNotUseAasxDictionaryImport + var dataChanged = false; + try + { + dataChanged = AasxDictionaryImport.Import.ImportSubmodel(this, env, Options.Curr.DictImportDir, aas); + } catch (Exception ex) { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); + Logic?.LogErrorToTicket(ticket, ex, "An error occurred during the Dictionary import."); } - // something - if (smres == null) + if (dataChanged) { - MessageBoxFlyoutShow( - "Error accessing plugins. Aborting.", "New Submodel from plugins", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Error); + Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; + RestartUIafterNewPackage(); + Mouse.OverrideCursor = null; + } +#endif + } + + // REFACTOR: NO + if (cmd == "importdictsubmodelelements") + { + // start + ticket?.StartExec(); + + // current Submodel + // ReSharper disable UnusedVariable + if (!MenuSelectEnvSubmodel( + ticket, + out var env, out var sm, out var smr, + "Dictionary import: No valid Submodel selected.")) return; - } + // ReSharper enable UnusedVariable +#if !DoNotUseAasxDictionaryImport + var dataChanged = false; try { - // Submodel needs an identification - smres.identification = new AdminShell.Identification("IRI", ""); - if (smres.kind == null || smres.kind.IsInstance) - smres.identification.id = AdminShellUtil.GenerateIdAccordingTemplate( - Options.Curr.TemplateIdSubmodelInstance); - else - smres.identification.id = AdminShellUtil.GenerateIdAccordingTemplate( - Options.Curr.TemplateIdSubmodelTemplate); + dataChanged = AasxDictionaryImport.Import.ImportSubmodelElements( + this, env, Options.Curr.DictImportDir, sm); + } + catch (Exception ex) + { + Logic?.LogErrorToTicket(ticket, ex, "An error occurred during the submodel element import."); + } - // add Submodel - var smref = new AdminShell.SubmodelRef(smres.GetReference()); - ve1.theAas.AddSubmodelRef(smref); - _packageCentral.Main.AasEnv.Submodels.Add(smres); + if (dataChanged) + { + Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; + RestartUIafterNewPackage(); + Mouse.OverrideCursor = null; + } +#endif + } + } - // add ConceptDescriptions? - if (cdres != null && cdres.Count > 0) - { - int nr = 0; - foreach (var cd in cdres) - { - if (cd == null || cd.identification == null) - continue; - var cdFound = ve1.theEnv.FindConceptDescription(cd.identification); - if (cdFound != null) - continue; - // ok, add - var newCd = new AdminShell.ConceptDescription(cd); - ve1.theEnv.ConceptDescriptions.Add(newCd); - nr++; - } - Log.Singleton.Info( - $"added {nr} ConceptDescritions for Submodel {smres.idShort}."); - } - // redisplay - // add to "normal" event quoue - DispEditEntityPanel.AddWishForOutsideAction(new AnyUiLambdaActionRedrawAllElements(smref)); + public async Task CommandBinding_ExportNodesetUaPlugin( + string cmd, + AasxMenuActionTicket ticket) + { + if (cmd == "opcuaexportnodesetuaplugin") + { + // filename + // ReSharper disable UnusedVariable + var uc = await DisplayContext.MenuSelectSaveFilenameAsync( + ticket, "File", + "Select Nodeset2.XML file to be exported", + "new.xml", + "OPC UA Nodeset2 files (*.xml)|*.xml|All files (*.*)|*.*", + "Export OPC UA Nodeset2 via plugin: No valid filename."); + if (uc?.Result != true) + return; + // ReSharper enable UnusedVariable + try + { + RememberForInitialDirectory(uc.TargetFileName); + CommandBinding_ExecutePluginServer( + "AasxPluginUaNetServer", + "server-start", + "server-stop", + "Export Nodeset2 via OPC UA Server...", + new[] { "-export-nodeset", uc.TargetFileName } + ); } catch (Exception ex) { - Log.Singleton.Error(ex, "when adding Submodel to AAS"); + Log.Singleton.Error( + ex, "When exporting UA nodeset via plug-in, an error occurred"); } } } - public void CommandBinding_ToolsFind(string cmd) + public async Task CommandBinding_ExportImportTableUml( + string cmd, + AasxMenuActionTicket ticket, + bool import = false, bool exportUml = false, bool importTimeSeries = false) + { + // rely on ticket availability + if (ticket == null) + return; + + // start + ticket.StartExec(); + + // help (called later) + Action callHelp = () => + { + try + { + BrowserDisplayLocalFile( + "https://github.com/admin-shell-io/aasx-package-explorer/" + + "tree/master/src/AasxPluginExportTable/help", + System.Net.Mime.MediaTypeNames.Text.Html, + preferInternal: true); + } + catch (Exception ex) + { + Logic?.LogErrorToTicket(ticket, ex, + $"Import/Export: While displaying html-based help."); + } + }; + + //if (cmd == "exporttable" || cmd == "importtable") + //{ + // if (ticket?.ScriptMode != true) + // { + // // interactive + // // handle the export dialogue + // var uc = new ExportTableFlyout((cmd == "exporttable") + // ? "Export SubmodelElements as Table" + // : "Import SubmodelElements from Table"); + // uc.Presets = Logic?.GetImportExportTablePreset().Item1; + + // StartFlyoverModal(uc); + + // if (uc.CloseForHelp) + // { + // callHelp?.Invoke(); + // return; + // } + + // if (uc.Result == null) + // return; + + // // have a result + // var record = uc.Result; + + // // be a little bit specific + // var dlgTitle = "Select text file to be exported"; + // var dlgFileName = ""; + // var dlgFilter = ""; + + // if (record.Format == (int)ImportExportTableRecord.FormatEnum.TSF) + // { + // dlgFileName = "new.txt"; + // dlgFilter = + // "Tab separated file (*.txt)|*.txt|Tab separated file (*.tsf)|*.tsf|All files (*.*)|*.*"; + // } + // if (record.Format == (int)ImportExportTableRecord.FormatEnum.LaTex) + // { + // dlgFileName = "new.tex"; + // dlgFilter = "LaTex file (*.tex)|*.tex|All files (*.*)|*.*"; + // } + // if (record.Format == (int)ImportExportTableRecord.FormatEnum.Excel) + // { + // dlgFileName = "new.xlsx"; + // dlgFilter = "Microsoft Excel (*.xlsx)|*.xlsx|All files (*.*)|*.*"; + // } + // if (record.Format == (int)ImportExportTableRecord.FormatEnum.Word) + // { + // dlgFileName = "new.docx"; + // dlgFilter = "Microsoft Word (*.docx)|*.docx|All files (*.*)|*.*"; + // } + // if (record.Format == (int)ImportExportTableRecord.FormatEnum.NarkdownGH) + // { + // dlgFileName = "new.md"; + // dlgFilter = "Markdown (*.md)|*.md|All files (*.*)|*.*"; + // } + + // // store + // ticket["Record"] = record; + + // // ask now for a filename + // if (!(await DisplayContext.MenuSelectSaveFilenameToTicketAsync( + // ticket, "File", + // dlgTitle, + // dlgFileName, + // dlgFilter, + // "Import/ export table: No valid filename."))) + // return; + // } + + // // pass on + // try + // { + // Logic?.CommandBinding_GeneralDispatchHeadless(cmd, null, ticket); + // } + // catch (Exception ex) + // { + // Logic?.LogErrorToTicket(ticket, ex, "Import/export table: passing on."); + // } + //} + + //if (cmd == "importtimeseries") + //{ + // if (ticket?.ScriptMode != true) + // { + // // interactive + // // handle the export dialogue + // var uc = new ImportTimeSeriesFlyout(); + // uc.Result = Logic?.GetImportExportTablePreset().Item3 ?? new ImportTimeSeriesRecord(); + + // StartFlyoverModal(uc); + + // if (uc.Result == null) + // return; + + // // have a result + // var result = uc.Result; + + // // store + // ticket["Record"] = result; + + // // be a little bit specific + // var dlgTitle = "Select file for time series import .."; + // var dlgFilter = "All files (*.*)|*.*"; + + // if (result.Format == (int)ImportTimeSeriesRecord.FormatEnum.Excel) + // { + // dlgFilter = + // "Tab separated file (*.txt)|*.txt|Tab separated file (*.tsf)|*.tsf|All files (*.*)|*.*"; + // } + + // // ask now for a filename + // if (!(await DisplayContext.MenuSelectOpenFilenameToTicketAsync( + // ticket, "File", + // dlgTitle, + // null, + // dlgFilter, + // "Import time series: No valid filename."))) + // return; + // } + + // // pass on + // try + // { + // Logic?.CommandBinding_GeneralDispatchHeadless(cmd, null, ticket); + // } + // catch (Exception ex) + // { + // Logic?.LogErrorToTicket(ticket, ex, "Import time series: passing on."); + // } + //} + + // redraw + CommandExecution_RedrawAll(); + } + + public async Task CommandBinding_ToolsFind( + string cmd, + AasxMenuActionTicket ticket) { // access if (ToolsGrid == null || TabControlTools == null || TabItemToolsFind == null || ToolFindReplace == null) return; - if (cmd == "toolsfindtext") + if (cmd == "toolsfindtext" || cmd == "toolsreplacetext") { + // start + ticket.StartExec(); + // make panel visible ToolsGrid.Visibility = Visibility.Visible; TabControlTools.SelectedItem = TabItemToolsFind; // set the link to the AAS environment // Note: dangerous, as it might change WHILE the find tool is opened! - ToolFindReplace.TheAasEnv = _packageCentral.Main?.AasEnv; + ToolFindReplace.TheAasEnv = PackageCentral.Main?.AasEnv; // cursor ToolFindReplace.FocusFirstField(); - } - - if (cmd == "toolsfindforward") - ToolFindReplace.FindForward(); - - if (cmd == "toolsfindbackward") - ToolFindReplace.FindBackward(); - } - public void CommandBinding_ImportOPCUANodeSet() - { - //choose File to import to - var dlg = new Microsoft.Win32.OpenFileDialog(); - dlg.InitialDirectory = DetermineInitialDirectory(System.AppDomain.CurrentDomain.BaseDirectory); - dlg.FileName = "Document"; // Default file name - dlg.DefaultExt = ".xml"; // Default file extension - dlg.Filter = "XML File (.xml)|*.xml|Text documents (.txt)|*.txt"; // Filter files by extension - - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - var result = dlg.ShowDialog(); + // if in script mode, directly start + if (ticket.ScriptMode) + { + if (cmd == "toolsfindtext" || cmd == "toolsreplacetext") + ToolFindReplace.FindStart(ticket); - if (result == true) - { - RememberForInitialDirectory(dlg.FileName); - UANodeSet InformationModel = UANodeSetExport.getInformationModel(dlg.FileName); - _packageCentral.MainItem.TakeOver(UANodeSetImport.Import(InformationModel)); - RestartUIafterNewPackage(); - } + var dos = (ticket["Do"] as string).Trim().ToLower(); + if (cmd == "toolsreplacetext" && dos == "stay") + ToolFindReplace.ReplaceStay(ticket); - if (Options.Curr.UseFlyovers) this.CloseFlyover(); - } + if (cmd == "toolsreplacetext" && dos == "forward") + ToolFindReplace.ReplaceForward(ticket); - public void CommandBinding_ExportOPCUANodeSet() - { - // try to access I4AAS export information - UANodeSet InformationModel = null; - try - { - var xstream = Assembly.GetExecutingAssembly().GetManifestResourceStream( - "AasxPackageExplorer.Resources.i4AASCS.xml"); + if (cmd == "toolsreplacetext" && dos == "all") + ToolFindReplace.ReplaceAll(ticket); - InformationModel = UANodeSetExport.getInformationModel(xstream); - } - catch (Exception ex) - { - Log.Singleton.Error(ex, "when accessing i4AASCS.xml mapping types."); - return; + // update on screen + await MainTimer_HandleEntityPanel(); + ticket.SleepForVisual = 2; + } } - Log.Singleton.Info("Mapping types loaded."); - // ReSharper enable PossibleNullReferenceException - try + if (cmd == "toolsfindforward" || cmd == "toolsfindbackward" + || cmd == "toolsreplacestay" + || cmd == "toolsreplaceforward" + || cmd == "toolsreplaceall") { - var dlg = new Microsoft.Win32.SaveFileDialog(); - dlg.InitialDirectory = DetermineInitialDirectory(System.AppDomain.CurrentDomain.BaseDirectory); - dlg.Title = "Select Nodeset file to be exported"; - dlg.FileName = "new.xml"; - dlg.DefaultExt = "*.xml"; - dlg.Filter = "XML File (.xml)|*.xml|Text documents (.txt)|*.txt"; + // start + ticket.StartExec(); - if (Options.Curr.UseFlyovers) this.StartFlyover(new EmptyFlyout()); - var res = true == dlg.ShowDialog(this); - if (Options.Curr.UseFlyovers) this.CloseFlyover(); - if (!res) - return; + if (cmd == "toolsfindforward") + ToolFindReplace.FindForward(ticket); - RememberForInitialDirectory(dlg.FileName); + if (cmd == "toolsfindbackward") + ToolFindReplace.FindBackward(ticket); - UANodeSetExport.root = InformationModel.Items.ToList(); + if (cmd == "toolsreplacestay") + ToolFindReplace.ReplaceStay(ticket); - foreach (AdminShellV20.Asset ass in _packageCentral.Main.AasEnv.Assets) - { - UANodeSetExport.CreateAAS(ass.idShort, _packageCentral.Main.AasEnv); - } + if (cmd == "toolsreplaceforward") + ToolFindReplace.ReplaceForward(ticket); - InformationModel.Items = UANodeSetExport.root.ToArray(); + if (cmd == "toolsreplaceall") + ToolFindReplace.ReplaceAll(ticket); - using (var writer = new System.IO.StreamWriter(dlg.FileName)) + // complete the selection + if (ticket.ScriptMode) { - var serializer = new XmlSerializer(InformationModel.GetType()); - serializer.Serialize(writer, InformationModel); - writer.Flush(); + await MainTimer_HandleEntityPanel(); + ticket.SleepForVisual = 2; } - - Log.Singleton.Info("i4AAS based OPC UA mapping exported: " + dlg.FileName); - } - catch (Exception ex) - { - Log.Singleton.Error(ex, "when exporting i4AAS based OPC UA mapping."); } } - public void CommandBinding_ExportSMD() + public void CommandBinding_ExportSMD( + AasxMenuActionTicket ticket) { +#if TODO + // Note: the plugin is currently WPF based! + // rely on ticket availability + if (ticket == null) + return; + + // start + ticket.StartExec(); + // trivial things if (!_packageCentral.MainStorable) { - MessageBoxFlyoutShow( - "An AASX package needs to be open", "Error", - AnyUiMessageBoxButton.OK, AnyUiMessageBoxImage.Exclamation); + _logic?.LogErrorToTicket(ticket, "An AASX package needs to be open!"); return; } + // check, if required plugin can be found var pluginName = "AasxPluginSmdExporter"; var actionName = "generate-SMD"; var pi = Plugins.FindPluginInstance(pluginName); if (pi == null || !pi.HasAction(actionName)) { - var res = MessageBoxFlyoutShow( - $"This function requires a binary plug-in file named '{pluginName}', " + - $"which needs to be added to the command line, with an action named '{actionName}'." + - $"Press 'OK' to show help page on GitHub.", - "Plug-in not present", - AnyUiMessageBoxButton.OKCancel, AnyUiMessageBoxImage.Hand); - if (res == AnyUiMessageBoxResult.OK) - { - ShowHelp(); - } + _logic?.LogErrorToTicket(ticket, + $"This function requires a binary plug-in file named '{pluginName}', " + + $"which needs to be added to the command line, with an action named '{actionName}'."); return; } //----------------------------------- @@ -3597,7 +1462,8 @@ public void CommandBinding_ExportSMD() this, stack, $"http://{Options.Curr.RestServerHost}:{Options.Curr.RestServerPort}/", - ""); + "", + ticket); if (ret == null) return; @@ -3620,6 +1486,8 @@ public void CommandBinding_ExportSMD() // Redraw for changes to be visible RedrawAllAasxElements(); //----------------------------------- +#endif } + } } diff --git a/src/AasxPackageExplorer/MainWindow.xaml b/src/AasxPackageExplorer/MainWindow.xaml index 773a731eb..eb7fb80a7 100644 --- a/src/AasxPackageExplorer/MainWindow.xaml +++ b/src/AasxPackageExplorer/MainWindow.xaml @@ -30,153 +30,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -306,16 +169,16 @@ - + + + ResizeBehavior="PreviousAndNext" Height="4" Background="White"/> - - + @@ -326,128 +189,163 @@ - + + + + + + + + + + + + + + + + + + @@ -470,19 +368,15 @@ - - - - - + + + + + + + + + @@ -497,7 +391,7 @@ - + @@ -514,13 +408,13 @@ VerticalAlignment="Stretch" Grid.Column="1" ResizeBehavior="PreviousAndNext" Grid.Row="0" - Width="5" Background="#FFBCBCBC"/> + Width="4" Background="White"/> + Width="4" Background="White"/> @@ -539,117 +433,130 @@ VerticalAlignment="Top" Grid.Row="1" Grid.Column="0" ResizeBehavior="PreviousAndNext" - Height="5" Background="#FFBCBCBC"/> - - - - - - - - - - + Height="4" Background="White"/> + + + + + + + + + + + + - - + + + + - - - - - - - - - - + + + + - + + + + + + + + + - - - - - - - - - - - - - - - Drag from here! + + + + + + + + + + + + + + + Drag from here! + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - + - - - - - + + + + + + -