UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

570 lines (567 loc) 27.7 kB
import { EMPTY, of, throwError } from 'rxjs'; import { catchError, delay, expand, filter, map, mergeMap, switchMap } from 'rxjs/operators'; import { Net } from './net'; /** * Sharing file mode. */ export var DeploymentShareMode; (function (DeploymentShareMode) { /** * Admin share. */ DeploymentShareMode["Admin"] = "adminshare"; /** * User share. */ DeploymentShareMode["User"] = "usershare"; })(DeploymentShareMode || (DeploymentShareMode = {})); /** * Download states. */ export var DownloadState; (function (DownloadState) { /** * Download not started. */ DownloadState["NotStarted"] = "NotStarted"; /** * Download is running. */ DownloadState["Running"] = "Running"; /** * Download is cancelled. */ DownloadState["Cancelled"] = "Cancelled"; /** * Download failed. */ DownloadState["Failed"] = "Failed"; /** * Download completed. */ DownloadState["Completed"] = "Completed"; })(DownloadState || (DownloadState = {})); /** * Secure deployment share class. */ export class DeploymentShare { appContext; static deploymentShareUrl = 'deployment/{0}'; static deploymentShareNameUrl = 'deployment/{0}/{1}'; static deploymentShareDownloadUrl = 'deployment/{0}/{1}/download'; static deploymentShareDownloadIdUrl = 'deployment/{0}/{1}/download/{2}'; static deploymentShareDownloadCancelUrl = 'deployment/{0}/{1}/download/{2}/cancel'; static deploymentShareStatusUrl = 'deployment/status'; static deploymentShareFileUrl = 'deployment/{0}/{1}/file'; static deploymentShareFilePathUrl = 'deployment/{0}/{1}/file/{2}'; static deploymentCopyUrl = 'deployment/{0}/{1}/copy'; /** * Initializes a new instance of the DeploymentShare class. * * @param appContext the application context. */ constructor(appContext) { this.appContext = appContext; } /** * Create a new deployment network share. (elevate the desktop gateway if required.) * * @param shareMode the sharing mode. * @param shareName the name of share. */ createShare(shareMode, shareName) { const url = DeploymentShare.deploymentShareNameUrl.format(shareMode, shareName); return this.appContext.gateway.put(url, '{}') .pipe(catchError((error, caught) => { // catch elevation error and retry after elevated. if (this.appContext.gateway.isElevationRequired(error)) { return this.appContext.gateway.pollingGatewayElevated() .pipe(switchMap(elevated => elevated ? caught : throwError(() => error))); } return throwError(() => error); }), map((response) => { if (!response) { throw new Error('DeploymentShare createShare() call is failed with null response result.'); } return response; })); } /** * Delete the deployment network share. (elevate the desktop gateway if required.) * * @param shareMode the sharing mode. * @param shareName the name of share. */ deleteShare(shareMode, shareName) { const url = DeploymentShare.deploymentShareNameUrl.format(shareMode, shareName); return this.appContext.gateway.delete(url) .pipe(catchError((error, caught) => { // catch elevation error and retry after elevated. if (this.appContext.gateway.isElevationRequired(error)) { return this.appContext.gateway.pollingGatewayElevated() .pipe(switchMap(elevated => elevated ? caught : throwError(() => error))); } return throwError(() => error); }), map(() => null)); } /** * List existing deployment network shares. * * @param shareMode the sharing mode. */ queryShares(shareMode) { const url = DeploymentShare.deploymentShareUrl.format(shareMode); return this.appContext.gateway.get(url) .pipe(map((response) => { const value = response && response.value; if (!value) { throw new Error('DeploymentShare queryShares() call is failed with null response result.'); } return value; })); } /** * Download files from specified urls and store to the deployment network share folder. * * @param shareMode the sharing mode. * @param shareName the name of share. * @param request the request object. * @param timeout the timeout for the download in milliseconds. * @param cancelReady (Optional) the cancel ready callback. Retain the supplied ID to call cancelDownload(). * @param polling (Optional) the polling timer milliseconds (default is 2000, and minimum is 1000). */ downloadFiles(shareMode, shareName, request, timeout, cancelReady, polling) { // default polling every 2 seconds, and minimum every 1 second. polling = polling == null ? 2000 : Math.max(polling, 1000); const url = DeploymentShare.deploymentShareDownloadUrl.format(shareMode, shareName); const body = JSON.stringify({ value: request, timeout: timeout }); return this.appContext.gateway.post(url, body) .pipe(mergeMap((response) => { if (!response) { return throwError(() => new Error('DeploymentShare downloadFiles() call is failed with null response or empty Location header.')); } if (cancelReady) { cancelReady(response.id); } const statusUrl = DeploymentShare.deploymentShareDownloadIdUrl.format(shareMode, shareName, response.id); return this.queryStatus(statusUrl) .pipe(expand((status) => { if (status.downloadState === DownloadState.Running) { return of(null) .pipe(delay(polling), mergeMap(() => this.queryStatus(statusUrl))); } return EMPTY; }), filter(status => status.downloadState !== DownloadState.Running && status.downloadState !== DownloadState.NotStarted)); })); } /** * Cancel the download by ID. * * @param shareMode the sharing mode. * @param shareName the name of share. * @param id the identification of download call responded by cancelReady() call back. */ cancelDownload(shareMode, shareName, id) { const url = DeploymentShare.deploymentShareDownloadCancelUrl.format(shareMode, shareName, id); return this.appContext.gateway.post(url, '{}') .pipe(map(() => null)); } /** * Query active downloads with filtering conditions. * * @param shareMode the sharing mode. * @param shareName the name of share. */ queryDownloads(shareMode, shareName) { const url = DeploymentShare.deploymentShareStatusUrl; return this.appContext.gateway.get(url) .pipe(map((response) => { if (!response) { throw new Error('DeploymentShare queryDownloads() call is failed with null response.'); } return response.filter(item => (!shareMode || item.mode === shareMode) && (!shareName || item.name === shareName)); })); } /** * Query files on the share. * * @param shareMode the sharing mode. * @param shareName the name of share. */ queryFiles(shareMode, shareName) { const url = DeploymentShare.deploymentShareFileUrl.format(shareMode, shareName); return this.appContext.gateway.get(url) .pipe(map((response) => { const files = response && response.files; if (!files) { throw new Error('DeploymentShare queryFiles() call is failed with null response.'); } return files; })); } /** * Delete a file or a directory on the share. * * @param shareMode the sharing mode. * @param shareName the name of share. * @param path the path to the file or the directory on the share. */ deleteItem(shareMode, shareName, path) { const path64 = Net.base64urlEncode(path); const url = DeploymentShare.deploymentShareFilePathUrl.format(shareMode, shareName, path64); return this.appContext.gateway.delete(url) .pipe(map(() => null)); } /** * Create a text/XML file in network share. * * @param shareMode the sharing mode. * @param shareName the name of share. * @param path the path to the file or the directory on the share. * @param content the linese of content for the file to create. */ createTextFile(shareMode, shareName, path, content) { const path64 = Net.base64urlEncode(path); const url = DeploymentShare.deploymentShareFilePathUrl.format(shareMode, shareName, path64); const body = JSON.stringify({ content: content }); return this.appContext.gateway.post(url, body).pipe(map(() => null)); } /** * Copy file or folder in network share. * @param shareMode The share mode. * @param shareName the name of the share. * @param source The source path of the item to copy relative to the network share. * @param destination The destination path of the item to copy relative to the network share. */ copyItem(shareMode, shareName, source, destination) { const url = DeploymentShare.deploymentCopyUrl.format(shareMode, shareName); const body = JSON.stringify({ source: source, destination: destination }); return this.appContext.gateway.post(url, body).pipe(map(() => null)); } queryStatus(statusUrl) { return this.appContext.gateway.get(statusUrl) .pipe(map((response) => { if (!response) { throw new Error('DeploymentShare download() call is failed with null response for status.'); } return response; })); } } //# sourceMappingURL=deployment-share.js.map // SIG // Begin signature block // SIG // MIIoNwYJKoZIhvcNAQcCoIIoKDCCKCQCAQExDzANBglg // SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor // SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC // SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg // SIG // Seo/Q95C11lG4k6wW5R61cnCnBGoUD4UZxvgndHI1Lug // SIG // gg2FMIIGAzCCA+ugAwIBAgITMwAABAO91ZVdDzsYrQAA // SIG // AAAEAzANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJV // SIG // UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH // SIG // UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv // SIG // cmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBT // SIG // aWduaW5nIFBDQSAyMDExMB4XDTI0MDkxMjIwMTExM1oX // SIG // DTI1MDkxMTIwMTExM1owdDELMAkGA1UEBhMCVVMxEzAR // SIG // BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v // SIG // bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv // SIG // bjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9u // SIG // MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA // SIG // n3RnXcCDp20WFMoNNzt4s9fV12T5roRJlv+bshDfvJoM // SIG // ZfhyRnixgUfGAbrRlS1St/EcXFXD2MhRkF3CnMYIoeMO // SIG // MuMyYtxr2sC2B5bDRMUMM/r9I4GP2nowUthCWKFIS1RP // SIG // lM0YoVfKKMaH7bJii29sW+waBUulAKN2c+Gn5znaiOxR // SIG // qIu4OL8f9DCHYpME5+Teek3SL95sH5GQhZq7CqTdM0fB // SIG // w/FmLLx98SpBu7v8XapoTz6jJpyNozhcP/59mi/Fu4tT // SIG // 2rI2vD50Vx/0GlR9DNZ2py/iyPU7DG/3p1n1zluuRp3u // SIG // XKjDfVKH7xDbXcMBJid22a3CPbuC2QJLowIDAQABo4IB // SIG // gjCCAX4wHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYB // SIG // BQUHAwMwHQYDVR0OBBYEFOpuKgJKc+OuNYitoqxfHlrE // SIG // gXAZMFQGA1UdEQRNMEukSTBHMS0wKwYDVQQLEyRNaWNy // SIG // b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQx // SIG // FjAUBgNVBAUTDTIzMDAxMis1MDI5MjYwHwYDVR0jBBgw // SIG // FoAUSG5k5VAF04KqFzc3IrVtqMp1ApUwVAYDVR0fBE0w // SIG // SzBJoEegRYZDaHR0cDovL3d3dy5taWNyb3NvZnQuY29t // SIG // L3BraW9wcy9jcmwvTWljQ29kU2lnUENBMjAxMV8yMDEx // SIG // LTA3LTA4LmNybDBhBggrBgEFBQcBAQRVMFMwUQYIKwYB // SIG // BQUHMAKGRWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w // SIG // a2lvcHMvY2VydHMvTWljQ29kU2lnUENBMjAxMV8yMDEx // SIG // LTA3LTA4LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3 // SIG // DQEBCwUAA4ICAQBRaP+hOC1+dSKhbqCr1LIvNEMrRiOQ // SIG // EkPc7D6QWtM+/IbrYiXesNeeCZHCMf3+6xASuDYQ+AyB // SIG // TX0YlXSOxGnBLOzgEukBxezbfnhUTTk7YB2/TxMUcuBC // SIG // P45zMM0CVTaJE8btloB6/3wbFrOhvQHCILx41jTd6kUq // SIG // 4bIBHah3NG0Q1H/FCCwHRGTjAbyiwq5n/pCTxLz5XYCu // SIG // 4RTvy/ZJnFXuuwZynowyju90muegCToTOwpHgE6yRcTv // SIG // Ri16LKCr68Ab8p8QINfFvqWoEwJCXn853rlkpp4k7qzw // SIG // lBNiZ71uw2pbzjQzrRtNbCFQAfmoTtsHFD2tmZvQIg1Q // SIG // VkzM/V1KCjHL54ItqKm7Ay4WyvqWK0VIEaTbdMtbMWbF // SIG // zq2hkRfJTNnFr7RJFeVC/k0DNaab+bpwx5FvCUvkJ3z2 // SIG // wfHWVUckZjEOGmP7cecefrF+rHpif/xW4nJUjMUiPsyD // SIG // btY2Hq3VMLgovj+qe0pkJgpYQzPukPm7RNhbabFNFvq+ // SIG // kXWBX/z/pyuo9qLZfTb697Vi7vll5s/DBjPtfMpyfpWG // SIG // 0phVnAI+0mM4gH09LCMJUERZMgu9bbCGVIQR7cT5YhlL // SIG // t+tpSDtC6XtAzq4PJbKZxFjpB5wk+SRJ1gm87olbfEV9 // SIG // SFdO7iL3jWbjgVi1Qs1iYxBmvh4WhLWr48uouzCCB3ow // SIG // ggVioAMCAQICCmEOkNIAAAAAAAMwDQYJKoZIhvcNAQEL // SIG // BQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo // SIG // aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK // SIG // ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMT // SIG // KU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv // SIG // cml0eSAyMDExMB4XDTExMDcwODIwNTkwOVoXDTI2MDcw // SIG // ODIxMDkwOVowfjELMAkGA1UEBhMCVVMxEzARBgNVBAgT // SIG // Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc // SIG // BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYG // SIG // A1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0Eg // SIG // MjAxMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC // SIG // ggIBAKvw+nIQHC6t2G6qghBNNLrytlghn0IbKmvpWlCq // SIG // uAY4GgRJun/DDB7dN2vGEtgL8DjCmQawyDnVARQxQtOJ // SIG // DXlkh36UYCRsr55JnOloXtLfm1OyCizDr9mpK656Ca/X // SIG // llnKYBoF6WZ26DJSJhIv56sIUM+zRLdd2MQuA3WraPPL // SIG // bfM6XKEW9Ea64DhkrG5kNXimoGMPLdNAk/jj3gcN1Vx5 // SIG // pUkp5w2+oBN3vpQ97/vjK1oQH01WKKJ6cuASOrdJXtjt // SIG // 7UORg9l7snuGG9k+sYxd6IlPhBryoS9Z5JA7La4zWMW3 // SIG // Pv4y07MDPbGyr5I4ftKdgCz1TlaRITUlwzluZH9TupwP // SIG // rRkjhMv0ugOGjfdf8NBSv4yUh7zAIXQlXxgotswnKDgl // SIG // mDlKNs98sZKuHCOnqWbsYR9q4ShJnV+I4iVd0yFLPlLE // SIG // tVc/JAPw0XpbL9Uj43BdD1FGd7P4AOG8rAKCX9vAFbO9 // SIG // G9RVS+c5oQ/pI0m8GLhEfEXkwcNyeuBy5yTfv0aZxe/C // SIG // HFfbg43sTUkwp6uO3+xbn6/83bBm4sGXgXvt1u1L50kp // SIG // pxMopqd9Z4DmimJ4X7IvhNdXnFy/dygo8e1twyiPLI9A // SIG // N0/B4YVEicQJTMXUpUMvdJX3bvh4IFgsE11glZo+TzOE // SIG // 2rCIF96eTvSWsLxGoGyY0uDWiIwLAgMBAAGjggHtMIIB // SIG // 6TAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUSG5k // SIG // 5VAF04KqFzc3IrVtqMp1ApUwGQYJKwYBBAGCNxQCBAwe // SIG // CgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB // SIG // /wQFMAMBAf8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h // SIG // 6qfHMdEjiTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDov // SIG // L2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj // SIG // dHMvTWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNy // SIG // bDBeBggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0 // SIG // dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv // SIG // TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDCB // SIG // nwYDVR0gBIGXMIGUMIGRBgkrBgEEAYI3LgMwgYMwPwYI // SIG // KwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv // SIG // bS9wa2lvcHMvZG9jcy9wcmltYXJ5Y3BzLmh0bTBABggr // SIG // BgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBwAG8AbABp // SIG // AGMAeQBfAHMAdABhAHQAZQBtAGUAbgB0AC4gHTANBgkq // SIG // hkiG9w0BAQsFAAOCAgEAZ/KGpZjgVHkaLtPYdGcimwuW // SIG // EeFjkplCln3SeQyQwWVfLiw++MNy0W2D/r4/6ArKO79H // SIG // qaPzadtjvyI1pZddZYSQfYtGUFXYDJJ80hpLHPM8QotS // SIG // 0LD9a+M+By4pm+Y9G6XUtR13lDni6WTJRD14eiPzE32m // SIG // kHSDjfTLJgJGKsKKELukqQUMm+1o+mgulaAqPyprWElj // SIG // HwlpblqYluSD9MCP80Yr3vw70L01724lruWvJ+3Q3fMO // SIG // r5kol5hNDj0L8giJ1h/DMhji8MUtzluetEk5CsYKwsat // SIG // ruWy2dsViFFFWDgycScaf7H0J/jeLDogaZiyWYlobm+n // SIG // t3TDQAUGpgEqKD6CPxNNZgvAs0314Y9/HG8VfUWnduVA // SIG // KmWjw11SYobDHWM2l4bf2vP48hahmifhzaWX0O5dY0Hj // SIG // Wwechz4GdwbRBrF1HxS+YWG18NzGGwS+30HHDiju3mUv // SIG // 7Jf2oVyW2ADWoUa9WfOXpQlLSBCZgB/QACnFsZulP0V3 // SIG // HjXG0qKin3p6IvpIlR+r+0cjgPWe+L9rt0uX4ut1eBrs // SIG // 6jeZeRhL/9azI2h15q/6/IvrC4DqaTuv/DDtBEyO3991 // SIG // bWORPdGdVk5Pv4BXIqF4ETIheu9BCrE/+6jMpF3BoYib // SIG // V3FWTkhFwELJm3ZbCoBIa/15n8G9bW1qyVJzEw16UM0x // SIG // ghoKMIIaBgIBATCBlTB+MQswCQYDVQQGEwJVUzETMBEG // SIG // A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u // SIG // ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u // SIG // MSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5n // SIG // IFBDQSAyMDExAhMzAAAEA73VlV0POxitAAAAAAQDMA0G // SIG // CWCGSAFlAwQCAQUAoIGuMBkGCSqGSIb3DQEJAzEMBgor // SIG // BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEE // SIG // AYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBX9eT2ChaepBnk // SIG // iVs2PNlZx5U5i+Swq1p3ViJyiiV4XjBCBgorBgEEAYI3 // SIG // AgEMMTQwMqAUgBIATQBpAGMAcgBvAHMAbwBmAHShGoAY // SIG // aHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3 // SIG // DQEBAQUABIIBAG8tNlfFvI8VwWoUKNAjh4rBKbwYOF2L // SIG // wnOm1PnwFSfPwI3tjr8h/xAVkkAeo1+gcJoKisNPARTO // SIG // 1oLNA8IJLkRJHSBoh1m7jb+Cw1gYJbwCPUF0kIF3eBpE // SIG // HHsrtUI4iDgMRmzhF5S/LhF4LeCuKt0e1bHLkROBo+WC // SIG // CR67CSPYFDqCBpfP7vqQiLZSxvn168Og517Ym6Jicu2o // SIG // ev2yKaTx/XhaHkC6OspWtsU1soyuMC/bZEoFTQHLMdJa // SIG // 7tkQlf6ex/pXRrbw1e56+P7vN/nVFqS0fv61jCo8/HB8 // SIG // vML+1xRe6mS51+ofBpfnW46Jlk/Cssvsm8Q1zIDx5Y61 // SIG // x+qhgheUMIIXkAYKKwYBBAGCNwMDATGCF4Awghd8Bgkq // SIG // hkiG9w0BBwKgghdtMIIXaQIBAzEPMA0GCWCGSAFlAwQC // SIG // AQUAMIIBUgYLKoZIhvcNAQkQAQSgggFBBIIBPTCCATkC // SIG // AQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEFAAQg // SIG // fIqjvn7FD4adPE/cRmGS7z1Tgjo0n+Xlb0VYB/l3yywC // SIG // BmeuHCKjDhgTMjAyNTAyMjAxNTI4NDEuNzk2WjAEgAIB // SIG // 9KCB0aSBzjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgT // SIG // Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc // SIG // BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMG // SIG // A1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9u // SIG // czEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjM3MDMt // SIG // MDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt // SIG // ZS1TdGFtcCBTZXJ2aWNloIIR6jCCByAwggUIoAMCAQIC // SIG // EzMAAAHqmiRy1Vk/YWMAAQAAAeowDQYJKoZIhvcNAQEL // SIG // BQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp // SIG // bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT // SIG // FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd // SIG // TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcN // SIG // MjMxMjA2MTg0NTMwWhcNMjUwMzA1MTg0NTMwWjCByzEL // SIG // MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x // SIG // EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv // SIG // c29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9z // SIG // b2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMe // SIG // blNoaWVsZCBUU1MgRVNOOjM3MDMtMDVFMC1EOTQ3MSUw // SIG // IwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2 // SIG // aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC // SIG // AgEAtQtf8Ug/IAfV+y7naKNq1m9pLKmheuULSZG0KZrH // SIG // OhuG4OTDr+lj/7ieFzibyl/3NbdHo+KFganRg+lW411+ // SIG // E9Cn8pU7pa8yrYMZ8WYe6tbg9A8v8ORtAyQz2+qMUK8+ // SIG // rzFdmd8vWcY32agZw36hqJ/+FQx52YXWrNtrL0guRh8s // SIG // LENifdDDOy+HnGPE5yyPOZF101REm9PbcS9rRzGKwfih // SIG // wstPHbN+mp+yHDhn0ZoR2xaD2uaJvWBqVSkvMXk+xAMF // SIG // u1m1y/5aOafSkUSIwJbAQRw9U3RgbnKxgt00F0k6fbOw // SIG // 45L7zRblGtASrM+lIgi8SRkEmYXdojiUxHydX8WJNp2O // SIG // kgirFflZrVeWoj82P7FqBWOeNvs86wD6+Hpa76/bgenI // SIG // vynIv/xDhEWRFEwT1zBP4mvrfI609st7oNeTEglboTrD // SIG // a5rmRcGkQq0RA9Ms+FfcJTExhyCVueYjTNxz1SSdfbzk // SIG // r6wj/ZbBHBMFmSENRQsjzp5DNX7O/PNHWoQGuVJj6jJO // SIG // VhCscwz1adPNV+UUOhxlVM+mXYENI3E+fRBvgigz0Q+p // SIG // sfKL8yKUv6/8BBzyreZDoWK48kB13PShyk1n16QFY9Us // SIG // qreV+J6/jKXrm7/jfz40BD69ImCQ40sya6iC4QbOacrW // SIG // +r8kfB1FTKfpgAOK14zsONr5B30CAwEAAaOCAUkwggFF // SIG // MB0GA1UdDgQWBBQrgUUlolHm6RdAVNTEyHKLBW5ZXjAf // SIG // BgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBf // SIG // BgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jv // SIG // c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBU // SIG // aW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYI // SIG // KwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8v // SIG // d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p // SIG // Y3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEw // SIG // KDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM // SIG // MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkq // SIG // hkiG9w0BAQsFAAOCAgEAKIOtVl4/fv58VW19xt+yoL8q // SIG // DQJ7rtsNx6FmY9x9GAnkN2/SkmU4VU4VuIhXB6yp4RTA // SIG // W1yV+LkCOd5Dlkmlgmld8Qs56Ubd3OP4Ep93bzv9Rj9z // SIG // CZKSX4KOegoEvcyzoj99ZH5qVHT6npGW+IrzEei6D2+R // SIG // zZatFmwacxW7bE4za08n6qnKgMHOq/fQ39lEE6g2tL88 // SIG // KQPAsYgINipWz8jMATj3K/YSU/LBqV/2YSw4ddXWXG1A // SIG // M1x6NUSaK0kn7VWvYS1p88RsxBmnz1MC5qBE4oThi6iE // SIG // JQqb6/eB4mpNBqtMGOpXblEI5P5cWeBMwMP3BjHpPCd0 // SIG // HYjUvLvbo2IdQezS6+rdyIJX0nA1d23VVnrdYrU1KClU // SIG // SyIr0Q8AE+3UR9dwqt9o9iRuQWLv14rURPHHc2iZg1Qc // SIG // 2IZT5fUF7wvuqkfCOjSDf/fdeG06v0uIOhReH9XYsVMR // SIG // OKpX1DzIsRq9BbeP0tD+H8JobPlh0Z+tjweI98wh4sSi // SIG // QrEZ/SEdxMQUCkHTIuWroqgesUAQA1H/he4UimX2wPLB // SIG // Uha3i0qob4/qlEBfODXMbmsaWyVlabDtfCC+EG7eOQs/ // SIG // 0DGuxJjBjZ+2vDDN7k0DpUMtLunP46tddYtSajI2sk3H // SIG // kGTTATDORDHOQ6+Zt0+Gw4/VkzS4D/EhXtxKk2llTDkw // SIG // ggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAV // SIG // MA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzET // SIG // MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk // SIG // bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 // SIG // aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0 // SIG // aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAx // SIG // ODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYT // SIG // AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH // SIG // EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y // SIG // cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l // SIG // LVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEF // SIG // AAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7V // SIG // gtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/H // SIG // ZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKD // SIG // RLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gm // SIG // U3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36M // SIG // EBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+y // SIG // OSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoF // SIG // VZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJi // SIG // ss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGa // SIG // RnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+Autuqfjbs // SIG // Nkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afo // SIG // mXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9 // SIG // ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZk // SIG // i1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y // SIG // 1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV // SIG // 2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0C // SIG // AwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEw // SIG // IwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/ // SIG // LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnp // SIG // cjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8G // SIG // CCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j // SIG // b20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYD // SIG // VR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAwe // SIG // CgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB // SIG // /wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9 // SIG // lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDov // SIG // L2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj // SIG // dHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoG // SIG // CCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDov // SIG // L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNS // SIG // b29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcN // SIG // AQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pc // SIG // FLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHk // SIG // wo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AF // SIG // vonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4 // SIG // U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2 // SIG // EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8Atq // SIG // gcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mj // SIG // dAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZM // SIG // cm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQE // SIG // cb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2f // SIG // pCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBM // SIG // drVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L // SIG // +DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJ // SIG // C4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU // SIG // 5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/ // SIG // 2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDTTCC // SIG // AjUCAQEwgfmhgdGkgc4wgcsxCzAJBgNVBAYTAlVTMRMw // SIG // EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt // SIG // b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp // SIG // b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9w // SIG // ZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT // SIG // TjozNzAzLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9z // SIG // b2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsO // SIG // AwIaAxUAidse3EH46UbJCfFBiHLTgpJhJI+ggYMwgYCk // SIG // fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu // SIG // Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV // SIG // TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N // SIG // aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkq // SIG // hkiG9w0BAQsFAAIFAOthK9cwIhgPMjAyNTAyMjAwNDE5 // SIG // MzVaGA8yMDI1MDIyMTA0MTkzNVowdDA6BgorBgEEAYRZ // SIG // CgQBMSwwKjAKAgUA62Er1wIBADAHAgEAAgIe1zAHAgEA // SIG // AgIUJDAKAgUA62J9VwIBADA2BgorBgEEAYRZCgQCMSgw // SIG // JjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIB // SIG // AAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQBwHC5Wp7wT // SIG // 3GmvVZTrBLC3U5Zooxnk3zQ5Vz5Q4SQgejguxV9KLVSK // SIG // lz2YShpbjFbBgOx5LlheAYxp48wV5yJtN38z5nA+Vxxm // SIG // VwWhgUxagAWw+yoaEkeRd6OnxSlxYNhYKfbkAifB2LZp // SIG // Xrr5kYByjfBnkHNIv4VBJcwIg+oXNMIwi/HX4k0otB39 // SIG // l/ruYv7/4KeatcfgdiNcBi8ycdf8RYgBJ7Keiy85HqBj // SIG // fVF5QD/w28knib9sr3T0qhZyqVdqamwO4wfO388PBKHu // SIG // aRSFE5vyoNH59RJHqP5CNLk9hcxhsNd+VzL9fVJnMymp // SIG // MqFQOM/xoh/rlrkPhK9oUdfCMYIEDTCCBAkCAQEwgZMw // SIG // fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0 // SIG // b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p // SIG // Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWlj // SIG // cm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAHq // SIG // miRy1Vk/YWMAAQAAAeowDQYJYIZIAWUDBAIBBQCgggFK // SIG // MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkq // SIG // hkiG9w0BCQQxIgQg97XrcFzlPRdepqemr6Ivu+9vR+Ph // SIG // fXeB6gmdb8Y26ucwgfoGCyqGSIb3DQEJEAIvMYHqMIHn // SIG // MIHkMIG9BCApj6HV42Q0eIsINJbSwDVwYeRtbiqiiL6v // SIG // LIynpLhmeDCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMw // SIG // EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt // SIG // b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp // SIG // b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w // SIG // IFBDQSAyMDEwAhMzAAAB6pokctVZP2FjAAEAAAHqMCIE // SIG // IGyjaIeIa7Ei9ibtJl0bvz0NvJpIKDh1OAlHHM2qxjN9 // SIG // MA0GCSqGSIb3DQEBCwUABIICAG6e3FiVdzNYgNipAhfl // SIG // HB3Bbc27X4mgHUqBoBVZ0NeNle43ItMA1pBFq51LGyrQ // SIG // gJcUcSoyuoTYhI7Rgb1Fal9mMWkW8nKLCFWnoMAsu4bw // SIG // Qh0Uj32TweGIDIofqwNBqkT6F8paMBQ24MC8gt7TjaWP // SIG // S8DO9640GWoC/ixmCxnslPVQguMV9RvoX58CQIgcc9+J // SIG // zBKlHK8tZppA5c+KvBjp4GxP98onpKiBn9ec8JG/cbU7 // SIG // BgaXMKlStA2j0/GteYp0mSfky5n1zFsz7vm/SG2HMtpM // SIG // oovfyVWO9O0IooKEj2x9ZBppxbVJHK0RbcHnolgOWnTZ // SIG // M1J6B7tPMqCQo8w4/GcwGqgravMejyUwr+dRw7KPJNoo // SIG // wGLOPXjauDX8fAAMopHTB5vlfCNiJMsGojPbuvLYjhNx // SIG // /jZVAwY/sa4wUp/YAIcKBheV5nyOyGkaE+Iw739G6Tht // SIG // HS6k1pSyvMdV2BWEnPd3Xx6P76KkSu2qBwjJNlxZTjga // SIG // TvEUhjnDA68/4QlGCsBpx73ScpmDofGQxnwqfd3b0Vfi // SIG // aDI74vaYG9EOe4Jd+xR13ocA5zkWsq3Etljar/18wT3T // SIG // ODH5CdqN0KnF/u6SrYNf9mt8H/H/1Aj7BLPt9blA7FCV // SIG // C5NEYlvzgMS4d6m2lsZi+PjLY7FdRpSD4RlyY7FMXb07 // SIG // nSID // SIG // End signature block