├── .gitignore ├── CommerceAnalyzers.md ├── LICENSE ├── Pipeline ├── PowerShellScripts │ ├── CodeSign.ps1 │ ├── CopyFileToDestination.ps1 │ └── Pre-Build.ps1 └── YAML_Files │ └── build-pipeline.yml ├── README.md ├── SECURITY.md ├── global.json ├── nuget.config ├── repo.props └── src └── ScaleUnitSample ├── .vscode ├── extensions.json ├── launch.json └── tasks.json ├── ChannelDatabase ├── ChannelDatabase.csproj ├── Contoso.ExampleTable.ChannelDatabase.sql └── README.md ├── CommerceProxyGenerator ├── CSharp │ └── CSharpProxyGenerator.csproj ├── README.md └── TypeScript │ └── TypeScriptProxyGenerator.csproj ├── CommerceRuntime ├── CommerceRuntime.csproj ├── Controllers │ ├── BoundController.cs │ └── UnboundController.cs ├── Entities │ └── ExampleEntity.cs ├── Messages │ ├── CreateExampleEntityDataRequest.cs │ ├── CreateExampleEntityDataResponse.cs │ ├── DeleteExampleEntityDataRequest.cs │ ├── DeleteExampleEntityDataResponse.cs │ ├── ExampleEntityDataRequest.cs │ ├── ExampleEntityDataResponse.cs │ ├── UpdateExampleEntityDataRequest.cs │ └── UpdateExampleEntityDataResponse.cs ├── README.md ├── RequestHandlers │ └── ExampleDataService.cs └── Triggers │ ├── ChannelDataServiceRequestTrigger.cs │ └── DefinePosExtensionTrigger.cs ├── CustomizationPackage.props ├── Download ├── ChannelData │ └── Readme.md └── Readme.md ├── Installer └── ScaleUnit.Sample.Installer.csproj ├── POS ├── Controls │ └── Dialogs │ │ ├── Create │ │ ├── ExampleCreateDialog.html │ │ └── ExampleCreateDialogModule.ts │ │ ├── Display │ │ ├── PingResultDialog.html │ │ └── PingResultDialogModule.ts │ │ └── Edit │ │ ├── ExampleEditDialog.html │ │ └── ExampleEditDialogModule.ts ├── POS.csproj ├── README.md ├── Resources │ └── Strings │ │ └── en-US │ │ └── resources.resjson ├── ViewExtensions │ └── Search │ │ └── NavigateToExampleViewCommand.ts ├── Views │ ├── ExampleView.html │ ├── ExampleView.ts │ └── ExampleViewModel.ts ├── manifest.json └── tsconfig.json ├── Readme.md ├── ScaleUnit.sln ├── ScaleUnit ├── README.md └── ScaleUnit.csproj └── Scripts ├── Banner.txt ├── CheckDotnetSdk.ps1 ├── CheckPSBitness.ps1 ├── EnsureCertificate.ps1 ├── EnsureNugetAuth.ps1 ├── ErrorDecorator.psm1 ├── Install.ps1 ├── MsBuildMessage.txt ├── RestoreChannelDataDotnet.ps1 ├── RestoreChannelDataNuget.ps1 ├── RestorePackage.ps1 ├── Uninstall-Base-Product.ps1 └── Uninstall-Extension.ps1 /.gitignore: -------------------------------------------------------------------------------- 1 | _ReSharper* 2 | [Bb]in 3 | obj 4 | objd 5 | bin 6 | bld 7 | pkg 8 | /schemas/ 9 | out/ 10 | target/ 11 | tmp/ 12 | .vs 13 | App_Data 14 | *.user 15 | *.sln.cache 16 | *.suo 17 | *.metaproj 18 | *.metaproj.tmp 19 | TestResults 20 | [Tt]humbs.db 21 | buildd.* 22 | build.(err|log|wrn|trc|prf|evt|dbb) 23 | *.log 24 | *.bak 25 | OACRTemp/ 26 | build_logs/ 27 | lock 28 | /public/inc/bldver.* 29 | /public/inc/sources.ver 30 | .vs/ 31 | /Symbols 32 | /drop 33 | /.corext/.pkg/ 34 | /.corext/gen/ 35 | /.corext/cache 36 | versionsmk.inc 37 | Logs 38 | 39 | # Weird MSBuild output folders 40 | [0-9] 41 | 42 | # msbuild logs 43 | msbuild.log 44 | msbuild.err 45 | msbuild.wrn 46 | 47 | # bad tlb/chm generators in nmake tree 48 | *.tlb 49 | *.chm 50 | # The following file is a part of the sdk and must be an exception to the above rule, meaning it will be included. 51 | !CommerceRuntimeMessages.chm 52 | 53 | # dumb silverlight 54 | ClientBin/ 55 | 56 | # dumb azure 57 | *.build.csdef 58 | csx/ 59 | 60 | # Generated C# files 61 | *.g.cs 62 | !src/SampleExtensions/ShoppingApp/**/*.g.cs 63 | *.projhash 64 | *.projhash.userData 65 | *.projhash.userData.assemblies 66 | *.slnhash 67 | *.slnhash.userData 68 | *.slnhash.userData.assemblies 69 | 70 | # Ignore other generated file types, too 71 | *.g.ts 72 | *.g.xml 73 | 74 | # StyleCop 75 | StyleCop.Cache 76 | 77 | # Configs and transient build assets 78 | .config/.inc/bldver.cpp 79 | .config/.inc/bldver.cs 80 | .config/.inc/bldver.h 81 | .config/.inc/bldver.vb 82 | .config/.inc/sources.ver 83 | .config/.inc/version.htm 84 | .config/.inc/version.sql 85 | .config/.inc/version.json 86 | .config/.inc/version.txt 87 | .gen/ 88 | build/.gen_oacr/ 89 | build/oacr_exclude.ini 90 | *.tslint 91 | *.d.ts 92 | *.map 93 | *.generated 94 | *.rsp 95 | *.js 96 | /src/OnlineStore/Ecommerce.Sdk.Controls/Common/Scripts.js 97 | 98 | # Build and development artifiacts 99 | /VersionGeneration 100 | tslint.out 101 | TypeScripttslintFileListArgs.txt 102 | /.config/dev.packages.props 103 | /src/Provisioning/ProvisioningDatabase/ProvisioningDatabase.refactorlog 104 | .packages 105 | phantomjs-license.txt 106 | 107 | # POS Build Artifacts 108 | AppPackages/ 109 | bld/ 110 | schemas/ 111 | dist/ 112 | devDependencies/ 113 | 114 | # Certificate files 115 | *.pfx 116 | 117 | # Nuget package cache 118 | /src/References 119 | /ComponentScenarios/Pos/Dependencies/ 120 | 121 | # Nuget package creation temps 122 | /nu/t 123 | 124 | # Ignore generated nuget packages 125 | *.nupkg 126 | 127 | # Ignore generated build artifacts 128 | .pid 129 | .sign/ 130 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MICROSOFT SOFTWARE LICENSE TERMS 2 | MICROSOFT DYNAMICS 365 FOR COMMERCE SOFTWARE DEVELOPMENT KIT (SDK) 3 | 4 | These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent such services or updates are accompanied by new or additional terms, in which case those different terms apply prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. 5 | 1. INSTALLATION AND USE RIGHTS. 6 | a) General. You may install and use any number of copies of the software to develop and test your applications. 7 | b) Package Managers. The software includes package managers that give you the option to download other Microsoft and third party software packages to use with your application. Those packages are under their own licenses, and not this agreement. Microsoft does not distribute, license, or provide any warranties for any of the third party packages. 8 | 2. DISTRIBUTABLE CODE. The software may contain code you are permitted to distribute (i.e. make available for third parties) in applications you develop that work with Dynamics 365 for Commerce, as described in this Section. 9 | a) Distribution Rights. The sample source code files described below are distributable if included with the software. 10 | https://docs.microsoft.com/en-us/dynamics365/commerce/dev-itpro/retail-sdk/retail-sdk-overview#extension-components-in-the-retail-sdk 11 | i. Distributables. You may copy, modify, and distribute the sample source code listed in the distributables file list in the software; and 12 | ii. Third Party Distribution. You may permit distributors of your applications to copy and distribute any of this distributable code you elect to distribute with your applications. 13 | b) Distribution Requirements. For any code you distribute, you must: 14 | i. add significant primary functionality to it in your applications; 15 | ii. require distributors and external end users to agree to terms that protect it and Microsoft at least as much as this agreement; and 16 | iii. indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified distributable code. 17 | c) Distribution Restrictions. You may not: 18 | i. use Microsoft’s trademarks or trade dress in your application in any way that suggests your application comes from or is endorsed by Microsoft; or 19 | ii. modify or distribute the source code of any distributable code so that any part of it becomes subject to any license that requires that the distributable code, any other part of the software, or any of Microsoft’s other intellectual property be disclosed or distributed in source code form, or that others have the right to modify it. 20 | 3. SCOPE OF LICENSE. The software is licensed, not sold. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you will not (and have no right to): 21 | a) work around any technical limitations in the software that only allow you to use it in certain ways; 22 | b) reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; 23 | c) remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software; 24 | d) use the software in any way that is against the law or to create or propagate malware; or 25 | e) share, publish, distribute, or lease the software (except for any distributable code, subject to the terms above), provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. 26 | 4. DATA. 27 | a) Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may opt-out of many of these scenarios, but not all, as described in the product documentation.  There are also some features in the software that may enable you to collect data from users of your applications. If you use these features to enable data collection in your applications, you must comply with applicable law, including providing appropriate notices to users of your applications. You can learn more about data collection and use in the help documentation and the privacy statement at https://aka.ms/privacy. Your use of the software operates as your consent to these practices. 28 | b) Processing of Personal Data. To the extent Microsoft is a processor or subprocessor of personal data in connection with the software, Microsoft makes the commitments in the European Union General Data Protection Regulation Terms of the Online Services Terms to all customers effective May 25, 2018, at https://docs.microsoft.com/en-us/legal/gdpr. 29 | 5. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit https://aka.ms/exporting. 30 | 6. SUPPORT SERVICES. Microsoft is not obligated under this agreement to provide any support services for the software. Any support provided is “as is”, “with all faults”, and without warranty of any kind. 31 | 7. UPDATES. The software may periodically check for updates, and download and install them for you. You may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or peripheral devices. 32 | 8. TERMINATION. Without prejudice to any other rights, Microsoft may terminate this agreement if you fail to comply with any of its terms or conditions. In such event, you must destroy all copies of the software and all of its component parts. 33 | 9. ENTIRE AGREEMENT. This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software. 34 | 10. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. If you acquired the software in the United States or Canada, the laws of the state or province where you live (or, if a business, where your principal place of business is located) govern the interpretation of this agreement, claims for its breach, and all other claims (including consumer protection, unfair competition, and tort claims), regardless of conflict of laws principles. If you acquired the software in any other country, its laws apply. If U.S. federal jurisdiction exists, you and Microsoft consent to exclusive jurisdiction and venue in the federal court in King County, Washington for all disputes heard in court. If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes heard in court. 35 | 11. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: 36 | a) Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. 37 | b) Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. 38 | c) Germany and Austria. 39 | i. Warranty. The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. 40 | ii. Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. 41 | Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. 42 | 12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. 43 | 13. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT, OR INCIDENTAL DAMAGES. 44 | This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, warranty, guarantee, or condition; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law. 45 | It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages. 46 | 47 | Please note: As this software is distributed in Canada, some of the clauses in this agreement are provided below in French. 48 | Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. 49 | EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. 50 | LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. 51 | Cette limitation concerne: 52 | • tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et 53 | • les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. 54 | Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. 55 | EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. 56 | -------------------------------------------------------------------------------- /Pipeline/PowerShellScripts/CodeSign.ps1: -------------------------------------------------------------------------------- 1 | param( 2 | [string]$AzureKeyVaultURI, 3 | [string]$ApplicationId, 4 | [string]$ApplicationSecretValue, 5 | [string]$CertificateName, 6 | [string]$Timestamp, 7 | [string]$Files, 8 | [string]$TimestampDigest = "sha256" 9 | ) 10 | 11 | AzureSignTool.exe sign -kvu "$AzureKeyVaultURI" -kvi "$ApplicationId" -kvs "$ApplicationSecretValue" -kvc "$CertificateName" -tr "$Timestamp" -td "$TimestampDigest" (-split $Files) 12 | # SIG # Begin signature block 13 | # MIIoKgYJKoZIhvcNAQcCoIIoGzCCKBcCAQExDzANBglghkgBZQMEAgEFADB5Bgor 14 | # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG 15 | # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAeqoz9GtLmL3Ji 16 | # S0sx+OrBac0lFyIiIjk31FhXBJLvw6CCDXYwggX0MIID3KADAgECAhMzAAAEBGx0 17 | # Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD 18 | # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy 19 | # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p 20 | # bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw 21 | # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u 22 | # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy 23 | # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 24 | # AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz 25 | # NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo 26 | # DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3 27 | # a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF 28 | # HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy 29 | # 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE 30 | # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w 31 | # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW 32 | # MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci 33 | # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j 34 | # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG 35 | # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu 36 | # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 37 | # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC 38 | # Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj 39 | # L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp 40 | # h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3 41 | # cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X 42 | # dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL 43 | # E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi 44 | # u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1 45 | # sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq 46 | # 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb 47 | # DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/ 48 | # V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq 49 | # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x 50 | # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv 51 | # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 52 | # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG 53 | # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG 54 | # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg 55 | # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC 56 | # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 57 | # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr 58 | # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg 59 | # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy 60 | # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 61 | # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh 62 | # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k 63 | # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB 64 | # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn 65 | # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 66 | # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w 67 | # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o 68 | # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD 69 | # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa 70 | # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny 71 | # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG 72 | # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t 73 | # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV 74 | # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 75 | # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG 76 | # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl 77 | # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb 78 | # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l 79 | # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 80 | # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 81 | # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 82 | # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam 83 | # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa 84 | # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah 85 | # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA 86 | # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt 87 | # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr 88 | # /Xmfwb1tbWrJUnMTDXpQzTGCGgowghoGAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw 89 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN 90 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp 91 | # Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB 92 | # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO 93 | # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIGre7wqeoo7R8YZTaLrHeNdm 94 | # nwZ67zzKYPt6W44PmYnsMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A 95 | # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB 96 | # BQAEggEAsm3/tttvZetDtkuJbZCbDUsvfUfrJ6EFUrxE6AlCaYpLv/sBBwOrgGjb 97 | # g8xfCOcVd77VQsD9d0oO3N8oS7Tbvisx+BkL4W7Wq939t+zKoGKoOsvGV+ErIgdY 98 | # Yu2crDKZ/u4IQWJa5IQTwLUFREGCH1LImep4+s7fxVGPwjYzUhao3TJPgX13MOPH 99 | # AKHyrGo3Y5isqOpK0e9Y3CMSjdV+yTBRXWLelDBrdNmZJWikXm9VXIjiq8vjEHKi 100 | # ible+fwq8c6pxxjhpcErrWRYGEIJ5EY6vRRwx6MRpeiutOsFhMLnouEiLAT08Hpr 101 | # lVMXvXgQSoUv/3A7+ySg2SaaVzti1aGCF5QwgheQBgorBgEEAYI3AwMBMYIXgDCC 102 | # F3wGCSqGSIb3DQEHAqCCF20wghdpAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFSBgsq 103 | # hkiG9w0BCRABBKCCAUEEggE9MIIBOQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl 104 | # AwQCAQUABCAQIx0kovW3IL4or426TVRFUyWiJFawCm8wSI9k5DAXfQIGZ98Fvt0s 105 | # GBMyMDI1MDMzMTEwMTAzOC42NzNaMASAAgH0oIHRpIHOMIHLMQswCQYDVQQGEwJV 106 | # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE 107 | # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1l 108 | # cmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046ODYwMy0w 109 | # NUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wg 110 | # ghHqMIIHIDCCBQigAwIBAgITMwAAAgcsETmJzYX7xQABAAACBzANBgkqhkiG9w0B 111 | # AQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE 112 | # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD 113 | # VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yNTAxMzAxOTQy 114 | # NTJaFw0yNjA0MjIxOTQyNTJaMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz 115 | # aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv 116 | # cnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25z 117 | # MScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046ODYwMy0wNUUwLUQ5NDcxJTAjBgNV 118 | # BAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEB 119 | # AQUAA4ICDwAwggIKAoICAQDFP/96dPmcfgODe3/nuFveuBst/JmSxSkOn89ZFytH 120 | # Qm344iLoPqkVws+CiUejQabKf+/c7KU1nqwAmmtiPnG8zm4Sl9+RJZaQ4Dx3qtA9 121 | # mdQdS7Chf6YUbP4Z++8laNbTQigJoXCmzlV34vmC4zpFrET4KAATjXSPK0sQuFhK 122 | # r7ltNaMFGclXSnIhcnScj9QUDVLQpAsJtsKHyHN7cN74aEXLpFGc1I+WYFRxaTgq 123 | # SPqGRfEfuQ2yGrAbWjJYOXueeTA1MVKhW8zzSEpfjKeK/t2XuKykpCUaKn5s8sqN 124 | # bI3bHt/rE/pNzwWnAKz+POBRbJxIkmL+n/EMVir5u8uyWPl1t88MK551AGVh+2H4 125 | # ziR14YDxzyCG924gaonKjicYnWUBOtXrnPK6AS/LN6Y+8Kxh26a6vKbFbzaqWXAj 126 | # zEiQ8EY9K9pYI/KCygixjDwHfUgVSWCyT8Kw7mGByUZmRPPxXONluMe/P8CtBJMp 127 | # uh8CBWyjvFfFmOSNRK8ETkUmlTUAR1CIOaeBqLGwscShFfyvDQrbChmhXib4nRMX 128 | # 5U9Yr9d7VcYHn6eZJsgyzh5QKlIbCQC/YvhFK42ceCBDMbc+Ot5R6T/Mwce5jVyV 129 | # CmqXVxWOaQc4rA2nV7onMOZC6UvCG8LGFSZBnj1loDDLWo/I+RuRok2j/Q4zcMnw 130 | # kQIDAQABo4IBSTCCAUUwHQYDVR0OBBYEFHK1UmLCvXrQCvR98JBq18/4zo0eMB8G 131 | # A1UdIwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCG 132 | # Tmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUy 133 | # MFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4w 134 | # XAYIKwYBBQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2Vy 135 | # dHMvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwG 136 | # A1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQD 137 | # AgeAMA0GCSqGSIb3DQEBCwUAA4ICAQDju0quPbnix0slEjD7j2224pYOPGTmdDvO 138 | # 0+bNRCNkZqUv07P04nf1If3Y/iJEmUaU7w12Fm582ImpD/Kw2ClXrNKLPTBO6nfx 139 | # vOPGtalpAl4wqoGgZxvpxb2yEunG4yZQ6EQOpg1dE9uOXoze3gD4Hjtcc75kca8y 140 | # ivowEI+rhXuVUWB7vog4TGUxKdnDvpk5GSGXnOhPDhdId+g6hRyXdZiwgEa+q9M9 141 | # Xctz4TGhDgOKFsYxFhXNJZo9KRuGq6evhtyNduYrkzjDtWS6gW8akR59UhuLGsVq 142 | # +4AgqEY8WlXjQGM2OTkyBnlQLpB8qD7x9jRpY2Cq0OWWlK0wfH/1zefrWN5+be87 143 | # Sw2TPcIudIJn39bbDG7awKMVYDHfsPJ8ZvxgWkZuf6ZZAkph0eYGh3IV845taLkd 144 | # LOCvw49Wxqha5Dmi2Ojh8Gja5v9kyY3KTFyX3T4C2scxfgp/6xRd+DGOhNVPvVPa 145 | # /3yRUqY5s5UYpy8DnbppV7nQO2se3HvCSbrb+yPyeob1kUfMYa9fE2bEsoMbOaHR 146 | # gGji8ZPt/Jd2bPfdQoBHcUOqPwjHBUIcSc7xdJZYjRb4m81qxjma3DLjuOFljMZT 147 | # YovRiGvEML9xZj2pHRUyv+s5v7VGwcM6rjNYM4qzZQM6A2RGYJGU780GQG0QO98w 148 | # +sucuTVrfTCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZI 149 | # hvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw 150 | # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x 151 | # MjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAy 152 | # MDEwMB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMC 153 | # VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV 154 | # BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp 155 | # bWUtU3RhbXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC 156 | # AQDk4aZM57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25Phdg 157 | # M/9cT8dm95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPF 158 | # dvWGUNzBRMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6 159 | # GnszrYBbfowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBp 160 | # Dco2LXCOMcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50Zu 161 | # yjLVwIYwXE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3E 162 | # XzTdEonW/aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0 163 | # lBw0gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1q 164 | # GFphAXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ 165 | # +QuJYfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PA 166 | # PBXbGjfHCBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkw 167 | # EgYJKwYBBAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxG 168 | # NSnPEP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARV 169 | # MFMwUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWlj 170 | # cm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAK 171 | # BggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMC 172 | # AYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvX 173 | # zpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20v 174 | # cGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYI 175 | # KwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5j 176 | # b20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG 177 | # 9w0BAQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0x 178 | # M7U518JxNj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmC 179 | # VgADsAW+iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449 180 | # xvNo32X2pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wM 181 | # nosZiefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDS 182 | # PeZKPmY7T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2d 183 | # Y3RILLFORy3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxn 184 | # GSgkujhLmm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+Crvs 185 | # QWY9af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokL 186 | # jzbaukz5m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL 187 | # 6Xu/OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNN 188 | # MIICNQIBATCB+aGB0aSBzjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp 189 | # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw 190 | # b3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEn 191 | # MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjg2MDMtMDVFMC1EOTQ3MSUwIwYDVQQD 192 | # ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQDT 193 | # vVU/Yj9lUSyeDCaiJ2Da5hUiS6CBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYD 194 | # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy 195 | # b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w 196 | # IFBDQSAyMDEwMA0GCSqGSIb3DQEBCwUAAgUA65S4TDAiGA8yMDI1MDMzMTA2NDQy 197 | # OFoYDzIwMjUwNDAxMDY0NDI4WjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDrlLhM 198 | # AgEAMAcCAQACAgoeMAcCAQACAhMDMAoCBQDrlgnMAgEAMDYGCisGAQQBhFkKBAIx 199 | # KDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZI 200 | # hvcNAQELBQADggEBAFjHPU5BAQe5NjVZi95RQ9tJ/qmXyQnbU3j8BcdEdERMb4ju 201 | # Lw8EoosP2JoyqmXlmZpkaadvMTbKwnPDG4/dGFxQPKwhvq/cRHuJSEewysPQAr6w 202 | # 5aiPxIp7eJjqVeFySP3N6wljFBh3rTsOCGdgI4aQbCqueMd8BacTbAPbECAwfvjQ 203 | # eDLF3Ffp/Yi73NtdA1bcqxNlhAka1O+LdXGbPj6hq/LZbuRCLN1VXwK3Wo1hAogM 204 | # OPKNnV3i3MBBcp1zxxa5YJFpbIcc5dNeGHmdAKQAL8wt6pCsRXKl4wY2aCBb9GLZ 205 | # Nnaj31fzqhjuqiAieZjbP4ATlInyHWG2XWQGh5wxggQNMIIECQIBATCBkzB8MQsw 206 | # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u 207 | # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNy 208 | # b3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAgcsETmJzYX7xQABAAACBzAN 209 | # BglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8G 210 | # CSqGSIb3DQEJBDEiBCAJ8OwDZzwa3ZTJPuc/XbNvHSC4uXJgCUZ2fV6SbZj10TCB 211 | # +gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIC/31NHQds1IZ5sPnv59p+v6BjBD 212 | # goDPIwiAmn0PHqezMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh 213 | # c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD 214 | # b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIw 215 | # MTACEzMAAAIHLBE5ic2F+8UAAQAAAgcwIgQg6J+R7ngdAVxyQWASfOOd64EAbg2I 216 | # G/j8GmwKFX6dzhUwDQYJKoZIhvcNAQELBQAEggIAn3/YfsEvRgDdKi+VJyePcGfn 217 | # /cfuJTR1forAJ53l/4CH55xWDM7KpIcG5PCi1Diu4wZrXwmoEltWIV1Das8dCKT+ 218 | # dQRMZ1NRu9RMbVzBaw0RRQijAVYyNPA5HNMzdYciBMILoS0Ye/LH2YD4gO+hLHMZ 219 | # 1n391uWp7USV/JLxAio/GxRBXh/2ckfdaXICMUweN8FgOhLkHKEWbDieKMlKX92i 220 | # Oem2ejujfHF5LxPGLs0FDP7v2yeN5w7LM5S94q0G8IgkVIeULlaSOuULqBNaAjjq 221 | # KN1kg9Tp3D5vKSfzQS8GSmMPt79TyDiKucnjlivk5FGtw7mqbkgL+reOSTYbLI0F 222 | # we7MICt1XXzmUzKcEI0qoGp8jlf7A6q6Z8tpjrpnwArJyQBnK0iyvNnGcfeRk9VY 223 | # AQ+TFAtFUkh0YuZrzytx0b2StECyffqCzxiFBAApGnNmQ9vn0IMU9uLKynyuYFFc 224 | # c2Gia7fPFmZ2clZA6sB4yLwyk2SsPmA1t6Hs3tv3OCyNIZdiY3L8hc75aU0iNbsT 225 | # kbs8H9tO+/QAAbPZkg0cvVUAOqSqYaFSKkB8YeTyEdmqeSqG1ps8SW8AHdeX9RMk 226 | # /SmqYKovIEroQzazByJgluhZNV0ywZQ0y31jBdVFeJF0QZJkVyz0YGWu69MtQF38 227 | # I2xEZMYiJkcmf3Y1Rhk= 228 | # SIG # End signature block 229 | -------------------------------------------------------------------------------- /Pipeline/PowerShellScripts/CopyFileToDestination.ps1: -------------------------------------------------------------------------------- 1 | param( 2 | [string]$RelativePath, 3 | [string]$File, 4 | [string]$DestinationFullName 5 | ) 6 | 7 | $searchFile = Get-ChildItem -Path $RelativePath -Filter $File -Recurse 8 | if (-NOT $searchFile) { 9 | throw "$File file was not found." 10 | } 11 | else { 12 | Copy-Item $searchFile.FullName -Destination "$DestinationFullName" 13 | } 14 | # SIG # Begin signature block 15 | # MIIoQwYJKoZIhvcNAQcCoIIoNDCCKDACAQExDzANBglghkgBZQMEAgEFADB5Bgor 16 | # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG 17 | # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCirysgH4m0V8/e 18 | # tx8HQVsliWuxii8ecfoYxCNJxbWWl6CCDXYwggX0MIID3KADAgECAhMzAAAEBGx0 19 | # Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD 20 | # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy 21 | # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p 22 | # bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw 23 | # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u 24 | # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy 25 | # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 26 | # AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz 27 | # NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo 28 | # DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3 29 | # a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF 30 | # HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy 31 | # 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE 32 | # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w 33 | # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW 34 | # MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci 35 | # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j 36 | # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG 37 | # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu 38 | # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 39 | # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC 40 | # Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj 41 | # L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp 42 | # h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3 43 | # cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X 44 | # dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL 45 | # E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi 46 | # u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1 47 | # sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq 48 | # 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb 49 | # DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/ 50 | # V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq 51 | # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x 52 | # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv 53 | # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 54 | # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG 55 | # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG 56 | # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg 57 | # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC 58 | # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 59 | # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr 60 | # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg 61 | # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy 62 | # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 63 | # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh 64 | # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k 65 | # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB 66 | # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn 67 | # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 68 | # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w 69 | # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o 70 | # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD 71 | # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa 72 | # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny 73 | # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG 74 | # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t 75 | # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV 76 | # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 77 | # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG 78 | # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl 79 | # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb 80 | # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l 81 | # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 82 | # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 83 | # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 84 | # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam 85 | # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa 86 | # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah 87 | # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA 88 | # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt 89 | # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr 90 | # /Xmfwb1tbWrJUnMTDXpQzTGCGiMwghofAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw 91 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN 92 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp 93 | # Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB 94 | # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO 95 | # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIIWxoInIHzuYZwIQIeRbTb/S 96 | # 2RxYRttGfN4+u59Uc/uSMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A 97 | # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB 98 | # BQAEggEACqkolqN/lDBcpveeo2iwEFR7TLw3EIL6P+b7HKPGcGODr2SaMZd6A74m 99 | # eWiHU+kFPBc/XOzAUAzMLbZUf7ICxVXAcVW5HQCNhqC7xvNvEzD4Uoforf+gZkb0 100 | # yZkOvPxfYfxwViUc+ajq+A8b5PxBr8/hKNPSMCUTjohvP1rAmrzgVEGrwWPDB3Py 101 | # dHlWs787dX15zD3m+nkKEX5+wnuxhP6UD+iji9n2GNNWQJVvrdjhdgZtSjQkVhOh 102 | # VduLgKF7b60oM6evli8Ibhxvr7dV91FOvqPiM/SJ0H9FSVzD2Wx68fKjlMzx/HvX 103 | # I+xn8nolmBVg8uOPSpwvRljANl/v56GCF60wghepBgorBgEEAYI3AwMBMYIXmTCC 104 | # F5UGCSqGSIb3DQEHAqCCF4YwgheCAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFaBgsq 105 | # hkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl 106 | # AwQCAQUABCBLF0OgcdJ8wqBugtx6d0bXwvTrk1UJZizjyyfu6NnSlwIGZ7Y0Q0qa 107 | # GBMyMDI1MDMzMTEwMTA0MS4yMTJaMASAAgH0oIHZpIHWMIHTMQswCQYDVQQGEwJV 108 | # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE 109 | # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl 110 | # bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT 111 | # Tjo1MjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg 112 | # U2VydmljZaCCEfswggcoMIIFEKADAgECAhMzAAACAAvXqn8bKhdWAAEAAAIAMA0G 113 | # CSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u 114 | # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp 115 | # b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTI0 116 | # MDcyNTE4MzEyMVoXDTI1MTAyMjE4MzEyMVowgdMxCzAJBgNVBAYTAlVTMRMwEQYD 117 | # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy 118 | # b3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9w 119 | # ZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjUyMUEt 120 | # MDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNl 121 | # MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAr1XaadKkP2TkunoTF573 122 | # /tF7KJM9Doiv3ccv26mqnUhmv2DM59ikET4WnRfo5biFIHc6LqrIeqCgT9fT/Gks 123 | # 5VKO90ZQW2avh/PMHnl0kZfX/I5zdVooXHbdUUkPiZfNXszWswmL9UlWo8mzyv9L 124 | # p9TAtw/oXOYTAxdYSqOB5Uzz1Q3A8uCpNlumQNDJGDY6cSn0MlYukXklArChq6l+ 125 | # KYrl6r/WnOqXSknABpggSsJ33oL3onmDiN9YUApZwjnNh9M6kDaneSz78/YtD/2p 126 | # Gpx9/LXELoazEUFxhyg4KdmoWGNYwdR7/id81geOER69l5dJv71S/mH+Lxb6L692 127 | # n8uEmAVw6fVvE+c8wjgYZblZCNPAynCnDduRLdk1jswCqjqNc3X/WIzA7GGs4HUS 128 | # 4YIrAUx8H2A94vDNiA8AWa7Z/HSwTCyIgeVbldXYM2BtxMKq3kneRoT27NQ7Y7n8 129 | # ZTaAje7Blfju83spGP/QWYNZ1wYzYVGRyOpdA8Wmxq5V8f5r4HaG9zPcykOyJpRZ 130 | # y+V3RGighFmsCJXAcMziO76HinwCIjImnCFKGJ/IbLjH6J7fJXqRPbg+H6rYLZ8X 131 | # BpmXBFH4PTakZVYxB/P+EQbL5LNw0ZIM+eufxCljV4O+nHkM+zgSx8+07BVZPBKs 132 | # looebsmhIcBO0779kehciYMCAwEAAaOCAUkwggFFMB0GA1UdDgQWBBSAJSTavgkj 133 | # Kqge5xQOXn35fXd3OjAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBf 134 | # BgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz 135 | # L2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmww 136 | # bAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29m 137 | # dC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0El 138 | # MjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUF 139 | # BwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAKPCG9njRtIqQ 140 | # +fuECgxzWMsQOI3HvW7sV9PmEWCCOWlTuGCIzNi3ibdLZS0b2IDHg0yLrtdVuBi3 141 | # FxVdesIXuzYyofIe/alTBdV4DhijLTXtB7NgOno7G12iO3t6jy1hPSquzGLry/2m 142 | # EZBwIsSoS2D+H+3HCJxPDyhzMFqP+plltPACB/QNwZ7q+HGyZv3v8et+rQYg8sF3 143 | # PTuWeDg3dR/zk1NawJ/dfFCDYlWNeCBCLvNPQBceMYXFRFKhcSUws7mFdIDDhZpx 144 | # qyIKD2WDwFyNIGEezn+nd4kXRupeNEx+eSpJXylRD+1d45hb6PzOIF7BkcPtRtFW 145 | # 2wXgkjLqtTWWlBkvzl2uNfYJ3CPZVaDyMDaaXgO+H6DirsJ4IG9ikId941+mWDej 146 | # kj5aYn9QN6ROfo/HNHg1timwpFoUivqAFu6irWZFw5V+yLr8FLc7nbMa2lFSixzu 147 | # 96zdnDsPImz0c6StbYyhKSlM3uDRi9UWydSKqnEbtJ6Mk+YuxvzprkuWQJYWfpPv 148 | # ug+wTnioykVwc0yRVcsd4xMznnnRtZDGMSUEl9tMVnebYRshwZIyJTsBgLZmHM7q 149 | # 2TFK/X9944SkIqyY22AcuLe0GqoNfASCIcZtzbZ/zP4lT2/N0pDbn2ffAzjZkhI+ 150 | # Qrqr983mQZWwZdr3Tk1MYElDThz2D0MwggdxMIIFWaADAgECAhMzAAAAFcXna54C 151 | # m0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UE 152 | # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z 153 | # b2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZp 154 | # Y2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMy 155 | # MjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH 156 | # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV 157 | # BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0B 158 | # AQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51 159 | # yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY 160 | # 6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9 161 | # cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN 162 | # 7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDua 163 | # Rr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74 164 | # kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2 165 | # K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5 166 | # TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZk 167 | # i1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9Q 168 | # BXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3Pmri 169 | # Lq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUC 170 | # BBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJl 171 | # pxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIB 172 | # FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y 173 | # eS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUA 174 | # YgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU 175 | # 1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2Ny 176 | # bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIw 177 | # MTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDov 178 | # L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0w 179 | # Ni0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/yp 180 | # b+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulm 181 | # ZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM 182 | # 9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECW 183 | # OKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4 184 | # FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3Uw 185 | # xTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPX 186 | # fx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVX 187 | # VAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGC 188 | # onsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU 189 | # 5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEG 190 | # ahC0HVUzWLOhcGbyoYIDVjCCAj4CAQEwggEBoYHZpIHWMIHTMQswCQYDVQQGEwJV 191 | # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE 192 | # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl 193 | # bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT 194 | # Tjo1MjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg 195 | # U2VydmljZaIjCgEBMAcGBSsOAwIaAxUAjJOfLZb3ivipL3sSLlWFbLrWjmSggYMw 196 | # gYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE 197 | # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD 198 | # VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsF 199 | # AAIFAOuUwtowIhgPMjAyNTAzMzEwNzI5MzBaGA8yMDI1MDQwMTA3MjkzMFowdDA6 200 | # BgorBgEEAYRZCgQBMSwwKjAKAgUA65TC2gIBADAHAgEAAgIKKDAHAgEAAgIS8jAK 201 | # AgUA65YUWgIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIB 202 | # AAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQBUF9/AiVZ4cN4B 203 | # 7VyqsuWJshYqq91vc37X83FcFnKa34xQ9hMyUKgT5Tg7v+p3Hg9E9EQFAEOysrch 204 | # 3T7MIAGhITpR/CFbmFa/+CpYBKrnMFSsi2TalffNm1KiDfYOr3F9MmusQBQjvQX0 205 | # CVwQVjUTB9fr8Jai022Rp/Wi/yDdD47nzovyr5cRoE5XMmUIfyENsdgIU4dTVYlZ 206 | # 1AlqtOZB3wEZ2qabA/3IbrzDq23PwvArXmUXYBpQK7KwlNvaRvFJb8R1xtFn0bvG 207 | # pXs1Gum/OIvPf0EL19RXe1xpvrzPN1iPpa3kYY96Je2sWn/8XnUey5lttz5Ae8TT 208 | # i1WBYX/iMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh 209 | # c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD 210 | # b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIw 211 | # MTACEzMAAAIAC9eqfxsqF1YAAQAAAgAwDQYJYIZIAWUDBAIBBQCgggFKMBoGCSqG 212 | # SIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgpiBlAoM+w4g8 213 | # UBN/WlX5MLaMFbq6sZk7BjV+lCyJZL8wgfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHk 214 | # MIG9BCDUyO3sNZ3burBNDGUCV4NfM2gH4aWuRudIk/9KAk/ZJzCBmDCBgKR+MHwx 215 | # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt 216 | # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p 217 | # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAACAAvXqn8bKhdWAAEAAAIA 218 | # MCIEIPbnFfZql67LuVyjSPlsmVKYAL0RuQ9Z5G7LFa8auOzUMA0GCSqGSIb3DQEB 219 | # CwUABIICAK4gDP83eUSoDTMVcN+rYsLE3wivX0cU+0UFWYDPEFroRptH/9Qqa3hB 220 | # 5BfhWEgDtMXRZGIMlKzVTe5MVvxH84Ynocp7i5zJUbRIfiNcm9Ew/4zW8JNMXSMd 221 | # yJeecnNekPFL6m6RIvPSwVQ6EpmYKuteWBQvRNF6rf39C1m5phHimXJWcn/9h8kU 222 | # tvJegkCKAdGebU7aKDXFYGqD/qjgeLT6kgWxjGG7bj/H2n4yjVPrMLooLVPJ/8cq 223 | # EIcfopXZ/7RolMlZEWzTSXIOpZxKc4yW7+mDVnpkW5jxRpmAmTJDRBx67L7snQXe 224 | # mWWKUq9u9GfpLEeAlVNIhxNht6WCi65kXnSOEN8RSVc97qbSsC0AQTQDzF2pkQYi 225 | # 2H/iCz2E2qi49Pg5/xt3U98Xn4d+gO7rTDDVEUgO/WQyevfuSX3xlouI4UV0OtbT 226 | # NPFZyi6/wE9tteXZ19EX9iRIB+0AUEV80i/dFZgHAOXxSwXw9ARZnEGu3/ss3jD2 227 | # yOTSfJT0dmmeQpDUhbf4j6MWReZujDUSSRHGLEPpvIDsQUwY05MnmiaJInuPEzZZ 228 | # 0q3l9sStevXv6HM+VWK93R11BalfaLn5nxWuU5UtZILihFt4ashXrO5WoSCRaoH3 229 | # j493JhfjGkRreNztVAJfbCG2ZSK9FC5Bc1RN9/nqS02bTm1yAdbK 230 | # SIG # End signature block 231 | -------------------------------------------------------------------------------- /Pipeline/PowerShellScripts/Pre-Build.ps1: -------------------------------------------------------------------------------- 1 | write-host "Executing pre-build scripts" 2 | 3 | # Any additional scripts to be executed during pipeline should be referenced in this file 4 | # Link for reference: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-expression?view=powershell-7.1 5 | 6 | # Invoke-Expression -Command "C:\ps-test\testscript.ps1" 7 | # SIG # Begin signature block 8 | # MIIoKAYJKoZIhvcNAQcCoIIoGTCCKBUCAQExDzANBglghkgBZQMEAgEFADB5Bgor 9 | # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG 10 | # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDnJZiAYMIW9TYG 11 | # RqUYbtEKWJhc4qiBYR0okqgnYrpXb6CCDXYwggX0MIID3KADAgECAhMzAAAEBGx0 12 | # Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD 13 | # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy 14 | # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p 15 | # bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw 16 | # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u 17 | # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy 18 | # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 19 | # AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz 20 | # NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo 21 | # DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3 22 | # a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF 23 | # HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy 24 | # 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE 25 | # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w 26 | # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW 27 | # MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci 28 | # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j 29 | # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG 30 | # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu 31 | # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 32 | # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC 33 | # Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj 34 | # L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp 35 | # h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3 36 | # cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X 37 | # dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL 38 | # E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi 39 | # u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1 40 | # sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq 41 | # 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb 42 | # DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/ 43 | # V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq 44 | # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x 45 | # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv 46 | # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 47 | # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG 48 | # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG 49 | # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg 50 | # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC 51 | # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 52 | # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr 53 | # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg 54 | # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy 55 | # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 56 | # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh 57 | # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k 58 | # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB 59 | # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn 60 | # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 61 | # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w 62 | # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o 63 | # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD 64 | # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa 65 | # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny 66 | # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG 67 | # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t 68 | # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV 69 | # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 70 | # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG 71 | # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl 72 | # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb 73 | # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l 74 | # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 75 | # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 76 | # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 77 | # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam 78 | # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa 79 | # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah 80 | # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA 81 | # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt 82 | # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr 83 | # /Xmfwb1tbWrJUnMTDXpQzTGCGggwghoEAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw 84 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN 85 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp 86 | # Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB 87 | # BQCggZAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIE 88 | # IP05go3guWpict4FfgFuTPhtaryFxtuKlm8B2MFAcOx9MEIGCisGAQQBgjcCAQwx 89 | # NDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29m 90 | # dC5jb20wDQYJKoZIhvcNAQEBBQAEggEAbIAxAm4WV4qzQa/tbMuKQyWJ+ZbxO9k8 91 | # AR8+NlA0FjTXo45f7loevL2nhtjMzy3Eo7vtNmQ+YWGFEcfcJBB6MUjrdf6IQXOg 92 | # OUXBDeNbJMQERPCMKt5mNh3k/RENJVkLbeQEiahj2y1etJbyJKIoGeB83nyxjmKr 93 | # Y6pZLKPRUIMgxuexsIAICmPETbN5d0HwKk/QZCcp7QFCJpJwOPGB7QytO60B20Kk 94 | # elguLssxyGnIPUV+JhzEEyg8EN+Re/5I10cJjj55U2YG/80YLoVTBKxPTuSRCip/ 95 | # 8bcClQXfl7xyMJDXTQ0ZaekELUMqGW5O9NbdtDTfKH4GjOSGBo0NcqGCF7Awghes 96 | # BgorBgEEAYI3AwMBMYIXnDCCF5gGCSqGSIb3DQEHAqCCF4kwgheFAgEDMQ8wDQYJ 97 | # YIZIAWUDBAIBBQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYB 98 | # BAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCDzbzMRI1xrjKBsRFmigzaar45Ou71h 99 | # VDNoudR7DOcCEwIGZ7/LDKspGBMyMDI1MDMzMTEwMTA0MS40NThaMASAAgH0oIHZ 100 | # pIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE 101 | # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYD 102 | # VQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNV 103 | # BAsTHm5TaGllbGQgVFNTIEVTTjo2RjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWlj 104 | # cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEf4wggcoMIIFEKADAgECAhMzAAAB 105 | # /Bigr8xpWoc6AAEAAAH8MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMw 106 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN 107 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 108 | # YW1wIFBDQSAyMDEwMB4XDTI0MDcyNTE4MzExNFoXDTI1MTAyMjE4MzExNFowgdMx 109 | # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt 110 | # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p 111 | # Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNo 112 | # aWVsZCBUU1MgRVNOOjZGMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQg 113 | # VGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC 114 | # AgEAp1DAKLxpbQcPVYPHlJHyW7W5lBZjJWWDjMfl5WyhuAylP/LDm2hb4ymUmSym 115 | # V0EFRQcmM8BypwjhWP8F7x4iO88d+9GZ9MQmNh3jSDohhXXgf8rONEAyfCPVmJzM 116 | # 7ytsurZ9xocbuEL7+P7EkIwoOuMFlTF2G/zuqx1E+wANslpPqPpb8PC56BQxgJCI 117 | # 1LOF5lk3AePJ78OL3aw/NdlkvdVl3VgBSPX4Nawt3UgUofuPn/cp9vwKKBwuIWQE 118 | # FZ837GXXITshd2Mfs6oYfxXEtmj2SBGEhxVs7xERuWGb0cK6afy7naKkbZI2v1Uq 119 | # sxuZt94rn/ey2ynvunlx0R6/b6nNkC1rOTAfWlpsAj/QlzyM6uYTSxYZC2YWzLbb 120 | # Rl0lRtSz+4TdpUU/oAZSB+Y+s12Rqmgzi7RVxNcI2lm//sCEm6A63nCJCgYtM+LL 121 | # e9pTshl/Wf8OOuPQRiA+stTsg89BOG9tblaz2kfeOkYf5hdH8phAbuOuDQfr6s5Y 122 | # a6W+vZz6E0Zsenzi0OtMf5RCa2hADYVgUxD+grC8EptfWeVAWgYCaQFheNN/ZGNQ 123 | # Mkk78V63yoPBffJEAu+B5xlTPYoijUdo9NXovJmoGXj6R8Tgso+QPaAGHKxCbHa1 124 | # QL9ASMF3Os1jrogCHGiykfp1dKGnmA5wJT6Nx7BedlSDsAkCAwEAAaOCAUkwggFF 125 | # MB0GA1UdDgQWBBSY8aUrsUazhxByH79dhiQCL/7QdjAfBgNVHSMEGDAWgBSfpxVd 126 | # AF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1p 127 | # Y3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIw 128 | # UENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBo 129 | # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUy 130 | # MFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYG 131 | # A1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0B 132 | # AQsFAAOCAgEAT7ss/ZAZ0bTaFsrsiJYd//LQ6ImKb9JZSKiRw9xs8hwk5Y/7zign 133 | # 9gGtweRChC2lJ8GVRHgrFkBxACjuuPprSz/UYX7n522JKcudnWuIeE1p30BZrqPT 134 | # OnscD98DZi6WNTAymnaS7it5qAgNInreAJbTU2cAosJoeXAHr50YgSGlmJM+cN6m 135 | # YLAL6TTFMtFYJrpK9TM5Ryh5eZmm6UTJnGg0jt1pF/2u8PSdz3dDy7DF7KDJad2q 136 | # HxZORvM3k9V8Yn3JI5YLPuLso2J5s3fpXyCVgR/hq86g5zjd9bRRyyiC8iLIm/N9 137 | # 5q6HWVsCeySetrqfsDyYWStwL96hy7DIyLL5ih8YFMd0AdmvTRoylmADuKwE2TQC 138 | # TvPnjnLk7ypJW29t17Yya4V+Jlz54sBnPU7kIeYZsvUT+YKgykP1QB+p+uUdRH6e 139 | # 79Vaiz+iewWrIJZ4tXkDMmL21nh0j+58E1ecAYDvT6B4yFIeonxA/6Gl9Xs7JLci 140 | # PCIC6hGdliiEBpyYeUF0ohZFn7NKQu80IZ0jd511WA2bq6x9aUq/zFyf8Egw+dun 141 | # Uj1KtNoWpq7VuJqapckYsmvmmYHZXCjK1Eus7V1I+aXjrBYuqyM9QpeFZU4U01YG 142 | # 15uWwUCaj0uZlah/RGSYMd84y9DCqOpfeKE6PLMk7hLnhvcOQrnxP6kwggdxMIIF 143 | # WaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQsw 144 | # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u 145 | # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNy 146 | # b3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAx 147 | # ODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX 148 | # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg 149 | # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy 150 | # MDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL 151 | # 1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5K 152 | # Wv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTeg 153 | # Cjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv62 154 | # 6GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SH 155 | # JMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss25 156 | # 4o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/Nme 157 | # Rd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afo 158 | # mXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLi 159 | # Mxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb 160 | # 0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W2 161 | # 9R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQF 162 | # AgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1Ud 163 | # DgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdM 164 | # g30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp 165 | # b3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJ 166 | # KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF 167 | # MAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8w 168 | # TTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj 169 | # dHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBK 170 | # BggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9N 171 | # aWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1V 172 | # ffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1 173 | # OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce57 174 | # 32pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihV 175 | # J9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZ 176 | # UnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW 177 | # 9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k 178 | # +SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pF 179 | # EUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L 180 | # +DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1 181 | # ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6 182 | # CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDWTCCAkECAQEwggEBoYHZ 183 | # pIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE 184 | # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYD 185 | # VQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNV 186 | # BAsTHm5TaGllbGQgVFNTIEVTTjo2RjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWlj 187 | # cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUATkEpJXOa 188 | # qI2wfqBsw4NLVwqYqqqggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK 189 | # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 190 | # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg 191 | # MjAxMDANBgkqhkiG9w0BAQsFAAIFAOuUdwgwIhgPMjAyNTAzMzEwMjA2MDBaGA8y 192 | # MDI1MDQwMTAyMDYwMFowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA65R3CAIBADAK 193 | # AgEAAgIFXgIB/zAHAgEAAgITBzAKAgUA65XIiAIBADA2BgorBgEEAYRZCgQCMSgw 194 | # JjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3 195 | # DQEBCwUAA4IBAQBbGeHvhadWb+O+oUeQSFggaTlOWJpqQXzuKoOaM9h7rN1NRxRv 196 | # 6TJFSsV6fjL1gLG2JwMgcncM1tgC/+X2Ly7X2VCXzFhfRz9Fpe5no2dvInuXxeJo 197 | # 5pSTX5EsQe8IRmVs8HRcghxYjhBzTDk5V2CRtj+b/pqHtb4EEdTKw4Urugfhgh4B 198 | # BsG+aYqOLMjlXZT0c2tn2i/TdDmavk+Pc/F9eGlF0mrLJj4nlq6Hj+IWMYxc/Cfp 199 | # plZkPw+Iq4xYCnB4h5jTjgAYi/D5lwDui66okdkFRdWFO8u0vnObDyuGF+OWUcvZ 200 | # UHARtKwy09MdQOT0b8bkL8mNpPV+rRsbSZ//MYIEDTCCBAkCAQEwgZMwfDELMAkG 201 | # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx 202 | # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z 203 | # b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAH8GKCvzGlahzoAAQAAAfwwDQYJ 204 | # YIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkq 205 | # hkiG9w0BCQQxIgQgTcRFEiBdzx7jr6GfWkz/IYvUye1Cp2jbkPfF9jNSizIwgfoG 206 | # CyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCCVQq+Qu+/h/BOVP4wweUwbHuCUhh+T 207 | # 7hq3d5MCaNEtYjCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo 208 | # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y 209 | # cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw 210 | # AhMzAAAB/Bigr8xpWoc6AAEAAAH8MCIEIFIFLRdkHIwII0rQ2S9QWOM85O+KH/JO 211 | # 7Gt4ALxKDOxGMA0GCSqGSIb3DQEBCwUABIICAEMUNOo9STaENMMc7YHbH89lRlmx 212 | # rAvsASAuhEMiEMdktBklVmL6HD+dmqaZa9wrDj3fZZG2BD7yQrT+GoDr+VowoOuD 213 | # VLAD5sG5rafgUhCgACzu/eaFUSoTznnAo8zO8FL2VXo95p3XRhSKm2+UpMiWEcZ3 214 | # 5YFlyjFjhDPIuFt2jB7oErPM5Qzt/HT96D9Vre+zZTk7OCjfzoCsXoizWM1pohVC 215 | # TRUR6PXCKRD8Qinl8eAb6jkrQKjC4ZBf7FBTR5GVohvDEACLUawDyaApnwVXgr8v 216 | # erWB730xILFs0JakxRYLrJP9NtXm7jUzsPY6R+8gKdaqSxomZtbdyQflWxS/+kAC 217 | # pV0H5Pfj6SJSMYnA7asVBLiI1thbuhXqKK7a3ypoCecxVrkL3ZDdxtCMBhyeoU0z 218 | # 8KZIJQ+41TYF6eQr4w4gUyCfYkLJdiDgiV5lLipevBwAGuL2tUgG+px5GlE/gGt9 219 | # 9DrQ1g2nfMef+GZch09ZClsACWoPPzkoJioSzX7K0K/WFPb/82ZmBJJCgQ6cioHf 220 | # 0hdv0+m9R2S/xVz1ZUTUrxqAGgqcUvO9RbRI8d8DWAXM0thr8/1495QUxOlyQjCj 221 | # CuxhCF1Zm5JzPeas/xyPCHbc/X4pmExZZUrC7Zbennufk5oiORR83OKalwexnwG4 222 | # pnxqmQupA/NUs0eK 223 | # SIG # End signature block 224 | -------------------------------------------------------------------------------- /Pipeline/YAML_Files/build-pipeline.yml: -------------------------------------------------------------------------------- 1 | pr: none 2 | trigger: none 3 | 4 | pool: 5 | vmImage: 'windows-latest' 6 | 7 | steps: 8 | - task: PowerShell@2 9 | displayName: 'Pre-Build steps' 10 | inputs: 11 | targetType: filePath 12 | filePath: ./Pipeline/PowershellScripts/Pre-Build.ps1 13 | failOnStderr: true 14 | 15 | - task: NuGetToolInstaller@1 16 | displayName: 'Use NuGet 5.4.0' 17 | 18 | - task: NuGetCommand@2 19 | displayName: 'NuGet restore' 20 | inputs: 21 | feedsToUse: config 22 | nugetConfigPath: nuget.config 23 | 24 | - task: VSBuild@1 25 | displayName: 'Build solution **\*.sln' 26 | inputs: 27 | solution: '**\*.sln' 28 | 29 | - task: PowerShell@2 30 | displayName: 'Copy CloudScaleUnitExtensionPackage package to artifact directory' 31 | inputs: 32 | targetType: filePath 33 | filePath: ./Pipeline/PowershellScripts/CopyFileToDestination.ps1 34 | arguments: '-RelativePath "$(Build.SourcesDirectory)\src\ScaleUnitSample" -File "CloudScaleUnitExtensionPackage.zip" -DestinationFullName "$(Build.ArtifactStagingDirectory)\ScaleUnitPackage_$(Build.BuildNumber).zip"' 35 | failOnStderr: true 36 | 37 | - task: PublishBuildArtifacts@1 38 | displayName: 'Publish Artifact: drop' 39 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). 40 | 41 | -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "allowPrerelease": false, 4 | "rollForward": "latestPatch", 5 | "version": "8.0.404" 6 | } 7 | } -------------------------------------------------------------------------------- /nuget.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /repo.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 0.0 4 | 9.53 5 | $(MajorVersion).$(BuildNumber) 6 | 7 | 8 | 9 | CN=Contoso Ltd. 10 | Contoso Ltd. 11 | 12 | 13 | 14 | [9.53.*-*,9.54) 15 | [9.53.*-*,9.54) 16 | [9.53.*-*,9.54) 17 | [9.53.*-*,9.54) 18 | [10.35.*-*,10.36) 19 | [10.53.*-*,10.54) 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-dotnettools.csharp" 4 | ] 5 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "defaults": {}, 4 | "configurations": [ 5 | { 6 | "type": "coreclr", 7 | "request": "launch", 8 | "program": "${env:Programfiles}\\Microsoft Dynamics 365\\10.0\\Commerce Scale Unit\\Microsoft\\RetailServerSelfHosted\\Microsoft.Dynamics.Retail.RetailServerSelfHost.AspNetCore.exe", 9 | "name": "Debug with Self-Host", 10 | "serverReadyAction": { 11 | "pattern": "Now listening on: https?://[\\S:\\[\\]]+:([0-9]+)", 12 | "uriFormat": "http://localhost:%s/healthcheck?testname=ping", 13 | "action": "openExternally" 14 | }, 15 | "preLaunchTask": "install" 16 | }, 17 | { 18 | "type": "coreclr", 19 | "request": "attach", 20 | //"processName": "w3wp.exe", // VS Code is not smart enough to let me choose if more than one process is found. 21 | "name": "Debug with IIS", 22 | "preLaunchTask": "install" 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "problemMatcher": [], 4 | "options": { 5 | "env": { 6 | "common_workspaceFolder" : "${workspaceFolder}", 7 | // Base product related parameters. No need to setup any Certificate/AAD/HqConfigurationFile related parameters for Self-Host mode. 8 | "baseProduct_Port" : "", 9 | "baseProduct_AsyncClientCertFullPath" : "store:///My/LocalMachine?FindByThumbprint=", 10 | "baseProduct_SslCertFullPath" : "store:///My/LocalMachine?FindByThumbprint=", 11 | "baseProduct_RetailServerCertFullPath" : "store:///My/LocalMachine?FindByThumbprint=", 12 | "baseProduct_AsyncClientAadClientId" : "", 13 | "baseProduct_RetailServerAadClientId" : "", 14 | "baseProduct_CposAadClientId" : "", 15 | "baseProduct_RetailServerAadResourceId" : "", 16 | "baseProduct_Config" : "", 17 | // Base product deployment type 18 | // set it to "false" to install the RetailServer on IIS 19 | "baseProduct_UseSelfHost" : "true" 20 | } 21 | }, 22 | "tasks": [ 23 | { 24 | "label": "build-extension", // Build the extension solution 25 | "command": "dotnet", 26 | "args": [ 27 | "build", 28 | "/property:Configuration=Debug", 29 | "/property:NuGetInteractive=true" 30 | ], 31 | "group": { 32 | "kind": "build", 33 | "isDefault": true 34 | }, 35 | "dependsOrder": "sequence", 36 | "dependsOn" : [ 37 | "check-dotnet-sdk", 38 | "check-ps-bitness", 39 | "ensure-nuget-auth" 40 | ] 41 | }, 42 | { 43 | "label": "install", // Install the base product and extension 44 | "type": "shell", 45 | "windows": { 46 | "command": [ 47 | "\"${workspaceRoot}\\Scripts\\Install.ps1\"" 48 | ] 49 | }, 50 | "dependsOrder": "sequence", 51 | "dependsOn" : [ 52 | "build-extension" 53 | ] 54 | }, 55 | { 56 | "label": "check-dotnet-sdk", // Check the dotnet-sdk availability 57 | "type": "shell", 58 | "windows": { 59 | "command": [ 60 | "\"${workspaceRoot}\\Scripts\\CheckDotnetSdk.ps1\"" 61 | ] 62 | } 63 | }, 64 | { 65 | "label": "check-ps-bitness", // Check the PowerShell bitness 66 | "type": "shell", 67 | "windows": { 68 | "command": [ 69 | "\"${workspaceRoot}\\Scripts\\CheckPSBitness.ps1\"" 70 | ] 71 | } 72 | }, 73 | { 74 | "label": "ensure-nuget-auth", // Ensure that nuget authentication is working 75 | "type": "shell", 76 | "windows": { 77 | "command": [ 78 | "\"${workspaceRoot}\\Scripts\\EnsureNugetAuth.ps1\"" 79 | ] 80 | } 81 | }, 82 | 83 | // Clean and uninstall tasks 84 | { 85 | "label": "uninstall", // Uninstall everything 86 | "type": "shell", 87 | "dependsOrder": "sequence", 88 | "dependsOn" : [ 89 | "uninstall-extension", 90 | "uninstall-base-product", 91 | "clean-extension" 92 | ] 93 | }, 94 | { 95 | "label": "clean-extension", // Clean the extension solution 96 | "command": "dotnet", 97 | "args": [ 98 | "clean", 99 | "/property:Configuration=Debug" 100 | ], 101 | "group": "build" 102 | }, 103 | { 104 | "label": "uninstall-extension", // Uninstall the extension 105 | "type": "shell", 106 | "windows": { 107 | "command": [ 108 | "\"${workspaceRoot}\\Scripts\\Uninstall-Extension.ps1\"" 109 | ] 110 | } 111 | }, 112 | { 113 | "label": "uninstall-base-product", // Uninstall the base product 114 | "type": "shell", 115 | "windows": { 116 | "command": [ 117 | "\"${workspaceRoot}\\Scripts\\Uninstall-Base-Product.ps1\"" 118 | ] 119 | } 120 | } 121 | ] 122 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/ChannelDatabase/ChannelDatabase.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | netstandard2.0 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/ChannelDatabase/Contoso.ExampleTable.ChannelDatabase.sql: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | -- Create the extension table to store the custom fields. 11 | 12 | IF (SELECT OBJECT_ID('[ext].[CONTOSO_EXAMPLETABLE]')) IS NULL 13 | BEGIN 14 | CREATE TABLE 15 | [ext].[CONTOSO_EXAMPLETABLE] 16 | ( 17 | [EXAMPLEID] BIGINT IDENTITY(1,1) NOT NULL, 18 | [EXAMPLEINT] INT NOT NULL DEFAULT ((0)), 19 | [EXAMPLESTRING] NVARCHAR(64) NOT NULL DEFAULT (('')), 20 | CONSTRAINT [I_EXAMPLETABLE_EXAMPLEID] PRIMARY KEY CLUSTERED 21 | ( 22 | [EXAMPLEID] ASC 23 | ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 24 | ) ON [PRIMARY] 25 | 26 | ALTER TABLE [ext].[CONTOSO_EXAMPLETABLE] WITH CHECK ADD CHECK (([EXAMPLEID]<>(0))) 27 | END 28 | GO 29 | 30 | GRANT SELECT, INSERT, UPDATE, DELETE ON OBJECT::[ext].[CONTOSO_EXAMPLETABLE] TO [DataSyncUsersRole] 31 | GO 32 | 33 | -- Create a stored procedure CRT can use to add entries to the custom table. 34 | 35 | IF OBJECT_ID(N'[ext].[CONTOSO_INSERTEXAMPLE]', N'P') IS NOT NULL 36 | DROP PROCEDURE [ext].[CONTOSO_INSERTEXAMPLE] 37 | GO 38 | 39 | CREATE PROCEDURE [ext].[CONTOSO_INSERTEXAMPLE] 40 | @i_ExampleInt INT, 41 | @s_ExampleString NVARCHAR(64) 42 | AS 43 | BEGIN 44 | SET NOCOUNT ON 45 | 46 | INSERT INTO 47 | ext.CONTOSO_EXAMPLETABLE 48 | (EXAMPLEINT, EXAMPLESTRING) 49 | OUTPUT 50 | INSERTED.EXAMPLEID 51 | VALUES 52 | (@i_ExampleInt, @s_ExampleString) 53 | END; 54 | GO 55 | 56 | GRANT EXECUTE ON [ext].[CONTOSO_INSERTEXAMPLE] TO [UsersRole]; 57 | GO 58 | 59 | GRANT EXECUTE ON [ext].[CONTOSO_INSERTEXAMPLE] TO [DeployExtensibilityRole]; 60 | GO 61 | 62 | -- Create the custom view that can query a complete Example Entity. 63 | 64 | IF (SELECT OBJECT_ID('[ext].[CONTOSO_EXAMPLEVIEW]')) IS NOT NULL 65 | DROP VIEW [ext].[CONTOSO_EXAMPLEVIEW] 66 | GO 67 | 68 | CREATE VIEW [ext].[CONTOSO_EXAMPLEVIEW] AS 69 | ( 70 | SELECT 71 | et.EXAMPLEINT, 72 | et.EXAMPLESTRING, 73 | et.EXAMPLEID 74 | FROM 75 | [ext].[CONTOSO_EXAMPLETABLE] et 76 | ) 77 | GO 78 | 79 | GRANT SELECT ON OBJECT::[ext].[CONTOSO_EXAMPLEVIEW] TO [UsersRole]; 80 | GO 81 | 82 | GRANT SELECT ON OBJECT::[ext].[CONTOSO_EXAMPLEVIEW] TO [DeployExtensibilityRole]; 83 | GO 84 | 85 | -- Create a stored procedure CRT can use to perform updates. 86 | 87 | IF OBJECT_ID(N'[ext].[CONTOSO_UPDATEEXAMPLE]', N'P') IS NOT NULL 88 | DROP PROCEDURE [ext].[CONTOSO_UPDATEEXAMPLE] 89 | GO 90 | 91 | CREATE PROCEDURE [ext].[CONTOSO_UPDATEEXAMPLE] 92 | @bi_Id BIGINT, 93 | @i_ExampleInt INT, 94 | @s_ExampleString NVARCHAR(64) 95 | AS 96 | BEGIN 97 | SET NOCOUNT ON 98 | 99 | UPDATE 100 | ext.CONTOSO_EXAMPLETABLE 101 | SET 102 | EXAMPLEINT = @i_ExampleInt, 103 | EXAMPLESTRING = @s_ExampleString 104 | WHERE 105 | EXAMPLEID = @bi_Id 106 | END; 107 | GO 108 | 109 | GRANT EXECUTE ON [ext].[CONTOSO_UPDATEEXAMPLE] TO [UsersRole]; 110 | GO 111 | 112 | GRANT EXECUTE ON [ext].[CONTOSO_UPDATEEXAMPLE] TO [DeployExtensibilityRole]; 113 | GO 114 | 115 | -- Create a stored procedure CRT can use to delete Example Entities. 116 | 117 | IF OBJECT_ID(N'[ext].[CONTOSO_DELETEEXAMPLE]', N'P') IS NOT NULL 118 | DROP PROCEDURE [ext].CONTOSO_DELETEEXAMPLE 119 | GO 120 | 121 | CREATE PROCEDURE [ext].CONTOSO_DELETEEXAMPLE 122 | @bi_Id BIGINT 123 | AS 124 | BEGIN 125 | SET NOCOUNT ON 126 | 127 | DELETE FROM 128 | ext.CONTOSO_EXAMPLETABLE 129 | WHERE 130 | EXAMPLEID = @bi_Id 131 | END; 132 | GO 133 | 134 | GRANT EXECUTE ON [ext].CONTOSO_DELETEEXAMPLE TO [UsersRole]; 135 | GO 136 | 137 | GRANT EXECUTE ON [ext].CONTOSO_DELETEEXAMPLE TO [DeployExtensibilityRole]; 138 | GO 139 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/ChannelDatabase/README.md: -------------------------------------------------------------------------------- 1 | This project contains samples on how to create Commerce Runtime database extensions. -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceProxyGenerator/CSharp/CSharpProxyGenerator.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | net8.0 6 | CSharpExtensions 7 | Contoso.Commerce.RetailProxy.Extension 8 | Contoso.Commerce.RetailProxy.Extension 9 | en-US 10 | true 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceProxyGenerator/README.md: -------------------------------------------------------------------------------- 1 | # Proxy to consume Commerce APIs and entities 2 | 3 | To consume the custom Commerce APIs, the commerce proxy tool generates proxy classes and interfaces for the external applications to consume the Commerce APIs in an easier way. 4 | 5 | ## Commerce proxy and when to use it 6 | 7 | External applications can use the proxy to interact with Commerce APIs, the Commerce proxy abstracts the Commerce APIs and the Commerce runtime (CRT) entities, request and response and generates interfaces/metadata for the external application to consume the Commerce API and entities in an easier way, like metadata generated by the .NET framework for consuming the supported web services. For example, to consume the custom entities or the Commerce APIs in the external applications either you can use the metadata generated by proxy tool or you can manually create all the entities and request/response metadata in the client applications and manual creation involves lots of additional overhead, because you may need to maintain, update, and duplicate the entities, manager, and request/response code in two places. 8 | 9 | The Commerce proxy reduces this effort by automatically generating the proxy for all the custom entities and request/response operations that are added in Commerce APIs. The proxy tool generates the required interface and all the required metadata and abstracts the actual implementation. In that way, you can include the files in the extension projects, and can access the Commerce APIs and the entities by using the metadata and interface that are generated. 10 | 11 | ## Proxy types 12 | 13 | There are two types of proxy to support cross-platform scenarios: 14 | 15 | * **Typescript** - POS and e-Commerce use the typescript proxy to access the Commerce APIs and CRT entities. Based on the application type, different types of typescript proxies are generated, for e-Commerce use **TypeScriptModuleExtensions** and for POS use **typescriptextensions**. Note: POS project automatically generates proxies based on the Commerce API project referenced. 16 | * **C#** – The C# proxy can be used by an application which requires C# to consume the APIs, The POS uses the C# proxy when it's offline. (When the POS is offline, it communicates directly with CRT, without using Retail Server.) 17 | 18 | Depending upon your application type, decide what type of proxy to generate, the packages consumed to generate the Typescript proxy and the C# proxy are different. 19 | 20 | ## Sample proxy generator projects 21 | 22 | In the sample, we created cs projects and added reference to the **Microsoft.Dynamics.Commerce.Tools.ExtensionsProxyGenerator.AspNetCore** package, Commerce runtime and Commerce API extension projects to generate the proxy. For C# proxy additionally consume the **Microsoft.Dynamics.Commerce.Proxy.ScaleUnit package**. 23 | 24 | This sample demonstrates how to create proxies for your commerce runtime extension. 25 | 26 | **The sample consists of 3 projects:** 27 | 28 | 1. [TypeScriptProxyGenerator](./TypeScript/TypeScriptProxyGenerator.csproj): Generates typescript proxies for a given dll. The dll generated from the 'CommerceRuntime' project is used as a sample. You can use a different dll in your project. 29 | 2. [CSharpProxyGenerator](./TypeScript/CSharpProxyGenerator.csproj): Generates C# proxies for a given dll. The dll generated from the 'CommerceRuntime' project is used as a sample. You can use a different dll in your project. 30 | 2. [CommerceRuntime](../CommerceRuntime): Contains the entities and controller for the extension. 31 | 32 | # Building Sample 33 | 34 | To build the sample, open and build the [ScaleUnit](../ScaleUnit.sln) solution. 35 | 36 | # E-Commerce Application 37 | Consume the generated files from the [TypeScriptProxyGenerator](./TypeScript/TypeScriptProxyGenerator.csproj) on your E-Commerce Application. 38 | 39 | Once the solution is built successfully, validate if the following two files got generated in your [TypeScriptProxyGenerator](./TypeScript/TypeScriptProxyGenerator.csproj) project: 40 | 41 | 1. **'DataService\DataActionExtension.g.ts'**: This file contains all the data actions extensions that can be used to call the APIs defined in your Commerce Runtime Controller. 42 | 2. **'DataService\DataServiceEntities.g.ts'**: This file contains all entity classes defined in your Commerce Runtime Extension. 43 | 44 | ## Consume files in E-Commerce Application 45 | 46 | Once the DataActionExtension.g.ts and DataServiceEntities.g.ts files are generated, you can manually move them to your [E-Commerce App](https://github.com/microsoft/Msdyn365.Commerce.Online). Eg: "Msdyn365.Commerce.Online\src\actions\extensions". 47 | 48 | You can also uncomment the 'CopyGeneratedContracts' target section in the [TypeScriptProxyGenerator.csproj](./TypeScript/TypeScriptProxyGenerator.csproj) file to do this automatically for you. 49 | 50 | # Commerce C# Application 51 | Consume the generated files from the [CSharpProxyGenerator](./TypeScript/CSharpProxyGenerator.csproj) on your Commerce Application. 52 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceProxyGenerator/TypeScript/TypeScriptProxyGenerator.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | netstandard2.0 6 | TypeScriptModuleExtensions 7 | Contoso.Commerce.RetailProxy.Extension 8 | Contoso.Commerce.RetailProxy.Extension 9 | en-US 10 | true 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 34 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/CommerceRuntime.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | net8.0 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Controllers/BoundController.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Controllers 11 | { 12 | using System.Threading.Tasks; 13 | using Microsoft.Dynamics.Commerce.Runtime; 14 | using Microsoft.Dynamics.Commerce.Runtime.DataModel; 15 | using Microsoft.Dynamics.Commerce.Runtime.Hosting.Contracts; 16 | 17 | /// 18 | /// An extension controller to handle requests to the StoreHours entity set. 19 | /// 20 | [RoutePrefix("BoundController")] 21 | [BindEntity(typeof(Entities.DataModel.ExampleEntity))] 22 | public class BoundController : IController 23 | { 24 | [HttpGet] 25 | [Authorization(CommerceRoles.Anonymous, CommerceRoles.Application, CommerceRoles.Customer, CommerceRoles.Device, CommerceRoles.Employee, CommerceRoles.Storefront)] 26 | public async Task> GetAllExampleEntities(IEndpointContext context) 27 | { 28 | var queryResultSettings = QueryResultSettings.SingleRecord; 29 | queryResultSettings.Paging = new PagingInfo(10); 30 | 31 | var request = new Messages.ExampleEntityDataRequest() { QueryResultSettings = queryResultSettings }; 32 | var response = await context.ExecuteAsync(request).ConfigureAwait(false); 33 | return response.ExampleEntities; 34 | } 35 | 36 | [HttpPost] 37 | [Authorization(CommerceRoles.Customer, CommerceRoles.Device, CommerceRoles.Employee)] 38 | public async Task CreateExampleEntity(IEndpointContext context, CommerceRuntime.Entities.DataModel.ExampleEntity entityData) 39 | { 40 | var request = new Messages.CreateExampleEntityDataRequest(entityData); 41 | var response = await context.ExecuteAsync(request).ConfigureAwait(false); 42 | return response.CreatedId; 43 | } 44 | 45 | [HttpPost] 46 | [Authorization(CommerceRoles.Customer, CommerceRoles.Device, CommerceRoles.Employee)] 47 | public async Task UpdateExampleEntity(IEndpointContext context, [EntityKey] long key, CommerceRuntime.Entities.DataModel.ExampleEntity updatedEntity) 48 | { 49 | var request = new Messages.UpdateExampleEntityDataRequest(key, updatedEntity); 50 | var response = await context.ExecuteAsync(request).ConfigureAwait(false); 51 | return response.Success; 52 | } 53 | 54 | [HttpPost] 55 | [Authorization(CommerceRoles.Customer, CommerceRoles.Device, CommerceRoles.Employee)] 56 | public async Task DeleteExampleEntity(IEndpointContext context, [EntityKey] long key) 57 | { 58 | var request = new Messages.DeleteExampleEntityDataRequest(key); 59 | var response = await context.ExecuteAsync(request).ConfigureAwait(false); 60 | return response.Success; 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Controllers/UnboundController.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Controllers 11 | { 12 | using System.Threading.Tasks; 13 | using Microsoft.Dynamics.Commerce.Runtime.DataModel; 14 | using Microsoft.Dynamics.Commerce.Runtime.Hosting.Contracts; 15 | 16 | /// 17 | /// An extension controller to handle requests to the StoreHours entity set. 18 | /// 19 | public class UnboundController : IController 20 | { 21 | /// 22 | /// A simple GET endpoint to demonstrate GET endpoints on an unbound controller. 23 | /// 24 | /// A simple true value to indicate the endpoint was reached. 25 | [HttpGet] 26 | [Authorization(CommerceRoles.Anonymous, CommerceRoles.Application, CommerceRoles.Customer, CommerceRoles.Device, CommerceRoles.Employee, CommerceRoles.Storefront)] 27 | public Task SimplePingGet() 28 | { 29 | return Task.FromResult(true); 30 | } 31 | 32 | /// 33 | /// A simple POST endpoint to demonstrate POST endpoints on an unbound controller. 34 | /// 35 | /// A simple true value to indicate the endpoint was reached. 36 | [HttpPost] 37 | [Authorization(CommerceRoles.Customer, CommerceRoles.Device, CommerceRoles.Employee)] 38 | public Task SimplePingPost() 39 | { 40 | return Task.FromResult(true); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Entities/ExampleEntity.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Entities.DataModel 11 | { 12 | using System.Runtime.Serialization; 13 | using Microsoft.Dynamics.Commerce.Runtime.ComponentModel.DataAnnotations; 14 | using Microsoft.Dynamics.Commerce.Runtime.DataModel; 15 | using SystemAnnotations = System.ComponentModel.DataAnnotations; 16 | 17 | /// 18 | /// Defines a simple class that holds information about opening and closing times for a particular day. 19 | /// 20 | public class ExampleEntity : CommerceEntity 21 | { 22 | private const string ExampleIntColumn = "EXAMPLEINT"; 23 | private const string ExampleStringColumn = "EXAMPLESTRING"; 24 | private const string IdColumn = "EXAMPLEID"; 25 | 26 | /// 27 | /// Initializes a new instance of the class. 28 | /// 29 | public ExampleEntity() 30 | : base("Example") 31 | { 32 | } 33 | 34 | /// 35 | /// Gets or sets a property containing an int value. 36 | /// 37 | [DataMember] 38 | [Column(ExampleIntColumn)] 39 | public int IntData 40 | { 41 | get { return (int)this[ExampleIntColumn]; } 42 | set { this[ExampleIntColumn] = value; } 43 | } 44 | 45 | /// 46 | /// Gets or sets a property containing a string value. 47 | /// 48 | [DataMember] 49 | [Column(ExampleStringColumn)] 50 | public string StringData 51 | { 52 | get { return (string)this[ExampleStringColumn]; } 53 | set { this[ExampleStringColumn] = value; } 54 | } 55 | 56 | /// 57 | /// Gets or sets the id. 58 | /// 59 | /// 60 | /// Fields named "Id" are automatically treated as the entity key. 61 | /// If a name other than Id is preferred, 62 | /// can be used like it is here to annotate a given field as the entity key. 63 | /// 64 | [SystemAnnotations.Key] 65 | [DataMember] 66 | [Column(IdColumn)] 67 | public long UnusualEntityId 68 | { 69 | get { return (long)this[IdColumn]; } 70 | set { this[IdColumn] = value; } 71 | } 72 | } 73 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Messages/CreateExampleEntityDataRequest.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Messages 11 | { 12 | using System.Runtime.Serialization; 13 | using Contoso.CommerceRuntime.Entities.DataModel; 14 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 15 | 16 | /// 17 | /// A simple request class to create an Example Entity in the database. 18 | /// 19 | [DataContract] 20 | public sealed class CreateExampleEntityDataRequest : Request 21 | { 22 | /// 23 | /// Initializes a new instance of the class. 24 | /// 25 | /// An example entity with its fields populated with the values to be stored. 26 | public CreateExampleEntityDataRequest(ExampleEntity entityData) 27 | { 28 | this.EntityData = entityData; 29 | } 30 | 31 | /// 32 | /// Gets an Example Entity instance with its fields set with the values to be stored. 33 | /// 34 | [DataMember] 35 | public ExampleEntity EntityData { get; private set; } 36 | } 37 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Messages/CreateExampleEntityDataResponse.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Messages 11 | { 12 | using System.Runtime.Serialization; 13 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 14 | 15 | /// 16 | /// A simple response class to indicate whether creating a new entity succeeded or not. 17 | /// 18 | [DataContract] 19 | public sealed class CreateExampleEntityDataResponse : Response 20 | { 21 | /// 22 | /// Initializes a new instance of the class. 23 | /// 24 | /// The ID of the newly saved entity instance, 0 in the event of failure. 25 | public CreateExampleEntityDataResponse(long createdId) 26 | { 27 | this.CreatedId = createdId; 28 | } 29 | 30 | /// 31 | /// Gets the ID of the newly saved entity instance, or 0 in the event of failure. 32 | /// 33 | public long CreatedId { get; private set; } 34 | } 35 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Messages/DeleteExampleEntityDataRequest.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Messages 11 | { 12 | using System.Runtime.Serialization; 13 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 14 | 15 | /// 16 | /// A simple request used to delete an example entity from the database. 17 | /// 18 | [DataContract] 19 | public sealed class DeleteExampleEntityDataRequest : Request 20 | { 21 | /// 22 | /// Initializes a new instance of the class. 23 | /// 24 | /// A unique key identifying an Example Entity record to delete. 25 | public DeleteExampleEntityDataRequest(long entityKey) 26 | { 27 | this.ExampleEntityKey = entityKey; 28 | } 29 | 30 | /// 31 | /// Gets the unique ID specifying the Example Entity record to delete. 32 | /// 33 | public long ExampleEntityKey { get; private set; } 34 | } 35 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Messages/DeleteExampleEntityDataResponse.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Messages 11 | { 12 | using System.Runtime.Serialization; 13 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 14 | 15 | /// 16 | /// A simple response class to indicate whether a delete succeeded or not. 17 | /// 18 | [DataContract] 19 | public sealed class DeleteExampleEntityDataResponse : Response 20 | { 21 | /// 22 | /// Creates a new instance of the class. 23 | /// 24 | /// Whether the delete succeeded. 25 | public DeleteExampleEntityDataResponse(bool success) 26 | { 27 | this.Success = success; 28 | } 29 | 30 | /// 31 | /// Gets a value indicating whether the delete succeeded. 32 | /// 33 | public bool Success { get; private set; } 34 | } 35 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Messages/ExampleEntityDataRequest.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | namespace Contoso.CommerceRuntime.Messages 10 | { 11 | using System.Runtime.Serialization; 12 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 13 | 14 | /// 15 | /// A simple request class to get all Example Entities. 16 | /// 17 | [DataContract] 18 | public sealed class ExampleEntityDataRequest : Request 19 | { 20 | } 21 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Messages/ExampleEntityDataResponse.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Messages 11 | { 12 | using System.Runtime.Serialization; 13 | using Contoso.CommerceRuntime.Entities.DataModel; 14 | using Microsoft.Dynamics.Commerce.Runtime; 15 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 16 | 17 | /// 18 | /// Defines a simple response class that holds a collection of Example Entities. 19 | /// 20 | [DataContract] 21 | public sealed class ExampleEntityDataResponse : Response 22 | { 23 | /// 24 | /// Initializes a new instance of the class. 25 | /// 26 | /// The collection of Example Entities. 27 | public ExampleEntityDataResponse(PagedResult exampleEntities) 28 | { 29 | this.ExampleEntities = exampleEntities; 30 | } 31 | 32 | /// 33 | /// Gets the retrieved Example Entities as a paged result. 34 | /// 35 | [DataMember] 36 | public PagedResult ExampleEntities { get; private set; } 37 | } 38 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Messages/UpdateExampleEntityDataRequest.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Messages 11 | { 12 | using System.Runtime.Serialization; 13 | using Contoso.CommerceRuntime.Entities.DataModel; 14 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 15 | 16 | /// 17 | /// A simple request class to update the values on an example entity. 18 | /// 19 | [DataContract] 20 | public sealed class UpdateExampleEntityDataRequest : Request 21 | { 22 | /// 23 | /// Initializes a new instance of the class. 24 | /// 25 | /// A unique key identifying an Example Entity record to update. 26 | /// An example entity with update fields. 27 | public UpdateExampleEntityDataRequest(long entityKey, ExampleEntity updatedEntity) 28 | { 29 | this.ExampleEntityKey = entityKey; 30 | this.UpdatedExampleEntity = updatedEntity; 31 | } 32 | 33 | /// 34 | /// Gets the unique ID specifying the Example Entity record to update. 35 | /// 36 | public long ExampleEntityKey { get; private set; } 37 | 38 | /// 39 | /// Gets an Example Entity instance with any updates applied to it. 40 | /// 41 | [DataMember] 42 | public ExampleEntity UpdatedExampleEntity { get; private set; } 43 | } 44 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Messages/UpdateExampleEntityDataResponse.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Messages 11 | { 12 | using System.Runtime.Serialization; 13 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 14 | 15 | /// 16 | /// A simple response class to indicate whether an update succeeded or not. 17 | /// 18 | [DataContract] 19 | public sealed class UpdateExampleEntityDataResponse : Response 20 | { 21 | /// 22 | /// Initializes a new instance of the class. 23 | /// 24 | /// Whether the update succeeded. 25 | public UpdateExampleEntityDataResponse(bool success) 26 | { 27 | this.Success = success; 28 | } 29 | 30 | /// 31 | /// Gets a value indicating whether the update succeeded. 32 | /// 33 | public bool Success { get; private set; } 34 | } 35 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/README.md: -------------------------------------------------------------------------------- 1 | This project contains samples on how to create Commerce Runtime and Headless Commerce APIs. -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/RequestHandlers/ExampleDataService.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.RequestHandlers 11 | { 12 | using System; 13 | using System.Collections.Generic; 14 | using System.Globalization; 15 | using System.Linq; 16 | using System.Threading.Tasks; 17 | using Microsoft.Dynamics.Commerce.Runtime; 18 | using Microsoft.Dynamics.Commerce.Runtime.Data; 19 | using Microsoft.Dynamics.Commerce.Runtime.DataAccess.SqlServer; 20 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 21 | using Contoso.CommerceRuntime.Entities.DataModel; 22 | using Contoso.CommerceRuntime.Messages; 23 | 24 | /// 25 | /// Sample service to demonstrate managing a collection of entities. 26 | /// 27 | public class ExampleDataService : IRequestHandlerAsync 28 | { 29 | /// 30 | /// Gets the collection of supported request types by this handler. 31 | /// 32 | public IEnumerable SupportedRequestTypes 33 | { 34 | get 35 | { 36 | return new[] 37 | { 38 | typeof(CreateExampleEntityDataRequest), 39 | typeof(ExampleEntityDataRequest), 40 | typeof(UpdateExampleEntityDataRequest), 41 | typeof(DeleteExampleEntityDataRequest), 42 | }; 43 | } 44 | } 45 | 46 | /// 47 | /// Entry point to StoreHoursDataService service. 48 | /// 49 | /// The request to execute. 50 | /// Result of executing request, or null object for void operations. 51 | public Task Execute(Request request) 52 | { 53 | ThrowIf.Null(request, nameof(request)); 54 | 55 | switch (request) 56 | { 57 | case CreateExampleEntityDataRequest createExampleEntityDataRequest: 58 | return this.CreateExampleEntity(createExampleEntityDataRequest); 59 | case ExampleEntityDataRequest exampleEntityDataRequest: 60 | return this.GetExampleEntities(exampleEntityDataRequest); 61 | case UpdateExampleEntityDataRequest updateExampleEntityDataRequest: 62 | return this.UpdateExampleEntity(updateExampleEntityDataRequest); 63 | case DeleteExampleEntityDataRequest deleteExampleEntityDataRequest: 64 | return this.DeleteExampleEntity(deleteExampleEntityDataRequest); 65 | default: 66 | throw new NotSupportedException($"Request '{request.GetType()}' is not supported."); 67 | } 68 | } 69 | 70 | private async Task CreateExampleEntity(CreateExampleEntityDataRequest request) 71 | { 72 | ThrowIf.Null(request, nameof(request)); 73 | ThrowIf.Null(request.EntityData, nameof(request.EntityData)); 74 | 75 | long insertedId = 0; 76 | using (var databaseContext = new SqlServerDatabaseContext(request.RequestContext)) 77 | { 78 | ParameterSet parameters = new ParameterSet(); 79 | parameters["@i_ExampleInt"] = request.EntityData.IntData; 80 | parameters["@s_ExampleString"] = request.EntityData.StringData; 81 | var result = await databaseContext 82 | .ExecuteStoredProcedureAsync("[ext].CONTOSO_INSERTEXAMPLE", parameters, request.QueryResultSettings) 83 | .ConfigureAwait(continueOnCapturedContext: false); 84 | insertedId = result.Item2.Single().UnusualEntityId; 85 | } 86 | 87 | return new CreateExampleEntityDataResponse(insertedId); 88 | } 89 | 90 | private async Task GetExampleEntities(ExampleEntityDataRequest request) 91 | { 92 | ThrowIf.Null(request, "request"); 93 | 94 | using (DatabaseContext databaseContext = new DatabaseContext(request.RequestContext)) 95 | { 96 | var query = new SqlPagedQuery(request.QueryResultSettings) 97 | { 98 | DatabaseSchema = "ext", 99 | Select = new ColumnSet("EXAMPLEINT", "EXAMPLESTRING", "EXAMPLEID"), 100 | From = "CONTOSO_EXAMPLEVIEW", 101 | OrderBy = "EXAMPLEID", 102 | }; 103 | 104 | var queryResults = 105 | await databaseContext 106 | .ReadEntityAsync(query) 107 | .ConfigureAwait(continueOnCapturedContext: false); 108 | return new ExampleEntityDataResponse(queryResults); 109 | } 110 | } 111 | 112 | private async Task UpdateExampleEntity(UpdateExampleEntityDataRequest request) 113 | { 114 | ThrowIf.Null(request, nameof(request)); 115 | ThrowIf.Null(request.UpdatedExampleEntity, nameof(request.UpdatedExampleEntity)); 116 | 117 | if (request.ExampleEntityKey == 0) 118 | { 119 | throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ValueOutOfRange, $"{nameof(request.ExampleEntityKey)} cannot be 0"); 120 | } 121 | 122 | bool updateSuccess = false; 123 | using (var databaseContext = new SqlServerDatabaseContext(request.RequestContext)) 124 | { 125 | ParameterSet parameters = new ParameterSet(); 126 | parameters["@bi_Id"] = request.ExampleEntityKey; 127 | parameters["@i_ExampleInt"] = request.UpdatedExampleEntity.IntData; 128 | parameters["@s_ExampleString"] = request.UpdatedExampleEntity.StringData; 129 | int sprocErrorCode = 130 | await databaseContext 131 | .ExecuteStoredProcedureNonQueryAsync("[ext].CONTOSO_UPDATEEXAMPLE", parameters, request.QueryResultSettings) 132 | .ConfigureAwait(continueOnCapturedContext: false); 133 | updateSuccess = (sprocErrorCode == 0); 134 | } 135 | 136 | return new UpdateExampleEntityDataResponse(updateSuccess); 137 | } 138 | 139 | private async Task DeleteExampleEntity(DeleteExampleEntityDataRequest request) 140 | { 141 | ThrowIf.Null(request, nameof(request)); 142 | 143 | if (request.ExampleEntityKey == 0) 144 | { 145 | throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ValueOutOfRange, $"{nameof(request.ExampleEntityKey)} cannot be 0"); 146 | } 147 | 148 | bool deleteSuccess = false; 149 | using (var databaseContext = new SqlServerDatabaseContext(request.RequestContext)) 150 | { 151 | ParameterSet parameters = new ParameterSet(); 152 | parameters["@bi_Id"] = request.ExampleEntityKey; 153 | int sprocErrorCode = 154 | await databaseContext 155 | .ExecuteStoredProcedureNonQueryAsync("[ext].CONTOSO_DELETEEXAMPLE", parameters, request.QueryResultSettings) 156 | .ConfigureAwait(continueOnCapturedContext: false); 157 | deleteSuccess = sprocErrorCode == 0; 158 | } 159 | 160 | return new DeleteExampleEntityDataResponse(deleteSuccess); 161 | } 162 | } 163 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Triggers/ChannelDataServiceRequestTrigger.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Triggers 11 | { 12 | using Microsoft.Dynamics.Commerce.Runtime; 13 | using Microsoft.Dynamics.Commerce.Runtime.DataModel; 14 | using Microsoft.Dynamics.Commerce.Runtime.DataServices.Messages; 15 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 16 | using System; 17 | using System.Collections.Generic; 18 | using System.Linq; 19 | using System.Threading.Tasks; 20 | 21 | /// 22 | /// In this sample trigger, we will add property to channelConfiguartion in a thread-safe manner. 23 | /// That's important since channelConfiguration is a cached object, and concurrent modification on it can cause 100% CPU usage. 24 | /// 25 | public class ChannelDataServiceRequestTrigger : IRequestTriggerAsync 26 | { 27 | public static readonly string PropertyKey = "ExtConfigurationParameters"; 28 | 29 | /// 30 | /// Gets the supported requests for this trigger. 31 | /// 32 | public IEnumerable SupportedRequestTypes 33 | { 34 | get 35 | { 36 | return new Type[] 37 | { 38 | typeof(GetChannelConfigurationDataRequest), 39 | }; 40 | } 41 | } 42 | 43 | /// 44 | /// Pre trigger code. 45 | /// 46 | /// The request. 47 | public Task OnExecuting(Request request) 48 | { 49 | // It's only stub to handle async signature 50 | return Task.CompletedTask; 51 | } 52 | 53 | /// 54 | /// Post request trigger 55 | /// 56 | /// request 57 | /// response 58 | public async Task OnExecuted(Request request, Response response) 59 | { 60 | switch (request) 61 | { 62 | case GetChannelConfigurationDataRequest originalRequest: 63 | var data = response as SingleEntityDataServiceResponse; 64 | if (data != null && data.Entity != null && data.Entity.GetProperty(PropertyKey) == null) 65 | { 66 | // In this example, we just put the configuration parameters as part of channelConfiguration property. 67 | var configurationParameters = (await request.RequestContext.ExecuteAsync>(new GetConfigurationParametersDataRequest(originalRequest.ChannelId)).ConfigureAwait(false)).ToList(); 68 | 69 | // The reason we need a lock here because of thread-safety. 70 | // ChannelConfiguration is an object required in most crt request, and we cached in memory on the underlying ChannelDataService. 71 | // In case there is concurrent crt request, without lock here, it will modify against the same ChannelConfiguration and will result as 100% CPU usage in worst case. 72 | // NOTE: both SetProperty and ExtensionProperties are not thread-safe. 73 | // NOTE: same situation for DeviceConfiguration, in which it is also required in most crt request and is cached in underlying DataService. 74 | lock (data.Entity) 75 | { 76 | if (data.Entity.GetProperty(PropertyKey) == null) 77 | { 78 | data.Entity.SetProperty(PropertyKey, configurationParameters); 79 | } 80 | } 81 | } 82 | break; 83 | default: 84 | throw new NotSupportedException($"Request '{request.GetType()}' is not supported."); 85 | } 86 | } 87 | } 88 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CommerceRuntime/Triggers/DefinePosExtensionTrigger.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | namespace Contoso.CommerceRuntime.Triggers 11 | { 12 | using System; 13 | using System.Collections.Generic; 14 | using System.Threading.Tasks; 15 | using Microsoft.Dynamics.Commerce.Runtime; 16 | using Microsoft.Dynamics.Commerce.Runtime.DataModel; 17 | using Microsoft.Dynamics.Commerce.Runtime.Messages; 18 | 19 | /// 20 | /// Class that implements a post trigger for the GetCustomerDataRequest request type. 21 | /// 22 | public class DefinePosExtensionTrigger : IRequestTriggerAsync 23 | { 24 | /// 25 | /// Gets the supported requests for this trigger. 26 | /// 27 | public IEnumerable SupportedRequestTypes 28 | { 29 | get 30 | { 31 | return new[] { typeof(GetExtensionPackageDefinitionsRequest) }; 32 | } 33 | } 34 | 35 | /// 36 | /// Post trigger code to retrieve extension properties. 37 | /// 38 | /// The request. 39 | /// The response. 40 | public Task OnExecuted(Request request, Response response) 41 | { 42 | ThrowIf.Null(request, "request"); 43 | ThrowIf.Null(response, "response"); 44 | 45 | var getExtensionsResponse = (GetExtensionPackageDefinitionsResponse)response; 46 | var extensionPackageDefinition = new ExtensionPackageDefinition(); 47 | extensionPackageDefinition.Name = "Contoso.Commerce"; 48 | extensionPackageDefinition.Publisher = "Contoso"; 49 | extensionPackageDefinition.IsEnabled = true; 50 | 51 | getExtensionsResponse.ExtensionPackageDefinitions.Add(extensionPackageDefinition); 52 | 53 | return Task.CompletedTask; 54 | } 55 | 56 | /// 57 | /// Pre trigger code. 58 | /// 59 | /// The request. 60 | public Task OnExecuting(Request request) 61 | { 62 | return Task.CompletedTask; 63 | } 64 | } 65 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/CustomizationPackage.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | $(Publisher) 6 | $(PublisherDisplayName) 7 | $(Version) 8 | Contoso.Commerce 9 | Contoso Scale Unit Example Commerce Customization 10 | Contoso Scale Unit Example Commerce Customization 11 | 12 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/Download/ChannelData/Readme.md: -------------------------------------------------------------------------------- 1 | ##This folder will contain the Channel Data package. -------------------------------------------------------------------------------- /src/ScaleUnitSample/Download/Readme.md: -------------------------------------------------------------------------------- 1 | ###This folder is a container for the: 2 | 1. Sealed Scale Unit installer downloaded from LCS, 3 | 2. Channel Demo Data nuget package downloaded from the public nuget, 4 | 3. Channel DB configuration file downloaded from HQ. -------------------------------------------------------------------------------- /src/ScaleUnitSample/Installer/ScaleUnit.Sample.Installer.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Exe 6 | net472 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/Controls/Dialogs/Create/ExampleCreateDialog.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Example Create Dialog 6 | 7 | 8 |
9 |
10 |
Int data:
11 | 12 |
13 |
14 |
String data:
15 | 16 |
17 |
18 |
Extension property string data:
19 | 20 |
21 |
22 |
23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/Controls/Dialogs/Create/ExampleCreateDialogModule.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | import * as Dialogs from "PosApi/Create/Dialogs"; 11 | import { Entities } from "../../../DataService/DataServiceEntities.g"; 12 | import { ObjectExtensions } from "PosApi/TypeExtensions"; 13 | 14 | type DialogResolve = (updatedEntity: Entities.ExampleEntity) => void; 15 | type DialogReject = (reason: any) => void; 16 | 17 | export default class ExampleCreateDialog extends Dialogs.ExtensionTemplatedDialogBase { 18 | private _resolve: DialogResolve; 19 | private _data: Entities.ExampleEntity; 20 | 21 | constructor() { 22 | super(); 23 | this._data = { 24 | UnusualEntityId: -1, 25 | IntData: 0, 26 | StringData: "", 27 | ExtensionProperties: [{ 28 | Key: "customExtensionProp", 29 | Value: {} 30 | }] 31 | }; 32 | } 33 | 34 | public onReady(element: HTMLElement): void { 35 | let intDataInput: HTMLInputElement = element.querySelector("#intData") as HTMLInputElement; 36 | intDataInput.onchange = () => { this._data.IntData = intDataInput.valueAsNumber; }; 37 | 38 | let stringDataInput: HTMLInputElement = element.querySelector("#stringData") as HTMLInputElement; 39 | stringDataInput.onchange = () => { this._data.StringData = stringDataInput.value; }; 40 | 41 | let extensionPropertyStringDataInput: HTMLInputElement = element.querySelector("#extensionPropertyStringData") as HTMLInputElement; 42 | extensionPropertyStringDataInput.onchange = () => { 43 | this._data.ExtensionProperties[0].Value.StringValue = extensionPropertyStringDataInput.value; 44 | }; 45 | } 46 | 47 | public open(): Promise { 48 | let promise: Promise = new Promise((resolve: DialogResolve, reject: DialogReject) => { 49 | this._resolve = resolve; 50 | let option: Dialogs.ITemplatedDialogOptions = { 51 | title: "Create Example Entity", 52 | button1: { 53 | id: "btnCreate", 54 | label: this.context.resources.getString("string_2001"), 55 | isPrimary: true, 56 | onClick: this.btnUpdateClickHandler.bind(this) 57 | }, 58 | button2: { 59 | id: "btnCancel", 60 | label: this.context.resources.getString("string_2004"), 61 | onClick: this.btnCancelClickHandler.bind(this) 62 | }, 63 | onCloseX: () => this.btnCancelClickHandler() 64 | }; 65 | 66 | this.openDialog(option); 67 | }); 68 | 69 | return promise; 70 | } 71 | 72 | private btnUpdateClickHandler(): boolean { 73 | this.resolvePromise(this._data); 74 | return true; 75 | } 76 | 77 | private btnCancelClickHandler(): boolean { 78 | this.resolvePromise(null); 79 | return true; 80 | } 81 | 82 | private resolvePromise(editResult: Entities.ExampleEntity): void { 83 | if (ObjectExtensions.isFunction(this._resolve)) { 84 | this._resolve(editResult); 85 | this._resolve = null; 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/Controls/Dialogs/Display/PingResultDialog.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Ping Result Dialog 6 | 7 | 8 |
9 |

10 |

Unbound GET endpoint ping result:
11 |
12 |
13 | 14 |

15 |

16 |

Unbound POST endpoint ping result:
17 |
18 |
19 | 20 |

21 |
22 |
23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/Controls/Dialogs/Display/PingResultDialogModule.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | import * as Dialogs from "PosApi/Create/Dialogs"; 11 | import { ObjectExtensions } from "PosApi/TypeExtensions"; 12 | 13 | type DialogResolve = (result: any) => void; 14 | type DialogReject = (reason: any) => void; 15 | 16 | export default class PingResultDialog extends Dialogs.ExtensionTemplatedDialogBase { 17 | private _resolve: DialogResolve; 18 | private _pingUnboundGetResult: boolean; 19 | private _pingUnboundPostResult: boolean; 20 | 21 | constructor() { 22 | super(); 23 | } 24 | 25 | public onReady(element: HTMLElement): void { 26 | let getPingResult = element.querySelector("#UnboundGetResult") as HTMLSpanElement; 27 | getPingResult.textContent = this._pingUnboundGetResult ? "Success!" : "Failed."; 28 | let postPingResult = element.querySelector("#UnboundPostResult") as HTMLSpanElement; 29 | postPingResult.textContent = this._pingUnboundPostResult ? "Success!" : "Failed."; 30 | } 31 | 32 | public open(pingUnboundGetResult: boolean, pingUnboundPostResult: boolean): Promise { 33 | let promise: Promise = new Promise((resolve: DialogResolve, reject: DialogReject) => { 34 | this._resolve = resolve; 35 | this._pingUnboundGetResult = pingUnboundGetResult; 36 | this._pingUnboundPostResult = pingUnboundPostResult; 37 | this.openDialog({ 38 | title: "Ping Test Results", 39 | button1: { 40 | id: "btnOk", 41 | label: this.context.resources.getString("string_2005"), 42 | isPrimary: true, 43 | onClick: this.closeDialogHandler.bind(this) 44 | }, 45 | onCloseX: () => this.closeDialogHandler() 46 | }); 47 | }); 48 | 49 | return promise; 50 | } 51 | 52 | private closeDialogHandler(): boolean { 53 | this.resolvePromise(); 54 | return true; 55 | } 56 | 57 | private resolvePromise(): void { 58 | if (ObjectExtensions.isFunction(this._resolve)) { 59 | this._resolve(null); 60 | this._resolve = null; 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/Controls/Dialogs/Edit/ExampleEditDialog.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Example Edit Dialog 6 | 7 | 8 |
9 |
10 |
Int data:
11 | 12 |
13 |
14 |
String data:
15 | 16 |
17 |
18 |
Extension property string data:
19 | 20 |
21 |
22 |
23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/Controls/Dialogs/Edit/ExampleEditDialogModule.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | import * as Dialogs from "PosApi/Create/Dialogs"; 11 | import { Entities } from "../../../DataService/DataServiceEntities.g"; 12 | import { ObjectExtensions } from "PosApi/TypeExtensions"; 13 | 14 | type DialogResolve = (updatedEntity: Entities.ExampleEntity) => void; 15 | type DialogReject = (reason: any) => void; 16 | 17 | export default class ExampleEditDialog extends Dialogs.ExtensionTemplatedDialogBase { 18 | private _resolve: DialogResolve; 19 | private _data: Entities.ExampleEntity; 20 | 21 | constructor() { 22 | super(); 23 | } 24 | 25 | public onReady(element: HTMLElement): void { 26 | let intDataInput: HTMLInputElement = element.querySelector("#intData") as HTMLInputElement; 27 | intDataInput.value = this._data.IntData.toString(); 28 | intDataInput.onchange = () => { this._data.IntData = intDataInput.valueAsNumber; }; 29 | 30 | let stringDataInput: HTMLInputElement = element.querySelector("#stringData") as HTMLInputElement; 31 | stringDataInput.value = this._data.StringData; 32 | stringDataInput.onchange = () => { this._data.StringData = stringDataInput.value; }; 33 | 34 | let extensionPropertyStringDataInput: HTMLInputElement = element.querySelector("#extensionPropertyStringData") as HTMLInputElement; 35 | extensionPropertyStringDataInput.value = this._data.ExtensionProperties.filter(prop => prop.Key == "customExtensionProp").map(prop => prop.Value.StringValue)[0]; 36 | extensionPropertyStringDataInput.onchange = () => { 37 | if (this._data.ExtensionProperties.length > 0) { 38 | this._data.ExtensionProperties.filter(prop => prop.Key == "customExtensionProp")[0].Value.StringValue = extensionPropertyStringDataInput.value; 39 | } else { 40 | this._data.ExtensionProperties = [{ 41 | Key: "customExtensionProp", 42 | Value: { 43 | StringValue: extensionPropertyStringDataInput.value 44 | } 45 | }]; 46 | } 47 | }; 48 | } 49 | 50 | public open(dataToEdit: Entities.ExampleEntity): Promise { 51 | this._data = dataToEdit; 52 | 53 | let promise: Promise = new Promise((resolve: DialogResolve, reject: DialogReject) => { 54 | this._resolve = resolve; 55 | let option: Dialogs.ITemplatedDialogOptions = { 56 | title: "Update Example Entity", 57 | button1: { 58 | id: "btnUpdate", 59 | label: this.context.resources.getString("string_2002"), 60 | isPrimary: true, 61 | onClick: this.btnUpdateClickHandler.bind(this) 62 | }, 63 | button2: { 64 | id: "btnCancel", 65 | label: this.context.resources.getString("string_2004"), 66 | onClick: this.btnCancelClickHandler.bind(this) 67 | }, 68 | onCloseX: () => this.btnCancelClickHandler() 69 | }; 70 | 71 | this.openDialog(option); 72 | }); 73 | 74 | return promise; 75 | } 76 | 77 | private btnUpdateClickHandler(): boolean { 78 | this.resolvePromise(this._data); 79 | return true; 80 | } 81 | 82 | private btnCancelClickHandler(): boolean { 83 | this.resolvePromise(null); 84 | return true; 85 | } 86 | 87 | private resolvePromise(editResult: Entities.ExampleEntity): void { 88 | if (ObjectExtensions.isFunction(this._resolve)) { 89 | this._resolve(editResult); 90 | this._resolve = null; 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/POS.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | netstandard2.0 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/README.md: -------------------------------------------------------------------------------- 1 | This project contains samples on how to create POS extensions, 2 | 3 | [POS Extension Overview](https://docs.microsoft.com/en-us/dynamics365/commerce/dev-itpro/pos-extension/pos-extension-getting-started) 4 | 5 | Steps to run the sample: 6 | 7 | 1. If you are using Modern POS (MPOS), install the MPOS using the Sealed MPOS installer available in LCS, these samples will not work with legacy MPOS installers. 8 | 2. To install the Sealed MPOS installer follow the steps documented [here]( https://docs.microsoft.com/en-us/dynamics365/commerce/dev-itpro/enhanced-mass-deployment#modern-pos), if you are using Cloud POS (CPOS) then it’s not required to install the MPOS. 9 | 3. Before running the POS samples, install the [development environment prerequisites to build the POS samples.](https://docs.microsoft.com/en-us/dynamics365/commerce/dev-itpro/pos-extension/pos-extension-getting-started#prerequisites). 10 | 4. Build the POS sample, output installer package will be created. 11 | 5. Run the extension installer generated using command prompt. 12 | 13 | Ex: C:\ModernPos.Installer\bin\Debug\net472> .\ModernPos.Installer.exe install 14 | 15 | 6. After you've finished installing the extension, close Modern POS if it's running. Then, to load the extension, open Modern POS by using the Install/Update Modern POS icon on the desktop. The extensions .appx file will be installed. The previous steps copy the .appx file and other files to the correct location. 16 | 7. Validate the extension scenarios, search for a product in the POS search header bar, POS will navigate to the POS search view, you should see the Custom Navigate to Full System Example View app bar button and clicking that button POS should navigate to a custom view. 17 | 18 | Detailed MPOS and CPOS deployment and packaging steps are documented [here]( https://docs.microsoft.com/en-us/dynamics365/commerce/dev-itpro/pos-extension/mpos-extension-packaging). 19 | 20 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/Resources/Strings/en-US/resources.resjson: -------------------------------------------------------------------------------- 1 | //====================================================================================================== 2 | //======================================= Store Hour Sample comment. =================================== 3 | //====================================================================================================== 4 | { 5 | //======================== View extension titles. ======================== 6 | "string_0001" : "EXAMPLE VIEW", 7 | "_string_0001.comment" : "The Example View's title.", 8 | 9 | //======================== Column names. ======================== 10 | "string_1001" : "Int data", 11 | "_string_1001.comment" : "A column title for the int data on the Example Entity.", 12 | 13 | "string_1002" : "String data", 14 | "_string_2.comment" : "A column title for the string data on the Example Entity.", 15 | 16 | "string_1003" : "Extension property string data", 17 | "_string_3.comment" : "A column title for the extension property data on the Example Entity.", 18 | 19 | //======================== Dialog button labels. ======================== 20 | "string_2001" : "Create", 21 | "_string_4.comment" : "Create button used on a dialog for making a new entity.", 22 | 23 | "string_2002" : "Update", 24 | "_string_5.comment" : "Update button used to commit changes made to an entity in an update dialog.", 25 | 26 | "string_1006" : "Delete", 27 | "_string_6.comment" : "Delete button used to delete an entity instance in the list view.", 28 | 29 | "string_2004" : "Cancel", 30 | "_string_7.comment" : "Cancel button shared across dialogs.", 31 | 32 | "string_2005" : "OK", 33 | "_string_8.comment" : "OK button used to dismiss a dialog.", 34 | 35 | //======================== Command labels. ======================== 36 | "string_3001" : "Ping Test", 37 | "_string_3001.comment" : "A button label used in the app bar, when pressed two unbound endpoints are pinged." 38 | } 39 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/ViewExtensions/Search/NavigateToExampleViewCommand.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | import { IExtensionCommandContext } from "PosApi/Extend/Views/AppBarCommands"; 11 | import * as SearchView from "PosApi/Extend/Views/SearchView"; 12 | 13 | export default class NavigateToExampleViewCommand extends SearchView.ProductSearchExtensionCommandBase { 14 | /** 15 | * Creates a new instance of the NavigateToExampleViewCommand class. 16 | * @param {IExtensionCommandContext} context The command context. 17 | * @remarks The command context contains APIs through which a command can communicate with POS. 18 | */ 19 | constructor(context: IExtensionCommandContext) { 20 | super(context); 21 | 22 | this.id = "navigateToExampleViewCommand"; 23 | this.label = "Navigate to Full System Example View"; 24 | this.extraClass = "iconGo"; 25 | } 26 | 27 | /** 28 | * Initializes the command. 29 | * @param {ProductDetailsView.IProductDetailsExtensionCommandState} state The state used to initialize the command. 30 | */ 31 | protected init(state: SearchView.IProductSearchExtensionCommandState): void { 32 | this.canExecute = true; 33 | this.isVisible = true; 34 | } 35 | 36 | /** 37 | * Executes the command. 38 | */ 39 | protected execute(): void { 40 | this.context.navigator.navigate("ExampleView"); 41 | } 42 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/Views/ExampleView.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Example View 6 | 7 | 8 |
9 |
10 |
11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/Views/ExampleView.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | import * as Views from "PosApi/Create/Views"; 11 | import { Entities } from "../DataService/DataServiceEntities.g"; 12 | import ExampleViewModel from "./ExampleViewModel"; 13 | import { IDataList, IDataListOptions, DataListInteractionMode } from "PosApi/Consume/Controls"; 14 | import { ObjectExtensions, ArrayExtensions } from "PosApi/TypeExtensions"; 15 | 16 | /** 17 | * The controller for ExampleView. 18 | */ 19 | export default class StoreHoursView extends Views.CustomViewControllerBase { 20 | public readonly viewModel: ExampleViewModel; 21 | public dataList: IDataList; 22 | 23 | constructor(context: Views.ICustomViewControllerContext) { 24 | let config: Views.ICustomViewControllerConfiguration = { 25 | title: context.resources.getString("string_0001"), 26 | commandBar: { 27 | commands: [ 28 | { 29 | name: "Create", 30 | label: context.resources.getString("string_2001"), 31 | icon: Views.Icons.Add, 32 | isVisible: true, 33 | canExecute: true, 34 | execute: (args: Views.CustomViewControllerExecuteCommandArgs): void => { 35 | this.viewModel.createExampleEntity().then((entityCreated) => { 36 | if (entityCreated) { 37 | // Re-load the list, since the underlying data was amended 38 | this.dataList.data = this.viewModel.loadedData; 39 | } 40 | }); 41 | } 42 | }, 43 | { 44 | name: "Edit", 45 | label: context.resources.getString("string_2002"), 46 | icon: Views.Icons.Edit, 47 | isVisible: true, 48 | canExecute: false, 49 | execute: (args: Views.CustomViewControllerExecuteCommandArgs): void => { 50 | this.state.isProcessing = true; 51 | this.viewModel.editExampleEntity().then((editsMade) => { 52 | if (editsMade) { 53 | // Re-load the list since the underlying data changed 54 | this.dataList.data = this.viewModel.loadedData; 55 | } 56 | this.state.isProcessing = false; 57 | }); 58 | } 59 | }, 60 | { 61 | name: "Delete", 62 | label: context.resources.getString("string_1006"), 63 | icon: Views.Icons.Delete, 64 | isVisible: true, 65 | canExecute: false, 66 | execute: (args: Views.CustomViewControllerExecuteCommandArgs): void => { 67 | this.state.isProcessing = true; 68 | this.viewModel.deleteExampleEntity().then(() => { 69 | // Re-load the list, since the data has changed 70 | this.dataList.data = this.viewModel.loadedData; 71 | this.state.isProcessing = false; 72 | }); 73 | } 74 | }, 75 | { 76 | name: "PingTest", 77 | label: context.resources.getString("string_3001"), 78 | icon: Views.Icons.LightningBolt, 79 | isVisible: true, 80 | canExecute: true, 81 | execute: (args: Views.CustomViewControllerExecuteCommandArgs): void => { 82 | this.state.isProcessing = true; 83 | this.viewModel.runPingTest().then(() => { 84 | this.state.isProcessing = false; 85 | }); 86 | } 87 | } 88 | ] 89 | } 90 | }; 91 | 92 | super(context, config); 93 | 94 | // Initialize the view model. 95 | this.viewModel = new ExampleViewModel(context); 96 | } 97 | 98 | public dispose(): void { 99 | ObjectExtensions.disposeAllProperties(this); 100 | } 101 | 102 | public onReady(element: HTMLElement): void { 103 | // DataList 104 | let dataListOptions: IDataListOptions = { 105 | interactionMode: DataListInteractionMode.SingleSelect, 106 | data: this.viewModel.loadedData, 107 | columns: [ 108 | { 109 | title: this.context.resources.getString("string_1001"), // Int data 110 | ratio: 40, collapseOrder: 1, minWidth: 100, 111 | computeValue: (data: Entities.ExampleEntity): string => data.IntData.toString() 112 | }, 113 | { 114 | title: this.context.resources.getString("string_1002"), // String data 115 | ratio: 30, collapseOrder: 2, minWidth: 100, 116 | computeValue: (data: Entities.ExampleEntity): string => data.StringData 117 | }, 118 | { 119 | title: this.context.resources.getString("string_1003"), // Extension property string data 120 | ratio: 30, collapseOrder: 3, minWidth: 100, 121 | computeValue: (data: Entities.ExampleEntity): string => { 122 | return ArrayExtensions.firstOrUndefined( 123 | data.ExtensionProperties.filter(prop => prop.Key == "customExtensionProp").map(prop => prop.Value.StringValue) 124 | ); 125 | } 126 | } 127 | ] 128 | }; 129 | 130 | let dataListRootElem: HTMLDivElement = element.querySelector("#exampleListView") as HTMLDivElement; 131 | this.dataList = this.context.controlFactory.create(this.context.logger.getNewCorrelationId(), "DataList", dataListOptions, dataListRootElem); 132 | 133 | this.dataList.addEventListener("SelectionChanged", (eventData: { items: Entities.ExampleEntity[] }) => { 134 | this.viewModel.seletionChanged(eventData.items); 135 | 136 | // Update the command states to reflect the current selection state. 137 | this.state.commandBar.commands.forEach( 138 | command => command.canExecute = ( 139 | ["Create", "PingTest"].some(name => name == command.name) || 140 | this.viewModel.isItemSelected() 141 | ) 142 | ); 143 | }); 144 | 145 | this.state.isProcessing = true; 146 | this.viewModel.load().then((): void => { 147 | // Initialize the data list with what the view model loaded 148 | this.dataList.data = this.viewModel.loadedData; 149 | this.state.isProcessing = false; 150 | }); 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/Views/ExampleViewModel.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SAMPLE CODE NOTICE 3 | * 4 | * THIS SAMPLE CODE IS MADE AVAILABLE AS IS. MICROSOFT MAKES NO WARRANTIES, WHETHER EXPRESS OR IMPLIED, 5 | * OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OR CONDITIONS OF MERCHANTABILITY. 6 | * THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS SAMPLE CODE REMAINS WITH THE USER. 7 | * NO TECHNICAL SUPPORT IS PROVIDED. YOU MAY NOT DISTRIBUTE THIS CODE UNLESS YOU HAVE A LICENSE AGREEMENT WITH MICROSOFT THAT ALLOWS YOU TO DO SO. 8 | */ 9 | 10 | import { IExtensionViewControllerContext } from "PosApi/Create/Views"; 11 | import { Entities } from "../DataService/DataServiceEntities.g"; 12 | import * as Messages from "../DataService/DataServiceRequests.g"; 13 | import ExampleCreateDialog from "../Controls/Dialogs/Create/ExampleCreateDialogModule"; 14 | import ExampleEditDialog from "../Controls/Dialogs/Edit/ExampleEditDialogModule"; 15 | import PingResultDialog from "../Controls/Dialogs/Display/PingResultDialogModule"; 16 | import { ObjectExtensions, ArrayExtensions } from "PosApi/TypeExtensions"; 17 | 18 | /** 19 | * The ViewModel for ExampleView. 20 | */ 21 | export default class ExampleViewModel { 22 | public title: string; 23 | public loadedData: Entities.ExampleEntity[]; 24 | public isItemSelected: () => boolean; 25 | private _selectedItem: Entities.ExampleEntity; 26 | private _context: IExtensionViewControllerContext; 27 | 28 | constructor(context: IExtensionViewControllerContext) { 29 | this._context = context; 30 | this.title = context.resources.getString("string_0001"); 31 | this.loadedData = []; 32 | this.isItemSelected = () => !ObjectExtensions.isNullOrUndefined(this._selectedItem); 33 | } 34 | 35 | public load(): Promise { 36 | return this._context.runtime 37 | .executeAsync(new Messages.BoundController.GetAllExampleEntitiesRequest()) 38 | .then(response => { 39 | if (!response.canceled) { 40 | this.loadedData = response.data.result; 41 | } 42 | }); 43 | } 44 | 45 | /** 46 | * Handler for list item selection. 47 | * @param {Entities.ExampleEntity[]} items 48 | */ 49 | public seletionChanged(items: Entities.ExampleEntity[]): Promise { 50 | this._context.logger.logInformational("Item selected:" + JSON.stringify(items)); 51 | this._selectedItem = ArrayExtensions.firstOrUndefined(items); 52 | return Promise.resolve(); 53 | } 54 | 55 | public createExampleEntity(): Promise { 56 | let dialog: ExampleCreateDialog = new ExampleCreateDialog(); 57 | return dialog 58 | .open() 59 | .then(newItem => { 60 | // No action if the dialog was canceled 61 | if (ObjectExtensions.isNullOrUndefined(newItem)) { 62 | this._context.logger.logInformational("Create canceled."); 63 | return Promise.resolve(false);; 64 | } 65 | 66 | this._context.logger.logInformational("Item created with data: " + JSON.stringify(newItem)); 67 | // Create the entity and reload the loaded data to reflect the change: 68 | return this._context.runtime 69 | .executeAsync(new Messages.BoundController.CreateExampleEntityRequest(newItem)) 70 | .then(response => { 71 | if (!response.canceled && response.data.result != 0) { 72 | this._context.logger.logInformational("Create success for id: " + response.data.result); 73 | return this.load().then((): boolean => true); // Load the updated data 74 | } 75 | this._context.logger.logInformational("Create failed for entity: " + JSON.stringify(newItem)); 76 | return Promise.resolve(false); 77 | }); 78 | }).catch(reason => { 79 | this._context.logger.logError("Error occurred in the create dialog: " + JSON.stringify(reason)); 80 | return Promise.resolve(false);; 81 | }); 82 | } 83 | 84 | public editExampleEntity(): Promise { 85 | let dialog: ExampleEditDialog = new ExampleEditDialog(); 86 | return dialog 87 | .open(this._selectedItem) 88 | .then(updatedItem => { 89 | // No action if the dialog was canceled 90 | if (ObjectExtensions.isNullOrUndefined(updatedItem)) { 91 | this._context.logger.logInformational("Update canceled for data: " + JSON.stringify(updatedItem)); 92 | return Promise.resolve(false); 93 | } 94 | 95 | this._context.logger.logInformational("Updated data is: " + JSON.stringify(updatedItem)); 96 | // Perform the update and reload the loaded data to reflect the change: 97 | return this._context.runtime 98 | .executeAsync(new Messages.BoundController.UpdateExampleEntityRequest(updatedItem.UnusualEntityId, updatedItem)) 99 | .then(response => { 100 | if (!response.canceled && response.data.result) { 101 | this._context.logger.logInformational("Update success for id: " + updatedItem.UnusualEntityId); 102 | return this.load().then((): boolean => true); // Load the updated data 103 | } 104 | this._context.logger.logInformational("Update failed for id: " + updatedItem.UnusualEntityId); 105 | return Promise.resolve(false); 106 | }); 107 | }).catch(reason => { 108 | this._context.logger.logError("Error occurred in the edit dialog: " + JSON.stringify(reason)); 109 | return Promise.resolve(false); 110 | }); 111 | } 112 | 113 | public deleteExampleEntity(): Promise { 114 | // Delete the selected entity and reload the loaded data to reflect the change: 115 | return this._context.runtime 116 | .executeAsync(new Messages.BoundController.DeleteExampleEntityRequest(this._selectedItem.UnusualEntityId)) 117 | .then(response => { 118 | if (!response.canceled && response.data.result) { 119 | this._context.logger.logInformational("Delete success for id: " + this._selectedItem.UnusualEntityId); 120 | return this.load(); // Load the updated data 121 | } 122 | this._context.logger.logInformational("Delete failed for id " + this._selectedItem.UnusualEntityId); 123 | return Promise.resolve(); 124 | }); 125 | } 126 | 127 | public runPingTest(): Promise { 128 | return this._context.runtime 129 | .executeAsync(new Messages.StoreOperations.SimplePingGetRequest()) 130 | .then(pingGetResponse => { 131 | return this._context.runtime 132 | .executeAsync(new Messages.StoreOperations.SimplePingPostRequest()) 133 | .then(pingPostResponse => { 134 | let pingResultDialog: PingResultDialog = new PingResultDialog(); 135 | return pingResultDialog.open(pingGetResponse.data.result, pingPostResponse.data.result); 136 | }); 137 | }); 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./devDependencies/schemas/manifestSchema.json", 3 | "name": "Contoso.Pos.FullSystemExample.Sample", 4 | "publisher": "Contoso", 5 | "version": "1.0.0", 6 | "minimumPosVersion": "9.29.0.0", 7 | "description": "An extension package that makes use of a Retail Server extension. Also works off-line.", 8 | "components": { 9 | "resources": { 10 | "supportedUICultures": [ "en-US" ], 11 | "fallbackUICulture": "en-US", 12 | "culturesDirectoryPath": "Resources/Strings", 13 | "stringResourcesFileName": "resources.resjson" 14 | }, 15 | "extend": { 16 | "views": { 17 | "SearchView": { 18 | "productAppBarCommands": [ 19 | { "modulePath": "ViewExtensions/Search/NavigateToExampleViewCommand" } 20 | ] 21 | } 22 | } 23 | }, 24 | "create": { 25 | "templatedDialogs": [ 26 | { 27 | "htmlPath": "Controls/Dialogs/Create/ExampleCreateDialog.html", 28 | "modulePath": "Controls/Dialogs/Create/ExampleCreateDialogModule" 29 | }, 30 | { 31 | "htmlPath": "Controls/Dialogs/Edit/ExampleEditDialog.html", 32 | "modulePath": "Controls/Dialogs/Edit/ExampleEditDialogModule" 33 | }, 34 | { 35 | "htmlPath": "Controls/Dialogs/Display/PingResultDialog.html", 36 | "modulePath": "Controls/Dialogs/Display/PingResultDialogModule" 37 | } 38 | ], 39 | "views": [ 40 | { 41 | "title": "Sample Extension View", 42 | "pageName": "ExampleView", 43 | "phonePageName": "ExampleView", 44 | "viewDirectory": "Views/", 45 | "viewControllerPath": "Views/ExampleView" 46 | } 47 | ] 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/POS/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./devDependencies/pos-tsconfig-base.json" 3 | } -------------------------------------------------------------------------------- /src/ScaleUnitSample/ScaleUnit.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.0.32112.339 5 | MinimumVisualStudioVersion = 16.0.0.0 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChannelDatabase", "ChannelDatabase\ChannelDatabase.csproj", "{A8166D6A-9868-43C8-8732-0D2DD6C9826C}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommerceRuntime", "CommerceRuntime\CommerceRuntime.csproj", "{59AA9A4E-084B-4DF4-83D2-151759F6944F}" 9 | EndProject 10 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ScaleUnit", "ScaleUnit\ScaleUnit.csproj", "{2888FAB4-68EF-4670-ABFF-20E1DBAA32F4}" 11 | EndProject 12 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "POS", "POS\POS.csproj", "{F69DE011-47C5-46FC-A9E0-88A62650B082}" 13 | EndProject 14 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ScaleUnit.Installer", "Installer\ScaleUnit.Sample.Installer.csproj", "{E937C87D-E159-44F0-AD36-DEAA6D72E678}" 15 | EndProject 16 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSharpProxyGenerator", "CommerceProxyGenerator\CSharp\CSharpProxyGenerator.csproj", "{27BE7504-C928-4154-8724-BED44EC65FB5}" 17 | EndProject 18 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TypeScriptProxyGenerator", "CommerceProxyGenerator\TypeScript\TypeScriptProxyGenerator.csproj", "{8D6CA620-80BE-4518-BB50-75C2DA720379}" 19 | EndProject 20 | Global 21 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 22 | Debug|Any CPU = Debug|Any CPU 23 | Release|Any CPU = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 26 | {A8166D6A-9868-43C8-8732-0D2DD6C9826C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {A8166D6A-9868-43C8-8732-0D2DD6C9826C}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {A8166D6A-9868-43C8-8732-0D2DD6C9826C}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {A8166D6A-9868-43C8-8732-0D2DD6C9826C}.Release|Any CPU.Build.0 = Release|Any CPU 30 | {59AA9A4E-084B-4DF4-83D2-151759F6944F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 31 | {59AA9A4E-084B-4DF4-83D2-151759F6944F}.Debug|Any CPU.Build.0 = Debug|Any CPU 32 | {59AA9A4E-084B-4DF4-83D2-151759F6944F}.Release|Any CPU.ActiveCfg = Release|Any CPU 33 | {59AA9A4E-084B-4DF4-83D2-151759F6944F}.Release|Any CPU.Build.0 = Release|Any CPU 34 | {2888FAB4-68EF-4670-ABFF-20E1DBAA32F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 35 | {2888FAB4-68EF-4670-ABFF-20E1DBAA32F4}.Debug|Any CPU.Build.0 = Debug|Any CPU 36 | {2888FAB4-68EF-4670-ABFF-20E1DBAA32F4}.Release|Any CPU.ActiveCfg = Release|Any CPU 37 | {2888FAB4-68EF-4670-ABFF-20E1DBAA32F4}.Release|Any CPU.Build.0 = Release|Any CPU 38 | {F69DE011-47C5-46FC-A9E0-88A62650B082}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 39 | {F69DE011-47C5-46FC-A9E0-88A62650B082}.Debug|Any CPU.Build.0 = Debug|Any CPU 40 | {F69DE011-47C5-46FC-A9E0-88A62650B082}.Release|Any CPU.ActiveCfg = Release|Any CPU 41 | {F69DE011-47C5-46FC-A9E0-88A62650B082}.Release|Any CPU.Build.0 = Release|Any CPU 42 | {E937C87D-E159-44F0-AD36-DEAA6D72E678}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 43 | {E937C87D-E159-44F0-AD36-DEAA6D72E678}.Debug|Any CPU.Build.0 = Debug|Any CPU 44 | {E937C87D-E159-44F0-AD36-DEAA6D72E678}.Release|Any CPU.ActiveCfg = Release|Any CPU 45 | {E937C87D-E159-44F0-AD36-DEAA6D72E678}.Release|Any CPU.Build.0 = Release|Any CPU 46 | {27BE7504-C928-4154-8724-BED44EC65FB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 47 | {27BE7504-C928-4154-8724-BED44EC65FB5}.Debug|Any CPU.Build.0 = Debug|Any CPU 48 | {27BE7504-C928-4154-8724-BED44EC65FB5}.Release|Any CPU.ActiveCfg = Release|Any CPU 49 | {27BE7504-C928-4154-8724-BED44EC65FB5}.Release|Any CPU.Build.0 = Release|Any CPU 50 | {8D6CA620-80BE-4518-BB50-75C2DA720379}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 51 | {8D6CA620-80BE-4518-BB50-75C2DA720379}.Debug|Any CPU.Build.0 = Debug|Any CPU 52 | {8D6CA620-80BE-4518-BB50-75C2DA720379}.Release|Any CPU.ActiveCfg = Release|Any CPU 53 | {8D6CA620-80BE-4518-BB50-75C2DA720379}.Release|Any CPU.Build.0 = Release|Any CPU 54 | EndGlobalSection 55 | GlobalSection(SolutionProperties) = preSolution 56 | HideSolutionNode = FALSE 57 | EndGlobalSection 58 | GlobalSection(ExtensibilityGlobals) = postSolution 59 | SolutionGuid = {D8D07A3D-D311-441B-A70E-A959154EE41B} 60 | EndGlobalSection 61 | EndGlobal 62 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/ScaleUnit/README.md: -------------------------------------------------------------------------------- 1 | This sample project showcases how to generate the package for the Cloud Scale Unit. The project consumes the Microsoft.Dynamics.Commerce.Sdk.ScaleUnit to generate the package. 2 | Edit the project file and include the required extension project(Commerce runtime, Channel database and POS extension project) as project reference and then build the project to generate the output Cloud Scale Unit package. 3 | 4 | Based on the extension projects added as reference, the project parses the added reference project and generate the Cloud Scale Unitpackage. All the required config files (CommerceRuntime.Ext, Web.config) for the Cloud Scale Unit package will be auto generated by the Cloud Scale Unit packaging project, don't edit these files. 5 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/ScaleUnit/ScaleUnit.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | netstandard2.0 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/Scripts/Banner.txt: -------------------------------------------------------------------------------- 1 | ____________ ______ _ 2 | / ____/ ____/ / ____/_ ______ ___ _____(_)__ ____ ________ 3 | / /_ /___ \ / __/ | |/_/ __ \/ _ \/ ___/ / _ \/ __ \/ ___/ _ \ 4 | / __/ ____/ / / /___ _> 5 | Import-Module (Join-Path $PSScriptRoot "ErrorDecorator.psm1") 6 | 7 | $psBitnessIs64 = [Environment]::Is64BitProcess 8 | if (-not $psBitnessIs64) 9 | { 10 | $NewLine = [Environment]::NewLine 11 | $bitnessErrorMessage = "The PowerShell version installed appears to be 32-bit. The scripts require the 64-bit PowerShell in order to correctly launch the installers needed to set up the debugging." 12 | $bitnessErrorMessage += $NewLine + "Please download and install the 64-bit PowerShell from" 13 | $bitnessErrorMessage += $NewLine + "https://github.com/PowerShell/PowerShell/releases/latest" 14 | $bitnessErrorMessage += $NewLine + "The link to the version you need will look like 'PowerShell--win-x64.msi'." 15 | $bitnessErrorMessage += $NewLine + "You will need to restart the VS Code after installing the correct version of the PowerShell." 16 | 17 | Write-Host 18 | Write-CustomError $bitnessErrorMessage 19 | Write-Host 20 | exit 1 21 | } 22 | # SIG # Begin signature block 23 | # MIIoJAYJKoZIhvcNAQcCoIIoFTCCKBECAQExDzANBglghkgBZQMEAgEFADB5Bgor 24 | # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG 25 | # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAs5LsTkUTpaPdv 26 | # SM/2O59nbn531mP7cStSYKYKvZFYTaCCDXYwggX0MIID3KADAgECAhMzAAAEBGx0 27 | # Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD 28 | # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy 29 | # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p 30 | # bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw 31 | # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u 32 | # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy 33 | # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 34 | # AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz 35 | # NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo 36 | # DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3 37 | # a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF 38 | # HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy 39 | # 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE 40 | # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w 41 | # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW 42 | # MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci 43 | # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j 44 | # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG 45 | # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu 46 | # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 47 | # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC 48 | # Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj 49 | # L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp 50 | # h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3 51 | # cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X 52 | # dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL 53 | # E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi 54 | # u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1 55 | # sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq 56 | # 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb 57 | # DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/ 58 | # V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq 59 | # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x 60 | # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv 61 | # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 62 | # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG 63 | # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG 64 | # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg 65 | # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC 66 | # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 67 | # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr 68 | # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg 69 | # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy 70 | # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 71 | # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh 72 | # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k 73 | # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB 74 | # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn 75 | # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 76 | # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w 77 | # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o 78 | # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD 79 | # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa 80 | # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny 81 | # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG 82 | # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t 83 | # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV 84 | # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 85 | # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG 86 | # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl 87 | # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb 88 | # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l 89 | # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 90 | # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 91 | # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 92 | # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam 93 | # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa 94 | # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah 95 | # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA 96 | # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt 97 | # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr 98 | # /Xmfwb1tbWrJUnMTDXpQzTGCGgQwghoAAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw 99 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN 100 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp 101 | # Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB 102 | # BQCggZAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIE 103 | # IFB2cIta1l7ufxah49yOes8QIUBhZR+h9qIk5XuYB8G3MEIGCisGAQQBgjcCAQwx 104 | # NDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29m 105 | # dC5jb20wDQYJKoZIhvcNAQEBBQAEggEANYlMi6SaNWTNkBZ0xoIewrKMJ6gSw23P 106 | # iIPYyfpMGx2ysGpeZ7WirRhbWv8jCIcIJYecZyzlE56gLWTS/MywxVKxfOFnQ5Vp 107 | # Wd2Mi0qNUyVuIVEkVTvJI/5PQkTKsFmN0cev4WF0MXqz1zi2u+Drtzg75/k473HT 108 | # +6jtkLmbY2nzV9BNWrBvXZOiuIAmgYteNZxYsIPe9k9WDECkc0ZQTV82+DDkrbIP 109 | # u4S68M+pOnQxrGIYXLIuUpg4NhVj/+h8uzqfy8BvpSSR42zfqMbufpSVdd1FC2W6 110 | # tnPXMZfdXtHZcbftNw1wYLBGSf4NHwTURvh33SZ1rTcsqcr1TOZuRaGCF6wwgheo 111 | # BgorBgEEAYI3AwMBMYIXmDCCF5QGCSqGSIb3DQEHAqCCF4UwgheBAgEDMQ8wDQYJ 112 | # YIZIAWUDBAIBBQAwggFZBgsqhkiG9w0BCRABBKCCAUgEggFEMIIBQAIBAQYKKwYB 113 | # BAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCDn7GNZj3+AWCI/LBUTP1irMZCTuOAL 114 | # h/QhAJfJgl+XpgIGZ7Yu/j2/GBIyMDI1MDMzMTEwMTA0MC4wNVowBIACAfSggdmk 115 | # gdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH 116 | # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNV 117 | # BAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UE 118 | # CxMeblNoaWVsZCBUU1MgRVNOOjMyMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNy 119 | # b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR+zCCBygwggUQoAMCAQICEzMAAAH4 120 | # o6EmDAxASP4AAQAAAfgwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzAR 121 | # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p 122 | # Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh 123 | # bXAgUENBIDIwMTAwHhcNMjQwNzI1MTgzMTA4WhcNMjUxMDIyMTgzMTA4WjCB0zEL 124 | # MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v 125 | # bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWlj 126 | # cm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQLEx5uU2hp 127 | # ZWxkIFRTUyBFU046MzIxQS0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBU 128 | # aW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC 129 | # AQDFHbeldicPYG44N15ezYK79PmQoj5sDDxxu03nQKb8UCuNfIvhFOox7qVpD8Kp 130 | # 4xPGByS9mvUmtbQyLgXXmvH9W94aEoGahvjkOY5xXnHLHuH1OTn00CXk80wBYoAh 131 | # Z/bvRJYABbFBulUiGE9YKdVXei1W9qERp3ykyahJetPlns2TVGcHvQDZur0eTzAh 132 | # 4Le8G7ERfYTxfnQiAAezJpH2ugWrcSvNQQeVLxidKrfe6Lm4FysU5wU4Jkgu5UVV 133 | # OASpKtfhSJfR62qLuNS0rKmAh+VplxXlwjlcj94LFjzAM2YGmuFgw2VjF2ZD1otE 134 | # NxMpa111amcm3KXl7eAe5iiPzG4NDRdk3LsRJHAkgrTf6tNmp9pjIzhdIrWzRpr6 135 | # Y7r2+j82YnhH9/X4q5wE8njJR1uolYzfEy8HAtjJy+KAj9YriSA+iDRQE1zNpDAN 136 | # VelxT5Mxw69Y/wcFaZYlAiZNkicAWK9epRoFujfAB881uxCm800a7/XamDQXw78J 137 | # 1F+A8d86EhZDQPwAsJj4uyLBvNx6NutWXg31+fbA6DawNrxF82gPrXgjSkWPL+Wr 138 | # U2wGj1XgZkGKTNftmNYJGB3UUIFcal+kOKQeNDTlg6QBqR1YNPZsZJpRkkZVi16k 139 | # ik9MCzWB3+9SiBx2IvnWjuyG4ciUHpBJSJDbhdiFFttAIQIDAQABo4IBSTCCAUUw 140 | # HQYDVR0OBBYEFL3OxnPPntCVPmeu3+iK0u/U5Du2MB8GA1UdIwQYMBaAFJ+nFV0A 141 | # XmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWlj 142 | # cm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQ 143 | # Q0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0 144 | # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIw 145 | # VGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwFgYD 146 | # VR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEB 147 | # CwUAA4ICAQBh+TwbPOkRWcaXvLqhejK0JvjYfHpM4DT52RoEjfp+0MT20u5tRr/E 148 | # xscHmtw2JGEUdn3dF590+lzj4UXQMCXmU/zEoA77b3dFY8oMU4UjGC1ljTy3wP1x 149 | # JCmAZTPLDeURNl5s0sQDXsD8JOkDYX26HyPzgrKB4RuP5uJ1YOIR9rKgfYDn/nLA 150 | # knEi4vMVUdpy9bFIIqgX2GVKtlIbl9dZLedqZ/i23r3RRPoAbJYsVZ7z3lygU/Gb 151 | # +bRQgyOOn1VEUfudvc2DZDiA9L0TllMxnqcCWZSJwOPQ1cCzbBC5CudidtEAn8NB 152 | # bfmoujsNrD0Cwi2qMWFsxwbryANziPvgvYph7/aCgEcvDNKflQN+1LUdkjRlGyqY 153 | # 0cjRNm+9RZf1qObpJ8sFMS2hOjqAs5fRQP/2uuEaN2SILDhLBTmiwKWCqCI0wrmd 154 | # 2TaDEWUNccLIunmoHoGg+lzzZGE7TILOg/2C/vO/YShwBYSyoTn7Raa7m5quZ+9z 155 | # OIt9TVJjbjQ5lbyV3ixLx+fJuf+MMyYUCFrNXXMfRARFYSx8tKnCQ5doiZY0UnmW 156 | # Zyd/VVObpyZ9qxJxi0SWmOpn0aigKaTVcUCk5E+z887jchwWY9HBqC3TSJBLD6sF 157 | # 4gfTQpCr4UlP/rZIHvSD2D9HxNLqTpv/C3ZRaGqtb5DyXDpfOB7H9jCCB3EwggVZ 158 | # oAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAwgYgxCzAJ 159 | # BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k 160 | # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jv 161 | # c29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIxMDkzMDE4 162 | # MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh 163 | # c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD 164 | # b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIw 165 | # MTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57RyIQt5osvX 166 | # JHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VTcVrifkpa 167 | # /rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhxXFExN6AK 168 | # OG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQHJ1S/rbo 169 | # YiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1KL3jtIck 170 | # w+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s4mKyzbni 171 | # jYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUgfX782Z5F 172 | # 37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3Rxjtp+iZ 173 | # fD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je1yh2AuIz 174 | # GHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUYhEfb3BvR 175 | # /bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUYP3irRbb1 176 | # Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGCNxUBBAUC 177 | # AwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4wHQYDVR0O 178 | # BBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYBBAGCN0yD 179 | # fQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv 180 | # cHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkr 181 | # BgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw 182 | # AwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBN 183 | # MEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0 184 | # cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoG 185 | # CCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01p 186 | # Y1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAnVV9 187 | # /Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/aZGx80HU5 188 | # bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp4LoJ7nvf 189 | # am++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq95W2KFUn 190 | # 0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qBwoEZQhlS 191 | # dYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG+jIa2Zb0 192 | # j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3BFARxv2T5 193 | # JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77IVRrakUR 194 | # R6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJfn6Tvsv4 195 | # O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K6TT4JDVn 196 | # K+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDxyKs6ijoI 197 | # Yn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNWMIICPgIBATCCAQGhgdmk 198 | # gdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH 199 | # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNV 200 | # BAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UE 201 | # CxMeblNoaWVsZCBUU1MgRVNOOjMyMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNy 202 | # b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQC2RC395tZJ 203 | # DkOcb5opHM8QsIUT0aCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX 204 | # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg 205 | # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy 206 | # MDEwMA0GCSqGSIb3DQEBCwUAAgUA65S9lzAiGA8yMDI1MDMzMTA3MDcwM1oYDzIw 207 | # MjUwNDAxMDcwNzAzWjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDrlL2XAgEAMAcC 208 | # AQACAiHSMAcCAQACAhijMAoCBQDrlg8XAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwG 209 | # CisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQEL 210 | # BQADggEBACaR4nYg4NuwP6HZ5QpK/Y0N9ExD6Yptsyeh1/e9YhZRc/987uaCeyJY 211 | # spF4qbYcDnySHjVL8QiwO1KZPV0e1uKmzKVxA0EF/Em8VL8AZVg3Q70d1Fdb/WWn 212 | # +V9Cq0UKiDjUpLve2TY507iZMpSzUcuEIMhR9ZKVv/bfJoYi64zJBA7Wwl6PfM3J 213 | # e+A8i49CsuG5F5cfq/+0n8Sq39JZU5UGH3+UFR/3wyCwau8TSYUrcITfekc/cuqj 214 | # I8qbSjaH6J9EDuXC3thiBSZwrZGQFOwpoAg5XlSOaS2EQatdYaUKzTSFNdAxG1t5 215 | # MDFXN9C0KdbL6bz8R8ZIrEI6zKaICPoxggQNMIIECQIBATCBkzB8MQswCQYDVQQG 216 | # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG 217 | # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg 218 | # VGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAfijoSYMDEBI/gABAAAB+DANBglghkgB 219 | # ZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3 220 | # DQEJBDEiBCBxs9hWsIIx9EAVzEXkK/lvEzKiDZtXb4+xd87Prmi6+TCB+gYLKoZI 221 | # hvcNAQkQAi8xgeowgecwgeQwgb0EIO/MM/JfDVSQBQVi3xtHhR2Mz3RC/nGdVqIo 222 | # PcjRnPdaMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0 223 | # b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh 224 | # dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMA 225 | # AAH4o6EmDAxASP4AAQAAAfgwIgQgOHH5FQHI6AH36/Cnjj3b5zESctCYBDCH3gzw 226 | # PDf94DowDQYJKoZIhvcNAQELBQAEggIAcfXZ+kfJBC7pa0+9CF9K4zbYtD0KsBG5 227 | # XLF7awHUW/QDLMSbLWR1wXDYZwGSN8P2osV1zzKecsfGPihd9Q3mPFm8MFTFH1Lc 228 | # fePH0obn5Emz6rV6vEFY4oIp6xAl7UL+hrlAJ2hoOG102pbb9baiMnSM5WCpp/05 229 | # 686U1TS8BUOrshMgOiiKFdqbqMJxh8LuDx67jKNZx4QI5ojsTpfrvYo1PVm5+h/4 230 | # JU9MvUe1jxQC/hEP/XDofZXJIG8vlaKHsddk0he5tB2DiLr4zE2moa4l7sio4V0a 231 | # ou8653n+MRSM8TW7xs96plMSoveLtoLkByZpJtlR2KtKZEkuW6tnL6SVtcORwXEO 232 | # DbAl96S2iZ7+Mjp2dR/1o6BCuFH0r9osikqD//m3V2ketL17WNuQlQqH0hKfxeTO 233 | # hBdlHFm7eTCelfR8mt89T+gnvGROgjdtcPuDbfpQR5armsMZSg7CRzE4jEhdSS5J 234 | # ufS3QhpmIWU8V1i33zdr0CDAZCu0fVaFIweabqpGqxeV+sswzZK3pElLoY1jxj/F 235 | # 7ReYvZ1+ehWUg6HygwiEtw3Vp/GqyVHlrLCxuGiRqUZYpHKKlBCDbDf51s56rSYZ 236 | # tvjRtw6bGaxFfD3nhnSRbeYOdyA4Ibk3i8bWO/JaiAFb9O7kY0VUnxDrYKms9kvK 237 | # VRdFkk2bBTU= 238 | # SIG # End signature block 239 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/Scripts/ErrorDecorator.psm1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Write the error message in red without providing a stack trace. 4 | .PARAMETER Message 5 | The message to write. 6 | #> 7 | function Write-CustomError { 8 | param( 9 | [string] 10 | $Message 11 | ) 12 | Write-Host "ERROR: $Message" -ForegroundColor Red 13 | } 14 | 15 | # SIG # Begin signature block 16 | # MIIoKAYJKoZIhvcNAQcCoIIoGTCCKBUCAQExDzANBglghkgBZQMEAgEFADB5Bgor 17 | # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG 18 | # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBjT9AO+vVXXGCI 19 | # KT5Ad085gxVfyg74GVY2jcbCZbPrLKCCDXYwggX0MIID3KADAgECAhMzAAAEBGx0 20 | # Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD 21 | # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy 22 | # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p 23 | # bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw 24 | # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u 25 | # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy 26 | # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 27 | # AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz 28 | # NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo 29 | # DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3 30 | # a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF 31 | # HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy 32 | # 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE 33 | # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w 34 | # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW 35 | # MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci 36 | # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j 37 | # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG 38 | # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu 39 | # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 40 | # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC 41 | # Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj 42 | # L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp 43 | # h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3 44 | # cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X 45 | # dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL 46 | # E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi 47 | # u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1 48 | # sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq 49 | # 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb 50 | # DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/ 51 | # V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq 52 | # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x 53 | # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv 54 | # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 55 | # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG 56 | # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG 57 | # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg 58 | # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC 59 | # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 60 | # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr 61 | # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg 62 | # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy 63 | # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 64 | # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh 65 | # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k 66 | # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB 67 | # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn 68 | # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 69 | # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w 70 | # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o 71 | # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD 72 | # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa 73 | # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny 74 | # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG 75 | # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t 76 | # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV 77 | # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 78 | # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG 79 | # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl 80 | # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb 81 | # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l 82 | # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 83 | # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 84 | # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 85 | # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam 86 | # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa 87 | # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah 88 | # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA 89 | # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt 90 | # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr 91 | # /Xmfwb1tbWrJUnMTDXpQzTGCGggwghoEAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw 92 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN 93 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp 94 | # Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB 95 | # BQCggZAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIE 96 | # INIlWCPfsxbGBxApd/skdJedPJb+7KucO7UL2XJUPfSYMEIGCisGAQQBgjcCAQwx 97 | # NDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29m 98 | # dC5jb20wDQYJKoZIhvcNAQEBBQAEggEAVlzmBhoAOqXrO2No4NjTD1jvWB8nw/TW 99 | # OcxDZSlf+XFrJjazddWWvR7NyoYqbhnCpBACZK8xhkNwEqzXk4tmiovgOEtXrrtR 100 | # 1I615zoZQ/bWeibcKo8qf0n72quJKhakAxUZkOs0sFgSn2ZfTNKaC4fm+CY4pfna 101 | # xcyjRN9w4mV0tECoPNsV0LE2Pwwa3RejdTyJglj6y7OUy8xBh5etmbaJyZs2qTcz 102 | # CZs2GQExmjBeRAYv6sFqH6OLISdxdBwdbLcdwzISEelTkYd+4vlU7Kc8HKalEGgO 103 | # wBSJmkNQfom8lFmwTKAhtKitEE0gnUw445M7ybKy3V5lhHvNDuQU76GCF7Awghes 104 | # BgorBgEEAYI3AwMBMYIXnDCCF5gGCSqGSIb3DQEHAqCCF4kwgheFAgEDMQ8wDQYJ 105 | # YIZIAWUDBAIBBQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYB 106 | # BAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCDR6p/RTuXyXTmICqfUzoflOi2LZoHV 107 | # RqHBjKhEH3dcXgIGZ7+32LqHGBMyMDI1MDMzMTEwMTA0Mi40MDhaMASAAgH0oIHZ 108 | # pIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE 109 | # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYD 110 | # VQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNV 111 | # BAsTHm5TaGllbGQgVFNTIEVTTjo1NTFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWlj 112 | # cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEf4wggcoMIIFEKADAgECAhMzAAAC 113 | # AdFFWZgQzEJPAAEAAAIBMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMw 114 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN 115 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 116 | # YW1wIFBDQSAyMDEwMB4XDTI0MDcyNTE4MzEyMloXDTI1MTAyMjE4MzEyMlowgdMx 117 | # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt 118 | # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p 119 | # Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNo 120 | # aWVsZCBUU1MgRVNOOjU1MUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQg 121 | # VGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC 122 | # AgEAtWrf+HzDu7sk50y5YHheCIJG0uxRSFFcHNek+Td9ZmyJj20EEjaU8JDJu5pW 123 | # c4pPAsBI38NEAJ1b+KBnlStqU8uvXF4qnEShDdi8nPsZZQsTZDKWAgUM2iZTOiWI 124 | # uZcFs5ZC8/+GlrVLM5h1Y9nfMh5B4DnUQOXMremAT9MkvUhg3uaYgmqLlmYyODmb 125 | # a4lXZBu104SLAFsXOfl/TLhpToT46y7lI9sbI9uq3/Aerh3aPi2knHvEEazilXeo 126 | # oXNLCwdu+Is6o8kQLouUn3KwUQm0b7aUtsv1X/OgPmsOJi6yN3LYWyHISvrNuIrJ 127 | # 4iYNgHdBBumQYK8LjZmQaTKFacxhmXJ0q2gzaIfxF2yIwM+V9sQqkHkg/Q+iSDNp 128 | # Mr6mr/OwknOEIjI0g6ZMOymivpChzDNoPz9hkK3gVHZKW7NV8+UBXN4G0aBX69fK 129 | # UbxBBLyk2cC+PhOoUjkl6UC8/c0huqj5xX8m+YVIk81e7t6I+V/E4yXReeZgr0Fh 130 | # YqNpvTjGcaO2WrkP5XmsYS7IvMPIf4DCyIJUZaqoBMToAJJHGRe+DPqCHg6bmGPm 131 | # 97MrOWv16/Co6S9cQDkXp9vMSSRQWXy4KtJhZfmuDz2vr1jw4NeixwuIDGw1mtV/ 132 | # TdSI+vpLJfUiLl/b9w/tJB92BALQT8e1YH8NphdOo1xCwkcCAwEAAaOCAUkwggFF 133 | # MB0GA1UdDgQWBBSwcq9blqLoPPiVrym9mFmFWbyyUjAfBgNVHSMEGDAWgBSfpxVd 134 | # AF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1p 135 | # Y3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIw 136 | # UENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBo 137 | # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUy 138 | # MFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYG 139 | # A1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0B 140 | # AQsFAAOCAgEAOjQAyz0cVztTFGqXX5JLRxFK/O/oMe55uDqEC8Vd1gbcM28KBUPg 141 | # vUIPXm/vdDN2IVBkWHmwCp4AIcy4dZtkuUmd0fnu6aT9Mvo1ndsLp2YJcMoFLEt3 142 | # TtriLaO+i4Grv0ZULtWXUPAW/Mn5Scjgn0xZduGPBD/Xs3J7+get9+8ZvBipsg/N 143 | # 7poimYOVsHxLcem7V5XdMNsytTm/uComhM/wgR5KlDYTVNAXBxcSKMeJaiD3V1+H 144 | # hNkVliMl5VOP+nw5xWF55u9h6eF2G7eBPqT+qSFQ+rQCQdIrN0yG1QN9PJroguK+ 145 | # FJQJdQzdfD3RWVsciBygbYaZlT1cGJI1IyQ74DQ0UBdTpfeGsyrEQ9PI8QyqVLqb 146 | # 2q7LtI6DJMNphYu+jr//0spr1UVvyDPtuRnbGQRNi1COwJcj9OYmlkFgKNeCfbDT 147 | # 7U3uEOvWomekX60Y/m5utRcUPVeAPdhkB+DxDaev3J1ywDNdyu911nAVPgRkyKgM 148 | # K3USLG37EdlatDk8FyuCrx4tiHyqHO3wE6xPw32Q8e/vmuQPoBZuX3qUeoFIsyZE 149 | # enHq2ScMunhcqW32SUVAi5oZ4Z3nf7dAgNau21NEPwgW+2wkrNqDg7Hp8yHyoOKb 150 | # gEBu6REQbvSfZ5Kh4PV+S2gxf2uq6GoYDnlqABOMYwz309ISi0bPMh8wggdxMIIF 151 | # WaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQsw 152 | # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u 153 | # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNy 154 | # b3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAx 155 | # ODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX 156 | # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg 157 | # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy 158 | # MDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL 159 | # 1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5K 160 | # Wv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTeg 161 | # Cjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv62 162 | # 6GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SH 163 | # JMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss25 164 | # 4o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/Nme 165 | # Rd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afo 166 | # mXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLi 167 | # Mxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb 168 | # 0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W2 169 | # 9R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQF 170 | # AgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1Ud 171 | # DgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdM 172 | # g30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp 173 | # b3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJ 174 | # KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF 175 | # MAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8w 176 | # TTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj 177 | # dHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBK 178 | # BggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9N 179 | # aWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1V 180 | # ffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1 181 | # OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce57 182 | # 32pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihV 183 | # J9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZ 184 | # UnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW 185 | # 9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k 186 | # +SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pF 187 | # EUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L 188 | # +DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1 189 | # ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6 190 | # CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDWTCCAkECAQEwggEBoYHZ 191 | # pIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE 192 | # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYD 193 | # VQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNV 194 | # BAsTHm5TaGllbGQgVFNTIEVTTjo1NTFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWlj 195 | # cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUA1+26cR/y 196 | # H100DiNFGWhuAv2rYBqggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK 197 | # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 198 | # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg 199 | # MjAxMDANBgkqhkiG9w0BAQsFAAIFAOuUY88wIhgPMjAyNTAzMzEwMDQzNTlaGA8y 200 | # MDI1MDQwMTAwNDM1OVowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA65RjzwIBADAK 201 | # AgEAAgI6iAIB/zAHAgEAAgITwDAKAgUA65W1TwIBADA2BgorBgEEAYRZCgQCMSgw 202 | # JjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3 203 | # DQEBCwUAA4IBAQA9nN+mrFbMmtkIQSmLIF6eL4NcIulET8coQoipODMDQv+3muQC 204 | # 76bKaHRFR8d0CG2vEbU4ia0eX4yn5N20Wk5zF2CxNH9W6pO6UAM6uaA6eKqFzOBb 205 | # JNPCcG2xbo6Nqb5aXftZwDFem2JJ5ckznS9eowTLRIbzI6nNbOqF4kXjUslwXB9Q 206 | # YDFBZzGGusj9UaTGJoWv3F+Jv1HpXrUbaaJAmd0G0UloRLsbg0hMshAAnbaNNnBh 207 | # TPKH8gerDPdVyQmkYfSRgx4zg3mEkfxS5hxsTaCGRkCtCMqQZDJvip9/Lj3exvYZ 208 | # RKU31bW8sSvIwMiesxuBKen0jQonEBsH+zVqMYIEDTCCBAkCAQEwgZMwfDELMAkG 209 | # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx 210 | # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z 211 | # b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAIB0UVZmBDMQk8AAQAAAgEwDQYJ 212 | # YIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkq 213 | # hkiG9w0BCQQxIgQgvxEtwmUGCuMgWYMqqVq7y/+hNt91p4XU6+s3/XawIxswgfoG 214 | # CyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCBYa7I6TJQRcmx0HaSTWZdJgowdrl9+ 215 | # Zrr0pIdqHtc4IzCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo 216 | # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y 217 | # cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw 218 | # AhMzAAACAdFFWZgQzEJPAAEAAAIBMCIEIPv4nHHz4J36lvN9en5Id1MOqyEvRpW4 219 | # U1xQfOHN5W70MA0GCSqGSIb3DQEBCwUABIICAI67k5nEDtcaPeGzJAPoVCCu5Q2I 220 | # Q3X2dQjnZcJMX3Fbvyts0CSPy9Exu1TTHr+Q+i88XhpbGabDeCN9dIcy7sIk3pJe 221 | # KhdjARCVFLs9aPQjIS6lOAHamR5gT7xkddty6o6bIb7nxULCYKRE9NS0t8epFpVC 222 | # pjtS5JUAhIbKYWfQbfMPxbreMbXgk3SgGvTqYjGDRFCm1M86evfsGdL5lFfgW0iM 223 | # u07tta5j3Glr/1FITmxaqdG1Q4G7a7bfMpLSQctbt4KVI4R2T9A+MUwz1mE42diz 224 | # Q91XYgzjiKGzzqomkPto+0b4Bhv2cygREo1Enl7YEGMY0YJnjvdK+PZtu65AcbP1 225 | # zjPb6FX6I2Zhh34SddEvC+hDfbQCf+3HSY/nXkGgyB8oA7DQkPTSqIXNC9MsEKQ2 226 | # MJk7iXI9dR9WuRGUDAd9PXM2OdMnwnhHwODd/X8HLravH6jQWx/SkXb8AHcvsk8l 227 | # drmznbzlgGsGZHGd6rlr3WhxmjCMxZ6z2j3T7eP5N+yosBUuHlL7WpVyiLSjlcxN 228 | # 7MzLki2Eslg5ZtEl2hPX37TOPU/IjMcZw/TZvol5ddgrANHU8h3Pa3w1wvtJ3DiP 229 | # GekDgqop1UKDhodierNA477qkTWmprSmZ0wZg2kTvGjqfdMZF1sms0z9M2qGDxhq 230 | # 3nS1qhOf1ht15yxA 231 | # SIG # End signature block 232 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/Scripts/MsBuildMessage.txt: -------------------------------------------------------------------------------- 1 | Msbuild version "" is below the minimum supported version "15". 2 | 3 | The list of Msbuild versions already installed and found in current PATH variable is: 4 | 5 | 6 | Please ensure the latest Msbuild is listed in the PATH environment variable: 7 | 1. If you don't have a VisualStudio installed you may download the "Build Tools for Visual Studio" 8 | from https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=15 9 | Choose the ".NET desktop build tools" and proceed with installation. 10 | 2. To find the location of msbuild.exe execute the command 'where.exe msbuild' in the Command Prompt. 11 | 3. To modify the PATH variable value, open Windows Settings. 12 | 4. Open "System" setting option. 13 | 5. Select "About" from the menu on the left. 14 | 6. At the bottom, select "System info" 15 | 7. Select "Advanced system settings" 16 | 8. On the new "System Properties" dialog (or in an "Advanced" Tab), click on "Environment Variables" 17 | 9. From "System variables" select the variable "Path" and click "Edit..." (the bottom one of the two). 18 | 10. Click "New" 19 | 11. Paste the path for Msbuild 15.x or greater. It could be (depends on your drives) similar to 20 | if Visual Studio is installed: 21 | "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin" 22 | or if Build Tools for Visual Studio are installed: 23 | "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Current\Bin" 24 | 12. On the right, click "Move Up" until it reaches the top. Press OK button in the opened windows to apply the changes. 25 | 13. Restart the VS Code for the changes to take effect. 26 | -------------------------------------------------------------------------------- /src/ScaleUnitSample/Scripts/Uninstall-Base-Product.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Uninstalls the Commerce Scale Unit. 4 | #> 5 | Import-Module (Join-Path $PSScriptRoot "ErrorDecorator.psm1") 6 | 7 | $workspaceFolder = $Env:common_workspaceFolder 8 | 9 | Write-Host 10 | $InstallerPath = Join-Path $workspaceFolder "Download\CommerceStoreScaleUnitSetup.exe" 11 | if (Test-Path -Path $InstallerPath) { 12 | Write-Host "Uninstalling the base product." 13 | & "$InstallerPath" uninstall 14 | if ($LastExitCode -ne 0) { 15 | Write-Host 16 | Write-CustomError "The base product uninstallation has failed with exit code $LastExitCode. Please examine the logs to fix a problem and start again. If the logs are not available in the output, locate them under %PROGRAMDATA%\Microsoft Dynamics 365\10.0\logs." 17 | Write-Host 18 | exit $LastExitCode 19 | } 20 | } 21 | else { 22 | Write-Host "The base product installer was not found in "$workspaceFolder\Download\" directory." 23 | } 24 | 25 | 26 | # SIG # Begin signature block 27 | # MIIoJQYJKoZIhvcNAQcCoIIoFjCCKBICAQExDzANBglghkgBZQMEAgEFADB5Bgor 28 | # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG 29 | # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB75y4Ko5nXSbOd 30 | # QwATOZRjQfZ0C7vRS1NJ9DGGU0dcoaCCDXYwggX0MIID3KADAgECAhMzAAAEBGx0 31 | # Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD 32 | # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy 33 | # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p 34 | # bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw 35 | # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u 36 | # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy 37 | # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 38 | # AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz 39 | # NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo 40 | # DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3 41 | # a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF 42 | # HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy 43 | # 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE 44 | # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w 45 | # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW 46 | # MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci 47 | # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j 48 | # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG 49 | # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu 50 | # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 51 | # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC 52 | # Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj 53 | # L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp 54 | # h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3 55 | # cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X 56 | # dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL 57 | # E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi 58 | # u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1 59 | # sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq 60 | # 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb 61 | # DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/ 62 | # V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq 63 | # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x 64 | # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv 65 | # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 66 | # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG 67 | # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG 68 | # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg 69 | # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC 70 | # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 71 | # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr 72 | # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg 73 | # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy 74 | # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 75 | # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh 76 | # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k 77 | # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB 78 | # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn 79 | # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 80 | # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w 81 | # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o 82 | # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD 83 | # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa 84 | # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny 85 | # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG 86 | # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t 87 | # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV 88 | # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 89 | # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG 90 | # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl 91 | # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb 92 | # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l 93 | # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 94 | # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 95 | # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 96 | # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam 97 | # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa 98 | # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah 99 | # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA 100 | # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt 101 | # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr 102 | # /Xmfwb1tbWrJUnMTDXpQzTGCGgUwghoBAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw 103 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN 104 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp 105 | # Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB 106 | # BQCggZAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIE 107 | # IOnNIvKsvtB0GVMi9NBF0YdQnGrJ8B2iMDeDampffI7iMEIGCisGAQQBgjcCAQwx 108 | # NDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29m 109 | # dC5jb20wDQYJKoZIhvcNAQEBBQAEggEABuEmp3T8rdfyogzOT+GUxn01ma/PTw2K 110 | # V+xs+MeO0ibfk1sTs9TQv5iDKh9StPcV1aZwwGtXOPnQlBgVb+h6NiKexo7rniA5 111 | # Zayqzg7rAGYF4HKa0QpTo7G6lWSnP4rW51qLTYC8F4cVIOvYbLBIDZkyqQ7dyYYr 112 | # VlhYKyyZ69jSWBfAbrkBjIik3Ufxtx85FdelJIa7gouGy6YQKOoJNxto+2P16BJ2 113 | # 5cSeCtwtLrrzE76Ab4hVXQHEKt1F6VJ0kbWipfgUFbOvA11tvQ4Ga07W7A9WaX9V 114 | # QjFSoz4Gf3F2gDuqQDDe8ToDip6b1nh2hm3hs4mEkSjQwH5Pl+wM9aGCF60wghep 115 | # BgorBgEEAYI3AwMBMYIXmTCCF5UGCSqGSIb3DQEHAqCCF4YwgheCAgEDMQ8wDQYJ 116 | # YIZIAWUDBAIBBQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYB 117 | # BAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCBt3+4Jz3Dj5qDrMckYnpBybQb4RsMu 118 | # xUB7xfiXFjcUqQIGZ7/BgcxHGBMyMDI1MDMzMTEwMTAzNy41MTZaMASAAgH0oIHZ 119 | # pIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE 120 | # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYD 121 | # VQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNV 122 | # BAsTHm5TaGllbGQgVFNTIEVTTjo2NTFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWlj 123 | # cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEfswggcoMIIFEKADAgECAhMzAAAB 124 | # 9ZkJlLzxxlCMAAEAAAH1MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMw 125 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN 126 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 127 | # YW1wIFBDQSAyMDEwMB4XDTI0MDcyNTE4MzEwMVoXDTI1MTAyMjE4MzEwMVowgdMx 128 | # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt 129 | # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p 130 | # Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNo 131 | # aWVsZCBUU1MgRVNOOjY1MUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQg 132 | # VGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC 133 | # AgEAzO90cFQTWd/WP84IT7JMIW1fQL61sdfgmhlfT0nvYEb2kvkNF073ZwjveuSW 134 | # ot387LjE0TCiG93e6I0HzIFQBnbxGP/WPBUirFq7WE5RAsuhNfYUL+PIb9jJq3Cw 135 | # WxICfw5t/pTyIOHjKvo1lQOTWZypir/psZwEE7y2uWAPbZJTFrKen5R73x2Hbxy4 136 | # eW1DcmXjym2wFWv10sBH40ajJfe+OkwcTdoYrY3KkpN/RQSjeycK0bhjo0CGYIYa 137 | # +ZMAao0SNR/R1J1Y6sLkiCJO3aQrbS1Sz7l+/qJgy8fyEZMND5Ms7C0sEaOvoBHi 138 | # WSpTM4vc0xDLCmc6PGv03CtWu2KiyqrL8BAB1EYyOShI3IT79arDIDrL+de91Ffj 139 | # mSbBY5j+HvS0l3dXkjP3Hon8b74lWwikF0rzErF0n3khVAusx7Sm1oGG+06hz9XA 140 | # y3Wou+T6Se6oa5LDiQgPTfWR/j9FNk8Ju06oSfTh6c03V0ulla0Iwy+HzUl+WmYx 141 | # FLU0PiaXsmgudNwVqn51zr+Bi3XPJ85wWuy6GGT7nBDmXNzTNkzK98DBQjTOabQX 142 | # UZ884Yb9DFNcigmeVTYkyUXZ6hscd8Nyq45A3D3bk+nXnsogK1Z7zZj6XbGft7xg 143 | # OYvveU6p0+frthbF7MXv+i5qcD9HfFmOq4VYHevVesYb6P0CAwEAAaOCAUkwggFF 144 | # MB0GA1UdDgQWBBRV4Hxb9Uo0oHDwJZJe22ixe2B1ATAfBgNVHSMEGDAWgBSfpxVd 145 | # AF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1p 146 | # Y3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIw 147 | # UENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBo 148 | # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUy 149 | # MFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYG 150 | # A1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0B 151 | # AQsFAAOCAgEAcwxmVPaA9xHffuom0TOSp2hspuf1G0cHW/KXHAuhnpW8/Svlq5j9 152 | # aKI/8/G6fGIQMr0zlpau8jy83I4zclGdJjl5S02SxDlUKawtWvgf7ida06PgjeQM 153 | # 1eX4Lut4bbPfT0FEp77G76hhysXxTJNHv5y+fwThUeiiclihZwqcZMpa46m+oV6i 154 | # gTU6I0EnneotMqFs0Q3zHgVVr4WXjnG2Bcnkip42edyg/9iXczqTBrEkvTz0Ullt 155 | # pFGaQnLzq+No8VEgq0UG7W1ELZGhmmxFmHABwTT6sPJFV68DfLoC0iB9Qbb9VZ8m 156 | # vbTV5JtISBklTuVAlEkzXi9LIjNmx+kndBfKP8dxG/xbRXptQDQDaCsS6ogLkwLg 157 | # H6zSs+ul9WmzI0F8zImbhnZhUziIHheFo4H+ZoojPYcgTK6/3bkSbOabmQFf95B8 158 | # B6e5WqXbS5s9OdMdUlW1gTI1r5u+WAwH2KG7dxneoTbf/jYl3TUtP7AHpyck2c0n 159 | # un/Q0Cycpa9QUH/Dy01k6tQomNXGjivg2/BGcgZJ0Hw8C6KVelEJ31xLoE21m9+N 160 | # EgSKCRoFE1Lkma31SyIaynbdYEb8sOlZynMdm8yPldDwuF54vJiEArjrcDNXe6Bo 161 | # bZUiTWSKvv1DJadR1SUCO/Od21GgU+hZqu+dKgjKAYdeTIvi9R2rtLYwggdxMIIF 162 | # WaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQsw 163 | # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u 164 | # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNy 165 | # b3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAx 166 | # ODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX 167 | # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg 168 | # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy 169 | # MDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL 170 | # 1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5K 171 | # Wv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTeg 172 | # Cjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv62 173 | # 6GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SH 174 | # JMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss25 175 | # 4o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/Nme 176 | # Rd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afo 177 | # mXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLi 178 | # Mxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb 179 | # 0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W2 180 | # 9R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQF 181 | # AgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1Ud 182 | # DgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdM 183 | # g30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp 184 | # b3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJ 185 | # KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF 186 | # MAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8w 187 | # TTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj 188 | # dHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBK 189 | # BggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9N 190 | # aWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1V 191 | # ffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1 192 | # OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce57 193 | # 32pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihV 194 | # J9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZ 195 | # UnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW 196 | # 9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k 197 | # +SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pF 198 | # EUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L 199 | # +DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1 200 | # ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6 201 | # CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDVjCCAj4CAQEwggEBoYHZ 202 | # pIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE 203 | # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYD 204 | # VQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNV 205 | # BAsTHm5TaGllbGQgVFNTIEVTTjo2NTFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWlj 206 | # cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAJsAKu48N 207 | # bR5YRg3WSBQCyjzdkvaggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK 208 | # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 209 | # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg 210 | # MjAxMDANBgkqhkiG9w0BAQsFAAIFAOuUbX0wIhgPMjAyNTAzMzEwMTI1MTdaGA8y 211 | # MDI1MDQwMTAxMjUxN1owdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA65RtfQIBADAH 212 | # AgEAAgIKYzAHAgEAAgIUCTAKAgUA65W+/QIBADA2BgorBgEEAYRZCgQCMSgwJjAM 213 | # BgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEB 214 | # CwUAA4IBAQCWy6Oidv3cSoKaqlxlBSyAV/7X1XezopijZTIQhB4xDi1BbjPfm1qM 215 | # H142skj4Vw6crsHn9Rfb/PXn9U7pfX5XnhYEMb2xhqtgCKAUAyXQ63UBU43UuU3o 216 | # noXSN0cZiHo0qIJb33MyEmoLnDW9aK/WJAqoYGJqVBFKKwxUi6gyxMbbR5VmbdaY 217 | # +/AGsj235X9DnH1CCCKSwPAwNua9S6dceGzcgU7V8ypk97NZQRnpIHhnns1pJDDh 218 | # XPU9WeYHQ7Ebj3WjyPYCC6o7Rq4R2zPer/5aIgDzrtQeeyjSLEeW0rrp9pCS4r2A 219 | # kaccdhHv0fY+13PL4sumNSnVfEmUj85RMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UE 220 | # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc 221 | # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0 222 | # IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAH1mQmUvPHGUIwAAQAAAfUwDQYJYIZI 223 | # AWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG 224 | # 9w0BCQQxIgQgcLigzmsPtIDO/yMRU0Wy1Qq9uFxF0OI5SvDgMoFKcpMwgfoGCyqG 225 | # SIb3DQEJEAIvMYHqMIHnMIHkMIG9BCDB1vLSFwh09ISu4kdEv4/tg9eR1Yk8w5x7 226 | # j5GThqaPNTCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n 227 | # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y 228 | # YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMz 229 | # AAAB9ZkJlLzxxlCMAAEAAAH1MCIEIPthOOwz8feaFCj3i5ZJbWa3Rx3xA+B5EKXx 230 | # EvvsPKwGMA0GCSqGSIb3DQEBCwUABIICALBeyQVJQ06Qknvop76ajmMroxIRVExu 231 | # Ges36wtwiMmlSrpsQujbONZXy/ZOEgl74i7YSakRA83BBtnm6mIpSccSkZ94KJ1I 232 | # xQKeGh7M7JBQJ4vMN3VzgOsjs9Et0ezTAdn6V2N79pVdHS1kaa+HkPNImUdafHAU 233 | # EL6TOZBw9RhE5hvxZ5HB21ICyHPfLu6iYNS8uPs/xLsAHPQg67mihBqwPqDZGeux 234 | # xjeXeOy13w9ruyVPyBLpUDv3PrCc/RGdgR1wq+AsPWPVmor0MmqvEt0xxWiOd9xp 235 | # 3drnDa0aDyhiGXNuxzt0LZM1TpWkNt1MeF/Zdvo4EXyERcqDZGChg48KQ1stvq7S 236 | # HyQEiDRN2AoXIo4X2jveOOku7Z/ZTF20QJBMCxNXHgEnNM0mzsqK5Y9lVfD0NulP 237 | # U6oAp0bs/QzeWIH1sbwgms1C/Rx+lVTCtYs22NR2kT4ysTNDAs6Va65FHXIgYF39 238 | # xYxsk1Yr+iWJ3CfQ4hIUCA2Sn5Tef+qJyd+T0AZ/IRBmPXkXAPOUJwBa+LfVF/J5 239 | # hovwJ+YwchYrwrY/EhXkOO1wC7cJdikg9/5RTyQcm0NpSofYFRpUgzl8/PeJD3mR 240 | # 80yaPSCc5ytK0W+xKIF4LBhHweHxU8LgHUwYMFdOESsWrNfs3GNKiduFmnkmOmUz 241 | # /Fvc7DjmRw/L 242 | # SIG # End signature block 243 | --------------------------------------------------------------------------------